eBay Browse

io.github.cunicopia-dev由 GitHub 账号 cunicopia-dev 发布v0.1.0更新于 Oct 27, 2026

eBay Browse API MCP server — buy-side listing search and price intelligence.

概览

AI 生成的概览

本地 MCP 服务器,封装 eBay Browse API,让助手搜索实时商品、获取单件详情,并按成色汇总价格区间。

可以做什么
  • 搜索 eBay 商品,支持排序与筛选,返回商品 ID、标题、价格、成色、卖家与商品链接
  • 按商品 ID 获取单件商品的完整详情
  • 针对查询生成汇总价格概览:数量、最低价、中位数、最高价,按成色拆分,附带最便宜的商品,并可按标题关键词排除
  • 查看当前生效的环境与密钥集,凭据会做掩码显示
适用场景
适合让助手回答某类商品在 eBay 上目前的价格水平、比较不同成色的要价,或查找具体商品。它面向买家做行情调研,不涉及卖家或订单管理。
运行要求
以本地 Python 包形式运行(Python 3.12 及以上),通过 stdio 启动,例如使用 uvx。需要一个免费的 eBay 开发者应用密钥集:生产环境用环境变量 EBAY_PRD_APP_ID 与 EBAY_PRD_CERT_ID,沙盒环境用 EBAY_SBX_APP_ID 与 EBAY_SBX_CERT_ID,也可写入本地配置文件。EBAY_ENV 选择 production(默认)或 sandbox。需要访问 eBay 的网络连接。
安装前请注意
需要 eBay 应用凭据(App ID 与 Cert ID),应放在环境变量或权限受限的配置文件中,不要写进共享配置。查询与商品请求会发送到 eBay 的 API。价格是当前在售要价而非成交价,不能当作实际成交记录。默认环境为生产环境,运行前请确认 EBAY_ENV。

安装

在 SourceWeft 中

  1. 打开 控制台中的 eBay Browse,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

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

其他 MCP 客户端

参照 仓库 中的启动说明。

README

ebay-mcp

[Python] [License: MIT] [MCP] [eBay Browse API] [tests: passing]

Give an AI agent real, live market prices — straight from the largest secondhand marketplace on the internet.

eBay is a continuously-updating ledger of what physical things actually cost right now. This wraps its Browse API as an MCP server with three tools, so an agent can search listings, pull a single item, and — the useful one — get an aggregated price landscape for anything: min, median, max, broken down by condition.

Python 3.12+ · MIT · MCP server · app-token auth, no user login

Setup is one free eBay app keyset — no user login, no OAuth consent screen to click through. Point an agent at it and ask "what does an RTX 5080 actually go for?" — one call back comes a grounded answer, split by condition, with the cheapest listings attached.


Contents


The three tools

ToolWhat it does
ebay_price_checkAggregated price landscape for a query — count, min/median/max, a breakdown by condition, and the cheapest listings. The headline tool.
ebay_searchListing search with sorting and filtering — returns clean {itemId, title, price, condition, seller, itemWebUrl} rows.
ebay_get_itemFull detail for one item by ID.
jsonc
// ebay_price_check  ·  query: "RTX 5080", exclude: ["laptop", "notebook"]{  "count": 47, "currency": "USD",  "min": 899, "median": 1099, "max": 2200,  "by_condition": {    "New":  { "count": 18, "min": 1099, "median": 1199, "max": 1634 },    "Used": { "count": 21, "min": 899,  "median": 1050, "max": 1499 }  },  "cheapest": [ { "price": 899, "condition": "Used", "title": "…", "itemWebUrl": "…" } ]}

Architecture: one client, three tools

Every tool flows through a single EbayBrowseClient, which owns the token and talks to eBay. There's one place credentials are read, one place a token is cached, one place HTTP happens — nothing to drift.

mermaid
flowchart LR    Agent(["AI agent / Claude"])    subgraph server["ebay-mcp · stdio server"]        Tools["ebay_search<br/>ebay_get_item<br/>ebay_price_check"]        Client["EbayBrowseClient"]        Cache[("OAuth token<br/>in-memory, auto-refresh")]    end    Cfg["~/.ebay-mcp.toml<br/>or env vars"]    eBay["eBay Browse API"]
    Agent -->|"MCP tool call"| Tools    Tools -->|"search / get_item"| Client    Client <-->|"reuse or mint token"| Cache    Client -->|"Bearer token + query"| eBay    eBay -->|"listings JSON"| Client    Cfg -.->|"keyset + active env"| Client

The server is async; the client is plain synchronous requests, run in a thread (asyncio.to_thread) so a slow eBay call never blocks the event loop. ebay_price_check is the one tool that does more than pass through — it runs a search and then aggregates the result (see below).


