Support for Resource and ResourceTemplate metadata (#1840)

Co-authored-by: Jacem Elwaar <jacem@mcpappsbuilders.com>
This commit is contained in:
Yann Jouanin 2026-01-12 15:45:31 +01:00 • committed by GitHub
commit 0da9a074d0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 316 additions and 4 deletions

View file

@ -1,4 +1,5 @@
from dataclasses import dataclass
from typing import Any
@dataclass
@ -7,3 +8,4 @@ class ReadResourceContents:
content: str | bytes
mime_type: str | None = None
meta: dict[str, Any] | None = None

View file

@ -344,19 +344,23 @@ class Server(Generic[LifespanResultT, RequestT]):
async def handler(req: types.ReadResourceRequest):
result = await func(req.params.uri)
def create_content(data: str | bytes, mime_type: str | None):
def create_content(data: str | bytes, mime_type: str | None, meta: dict[str, Any] | None = None):
# Note: ResourceContents uses Field(alias="_meta"), so we must use the alias key
meta_kwargs: dict[str, Any] = {"_meta": meta} if meta is not None else {}
match data:
case str() as data:
return types.TextResourceContents(
uri=req.params.uri,
text=data,
mimeType=mime_type or "text/plain",
**meta_kwargs,
)
case bytes() as data: # pragma: no cover
return types.BlobResourceContents(
uri=req.params.uri,
blob=base64.b64encode(data).decode(),
mimeType=mime_type or "application/octet-stream",
**meta_kwargs,
)
match result:
@ -370,7 +374,10 @@ class Server(Generic[LifespanResultT, RequestT]):
content = create_content(data, None)
case Iterable() as contents:
contents_list = [
create_content(content_item.content, content_item.mime_type) for content_item in contents
create_content(
content_item.content, content_item.mime_type, getattr(content_item, "meta", None)
)
for content_item in contents
]
return types.ServerResult(
types.ReadResourceResult(