MCPR代理服务

MCPR是一款面向MCP服务器的可观察性优先代理,提供请求记录、路由转发和身份验证功能。

  • by pragmalabs-tech
  • Rust
  • 本地部署
  • 29 星标
  • 更新于
在 GitHub 查看 cptrodgers/mcpr

使用说明

mcpr

MCP服务器的可观察性优先代理。 Rust代理位于MCP应用程序的前面,记录每个JSON-RPC:每个工具的延迟、会话跟踪、模式差异、客户端故障。它还可以帮助您配置csp策略并在代理层处理Auth(包括oauth和api密钥)。

mcpr做什么

mcpr位于您的MCP应用程序前面,按照每件事为您节省多少工作的顺序做三件事:

  1. 观察:记录每个 tools/call, resources/*,以及 prompts/* 向本地SQLite存储请求。根据工具p50/p95/max延迟、错误率、会话跟踪、客户端故障和随时间变化的模式差异。您的应用程序中没有仪器。
  2. 路线:今天每个代理一个上游。JSON-RPC分类和CSP重写,生成每个AI客户端(ChatGPT、Claude、Copilot)期望的形状。
  3. 验证 (进行中):代理层的OAuth 2.1和API密钥处理。您的应用程序收到已验证的 x-user-id header而不是实现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