Test that resource titles work correctly.
()
| 120 | |
| 121 | @pytest.mark.anyio |
| 122 | async def test_resource_title(): |
| 123 | """Test that resource titles work correctly.""" |
| 124 | mcp = MCPServer(name="ResourceTitleServer") |
| 125 | |
| 126 | # Static resource without title |
| 127 | def get_basic_data() -> str: # pragma: no cover |
| 128 | return "Basic data" |
| 129 | |
| 130 | basic_resource = FunctionResource( |
| 131 | uri="resource://basic", |
| 132 | name="basic_resource", |
| 133 | description="Basic resource", |
| 134 | fn=get_basic_data, |
| 135 | ) |
| 136 | mcp.add_resource(basic_resource) |
| 137 | |
| 138 | # Static resource with title |
| 139 | def get_titled_data() -> str: # pragma: no cover |
| 140 | return "Titled data" |
| 141 | |
| 142 | titled_resource = FunctionResource( |
| 143 | uri="resource://titled", |
| 144 | name="titled_resource", |
| 145 | title="User-Friendly Resource", |
| 146 | description="Resource with title", |
| 147 | fn=get_titled_data, |
| 148 | ) |
| 149 | mcp.add_resource(titled_resource) |
| 150 | |
| 151 | # Dynamic resource without title |
| 152 | @mcp.resource("resource://dynamic/{id}") |
| 153 | def dynamic_resource(id: str) -> str: # pragma: no cover |
| 154 | return f"Data for {id}" |
| 155 | |
| 156 | # Dynamic resource with title (when supported) |
| 157 | @mcp.resource("resource://titled-dynamic/{id}", title="Dynamic Data") |
| 158 | def titled_dynamic_resource(id: str) -> str: # pragma: no cover |
| 159 | return f"Data for {id}" |
| 160 | |
| 161 | # Start server and connect client |
| 162 | async with Client(mcp) as client: |
| 163 | # List resources |
| 164 | resources_result = await client.list_resources() |
| 165 | resources = {str(res.uri): res for res in resources_result.resources} |
| 166 | |
| 167 | # Verify basic resource uses name |
| 168 | assert "resource://basic" in resources |
| 169 | basic = resources["resource://basic"] |
| 170 | assert basic.title is None |
| 171 | assert basic.name == "basic_resource" |
| 172 | |
| 173 | # Verify resource with title |
| 174 | assert "resource://titled" in resources |
| 175 | titled = resources["resource://titled"] |
| 176 | assert titled.title == "User-Friendly Resource" |
| 177 | |
| 178 | # List resource templates |
| 179 | templates_result = await client.list_resource_templates() |
nothing calls this directly
no test coverage detected