- EBAY_READ_ONLY is enforced by regex over the tool name for any unannotated tool (src/mcp/readOnlyFilter.ts:30-35, 49-63), so it's a naming convention rather than a behavioral guarantee.
- A source read on 2026-07-25 counted 298 defineTool({ call sites; the README frames this in marketing terms rather than a hard count; an internal comment at src/mcp/toolGating.ts:17 is stale at '~187 tools'.
- EBAY_MCP_TOOLS defaults to 'all' when unset, so an unconfigured install advertises the full tool catalogue at boot (src/config/toolFamilies.ts:44-47).
- Skipping the OAuth setup wizard silently drops a deployment to the 1,000 requests/day client-credentials tier instead of the 10,000-50,000/day user-token tier.
- eBay's own first-party server, npm-public-api-mcp, is a 4-tool API passthrough with 11 stars and no marketing behind it — not a purpose-built alternative.
01 What ebay-mcp is and who ships it
For wiring eBay's Sell APIs into an AI assistant over MCP, the pick is the community-built ebay-mcp by Yosef Hayim — not because its README is trustworthy on every claim, but because it's the only actively maintained, purpose-built option, and public record and source read on 2026-09-06 shows its headline safety feature, EBAY_READ_ONLY, is enforced by a regex over tool names rather than any real check on what a handler does. Unless you need a minimal, officially-blessed passthrough with no marketing behind it — then eBay's own npm-public-api-mcp is the alternative, at the cost of purpose-built Sell API tooling.
ebay-mcp is a local MCP server, maintained by Yosef Hayim as a community project (not affiliated with eBay Inc.), that exposes eBay's Sell APIs — inventory, orders, fulfillment, marketing, payment disputes, seller analytics — as callable tools for AI assistants. The repo (github.com/YosefHayim/ebay-mcp) is MIT-licensed, and its default branch last committed on 2026-08-15. The GitHub API reported 147 stars and 61 forks on 2026-09-06.
| Server | Stars | Forks | Licence | Last commit | Tools | Open issues |
|---|---|---|---|---|---|---|
| ebay-mcp (Yosef Hayim, community) | 147 | 61 | MIT | 2026-08-15 | 298 | 4 |
| eBay/npm-public-api-mcp (first-party) | 11 | n/a† | n/a† | 2026-08-14 | 4 | n/a† |
† forks, licence and open-issue count for eBay's first-party server were not read.
That contrast is the reason this category isn't a vendor-owned SERP: eBay's own MCP server is a 4-tool API passthrough with 11 stars and no marketing behind it. It's a generic API-discovery wrapper, not purpose-built Sell API tooling, and its adoption reflects that.02 Tools it exposes
A source read on 2026-07-25 counted 298 defineTool({ call sites across src/tools/categories/*.ts — spread across categories including marketing (83), inventory (36), other (36), account (37) and communication (33). ebay-mcp's current README frames its scope in marketing terms, enumerating roughly two dozen ebay_* tools rather than stating a hard count. A separate comment left in src/mcp/toolGating.ts:17 still describes "the full ~187-tool catalogue" — a stale figure from an earlier build that the 298 count doesn't support.
Read/write status below follows the same classification the server itself uses at runtime — WRITE_NAME_PATTERN and READ_NAME_PATTERN in src/mcp/readOnlyFilter.ts:30-31 and :34-35 — applied to a sample of the registered tool set:
| Tool | What it does | Read/write |
|---|---|---|
| ebay_get_inventory_items | List inventory items | Read |
| ebay_get_inventory_item | Fetch a single inventory item | Read |
| ebay_get_inventory_locations | List seller inventory locations | Read |
| ebay_get_orders | List orders | Read |
| ebay_get_order | Fetch a single order | Read |
| ebay_get_offers | List offers | Read |
| ebay_get_offer | Fetch a single offer | Read |
| ebay_create_offer | Create a new offer | Write |
| ebay_update_offer | Modify an existing offer | Write |
| ebay_get_shipping_fulfillments | List shipping fulfillments | Read |
| ebay_get_payment_dispute_summaries | List payment dispute summaries | Read |
| ebay_get_payment_dispute | Fetch a single payment dispute | Read |
| ebay_get_campaigns | List marketing campaigns | Read |
| ebay_create_campaign | Create a marketing campaign | Write |
| ebay_get_seller_standards_profile | Fetch seller standards profile | Read |
| ebay_get_traffic_report | Fetch seller traffic report | Read |
| ebay_get_customer_service_metric | Fetch customer service metrics | Read |
| ebay_get_rate_limits | Fetch application rate limits | Read |
| ebay_get_user_rate_limits | Fetch user-token rate limits | Read |
| ebay_get_oauth_url | Generate an OAuth authorization URL | Read |
| list_ebay_tools | List currently enabled tool families | Read |
| enable_ebay_tools | Enable a tool family at runtime | Write |
| disable_ebay_tools | Disable a tool family at runtime | Write |
03 Install and auth
Transport is stdio by default. Install and setup (the published npm package is ebay-mcp, at versions 1.14.1/1.15.0):
npx ebay-mcp
npm run setupnpm run setup runs the OAuth wizard. Skip it, and the server falls back to client-credentials auth. Auth is eBay OAuth2 with a user token — the record states this gives "10,000-50,000 requests/day" — with automatic fallback to client credentials at 1,000 requests/day.
Tool availability at startup is controlled by EBAY_MCP_TOOLS, which spans 14 family keys defined in src/config/toolFamilies.ts:22-36: connector, token-management, account, inventory, fulfillment, marketing, analytics, metadata, taxonomy, communication, browse, other, developer, and trading. Left unset, it defaults to all — every one of the 298 tools advertised at boot (src/config/toolFamilies.ts:44-47) — with dynamic and static gating modes available as opt-in alternatives, the dynamic handshake documented at src/mcp/toolGating.ts:33-36.
04 What the source shows
The README documents EBAY_READ_ONLY as a read-only deployment mode, but it doesn't describe how that mode is enforced. Public record and source read on 2026-09-06 shows the mechanism: src/mcp/readOnlyFilter.ts:49-63 checks a tool's explicit readOnlyHint/destructiveHint annotation first, and only falls back to matching the tool's name against two hard-coded regexes when that annotation is missing — WRITE_NAME_PATTERN at src/mcp/readOnlyFilter.ts:30-31 and READ_NAME_PATTERN at :34-35. The file's own header concedes this fallback exists because many inventory and fulfillment endpoints ship without annotations at all.
That means on a 298-tool catalogue where annotation coverage is admittedly incomplete, "read-only mode" is closer to a naming convention than a behavioral guarantee: any unannotated tool whose name happens to match get|list|find|search|fetch|check|read|view|describe|status|health is admitted under EBAY_READ_ONLY, whatever its handler actually does.
Two other gaps sit in the same files. First, the tool count the code registers has drifted past the code's own internal documentation — src/mcp/toolGating.ts:17 still refers to "the full ~187-tool catalogue" against the 298 defineTool({ sites actually present. Second, because EBAY_MCP_TOOLS defaults to all when unset (src/config/toolFamilies.ts:44-47), an unconfigured deployment boots with the entire tool surface advertised at handshake — the narrower dynamic and static modes only apply if someone deliberately sets them.
05 Quirks, gaps and the honest verdict
- Read-only isn't enforced behaviorally —
EBAY_READ_ONLYgates by tool name regex with an annotation-first override, not by inspecting what the handler does (src/mcp/readOnlyFilter.ts:30-35, 49-63). Treat it as a convenience filter, not a compliance boundary. - Skipping OAuth setup silently caps throughput — running without the wizard falls back to client-credentials auth at 1,000 requests/day instead of the 10,000-50,000 a user token gets.
- Stale internal documentation —
toolGating.ts:17still cites "~187" tools; the actual registered count is 298 as of the 2026-07-25 source read, while the README frames its scope in marketing terms rather than stating a hard number. - No official affiliation — the repo carries an explicit disclaimer that it's unofficial and unaffiliated with eBay Inc., and points to eBay's API License Agreement for data-handling obligations, which matters if a client asks who's liable.
The honest verdict: use yosefhayim/ebay-mcp for building or prototyping eBay Sell API integrations behind full OAuth, not as a trusted read-only or compliance boundary — EBAY_READ_ONLY is a tool-name regex, not an enforced behavioral guarantee. eBay's own npm-public-api-mcp remains the fallback only if you want a minimal, first-party passthrough and don't need purpose-built Sell API tools.
07 Frequently asked questions
- Does EBAY_READ_ONLY actually prevent write operations?
- Not reliably. It's enforced by matching tool names against hard-coded regexes when a tool lacks an explicit annotation (src/mcp/readOnlyFilter.ts:30-35, 49-63), so an unannotated write-capable tool whose name matches the read pattern can still be admitted.
- How many tools does ebay-mcp actually register?
- A source read on 2026-07-25 counted 298 defineTool({ call sites across src/tools/categories/*.ts. The README enumerates roughly two dozen ebay_* tools rather than stating a hard count; an internal comment at src/mcp/toolGating.ts:17 still says '~187', which is stale.
- What happens if I don't run the OAuth setup wizard?
- The server falls back to client-credentials auth, capping throughput at roughly 1,000 requests/day instead of the 10,000-50,000/day available with a user OAuth token.
- Is there an official eBay MCP server instead?
- Yes, eBay/npm-public-api-mcp, but it's a 4-tool API passthrough with 11 stars and no marketing behind it, versus ebay-mcp's 147 stars as of 2026-09-06.
- What transport does ebay-mcp use?
- stdio by default.