文档

接入、用法与排查。从零到第一次调用通常不超过 5 分钟,而且不需要注册。

快速接入(5 分钟)

一条命令写进你的 agent 配置,重启会话就能用。不需要注册、不需要密钥—— 匿名调用按 IP 给免费额度,够日常试用与轻度开发。要更高额度、要看用量、要管密钥时再注册。

bash
claude mcp add --transport http amazon-spapi https://mcp.sp-api.net/mcp/sp-api
装完一定要重启 agent 会话。MCP 配置只在启动时加载,Skill 目录也只在启动时扫描。 这是最常见的「装了但没生效」。

两个 endpoint

SP-API 与 Ads 完全独立,各自一套工具集,可以只装一个。额度共享同一个池。

endpoint地址工具内容
sp-api https://mcp.sp-api.net/mcp/sp-api 10 订单、库存、商品、报告、Feed、通知——66 个 API 的权威签名与限流。
ads-api https://mcp.sp-api.net/mcp/ads-api 11 SP / SB / SD / DSP / AMC——72 个规范,外加 269 个 Amazon 官方真实请求体。

下面按客户端分节,每节都有一段可以直接复制的配置。找到你在用的那个即可,其余可以跳过。

Claude Code

最省事的一条路:命令行直接加,不用编辑任何 JSON。

claude-code
claude mcp add --transport http amazon-spapi https://mcp.sp-api.net/mcp/sp-api
claude mcp add --transport http amazon-ads   https://mcp.sp-api.net/mcp/ads-api

需要密钥时的变体

默认不带密钥就能用。当你注册后想把调用记到自己账号下(看用量、拿更高额度), 再加一个 --header

bash
claude mcp add --transport http amazon-spapi https://mcp.sp-api.net/mcp/sp-api \
  --header "Authorization: Bearer sk_live_xxx"

验证是否装上:claude mcp list 应该能看到 amazon-spapi,状态 connected。

本地执行器目录:~/.claude/skills/ 改完配置重启会话才生效

ChatGPT / Codex CLI

写进 ~/.codex/config.toml。ChatGPT 桌面端的 Codex 与 Codex CLI 共用这份配置。

codex
# ~/.codex/config.toml
[mcp_servers.amazon-spapi]
url = "https://mcp.sp-api.net/mcp/sp-api"

[mcp_servers.amazon-ads]
url = "https://mcp.sp-api.net/mcp/ads-api"
本地执行器目录:~/.agents/skills/ 改完配置重启会话才生效

WorkBuddy

在设置里找到 MCP Servers,粘贴下面这段标准 mcpServers 结构即可。

配置格式正在与 WorkBuddy 确认中。 下面是按标准 mcpServers 结构给出的通用写法;正式格式确认后本节会更新。 如果你的 WorkBuddy 版本里找不到对应入口,可以先用「其他客户端」一节的通用 HTTP 接入方式。
workbuddy
// WorkBuddy 设置 → MCP Servers(标准 mcpServers 结构,HTTP 传输)
{
  "mcpServers": {
    "amazon-spapi": {
      "type": "http",
      "url": "https://mcp.sp-api.net/mcp/sp-api"
    },
    "amazon-ads": {
      "type": "http",
      "url": "https://mcp.sp-api.net/mcp/ads-api"
    }
  }
}
本地执行器目录:~/.agents/skills/ 改完配置重启会话才生效

Cursor

写进 ~/.cursor/mcp.json(全局)或项目里的 .cursor/mcp.json。

cursor
// ~/.cursor/mcp.json
{
  "mcpServers": {
    "amazon-spapi": { "url": "https://mcp.sp-api.net/mcp/sp-api" },
    "amazon-ads":   { "url": "https://mcp.sp-api.net/mcp/ads-api" }
  }
}
本地执行器目录:~/.agents/skills/ 改完配置重启会话才生效

VS Code

写进工作区的 .vscode/mcp.json,Copilot Chat 的 agent 模式会自动加载。

vscode
// .vscode/mcp.json
{
  "servers": {
    "amazon-spapi": { "type": "http", "url": "https://mcp.sp-api.net/mcp/sp-api" },
    "amazon-ads":   { "type": "http", "url": "https://mcp.sp-api.net/mcp/ads-api" }
  }
}
本地执行器目录:~/.agents/skills/ 改完配置重启会话才生效

