Sam's Club Sponsored Ads APIs (deprecated)

io.github.alyiox由 GitHub 账号 alyiox 发布v0.1.1更新于 Oct 25, 2026

Deprecated; use io.github.alyiox/mcp-walmart-ads.

已验证STDIO仅桌面开发者工具商业与电商

概览

AI 生成的概览

已弃用的本地 MCP 服务器,用于 Walmart Connect、Walmart Marketplace 和 Sam's Club 广告 API,已被 mcp-walmart-ads 取代。

可以做什么
发现端点:在内置的 Walmart 与 Sam's Club OpenAPI 规范中按查询词、api、平台、标签或 HTTP 方法列出并筛选操作,并查看单个操作及其 schema。调用端点:对已配置平台执行带认证的请求,签名、获取令牌和重试由服务器处理,也支持原始 method 与 path 路由。下载文件:从需认证的端点获取报表、标签和快照,写入指定路径或缓存。读取资源:查看已加载的平台、其 API、主机与广告主,以及被截断响应的完整内容和可复现的 cURL。
适用场景
仅当你已依赖此包时使用;注册表描述已将其标记为弃用并指向后继服务器。新部署应改用替代服务器。
运行要求
本地 Python 3.13+ 进程,通常用 uvx 运行。需要在文档所述的用户配置路径放置 config.json,启动时只读取一次,修改后需重启。各平台凭据:广告平台需 consumer ID、RSA 私钥和 bearer token;Marketplace 需 client ID、secret 和广告主 id。无凭据也可进行端点发现。
安装前请注意
配置文件包含敏感凭据:RSA 私钥路径、bearer token 和 OAuth client secret,请妥善保护该文件和私钥。调用与下载工具会发出带认证的请求,可能在 Walmart 和 Sam's Club 平台上创建、修改或删除数据,Marketplace 的 feed 上传还会发送本地文件。响应与 cURL 资源会缓存在内存和磁盘中。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Sam's Club Sponsored Ads APIs (deprecated),将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Walmart & Sam's Club APIs

[CI] [PyPI] [Python 3.13+] [License: MIT]

MCP server for three Walmart Inc. API families, behind one tool surface:

PlatformAPIsAuth
walmart:ads — Walmart ConnectSponsored Products, DisplayRSA-SHA256 signature + bearer token
walmart:marketplace — Walmart Marketplace28 domains (orders, items, feeds, reports, …)OAuth2 client_credentials
samsclub:ads — Sam's ClubSponsored ProductsRSA-SHA256 signature + bearer token

Four tools over 31 apis and 424 operations — discovery, a generic proxy, and a downloader. An agent finds endpoints in the bundled OpenAPI specs and calls them; the server signs, acquires tokens, and builds headers.

walmart:ads:sponsored-products:SBAProfileUpdateV2└─ retailer ─┘└ line ┘└─── api name ───┘└── operationId ──┘   └────────── platform ─────────┘  credentials attach here

An operation id alone resolves to a host and an auth model. A matching <line>:<name> suffix means the same surface for another retailer — 13 shared operation ids of 90.

Requirements

  • Python 3.13+
  • Credentials for whichever platforms you use. Configure only those — an absent platform is simply unconfigured, and discovery works with no credentials at all.
    • Walmart Connect / Sam's Club — consumer ID, RSA key pair, bearer token
    • Walmart Marketplace — client ID + secret, and the advertiser (seller profile) ids they serve

Quick start

Set up your config (see Configuration), then run the server:

bash
# Run directly with uvx (no clone needed)npx -y @modelcontextprotocol/inspector@latest uvx mcp-walmart-ads
bash
# Or run from sourcegit clone https://github.com/alyiox/mcp-walmart-ads.gitcd mcp-walmart-adsuv syncnpx -y @modelcontextprotocol/inspector@latest uv run mcp-walmart-ads

Configuration

config.json MUST live at ~/.config/mcp-walmart-ads/config.json. The server reads it once at startup, so a corrected file REQUIRES a restart.

