代码模式MCP代理工具

cmcp是一个聚合MCP服务器的代理工具,通过TypeScript代码实现工具发现和调用,大幅减少AI代理需要处理的工具定义数量,适用于多服务器环境下的开发效率提升。

  • by assimelha
  • Rust
  • 本地部署
  • 32 星标
  • 更新于
在 GitHub 查看 assimelha/cmcp

使用说明

cmcp——代码模式MCP

停止注册数十台MCP服务器。注册 一个代理 这将它们全部聚集在一起 2工具.

你的AI代理编写TypeScript来发现和调用每个连接服务器上的工具——具有完全类型安全、沙盒执行和自动响应截断功能。

受...启发 Cloudflare的代码模式MCP方法.

为什么

MCP工具爆炸是真实的。每台新服务器都会在代理的上下文中添加5-30个工具。有6台服务器,可能有180个工具定义,模型必须在每一轮都进行解析。

cmcp翻转模型:你得到的不是N个工具,而是 2:

工具 目的
search() 通过编写TypeScript过滤代码发现工具
execute() 使用键入的异步代码在任何服务器上调用工具

代理编写代码以与工具交互,而不是JSON blob。这意味着:

  • 工具定义减少99% 在上下文中(2 vs数百)
  • 热重载 --在不重新启动Claude或Codex的情况下添加服务器
  • 可组合 --在一次执行中链接多个工具调用
  • 类型安全 --从JSON模式自动生成TypeScript声明
  • 沙盒化的 --代码在内存限制为64MB的QuickJS引擎中运行

快速启动

# Install
cargo install --path .

# Add servers (same syntax you already know)
cmcp add canva https://mcp.canva.com/mcp
cmcp add --transport stdio github -- npx -y @modelcontextprotocol/server-github

# Register the proxy with Claude
cmcp install

就是这样。重启克劳德,你会看到 code-mode-mcp 随着 search 和 execute 工具。

从任何MCP README复制粘贴

大多数MCP服务器文档都会给你一个 claude mcp add 或 codex mcp add 命令。只需预置 cmcp:

# Claude syntax — just prepend cmcp
cmcp claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest
cmcp claude mcp add --transport http canva https://mcp.canva.com/mcp

# Codex syntax — same idea
cmcp codex mcp add my-server -- npx docs-server@latest
cmcp codex mcp add api-server --url https://api.example.com --bearer-token-env-var API_TOKEN

运作原理

搜索--发现工具

代理编写TypeScript来过滤工具目录:

// Find screenshot-related tools
return tools.filter(t => t.name.includes("screenshot"));

// Find all tools from a specific server
return tools.filter(t => t.server === "chrome-devtools");

// Get a summary of available servers
const servers = [...new Set(tools.map(t => t.server))];
return servers.map(s => ({
  server: s,
  tools: tools.filter(t => t.server === s).map(t => t.name)
}));

执行--调用工具

每个服务器都是一个类型化的全局对象。代理调用工具 await:

// Navigate and take a screenshot
await chrome_devtools.navigate_page({ url: "https://example.com" });
const screenshot = await chrome_devtools.take_screenshot({ format: "png" });
return screenshot;

// Chain multiple servers in one call
const design = await canva.create_design({ title: "Q4 Report" });
const issue = await github.create_issue({
  owner: "myorg",
  repo: "designs",
  title: `New design: ${design.id}`
});
return { design: design.id, issue: issue.number };

自动生成的类型

cmcp从每个工具的JSON模式生成TypeScript声明,因此代理确切地知道每个工具接受哪些参数:

declare const chrome_devtools: {
  /** Navigate to a URL */
  navigate_page(params: { url: string }): Promise<any>;
  /** Take a screenshot */
  take_screenshot(params: { format?: "png" | "jpeg"; quality?: number }): Promise<any>;
};

declare const canva: {
  /** Create a new design */
  create_design(params: { title: string; width?: number; height?: number }): Promise<any>;
};

类型通过以下方式剥离 oxc 在QuickJS沙盒中执行之前。

添加服务器

# HTTP (default when a URL is given)
cmcp add canva https://mcp.canva.com/mcp

