@@ -78,3 +78,49 @@ def test_resource() -> str:
7878 assert server_span ["attributes" ]["rpc.method" ] == "resources/read"
7979 assert server_span ["attributes" ]["mcp.method.name" ] == "resources/read"
8080 assert server_span ["attributes" ]["mcp.resource.uri" ] == "test://resource"
81+
82+ # Server span should be in the same trace as the client span (context propagation).
83+ assert server_span ["context" ]["trace_id" ] == client_span ["context" ]["trace_id" ]
84+
85+
86+ @pytest .mark .filterwarnings ("ignore::RuntimeWarning" )
87+ async def test_completion_spans_include_resource_template_uri (capfire : CaptureLogfire ):
88+ """Verify completion spans include the referenced resource template URI."""
89+ server = MCPServer ("test" )
90+
91+ @server .completion ()
92+ async def handle_completion (
93+ ref : types .ResourceTemplateReference | types .PromptReference ,
94+ argument : types .CompletionArgument ,
95+ context : types .CompletionContext | None ,
96+ ) -> types .Completion :
97+ assert isinstance (ref , types .ResourceTemplateReference )
98+ assert argument .name == "path"
99+ assert argument .value == "rea"
100+ assert context is None
101+ return types .Completion (values = ["README.md" ])
102+
103+ async with Client (server ) as client :
104+ result = await client .complete (
105+ ref = types .ResourceTemplateReference (type = "ref/resource" , uri = "repo://files/{path}" ),
106+ argument = {"name" : "path" , "value" : "rea" },
107+ )
108+
109+ assert result .completion .values == ["README.md" ]
110+
111+ spans = capfire .exporter .exported_spans_as_dict ()
112+
113+ client_span = next (s for s in spans if s ["name" ] == "MCP send completion/complete" )
114+ server_span = next (s for s in spans if s ["name" ] == "MCP handle completion/complete" )
115+
116+ assert client_span ["attributes" ]["rpc.system" ] == "mcp"
117+ assert client_span ["attributes" ]["rpc.method" ] == "completion/complete"
118+ assert client_span ["attributes" ]["mcp.method.name" ] == "completion/complete"
119+ assert client_span ["attributes" ]["mcp.resource.uri" ] == "repo://files/{path}"
120+
121+ assert server_span ["attributes" ]["rpc.system" ] == "mcp"
122+ assert server_span ["attributes" ]["rpc.service" ] == "test"
123+ assert server_span ["attributes" ]["rpc.method" ] == "completion/complete"
124+ assert server_span ["attributes" ]["mcp.method.name" ] == "completion/complete"
125+ assert server_span ["attributes" ]["mcp.resource.uri" ] == "repo://files/{path}"
126+ assert server_span ["context" ]["trace_id" ] == client_span ["context" ]["trace_id" ]
0 commit comments