Windows: ~ maps to %USERPROFILE% (typically C:\Users\<you>), making the full path %USERPROFILE%\.config\mcp-walmart-ads\config.json.

Create the directory and copy the example:

bash
# Unix-like (macOS, Linux, WSL, …)mkdir -p ~/.config/mcp-walmart-ads/keys/walmart-adscp config.example.json ~/.config/mcp-walmart-ads/config.json
powershell
# Windows (PowerShell)New-Item -ItemType Directory -Force "$env:USERPROFILE\.config\mcp-walmart-ads\keys\walmart-ads"Copy-Item config.example.json "$env:USERPROFILE\.config\mcp-walmart-ads\config.json"

Shape

platforms.<platform>.regions.<region>.<environment> = <auth block>

<platform> is the two-segment prefix an api id starts with, so a config key is literally the value you pass as the platform tool parameter — nothing to translate.

The auth block's shape follows the platform's auth model. There is exactly one shape per platform, so no discriminator field is needed.

Signature platforms (walmart:ads, samsclub:ads):

json
{  "platforms": {    "walmart:ads": {      "regions": {        "us": {          "production": {            "consumer_id": "your-consumer-id",            "private_key": "./keys/walmart-ads/us-prod.pem",            "private_key_version": "1",            "bearer_token": "your-bearer-token",            "base_urls": {              "sponsored-products": "https://developer.api.walmart.com/api-proxy/service/WPA/Api/v1",              "display": "https://developer.api.walmart.com/api-proxy/service/display/api/v1"            }          }        }      }    }  }}
FieldNotes
consumer_idPartner Network consumer ID
private_keyPath to the RSA private key (PEM). Relative paths resolve against the config directory
private_key_versionKey version string (default "1")
bearer_tokenOAuth bearer token
base_urls.<api>One per api in the platform's discovery surface. Keys MAY be bare (sponsored-products) or fully qualified (walmart:ads:sponsored-products); extra keys are allowed for the auxiliary specs reached by raw method+path

Environment names are free-form here — Walmart may issue a tenant only production, or production and staging.

OAuth2 platform (walmart:marketplace):

json
{  "platforms": {    "walmart:marketplace": {      "regions": {        "us": {          "production": {            "credentials": [              {                "client_id": "your-client-id",                "client_secret": "your-client-secret",                "advertisers": [                  { "id": 7060158, "partner_id": "10001234" },                  { "id": 7060159 }                ]              }            ]          }        }      }    }  }}

environment MUST be production or sandbox; base URLs are fixed by the server and absent from the file. Advertiser ids nest under the credential that serves them, so a secret appears exactly once and a dangling advertiser reference is structurally impossible. partner_id is per-seller because two payments operations require it as WM_PARTNER_ID; an all-zero value reads as absent, since that is what a generated config writes for a seller without one, and scripts/backfill_partner_ids.py fills the gaps from Walmart.

Regions are a namespace, not a route — every walmart:marketplace region reaches the same hosts. The level exists because advertiser ids are unique only within a region.

Splitting the config

A populated walmart:marketplace block runs to tens of kilobytes of credentials, 88% of the file here, and a stray comma while editing it takes down every platform: a parse failure precedes per-platform validation. Platforms MAY therefore live in drop-in files under config.d/, merged over the base:

~/.config/mcp-walmart-ads/├── config.json                  # server-wide settings, and any platforms you like├── config.d/│   ├── walmart-marketplace.json # only a "platforms" object│   └── samsclub-ads.json└── keys/
  • A drop-in MUST declare only platforms; server-wide settings stay in config.json.
  • A platform declared in two files is an error naming both — never silent precedence.
  • Only *.json directly in config.d/ is read, so .bak and editor swap files are ignored.
  • A file that fails to parse costs only its own platforms; the rest keep working.
  • Relative private_key paths resolve against config.json's directory either way, so moving a platform into config.d/ needs no path edits.
  • No config.d/ directory means no change in behavior.

