mcpField
C
capmus-mcp

capmus-mcp

远程服务
github.com/Capmus-Team商业与营销03 周前更新
代码仓库

关于 capmus-mcp

capmus-mcp 是面向大学市场 Capmus 的远程 MCP 服务。它让 Agent 通过市场公开 API 搜索商品、查看市场统计、联系发布者并准备草稿。

主要功能

  1. 01搜索并筛选有效商品信息
  2. 02获取商品详情和市场统计
  3. 03浏览有效分类
  4. 04创建草稿,不直接发布
  5. 05提交消息并查询邮件确认状态

适用场景

  1. 01按分类或价格查找市场商品
  2. 02联系发布者前查看商品信息
  3. 03准备由人工补充完成的商品草稿

MCP 相关

它通过无状态的 streamable-HTTP MCP 端点 https://mcp.capmus.com/mcp 提供市场工具。消息需由人工点击邮件链接确认后才会送达。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://mcp.capmus.com/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

7
参数类型必填说明
qstring否全文搜索查询。
catstring否类别 ID 或标签:1/“jobs & services”(别名“jobs”)、3/“housing”、5/“for sale”、8/“friendship & dating”、9/“community”。
limitinteger否页面大小(默认值为 25,最大值为 50)。
cursorstring否来自先前响应 next_cursor 的不透明游标。
max_pricenumber否以美元计的包含式最高价格限制;不包括未标价的刊登。
universityinteger否用于将结果限定到一个校园的数字大学 ID。

详细介绍

supost-mcp

面向 SUpost(斯坦福的 marketplace)的远程 MCP 服务;通过 BRAND=capmus,也可用于 Capmus (capmus.com),它基于同一 supost-web 代码库提供相同的公共 API。一个代码仓库,两个 Vercel 项目:

品牌Vercel 项目端点环境变量
SUpostsupost-mcphttps://mcp.supost.com/mcp(默认)
Capmuscapmus-mcphttps://mcp.capmus.com/mcpBRAND=capmus

BRAND 用于选择服务名称、工具标题和描述,以及默认基础 URL;预览环境中仍可通过 SUPOST_BASE_URL 覆盖基础 URL。

让 AI Agent 搜索当前发布的信息、获取信息详情、查看经验证的市场统计数据、给发布者发消息,以及创建草稿信息。

这是文档 190 工作流 E3(参见 supost-web/docs/dev/190-ai-agent-discovery-implementation-plan.md)。 它是 SUpost 公共接口的纯客户端,包括只读信息 API(E2)、公开信息页面和 /stats.md。它没有特权数据库访问权限,也不持有任何机密信息;唯一的配置是公共基础 URL。

工具

工具底层接口返回内容
search_listingsGET /api/public/listings按最新优先顺序返回当前发布的信息(id、标题、价格、类别、created_at、规范 URL),并支持不透明游标分页。参数:q、cat、university、max_price、limit(≤50)、cursor。
get_listingGET /post/index/<id> → 规范信息页面返回一条信息及其完整描述,解析自页面的 schema.org Product JSON-LD。
get_market_statsGET /stats.md公共统计页面的 Markdown 版本(受众、信息数量、回复率/时间)。
list_categoriesGET /api/public/categories当前有效的类别/子类别体系——即 create_post 可使用的有效值。
create_postPOST /api/public/posts创建一条草稿信息;返回 continue_url,发布者可在此添加照片、检查并发布(若不在免费套餐内,须先付费)。绝不会直接发布。
send_messagePOST /api/public/messages向信息的发布者发送消息。不会立即送达:确认链接会发送到 reply_to_email,只有人工点击后消息才会发出——Agent 必须将其报告为待确认,绝不能说已发送。
check_message_statusPostgREST RPC get_guest_verification_status(publishable key)查询 send_message 提交对应的确认邮件是否已送达:queued / sent / failed(+ 原因)/ unknown。无法确认链接是否已被点击。

