Spaces:
Sleeping
Sleeping
File size: 2,045 Bytes
0fdbc7e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | """FastMCP server for pdac-genomics-agent — mirrors the sibling specialists.
One sub-`FastMCP` per tool module, mounted here, exactly as `pdac-subtype-agent/src/server.py`
and `DecoupleRpy_Agent/src/server.py` do. The MCP tools are thin registered wrappers over the
plain functions in `src/tools/`, which the Gradio handlers call directly — so the two surfaces
can never drift apart in behaviour, only in transport.
Run standalone::
python -m src.server # default transport (stdio)
python -m src.server --transport http --port 8765
In the deployed Space, MCP is served by `demo.launch(..., mcp_server=True)` in `gradio_ui.py`
instead — this entry point is for local/CLI use and for an orchestrator that prefers MCP over
`gradio_client`.
**Note on authorization.** The ADR-0004 allow-list gate lives in the *app* layer (`gradio_ui.py`
handlers and the `gr.api` endpoints), not here — this MCP surface has no HTTP identity to gate
on. Do not expose it publicly without putting a gate in front of it; that is the same open
question `pdac-subtype-agent` ADR-0018 raised about unauthenticated machine surfaces.
"""
from __future__ import annotations
import sys
from pathlib import Path
PROJECT_ROOT = Path(__file__).resolve().parents[1]
if str(PROJECT_ROOT) not in sys.path:
sys.path.insert(0, str(PROJECT_ROOT))
from fastmcp import FastMCP # noqa: E402
from src.tools.query_variant_status import variant_status_mcp # noqa: E402
from src.tools.variant_by_subtype import variant_by_subtype_mcp # noqa: E402
mcp = FastMCP(name="pdac-genomics-agent")
mcp.mount(variant_status_mcp)
mcp.mount(variant_by_subtype_mcp)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("--transport", default=None)
parser.add_argument("--port", type=int, default=8765)
args, _ = parser.parse_known_args()
if args.transport:
mcp.run(transport=args.transport, host="0.0.0.0", port=args.port)
else:
mcp.run()
|