使用说明
SAM.gov MCP 服务器(Go 语言)
概述
- 已准备好投入生产的HTTP MCP服务器,实现模型上下文协议
- 与SAM.gov机遇API集成,采用12小时内存缓存
- 端点:/health(健康检查)、/mcp/tools(工具)、/mcp/call(调用)、/mcp/scheduled(计划任务)
- 在/mcp/*上使用承载令牌认证;为/mcp/scheduled单独设置计划令牌
- Docker 容器、GitHub Actions 持续集成(CI)和每日两次的调度器
建筑学
- cmd/sam-mcp-http:主入口点,读取环境变量,连接服务器和TLS
- 内部/服务器:
- server.go: 路由、认证中间件、处理程序(工具、调用、计划任务)
- types.go: MCP的Tool和CallRequest结构体
- cache.go: 简单的线程安全TTL缓存
- sam.go:用于SAM.gov机会搜索的最小化HTTP客户端
- 内部/SAM:服务器处理程序使用的更丰富的SAM.gov客户端
安全
- MCP_TOKEN 保护 /mcp/tools 和 /mcp/call
- SCHEDULE_TOKEN 用于保护 /mcp/scheduled(也可能接受 MCP_TOKEN)
- 建议所有部署使用TLS;挂载证书组合
环境变量
- 端口:服务器端口(默认3000)
- MCP_TOKEN:用于MCP端点的承载令牌
- 计划令牌:用于计划端点的承载令牌
- SAM_API_KEY: SAM.gov的API密钥(可选;如果未设置,则返回模拟数据)
- PREFETCH_Q: 预定预取的默认查询(例如,“软件”)
- PREFETCH_NAICS:CSV格式的NAICS代码(例如,541511,541512,541519)
- PREFETCH_DAYS:向前追溯的整数天数以进行搜索(例如,7天)
- PREFETCH_LIMIT:整数页面大小(例如,25)
- PREFETCH_NOTICE_TYPE:可选的通知类型过滤器
- PREFETCH_ORG:可选的组织过滤器
- TLS_CERT_FILE:服务器证书(PEM)的路径
- TLS_KEY_FILE:服务器密钥(PEM)的路径
本地运行(Go 语言)
- 复制 .env.local 文件并编辑其中的值(至少包括 MCP_TOKEN 和 SCHEDULE_TOKEN)
- 选项A:HTTP(仅限开发)
- 运行 ./cmd/sam-mcp-http 命令
- 选项B:HTTPS(推荐)
- 生成证书到 ./certs 目录(参见下面的 TLS 部分),并设置 TLS_CERT_FILE/TLS_KEY_FILE
- 运行 ./cmd/sam-mcp-http 命令
Docker
- docker compose up --build 翻译为中文是:“使用 Docker Compose 启动并构建(镜像)”
- 编写 `.env.local` 文件,挂载 `./certs` 目录,并将环境变量传递给容器
TLS(本地自签名) 在 ./certs 目录中生成开发证书:
- 证书/server.crt
- 证书/server.key 然后设置:
- TLS证书文件路径=./certs/server.crt
- TLS_KEY_FILE=./certs/server.key 翻译为中文是:“TLS 密钥文件路径为 ./certs/server.key”
HTTP 端点
- GET /health 翻译为中文是:“获取/健康(状态)”
- 200 {"状态":"正常"}
- GET /mcp/tools(认证:Authorization: Bearer <MCP_TOKEN>)
- 列出可用工具和输入模式
- POST /mcp/call (认证)
- 主体:{"name":"sam_search","arguments":{...}}(注:这里的“...”表示省略了具体的参数内容,在实际翻译中应根据具体的参数填充完整。)
- 将请求路由到工具处理程序
- POST /mcp/scheduled(认证:Bearer <计划任务令牌> 或 MCP_TOKEN)
- 使用 PREFETCH_* 默认值触发缓存预热
工具:sam_search 输入参数(除非另有说明,所有参数均为可选):
- q: 字符串(搜索文本)
- NAICS(北美行业分类系统): 字符串数组
- 天数:整数(默认模式下为必填项)
- 限制:整数(1..100)
- noticeType: 字符串
- 组织:字符串
Curl 示例 列出工具: `curl -H "Authorization: Bearer $MCP_TOKEN" https://` 翻译成中文是:“使用 curl 命令,添加头部信息 'Authorization: Bearer $MCP_TOKEN',访问 https://...”。不过,由于原句是一个命令的开头部分,且没有给出完整的 URL,所以中文翻译也保留了这种不完整性,实际使用时需要根据具体的 URL 来补全/mcp/tools 翻译为中文是:“/mcp/工具” 或者更自然的表达可能是 “/mcp 工具目录”(如果这是指一个文件夹或目录名的话)。不过,具体翻译可能还需根据上下文来确定最准确的表述
调用工具:
`curl -H "Authorization: Bearer $MCP_TOKEN"` 翻译成中文是:使用带有“Bearer $MCP_TOKEN”授权头的curl命令
-H "Content-Type: application/json" 翻译为中文是:“-H '内容类型: 应用程序/JSON'” 或更自然的表达为:“-H '设置内容类型为:application/json'”。其中,“-H”通常用于命令行中指定请求头(如在使用curl等工具时),表示后面跟着的是要设置的请求头信息
-d '{"name":"sam_search","arguments":{"q":"software","days":7,"limit":25}}' 翻译成中文是:“以数据格式传递一个包含名称和参数的JSON对象,其中名称为'sam_search',参数包括查询词'q'为'software',天数'days'为7,限制'limit'为25”
https:///mcp/call 翻译成中文是:“/mcp/呼叫” 或者根据上下文,也可以翻译为“/mcp/联系”、“/mcp/通话”等,具体取决于“call”在该语境中的具体含义。但最直接的翻译是“/mcp/呼叫”
触发计划预取: `curl -H "Authorization: Bearer $SCHEDULE_TOKEN" https://` 翻译成中文为:“使用curl命令,添加头部信息'Authorization: Bearer $SCHEDULE_TOKEN',然后访问https://(网址需后续补充)”/mcp/scheduled 翻译成中文是:“/mcp/计划/安排” 或者 “/mcp/预定/调度”。具体翻译可能根据上下文有所调整,但基本意思是与“计划”或“预定/调度”相关的/mcp路径或功能
GitHub Actions 调度器
- .github/workflows/scheduled.yml 在 UTC 时间 06:00 和 18:00 运行
- 在部署后设置这些仓库密钥:
- MCP_SCHEDULE_URL:用于POST的完整URL(例如,https:///mcp/scheduled)
- 计划令牌:用于计划身份验证的承载令牌
- 这一步是有条件的,只有在两个密钥都设置好时才会执行
CI(企业识别系统/企业形象标识)
- 在推送/拉取请求(Push/PR)时,持续集成(CI)工作流会构建并审查代码
- Trivy、revive 和 Semgrep 是通过 Codacy MCP 工具集来使用的
开发快速入门(无TLS,用于隧道连接)
- 通过HTTPS隧道进行快速Agent Builder测试:
- Linux/WSL:运行 ./run_dev.sh 脚本
- Windows:运行 run_dev.bat 脚本
- 这会设置 ALLOW_INSECURE_HTTP=1 并启动 http://localhost:3000
- 然后通过您的HTTPS隧道/代理暴露到https:///mcp 翻译成中文是“/mcp”(注:由于“/mcp”本身是一个特定的指令或代码,在中文中没有直接的翻译,因此保持原样)。不过,如果“/mcp”是某个特定上下文中的指令或代码,可能需要根据具体语境进行翻译或解释。但在此通用语境下,直接翻译为“/mcp”是合适的
测试
- 运行测试。/。。。
与OpenAI Agent Builder(MCP)一起使用 你可以在OpenAI Agent Builder中将此服务器连接为MCP工具。
先决条件
- 已部署可通过OpenAI访问的HTTPS终端节点
- 已配置 MCP_TOKEN
步骤
- 打开Agent Builder用户界面(platform.openai.com/agents)并创建/编辑您的代理
- 前往“工具”>“添加工具”>“模型上下文协议 (MCP)”
- 输入:
- 基础URL: https:///mcp 翻译成中文是“/mcp”(注:由于“/mcp”本身可能是一个特定语境或命令下的代码或缩写,没有直接的中文翻译,所以保持原样)。如果“/mcp”在特定上下文中有特定含义,需要根据具体语境进行翻译或解释
- 认证:HTTP头部
- 头部名称:授权
- 头部值:Bearer ${MCP_TOKEN}
- 保存工具并进行测试:
- 询问代理:“在SAM.gov上搜索过去7天内的软件采购机会”
- 代理将使用您的参数调用 sam_search
故障排除
- 401 未授权:请验证授权头和令牌值
- 空结果:如果希望获取实时数据,请确保已设置SAM_API_KEY;否则将返回模拟结果
- 调度器未触发:请确认密钥 MCP_SCHEDULE_URL 和 SCHEDULE_TOKEN 已设置,且 URL 可访问
- TLS问题:验证证书/密钥路径,并确保证书与主机名匹配