A malformed block for one platform MUST NOT stop the others loading. Read wmt://platforms to see which loaded and what regions and environments they declare: one that failed has no regions, and reading one of its environments returns the loader's own message — which file, which fields, and that a fix needs a restart.

Top-level options

FieldDefaultNotes
response_cache_ttl3600Seconds a truncated body or download stays readable at its resource URI
truncate_threshold2048Response bytes returned inline before truncating to a preview
spec_refresh{"auto": true, "interval": 7}Background spec refresh. auto turns the sweep on or off; interval is days between sweeps, and MAY be fractional

Market → tenant (wap-tenant-id)

Pass tenant on call_endpoint and download_file for non-US walmart:ads markets (WMT_CA, WMT_MX, WBD_OD, …). Omit it for US and for walmart:marketplace.

Tools

list_endpoints

List operations across every api, with optional filters.

ParameterNotes
queryCase-insensitive substring on operation id, path, or summary
apiLimit to one api, e.g. walmart:marketplace:order-management
platformLimit to one platform — walmart:ads, walmart:marketplace, samsclub:ads (schema enum)
tagFilter by OpenAPI tag
methodFilter by HTTP verb — GET, POST, PUT, PATCH, DELETE (schema enum)

Returned operation ids are qualified (api:operationId) and pass straight to describe_endpoint or call_endpoint.

describe_endpoint

One operation plus every components.schemas entry reachable from it, so a request body can be built without the full spec. Server-managed auth and QoS headers are omitted.

ParameterNotes
operation_idQualified (api:operationId), or bare when unambiguous
apiApi to resolve a bare id in, e.g. walmart:ads:sponsored-products

call_endpoint

Execute an authenticated request against any configured platform. Signing, token acquisition with per-credential caching and single-flight refresh, and one retry after a 401 all happen server-side.

ParameterNotes
region, environmentRequired. Src: config
operation_idQualified or bare. Resolves api, platform, method, path, and required headers
apiRequired with raw method + path; otherwise inferred from operation_id. Accepts the two auxiliary walmart:ads specs
method, pathRaw route, reaching alpha/beta/unpublished endpoints absent from the specs
path_paramsValues for {placeholders} in the path
params, bodyQuery string and JSON body
file_pathSend the file as multipart/form-data — Marketplace feed uploads. Pair with the feedType query parameter
advertiser_idMUST be given on walmart:marketplace, where it selects the credential. Optional on the ads platforms, where it is sent as X-Advertiser-ID
tenantWAP tenant for non-US walmart:ads regions

A response larger than truncate_threshold is previewed inline, with the full body at wmt://responses/{request_id} and a reproducible cURL at wmt://curl/{request_id} — bearer tokens, access tokens, and signatures replaced with placeholders.

download_file

Download a report, label, or snapshot from an authenticated endpoint. Give a full url (the details URL from a display snapshot poll, say), or operation_id, or api with method + path. platform is required only for a bare url.

With dest_path the bytes are written there. Without it they are gunzipped when gzipped and cached, and the result carries cached_at — a binary payload with no dest_path asks for one instead. Redirects are followed, keeping auth headers on a relative or same-host Location and dropping credentials cross-host; the result includes urls, the hop path.

Specs

33 OpenAPI documents ship in the wheel. A refresh writes updated copies to ~/.cache/mcp-walmart-ads/specs/, which outranks the bundle on read. The bundle is never written at runtime, so it stays the floor a damaged or missing cache falls back to.

Where they come from

Walmart publishes no OpenAPI files, but each ReadMe reference page hydrates its HTML with the registry UUIDs of its documents, and https://dash.readme.com/api/v1/api-registry/<uuid> serves the full spec unauthenticated. That covers Walmart Connect and all 28 Marketplace domains. Sam's Club publishes neither, so its spec is hand-authored from the developer docs: scripts/build_samsclub_spec.py regenerates a candidate from those docs, and the scheduled spec drift workflow opens a PR when they change, as a human review gate. The candidate is never shipped and never loaded at runtime.