绝不会返回任何个人信息。send_message 是联系发布者的受支持方式;信息的 url 也包含站内消息表单。API 条款: https://supost.com/api/public/openapi.json。

地址退回

只有在用户点击确认链接后,消息才会送达;因此,如果链接无法联系到某个地址,消息就永远不会送达(supost-web docs/dev/20260917-2040-guest-reply-bounce-feedback-handoff.md)。 因此,对于无法投递的地址,send_message 绝不会只返回“待处理”:

  • 如果某个地址的确认邮件在过去 30 天内发生过硬退信,API 会在存储任何内容之前拒绝请求,并返回 422 email_undeliverable。工具会返回一个错误结果,内容为 {status: "email_undeliverable", reason, email, message},并告知 Agent 应询问其他地址,而不是重试。
  • 否则,API 会返回 202 和一个 status_key,工具会轮询确认邮件的投递状态,最长约 8 秒(检查 4 次,间隔 2 秒——被抑制的地址会在 1 秒内失败,新发生的硬退信会在 1–16 秒内失败)。如果判定结果为 failed,则会像处理 422 一样报告;sent / queued 会作为 confirmation_email 返回在结果中,并附上供稍后调用 check_message_status 使用的 status_key。

轮询调用的是与网页表单相同的匿名可调用 PostgREST RPC:get_guest_verification_status(status_key),并使用市场的publishable密钥(每个浏览器都会获得该值)。它只返回 queued | sent | failed 和失败分类(mailbox_unknown | no_mx | suppressed | other)——绝不会返回兑换令牌、消息或地址。环境变量:SUPOST_STATUS_URL / SUPOST_STATUS_KEY 可覆盖默认值(生产项目);SUPOST_STATUS_KEY="" 可禁用轮询(工具会报告 unknown);SUPOST_STATUS_POLL_ATTEMPTS / SUPOST_STATUS_POLL_INTERVAL_MS 可调整单次调用中的等待时间。

托管

通过 Vercel 部署为无状态的流式 HTTP MCP 端点(mcp-handler + @modelcontextprotocol/sdk):

https://mcp.supost.com/mcp        (rewritten to /api/mcp)
https://mcp.supost.com/health     (rewritten to /api/health)

没有会话、没有 Redis、没有身份验证——每个请求都会独立处理,所有上游数据均为公开数据,并由 CDN 缓存。

当前运行的提交

在 Vercel 上,initialize 响应中的 serverInfo.version 为 <package version>+<short git sha>(例如 0.3.0+835efb3,来自 VERCEL_GIT_COMMIT_SHA;本地则为纯 0.3.0——参见 src/version.ts),因此任何 MCP 客户端或 GET /health 都能显示已部署的提交。如果发现内容似乎过期,可将其与 git rev-parse --short origin/master 进行比较。

健康检查和运行时间监控

GET /health 会返回 {"ok": true, "brand": "supost", "version": "…"} 且不会调用上游(api/health.ts):它表示函数正在提供服务,并不表示 supost.com 正常运行。为每个品牌配置一个 UptimeRobot HTTP 监控器(手动操作,两个都需要):

  • https://mcp.supost.com/health
  • https://mcp.capmus.com/health

对非 200 状态码发出警报(可选关键词 "ok":true),能够捕获部署故障或域名失效;响应正文中的 version 会显示响应所对应的提交。

部署
vercel deploy          # preview
vercel deploy --prod   # production

