MCPack
MCP服务器的RBAC。为任何MCP服务器引入基于角色的访问控制——代理只能看到其角色允许的工具。
专为需要让联合创始人和合作伙伴代理级访问共享堆栈而无需构建另一个管理仪表板的风险工作室而构建。他们的克劳德会议成为了共同冒险的终点,范围是他们应该能够接触到的东西。
安装
npm install @llvs/mcpack对等依赖: @modelcontextprotocol/sdk ^1.0.0
快速开始
import { mcpack } from '@llvs/mcpack';
// your existing MCP server
const server = createMyServer();
const handle = await mcpack(server, {
roles: {
cofounder: ['get_deals', 'update_deal_status', 'list_payments'],
advisor: ['get_deals'],
admin: ['*']
},
defaultRole: 'advisor'
});
server.connect(transport);就是这样。您的服务器现在在两层都强制执行基于角色的访问:
- 发现:
tools/list返回单个search_tools工具。代理按关键字搜索,只看到其角色允许的工具。 - 执行:
tools/call由于角色外工具而被阻止,即使代理不知何故知道该名称。该错误故意不透明:"Unknown tool: {name}"受限制的工具是不可见的,而不仅仅是被阻止的。
运作原理
1.代理连接。 tools/list 返回一个工具: search_tools。没有模式转储。
2.代理人搜索。 呼叫 search_tools 使用自然语言查询。MCPack返回匹配的模式,按角色过滤,按相关性排序。
{
"name": "search_tools",
"arguments": { "query": "deals and payments", "limit": 3 }
}3.代理人只看到他们的角色所允许的。
A. cofounder 搜索“交易和付款”可以看到 get_deals, update_deal_status, list_payments一 advisor 搜索同一个查询只会看到 get_deals一 admin 和 '*' 看到一切。
4.强制执行。 如果A advisor 尝试呼叫 update_deal_status MCPack直接返回 "Unknown tool: update_deal_status" --不是“拒绝访问”,不是“权限不足”。据该代理所知,该工具并不存在。
两种模式
环绕模式
用一个函数调用包装任何现有的MCP服务器。MCPack拦截 tools/list 和 tools/call,在上面添加了RBAC和懒惰发现。
import { mcpack } from '@llvs/mcpack';
const handle = await mcpack(server, {
roles: {
cofounder: ['get_deals', 'update_deal_status', 'list_payments'],
advisor: ['get_deals'],
admin: ['*']
},
defaultRole: 'advisor'
});构建模式
从一开始就内置RBAC,从头开始构建一个新的MCP服务器。
import { createMCPackServer } from '@llvs/mcpack';
const { server, handle } = createMCPackServer({
name: 'venture-server',
version: '1.0.0',
roles: {
cofounder: ['get_deals', 'update_deal_status', 'list_payments'],
advisor: ['get_deals'],
admin: ['*']
},
defaultRole: 'advisor',
tools: [
{
name: 'get_deals',
description: 'List all active deals in the pipeline',
inputSchema: { type: 'object', properties: {} },
handler: async (args, ctx) => {
return { deals: await db.getDeals() };
},
},
// ... more tools
],
});
server.connect(transport);两种模式使用相同的发动机。相同的RBAC执行。相同 search_tools 界面。相同的会话感知行为。
会话跟踪
每个会话加载一次的模式在后续调用中作为轻量级引用返回。从来没有重复的有效载荷。
{
"tools": [
{ "name": "get_deals", "loaded": false, "schema": { "..." } },
{ "name": "list_payments", "loaded": true }
]
}loaded: false --包含完整模式(本次会话首次)。 loaded: true --代理已经拥有它,MCPack只发送一个引用。
代币减少:一个值得衡量的副作用
RBAC是主要值。但是,确定代理可以看到的范围也会大大减少令牌的使用——代理只加载他们需要的模式,而不是完整的工具界面。
在Stripe MCP(28个工具)上测量。实际线束输出:
=== MCPack Token Reduction Report ===
Stripe MCP tools discovered: 28
Query: "create a payment"
Tools: 28 vanilla -> 5 MCPack
Chars: 33258 -> 4158 (87.5% reduction)
Est. tokens: 8315 -> 1040 (saved ~7275)
Query: "issue refund"
Tools: 28 vanilla -> 3 MCPack
Chars: 33258 -> 3196 (90.4% reduction)
Est. tokens: 8315 -> 799 (saved ~7516)
--- Aggregate ---
Overall reduction: 80.7%
Total est. tokens saved: 33,560| 查询 | 普通代币 | MCPack代币 | 减少 |
|---|---|---|---|
| 创建付款 | 8315 | 1040 | 87.5% |
| 管理客户 | 18315 | 1984 | 76.1% |
| 订阅计费 | 8315 | 3279 | 60.6% |
| 问题退款 | 8315 | 799 | 90.4% |
| 清单发票 | 8315 | 913 | 89.0% |
| 聚合 | 41,575 | 8,015 | 80.7% |
结果因服务器大小和查询宽度而异——工具表面越大,减少的工作量就越大。
数字表示序列化JSON有效载荷的字符数,而不是实际的LLM令牌。估计的令牌使用chars/4近似值。
路线图
- v1.0: RBAC、关键字搜索、会话跟踪(此版本)
- v1.1: 语义搜索、工具使用分析
- v2.0: 二进制编码层
规格
看 完整规格 了解协议细节、架构和配置参考。
许可证
麻省理工学院
