调用MCP服务器的JavaScript编程工具
MCP服务器实现 程序化工具调用(PTC) 它运行JavaScript。
编程工具使用的概念是由Anthropic Claude API开创的,它允许模型编写代码,在一个回合内协调多个工具。该项目提供了一个 开源、模型无关的替代方案 对于本地PTC不可用的环境,通过标准MCP协议为任何LLM(OpenAI、Gemini、本地模型)带来相同的强大编排功能。
此服务器允许大型语言模型(LLM)在安全、隔离的环境中执行复杂的多步骤工具编排 QuickJS WASM沙盒,将执行逻辑从LLM推理循环转移到确定性本地执行。
为什么选择PTC?
传统的LLM工具使用依赖于连续的往返(*原因->调用工具A->等待->原因->调用方法B*).PTC将这些多步骤依赖关系压缩到单个程序执行脚本中,提供:
- 减少延迟:通过在本地执行编排来消除网络和推理开销。
- 并发:使用以下命令实现多个MCP工具的真正并行执行
Promise.all. - 控制流程:直接在沙箱中处理循环、条件和数据聚合,而不依赖于LLM上下文。
- 上下文效率:仅将最终的蒸馏数据结构返回LLM上下文窗口。
______________________________________________________________________
快速开始
看 技能.md 关于使用的简明指南 run_js_code 用于工具编排、并行执行和数据聚合。
______________________________________________________________________
用法
PTC MCP支持两种不同的架构,具体取决于您的部署拓扑。
模式A:网关模式(适用于Cursor、Claude Desktop、Gemini CLI等)
使用STDIO作为透明代理运行。它根据配置动态生成本地子MCP服务器,并在内部执行JS微循环。
- 配置子服务器:创建一个
sub-mcp-servers.json在项目根目录中定义底层工具:
{
"chrome": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest"]
},
"fs": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."]
}
}- 添加到您的客户:
- Gemini CLI:
gemini mcp add ptc npx -y js-ptc-mcp gateway- 克劳德代码:
claude mcp add ptc npx -y js-ptc-mcp gateway- 手册(光标/克劳德桌面): 将以下内容添加到您的 mcpServers 配置:
{
"mcpServers": {
"js-ptc-mcp": {
"command": "npx",
"args": ["-y", "js-ptc-mcp", "gateway"]
}
}
}💡 最佳实践:直接工具曝光 为防止端口冲突和资源耗尽,请执行以下操作 非 注册工具,如chrome-devtools-mcp如果它们由PTC网关管理,则直接在您的客户端配置中。网关自动公开所有子工具(例如。,chrome.navigate_page)到LLM。
模式B:远程模式(适用于自定义云代理)
使用SSE(服务器发送事件)作为编排器运行。它本身不执行任何工具,而是依赖于 控制反转(IoC) 暂停执行并请求您的安全后端执行操作。
- 设置:复制
.env.example到.env并配置您的PTC_API_KEY. - 运行服务器:
npx -y js-ptc-mcp remote --port 3000工作原理:IoC循环
在远程模式下,您的后端必须实现一个简单的循环来处理来自沙盒的工具请求。当沙盒需要工具时,它会返回 need_client_tool 状态。
工作流程:
- 呼叫
run_js_code. - 如果状态为
need_client_tool:
- 在您的安全环境中执行请求的工具。 - 呼叫 resume_js_code 结果。
- 重复,直到状态为
success.
示例:参见 client-sample/remote/backend-service.js 使用MCP SDK完整实现执行循环。______________________________________________________________________
沙盒环境
QuickJS WASM环境是严格沙盒化的,专注于状态机编排、数据操作和 通用逻辑它既可用于复杂的工具链,也可用于简单的纯JavaScript计算或数据转换。
- 可用:
call_client_tool("alias.tool_name", args),print(data),async/await,Promise.all,以及标准ES2022原语(数学、日期、数组、字符串等)。 - 约束: 不
fetch, 不 定时器(setTimeout),以及 不 Node.js/浏览器API。所有外部交互都必须通过call_client_tool.
LLM脚本示例
场景A:纯JavaScript计算
const fib = (n) => n
Understanding the Two Modes
在集成PTC时,开发人员面临着一个关键的分歧: **底层工具位于何处,由谁执行?**
1. **网关模式(STDIO)**:标准客户端(如Cursor)是无状态调度器,无法处理挂起/恢复循环。网关模式通过将微环路保持在内部来解决这个问题。它充当本地子进程的黑匣子路由器,使其成为本地开发环境的理想选择。
1. **远程模式(SSE)**:定制云代理(例如SaaS平台)利用专有后端API。从远程沙箱执行这些操作会带来安全风险。远程模式利用SSE将“挂起/中断”信号流式传输到后端,使您的安全环境能够执行工具并将结果注入回。非常适合分布式web架构。
两种模式共享 **100%的底层QuickJS确定性状态机**,无论部署策略如何,都能确保内存安全和并发性。
______________________________________________________________________
## 发展结构
- `src/core/`:引擎的核心(沙盒、逻辑、状态机)。
- `src/modes/`:网关(STDIO)和远程(SSE)服务器的实现。
- `client-sample/`:示例Node.js客户端演示每种模式。
## 许可证
麻省理工学院