内容
align="center">
<img src="brand-assets/Main Logo.jpeg" alt="Ydris logo" width="240">
</p>
# Ydris
**一款开源、与供应商无关的MCP治理代理。它运行在您的机器上,管理您使用的每个代理的最后一英里工具流量。**
Ydris采用MIT许可证,不受任何供应商控制。它作为一个本地进程,位于您的AI客户端和MCP工具服务器之间,因此无论您运行什么模型,连接什么工具,投影、计量和重试都在您控制的线路这边进行。
---
## 痛点
MCP使得将工具插入代理变得简单,而同样的便捷性带来了三个没有人负责的问题。
工具响应过大,整个数据块都会进入您的上下文中。API返回40个字段,而您的代理只需要4个,您为不必要的36个字段付费,而一个足够大的响应可能会溢出窗口并直接导致运行崩溃。
您无法看到任何单个工具的成本。提供商的仪表板在模型级别报告令牌,但不归因于特定的工具或服务器,因此您只能通过截图来衡量工作流的成本,并猜测哪个调用导致了成本增加。
一个速率限制调用可能会导致整个作业失败。上游服务器抛出429错误并忽略了退避信号,而您的多步骤运行在一次瞬态故障中死亡,而一次重试本可以解决问题。
解决这些问题的网关是为运行Kubernetes的平台团队构建的,它们管理通过平台路由的服务器,而您在笔记本电脑上启动的stdio工具对它们来说是不可见的。最后一英里无论您是一个人运行几个工具还是一个拥有数千名员工的企业,悄悄地连接自己的MCP服务器,都处于无管理的状态。
## 我们的解决方案
Ydris在一个进程中扮演两个角色。它是一个HTTP MCP服务器,供任何客户端使用,也是一个MCP客户端,供任何后端使用。您的代理指向一个本地端点,您的工具服务器位于其后,在每个请求和每个响应上应用三个策略。
声明式响应投影根据配置文件中命名的字段,将每个工具结果修剪到最小值,然后在负载到达模型之前。这几乎是MCP生态系统中其他工具无法做到的,它是从源头上消除令牌膨胀的关键。
本地飞行记录器将每个调用记录到SQLite中,包括成功率、延迟和双向令牌估计,这样您可以在自己的机器上读取每个工具的实际成本,而无需向任何人发送遥测数据。
每个后端的重试带有指数退避,捕获瞬态故障和上游服务器丢弃的速率限制信号,这样429错误意味着短暂等待而不是工作流死亡。
```
BrowserOS ─┐
Claude Code┤
Go ┼──HTTP──▶ Ydris ──stdio──▶ backend A
Codex ┤ /mcp │
Cursor ─┘ (投影, │
计量, │
重试) └──stdio──▶ backend B
┌──stdio──▶ 任意MCP服务器
```
两面都保持MCP兼容,因此Ydris引入了新的协议,也不会限制您。任何支持HTTP MCP的客户端都可以使用,任何本地启动的服务器都可以位于其后,无论由谁构建。
## 结果
您停止为不必要的令牌付费,在测试中,通过一个投影规则,单个过大的响应从406个令牌减少到47个。您获得了一个每工具成本和可靠性数字,可以从本地数据库中读取。您的运行在以前结束的速率限制下存活下来。并且,您在自己的硬件上拥有所有内容,遵循开源许可证,没有供应商介入您的工具流量,决定您可以查看的内容或数据的位置。
对于爱好者来说,这意味着更便宜、更安静的本地代理,不会在过大的负载上崩溃。对于企业来说在调用实际发生的端点处进行治理,覆盖关无法看到的机器,并带有日志,可以将其发送到已经运行的合规管道中 适用人群
独立爱好者,他们运行本地代理,希望在不建立平台基础设施的情况下调用更便宜、更安静、更易读。以及未管理的最后一英里纳入控制的企业,适用于每台员工的机器,无需强制使用单个供应商的堆栈。
## 安装
```bash
git clone <your-repo-url> ydris && cd ydris
npm install
npm run build
```
## 配置
复制示例并编辑它。您的实际配置是gitignored的,因此秘密和后端名称不会进入git历史记录。
```bash
cp ydris.example.yaml ydris.yaml
```
```yaml
port: 9280
dbPath: ./ydris.db
backends:
- name: backend-a command: node
args: ["pathcp-wrapper"]
env:
SOME_API_KEY: "在此您的实际ydris-yaml中设置"
maxAttempts: 3
baseDelayMs: 300
maxDelayMs: 5000
# 将每个工具的响应修剪为仅所需的字段。
# 使用[]进行数组扩展:"records[].email"在每个元素上保留email。
projection:
record_search:
- "records[].name"
- "records[].title"
- "records[].email"
- "records[].organization.name"
```
## 运行
```bash
npm start
```
将任何MCP客户端指向`http://127.0.0.1:9280/mcp`,来自每个后端的工具都将作为`<backend>__<tool>`显示命名空间,因此两个服务器永远不会冲突。
## 控制面板
在浏览器中打开`http://127.0.0.1:9280/`,即可访问初学者友好的面板。它显示了每个工具节省的令牌数、调用次数和成功率,并附带一个向导,帮助您编写修剪规则,无需手动编写YAML导分为三个步骤。选择一个工具,运行一次,以便Ydris可以看到它返回的内容,然后在前后条形图显示令牌削减实时效果时,检查值得保留的字段。当您保存时,规则将出现在`ydris.yaml`中,并在下一个调用中立即生效,无需重启。这也是查看Ydris执行情况的最快方法,因为您可以在屏幕上大型响应崩溃。
## 查看统计信息
控制面板在浏览器中实时显示这些信息。要获取终端输出,请运行:
```bash
node dist/index.js report
```
```
┌─────────┬─────────────────┬────────────┬───────┬─────────────┬────────┬────────────┬────────────────┬──────────────┐
│ (index) │ 工具 │ 后端 │ 调用次数率 │ 平均 原始令牌数 │ 修剪后令牌数 │ 节省令牌数 │
├─────────┼─────────────────┼────────────┼───────┼────────────┼────────────┼────────────────┼──────────────┤
│ 0 │ 'record_search'backend-a'│ 1 │ 100 │ 12 │ 406 │ 47 │ 359 │
└─────────┴─────────────────┴────────────┴───────┴─────────────┴────────┴────────────┴────────────────┴──────────────┘
```
## v0 范围
此版本实现了投影、计量和适用于stdio后端,以及带有字段选择器向导的本地控制面板。舰队配置同步和提供商特殊注册表是下一个模块,它们建立在相同的配置界面上。
## 许可证
MIT。随意使用、fork或分发。