MCP安全中间件

用于MCP服务器的安全中间件,提供基于信任的访问控制、速率限制和审计日志功能。

  • by Thezenmonster
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 Thezenmonster/mcp-guard

使用说明

mcp警卫

KYA(了解你的经纪人) MCP服务器的安全中间件。滥用数据库、基于信任的访问控制、速率限制和审计日志记录。

零依赖。适用于任何Node.js HTTP框架 KYA验证系统.

扫描任何MCP包以查找安全问题: agentscores.xyz -键入包名,立即获得结果。


问题

MCP服务器没有安全层。任何客户端都可以调用任何工具——没有身份验证,没有访问控制,没有速率限制,没有审计跟踪。随着人工智能代理开始自主调用MCP工具,这是一个关键的差距。

mcp-guard 将KYA验证添加到任何MCP HTTP服务器中——滥用数据库检查、基于信任的访问控制和审计日志记录在三行代码中。

安装

npm install mcp-trust-guard

快速开始

import express from 'express';
import { McpGuard } from 'mcp-trust-guard';

const guard = new McpGuard({
  rules: [
    { minTrust: 0,  tools: ['get_*', 'list_*', 'search_*'] },
    { minTrust: 30, tools: ['create_*', 'update_*'] },
    { minTrust: 60, tools: ['delete_*', 'admin_*'] },
  ],
  rateLimit: { window: 60, max: 30 },
  audit: true,
});

const app = express();
app.use(express.json());
app.use('/mcp', guard.middleware());
// ... your MCP server handler

每 tools/call 现在,请求将根据调用者的信任分数进行验证。只读工具已打开。写作工具需要30分以上。破坏性工具需要60岁以上。

运作原理

                                    ┌──────────────┐
Request ──→ Extract Identity ──→ Rate Limit ──→ │  Trust Check │ ──→ Rule Match ──→ Allow/Deny
             (header)            (per caller)    │ (AgentScore) │    (tool pattern)
                                                 └──────────────┘
  1. 身份 --从中读取呼叫者的代理名称 x-agent-name 标题(可配置)
  2. 速率限制 --每个来电者都有滑动窗口。如果超过JSON-RPC错误,则拒绝
  3. 信任检查 --通过以下方式查看来电者的信任评分 代理核心 (5分钟缓存,故障关闭)
  4. 规则匹配 --使用glob模式将请求的工具与您的规则进行匹配。首场比赛获胜
  5. 允许/拒绝 --如果调用者的分数符合规则的最低值,则请求通过。否则,将返回JSON-RPC错误

特性

基于信任的访问控制

根据信任评分定义分层访问:

const guard = new McpGuard({
  rules: [
    { minTrust: 0,  tools: ['read_*'] },      // Public — anyone can read
    { minTrust: 20, tools: ['query_*'] },      // Low bar — basic queries
    { minTrust: 40, tools: ['write_*'] },      // Verified agents only
    { minTrust: 70, tools: ['transfer_*'] },   // High trust — financial ops
  ],
  defaultMinTrust: 10, // Tools not matching any rule require score >= 10
});

工具名称模式

规则使用glob模式 * 通配符:

{ minTrust: 30, tools: ['create_*', 'update_*'] }    // Matches create_user, update_record
{ minTrust: 60, tools: ['admin_*'] }                   // Matches admin_delete, admin_config
{ minTrust: 0,  tools: ['get_status'] }                // Exact match only
{ minTrust: 50, tools: ['*'] }                         // Catch-all

速率限制

每个调用者的内存滑动窗口:

const guard = new McpGuard({
  rateLimit: {
    window: 60,  // 60-second window
    max: 30,     // 30 requests per window per caller
  },
});

审计日志

控制台日志记录:

const guard = new McpGuard({ audit: true });
// [mcp-guard] ALLOW EmberFoundry → get_status (score: 42, band: MODERATE TRUST) score 42 >= 0 required for get_status
// [mcp-guard] DENY  untrusted-bot → admin_delete (score: 3, band: UNVERIFIED) score 3 < 60 required for admin_delete

自定义审核处理程序:

const guard = new McpGuard({
  audit: (entry) => {
    db.insert('audit_log', entry);
    if (!entry.allowed) alerting.notify(`Blocked ${entry.caller} from ${entry.tool}`);
  },
});

直接信任检查

在没有中间件的情况下以编程方式使用防护:

const guard = new McpGuard();

const decision = await guard.check('EmberFoundry', 'transfer_funds');
// { allowed: false, reason: 'score 14 < 70 required for transfer_funds', caller: 'EmberFoundry', trustScore: 14, trustBand: 'UNVERIFIED' }

自定义信任提供者

使用任何信任源,而不仅仅是AgentCore:

import { McpGuard, TrustProvider, TrustResult } from 'mcp-trust-guard';

const myProvider: TrustProvider = {
  async check(name: string): Promise<TrustResult> {
    const score = await myDatabase.getAgentScore(name);
    return { score, band: score > 50 ? 'TRUSTED' : 'UNTRUSTED', name };
  },
};

const guard = new McpGuard({ provider: myProvider });

包裹任何处理器

不使用Express?包装任何请求处理程序:

const protectedHandler = guard.wrap(mcpHandler);
http.createServer(protectedHandler).listen(3000);

配置

选项 类型 默认值 描述
provider TrustProvider AgentScore 自定义信任评分提供者
apiUrl string https://agentscores.xyz/api/score AgentCore API终结点
identityHeader string x-agent-name 包含呼叫者身份的标头
rules GuardRule[] [] 准入规则(第一场比赛获胜)
defaultMinTrust number 0 无规则匹配时的最小信任
rateLimit { window, max } none 速率限制配置(秒,计数)
cacheTtl number 300000 信任缓存TTL(毫秒)(5分钟)
audit boolean | function false 启用审核日志记录
allowAnonymous boolean false 允许没有身份的请求

识别来电者

默认情况下, mcp-guard 从中读取呼叫者的身份 x-agent-name HTTP标头。MCP客户端在发出请求时应包含此标头:

curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "x-agent-name: MyAgent" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_data"}}'

您可以更改标题名称:

const guard = new McpGuard({ identityHeader: 'authorization' });

或者使用查询参数作为回退-- ?agent=MyAgent 会自动检查。

常见问题解答

如果无法访问信任API,该怎么办? 代理人得0分。默认情况下关闭失败。如果你的规则允许 minTrust: 0 对于某些工具,它们仍然有效。

它是否适用于stdio MCP服务器? 否--stdio服务器在本地运行,不需要网络级安全。 mcp-guard 适用于接受远程连接的HTTP/SSE MCP服务器。

它是否修改了MCP请求? 不,它只检查 tools/call 请求:所有其他MCP方法(tools/list, resources/read等等)原封不动地通过。当一个请求被允许时,它会原封不动地继续传递给您的处理程序。

我可以使用自己的评分系统吗? 对。实施 TrustProvider 接口(一种方法: check(name) → { score, band, name })并将其传递到配置中。

KYA滥用数据库(v0.2.0+)

阻止被报告滥用的代理——数据泄露、及时注入、未经授权的访问等等。公共驱动,免费,无API密钥。

const guard = new McpGuard({
  abuseCheck: true,                // Enable abuse database checks
  abuseBlockLevel: 'CAUTION',      // Block at MONITOR, CAUTION, or BLOCK level
  rules: [
    { minTrust: 0, tools: ['get_*'] },
    { minTrust: 30, tools: ['write_*'] },
  ],
  audit: true,
});

当有滥用报告的代理试图调用工具时:

[mcp-guard] DENY bad-agent → write_file (score: -1, band: ABUSE_REPORTED)
  agent reported in KYA abuse database: prompt_injection (1 reports, severity: high)

举报滥用行为: POST https://agentscores.xyz/api/abuse/report 检查代理: GET https://agentscores.xyz/api/abuse/check?agent=name

对于没有完整中间件的独立滥用检查,请使用 kya虐待检查.

KYA的一部分(了解你的代理人)

mcp信任保护是 KYA --实时AI代理验证。六项检查:部署者、模型、代码、滥用、权限、部署。无需平台注册。

许可证

麻省理工学院