其他客户端

任何支持 Streamable HTTP 传输的 MCP 客户端都能直接填 URL。

other
endpoint : https://mcp.sp-api.net/mcp/sp-api
           https://mcp.sp-api.net/mcp/ads-api
transport: Streamable HTTP(POST,单次 JSON 响应)
protocol : 2026-07-28 / 2025-11-25 / 2025-06-18 / 2025-03-26 均支持
auth     : 可不带;需要更高额度时 Authorization: Bearer <密钥>

协议是普通的 Streamable HTTP:一次 POST,一次 JSON 响应。没有长连接、 没有 SSE 依赖、没有 initialize 握手。详见协议版本一节。

本地执行器目录:~/.agents/skills/ 改完配置重启会话才生效

三步用法

规范不是给人翻的,是给模型查的。正确的姿势是漏斗:先定位,再取权威签名, 最后生成请求。370 + 789 个 operation 绝不能一对一暴露成工具——模型选不过来也选不准。

  1. search —— 定位spapi_search "orders" 返回精简候选行(operation / schema / doc 一次搜完),几 KB 而已。
  2. op / show —— 取权威签名spapi_op orders-v0:getOrders 给出必填参数、schema、限流 0.0167 req/s、是否 deprecated。写任何请求之前必调。
  3. request —— 生成可执行请求spapi_request 返回解析好的 URL、query、头、body 骨架、翻页方式、缺失的必填项,外加一条能直接跑的 curl。

第四步在你自己的机器上:把请求描述交给本地执行器,或者直接复制那条 curl。 凭证在这一步才出现,且只出现在你的机器上。

一段真实对话

你:帮我拉 us-main 店铺上周的订单。 agent:先查规范。 → spapi_search query="orders" 12 条候选,3.1KB → spapi_op ref="orders-v0:getOrders" 权威签名,4.3KB 注意到两件事: · 必填 MarketplaceIds,你没给,我用连接里声明的 US · 限流 0.0167 次/秒(约每分钟 1 次),规范里附了一句 「拉取大量历史订单请改用 createReport」 → spapi_request ref="orders-v0:getOrders" params={"MarketplaceIds":["ATVPDKIKX0DER"], "CreatedAfter":"2026-08-18T00:00:00Z"} 拿到请求描述,交给本地执行器: [connection: us-main | SP-API NA | seller A1B2C3D4E5 | ATVPDKIKX0DER] GET /orders/v0/orders → 200 (1.2s, 47 orders) 上周共 47 个订单。要我继续按 SKU 汇总吗? (提醒:这个接口每分钟只能调 1 次,如果要拉整月历史,我建议改用 Reports API。)
注意最后那句提醒——它不是模型编的,是 spapi_op 从规范里带出来的 rateLimit.note规范服务的增值不只是给数字,还给出「该换个 API」的判断。

工具清单

两个 endpoint 各自一套。带 ★ 的是「生成可执行请求」那一步,也是最终要落到的地方。

SP-API(9 个工具)

工具做什么
spapi_search全域检索:operation / schema / doc / api / notification / report 一次搜完,返回精简候选行。
spapi_op单个 operation 的完整权威定义:method、path、全部参数(位置 / 必填 / 类型)、请求与响应 schema、限流、是否废弃。
spapi_schema取 schema 定义并内联 $ref:字段、类型、必填、枚举、说明。
spapi_doc读取 Amazon 官方开发者文档正文。
spapi_request★ 生成可直接执行的请求描述:URL、query、头、body 骨架、限流、翻页方式,外加一条 curl。
spapi_list按类目浏览而不是检索:列全部 API、按条件列 operation / schema / doc。
spapi_changelogAmazon 官方 changelog 条目,最新在前。用于回答「这个月改了什么」。
spapi_status规范来源与新鲜度:各类记录数、更新时间、上游版本。
get_executor返回本地执行器的文件清单与内容,由客户端写入本地。

Ads API(10 个工具)

