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 分