使用说明
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流程:
search("library docs")→ 仅返回匹配的工具名称和描述get_schema(["context7_resolve-library-id"])→ 返回参数模式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_TOKENenv-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哪一个fastmcpCLI无法运行 - Monty沙盒已限制stdlib--
json,os,并且大多数模块在中不可用execute剧本;仅使用call_tool()基本Python - 与直接呼叫相比,集线器增加了约500ms的延迟开销;当任务复杂性超过2次工具调用时,这是值得的
参考文献
- FastMCP 3.1编码模式 --原始建筑岗位
- FastMCP文档
- 模型上下文协议
