ebay-mcp 1.14.3 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +23 -15
- package/README.es.md +23 -15
- package/README.fr.md +23 -15
- package/README.ja.md +23 -15
- package/README.ko.md +23 -15
- package/README.md +108 -14
- package/README.pt-BR.md +23 -15
- package/README.ru.md +23 -15
- package/README.zh-CN.md +23 -15
- package/build/api/client.js +88 -12
- package/build/api/index.js +12 -0
- package/build/api/listing-management/items.js +4 -1
- package/build/api/listing-management/media.js +335 -0
- package/build/api/listing-management/mediaAttach.js +145 -0
- package/build/api/listing-management/offerFormat.js +111 -0
- package/build/api/listing-management/offers.js +82 -23
- package/build/api/other/browse.js +120 -0
- package/build/api/other/browseFilter.js +74 -0
- package/build/api/other/browseMappers.js +205 -0
- package/build/api/other/browseTypes.js +8 -0
- package/build/api/other/browseValidators.js +180 -0
- package/build/api/shared/auctionPricing.js +44 -0
- package/build/api/shared/request.js +2 -2
- package/build/api/trading/listingFormat.js +179 -0
- package/build/api/trading/trading.js +68 -18
- package/build/auth/credentialSession.js +2 -3
- package/build/auth/oauth.js +26 -8
- package/build/auth/scopeUtils.js +5 -0
- package/build/config/credentialFile.js +16 -0
- package/build/config/environment.js +72 -4
- package/build/config/mediaAccess.js +51 -0
- package/build/mcp/runtime.js +13 -5
- package/build/schemas/inventory-management/inventory.js +102 -26
- package/build/schemas/inventory-management/media.js +106 -0
- package/build/schemas/other/browse.js +65 -0
- package/build/skills/content.js +13 -6
- package/build/tools/categories/account.js +1 -1
- package/build/tools/categories/browse.js +15 -0
- package/build/tools/categories/index.js +2 -1
- package/build/tools/categories/inventory.js +31 -14
- package/build/tools/categories/media.js +76 -0
- package/build/tools/categories/taxonomy.js +2 -2
- package/build/tools/categories/trading.js +8 -7
- package/build/tools/schemas.js +5 -2
- package/build/tools/ui/maps.js +21 -2
- package/build/types/ebayEnums.js +29 -0
- package/build/utils/errors.js +84 -0
- package/build/utils/http.js +61 -46
- package/build/utils/localMedia.js +180 -0
- package/build/utils/objects.js +26 -0
- package/build/utils/trading/trading.js +14 -2
- package/package.json +2 -2
package/README.ru.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<strong>MCP-сервер eBay — дайте Claude, Cursor и любому ИИ-ассистенту полный доступ к Sell API eBay.
|
|
8
|
+
<strong>MCP-сервер eBay — дайте Claude, Cursor и любому ИИ-ассистенту полный доступ к Sell API eBay. 305 инструмента для инвентаря, заказов, маркетинга и аналитики, работающих локально с вашими собственными ключами.</strong>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center"><sub>Неофициальный проект с открытым исходным кодом — не связан с eBay Inc., не авторизован и не одобрен ею.</sub></p>
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
</p>
|
|
21
21
|
|
|
22
22
|
<p align="center">
|
|
23
|
-
<img src="https://img.shields.io/badge/tools-
|
|
23
|
+
<img src="https://img.shields.io/badge/tools-305-8957e5?logo=ebay&logoColor=white" alt="305 инструмента API eBay" />
|
|
24
24
|
<img src="https://img.shields.io/badge/Sell%20API%20coverage-100%25-success" alt="100% покрытие Sell API eBay" />
|
|
25
25
|
<img src="https://img.shields.io/badge/Model%20Context%20Protocol-compatible-000000" alt="совместим с Model Context Protocol" />
|
|
26
26
|
<img src="https://img.shields.io/badge/tests-1%2C000%2B%20passing-3fb950?logo=vitest&logoColor=white" alt="более 1000 пройденных тестов" />
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
|
|
48
48
|
> **Примечание:** английский [README.md](README.md) — источник истины для актуальных продуктовых формулировок (семейства инструментов, вывод API из эксплуатации, заметки о версиях). Этот перевод может отставать.
|
|
49
49
|
|
|
50
|
-
**eBay MCP** — это локальный сервер [Model Context Protocol](https://modelcontextprotocol.io), который подключает ИИ-ассистентов —Claude Desktop, Claude Code, Cursor, Cline, Windsurf, Zed, Continue.dev, Roo Code и Amazon Q— напрямую к **Sell API eBay**. Он предоставляет **
|
|
50
|
+
**eBay MCP** — это локальный сервер [Model Context Protocol](https://modelcontextprotocol.io), который подключает ИИ-ассистентов —Claude Desktop, Claude Code, Cursor, Cline, Windsurf, Zed, Continue.dev, Roo Code и Amazon Q— напрямую к **Sell API eBay**. Он предоставляет **305 инструмента**, охватывающих **100% поверхности Sell API eBay** (274 уникальных эндпоинта): управление инвентарём, обработка заказов, маркетинг продвигаемых объявлений, аналитика и инструменты разработчика. Всё работает на вашей машине через STDIO или локальный HTTP — **без облачного ретранслятора**, и ваши учётные данные eBay никогда не покидают компьютер.
|
|
51
51
|
|
|
52
52
|
> **Отказ от ответственности:** Неофициальный сторонний проект — **не связан с eBay Inc. и не одобрен ею.** Предоставляется «как есть», без гарантий. Вы сами отвечаете за соблюдение [Лицензионного соглашения API eBay](https://developer.ebay.com/join/api-license-agreement) и [требований к обработке данных](https://developer.ebay.com/api-docs/static/data-handling-update.html), за сохранность учётных данных и за соблюдение лимитов запросов. Протестируйте в песочнице перед продакшеном. См. [LICENSE](LICENSE), [SECURITY.md](SECURITY.md) и [EBAY_COMPLIANCE.md](EBAY_COMPLIANCE.md).
|
|
53
53
|
|
|
@@ -71,11 +71,11 @@
|
|
|
71
71
|
|
|
72
72
|
## Возможности
|
|
73
73
|
|
|
74
|
-
- **
|
|
74
|
+
- **305 инструмента API eBay** — 100% покрытие Sell API eBay: инвентарь, заказы, маркетинг, аналитика, метаданные, таксономия и инструменты разработчика.
|
|
75
75
|
- **9 ИИ-клиентов с автонастройкой** — Claude Desktop, Cursor, Zed, Cline, Continue.dev, Windsurf, Roo Code, Claude Code CLI и Amazon Q Developer.
|
|
76
76
|
- **Встроенный OAuth 2.0** — полное управление пользовательскими токенами с автоматическим обновлением и умным переходом от пользовательских токенов (10–50 тыс. запросов/день) к клиентским учётным данным (1 тыс. запросов/день).
|
|
77
77
|
- **Надёжность по умолчанию** — автоматический повтор с экспоненциальной задержкой при лимитах `429` и понятный, последовательный вывод ошибок.
|
|
78
|
-
- **Типобезопасность** — TypeScript от начала до конца, входные данные инструментов проверяются
|
|
78
|
+
- **Типобезопасность** — TypeScript от начала до конца, входные данные инструментов проверяются Effect, типы генерируются из OpenAPI.
|
|
79
79
|
- **Локально и приватно** — работает через STDIO или локальный HTTP; ваши учётные данные и данные никогда не покидают машину.
|
|
80
80
|
- **Песочница и продакшен** — переключайте окружение одной переменной.
|
|
81
81
|
- **Настройка одной командой** — `npm run setup` настраивает учётные данные, OAuth и ваш MCP-клиент, автоматически открывая браузер для потока OAuth.
|
|
@@ -90,10 +90,10 @@
|
|
|
90
90
|
| Интерфейс | Естественный язык через ИИ-ассистента | HTTP-запросы вручную и разбор JSON |
|
|
91
91
|
| OAuth и обновление токенов | Встроены, с автоматическим обновлением | Вы реализуете и поддерживаете сами |
|
|
92
92
|
| Обработка лимитов | Автоматический повтор с экспоненциальной задержкой | Ручная обработка `429` и задержки |
|
|
93
|
-
| Валидация входных данных | Схемы
|
|
93
|
+
| Валидация входных данных | Схемы на основе Effect + типы TypeScript на каждом инструменте | Нет — вы проверяете свои полезные данные сами |
|
|
94
94
|
| Настройка | Один мастер (`npm run setup`) | Авторизация, заголовки и маркетплейс на каждый вызов |
|
|
95
95
|
| Поддержка ИИ-клиентов | 9 клиентов с автонастройкой | Неприменимо |
|
|
96
|
-
| Покрытие API |
|
|
96
|
+
| Покрытие API | 305 инструмента на 100% Sell API, готовы к вызову | Вы строите каждый запрос по документации |
|
|
97
97
|
| Размещение | Работает локально, без облачного ретранслятора | Ваша собственная инфраструктура |
|
|
98
98
|
|
|
99
99
|
## Настройка с помощью ИИ в один клик
|
|
@@ -236,13 +236,13 @@ EBAY_MCP_UI=on # интерактивные предста
|
|
|
236
236
|
|
|
237
237
|
## Доступные инструменты
|
|
238
238
|
|
|
239
|
-
**
|
|
239
|
+
**305 инструмента**, 100% покрытие Sell API, сгруппированы по категориям. Каждая ссылка ведёт к определениям инструментов и их обработчикам в [`src/tools/categories/`](src/tools/categories/):
|
|
240
240
|
|
|
241
241
|
| Категория | Что вы можете делать |
|
|
242
242
|
| --- | --- |
|
|
243
243
|
| [Connector](src/tools/categories/connector.ts) | Инструменты search/fetch коннектора ChatGPT по каталогу eBay MCP |
|
|
244
244
|
| [Account](src/tools/categories/account.ts) | Бизнес-, отгрузочные, платёжные и возвратные политики; программы; подписки; налог с продаж |
|
|
245
|
-
| [Inventory](src/tools/categories/inventory.ts) | Товары инвентаря, предложения, локации, группы товаров, массовые операции, сопоставление SKU
|
|
245
|
+
| [Inventory](src/tools/categories/inventory.ts) | Товары инвентаря, предложения, локации, группы товаров, массовые операции, сопоставление SKU/локации, загрузка локальных фото и видео ([`media.ts`](src/tools/categories/media.ts), Media API) |
|
|
246
246
|
| [Fulfillment](src/tools/categories/fulfillment.ts) | Заказы, доставка, возвраты средств, споры, доказательства по платёжным спорам |
|
|
247
247
|
| [Marketing](src/tools/categories/marketing.ts) | Кампании продвигаемых объявлений, реклама, акции, ставки, массовые операции |
|
|
248
248
|
| [Analytics](src/tools/categories/analytics.ts) | Отчёты о трафике, стандарты продавца, метрики поддержки клиентов |
|
|
@@ -251,7 +251,7 @@ EBAY_MCP_UI=on # интерактивные предста
|
|
|
251
251
|
| [Taxonomy](src/tools/categories/taxonomy.ts) | Деревья категорий, характеристики товаров, состояния товаров |
|
|
252
252
|
| [Browse](src/tools/categories/browse.ts) | Поиск проданных/завершённых лотов (Finding API) для сравнения цен |
|
|
253
253
|
| [Other](src/tools/categories/other.ts) | Identity, VeRO, перевод и API международной доставки (инструменты Compliance сообщают о выводе eBay из эксплуатации 2026-03-30) |
|
|
254
|
-
| [Trading (устаревший XML)](src/tools/categories/trading.ts) | Создание, изменение, повторное размещение и завершение объявлений с фиксированной ценой |
|
|
254
|
+
| [Trading (устаревший XML)](src/tools/categories/trading.ts) | Создание, изменение, повторное размещение и завершение объявлений с фиксированной ценой и аукционов |
|
|
255
255
|
| [Developer](src/tools/categories/developer.ts) | Лимиты запросов, ключи подписи, регистрация клиентов |
|
|
256
256
|
| [Token Management](src/tools/categories/tokenManagement.ts) | Генерация URL OAuth и управление токенами |
|
|
257
257
|
|
|
@@ -299,7 +299,7 @@ EBAY_MCP_UI=on # интерактивные предста
|
|
|
299
299
|
|
|
300
300
|
### Что такое MCP-сервер eBay?
|
|
301
301
|
|
|
302
|
-
Локальный сервер [Model Context Protocol](https://modelcontextprotocol.io), предоставляющий **
|
|
302
|
+
Локальный сервер [Model Context Protocol](https://modelcontextprotocol.io), предоставляющий **305 инструмента**, охватывающих **100% Sell API eBay** (274 эндпоинта), ИИ-ассистентам — инвентарь, обработка заказов, маркетинг, аналитика и инструменты разработчика.
|
|
303
303
|
|
|
304
304
|
### Это официальный продукт eBay?
|
|
305
305
|
|
|
@@ -319,7 +319,7 @@ EBAY_MCP_UI=on # интерактивные предста
|
|
|
319
319
|
|
|
320
320
|
### Сколько API и инструментов eBay он охватывает?
|
|
321
321
|
|
|
322
|
-
|
|
322
|
+
305 инструмента на 274 уникальных эндпоинтах — 100% Sell API eBay.
|
|
323
323
|
|
|
324
324
|
### Это бесплатно и с открытым исходным кодом?
|
|
325
325
|
|
|
@@ -347,11 +347,19 @@ Node.js ≥ 20, бесплатный [аккаунт разработчика eB
|
|
|
347
347
|
|
|
348
348
|
### Чем это отличается от прямого вызова API eBay?
|
|
349
349
|
|
|
350
|
-
Вы взаимодействуете на естественном языке через ИИ-ассистента. Управление токенами OAuth, автоматические повторы с задержкой и типобезопасная валидация
|
|
350
|
+
Вы взаимодействуете на естественном языке через ИИ-ассистента. Управление токенами OAuth, автоматические повторы с задержкой и типобезопасная валидация на основе Effect встроены. См. [таблицу сравнения](#ebay-mcp-против-обычного-api-ebay) выше.
|
|
351
|
+
|
|
352
|
+
### Может ли он загружать мои фото и видео?
|
|
353
|
+
|
|
354
|
+
Да. `ebay_upload_images`, `ebay_upload_video` и `ebay_attach_media_to_inventory_item` читают локальные файлы (абсолютные пути или ссылки `media://`) и загружают их через Media API eBay, возвращая URL изображений EPS и идентификаторы видео для `product.imageUrls` / `product.videoIds`. Доступ к файловой системе включается явно: пока `EBAY_MCP_MEDIA_DIRS` или `EBAY_MCP_MEDIA_ROOT` не укажут каталоги, прочитать ничего нельзя. См. [Photos and videos from local files](README.md#photos-and-videos-from-local-files) (на английском).
|
|
355
|
+
|
|
356
|
+
### Поддерживает ли он аукционы?
|
|
357
|
+
|
|
358
|
+
Да, через инструменты предложений Inventory API (REST): создайте предложение с `format: "AUCTION"`, `auctionStartPrice`, необязательным `auctionReservePrice` и `listingDuration` в днях, затем опубликуйте его. См. [Auction offers](README.md#auction-offers) (на английском). Инструменты Trading API используют тот же переключатель: `ebay_create_listing` с `format: "AUCTION"` отправляет `AddItem` с `ListingType` Chinese, стартовой ставкой `StartPrice` и `ListingDuration` в днях.
|
|
351
359
|
|
|
352
360
|
### Поддерживает ли он устаревший Trading API eBay (XML)?
|
|
353
361
|
|
|
354
|
-
Да. Операции создания, изменения, повторного размещения и завершения объявлений с фиксированной ценой
|
|
362
|
+
Да. Операции создания, изменения, повторного размещения и завершения объявлений поддерживаются через инструменты Trading API — как для объявлений с фиксированной ценой (семейство `AddFixedPriceItem`, по умолчанию), так и для аукционов (`format: "AUCTION"` → `AddItem`, `ReviseItem`, `EndItem`, `RelistItem`).
|
|
355
363
|
|
|
356
364
|
### Как получить более высокие лимиты запросов?
|
|
357
365
|
|
|
@@ -359,7 +367,7 @@ Node.js ≥ 20, бесплатный [аккаунт разработчика eB
|
|
|
359
367
|
|
|
360
368
|
### На чём он построен?
|
|
361
369
|
|
|
362
|
-
TypeScript и Node.js (ESM), с официальным MCP SDK, Zod
|
|
370
|
+
TypeScript и Node.js (ESM), с официальным MCP SDK, валидацией на основе Effect с Zod-совместимым MCP-адаптером и типами, сгенерированными из OpenAPI.
|
|
363
371
|
|
|
364
372
|
### Как обновиться до последней версии?
|
|
365
373
|
|
package/README.zh-CN.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<strong>eBay MCP 服务器 — 让 Claude、Cursor 以及任意 AI 助手完全访问 eBay 的 Sell API。
|
|
8
|
+
<strong>eBay MCP 服务器 — 让 Claude、Cursor 以及任意 AI 助手完全访问 eBay 的 Sell API。305 个工具覆盖库存、订单、营销与分析,使用你自己的密钥在本地运行。</strong>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center"><sub>非官方开源项目 — 与 eBay Inc. 无任何关联,未获其授权或认可。</sub></p>
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
</p>
|
|
21
21
|
|
|
22
22
|
<p align="center">
|
|
23
|
-
<img src="https://img.shields.io/badge/tools-
|
|
23
|
+
<img src="https://img.shields.io/badge/tools-305-8957e5?logo=ebay&logoColor=white" alt="305 个 eBay API 工具" />
|
|
24
24
|
<img src="https://img.shields.io/badge/Sell%20API%20coverage-100%25-success" alt="100% 覆盖 eBay Sell API" />
|
|
25
25
|
<img src="https://img.shields.io/badge/Model%20Context%20Protocol-compatible-000000" alt="兼容 Model Context Protocol" />
|
|
26
26
|
<img src="https://img.shields.io/badge/tests-1%2C000%2B%20passing-3fb950?logo=vitest&logoColor=white" alt="超过 1000 个通过的测试" />
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
|
|
48
48
|
> **说明:** 英文 [README.md](README.md) 是最新产品说明(工具族、API 下线、版本说明)的权威来源。本翻译可能滞后。
|
|
49
49
|
|
|
50
|
-
**eBay MCP** 是一个本地的 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,可将 AI 助手 —Claude Desktop、Claude Code、Cursor、Cline、Windsurf、Zed、Continue.dev、Roo Code 和 Amazon Q— 直接连接到 **eBay 的 Sell API**。它提供 **
|
|
50
|
+
**eBay MCP** 是一个本地的 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,可将 AI 助手 —Claude Desktop、Claude Code、Cursor、Cline、Windsurf、Zed、Continue.dev、Roo Code 和 Amazon Q— 直接连接到 **eBay 的 Sell API**。它提供 **305 个工具**,覆盖 **eBay Sell API 的 100% 范围**(274 个唯一端点),涵盖库存管理、订单履行、推广刊登营销、分析和开发者工具。一切都在你的机器上通过 STDIO 或本地 HTTP 运行 — **没有云端中继**,你的 eBay 凭据永远不会离开你的电脑。
|
|
51
51
|
|
|
52
52
|
> **免责声明:** 非官方第三方项目 — **与 eBay Inc. 无关联,也未获其认可。** 按"原样"提供,不附带任何担保。你需自行负责遵守 [eBay API 许可协议](https://developer.ebay.com/join/api-license-agreement) 和 [数据处理要求](https://developer.ebay.com/api-docs/static/data-handling-update.html)、妥善保管你的凭据并遵守速率限制。在投入生产前请先在沙盒中测试。参见 [LICENSE](LICENSE)、[SECURITY.md](SECURITY.md) 和 [EBAY_COMPLIANCE.md](EBAY_COMPLIANCE.md)。
|
|
53
53
|
|
|
@@ -71,11 +71,11 @@
|
|
|
71
71
|
|
|
72
72
|
## 功能特性
|
|
73
73
|
|
|
74
|
-
- **
|
|
74
|
+
- **305 个 eBay API 工具** — 100% 覆盖 eBay Sell API,涵盖库存、订单、营销、分析、元数据、分类法和开发者工具。
|
|
75
75
|
- **自动配置 9 个 AI 客户端** — Claude Desktop、Cursor、Zed、Cline、Continue.dev、Windsurf、Roo Code、Claude Code CLI 和 Amazon Q Developer。
|
|
76
76
|
- **内置 OAuth 2.0** — 完整的用户令牌管理与自动刷新,并能从用户令牌(每天 1 万–5 万次请求)智能回退到客户端凭据(每天 1 千次请求)。
|
|
77
77
|
- **默认具备韧性** — 遇到 `429` 速率限制时自动重试并采用指数退避,错误提示清晰一致。
|
|
78
|
-
- **类型安全** — 端到端 TypeScript,使用
|
|
78
|
+
- **类型安全** — 端到端 TypeScript,使用 Effect 校验工具输入,类型由 OpenAPI 生成。
|
|
79
79
|
- **本地且私密** — 通过 STDIO 或本地 HTTP 运行;你的凭据和数据永远不会离开你的机器。
|
|
80
80
|
- **沙盒与生产** — 用一个变量即可切换环境。
|
|
81
81
|
- **一条命令完成配置** — `npm run setup` 会配置凭据、OAuth 和你的 MCP 客户端,并自动打开浏览器完成 OAuth 流程。
|
|
@@ -90,10 +90,10 @@
|
|
|
90
90
|
| 接口 | 通过 AI 助手使用自然语言 | 手写 HTTP 请求并解析 JSON |
|
|
91
91
|
| OAuth 与令牌刷新 | 内置,并自动刷新 | 由你自行实现和维护 |
|
|
92
92
|
| 速率限制处理 | 自动重试并指数退避 | 手动处理 `429` 与退避 |
|
|
93
|
-
| 输入校验 |
|
|
93
|
+
| 输入校验 | 每个工具都有基于 Effect 的模式 + TypeScript 类型 | 无 — 由你校验自己的载荷 |
|
|
94
94
|
| 配置 | 一个向导(`npm run setup`) | 每次调用都要处理认证、请求头和站点 |
|
|
95
95
|
| AI 客户端支持 | 自动配置 9 个客户端 | 不适用 |
|
|
96
|
-
| API 覆盖 |
|
|
96
|
+
| API 覆盖 | 305 个工具覆盖 100% Sell API,开箱即用 | 你需根据文档构建每个请求 |
|
|
97
97
|
| 托管 | 本地运行,无云端中继 | 你自己的基础设施 |
|
|
98
98
|
|
|
99
99
|
## AI 一键配置
|
|
@@ -236,13 +236,13 @@ EBAY_MCP_UI=on # 交互式 MCP Apps 视图(测试版)
|
|
|
236
236
|
|
|
237
237
|
## 可用工具
|
|
238
238
|
|
|
239
|
-
**
|
|
239
|
+
**305 个工具**,100% Sell API 覆盖,按类别组织。每个链接都指向 [`src/tools/categories/`](src/tools/categories/) 中的工具定义及其处理程序:
|
|
240
240
|
|
|
241
241
|
| 类别 | 你可以做什么 |
|
|
242
242
|
| --- | --- |
|
|
243
243
|
| [Connector](src/tools/categories/connector.ts) | 面向 eBay MCP 目录的 ChatGPT 连接器 search/fetch 工具 |
|
|
244
244
|
| [Account](src/tools/categories/account.ts) | 业务、履行、付款和退货政策;计划;订阅;销售税 |
|
|
245
|
-
| [Inventory](src/tools/categories/inventory.ts) | 库存商品、报价、地点、商品分组、批量操作、SKU
|
|
245
|
+
| [Inventory](src/tools/categories/inventory.ts) | 库存商品、报价、地点、商品分组、批量操作、SKU/地点映射,以及本地照片/视频上传([`media.ts`](src/tools/categories/media.ts),Media API) |
|
|
246
246
|
| [Fulfillment](src/tools/categories/fulfillment.ts) | 订单、配送、退款、纠纷、付款纠纷证据 |
|
|
247
247
|
| [Marketing](src/tools/categories/marketing.ts) | 推广刊登广告活动、广告、促销、出价、批量操作 |
|
|
248
248
|
| [Analytics](src/tools/categories/analytics.ts) | 流量报告、卖家标准、客户服务指标 |
|
|
@@ -251,7 +251,7 @@ EBAY_MCP_UI=on # 交互式 MCP Apps 视图(测试版)
|
|
|
251
251
|
| [Taxonomy](src/tools/categories/taxonomy.ts) | 类目树、商品属性、商品成色 |
|
|
252
252
|
| [Browse](src/tools/categories/browse.ts) | 已售/已完成 listing 搜索(Finding API)用于比价 |
|
|
253
253
|
| [Other](src/tools/categories/other.ts) | Identity、VeRO、翻译与国际物流支持 API(Compliance 工具会报告 eBay 于 2026-03-30 的下线) |
|
|
254
|
-
| [Trading(旧版 XML)](src/tools/categories/trading.ts) |
|
|
254
|
+
| [Trading(旧版 XML)](src/tools/categories/trading.ts) | 固定价格刊登和拍卖的创建、修改、重新刊登和结束 |
|
|
255
255
|
| [Developer](src/tools/categories/developer.ts) | 速率限制、签名密钥、客户端注册 |
|
|
256
256
|
| [Token Management](src/tools/categories/tokenManagement.ts) | OAuth URL 生成与令牌管理 |
|
|
257
257
|
|
|
@@ -299,7 +299,7 @@ EBAY_MCP_UI=on # 交互式 MCP Apps 视图(测试版)
|
|
|
299
299
|
|
|
300
300
|
### 什么是 eBay MCP 服务器?
|
|
301
301
|
|
|
302
|
-
一个本地的 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,向 AI 助手提供 **
|
|
302
|
+
一个本地的 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,向 AI 助手提供 **305 个工具**,覆盖 **eBay Sell API 的 100%**(274 个端点)—— 库存、订单履行、营销、分析和开发者工具。
|
|
303
303
|
|
|
304
304
|
### 这是 eBay 的官方产品吗?
|
|
305
305
|
|
|
@@ -319,7 +319,7 @@ EBAY_MCP_UI=on # 交互式 MCP Apps 视图(测试版)
|
|
|
319
319
|
|
|
320
320
|
### 它覆盖多少 eBay API 和工具?
|
|
321
321
|
|
|
322
|
-
|
|
322
|
+
305 个工具,覆盖 274 个唯一端点 —— eBay Sell API 的 100%。
|
|
323
323
|
|
|
324
324
|
### 它是免费且开源的吗?
|
|
325
325
|
|
|
@@ -347,11 +347,19 @@ Node.js ≥ 20、一个免费的 [eBay 开发者账号](https://developer.ebay.c
|
|
|
347
347
|
|
|
348
348
|
### 这与直接调用 eBay API 有何不同?
|
|
349
349
|
|
|
350
|
-
你通过 AI 助手以自然语言交互。OAuth 令牌管理、带退避的自动重试以及基于
|
|
350
|
+
你通过 AI 助手以自然语言交互。OAuth 令牌管理、带退避的自动重试以及基于 Effect 的类型安全校验都是内置的。参见上面的 [对比表](#ebay-mcp-对比原生-ebay-api)。
|
|
351
|
+
|
|
352
|
+
### 它能上传我的照片和视频吗?
|
|
353
|
+
|
|
354
|
+
可以。`ebay_upload_images`、`ebay_upload_video` 和 `ebay_attach_media_to_inventory_item` 会读取本地文件(绝对路径或 `media://` 引用),通过 eBay 的 Media API 上传,并返回用于 `product.imageUrls` / `product.videoIds` 的 EPS 图片 URL 和视频 ID。文件系统访问需要显式开启:在 `EBAY_MCP_MEDIA_DIRS` 或 `EBAY_MCP_MEDIA_ROOT` 指定目录之前,什么都无法读取。详见 [Photos and videos from local files](README.md#photos-and-videos-from-local-files)(英文)。
|
|
355
|
+
|
|
356
|
+
### 它支持拍卖刊登吗?
|
|
357
|
+
|
|
358
|
+
支持。通过 REST Inventory 报价工具:使用 `format: "AUCTION"`、`auctionStartPrice`、可选的 `auctionReservePrice` 和按天计的 `listingDuration` 创建报价,然后发布。详见 [Auction offers](README.md#auction-offers)(英文)。旧版 Trading API 工具使用同样的开关:带 `format: "AUCTION"` 的 `ebay_create_listing` 会发送包含 `ListingType` Chinese、起拍价 `StartPrice` 和按天计的 `ListingDuration` 的 `AddItem`。
|
|
351
359
|
|
|
352
360
|
### 它是否支持 eBay 的旧版 Trading API(XML)?
|
|
353
361
|
|
|
354
|
-
|
|
362
|
+
支持。刊登的创建、修改、重新刊登和结束操作通过 Trading API 工具提供,既支持固定价格刊登(`AddFixedPriceItem` 系列,默认),也支持拍卖(`format: "AUCTION"` → `AddItem`、`ReviseItem`、`EndItem`、`RelistItem`)。
|
|
355
363
|
|
|
356
364
|
### 如何获得更高的速率限制?
|
|
357
365
|
|
|
@@ -359,7 +367,7 @@ Node.js ≥ 20、一个免费的 [eBay 开发者账号](https://developer.ebay.c
|
|
|
359
367
|
|
|
360
368
|
### 它用什么构建?
|
|
361
369
|
|
|
362
|
-
TypeScript 和 Node.js(ESM),使用官方 MCP SDK
|
|
370
|
+
TypeScript 和 Node.js(ESM),使用官方 MCP SDK、基于 Effect 的校验(带 Zod 兼容的 MCP 适配器)以及由 OpenAPI 生成的类型。
|
|
363
371
|
|
|
364
372
|
### 如何更新到最新版本?
|
|
365
373
|
|
package/build/api/client.js
CHANGED
|
@@ -3,10 +3,34 @@ import { clientRequestError } from '../api/clientRequestError.js';
|
|
|
3
3
|
import { RateLimitTracker } from '../api/rateLimitTracker.js';
|
|
4
4
|
import { getBaseUrl } from '../config/environment.js';
|
|
5
5
|
import { getErrorMessage } from '../utils/errors.js';
|
|
6
|
-
import { httpRequestEffect, isHttpError } from '../utils/http.js';
|
|
6
|
+
import { httpRequestEffect, isHttpError, } from '../utils/http.js';
|
|
7
7
|
import { isRecord } from '../utils/typeGuards.js';
|
|
8
8
|
import { apiLogger, logRequest, logResponse, logErrorResponse } from '../utils/logger.js';
|
|
9
|
-
import { Effect } from 'effect';
|
|
9
|
+
import { Cause, Effect, Exit } from 'effect';
|
|
10
|
+
/** Bodies that must never be echoed into debug logs. */
|
|
11
|
+
const isBinaryBody = (data) => data instanceof FormData ||
|
|
12
|
+
data instanceof Blob ||
|
|
13
|
+
data instanceof Uint8Array ||
|
|
14
|
+
data instanceof ArrayBuffer;
|
|
15
|
+
const CONTENT_TYPE_HEADER = 'content-type';
|
|
16
|
+
const hasHeader = (headers, name) => headers !== undefined && Object.keys(headers).some((key) => key.toLowerCase() === name);
|
|
17
|
+
/** Removes every spelling of a header so fetch can derive it from the body. */
|
|
18
|
+
const deleteHeader = (headers, name) => {
|
|
19
|
+
for (const key of Object.keys(headers)) {
|
|
20
|
+
if (key.toLowerCase() === name) {
|
|
21
|
+
delete headers[key];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Remediation hint for a token failure, matched to the token the request needs.
|
|
27
|
+
*
|
|
28
|
+
* Setting user tokens cannot repair rejected client credentials, so an
|
|
29
|
+
* application request has to point at the credentials instead.
|
|
30
|
+
*/
|
|
31
|
+
const tokenFailureRemediation = (tokenType) => tokenType === 'application'
|
|
32
|
+
? 'This endpoint requires an application access token minted from client credentials, which a user token cannot supply. Check EBAY_CLIENT_ID and EBAY_CLIENT_SECRET.'
|
|
33
|
+
: 'Please use the ebay_set_user_tokens_with_expiry tool to provide valid tokens.';
|
|
10
34
|
/** Sleep for a retry backoff delay without exposing timers to callers. */
|
|
11
35
|
const sleep = (delayMs) => Effect.promise(() => new Promise((resolve) => {
|
|
12
36
|
setTimeout(resolve, delayMs);
|
|
@@ -50,6 +74,18 @@ export class EbayApiClient {
|
|
|
50
74
|
this.baseUrl = getBaseUrl(config.environment, config.apiBaseUrl);
|
|
51
75
|
this.rateLimitTracker = new RateLimitTracker();
|
|
52
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Acquire the access token a request should authenticate with.
|
|
79
|
+
*
|
|
80
|
+
* Both token-acquisition sites (the initial attempt and the 401 retry) route
|
|
81
|
+
* through here, so an `'application'` request cannot silently downgrade to
|
|
82
|
+
* the user token on a retry.
|
|
83
|
+
*/
|
|
84
|
+
acquireAccessToken(tokenType) {
|
|
85
|
+
return tokenType === 'application'
|
|
86
|
+
? this.authClient.getOrRefreshAppAccessToken()
|
|
87
|
+
: this.authClient.getAccessToken();
|
|
88
|
+
}
|
|
53
89
|
/**
|
|
54
90
|
* Return the credential validation error that would block an authenticated request.
|
|
55
91
|
*/
|
|
@@ -96,7 +132,20 @@ export class EbayApiClient {
|
|
|
96
132
|
* Core request boundary shared by every verb.
|
|
97
133
|
*/
|
|
98
134
|
async request(method, endpoint, options) {
|
|
99
|
-
return await
|
|
135
|
+
return (await this.requestResponse(method, endpoint, options)).data;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Core request boundary that also returns status and headers.
|
|
139
|
+
*/
|
|
140
|
+
async requestResponse(method, endpoint, options) {
|
|
141
|
+
// Preserve the typed request error for endpoint adapters. Plain runPromise
|
|
142
|
+
// rejects with a FiberFailure whose generic message hides eBay response data.
|
|
143
|
+
const exit = await Effect.runPromiseExit(this.requestEffect(method, endpoint, options));
|
|
144
|
+
if (Exit.isSuccess(exit)) {
|
|
145
|
+
const { data, status, headers } = exit.value;
|
|
146
|
+
return { data, status, headers };
|
|
147
|
+
}
|
|
148
|
+
throw Cause.squash(exit.cause);
|
|
100
149
|
}
|
|
101
150
|
/**
|
|
102
151
|
* Build the request Effect that owns auth, logging, retry, and transport errors.
|
|
@@ -134,10 +183,18 @@ export class EbayApiClient {
|
|
|
134
183
|
...this.getDefaultHeaders(),
|
|
135
184
|
...options.headers,
|
|
136
185
|
};
|
|
186
|
+
if (options.data instanceof FormData) {
|
|
187
|
+
// fetch must set the multipart content-type itself so the boundary matches.
|
|
188
|
+
deleteHeader(headers, CONTENT_TYPE_HEADER);
|
|
189
|
+
}
|
|
190
|
+
else if (options.data instanceof Blob && !hasHeader(options.headers, CONTENT_TYPE_HEADER)) {
|
|
191
|
+
// A Blob carries its own MIME type; only an explicit caller header overrides it.
|
|
192
|
+
deleteHeader(headers, CONTENT_TYPE_HEADER);
|
|
193
|
+
}
|
|
137
194
|
// Proxy auth mode: attach no Authorization header and acquire no token —
|
|
138
195
|
// the upstream proxy injects whatever credentials eBay requires.
|
|
139
196
|
if (!this.config.disableAuthHeader) {
|
|
140
|
-
const token = yield* this.
|
|
197
|
+
const token = yield* this.acquireAccessToken(options.tokenType).pipe(Effect.mapError((cause) => clientRequestError({
|
|
141
198
|
kind: 'tokenAcquisition',
|
|
142
199
|
method,
|
|
143
200
|
url,
|
|
@@ -155,18 +212,18 @@ export class EbayApiClient {
|
|
|
155
212
|
headers.Authorization = `Bearer ${token}`;
|
|
156
213
|
}
|
|
157
214
|
this.rateLimitTracker.recordRequest();
|
|
158
|
-
logRequest(method, url, options.params, options.data);
|
|
215
|
+
logRequest(method, url, options.params, isBinaryBody(options.data) ? '[binary body]' : options.data);
|
|
159
216
|
return yield* httpRequestEffect({
|
|
160
217
|
method,
|
|
161
218
|
url,
|
|
162
219
|
params: options.params,
|
|
163
220
|
headers,
|
|
164
221
|
body: options.data,
|
|
165
|
-
timeoutMs: this.timeoutMs,
|
|
222
|
+
timeoutMs: options.timeoutMs ?? this.timeoutMs,
|
|
166
223
|
responseType: options.responseType,
|
|
167
224
|
}).pipe(Effect.map((response) => {
|
|
168
225
|
logResponse(response.status, response.statusText, response.data, response.headers['x-ebay-c-ratelimit-remaining'], response.headers['x-ebay-c-ratelimit-limit']);
|
|
169
|
-
return response
|
|
226
|
+
return response;
|
|
170
227
|
}), Effect.catchAll((error) => this.handleRequestFailure(error, { method, url, options, state })));
|
|
171
228
|
});
|
|
172
229
|
}
|
|
@@ -195,8 +252,8 @@ export class EbayApiClient {
|
|
|
195
252
|
// own auth failing) is surfaced directly rather than retried.
|
|
196
253
|
if (error.status === 401 && !this.config.disableAuthHeader) {
|
|
197
254
|
if (!state.authRetried) {
|
|
198
|
-
apiLogger.warn('Authentication error (401). Attempting to refresh
|
|
199
|
-
return this.
|
|
255
|
+
apiLogger.warn('Authentication error (401). Attempting to refresh the access token...');
|
|
256
|
+
return this.acquireAccessToken(options.tokenType).pipe(Effect.catchAll((refreshError) => {
|
|
200
257
|
const reason = getErrorMessage(refreshError);
|
|
201
258
|
apiLogger.error('Failed to refresh token', { error: reason });
|
|
202
259
|
const detail = this.ebayErrorDetail(error.data) ?? 'Invalid access token';
|
|
@@ -206,7 +263,7 @@ export class EbayApiClient {
|
|
|
206
263
|
url,
|
|
207
264
|
status: error.status,
|
|
208
265
|
message: `${detail}. Token refresh failed: ${reason}. ` +
|
|
209
|
-
|
|
266
|
+
tokenFailureRemediation(options.tokenType),
|
|
210
267
|
cause: refreshError,
|
|
211
268
|
}));
|
|
212
269
|
}), Effect.flatMap(() => {
|
|
@@ -224,7 +281,7 @@ export class EbayApiClient {
|
|
|
224
281
|
url,
|
|
225
282
|
status: error.status,
|
|
226
283
|
message: `${detail}. Automatic token refresh failed. ` +
|
|
227
|
-
|
|
284
|
+
tokenFailureRemediation(options.tokenType),
|
|
228
285
|
cause: error,
|
|
229
286
|
}));
|
|
230
287
|
}
|
|
@@ -282,17 +339,30 @@ export class EbayApiClient {
|
|
|
282
339
|
params: { ...params, ...config?.params },
|
|
283
340
|
headers: config?.headers,
|
|
284
341
|
responseType: config?.responseType,
|
|
342
|
+
absolute: config?.absolute,
|
|
343
|
+
timeoutMs: config?.timeoutMs,
|
|
344
|
+
tokenType: config?.tokenType,
|
|
285
345
|
});
|
|
286
346
|
}
|
|
287
347
|
/**
|
|
288
348
|
* Make a POST request to eBay API
|
|
289
349
|
*/
|
|
290
350
|
async post(endpoint, data, config) {
|
|
291
|
-
return await this.
|
|
351
|
+
return (await this.postForResponse(endpoint, data, config)).data;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Make a POST request and keep the status and headers of the successful
|
|
355
|
+
* response — for endpoints that return their result in a `Location` header.
|
|
356
|
+
*/
|
|
357
|
+
async postForResponse(endpoint, data, config) {
|
|
358
|
+
return await this.requestResponse('POST', endpoint, {
|
|
292
359
|
data,
|
|
293
360
|
params: config?.params,
|
|
294
361
|
headers: config?.headers,
|
|
295
362
|
responseType: config?.responseType,
|
|
363
|
+
absolute: config?.absolute,
|
|
364
|
+
timeoutMs: config?.timeoutMs,
|
|
365
|
+
tokenType: config?.tokenType,
|
|
296
366
|
});
|
|
297
367
|
}
|
|
298
368
|
/**
|
|
@@ -304,6 +374,9 @@ export class EbayApiClient {
|
|
|
304
374
|
params: config?.params,
|
|
305
375
|
headers: config?.headers,
|
|
306
376
|
responseType: config?.responseType,
|
|
377
|
+
absolute: config?.absolute,
|
|
378
|
+
timeoutMs: config?.timeoutMs,
|
|
379
|
+
tokenType: config?.tokenType,
|
|
307
380
|
});
|
|
308
381
|
}
|
|
309
382
|
/**
|
|
@@ -314,6 +387,9 @@ export class EbayApiClient {
|
|
|
314
387
|
params: config?.params,
|
|
315
388
|
headers: config?.headers,
|
|
316
389
|
responseType: config?.responseType,
|
|
390
|
+
absolute: config?.absolute,
|
|
391
|
+
timeoutMs: config?.timeoutMs,
|
|
392
|
+
tokenType: config?.tokenType,
|
|
317
393
|
});
|
|
318
394
|
}
|
|
319
395
|
/**
|
package/build/api/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { NegotiationApi } from '../api/communication/negotiation.js';
|
|
|
7
7
|
import { NotificationApi } from '../api/communication/notification.js';
|
|
8
8
|
import { DeveloperApi } from '../api/developer/developer.js';
|
|
9
9
|
import { InventoryApi } from '../api/listing-management/inventory.js';
|
|
10
|
+
import { MediaApi } from '../api/listing-management/media.js';
|
|
10
11
|
import { MetadataApi } from '../api/listing-metadata/metadata.js';
|
|
11
12
|
import { TaxonomyApi } from '../api/listing-metadata/taxonomy.js';
|
|
12
13
|
import { MarketingApi } from '../api/marketing-and-promotions/marketing.js';
|
|
@@ -15,6 +16,7 @@ import { DisputeApi } from '../api/order-management/dispute.js';
|
|
|
15
16
|
import { FulfillmentApi } from '../api/order-management/fulfillment.js';
|
|
16
17
|
import { ComplianceApi } from '../api/other/compliance.js';
|
|
17
18
|
import { EDeliveryApi } from '../api/other/edelivery.js';
|
|
19
|
+
import { BrowseApi } from '../api/other/browse.js';
|
|
18
20
|
import { FindingApi } from '../api/other/finding.js';
|
|
19
21
|
import { IdentityApi } from '../api/other/identity.js';
|
|
20
22
|
import { TranslationApi } from '../api/other/translation.js';
|
|
@@ -30,6 +32,7 @@ export class EbaySellerApi {
|
|
|
30
32
|
// API categories
|
|
31
33
|
account;
|
|
32
34
|
inventory;
|
|
35
|
+
media;
|
|
33
36
|
fulfillment;
|
|
34
37
|
dispute;
|
|
35
38
|
marketing;
|
|
@@ -46,6 +49,7 @@ export class EbaySellerApi {
|
|
|
46
49
|
vero;
|
|
47
50
|
translation;
|
|
48
51
|
edelivery;
|
|
52
|
+
browse;
|
|
49
53
|
finding;
|
|
50
54
|
developer;
|
|
51
55
|
trading;
|
|
@@ -55,6 +59,7 @@ export class EbaySellerApi {
|
|
|
55
59
|
// Initialize API category handlers
|
|
56
60
|
this.account = new AccountApi(this.client);
|
|
57
61
|
this.inventory = new InventoryApi(this.client);
|
|
62
|
+
this.media = new MediaApi(this.client, this.inventory);
|
|
58
63
|
this.fulfillment = new FulfillmentApi(this.client);
|
|
59
64
|
this.dispute = new DisputeApi(this.client);
|
|
60
65
|
this.marketing = new MarketingApi(this.client);
|
|
@@ -71,6 +76,7 @@ export class EbaySellerApi {
|
|
|
71
76
|
this.vero = new VeroApi(this.client);
|
|
72
77
|
this.translation = new TranslationApi(this.client);
|
|
73
78
|
this.edelivery = new EDeliveryApi(this.client);
|
|
79
|
+
this.browse = new BrowseApi(this.client);
|
|
74
80
|
this.finding = new FindingApi(this.client);
|
|
75
81
|
this.developer = new DeveloperApi(this.client);
|
|
76
82
|
const tradingClient = new TradingApiClient(this.client);
|
|
@@ -130,6 +136,8 @@ export * from '../api/communication/message.js';
|
|
|
130
136
|
export * from '../api/communication/negotiation.js';
|
|
131
137
|
export * from '../api/communication/notification.js';
|
|
132
138
|
export * from '../api/listing-management/inventory.js';
|
|
139
|
+
export * from '../api/listing-management/media.js';
|
|
140
|
+
export * from '../api/listing-management/mediaAttach.js';
|
|
133
141
|
export * from '../api/listing-metadata/metadata.js';
|
|
134
142
|
export * from '../api/listing-metadata/taxonomy.js';
|
|
135
143
|
export * from '../api/marketing-and-promotions/marketing.js';
|
|
@@ -138,6 +146,10 @@ export * from '../api/order-management/dispute.js';
|
|
|
138
146
|
export * from '../api/order-management/fulfillment.js';
|
|
139
147
|
export * from '../api/other/compliance.js';
|
|
140
148
|
export * from '../api/other/edelivery.js';
|
|
149
|
+
export { BrowseApi } from '../api/other/browse.js';
|
|
150
|
+
export { buildBrowseFilter, requireNoPriceFilterConflict } from '../api/other/browseFilter.js';
|
|
151
|
+
export { mapItemDetailsResponse, mapItemSummary, mapSearchActiveItemsResponse, } from '../api/other/browseMappers.js';
|
|
152
|
+
export { BROWSE_SORT_VALUES, } from '../api/other/browseTypes.js';
|
|
141
153
|
export * from '../api/other/finding.js';
|
|
142
154
|
export * from '../api/other/identity.js';
|
|
143
155
|
export * from '../api/other/translation.js';
|
|
@@ -71,7 +71,10 @@ export const createInventoryItemsMethods = (client) => ({
|
|
|
71
71
|
const validatedInput = yield* requireObjectEffect(input, 'input');
|
|
72
72
|
const sku = yield* requireStringEffect(validatedInput.sku, 'sku');
|
|
73
73
|
const body = yield* requireObjectEffect(validatedInput.body, 'body');
|
|
74
|
-
|
|
74
|
+
const config = validatedInput.contentLanguage === undefined
|
|
75
|
+
? undefined
|
|
76
|
+
: { headers: { 'Content-Language': validatedInput.contentLanguage } };
|
|
77
|
+
return yield* requestPutEffect(client, `${basePath}/inventory_item/${sku}`, body, config);
|
|
75
78
|
});
|
|
76
79
|
},
|
|
77
80
|
/**
|