工具做什么
ads_search全域检索:789 个 operation、7,206 个 schema、768 页文档、269 个官方请求示例。
ads_operation检索 operation 列表并返回精简行:operationId、method、path、所属规范、tag、响应码、摘要。
ads_show★ 单个 operation 的完整定义,直接读自 OpenAPI 规范:合并后的全部参数、准确的鉴权头组合、媒体类型。
ads_schemaschema 定义:名称、所属规范、类型、必填字段、全部属性。
ads_doc检索广告高级工具中心的官方文档。
ads_exampleAmazon 官方 Postman 集合中的真实请求:method、完整 URL、请求体。
ads_request★ 生成可直接执行的请求描述:区域主机、URL、正确的鉴权头组合、媒体类型。
ads_gapAmazon 自己在调、却没有任何公开 OpenAPI 规范的端点——共 80 个,最大一块是 AMC。
ads_spec规范目录:72 个 OpenAPI 规范的 slug、family、版本、operation 数。
get_executor同上,返回本地执行器文件。

请求描述格式

spapi_request / ads_request 返回的不是「调用结果」,而是一份怎么调的说明书。 它是纯函数的输出:给定 operation 与参数,永远得到同一份描述。凭证的位置只有占位符。

json
{
  "method": "GET",
  "host":   { "NA": "sellingpartnerapi-na.amazon.com",
              "EU": "sellingpartnerapi-eu.amazon.com",
              "FE": "sellingpartnerapi-fe.amazon.com" },
  "path":   "/orders/v0/orders",
  "query":  { "MarketplaceIds": "ATVPDKIKX0DER",
              "CreatedAfter":   "2026-08-18T00:00:00Z" },
  "auth":   { "header": "x-amz-access-token", "value": "${AUTH_TOKEN}",
              "rdtRequired": false },
  "rateLimit":  { "rps": 0.0167, "burst": 20,
                  "note": "拉取大量历史订单请改用 createReport" },
  "pagination": { "style": "NextToken", "param": "NextToken" },
  "validation": { "missing": [], "unknown": [] },
  "curl": "curl -sS -X GET \"https://…\" -H \"x-amz-access-token: $LWA_ACCESS_TOKEN\""
}
  • host 把三个区域都给出来——我们不知道你在哪个区域经营,由执行器按当前连接选。
  • validation.missing 在发请求之前就列出缺了哪个必填项,省一次 400 往返。
  • rateLimit.note 是规范原文里的建议,不是模型编的。
  • curl 可以直接复制到终端跑,填上自己的 token 即可。
${AUTH_TOKEN} 永远是占位符。服务端不知道、也不需要知道你的真实 token—— 这不是承诺,是架构决定的结果。

本地执行器

执行器是一个不含任何规范数据的哑执行器:它不知道 Amazon 有哪些 API, 只会执行一份别人给它的请求描述。所有智能都在服务端,所以它只有几十 KB、零第三方依赖。 不装也能用——请求描述里自带的 curl 效果完全一样,只是重试、翻页、token 刷新要你自己来。

路径 A让 agent 自己装

默认路径。让 agent 调 get_executor 工具,它会拿到文件清单与内容,逐个写入本地。

你:调用 get_executor 工具,把执行器装到本机。 agent:已获取 6 个文件 / 48,213 字节,写入 ~/.claude/skills/amazon-exec/ SKILL.md · scripts/auth.py · scripts/exec.py scripts/paginate.py · scripts/throttle.py scripts/profiles.py
路径 B完全不装

复制 request 返回里的那条 curl,填上自己的 token,直接跑。

bash
curl -sS -X GET \
  "https://sellingpartnerapi-na.amazon.com/orders/v0/orders?MarketplaceIds=ATVPDKIKX0DER" \
  -H "x-amz-access-token: $LWA_ACCESS_TOKEN" \
  -H "user-agent: my-app/1.0 (Language=Python/3.12)" \
  -H "accept: application/json"

get_executor 返回什么

