mcp垫片
一个进程包装器,确保MCP服务器子进程在父连接关闭时正确终止。
问题
MCP(模型上下文协议)服务器通常由主机应用程序作为子进程生成。当主机终止时,它应该清理这些子进程。然而,许多MCP主机没有正确跟踪和终止其子进程,导致泄漏的进程继续在后台运行。
这对于产生它们自己的子进程的MCP服务器来说尤其成问题(例如。, uvx, npx,或其他进程启动器),因为整个进程树可以是孤立的。
解决方案
mcp-shim 包装MCP服务器命令并:
- 在其自己的进程组中生成子进程
- 透明地转发stdin/stdout/stderr
- 将信号(SIGTERM、SIGINT、SIGHUP)转发给子进程组
- 当stdin关闭时,杀死整个进程组(表示主机已断开连接)
安装
docker pull ghcr.io/cbgbt/mcp-shim:latest用法
将MCP服务器命令包装为 mcp-shim:
mcp-shim [args...]示例:MCP服务器配置
如果没有垫片,MCP服务器可能会按如下方式配置:
{
"mcpServers": {
"my-server": {
"command": "uvx",
"args": ["some-mcp-server"]
}
}
}使用垫片,包裹命令以确保正确清理:
{
"mcpServers": {
"my-server": {
"command": "mcp-shim",
"args": ["uvx", "some-mcp-server"]
}
}
}运作原理
- 垫片在新的进程组中生成您的命令(
setpgid(0, 0)) - Stdin、stdout和stderr是透明转发的
- 当stdin达到EOF(主机断开连接)时,填充程序向进程组发送SIGTERM,短暂等待,然后发送SIGKILL
- 垫片接收到的信号被转发给子进程组
许可证
麻省理工学院或阿帕奇-2.0