# With auth (use env: prefix to read from environment at runtime)
cmcp add --auth "env:CANVA_TOKEN" canva https://mcp.canva.com/mcp

# With custom headers
cmcp add --auth "env:TOKEN" -H "X-Api-Key: abc123" myserver https://api.example.com/mcp

# SSE transport
cmcp add --transport sse events https://events.example.com/mcp

# Stdio transport
cmcp add --transport stdio github -- npx -y @modelcontextprotocol/server-github

# Stdio with environment variables
cmcp add -e GITHUB_TOKEN=env:GITHUB_TOKEN --transport stdio github -- npx -y @modelcontextprotocol/server-github

旗帜(--auth, -H, -e, --transport)一定要来 之前 服务器名称。

从现有配置导入

已经在Claude或Codex中配置了MCP服务器?导入它们:

cmcp import --dry-run     # Preview what would be imported
cmcp import               # Import from all sources
cmcp import --from claude # Only from Claude
cmcp import --from codex  # Only from Codex
cmcp import --force       # Overwrite existing servers
来源 扫描文件
克劳德 ~/.claude.json, .mcp.json
食品法典委员会 ~/.codex/config.toml, .codex/config.toml

管理服务器

cmcp list --short   # Names and transports
cmcp list           # Full listing with tools (connects to each server)
cmcp remove canva   # Remove a server

安装到Claude/Codex中

cmcp install                         # Both Claude and Codex
cmcp install --target claude         # Only Claude
cmcp install --target codex          # Only Codex
cmcp install --target claude --scope user  # Claude user scope (global)

cmcp uninstall                       # Remove from both
cmcp uninstall --target codex        # Remove from one

范围

cmcp支持与Claude相同的作用域:

作用域 配置文件 用例
local (默认) ~/.config/code-mode-mcp/config.toml 您的个人服务器
user 与本地相同 与本地相同
project .cmcp.toml 在项目根目录下 特定于项目的服务器

服务时,两个配置都会合并(项目覆盖用户)。使用 --scope 随着 add, remove,或 install:

cmcp add --scope project local-server http://localhost:3000/mcp

运输

运输 标志 何时使用
http URL的默认值 可流式HTTP MCP服务器
sse --transport sse 服务器发送事件服务器
stdio --transport stdio (或自动检测) 本地进程服务器

认证

每台服务器的承载令牌 --auth.使用 env: 要在运行时从环境中解析:

cmcp add --auth "env:MY_TOKEN" myserver https://example.com/mcp

自定义标题 -H:

cmcp add -H "X-Api-Key: secret" -H "X-Org-Id: 123" myserver https://example.com/mcp

配置格式

储存于 ~/.config/code-mode-mcp/config.toml (或 .cmcp.toml 项目范围):

[servers.canva]
transport = "http"
url = "https://mcp.canva.com/mcp"
auth = "env:CANVA_TOKEN"

[servers.canva.headers]
X-Custom = "value"

[servers.github]
transport = "stdio"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]

[servers.github.env]
GITHUB_TOKEN = "env:GITHUB_TOKEN"

响应截断

大型工具结果(DOM快照、API响应)会自动截断为约40k个字符(约10k个令牌),以防止上下文淹没。这两个工具都接受可选 max_length 参数:

// The agent can control truncation per call
// Or better: extract what you need in code
const snapshot = await chrome_devtools.take_snapshot({});
return snapshot.content[0].text.slice(0, 2000);

局限性

cmcp最适合 无状态工具服务器 --您在其中发现和调用工具的服务器(Canva、GitHub、文件系统、Stripe、浏览器自动化等)。

不适合:

  • 依赖钩子的服务器 --依赖于Claude钩子(SessionStart、PostToolUse、Stop)进行生命周期管理的MCP服务器。Hooks是由Claude事件触发的shell命令,不经过MCP,因此在代理时不会触发。
  • 需要交互式身份验证流的服务器 --需要直接集成Claude的OAuth回调或基于浏览器的登录。

如有疑问,请检查服务器的README是否提到钩子或生命周期事件。如果是这样,请直接向Claude注册。

需求

  • 锈蚀1.91+(氧化)
  • 已安装Claude和/或Codex CLI

建造于

卡斯·德夫 --编码代理系统。

许可证

麻省理工学院