DCAP MCP代理-AWS CDK
一个简单的无状态MCP(模型上下文协议)代理,它为任何MCP服务器添加了实时DCAP(分布式克劳德代理协议)性能跟踪,而不需要更改代码。
DCAP v2.6实施 -全力支持 语义发现与自主工具调用.
特性
- ✅ 无状态架构 -无数据库、无缓存、简单传递
- ✅ DCAP v2.6协议 -UDP广播
perf_update和semantic_discover消息 - ✅ 工具发现 -代理可以发现并自主调用代理工具
- ✅ 长超时支持 -长时间运行的工具的15分钟Lambda超时
- ✅ SSRF保护 -阻止本地主机、内部IP、非HTTPS URL
- ✅ 数据隐私 -参数匿名化(仅元数据,无值)
- ✅ 经济高效 -无服务器,按使用付费定价(约1万个请求每月1美元)
- ✅ Lambda函数URL -无需API网关(免费,更简单)
建筑
Client → Lambda Function URL → Backend MCP Server
↓
UDP/DCAP (broadcast metrics)组件:
- 匿名函数 (ARM64 Graviton2)-具有DCAP跟踪功能的代理处理程序
- 函数URL -直接HTTPS端点(无API网关)
- S3静态站点 -带有使用说明的仪表板
先决条件
- Node.js 18+和npm
- AWS CLI已配置凭据
- AWS-CDK-CLI:
npm install -g aws-cdk - AWS帐户
快速开始
1.安装依赖项
cd cdk
npm install2.配置DCAP(可选)
设置DCAP广播的环境变量:
export DCAP_ENABLED=true
export DCAP_MULTICAST_IP=239.255.0.1 # or your UDP relay IP
export DCAP_PORT=10191
export DCAP_SERVER_ID=my-mcp-proxy或者创建一个 .env 文件(未提交到git):
# .env
DCAP_ENABLED=true
DCAP_MULTICAST_IP=239.255.0.1
DCAP_PORT=10191
DCAP_SERVER_ID=my-mcp-proxy
DCAP_SERVER_NAME=My MCP Proxy3.Bootstrap CDK(仅限首次使用)
cdk bootstrap4.部署
cdk deploy部署将输出:
- 代理函数URL -您的Lambda函数URL端点
- 仪表板URL -静态仪表板URL
- 代理使用情况 -curl命令示例
5.测试代理
# Replace with your actual Lambda Function URL and backend MCP server
curl -X POST "https://abc123.lambda-url.us-east-1.on.aws/?url=https://your-mcp-server.com/mcp" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/list",
"id": 1
}'用法
基本代理请求
POST https://YOUR_FUNCTION_URL/?url=https://backend-mcp-server.com/mcp
Headers:
Content-Type: application/json
Body:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "my_tool",
"arguments": {
"param1": "value1"
}
},
"id": 1
}收听DCAP广播
创建一个简单的UDP侦听器来接收性能指标:
# dcap_listener.py
import socket
import json
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 10191))
print("🎧 Listening for DCAP messages on port 10191...")
while True:
data, addr = sock.recvfrom(4096)
message = json.loads(data.decode())
print(f"\n{'='*60}")
print(f"Tool: {message['tool']}")
print(f"Execution Time: {message['exec_ms']}ms")
print(f"Success: {'✅' if message['success'] else '❌'}")
print(f"Server: {message['sid']}")
print(f"Arguments: {message['ctx']['args']}")
print(f"{'='*60}")运行侦听器:
python dcap_listener.pyDCAP v2.6消息格式
性能更新(perf_Update)
每个工具执行都广播一个性能指标:
{
"v": 2,
"ts": 1699564800,
"t": "perf_update",
"sid": "dcap-mcp-proxy",
"tool": "query_database",
"exec_ms": 234,
"success": true,
"ctx": {
"args": {
"query": "string[50]",
"limit": "number"
}
}
}工具发现(语义_范围)
代理可以发现代理工具并自主调用它们:
{
"v": 2,
"ts": 1699564800,
"t": "semantic_discover",
"sid": "dcap-mcp-proxy",
"tool": "query_database",
"does": "Queries a database with SQL",
"when": [],
"good_at": [],
"bad_at": [],
"connector": {
"transport": "http",
"endpoint": "https://backend.example.com/mcp",
"auth": {
"type": "none",
"required": false
},
"headers": {
"required": ["Accept", "Content-Type"],
"optional": {
"Accept": "application/json",
"Content-Type": "application/json"
}
},
"protocol": {
"type": "mcp",
"version": "2024-11-05",
"methods": ["tools/list", "tools/call"]
},
"session": {
"required": false
}
}
}关键点: 代理接收 semantic_discover 消息可以使用 connector 信息。
了解更多: DCAP v2.6规范
配置
环境变量
在部署前在shell中设置这些变量,或在部署后更新AWS控制台中的Lambda函数环境变量:
| 变量 | 默认值 | 描述 |
|---|---|---|
DCAP_ENABLED | true | 启用/禁用DCAP广播 |
DCAP_MULTICAST_IP | *(空)* | UDP目标IP(DCAP需要) |
DCAP_PORT | 10191 | UDP端口号 |
DCAP_SERVER_ID | dcap-mcp-proxy | 此代理的唯一标识符 |
DCAP_SERVER_NAME | DCAP MCP Proxy | 人类可读的服务器名称 |
更新Lambda环境变量
部署后,您可以更新环境变量:
aws lambda update-function-configuration \
--function-name DcapProxyStack-ProxyFunction... \
--environment "Variables={DCAP_MULTICAST_IP=239.255.0.1,DCAP_PORT=10191}"发展
地方发展
Lambda函数可以在本地进行测试:
# Install dependencies
cd lambda
npm install
# Run TypeScript compiler
npx tsc proxy.ts
npx tsc dcap.ts
# Test locally (requires Node.js)
node -e "
const { handler } = require('./proxy');
handler({
requestContext: { http: { method: 'POST' } },
queryStringParameters: { url: 'https://example.com' },
body: JSON.stringify({ jsonrpc: '2.0', method: 'tools/list', id: 1 })
}).then(console.log);
"CDK命令
# Show differences before deploy
cdk diff
# Synthesize CloudFormation template
cdk synth
# Deploy to AWS
cdk deploy
# Destroy the stack (clean up)
cdk destroy成本估算
基于每天10000个请求(约300K/月):
| 服务 | 成本/月 | 备注 |
|---|---|---|
| Lambda(ARM64) | 0.00美元 | 免费层:100万次请求+40万GB秒 |
| Lambda函数URL | $0.00 | 免费(不收取每次请求的费用) |
| S3(仪表板) | 0.10美元 | ~1GB存储+最小传输 |
| 总计 | 约0.10美元/月 | 低流量基本免费 |
缩放比例:
- 10万需求/天:约2美元/月
- 100万需求/天:约8美元/月
- 1000万需求/天:约80美元/月
安全
SSRF保护
代理会自动阻止:
localhost和127.0.0.1- 内部IP范围(
10.x,172.16.x,192.168.x) - AWS元数据端点(
169.254.169.254) - 非HTTPS URL
数据隐私
在广播之前,参数是匿名的:
- 字符串:截断为20个字符(
"my-secret-key-123"→"my-secret-key-123...") - 数组:仅显示计数(
[1,2,3]→"[3 items]") - 对象:显示字段计数(
{a:1,b:2}→"{2 fields}")
公共访问
Lambda函数URL为 公开可访问的 通过设计。要限制访问,请执行以下操作:
- 添加API密钥身份验证 (需要更改代码)
- 将CloudFront与WAF结合使用 (增加了成本和复杂性)
- 仅VPC部署 (需要VPC和专用网络)
对于具有身份验证的生产部署,请考虑升级到具有API密钥或AWS IAM身份验证的API网关。
故障排除
未收到DCAP消息
- 检查Lambda日志:
aws logs tail /aws/lambda/DcapProxyStack-ProxyFunction... --follow- 验证环境变量:
aws lambda get-function-configuration \
--function-name DcapProxyStack-ProxyFunction... \
--query 'Environment.Variables'- 从您的计算机测试UDP连接
后端超时
代理支持15分钟超时。如果你的后端需要更长的时间:
- 考虑异步模式(返回202,完成后回调)
- 将长操作分解为更小的块
- 对工作流程使用步骤功能>15分钟
CORS错误
默认情况下,所有源都启用CORS。如果您仍然看到CORS错误:
- 检查AWS控制台中的Lambda函数URL CORS设置
- 验证您的客户端是否发送
Content-Type: application/json - 检查浏览器控制台是否有特定的错误消息
监控
CloudWatch指标
在AWS控制台中查看Lambda指标:
- 调用
- 持续时间
- 错误
- 节流阀
CloudWatch日志
实时流日志:
aws logs tail /aws/lambda/DcapProxyStack-ProxyFunction... --followDCAP分析
所有工具执行都通过DCAP广播。连接与DCAP兼容的仪表板,或使用上面的UDP侦听器脚本构建自己的仪表板。
升级
添加自定义域(可选)
要添加自定义域,您需要CloudFront:
// In lib/dcap-proxy-stack.ts
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
const distribution = new cloudfront.Distribution(this, 'Distribution', {
defaultBehavior: {
origin: new origins.HttpOrigin(functionUrl.url),
},
domainNames: ['dcap.yourdomain.com'],
certificate: certificate, // ACM certificate
});添加速率限制
对于生产,使用Lambda保留并发或API网关添加速率限制。
许可证
麻省理工学院
支持
对于问题或疑问:
- 检查CloudWatch日志
- 查看 DCAP集成指南
- 在存储库中打开问题
______________________________________________________________________
内置: AWS CDK•Lambda•TypeScript• DCAP v2.6