Documents are stored verbatim as upstream served them, so a refresh diff shows exactly what changed. Oversized inline examples and x-readme metadata are stripped on load rather than on disk, which keeps that reduction retunable without re-downloading anything.

Keeping them current

Specs refresh in the background: once at startup, then every spec_refresh.interval days (7 by default). Set auto to false to stop the sweep — the interval is remembered for whenever you turn it back on, and the manual refresh still works.

To refresh now, having hit an endpoint the bundled spec does not have:

bash
# Installed with uvx (no clone)uvx mcp-walmart-ads --refresh
# Or from a source checkoutuv run mcp-walmart-ads --refresh

Either form sweeps every spec regardless of the interval and writes the same user cache, printing one row per document: written, unchanged, or error.

There is deliberately no tool for this. A stale spec is indistinguishable from a current one from inside a session — it simply lacks an endpoint — so an agent asked to decide would either never refresh or refresh superstitiously after an unrelated failure. The trigger belongs outside the session.

A document MUST yield at least one operation before it is installed, so an upstream answering 200 with an error body cannot poison the cache, and a byte-identical document is left alone. A cached file that will not load is discarded and the read falls back to the bundle. Servers coordinate through spec-state.json at the cache root, which records when each spec was last tried and holds a lease so one process sweeps at a time — every client session runs its own server process, and without it each would re-download all 33.

Rebuilding the bundle

A maintainer step, and not the same thing as --refresh: that updates your cache, this updates the copies that ship in the wheel.

bash
# Registry-sourced specs only, by defaultuv run python scripts/fetch_specs.pyuv run python scripts/fetch_specs.py walmart:ads:sponsored-products walmart:marketplace:order-management
# Regenerate the Sam's Club candidate spec for reviewuv run --group spec-build python scripts/build_samsclub_spec.py

MCP resources

Resource URIDescription
wmt://platformsEvery platform, its auth model, and the regions and environments it declares
wmt://platforms/{platform}/apisThat platform's api ids
wmt://platforms/{platform}/apis/{name}One api: title, version, operation count, and its tags with a count each — the legal list_endpoints(tag=…) values
wmt://platforms/walmart:marketplace/regions/{region}/{environment}/advertisersAdvertiser ids mapped to their Walmart Partner ID (null when unset)
wmt://platforms/{platform}/regions/{region}/{environment}/hostsApi ids mapped to the base URL a call reaches, or * for every api whose host the server owns
wmt://responses/{request_id}Full body of a truncated response or a cached download (in memory, TTL from config)
wmt://curl/{request_id}Reproducible cURL for a previous request, credentials replaced with placeholders

MCP host examples

Cursor

Add to .cursor/mcp.json:

json
{  "mcpServers": {    "walmart": {      "command": "uvx",      "args": ["mcp-walmart-ads"]    }  }}
Claude Code

Add to your Claude Code MCP config:

json
{  "mcpServers": {    "walmart": {      "command": "uvx",      "args": ["mcp-walmart-ads"]    }  }}
Codex
toml
[mcp_servers.walmart]command = "uvx"args = ["mcp-walmart-ads"]
OpenCode
json
{  "$schema": "https://opencode.ai/config.json",  "mcp": {    "walmart": {      "type": "local",      "enabled": true,      "command": ["uvx", "mcp-walmart-ads"]    }  }}
GitHub Copilot
json
{  "inputs": [],  "servers": {    "walmart": {      "type": "stdio",      "command": "uvx",      "args": ["mcp-walmart-ads"]    }  }}

Development

bash
uv sync --group devuv run ruff check src/ tests/ scripts/uv run ruff format --check src/ tests/ scripts/uv run pyrightuv run pytest tests/ -v

Contributing

Issues and pull requests are welcome. Keep changes focused; ruff check, ruff format --check, pyright, and pytest MUST all pass.

License

LICENSE.

来源:README.md,提交 609b2b4

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

2
  1. v0.1.1最新Sep 22, 2026
  2. v0.1.0a7Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分