使用说明
mcpr
MCP服务器的可观察性优先代理。 Rust代理位于MCP应用程序的前面,记录每个JSON-RPC:每个工具的延迟、会话跟踪、模式差异、客户端故障。它还可以帮助您配置csp策略并在代理层处理Auth(包括oauth和api密钥)。
mcpr做什么
mcpr位于您的MCP应用程序前面,按照每件事为您节省多少工作的顺序做三件事:
- 观察:记录每个
tools/call,resources/*,以及prompts/*向本地SQLite存储请求。根据工具p50/p95/max延迟、错误率、会话跟踪、客户端故障和随时间变化的模式差异。您的应用程序中没有仪器。 - 路线:今天每个代理一个上游。JSON-RPC分类和CSP重写,生成每个AI客户端(ChatGPT、Claude、Copilot)期望的形状。
- 验证 (进行中):代理层的OAuth 2.1和API密钥处理。您的应用程序收到已验证的
x-user-idheader而不是实现auth流本身。
跑在前面 mcp.usestudykit.com/mcp 今天。
快速入门
mcpr以两种形式运行:
- 地方发展。 安装CLI并将其指向MCP服务器。
- 生产。 通过以下方式将已发布的Docker镜像作为sidecar运行
docker compose(或任何容器编排器)。
本地:安装CLI
curl -fsSL https://mcpr.app/install.sh | sh
编写一个配置并在前台运行代理:
cat > mcpr.toml <<'EOF'
mcp = "http://localhost:9000/mcp"
port = 3000
EOF
mcpr proxy run mcpr.toml
客户端连接到 http://localhost:3000;mcpr转发给 http://localhost:9000/mcp 并记录每个JSON-RPC供您稍后检查。
要将事件流式传输到云仪表板,请运行 mcpr proxy setup 一次。
生产:docker作曲
已发布的图片(ghcr.io/pragmalabs-tech/mcpr)跑步 mcpr proxy run 如PID 1。将其放在撰写文件中的MCP服务器旁边:
services:
mcp-server:
image: your-mcp-server:latest
expose:
- "9000"
mcpr:
image: ghcr.io/pragmalabs-tech/mcpr:0.5
restart: unless-stopped
depends_on:
- mcp-server
ports:
- "3000:3000"
volumes:
- ./mcpr.toml:/etc/mcpr/mcpr.toml:ro
- mcpr-state:/var/lib/mcpr
volumes:
mcpr-state:
# mcpr.toml (alongside the compose file)
mcp = "http://mcp-server:9000"
port = 3000
docker compose up -d,然后将客户端指向端口3000上的主机。国家坚持 mcpr-state 重新启动时的音量。
固定到 X.Y.Z (或 X.Y 用于生产中的次要生产线的最新补丁; latest 用于评估。
Kubernetes/Helm
目前还没有官方的Helm chart。镜像是Kubernetes现成的:非根UID 10001,SIGTERM由转发 tini, mcpr proxy run PID为1,在关机时耗尽飞行中的请求。使用任何标准 Deployment 清单或通用图表(bitnami/common,k8s在家/应用模板):
- 绑定支架
mcpr.toml从一个ConfigMap到/etc/mcpr/mcpr.toml. - 坚持
/var/lib/mcpr带着一个PersistentVolumeClaim(UID 10001必须拥有它;设置fsGroup: 10001). - 通过以下方式露出端口3000
Service.
看 docs/DOCKER.md 用于卷、环境变量、信号行为和非根设置。
观察
流经mcpr的每个JSON-RPC请求都会进入 ~/.mcpr/store.db:工具名称、延迟、状态、错误代码、请求/响应大小、会话ID、捕获的服务器/客户端信息 initialize,并且已满 tools/list / resources/list / prompts/list 用于模式跟踪的响应。
本地SQLite
商店在 ~/.mcpr/store.db 是真理的源泉。直接用 sqlite3 CLI用于即席分析或使用:
mcpr store stats # row counts, oldest/newest events, db size
mcpr store vacuum # delete old records and reclaim disk
路线
每个代理实例都面向一个上游MCP应用程序。mcpr按JSON-RPC形状对请求进行分类:MCP方法到达后端;其他任何内容都按原样向上游转发。
mcp = "http://localhost:9000"
要代理多个MCP服务器,请编写一个 mcpr.toml 每个上游和发射每个 mcpr proxy run <path>.
小部件CSP
mcpr以两种形式应用小部件CSP(传统的每小部件OpenAI格式和当前的MCP标准),因此单个配置块适用于Claude和ChatGPT。
[csp]
# Public host the proxy is reachable on. Written into the OpenAI
# `widgetDomain` field. `_meta.ui.domain` is left to Claude, which
# derives that field from the proxy URL itself and rejects values
# supplied by anything in front of it.
domain = "widgets.example.com"
# Lands in `connect-src` (fetch / WebSocket / EventSource targets).
# `extend` merges with whatever the upstream MCP server declared;
# `replace` ignores upstream.
[csp.connectDomains]
domains = ["api.example.com"]
mode = "extend"
# Lands in `script-src`, `style-src`, `img-src`, `font-src`, `media-src`:
# one bucket for everything the widget loads. Same merge semantics.
[csp.resourceDomains]
domains = ["cdn.example.com"]
mode = "extend"
# Lands in `frame-src` (nested iframes). Defaults to `replace` so
# upstream cannot silently widen this directive.
[csp.frameDomains]
domains = []
mode = "replace"
# Per-widget override, matched by URI pattern (glob). Only the
# payment widget gets `connect-src` to Stripe.
[[csp.widget]]
match = "ui://widget/payment*"
connectDomains = ["api.stripe.com"]
connectDomainsMode = "extend"
验证
正在进行中。 mcpr将在代理层处理MCP OAuth 2.1和API密钥身份验证,因此您的MCP应用程序将收到经过验证的 x-user-id header而不是实现auth流本身。计划配置:
[auth]
mode = "oauth2.1" # or "api_key"
provider = "google" # google, github, bring-your-own
跟踪进度 路线图 在......下面如果您的提供商不在承保范围内,请打开问题。
参考
- 配置: docs/proxy_CONFIGURATION.md (上游URL、端口、CSP、云同步、限制)
- CLI: docs/CLI.md (
proxy run,proxy setup,store stats/vacuum,validate,version) - Docker: docs/DOCKER.md (卷、健康探针、组合/KubeKubernetes)
- 工作台安全带: 长凳/README.md (初始化+工具/调用延迟,直接与代理)
路线图
可观测性
- [x] 每工具指标(调用、错误%、p50、p95、最大值、请求/响应大小)
- [x] 请求日志、会话跟踪、AI客户端跟踪
- [x] 模式捕获与更改跟踪
- [x] 云仪表板同步(cloud.mcpr.app)
路由和网络
- [x] JSON-RPC路由(每个代理有一个上游)
- [x] CSP重写
- []从一个端口进行多上游路由
认证
- []标准提供商的OAuth 2.1
- []用于传统(非标准)身份验证的OAuth 2.1
- []API令牌身份验证
- []每台服务器有多种身份验证模式
安全
- []每个工具的访问控制
- []速率限制和断路器
- []IP白名单
许可证
Apache 2.0