json
{
  "version": "1.4.2",
  "installPaths": {
    "claude-code": "~/.claude/skills/amazon-exec/",
    "codex":       "~/.agents/skills/amazon-exec/",
    "default":     "~/.agents/skills/amazon-exec/"
  },
  "files": [
    { "path": "SKILL.md",        "content": "---\nname: amazon-exec\n..." },
    { "path": "scripts/auth.py", "content": "#!/usr/bin/env python3\n..." }
  ],
  "sha256": "a3f1…",
  "totalBytes": 48213,
  "postInstall": "安装完成后请重启 agent 会话,Skill 在启动时扫描才会生效。"
}
为什么返回内容而不是一个可执行 URL? curl | sh 是供应链攻击的经典形态。返回内容意味着每一个字节都对你可见、可审计、 可被客户端拦截确认——工具本身不执行任何写入,写文件是模型在你眼皮底下做的。

执行器负责的四件事

  • LWA token 刷新:access token 只有 1 小时,自动续;需要 RDT 的受限操作自动换 RDT。
  • 429 退避与重试:按 operation 在本地记账,发请求前先做令牌桶预判,主动排队而不是撞到 429 再退。
  • 自动翻页:NextToken / cursor 两种模式,--paginate n 控制最多翻几页。
  • 多店铺连接:凭证与状态按连接隔离,见多店铺连接

Agent Skills 是开放标准,但安装目录还没统一:Claude Code 用 ~/.claude/skills/,Codex 及多数其他工具用 ~/.agents/skills/。 Codex 的扫描顺序是:当前目录逐级向上到 repo 根的 .agents/skills, 然后 $HOME/.agents/skills/etc/codex/skills、内置。

多店铺连接

跨店误操作(改错店的价格、库存、广告预算)是这个产品最危险的失败模式,代价是真金白银。 所以执行器的第一条规则是:没有默认连接。

每一次执行都必须显式写 --connection <别名> 不写就拒绝执行,并列出可选连接让你挑。这一条拦下的事故比其他三条加起来都多。
$ exec.py '<request-json>' 错误:未指定连接。 可用连接: us-main SP-API NA seller A1B2C3D4E5 marketplace: US, CA eu-store SP-API EU seller A9Z8Y7X6W5 marketplace: DE, FR ads-us Ads NA profile 3311… US / seller 请加上 --connection <别名> 重试。

连接管理命令

bash
exec.py connect    --alias us-main --kind sp-api    # 走 LWA 授权,凭证存 keychain
exec.py list                                       # 列出所有连接
exec.py show       --connection us-main            # 详情(凭证脱敏)
exec.py verify     --connection us-main            # 连通性自检
exec.py disconnect --connection eu-store           # 删除连接与凭证

# 执行一个请求描述
exec.py --connection us-main --paginate 10 '<request-json>'
exec.py --connection us-main --dry-run  '<request-json>'   # 只打印最终请求,不发出

四道防线

  1. 无默认连接不指定就拒绝执行,并列出候选。
  2. 每次执行回显当前连接[connection: us-main | SP-API NA | seller A1B2C3D4E5 | ATVPDKIKX0DER] —— 模型和人都看得见。
  3. 写操作二次确认非 GET 请求默认进入确认流程,打印完整请求与目标连接,要求显式 --yes。可对特定连接预授权 --trust-writes,且控制台可见。
  4. marketplace 一致性校验请求里的 marketplaceId 若不在该连接声明的列表中,直接拒绝:A1PA6795UKMFR9 (DE) 不属于连接 us-main (US, CA)

状态在哪

每个连接的状态严格隔离在自己的子目录下,这是防止跨店串数据的第一道结构性保障。

text
~/.amazon-mcp/
├── profiles.json          连接元数据(明文,只有别名 / region / profileId / marketplaces)
├── credentials.enc        AES-256-GCM 密文,密钥在 OS keychain
├── state/
│   ├── us-main/           cursor.json · quota.json · seen.db
│   ├── eu-store/
│   └── ads-us/
├── cache/tokens.json      仅 access token(1 小时),加密,可随时丢弃
└── logs/exec.log          脱敏后的执行日志

服务端不需要知道这些:request 是纯函数,区域 / marketplace / profileId 全部由执行器在本地填充。 我们不知道你有几个店、店在哪、卖什么。

认证与密钥

