使用说明
AWS SigV4签名代理MCP服务器
充当透明代理的MCP(模型上下文协议)服务器,将MCP协议消息转发到需要IAM身份验证的目标MCP服务器。代理自动使用AWS签名版本4(SigV4)或签名版本4A(SigV4a)对请求进行签名。
概述
此代理使MCP客户端能够连接到IAM认证的MCP服务器,而无需自己实现签名逻辑。它位于客户端和目标服务器之间,在添加AWS身份验证的同时透明地转发消息。
┌─────────────┐ ┌──────────────────────────┐ ┌─────────────────┐
│ │ stdio │ │ HTTPS │ │
│ MCP Client │────────▶│ Signing Proxy │────────▶│ Target MCP │
│ │ │ (mcp.Server) │ +SigV4 │ Server (IAM) │
│ │◀────────│ │◀────────│ │
└─────────────┘ └──────────────────────────┘ └─────────────────┘
特性
- 透明代理:转发所有MCP协议消息,无需修改
- AWS SigV4签名:使用AWS凭据自动签署HTTP请求
- SigV4a支持:全球服务的多区域签名
- 标准凭证链:使用AWS SDK的默认凭据提供程序
- 个人资料支持:可以使用命名的AWS凭据配置文件
- 会话令牌支持:使用会话令牌处理临时凭据
- 服务器发送的事件:流式响应的可选SSE支持
- 请求超时:向目标服务器发送HTTP请求的可配置超时
- 自定义标头:向代理请求添加自定义标头
- 优雅地关闭:处理SIGINT/SIGTERM信号以实现干净关机
- 结构化日志记录:为调试和监控提供详细的日志记录
快速开始
安装
来源
git clone https://github.com/nisimpson/mcp-sigv4-proxy.git
cd mcp-sigv4-proxy
go build -o sigv4-proxy ./sigv4-proxy
使用Go安装
go install github.com/nisimpson/mcp-sigv4-proxy@latest
基本用法
-
设置AWS凭据 (参见 AWS凭据 部分)
-
配置代理 使用环境变量:
export MCP_TARGET_URL=https://your-mcp-server.execute-api.us-east-1.amazonaws.com
export AWS_REGION=us-east-1
export AWS_SERVICE_NAME=execute-api
- 运行代理:
sigv4-proxy
代理将启动并监听stdin/stdout上的MCP协议消息。
配置
配置选项
代理可以通过命令行标志或环境变量进行配置。命令行标志优先于环境变量。
| 参数 | 标志 | 环境变量 | 必填 | 默认 | 说明 |
|---|---|---|---|---|---|
| 目标URL | --target-url |
MCP_TARGET_URL |
是 | - | 目标MCP服务器的HTTPS端点 |
| 地区 | --region |
AWS_REGION |
是 | - | AWS区域用于签名(例如us-east-1) |
| 服务名称 | --service-name |
AWS_SERVICE_NAME |
是 | - | 用于签名的AWS服务名称(例如,执行api) |
| 签名版本 | --sig-version |
AWS_SIG_VERSION |
没有 | v4 |
签名版本: v4 或 v4a |
| 个人资料 | --profile |
AWS_PROFILE |
没有 | default |
AWS凭据配置文件名称 |
| 启用SSE | --sse |
MCP_ENABLE_SSE |
没有 | false |
为流式响应启用服务器发送事件 |
| 超时 | --timeout |
MCP_TIMEOUT |
否 | 无超时 | 请求超时持续时间(例如,30秒、1米) |
| 标题 | --headers |
MCP_HEADERS |
无 | - | 逗号分隔的自定义标头(格式:key=value,key2=value2) |
配置示例
示例1:API网关MCP服务器
sigv4-proxy \
--target-url https://abc123.execute-api.us-east-1.amazonaws.com \
--region us-east-1 \
--service-name execute-api
示例2:使用环境变量
export MCP_TARGET_URL=https://abc123.execute-api.us-west-2.amazonaws.com
export AWS_REGION=us-west-2
export AWS_SERVICE_NAME=execute-api
export AWS_SIG_VERSION=v4
sigv4-proxy
示例3:使用SigV4a的多区域
sigv4-proxy \
--target-url https://global-mcp-server.example.com \
--region us-east-1 \
--service-name execute-api \
--sig-version v4a
示例4:使用命名的AWS配置文件
sigv4-proxy \
--target-url https://abc123.execute-api.us-east-1.amazonaws.com \
--region us-east-1 \
--service-name execute-api \
--profile production
示例5:服务器发送事件和超时
sigv4-proxy \
--target-url https://abc123.execute-api.us-east-1.amazonaws.com \
--region us-east-1 \
--service-name execute-api \
--sse \
--timeout 30s
示例6:使用自定义标头
sigv4-proxy \
--target-url https://abc123.execute-api.us-east-1.amazonaws.com \
--region us-east-1 \
--service-name execute-api \
--headers "X-Custom-Header=value,X-API-Version=v2"
看 docs/examples.md 查看更详细的配置示例。
AWS凭据
代理使用标准AWS SDK凭据链加载凭据。凭据按以下顺序加载:
-
环境变量
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN(可选,用于临时凭据)
-
共享凭据文件 (
~/.aws/credentials)- 通过指定的默认配置文件或命名配置文件
--profile或AWS_PROFILE
- 通过指定的默认配置文件或命名配置文件
-
IAM角色 (在AWS基础架构上运行时)
- EC2实例配置文件
- ECS任务角色
- Lambda执行角色
设置凭据
选项1:环境变量
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_SESSION_TOKEN=AQoDYXdzEJr... # Optional, for temporary credentials
选项2:AWS凭据文件
创建或编辑 ~/.aws/credentials:
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[production]
aws_access_key_id = AKIAI44QH8DHBEXAMPLE
aws_secret_access_key = je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
然后使用配置文件:
sigv4-proxy --profile production ...
选项3:IAM角色(建议用于AWS基础架构)
在AWS基础架构(EC2、ECS、Lambda)上运行时,代理将自动使用附加到实例/任务/函数的IAM角色。不需要额外的配置。
有关更多详细信息,请参阅 docs/aws-credentials.md.
与MCP客户端一起使用
克劳德桌面
将代理添加到您的Claude Desktop配置中(~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):
{
"mcpServers": {
"iam-protected-server": {
"command": "/path/to/sigv4-proxy",
"args": [
"--target-url", "https://abc123.execute-api.us-east-1.amazonaws.com",
"--region", "us-east-1",
"--service-name", "execute-api"
]
}
}
}
其他MCP客户端
代理通过stdio进行通信,因此它可以与任何支持stdio传输的MCP客户端一起使用。配置您的客户端以将代理作为子进程启动,并通过stdin/stdout进行通信。
故障排除
常见问题
“配置错误:需要目标URL”
原因:未提供目标URL。
解决方案:设置 MCP_TARGET_URL 环境变量或用途 --target-url 旗帜。
“加载AWS凭据失败”
原因:AWS凭据未配置或无法访问。
解决方案:
- 验证证书是否通过环境变量设置,
~/.aws/credentials,或IAM角色 - 如果使用,请检查配置文件名称是否正确
--profile - 确保凭据未过期(对于临时凭据)
“目标URL必须使用http或https方案”
原因:目标URL格式不正确或使用了不受支持的协议。
解决方案:确保目标URL以开头 https:// (或 http:// 用于本地测试)。
“签名版本必须是'v4'或'v4a'”
原因:指定的签名版本无效。
解决方案:使用其中之一 v4 或 v4a 为了 --sig-version 旗帜或 AWS_SIG_VERSION 环境变量。
有关更多故障排除提示,请参阅 docs/故障排除.md.
安全注意事项
- 凭证保护:代理从不记录或公开AWS凭据。访问密钥在日志中被屏蔽。
- 需要HTTPS:目标服务器连接应使用HTTPS来保护传输中的数据。
- 签名安全:AWS SDK根据AWS规范安全地处理签名生成。
- 无凭证转发:代理不会将凭据转发给客户端。
演出
- 连接池:为了提高效率,重用了到目标服务器的HTTP连接。
- 最小延迟:签名会为每个请求增加大约1-2ms的开销。
- 流媒体:大型响应流式传输,而不会在内存中缓冲整个有效载荷。
许可证
MIT许可证-有关详细信息,请参阅许可证文件。
贡献
欢迎投稿!请看 贡献.md 了解开发设置、测试指南以及如何提交pull请求。
支持
有关问题、疑问或贡献,请访问 GitHub存储库.
