Summary
Add a global MCP tool registry that acts as the single source of truth for every tool available to the swarm. All agents discover tools through the registry rather than through individual server connections, giving the orchestrator a unified view of what is available, what version each tool is at, which agents are authorised to use it, and where to route calls at runtime.
Problem
As the number of MCP tools grows - built-in tools, SearXNG, external MCP servers, agent-as-tool exposures — there is no central place that tracks what tools exist, which version is active, which agents can use them, or where a call should be routed. This creates several problems:
- Discovery is implicit - each agent resolves tools independently; there is no swarm-wide view of what is registered
- No versioning - if a tool is updated or replaced, there is no mechanism to track the change or roll back
- No access control - any agent can attempt to call any tool; there is no per-agent or per-team tool whitelist enforced at the registry level
- Routing is hardcoded - tool call routing (local vs. remote MCP server vs. agent-as-tool) is resolved ad-hoc rather than from a central routing table
- No health visibility - there is no registry-level view of which tools are healthy, degraded, or unreachable
At small scale these gaps are manageable. At the scale FR8 (native MCP server) and FR5 (SearXNG) imply — many tools, multiple transports, external clients - the absence of a registry becomes a reliability and security gap.
Solution
Scope: core (registry service) + config + dashboard
The registry is a lightweight in-process service that starts with the orchestrator:
Registration - every tool (built-in, MCP server, agent-as-tool, SearXNG, external) registers itself at startup with:
tool_id (unique slug)
version (semver)
transport (local / stdio / http)
endpoint (if remote)
input_schema (JSON Schema)
allowed_agents (list of agent IDs or * for all)
tags (e.g. search, code, file, comms)
Discovery - agents query the registry for available tools rather than resolving them independently. The registry returns only tools the agent is authorised to use.
Routing - when an agent calls a tool, the registry resolves the correct transport and endpoint, handles retries on transient failures, and logs the call.
Versioning - multiple versions of a tool can be registered simultaneously. The registry routes to the active version by default; operators can pin an agent to a specific version.
Health checking - the registry pings remote tool endpoints on a configurable interval and marks tools as healthy, degraded, or unreachable. Agents are not routed to unreachable tools.
Configuration in config.yaml:
tool_registry:
enabled: true
health_check_interval_seconds: 30
default_policy: allowlist # or: denylist
tools:
- tool_id: searxng_search
allowed_agents: "*"
- tool_id: file_writer
allowed_agents:
- sub_agent_compiler
- sub_agent_formatter
- tool_id: web_scraper
allowed_agents: "*"
version_pin: "1.2.0"
Dashboard integration - a Tools tab in the dashboard (or a section within the existing panels) shows the registry contents: tool name, version, transport, health status, call count today, and authorised agents. Operators can enable/disable tools and update access lists from the UI without restarting.
Fallback: if tool_registry.enabled is false, tool resolution falls back to the current implicit behaviour. No existing functionality changes.
Acceptance criteria
Related
Summary
Add a global MCP tool registry that acts as the single source of truth for every tool available to the swarm. All agents discover tools through the registry rather than through individual server connections, giving the orchestrator a unified view of what is available, what version each tool is at, which agents are authorised to use it, and where to route calls at runtime.
Problem
As the number of MCP tools grows - built-in tools, SearXNG, external MCP servers, agent-as-tool exposures — there is no central place that tracks what tools exist, which version is active, which agents can use them, or where a call should be routed. This creates several problems:
At small scale these gaps are manageable. At the scale FR8 (native MCP server) and FR5 (SearXNG) imply — many tools, multiple transports, external clients - the absence of a registry becomes a reliability and security gap.
Solution
Scope: core (registry service) + config + dashboard
The registry is a lightweight in-process service that starts with the orchestrator:
Registration - every tool (built-in, MCP server, agent-as-tool, SearXNG, external) registers itself at startup with:
tool_id(unique slug)version(semver)transport(local / stdio / http)endpoint(if remote)input_schema(JSON Schema)allowed_agents(list of agent IDs or*for all)tags(e.g.search,code,file,comms)Discovery - agents query the registry for available tools rather than resolving them independently. The registry returns only tools the agent is authorised to use.
Routing - when an agent calls a tool, the registry resolves the correct transport and endpoint, handles retries on transient failures, and logs the call.
Versioning - multiple versions of a tool can be registered simultaneously. The registry routes to the active version by default; operators can pin an agent to a specific version.
Health checking - the registry pings remote tool endpoints on a configurable interval and marks tools as healthy, degraded, or unreachable. Agents are not routed to unreachable tools.
Configuration in
config.yaml:Dashboard integration - a Tools tab in the dashboard (or a section within the existing panels) shows the registry contents: tool name, version, transport, health status, call count today, and authorised agents. Operators can enable/disable tools and update access lists from the UI without restarting.
Fallback: if
tool_registry.enabledisfalse, tool resolution falls back to the current implicit behaviour. No existing functionality changes.Acceptance criteria
allowed_agentsis enforced; calls from unauthorised agents are rejected with a structured errorhealth_check_interval_seconds; unreachable tools are not routed toconfig.yamltool_registry.enabled: falserestores implicit tool resolution; no existing behaviour changes.github/workflows/coverage.yml)Related