AWS签名代理服务

一个MCP服务器代理,自动为需要IAM认证的目标MCP服务器请求添加AWS SigV4签名。

  • by nisimpson
  • Go
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 nisimpson/mcp-sigv4-proxy

使用说明

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

基本用法

  1. 设置AWS凭据 (参见 AWS凭据 部分)

  2. 配置代理 使用环境变量:

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
  1. 运行代理:
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凭据链加载凭据。凭据按以下顺序加载:

  1. 环境变量

    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY
    • AWS_SESSION_TOKEN (可选,用于临时凭据)
  2. 共享凭据文件 (~/.aws/credentials)

    • 通过指定的默认配置文件或命名配置文件 --profile 或 AWS_PROFILE
  3. 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存储库.

其他文件