MCP Go Lambda服务器
将使用Go创建的Model Context Protocol(MCP)服务器部署到AWS Lambda的项目。
主要功能
- 🚀 使用官方Go SDK:基于MCP官方go-sdk v1.1.0
- 🔧 自动注册工具:使用Self-registering pattern添加一个文件即可自动注册
- 📦 AWS Lambda部署:通过API Gateway+Lambda支持HTTP Transport
- 🎯 简单的扩展:使用基于通用的Register函数以最少的代码添加Tool
项目结构
mcp-go-lambda/
├── cmd/
│ └── lambda/ # Lambda 엔트리포인트
│ └── main.go # 애플리케이션 시작점
├── internal/
│ ├── handler/ # Lambda 핸들러
│ │ └── lambda.go # API Gateway 요청 처리
│ ├── server/ # MCP 서버 팩토리
│ │ └── server.go # 서버 생성 및 설정
│ └── tools/ # Tool 구현 (자동 등록)
│ ├── registry.go # Tool 레지스트리 (제네릭)
│ ├── calculator.go # 계산기 툴
│ └── string.go # 문자열 조작 툴
├── cdk/ # AWS CDK 인프라 코드 (Python)
│ ├── app.py
│ ├── stacks/
│ │ └── mcp_lambda_stack.py
│ └── events/ # 테스트 이벤트
├── lambda_dist/ # 빌드 결과물
├── Makefile
├── go.mod
└── README.md包说明
- cmd/lambda:Lambda函数的入口点
- 内部/处理程序:将API Gateway事件转换为MCP协议
- 内部/服务器:创建MCP服务器和管理工具注册
- 内部/工具:Tool实现(自动注册为init()函数)
🛠️ 实现的工具
计算器(Calculator)
- 添加:加两个数字
- 乘:两个数字相乘
- 减去:减去两个数字
- 分割:除以两个数字
字符串操作(String Manipulation)
- to_upper:将文本转换为大写
- to_lower:将文本转换为小写
- 反向:反转文本
🚀 添加新工具
得益于Self-registering pattern,非常简单!
1. internal/tools/ 在下面创建新文件
// internal/tools/mytool.go
package tools
import (
"context"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
// Input 타입 정의
type MyInput struct {
Text string `json:"text" jsonschema:"입력 텍스트"`
}
// Tool 함수 구현
func MyNewTool(ctx context.Context, req *mcp.CallToolRequest, input MyInput) (
*mcp.CallToolResult,
map[string]interface{},
error,
) {
// 로직 구현
result := "처리된 결과: " + input.Text
return &mcp.CallToolResult{
Content: []mcp.Content{
&mcp.TextContent{Text: result},
},
}, map[string]interface{}{"result": result}, nil
}
// init()에서 자동 등록
func init() {
Register("my_new_tool", "내 새로운 도구 설명", MyNewTool)
}2.构建和部署
make deploy结束! server.go不需要修改或其他文件。
工作原理
- init()函数:Go包导入时自动运行
- Register()通用函数:自动推断Handler函数的类型并注册
- 注册所有工具():创建服务器时调用一次以注册所有工具
此模式是Go标准库(database/sql, image 包)中使用的方法相同。
构建和部署
1.设置AWS Credentials
.env 将AWS credentials添加到文件:
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
AWS_DEFAULT_REGION=ap-northeast-22.使用Makefile(建议)
# 빌드만
make build
# 빌드 + 배포
make deploy
# 스택 삭제
make destroy
# 테스트
make test
# 모든 단계 (clean, deps, test, build)
make all3.手动构建(必要时)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o lambda_dist/bootstrap cmd/lambda/main.go测试
# 단위 테스트 실행
go test ./...
# 특정 패키지 테스트
go test ./internal/handler
# 커버리지 포함
go test -cover ./...🌐 API端点
部署后的API网关端点:
POST https://yhj0gi980j.execute-api.ap-northeast-2.amazonaws.com/dev/mcpHTTP Transport功能
- 内存传输:支持用于会话管理的stateless Lambda
- JSON-RPC 2.0:符合MCP协议标准
- API网关集成:通过REST API外部访问
使用示例
# Initialize (서버 연결 초기화)
curl -X POST "https://yhj0gi980j.execute-api.ap-northeast-2.amazonaws.com/dev/mcp" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "test-client",
"version": "1.0.0"
}
}
}'
# Tools List (사용 가능한 도구 목록)
curl -X POST "https://yhj0gi980j.execute-api.ap-northeast-2.amazonaws.com/dev/mcp" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}'
# Tool Call (도구 실행 - 덧셈 예시)
curl -X POST "https://yhj0gi980j.execute-api.ap-northeast-2.amazonaws.com/dev/mcp" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "add",
"arguments": {
"a": 42,
"b": 58
}
}
}'
# 문자열 뒤집기 예시
curl -X POST "https://yhj0gi980j.execute-api.ap-northeast-2.amazonaws.com/dev/mcp" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "reverse",
"arguments": {
"text": "Hello World"
}
}
}'📝 开发
本地测试
# 테스트 이벤트로 로컬 실행
cd cdk/events
curl -X POST "http://localhost:9000/2015-03-31/functions/function/invocations" \
-d @initialize-request.json体系结构模式
这个项目 自注册模式使用:
- 每个Tool
init()在函数中自动注册 Register()通用函数处理类型推论- 中央注册表管理所有工具
- 添加新工具时不需要修改其他文件
这是Go标准库(database/sql, image)相同的模式。
许可证
MIT许可证
