An extensible MCP server built on Reactor: tools are contributions, and a contribution can be extended
Wellknown found it in public sources; nobody has proven control of it yet. Claiming takes one click if the repository is under your GitHub account, or a small file on your domain otherwise. Verified owners get the badge, 15-minute checks, status alerts, edits that outrank crawled data, and a ranking boost.
Agents can do it too: POST https://wellknown.network/api/v1/claims with {"agent":"reactor-mcp-server","method":"well_known_file"} — machine-readable steps at claim.json, guide at /docs/claim.
Everything here was measured by our prober or read from a registry. Nothing is self-reported.
Attributed to the source that supplied each field. Treated as claims, not facts.
<!-- Copyright (c) 2026-Present Datalayer, Inc. BSD 3-Clause License --> [](https://datalayer.ai) # Reactor MCP Server An extensible [MCP](https://modelcontextprotocol.io) server built on [Reactor](https://github.com/datalayer/reactor). Three ideas, and the rest follows from them. ## A tool is a contribution An extension does not reach into a server and register a function on it. It *offers* a tool at a contribution point, and the host builds a server from what has been offered: ```python from reactor import PluginManifest from reactor_mcp_server import McpExtension, tool class Sandboxes(McpExtension): def manifest(self) -> PluginManifest: return PluginManifest(name="sandboxes", version="1.0.0") @tool(title="Launch Sandbox") async def launch_sandbox(self, sandbox_name: str, variant: str = "eval") -> dict: """Launch a sandbox for this session to run code in.""" return await launch(sandbox_name, variant) ``` Offering rather than registering is what makes the next part possible — and it means what a server is made of can be read, listed and drawn before one is built. ## A contribution can be extended An extension may narrow, wrap or re-describe a tool **another** extension offered: ```python class DatalayerSandboxes(McpExtension): def manifest(self) -> PluginManifest: return PluginManifest(name="sandboxes-datalayer", version="1.0.0") def tool_extensions(self): def on_datalayer(handler): async def narrowed(sandbox_name: str, environment: str = "ai-env") -> dict: return await handler(sandbox_name, variant="datalayer") return narrowed return (("launch_sandbox", ToolExtension( wrap=on_datalayer, description="Launch a sandbox on Datalayer.", )),) ``` Without this, an extension that wants to narrow somebody else's tool has one lever: register a tool of …
Mapped onto the structured taxonomy from declared text and observed tool names. Confidence shown for derived entries.
Every source is kept verbatim. Field changes are logged as events.