先分清两套完全无关的凭证:服务凭证用来访问我们的 MCP(我们签发); Amazon 凭证用来访问 Amazon API(Amazon 签发,存在你本地,我们永不接触)。 这一节只讲前者。

默认不需要任何凭证。匿名调用按 IP 给免费额度。下面讲的是注册之后, 想把调用记到自己账号下(看用量、更高额度、团队共用)时怎么带凭证。
最省事的一条路:让 agent 自己去绑。 在 Codex / Claude Code 里直接说「调用 link_account」, 它会给出一个链接;用手机打开、微信扫一下码,agent 就会自动取回密钥并写进配置—— 全程不用复制粘贴任何一串字符。
OAuth 2.1(交互式)Personal Access Token(CI / 容器)
获取方式客户端自动弹浏览器授权,点一次同意控制台生成,复制粘贴
适用场景交互式 agentCI、headless、容器
生命周期access token 短期 + refresh长期,可设过期
吊销控制台一键控制台一键
作用域spapi:read / ads:read,一次同意授予两个可选作用域

用 PAT 直接调

http
POST https://mcp.sp-api.net/mcp/sp-api
Authorization: Bearer sk_live_xxx
Content-Type: application/json
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: spapi_op

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"spapi_op","arguments":{"ref":"orders-v0:getOrders"}}}
  • 一台机器 / 一条流水线用一把,出事时可以精确吊销,不影响其他环境。
  • 不要提交进代码仓库,也不要贴进对话记录——真实威胁不是「恶意 AI」,而是凭证意外进入模型上下文。
  • 定期看「最后使用」与「来源 IP」,长期不用的直接吊销。

额度与限制

计价单位是 MCP 调用次数:一次 tools/call 记 1 次, 无论返回的是 400 字节还是 8KB。两个 endpoint 共享同一个额度池。

超额是渐进的,不会突然断

用量行为
< 80%正常返回,用量随结果的 _meta 回显,不打扰主流程
≥ 80%提醒 _meta 标记 warning,控制台与邮件提醒
≥ 95%追加警告 结果末尾追加一行文字警告,模型能直接看到
≥ 100%宽限 进入 10% 宽限额度,继续服务,但每次都警告
≥ 110%停止 返回 isError: true,文案里明确写「请勿重试」
  • 自动去重:60 秒内同一租户、同一工具、同一组参数的重复调用只计 1 次。agent 重试非常常见,重复扣费不合理。
  • 字节不是计价单位,只是防批量导出的软锁:单次响应硬上限 32KB,月度字节配额 = 调用配额 × 8KB。正常使用平均约 3KB/次。
  • 突发保护独立于月度额度(按档位 30–500 次 / 10 秒),防的是失控 agent 的死循环,触发后数秒自动恢复。

配额用尽是业务状态而非协议错误,所以不返回 HTTP 429(客户端会自动重试)、 也不返回 JSON-RPC error(模型可能读不到内容),而是返回一条模型看得懂的工具结果。 完整档位见定价页

常见错误排查

下面这些都不是猜的,是规范里查得到的确定答案。遇到问题先对照这张表。

