helper to specifially rewrite proxied tool answer
This commit is contained in:
@@ -38,7 +38,9 @@ def test_maps_capability_change_events_to_mcp_list_changed_notifications() -> No
|
||||
resource_notifications[0].root,
|
||||
mcp_types.ResourceListChangedNotification,
|
||||
)
|
||||
assert resource_notifications[0].root.method == "notifications/resources/list_changed"
|
||||
assert (
|
||||
resource_notifications[0].root.method == "notifications/resources/list_changed"
|
||||
)
|
||||
assert isinstance(
|
||||
prompt_notifications[0].root,
|
||||
mcp_types.PromptListChangedNotification,
|
||||
@@ -75,7 +77,9 @@ def test_fastmcp_context_notification_sink_sends_projected_notifications() -> No
|
||||
await sink.send_event(
|
||||
make_event("resources_changed", connection_id="demo.personal")
|
||||
)
|
||||
await sink.send_event(make_event("workflow_artifact_saved", workflow_name="demo"))
|
||||
await sink.send_event(
|
||||
make_event("workflow_artifact_saved", workflow_name="demo")
|
||||
)
|
||||
|
||||
asyncio.run(run())
|
||||
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import mcp.types as mcp_types
|
||||
|
||||
from wf_mcp.proxy_results import (
|
||||
rewrite_call_tool_result_resource_links,
|
||||
rewrite_resource_link_content,
|
||||
)
|
||||
|
||||
|
||||
def test_rewrites_resource_link_content_with_official_mcp_type() -> None:
|
||||
content = _resource_link("demo://resource/dynamic/text/2")
|
||||
|
||||
rewritten = rewrite_resource_link_content(
|
||||
content,
|
||||
lambda uri: uri.replace("demo://", "demo://everything.default/"),
|
||||
)
|
||||
|
||||
assert isinstance(rewritten, mcp_types.ResourceLink)
|
||||
assert str(rewritten.uri) == "demo://everything.default/resource/dynamic/text/2"
|
||||
assert rewritten.name == "dynamic-text"
|
||||
assert rewritten.mimeType == "text/plain"
|
||||
assert str(content.uri) == "demo://resource/dynamic/text/2"
|
||||
|
||||
|
||||
def test_non_resource_link_content_is_returned_unchanged() -> None:
|
||||
content = mcp_types.TextContent(type="text", text="ordinary text")
|
||||
|
||||
rewritten = rewrite_resource_link_content(
|
||||
content,
|
||||
lambda uri: f"rewritten:{uri}",
|
||||
)
|
||||
|
||||
assert rewritten is content
|
||||
|
||||
|
||||
def test_rewrites_resource_links_inside_call_tool_result() -> None:
|
||||
result = mcp_types.CallToolResult(
|
||||
content=[
|
||||
mcp_types.TextContent(type="text", text="see linked resource"),
|
||||
_resource_link("demo://resource/dynamic/text/2"),
|
||||
],
|
||||
structuredContent={"ok": True},
|
||||
_meta={"source": "fixture"},
|
||||
)
|
||||
|
||||
rewritten = rewrite_call_tool_result_resource_links(
|
||||
result,
|
||||
lambda uri: uri.replace("demo://", "demo://everything.default/"),
|
||||
)
|
||||
|
||||
assert rewritten is not result
|
||||
assert rewritten.structuredContent == {"ok": True}
|
||||
assert rewritten.meta == {"source": "fixture"}
|
||||
assert rewritten.content[0] is result.content[0]
|
||||
rewritten_link = rewritten.content[1]
|
||||
original_link = result.content[1]
|
||||
assert isinstance(rewritten_link, mcp_types.ResourceLink)
|
||||
assert isinstance(original_link, mcp_types.ResourceLink)
|
||||
assert str(rewritten_link.uri) == (
|
||||
"demo://everything.default/resource/dynamic/text/2"
|
||||
)
|
||||
assert str(original_link.uri) == "demo://resource/dynamic/text/2"
|
||||
|
||||
|
||||
def _resource_link(uri: str) -> mcp_types.ResourceLink:
|
||||
"""Build ResourceLink through validation because Pydantic accepts URI strings."""
|
||||
return mcp_types.ResourceLink.model_validate(
|
||||
{
|
||||
"type": "resource_link",
|
||||
"name": "dynamic-text",
|
||||
"uri": uri,
|
||||
"mimeType": "text/plain",
|
||||
}
|
||||
)
|
||||
@@ -553,9 +553,7 @@ def test_transparent_proxy_runtime_reload_publishes_local_change_events() -> Non
|
||||
|
||||
events = sink.list_events()[initial_event_count:]
|
||||
event_kinds = [event.kind for event in events]
|
||||
catalog_changed = [
|
||||
event for event in events if event.kind == "catalog_changed"
|
||||
]
|
||||
catalog_changed = [event for event in events if event.kind == "catalog_changed"]
|
||||
assert result["reloaded"] is True
|
||||
assert "tools_changed" in event_kinds
|
||||
assert "resources_changed" in event_kinds
|
||||
|
||||
Reference in New Issue
Block a user