Authentication: client-credentials, cached

eBay's Browse API uses an application token (the OAuth client-credentials grant) — no user is involved. The client mints one on first use, caches it in memory, and silently refreshes when it's about to expire. You never think about it.

mermaid
sequenceDiagram    participant T as Tool call    participant C as EbayBrowseClient    participant O as eBay OAuth    participant B as Browse API
    T->>C: search("RTX 5080")    alt token missing or expired        C->>O: POST /identity/v1/oauth2/token<br/>Basic(app_id:cert_id), grant=client_credentials        O-->>C: access_token + expires_in        Note over C: cache until (expires_in − 60s)    end    C->>B: GET /item_summary/search<br/>Authorization: Bearer …    B-->>C: listings JSON    C-->>T: parsed results

The 60-second buffer means a token is treated as expired slightly early, so a call never races a token that dies mid-flight. Tokens live ~2 hours; in practice one fetch covers a long session.


ebay_price_check: how the landscape is built

The other two tools are thin wrappers. This one is the reason the project exists: it turns a pile of raw listings into a number you can reason about.

mermaid
flowchart LR    Q["query<br/>+ exclude[]"] --> S["search<br/>(up to 50 listings)"]    S --> F["drop excluded titles<br/>+ unpriced listings"]    F --> G["group by condition"]    G --> A["aggregate<br/>min · median · max"]    G --> H["cheapest N<br/>(the tail)"]    A --> R(["{ count, min, median, max,<br/>by_condition, cheapest }"])    H --> R

exclude is what makes the number honest — a search for "RTX 5080" is full of laptops and prebuilt PCs, and exclude: ["laptop", "notebook", "prebuilt"] strips them so the median reflects the actual card. The by_condition split matters just as much: a "median" that blends new-in-box with used-and-abused is noise; split by condition and each tier tells the truth.

One honest limitation worth knowing: the Browse API returns active asking prices, not completed sales. Treat the floor as "best currently advertised," not "what it sold for."


Install

bash
git clone https://github.com/cunicopia-dev/ebay-mcpcd ebay-mcppython3.12 -m venv .venv && source .venv/bin/activatepip install -e .

You need a (free) eBay developer application keyset — see docs/SETUP.md for the five-minute walkthrough. Then wire it into your MCP client:

json
{  "mcpServers": {    "ebay": { "command": "/path/to/ebay-mcp/.venv/bin/ebay-mcp" }  }}

Configuration

Credentials come from environment variables (highest priority) or a ~/.ebay-mcp.toml file. The active env selects the keyset and the API base URL together — so production creds can never accidentally point at the sandbox, or vice versa.

mermaid
flowchart TD    Start(["load_config()"]) --> Env{"EBAY_ENV /<br/>EBAY_*_APP_ID<br/>in environment?"}    Env -->|"set"| UseEnv["take keyset<br/>from env vars"]    Env -->|"unset"| Toml{"~/.ebay-mcp.toml<br/>present?"}    Toml -->|"yes"| UseToml["take keyset<br/>from TOML"]    Toml -->|"no"| Default["default env = production<br/>(error if creds missing)"]    UseEnv --> Pick["env → keyset + base URL<br/>(locked together)"]    UseToml --> Pick    Default --> Pick
toml
# ~/.ebay-mcp.toml   (chmod 600)env = "production"
[production]app_id  = "YourApp-PRD-..."cert_id = "PRD-..."
[sandbox]app_id  = "YourApp-SBX-..."cert_id = "SBX-..."

Check what's active any time — credentials are masked in the output:

bash
ebay-mcp-config# env:      production# app_id:   Keit****87dd# cert_id:  PRD-****0914# api_base: https://api.ebay.com# OK — configuration is valid.

Sandbox vs. production

Flip env between sandbox and production to switch environments — same code, different endpoints and keyset. The sandbox is good for proving the auth flow wires up; its inventory is sparse and seeded, so for real prices you want a production keyset.


Project layout

src/ebay_mcp/  config.py    # env + TOML loader; ebay-mcp-config CLI  browse.py    # EbayBrowseClient — OAuth cache + search / get_item  server.py    # MCP server: list_tools / call_tool / maintests/         # config precedence, aggregation, tool listing (no network)docs/SETUP.md  # getting an eBay keyset

License

MIT

来源:README.md,提交 e2a4556

工具

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

版本历史

1
  1. v0.1.0最新Sep 16, 2026

评分

已满足适用检查项的 50%

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

  • 近 30 天内可连通25 分

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

  • 已声明认证方式10 分

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

  • 已列出工具15 分

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

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