vurb.ts
TypeScript MCP 服务器安全框架,架构级数据脱敏 + FSM 工具权限门控
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
TypeScript MCP 服务器安全框架,架构级数据脱敏 + FSM 工具权限门控
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2025 年,随着 Claude Code、Cursor、Windsurf 等 AI 编程工具的普及,Model Context Protocol(MCP)服务器数量爆发式增长。开发者用 MCP 服务器将数据库、API、内部工具接入 AI 助手,但随之而来的问题却少有人关注:数据流向 LLM 的过程中,几乎没有任何安全过滤。
试想这样一个场景:某医院信息科工程师用 MCP 服务器将患者档案系统接入 AI 助手——SSN(社会安全号码)、诊断记录、出院小结,这些高度敏感的 PII 数据随着 API 响应直接「裸奔」进了 LLM 的上下文窗口。没有字段过滤、没有输出脱敏、没有工具权限控制,一旦发生 Prompt Injection 攻击,后果不堪设想。
正是这个痛点,让 MCP Fusion(vinkius-labs/vurb.ts)应运而生。
MCP Fusion 由独立开发者 Renato Marinho(vinkius-labs)构建,托管在 Vinkius 平台上。在一次医疗系统的 MCP 集成项目中,Renato 发现现有的 MCP 框架对数据安全和权限控制几乎毫无建树——现有的方案要么靠提示词工程打补丁,要么依赖 LLM 自身的对齐能力,而非从架构层面构建安全护栏。
这种「安全即提示词」的做法,在他看来是治标不治本。于是他决定从零设计一个在架构层面内嵌安全的 MCP 框架,并于 2024 年底开源,迅速获得 AI 工程社区关注。目前 GitHub 获得 255 stars,主要用户群体为需要将 MCP 工具接入生产系统的企业开发团队。
MCP Fusion 的安全模型分为三层,从数据输入到工具调用,形成了完整的安全闭环。
Presenter 是 MCP Fusion 的核心安全组件,运行在数据离开服务器、进入 LLM 的出口处。它通过 Zod schema 对 defineModel() 定义的模型进行编译,在内存中实时剥离未声明的字段,任何字段只要没有在 schema 中声明就绝不会被序列化到响应中。
更进一步,Presenter 内置了 fast-redact 编译函数,可以对 PII 字段(如 *.ssn、*.diagnosis)进行 V8 优化正则匹配并替换。Renato 称之为「Late Guillotine 模式」:数据在 UI 渲染层仍保持完整,但在网络传输层已被截断——LLM 永远看不到不该看到的数据。
const PatientPresenter = createPresenter('Patient')
.schema(PatientModel)
.redactPII(['*.ssn', '*.diagnosis'])
.rules((p) => [
p.status === 'critical' ? 'PRIORITY: Patient is critical.' : null,
])
.suggest((p) => p.status === 'admitted'
? [{ tool: 'ward.discharge', reason: 'Begin discharge protocol' }]
: []);
Presenter 还包含一个 PromptFirewall:对动态生成的系统规则用 LLM-as-Judge 做 Prompt Injection 检测,发现异常则 fail-closed(默认拒绝)。这套机制特别适合动态规则生成的场景。
传统的 MCP 工具权限控制依赖 LLM 理解提示词中的约束——这本质上是在让 LLM「自律」,而 LLM 的自律并不可靠。MCP Fusion 的解法是物理删工具:通过 XState v5 驱动的有限状态机(FSM),直接将不符合当前状态的工具从 tools/list 响应中物理移除。
LLM 永远只能看到当前状态允许的工具——不是靠提示词告诉它「你不能调用这个」,而是这个工具根本不在它的 namespace 里。比如患者管理系统中,「出院」工具只有在医生签署同意书后才会出现:
const gate = f.fsm({
id: 'discharge', initial: 'admitted',
states: {
admitted: { on: { PHYSICIAN_SIGNOFF: 'approved' } },
approved: { on: { DISCHARGE: 'discharged' } },
discharged: { type: 'final' },
},
});
export default f.mutation('ward.discharge')
.bindState('approved', 'DISCHARGE')
.handle(async (input, ctx) => ctx.db.patients.discharge(input.id));
| 当前状态 | 可用工具 |
|---|---|
admitted | ward.view、ward.update_vitals |
approved | ward.discharge、ward.view |
discharged | ward.view(只读) |
FsmStateStore 支持 Redis/KV 持久化,可跨越请求边界管理状态,适合 serverless 部署。
MCP Fusion 提供了八个 introspection 模块,让工具行为变更完全透明、可审计、可版本控制:
fusion lock --check 做自动化门控这套治理栈是 MCP Fusion 区别于其他 MCP 框架的核心差异——其他框架关注「能用」,MCP Fusion 关注「行为可审计」。
MCP Fusion 提供了三种不同层级的使用方式,开发者可以根据场景选择:
路径一:YAML 声明式(零代码) 适合运维团队和不想写代码的集成场景。只需写一个 YAML 文件定义连接、工具和执行逻辑,即可快速桥接 REST API:
version: "1.0"
server:
name: "github-tools"
connections:
github:
type: rest
base_url: "https://api.github.com"
auth:
type: bearer
token: "${SECRETS.GITHUB_TOKEN}"
tools:
- name: search_repos
description: "Search GitHub repositories"
execute:
connection: github
method: GET
path: "/search/repositories"
路径二:Typed MVA(全控制)
适合需要精细控制数据模型和业务逻辑的开发者。使用 defineModel() 定义强类型模型,definePresenter() 定义输出脱敏规则,f.query() 定义工具:
export const InvoiceModel = defineModel('Invoice', m => {
m.casts({
amount_cents: m.number('CRITICAL: in CENTS.'),
status: m.enum('Status', ['paid', 'pending', 'overdue']),
});
m.hidden(['password_hash', 'internal_margin']);
});
路径三:FSM 状态机(工作流治理) 适合需要跨步骤权限控制的工作流,如审批流程、订单履约、客服工单。
MCP Fusion 不仅仅是一个框架,更是一个完整的工具链生态:
| 类别 | 包 | 说明 |
|---|---|---|
| 核心 | @mcpfusion/core | 框架核心:Presenters、Fluent API、中间件、路由、治理 |
| 核心 | @mcpfusion/yaml | YAML 声明式引擎 |
| 核心 | @mcpfusion/swarm | 多 Agent 编排,HMAC-SHA256 委托,W3C tracing |
| 核心 | @mcpfusion/a2a | A2A 协议桥,Agent Cards,任务委托 |
| 核心 | @mcpfusion/skills | SKILL.md 渐进式披露 |
| 核心 | @mcpfusion/inspector | 实时 TUI 仪表板 |
| 核心 | @mcpfusion/testing | 内存 MVA 管道测试 |
| 适配器 | @mcpfusion/vercel | Vercel Functions (Edge / Node.js) |
| 适配器 | @mcpfusion/cloudflare | Cloudflare Workers |
| 生成器 | @mcpfusion/openapi-gen | OpenAPI 3.x → MCP 工具 |
| 生成器 | @mcpfusion/prisma-gen | Prisma schema → 带字段级安全的 MCP |
| 连接器 | @mcpfusion/n8n | n8n workflow 桥接 |
| 连接器 | @mcpfusion/aws | AWS Lambda / API Gateway |
| 认证 | @mcpfusion/jwt | JWT 认证中间件 |
| 认证 | @mcpfusion/oauth | OAuth 2.0 集成 |
| 认证 | @mcpfusion/api-key | API Key 管理 |
MCP Fusion 明确面向 serverless 场景优化,不支持传统 Docker 部署。官方推荐的部署路径有三条:
@mcpfusion/vercel 适配器,一行命令部署到 Vercel Edge@mcpfusion/cloudflare 适配器,部署到全球边缘节点部署体验高度工程化:使用 mcpfusion create 脚手架创建项目,通过 mcpfusion deploy 一键发布到目标平台。
npx @mcpfusion/core create my-server
cd my-server && npm run dev
mcpfusion deploy # Vinkius Edge
vercel deploy # Vercel
wrangler deploy # Cloudflare
MCP Fusion 解决了数据出口和工具权限问题,但并非银弹:
主动防护层面:
redactPII 依赖正则匹配,对结构化数据(如 JSON 中的嵌套字段)效果可靠,但对非结构化文本(自由文本病历)需要额外处理框架未覆盖的领域:
tools/call 权限模型)MCP Fusion 代表了一种新的安全范式:不是在 LLM 外部加护栏,而是让安全规则成为代码结构本身的一部分。
传统的安全方案是「提示词 + 外部过滤」——在数据流经 LLM 之后做补救。而 MCP Fusion 的思路是「架构即安全」——让安全约束从数据模型定义阶段就嵌入,用编译器级别的手段(而非提示词工程)保证数据不会被泄漏。
这种思路与 Zero Trust 架构的核心原则高度一致:不信任任何数据,直到它通过了所有安全层的验证。随着 MCP 生态从开发工具向企业核心系统渗透,这类架构级安全框架的重要性将持续上升。
GitHub 255 stars 虽不算高,但考虑到 MCP 协议本身的成熟度和企业采纳速度,MCP Fusion 的技术路线在细分赛道上已经建立了清晰的先发优势。