代码模式中心

一个聚合多个MCP服务器的代码模式中心,通过三个元工具(搜索、获取模式和执行)优化令牌使用和LLM交互效率。

  • by MCKRUZ
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 MCKRUZ/mcp-experiment

使用说明

mcp实验

这个实验已经进入生产阶段。 看 mcp中心 对于配置驱动、安全强化的版本,它具有YAML服务器注册表、结构化日志、Docker支持和19个测试。

FastMCP 3.1 CodeMode集线器 它将多个MCP服务器聚合在一个单一的、令牌高效的接口后面。这个仓库作为验证架构的概念证明——硬编码服务器,没有配置系统,错误处理最少。

CodeMode没有在会话启动时将每个工具模式都暴露给LLM,而是将所有下游工具合并为三个元工具: search, get_schema,以及 executeLLM按需发现工具,并在单个沙盒执行中链接调用——没有中间结果污染上下文窗口。

基准测试结果

根据Context7+GitHub MCP(共28个工具)进行衡量:

工具 架构令牌
集线器(编码模式) 3 635
Context7+GitHub直接 28 6950
储蓄 6315个代币(91%)

两步任务的往返(解析库ID→ 获取文档):

方法 LLM转弯 工具调用 时间
集线器(CodeMode) 1 1次执行 1339ms
直接(连续) 2 2个呼叫 785ms

该集线器增加了挂钟延迟(沙盒开销),但消除了每个多步任务一个完整的LLM往返。每次会话开始时都会实现令牌节省。

建筑

Claude Code
    │
    ▼
FastMCP Hub  (CodeMode transform)
    │   └── search      ← BM25 over tool names + descriptions
    │   └── get_schema  ← fetch parameter schemas on demand
    │   └── execute     ← run Python in Monty sandbox
    │
    ├── context7 proxy  ──► @upstash/context7-mcp (stdio)
    └── github proxy    ──► @modelcontextprotocol/server-github (stdio)

CodeMode流程:

  1. search("library docs") → 仅返回匹配的工具名称和描述
  2. get_schema(["context7_resolve-library-id"]) → 返回参数模式
  3. execute("""...""") → 在沙盒中运行Python脚本;中间结果永远不会触及上下文

项目结构

mcp-experiment/
├── server.py                     # Hub entry point
├── src/tools/                    # Add your own tools here
├── tests/
│   ├── conftest.py               # Stub + live fixtures
│   └── test_correctness.py       # Hub mechanics + live comparison tests
├── benchmarks/
│   └── benchmark.py              # Schema token + latency benchmarks
└── pyproject.toml

需求

  • Python 3.12+
  • 紫外线
  • Node.js+npx(用于下游MCP服务器)
  • GITHUB_PERSONAL_ACCESS_TOKEN env-var(适用于GitHub MCP)

快速入门

# Install
git clone https://github.com/MCKRUZ/mcp-experiment
cd mcp-experiment
uv sync

# Dev server (MCP inspector)
uv run fastmcp dev server.py

# Run tests (fast, no subprocess)
uv run pytest tests/

# Run tests against real servers
GITHUB_PERSONAL_ACCESS_TOKEN=... uv run pytest tests/ --live

# Run benchmarks (fast)
uv run python -m benchmarks.benchmark

# Run benchmarks against real servers
GITHUB_PERSONAL_ACCESS_TOKEN=... uv run python -m benchmarks.benchmark --live

连接到克劳德代码

增添 ~/.claude/settings.json 或 ~/.claude.json 在...之下 mcpServers:

"mcp-hub": {
  "command": "uv",
  "args": [
    "run",
    "--project", "/path/to/mcp-experiment",
    "fastmcp", "run",
    "/path/to/mcp-experiment/server.py"
  ],
  "env": {
    "GITHUB_PERSONAL_ACCESS_TOKEN": "your_token_here"
  }
}

添加工具

在中定义工具 src/tools/,在上注册 mcp 之前 add_transform:

# src/tools/my_tools.py
def register(mcp):
    @mcp.tool
    async def my_tool(query: str) -> str:
        """One-line description used for BM25 search discovery."""
        ...

# server.py
from src.tools.my_tools import register
register(mcp)
mcp.add_transform(CodeMode())

文档字符串是BM25的搜索界面,请确保其准确且不超过100个字符。

添加更多MCP服务器

# server.py
from fastmcp.server import create_proxy

firecrawl = create_proxy(StdioTransport("cmd", ["/c", "npx", "-y", "firecrawl-mcp"]))
mcp.mount(firecrawl, namespace="firecrawl")

备注

  • CodeMode 住在 fastmcp.experimental.transforms.code_mode (不是 fastmcp.contrib 如原始博客文章所示)
  • 应用转换 mcp.add_transform(CodeMode()),不 mcp.wrap_transform() --后者返回a _WrappedProvider 哪一个 fastmcp CLI无法运行
  • Monty沙盒已限制stdlib-- json, os,并且大多数模块在中不可用 execute 剧本;仅使用 call_tool() 基本Python
  • 与直接呼叫相比,集线器增加了约500ms的延迟开销;当任务复杂性超过2次工具调用时,这是值得的

参考文献