feat: build mcp server from workflow config
This commit is contained in:
@@ -281,3 +281,65 @@ def test_rpc_server_cli_mcp_config_with_config_uses_transport_settings(monkeypat
|
||||
assert captured["host"] == "127.0.0.3"
|
||||
assert captured["port"] == 7777
|
||||
assert captured["access_log"] is False
|
||||
|
||||
|
||||
def test_rpc_server_cli_config_with_mcp_source_uses_mcp_builder(
|
||||
monkeypatch, tmp_path
|
||||
) -> None:
|
||||
captured = {}
|
||||
|
||||
def fake_build_from_workflow_config(config):
|
||||
captured["source_kinds"] = [source.kind for source in config.server.sources]
|
||||
return object()
|
||||
|
||||
def fake_create_rpc_app(server, *, rpc_path="/rpc"):
|
||||
captured["server"] = server
|
||||
captured["rpc_path"] = rpc_path
|
||||
return "app"
|
||||
|
||||
def fake_run(app, *, host, port, access_log):
|
||||
captured["run"] = {
|
||||
"app": app,
|
||||
"host": host,
|
||||
"port": port,
|
||||
"access_log": access_log,
|
||||
}
|
||||
|
||||
monkeypatch.setattr(
|
||||
"wf_transport_rpc_http.cli.build_workflow_server_from_workflow_config",
|
||||
fake_build_from_workflow_config,
|
||||
)
|
||||
monkeypatch.setattr("wf_transport_rpc_http.cli.create_rpc_app", fake_create_rpc_app)
|
||||
monkeypatch.setattr("wf_transport_rpc_http.cli.uvicorn.run", fake_run)
|
||||
|
||||
config_path = tmp_path / "wf.json"
|
||||
config_path.write_text(
|
||||
"""
|
||||
{
|
||||
"version": 1,
|
||||
"server": {
|
||||
"store": {"kind": "filesystem", "root": ".wf_store"},
|
||||
"transports": [{"kind": "rpc_http", "host": "127.0.0.1", "port": 8765}],
|
||||
"sources": [
|
||||
{
|
||||
"kind": "mcp",
|
||||
"id": "everything.default",
|
||||
"provider": "everything",
|
||||
"account": "default",
|
||||
"transport": {"kind": "stdio", "command": "uvx"}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
""",
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
from wf_transport_rpc_http.cli import app
|
||||
from typer.testing import CliRunner
|
||||
|
||||
result = CliRunner().invoke(app, ["--config", str(config_path)])
|
||||
|
||||
assert result.exit_code == 0, result.output
|
||||
assert captured["source_kinds"] == ["mcp"]
|
||||
assert captured["run"]["app"] == "app"
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import annotations
|
||||
|
||||
import httpx
|
||||
|
||||
from wf_mcp.broker.server import build_workflow_server_from_config
|
||||
from wf_config import WorkflowConfigFile
|
||||
from wf_mcp.broker.server import build_workflow_server_from_config, build_workflow_server_from_workflow_config
|
||||
from wf_mcp.models import BrokerConfig, ConnectionConfig
|
||||
from wf_mcp.source_registry import (
|
||||
FileSourceRegistryStore,
|
||||
@@ -109,3 +110,37 @@ async def test_mcp_backed_rpc_reports_connections_and_events(tmp_path) -> None:
|
||||
event["kind"] == "connection_registered"
|
||||
for event in events["result"]["events"]
|
||||
)
|
||||
|
||||
|
||||
async def test_mcp_backed_rpc_can_be_built_from_neutral_workflow_config(
|
||||
tmp_path,
|
||||
) -> None:
|
||||
workflow_config = WorkflowConfigFile.model_validate(
|
||||
{
|
||||
"version": 1,
|
||||
"server": {
|
||||
"store": {"kind": "filesystem", "root": str(tmp_path / "store")},
|
||||
"sources": [
|
||||
{
|
||||
"kind": "mcp",
|
||||
"id": "demo.default",
|
||||
"provider": "demo",
|
||||
"account": "default",
|
||||
"transport": {"kind": "stdio", "command": "demo-server"},
|
||||
}
|
||||
],
|
||||
},
|
||||
}
|
||||
)
|
||||
server = build_workflow_server_from_workflow_config(workflow_config)
|
||||
app = create_rpc_app(server)
|
||||
transport = httpx.ASGITransport(app=app)
|
||||
|
||||
async with httpx.AsyncClient(
|
||||
transport=transport, base_url="http://test"
|
||||
) as http_client:
|
||||
connections = await _rpc(
|
||||
http_client, "workflow.admin.connections.list", {}
|
||||
)
|
||||
|
||||
assert connections["result"]["connections"][0]["id"] == "demo.default"
|
||||
|
||||
Reference in New Issue
Block a user