@@ -258,3 +258,63 @@ def get_item(item_id: str) -> str: # pragma: no cover
258258 # Verify the resource works correctly
259259 content = await resource .read ()
260260 assert content == "Item 123"
261+
262+
263+ class TestResourceTemplateMeta :
264+ """Test metadata on resource templates."""
265+
266+ def test_template_with_meta (self ):
267+ """Test creating a template with metadata."""
268+
269+ def get_user_data (user_id : str ) -> str : # pragma: no cover
270+ return f"User { user_id } "
271+
272+ meta = {"ui" : {"type" : "card" }, "version" : "1.0" }
273+
274+ template = ResourceTemplate .from_function (
275+ fn = get_user_data , uri_template = "resource://users/{user_id}" , meta = meta
276+ )
277+
278+ assert template .meta is not None
279+ assert template .meta == meta
280+
281+ def test_template_without_meta (self ):
282+ """Test that metadata is optional for templates."""
283+
284+ def get_user_data (user_id : str ) -> str : # pragma: no cover
285+ return f"User { user_id } "
286+
287+ template = ResourceTemplate .from_function (fn = get_user_data , uri_template = "resource://users/{user_id}" )
288+
289+ assert template .meta is None
290+
291+ @pytest .mark .anyio
292+ async def test_template_meta_in_fastmcp (self ):
293+ """Test template metadata via FastMCP decorator."""
294+
295+ mcp = FastMCP ()
296+
297+ @mcp .resource ("resource://dynamic/{id}" , meta = {"category" : "dynamic" })
298+ def get_dynamic (id : str ) -> str : # pragma: no cover
299+ return f"Data for { id } "
300+
301+ templates = await mcp .list_resource_templates ()
302+ assert len (templates ) == 1
303+ assert templates [0 ].meta is not None
304+ assert templates [0 ].meta == {"category" : "dynamic" }
305+
306+ @pytest .mark .anyio
307+ async def test_template_created_resources_inherit_meta (self ):
308+ """Test that resources created from templates inherit metadata."""
309+
310+ def get_item (item_id : str ) -> str : # pragma: no cover
311+ return f"Item { item_id } "
312+
313+ meta = {"category" : "items" }
314+
315+ template = ResourceTemplate .from_function (fn = get_item , uri_template = "resource://items/{item_id}" , meta = meta )
316+
317+ resource = await template .create_resource ("resource://items/123" , {"item_id" : "123" })
318+
319+ assert resource .meta is not None
320+ assert resource .meta == meta
0 commit comments