症状最可能的原因怎么修
工具没出现 agent 会话没重启,或配置写错了文件 重启会话。Claude Code 可用 claude mcp list 确认状态是 connected。
401 调我们的 MCP 带了已吊销 / 过期的 PAT。不带任何凭证反而是可以的 控制台 · 密钥确认状态,必要时新建一把;或者干脆去掉 Authorization 头用匿名额度。
401 调 Ads API 两套鉴权头混用——这是 Ads 401 的头号来源 传统体系:Amazon-Advertising-API-ClientId + Amazon-Advertising-API-Scope(profileId); 新版 v1:Amazon-Ads-ClientId + Amazon-Ads-AccountId不可混用。准确字符串用 ads_show <operationId> 取,别从相邻端点复制。
401 头名看着没错 Amazon-Ads-Account-ID(多一个连字符,4 个 operation 在用)与 Amazon-Ads-AccountId两个不同的头 ads_show 返回的原文照抄。(ClientIDClientId 只是大小写差异,HTTP 视为同一个头,无害。)
403 SP-API 应用未被授权该 operation 所属的 role,或 access token 过期(1 小时) 检查开发者中心里应用申请的 role;access token 过期请刷新——执行器会自动做。
403 缺 RDT 涉及 PII 的受限操作需要 Restricted Data Token RDT 放在同一个 x-amz-access-token 头里(不是另开一个头),同样 1 小时有效。请求描述里的 auth.rdtRequired 会标出来。
429 频繁被限流 循环调用了低限流接口。getOrders 只有 0.0167 req/s(约每分钟 1 次) spapi_oprateLimit;低于 0.05 req/s 的接口不要循环,改用 Reports API。执行器会本地记账、主动排队。
415 Ads 请求 Content-Type / Accept 写成了 application/json Ads 大量接口用带版本的厂商媒体类型,如 application/vnd.spCampaign.v3+json。以 ads_show 返回的为准。
400 缺必填参数 规范里的 required 项没给 看请求描述里的 validation.missing——它在发请求之前就告诉你缺什么。
404 规范里找不到端点 Amazon 公开的规范目录并不完整 ads_gap:有 80 个端点 Amazon 自己在调、却没有任何公开 OpenAPI 规范(最大一块是 AMC)。规范里没有,不等于不存在。
deprecated 用了已废弃的 operation 而不自知 spapi_op 会返回 deprecated: truesuccessor。模型看到必须说出来。
400 HeaderMismatch 路由头与 body 不一致(-32020 Mcp-Method 必须等于 body 的 methodMcp-Name 必须等于 params.nametools/list 不要带 Mcp-Name
额度 返回 isError 月度调用额度(含 10% 宽限)已用尽 返回文案里写明「请勿重试」,_metaretryable: false。去计费页升级或等待重置。

给 AI 读的文档 llms.txt

本页是写给人看的。给 agent 看的那份在 /llms.txt——纯 Markdown、无导航、无营销, 一页说完接入方式、工具清单与调用约定。/llm.md 是同一份内容。

最省事的用法:把地址丢给你的 agent,让它自己去读,比你转述可靠得多。

text
https://mcp.sp-api.net/llms.txt

直接打开:/llms.txt · /llm.md

协议版本

主线是 MCP 2026-07-28:无状态,没有 initialize 握手,也没有 Mcp-Session-Id。同时兼容 2025-11-25 / 2025-06-18 / 2025-03-26, 客户端按自己支持的版本发即可。

MCP-Protocol-Version / Mcp-Method / Mcp-Name 三个路由头是强制的,且必须与 body 一致,否则返回 400 与 JSON-RPC -32020 HeaderMismatch。网关据此计量与路由,不需要解析 body。 拉 tools/list 时不要带 Mcp-Name

哪些流量到我们、哪些到 Amazon

国内直连你 ↔ 我们的 MCP

服务部署在国内,直接访问即可,不需要任何代理。传输的只有规范查询与请求描述, 单次响应通常 2–8KB,对网络质量要求很低。

  • 普通 HTTPS,没有长连接、没有 WebSocket、没有 SSE 依赖
  • 无状态设计,断线重连不丢上下文
  • server/discovertools/list 可被缓存 24 小时
需你自备你 ↔ Amazon API

API 调用发生在你本地,所以需要你的机器能访问 Amazon 的接口域名。 这条链路我们完全不参与,也无法代为解决。

  • LWA 令牌:api.amazon.com
  • SP-API:sellingpartnerapi-na / -eu / -fe .amazon.com
  • Ads:advertising-api / -eu / -fe .amazon.com
常见做法:把执行器跑在能直连 Amazon 的机器上(海外轻量服务器、公司出口、 已有的 ERP 服务器),本地 agent 通过 SSH 或内网调用它。 执行器只依赖 Python 标准库,放哪台机器都能跑。 注意凭证跟着执行器走——它在哪台机器,refresh token 就在哪台机器。

延迟参考

操作典型耗时响应体积说明
search 短语11 ms5.1 KB纯服务端 CPU,命中缓存后更快
op 精确41 ms4.3 KB含 $ref 内联展开
show 单操作94 ms1.9 KB最慢的一类查询,仍在百毫秒内
Amazon API 调用0.2–3 s在你本地发生,取决于你的网络