the thing is good until i touch it
This commit is contained in:
Vendored
+3
-1
@@ -6,7 +6,7 @@ from mcp.server.fastmcp import FastMCP
|
||||
server = FastMCP("echo-fixture")
|
||||
|
||||
|
||||
@server.tool()
|
||||
@server.tool(title="Echo tool")
|
||||
async def echo_tool(text: str) -> dict[str, str]:
|
||||
return {"echoed": text}
|
||||
|
||||
@@ -14,6 +14,7 @@ async def echo_tool(text: str) -> dict[str, str]:
|
||||
@server.resource(
|
||||
"fixture://docs/welcome",
|
||||
name="resource.welcome",
|
||||
title="Resource Welcome",
|
||||
description="Welcome text resource for fixture tests.",
|
||||
mime_type="text/plain",
|
||||
)
|
||||
@@ -22,6 +23,7 @@ def welcome_resource() -> str:
|
||||
|
||||
|
||||
@server.prompt(
|
||||
title="Prompt Summarize",
|
||||
name="prompt.summarize",
|
||||
description="Summarize an input text for fixture tests.",
|
||||
)
|
||||
|
||||
@@ -60,10 +60,12 @@ def test_create_broker_server_exposes_tools_resources_and_prompts() -> None:
|
||||
resource_names = {resource.name for resource in resources}
|
||||
prompt_names = {prompt.name for prompt in prompts}
|
||||
|
||||
assert "get_connection_statuses" in tool_names
|
||||
assert "refresh_connection_catalog" in tool_names
|
||||
assert "invoke_broker_method" in tool_names
|
||||
assert "catalog.all" in resource_names
|
||||
assert "events.all" in resource_names
|
||||
assert "status.all" in resource_names
|
||||
assert "plan_with_catalog" in prompt_names
|
||||
|
||||
|
||||
@@ -92,7 +94,9 @@ def test_broker_refresh_tool_returns_structured_error() -> None:
|
||||
server = create_broker_server(service)
|
||||
|
||||
_content, structured = asyncio.run(
|
||||
server.call_tool("refresh_connection_catalog", {"connection_id": "demo.personal"})
|
||||
server.call_tool(
|
||||
"refresh_connection_catalog", {"connection_id": "demo.personal"}
|
||||
)
|
||||
)
|
||||
assert structured == {
|
||||
"connection_id": "demo.personal",
|
||||
|
||||
@@ -66,3 +66,30 @@ def test_cli_catalog_prints_empty_catalog_when_not_refreshed(
|
||||
assert payload["nodes"] == []
|
||||
assert payload["resources"] == []
|
||||
assert payload["prompts"] == []
|
||||
|
||||
|
||||
def test_cli_status_prints_connection_statuses(capsys) -> None:
|
||||
tmp_path = local_temp_root() / "cli_status_test"
|
||||
tmp_path.mkdir(parents=True, exist_ok=True)
|
||||
config_path = tmp_path / "wf_mcp.config.json"
|
||||
_write_config(config_path)
|
||||
|
||||
exit_code = main(["--config", str(config_path), "status"])
|
||||
captured = capsys.readouterr()
|
||||
|
||||
assert exit_code == 0
|
||||
payload = json.loads(captured.out)
|
||||
assert payload == [
|
||||
{
|
||||
"connection_id": "demo.personal",
|
||||
"server": "demo",
|
||||
"account": "personal",
|
||||
"enabled": True,
|
||||
"has_snapshot": False,
|
||||
"fetched_at_epoch_ms": None,
|
||||
"max_age_seconds": None,
|
||||
"node_count": 0,
|
||||
"resource_count": 0,
|
||||
"prompt_count": 0,
|
||||
}
|
||||
]
|
||||
|
||||
@@ -43,6 +43,7 @@ def test_mcp_sdk_adapter_lists_and_calls_stdio_tool() -> None:
|
||||
"connection_id": "fixture.personal",
|
||||
"local_name": "resource.welcome",
|
||||
"uri": "fixture://docs/welcome",
|
||||
"title": "Resource Welcome",
|
||||
"description": "Welcome text resource for fixture tests.",
|
||||
"mime_type": "text/plain",
|
||||
"metadata": payload["resources"][0]["metadata"],
|
||||
@@ -53,6 +54,7 @@ def test_mcp_sdk_adapter_lists_and_calls_stdio_tool() -> None:
|
||||
"qualified_name": "fixture.personal.prompt.summarize",
|
||||
"connection_id": "fixture.personal",
|
||||
"local_name": "prompt.summarize",
|
||||
"title": "Prompt Summarize",
|
||||
"description": "Summarize an input text for fixture tests.",
|
||||
"arguments": payload["prompts"][0]["arguments"],
|
||||
"metadata": payload["prompts"][0]["metadata"],
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import shutil
|
||||
|
||||
from wf_core import END, RunStatus
|
||||
from wf_mcp import (
|
||||
@@ -116,7 +117,7 @@ def test_service_refreshes_catalog_from_adapter() -> None:
|
||||
"qualified_name": "demo.personal.echo_tool",
|
||||
"connection_id": "demo.personal",
|
||||
"local_name": "echo_tool",
|
||||
"display_name": "Echo Tool",
|
||||
"title": "Echo Tool",
|
||||
"description": "Echo text back",
|
||||
"outcomes": ["ok"],
|
||||
"input_schema": {
|
||||
@@ -140,7 +141,7 @@ def test_service_refreshes_catalog_from_adapter() -> None:
|
||||
"qualified_name": "demo.personal.resource.welcome",
|
||||
"connection_id": "demo.personal",
|
||||
"local_name": "resource.welcome",
|
||||
"display_name": "Welcome Resource",
|
||||
"title": "Welcome Resource",
|
||||
"uri": "demo://docs/welcome",
|
||||
"description": "Welcome resource",
|
||||
"mime_type": "text/plain",
|
||||
@@ -152,7 +153,7 @@ def test_service_refreshes_catalog_from_adapter() -> None:
|
||||
"qualified_name": "demo.personal.prompt.summarize",
|
||||
"connection_id": "demo.personal",
|
||||
"local_name": "prompt.summarize",
|
||||
"display_name": "Summarize Prompt",
|
||||
"title": "Summarize Prompt",
|
||||
"description": "Summarize text",
|
||||
"arguments": [
|
||||
{
|
||||
@@ -262,8 +263,45 @@ def test_service_can_inspect_resources_and_prompts() -> None:
|
||||
assert prompt.arguments[0]["name"] == "text"
|
||||
|
||||
|
||||
def test_service_reports_connection_statuses() -> None:
|
||||
store = local_temp_root() / "status_store"
|
||||
# clear store before test
|
||||
shutil.rmtree(store)
|
||||
service = WfMcpService(store=FileStore(store))
|
||||
service.register_connection(
|
||||
ConnectionConfig(id="demo.personal", server="demo", account="personal")
|
||||
)
|
||||
service.register_adapter("demo", FakeAdapter())
|
||||
|
||||
before = service.connection_statuses()
|
||||
assert before == [
|
||||
{
|
||||
"connection_id": "demo.personal",
|
||||
"server": "demo",
|
||||
"account": "personal",
|
||||
"enabled": True,
|
||||
"has_snapshot": False,
|
||||
"fetched_at_epoch_ms": None,
|
||||
"max_age_seconds": None,
|
||||
"node_count": 0,
|
||||
"resource_count": 0,
|
||||
"prompt_count": 0,
|
||||
}
|
||||
]
|
||||
|
||||
asyncio.run(service.refresh_connection_catalog("demo.personal"))
|
||||
after = service.connection_statuses()
|
||||
assert after[0]["has_snapshot"] is True
|
||||
assert after[0]["node_count"] == 1
|
||||
assert after[0]["resource_count"] == 1
|
||||
assert after[0]["prompt_count"] == 1
|
||||
|
||||
|
||||
def test_service_can_proxy_resource_reads_and_prompt_gets() -> None:
|
||||
service = WfMcpService(store=FileStore(local_temp_root() / "proxy_store"))
|
||||
store = local_temp_root() / "proxy_store"
|
||||
# new store
|
||||
shutil.rmtree(store)
|
||||
service = WfMcpService(store=FileStore(store))
|
||||
service.register_connection(
|
||||
ConnectionConfig(id="demo.personal", server="demo", account="personal")
|
||||
)
|
||||
|
||||
@@ -105,7 +105,7 @@ class FakeAdapter:
|
||||
return [
|
||||
DiscoveredTool(
|
||||
name="echo_tool",
|
||||
display_name="Echo Tool",
|
||||
title="Echo Tool",
|
||||
description="Echo text back",
|
||||
input_schema={
|
||||
"type": "object",
|
||||
@@ -129,7 +129,7 @@ class FakeAdapter:
|
||||
DiscoveredResource(
|
||||
uri="demo://docs/welcome",
|
||||
name="resource.welcome",
|
||||
display_name="Welcome Resource",
|
||||
title="Welcome Resource",
|
||||
description="Welcome resource",
|
||||
mime_type="text/plain",
|
||||
metadata={"kind": "static"},
|
||||
@@ -144,7 +144,7 @@ class FakeAdapter:
|
||||
return [
|
||||
DiscoveredPrompt(
|
||||
name="prompt.summarize",
|
||||
display_name="Summarize Prompt",
|
||||
title="Summarize Prompt",
|
||||
description="Summarize text",
|
||||
arguments=[
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user