pi-mcp电桥
用于PI的MCP(模型上下文协议)服务器桥。连接到任何MCP服务器,并使用命名方案将其工具作为本机PI工具公开 mcp__{server}__{tool}.
安装
pi install git:github.com/cdias900/pi-mcp-bridge快速开始
- 创建
~/.pi/mcp.json:
{
"my-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "some-mcp-package@latest"]
}
}- 启动PI——您的MCP工具会自动出现。
- 跑
/mcp查看连接状态。
配置
配置文件(两者使用相同的格式):
| 文件 | 作用域 | 行为 |
|---|---|---|
~/.pi/mcp.json | 全局 | 为每个项目加载 |
.pi/mcp.json | 项目本地 | 全局合并(按服务器名称) |
配置格式
配置文件是一个扁平的JSON对象。每个键都是一个服务器名称,每个值都描述了如何连接。
{
"server-name": {
"type": "stdio | http | sse",
"command": "(stdio only) command to spawn",
"args": ["(stdio only)", "command", "arguments"],
"env": { "(stdio only) extra env vars": "passed to the process" },
"url": "(http/sse only) server URL"
}
}stdio服务器
Stdio服务器作为本地子进程运行。网桥生成进程并通过stdin/stdout进行通信。
最小值:
{
"my-server": {
"type": "stdio",
"command": "uvx",
"args": ["some-mcp"]
}
}对于环境变量:
{
"my-server": {
"type": "stdio",
"command": "uvx",
"args": ["some-mcp-bridge"],
"env": {
"MCP_TARGET_URL": "https://api.example.com/mcp",
"MCP_API_TOKEN": "your-token-here"
}
}
}使用npx(首次运行时自动安装):
{
"slack": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@example/slack-mcp@latest"]
}
}使用本地脚本或二进制文件:
{
"local-server": {
"type": "stdio",
"command": "node",
"args": ["/path/to/my-mcp-server/build/index.js"]
}
}HTTP服务器
HTTP服务器是远程MCP端点。网桥首先尝试Streamable HTTP,然后自动回退到SSE。
{
"remote-server": {
"type": "http",
"url": "https://example.com/mcp"
}
}本地主机(例如,暴露MCP端点的桌面应用程序):
{
"local-app": {
"type": "http",
"url": "http://127.0.0.1:3845/mcp"
}
}SSE服务器
强制SSE传输(跳过流式HTTP协商):
{
"sse-server": {
"type": "sse",
"url": "https://example.com/mcp/sse"
}
}完整示例
一个现实的 ~/.pi/mcp.json 具有多个服务器:
{
"code-search": {
"type": "http",
"url": "https://search.example.com/mcp"
},
"slack": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@example/slack-mcp@latest"]
},
"calendar": {
"type": "stdio",
"command": "uvx",
"args": ["calendar-mcp"]
},
"figma": {
"type": "http",
"url": "http://127.0.0.1:3845/mcp"
},
"database": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@example/postgres-mcp"],
"env": {
"DATABASE_URL": "postgres://user:pass@localhost:5432/mydb"
}
}
}命令
| 命令 | 描述 |
|---|---|
/mcp | 列出所有具有连接状态的服务器(🟢/🟡/🔴/⚪) 工具数量 |
/mcp-reload [server] | 重新连接一台服务器或所有服务器 |
/mcp-cache-clear | 清除磁盘上的工具缓存并重新连接 |
运作原理
初创公司
- 读取
~/.pi/mcp.json+.pi/mcp.json - 从加载工具缓存
~/.pi/mcp-cache.json - 对于每台服务器:
- 如果缓存有效→ 立即注册工具(模型可以立即看到它们) - 如果没有缓存→ 注册a connecting 占位符
- 连接到后台的所有服务器(一次4个)
- 当服务器连接时→ 用实时工具替换缓存/占位符工具,更新缓存
工具执行
- 当调用工具时,网桥会按名称(而不是捕获的引用——重新连接安全)查找服务器
- 如果服务器仍在连接,则会在失败前等待30秒
- 所有文本响应都被截断到PI的限制(50KB/2000行)
重新连接
- 如果服务器在会话过程中死亡,网桥会通过以下方式检测到它
transport.onclose - 以指数回退(1s)安排重新连接→ 2s → 4s → 8s → 15s → 30s帽)
- 放弃前最多可重试5次
/mcp-reload重置重试并立即重新连接
缓存失效
- 配置更改:如果服务器的配置更改,其缓存将通过SHA-256哈希比较无效
- 生存时间:缓存条目在24小时后过期
- 服务器通知:如果MCP服务器支持
listChanged,桥实时自动刷新工具 - 手册:
/mcp-cache-clear清除缓存
环境变量
| 变量 | 目的 |
|---|---|
PI_MCP_CONFIG | 覆盖所有配置文件加载——只读此文件,不合并。有助于确定特定PI流程可以访问哪些MCP |
包结构
pi-mcp-bridge/
├── package.json # PI package manifest + @modelcontextprotocol/sdk dep
├── README.md
├── index.ts # Entry point: lifecycle, tool registration, output truncation
├── types.ts # Shared types and constants
├── cache.ts # Disk cache (SHA-256 hash + TTL)
├── schema.ts # JSON Schema → TypeBox conversion
├── server-manager.ts # Connection lifecycle, reconnection, process cleanup
└── commands.ts # /mcp, /mcp-reload, /mcp-cache-clear许可证
麻省理工学院
