MCP from Python¶
Configure external tool servers through typed specifications. The following construction snippets require your installed server or running endpoint; they do not start a bundled Kedi service.
McpServerSpec¶
Import the typed specification from kedi:
For stdio:
filesystem_mcp = McpServerSpec(
transport="stdio",
command="npx",
args=("-y", "@modelcontextprotocol/server-filesystem", "/workspace"),
env={"LOG_LEVEL": "warning"},
).normalized()
For streamable HTTP:
docs_mcp = McpServerSpec(
transport="http",
url="http://127.0.0.1:8000/mcp",
headers={"Authorization": "Bearer token"},
).normalized()
For SSE, use transport="sse" and url=.... The Python dataclass accepts the
canonical values stdio, http, and sse; DSL spelling
streamable-http normalizes to http.
Calling .normalized() is recommended when constructing specs directly. It
validates that stdio has a command, remote transports have a URL, and clears
fields that do not apply to the selected transport.
Configure MCP Servers¶
Pass a sequence at any configuration scope:
kedi.configure(mcp_servers=[docs_mcp])
with kedi.context(mcp_servers=[filesystem_mcp]):
result = investigate("...")
Context and per-callable MCP servers append to inherited servers; they do not replace or deduplicate them. Adapter capability differs: unsupported adapters must fail or report the capability limitation rather than silently emulate an MCP server.
MCP servers are external code or services. Stdio commands run with the host process's authority, and remote headers may carry credentials.