内容
# Proxymic (“数据狗”适用于 AI 代理)
Proxymic 是一个透明的 MCP 网关,使得代理到服务器、代理到工具以及客户端到服务器的通信变得轻松 —— 同时缓存、安全并提供对 AI 代理的每个工具调用的完全可观察性。降低 40-70% 的 API 成本。在 token 被烧毁之前消除代理循环。实时检测异常、幻觉和提示注入。所有这些都不需要修改一行代理或服务器代码。
**将其放置在任何代理(Claude、Cursor、自定义)和任何 MCP 服务器之间。它直接生效。**
[](https://mcp-gateway-production-c0f5.up.railway.app/)
[](https://goreportcard.com/report/github.com/Arnab758/mcp-gateway)
[](LICENSE)
---
## 为什么
当今每个 AI 代理都与工具通信 —— 文件系统、数据库、API、浏览器、终端。但是,代理与这些工具之间的协议(MCP over stdio)很脆弱:
- **相同的提示每次都花费相同费用。** 代理询问“列出 /src 目录中的文件”每次调用都会支付完整的 LLM 费用 —— 即使目录没有更改。
- **没有内置安全功能。** 服务器暴露的任何工具,代理都可以调用 —— 包括 `exec_command`、`bash`、`write_file`。一个提示注入,您的文件系统就没了。
- **代理陷入循环。** 配置错误的代理将在注意到之前反复调用同一个工具数千次。
- **单个挂起的工具调用会使整个代理宕机。** 没有超时。没有熔断器。没有恢复。
这些不是假设情况。如果您使用 AI 代理构建过,您就会遇到所有这些问题。
---
## 背景
我密切关注 AI 基础设施。我的两个朋友正在构建 AI 初创公司,他们最大的痛点相同:LLM API 账单正在消耗他们。每个重复提示都会花费钱。每个代理循环都会烧毁 token。我阅读了有关初创公司在一个月内就达到年度 API 预算的报道。微软限制了员工的 token 使用量。Salesforce 也遇到了同样的问题。
所以我构建了一个 AI 网关 —— 语义缓存、多策略匹配、自适应阈值。它节省了 40-70% 的 LLM 成本。但我深入研究后发现:真正的问题不仅仅是 API 成本。整个 MCP 层都是问题。AI 代理每天调用工具数百次。每次调用都慢、不安全、未缓存。MCP 没有 Kong、Cloudflare、API 网关。所以我构建了 Proxymic。
Proxymic 就是这一层。一个二进制文件。零依赖。它缓存、安全并强化 AI 代理与其 MCP 服务器之间的每个工具调用。就像 Kong 对微服务至关重要一样 —— Proxymic 对 AI 代理至关重要。
> *Cloudflare 和 Datadog 为 Web 基础设施做了什么,Proxymic 为 AI 代理基础设施做了什么。*
---
## 立即试用
[**打开实时演示 →**](https://mcp-gateway-production-c0f5.up.railway.app/)
无需注册。无需安装。这是一个实时演示,带有交互式“试用”控制台 —— 输入提示,实时查看缓存、速率限制和代理健康系统的响应。
演示页面包括:
- 交互式工具调用控制台
- 实时代理健康仪表板,显示每个工具调用、异常检测和节省估计
- 缓存命中/未命中指示器
- 实时指标和代理行为分析
---
## 工作原理
Proxymic 拦截代理与其 MCP 服务器之间流动的每个 JSON-RPC 消息。它透明地传递初始化和发现,但拦截每个 `tools/call` 请求以应用七层强化:
```
代理(Claude、Cursor、自定义)
│ stdin/stdout(JSON-RPC over MCP)
▼
┌──────────────────────────────────────────────────┐
│ Proxymic 网关 │
│ │
│ ┌──────────── 请求管道 ────────────┐ │
│ │ │ │
│ │ 1. 安全黑名单 │ │
│ │ ├── 被阻止? → 错误 │ │
│ │ └── 允许? → 继续 │ │
│ │ │ │
│ │ 2. 速率限制器 │ │
│ │ ├── 超出限制? → 错误 │ │
│ │ └── 确定? → 继续 │ │
│ │ │ │
│ │ 3. 熔断器 │ │
│ │ ├── 打开? → 错误 │ │
│ │ └── 关闭? → 继续 │ │
│ │ │ │
│ │ 4. 缓存查找(多策略) │ │
│ │ ├── 语义命中 → <3ms 返回 │ │
│ │ ├── 确切命中 → <1ms 返回 │ │
│ │ └── 未命中 → 转发 │ │
│ │ │ │
│ │ 5. 响应重复消除 │ │
│ │ ├── 第三方相同 → 占位符 │ │
│ │ └── 唯一 → 存储 + 转发 │ │
│ │ │ │
│ │ 6. 超时保护 + 自动重启 │ │
│ │ ├── 确定 → 缓存 + 返回 │ │
│ │ └── 超时 → 终止 + 重启 │ │
│ │ │ │
│ │ 7. 代理健康(可观察性) │ │
│ │ └── 每个调用都记录、分析、 │ │
│ │ 在实时显示 │ │
│ └────────────────────────────────────────────┘ │
│ │
│ ┌───────── 后台系统 ──────────┐ │
│ │ │ │
│ │ • 每 15 秒健康检查 │ │
│ │ • 进程监控 + 自动重启 │ │
│ │ • 代理循环检测和终止 │ │
│ │ • 指标服务器(:9090/metrics) │ │
│ │ • 结构化 JSON 日志 │ │
│ └────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
│ stdin/stdout(JSON-RPC over MCP)
▼
MCP 服务器(文件系统、数据库、浏览器、终端...)
```
---
## 核心能力
### 智能缓存
不仅仅是精确匹配。Proxymic 使用五种匹配策略的级联来捕获语义相同的提示,即使它们在措辞上有所不同:
| 策略 | 捕获内容 | 典型命中延迟 |
|----------|----------------|-------------------|
| **精确哈希** | 相同提示(O(1)) | <1ms |
| **L1 热缓存** | 频繁访问的提示 | <1ms |
| **HNSW 向量搜索** | 语义相似的提示(释义) | ~3ms |
| **Jaccard + n-gram** | 部分重叠、改述查询 | ~2ms |
| **模板匹配** | 动态输入(“{city} 中的天气”) | <1ms |
缓存自我调整 —— 自适应阈值调整意味着它会为您的特定工作负载学习什么是“足够相似”。
### 响应重复消除
当代理同时询问相同的问题 100 次时(它们会这样做),Proxymic 只会向 upstream 发送一个请求。其他 99 个请求会收到一个占位符响应。节省上下文窗口空间并消除冗余计算。
### 代理循环终止器
在 token 被烧毁之前检测失控的代理。三个升级阶段:
1. **监控** — 跟踪每个代理会话的频率和内容相似性
2. **限流** — 随着循环分数上升插入渐进延迟
3. **阻止** — 当循环被确认时返回一个明确的错误,并带有 `Retry-After` 头
检测使用请求频率、内容相似性和重复分析的组合来区分真实使用和有缺陷的循环。
### 熔断器
如果上游服务器开始失败,Proxymic 会打开电路 —— 所有后续调用都会快速失败而不会接触服务器。在恢复超时后,它会尝试单个探测请求。如果该请求成功,则电路关闭。如果不成功,它会等待更长时间。防止级联故障。
### 安全黑名单
在代理级别、服务器级别ではなく,在网络边界定义哪些工具是允许的,哪些是被阻止的。提示注入的代理无法调用 `exec_command` 或 `bash`,即使它尝试调用。
### 代理健康 - 实时可观察性
每个工具调用都被捕获、分析并在实时仪表板上显示:
- **工具调用跟踪** — 查看每个调用、其参数、结果和延迟
- **异常检测** — 自动标记阻止的调用、重复的相同调用、慢响应
- **节省估计** — 查看每个缓存命中节省的确切 token 数和延迟
- **性能分解** — 缓存命中率、熔断器状态、速率限制命中,全部实时显示
---
## 快速开始
```bash
# 克隆
git clone https://github.com/Arnab758/mcp-gateway.git
cd mcp-gateway
# 构建(单个静态二进制文件,零运行时依赖)
go build -o proxymic .
# 配置
# 编辑 gateway.yaml 与您的 MCP 服务器命令
# 运行
./proxymic --demo # 演示模式(合成流量 + 实时仪表板)
```
**或使用 Docker:**
```bash
docker run -v $(pwd)/gateway.yaml:/app/gateway.yaml arnab758/proxymic
```
---
## 配置
单个 YAML 文件控制所有内容:
```yaml
server:
command: "node"
args: ["server.js"]
timeout_seconds: 30
max_restarts: 5
cache:
ttl_seconds: 300
similarity_threshold: 0.95
security:
allowed_tools: ["list_files", "read_file", "write_file"]
blocked_tools: ["exec_command", "bash", "rm"]
rate_limit:
enabled: true
max_requests: 60
window_seconds: 60
circuit_breaker:
enabled: true
failure_threshold: 3
recovery_timeout_seconds: 30
loop_killer:
enabled: true
window_seconds: 30
block_seconds: 120
```
---
## 项目结构
```
proxymic/
├── main.go # 入口点,HTTP 服务器,路由注册
├── proxy.go # MCP stdio 代理 + 工具调用管道
├── gateway.yaml # 配置
├── cache.go # 多策略语义缓存
├── advanced_cache.go # HNSW + L1 + Redis + 模板级联
├── fuzzy_cache.go # Jaccard + n-gram + Levenshtein 匹配
├── embedding.go # 本地嵌入生成(无需外部 API)
├── circuit_breaker.go # 故障阈值 + 恢复探测
├── dedup.go # 响应重复消除跟踪器
├── agent_loop.go # 循环检测 + 限流 + 阻止
├── metrics.go # 指标服务器 + 目标页面
├── tracer.go # 工具调用跟踪 + 异常检测
├── observer.go # 静默观察模式
├── hardening.go # 面向崩溃的恢复,输入验证
├── template_matcher.go # 动态模板提取
├── config.go # YAML 配置加载器
└── cmd/
├── mcp-client/ # 网关测试客户端
└── mcp-demo-server/ # 演示用的合成 MCP 服务器
```
完全使用 Go 构建。无运行时依赖。单个静态二进制文件。
---
## 技术细节
- **传输:** 拦截基于 stdio 的 MCP 协议(JSON-RPC 2.0)
- **缓存:** HNSW 向量索引(本地)+ 可选 Redis(分布式)+ L1 热缓存
- **嵌入:** 本地 —— 无需外部嵌入 API。使用轻量级 TF-IDF + 基于哈希的嵌入
- **循环检测:** 具有每个阶段可配置时间范围的滑动窗口
- **重复消除:** 使用 SHA-256 响应哈希和会话范围跟踪
- **指标:** Prometheus `/metrics` 端点 + JSON 结构化日志
- **二进制大小:** ~15MB 静态二进制文件
---
## 许可证
MIT
---
<div align="center">
<a href="https://mcp-gateway-production-c0f5.up.railway.app/">实时演示</a> ·
<a href="https://github.com/Arnab758/mcp-gateway">GitHub</a> ·
<a href="https://github.com/Arnab758/mcp-gateway/issues">问题</a>
</div>