可选环境变量:SUPOST_BASE_URL(默认值为 https://supost.com;在预览部署中设为 https://preview.supost.com,以指向开发环境)。

生产部署通过 GitHub 集成从 master 分支发布。除非本地检出版本与 origin/master 一致,否则请避免运行 vercel deploy --prod:过期的 CLI 部署会取代 Git 构建并接管生产别名(此问题于 2026-09-17 发生,已通过 vercel promote 修复)。

使用情况分析

每次工具调用都会触发一个 PostHog mcp_tool_called 事件(参数经过清理,不含个人身份信息 — 参见 src/analytics.ts);如果设置了 TOOL_LOG_URL / TOOL_LOG_KEY,还会在 marketplace 的私有 ops.mcp_tool_call 表中写入一行包含完整参数的记录(src/toollog.ts)。

失败的调用会带有 error_code:公共 API 的错误代码 (rate_limited、not_found、email_undeliverable、invalid_request 等), 或其他情况对应的 unknown(网络故障、响应结构异常);成功时为 null。错误消息绝不会发送,因为其中可能引用用户内容 — 按 error_code 分类,即可区分速率限制激增和上游服务中断。

PostHog 的 distinct_id 是调用方 IP + User-Agent 的加盐 SHA-256 哈希 (src/client.ts),因此 uniq(distinct_id) 可以统计不同的 Agent,而无需存储 IP。事件还包含 client_ua (MCP 客户端的 User-Agent,其中会注明所用的运行环境)和 client_country (Vercel 的地理位置请求头)。在 Vercel 项目的环境变量中设置 CLIENT_ID_SALT,使哈希无法被猜出;仓库内的默认值可确保本地开发正常运行。 未携带 IP 或 User-Agent 的调用会回退到按品牌区分的 ID mcp.<brand>.com。

连接客户端
claude mcp add --transport http supost https://mcp.supost.com/mcp

或者,在任何支持远程服务的 MCP 客户端中,将上方 URL 添加为一个可流式传输的 HTTP 服务。

速率限制

公共 API 将请求限制为每个 IP 每分钟约 60 次,并提供 5 分钟的 CDN 缓存。src/http.ts 中的客户端会遵循这一限制:收到 429 响应时,会遵从 Retry-After(最长 5 秒),只重试一次;否则会返回结构化的 rate_limited 错误,提示 Agent 暂缓请求 — 不会循环重试。所有请求都会携带 supost-mcp/… User-Agent。

每次 marketplace 调用(状态 RPC 除外)还会携带可信 Agent 请求头:x-supost-api-key(部署环境中的 SUPOST_API_KEY,绝不提交到 git),以及在调用方 Agent 的 IP 已知时携带 x-supost-agent-client-ip,其值取自 MCP 自身收到的 x-forwarded-for 的第一跳。(supost-web docs/dev/469-mcp-agent-api-hardening-handoff.md)只有在密钥验证通过时,API 才会信任该 IP,因此每 IP 限制可以按 Agent 生效,而不是对所有 Agent 共享的单个 Vercel 出口 IP 生效。直接使用 X-Forwarded-For 无效:supost.com 运行在 Vercel 上,该平台会在边缘节点覆盖此请求头。

开发

npm install
npm run check    # typecheck + tests
SUPOST_BASE_URL=https://preview.supost.com npx tsx scripts/smoke.ts   # live end-to-end

测试(vitest)涵盖每个工具的请求/响应映射、错误映射、JSON-LD 提取,以及速率限制约定(遵从 Retry-After、限制等待时长、仅重试一次、结构化失败)。

后续事项(手动步骤)

  • 发布到 MCP 注册表 — server.json 已准备就绪。 先将仓库设为公开(gh repo edit Capmus-Team/supost-mcp --visibility public),然后: sh brew install mcp-publisher mcp-publisher login github # 设备授权流程,需要浏览器 mcp-publisher publish # 在仓库根目录运行 对于 Capmus 条目,以相同方式发布 server.capmus.json (在临时检出目录中执行 cp server.capmus.json server.json, 或在支持时执行 mcp-publisher publish --file server.capmus.json)。
  • supost-web 中的 /help/mcp 文档页 — PR #1242(指南 注册表条目 + llms.txt 中的 MCP 行);合并到 dev → master 后上线。
  • PR/引用公告 — 草稿和故事要点见 docs/announcement-draft.md;注册表条目和 /help/mcp 上线后发布(文档 190 工作流 F)。
  • E2 已于 2026-07-09 在生产环境上线(supost.com);冒烟脚本已在生产环境验证,服务部署地址为 https://mcp.supost.com/mcp。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。