secondhand-mcp 0.1.0 → 0.3.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.md CHANGED
@@ -1,35 +1,20 @@
1
1
  # Secondhand MCP
2
2
 
3
- An MCP server for searching secondary marketplaces. Lets Claude and other AI assistants search for deals on Facebook Marketplace and eBay.
3
+ A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that lets AI assistants search secondhand marketplaces. Search Facebook Marketplace, eBay, Depop, and Poshmark for used and secondhand items — filter by price, category, condition, size, and color, then get full listing details with photos, descriptions, and seller info.
4
4
 
5
- ## Features
6
-
7
- - Search multiple marketplaces from a single interface
8
- - Price filtering with min/max ranges
9
- - Location-based search by city
10
- - Detailed listing inspection (photos, descriptions, seller info)
11
- - Availability filtering — sold/pending items excluded by default
12
- - Works with Claude Desktop, Claude Code, Cursor, and other MCP clients
13
- - Lightweight — no browser dependencies, native HTTP requests
5
+ Works with Claude Desktop, Claude Code, Cursor, and any MCP-compatible client.
14
6
 
15
7
  ## Supported Marketplaces
16
8
 
17
- | Marketplace | Status | Auth Required |
18
- |-------------|--------|---------------|
19
- | Facebook Marketplace | Working | No |
20
- | eBay | Working | Yes (API keys) |
9
+ | Marketplace | Auth Required | Notes |
10
+ |-------------|---------------|-------|
11
+ | Facebook Marketplace | No | Location-based search |
12
+ | eBay | Yes (API keys) | Official Browse API |
13
+ | Depop | No | Requires Chrome installed |
14
+ | Poshmark | No | Requires Chrome installed |
21
15
 
22
16
  ## Setup
23
17
 
24
- ### From Source
25
-
26
- ```bash
27
- git clone https://github.com/jlsookiki/secondhand-mcp.git
28
- cd secondhand-mcp
29
- npm install
30
- npm run build
31
- ```
32
-
33
18
  ### Claude Desktop
34
19
 
35
20
  Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
@@ -68,25 +53,31 @@ Add to `~/.claude/.mcp.json`:
68
53
  }
69
54
  ```
70
55
 
71
- eBay credentials are optional — if omitted, eBay will be disabled and only Facebook Marketplace will be available.
56
+ eBay, Depop, and Poshmark are all optional — if eBay API keys are missing or Chrome isn't installed, those marketplaces are automatically disabled and the rest still work.
57
+
58
+ ### Depop & Poshmark / Chrome Requirement
59
+
60
+ Depop and Poshmark require a headless browser. If **Google Chrome or Chromium** is installed on your system, both are automatically enabled — no config needed. If Chrome isn't found, they are silently skipped.
61
+
62
+ On macOS, the first time you search Depop or Poshmark, you may see a system prompt asking to allow Node.js to control Chrome. This is expected — puppeteer needs to launch Chrome in headless mode. Allow it once and it won't ask again.
63
+
64
+ The browser runs invisibly in the background and only launches when you actually search Depop or Poshmark.
72
65
 
73
66
  ## Configuration
74
67
 
75
68
  ### Choosing Marketplaces
76
69
 
77
- By default all marketplaces are enabled. To limit which marketplaces are active, set the `MARKETPLACES` env var (comma-separated):
70
+ By default all marketplaces are enabled. To limit which are active, set the `MARKETPLACES` env var (comma-separated):
78
71
 
79
72
  ```json
80
73
  {
81
74
  "env": {
82
- "MARKETPLACES": "facebook",
83
- "EBAY_CLIENT_ID": "...",
84
- "EBAY_CLIENT_SECRET": "..."
75
+ "MARKETPLACES": "facebook,ebay"
85
76
  }
86
77
  }
87
78
  ```
88
79
 
89
- Valid values: `facebook`, `ebay`
80
+ Valid values: `facebook`, `ebay`, `depop`, `poshmark`
90
81
 
91
82
  ### eBay API Keys
92
83
 
@@ -100,29 +91,36 @@ eBay uses the official [Browse API](https://developer.ebay.com/api-docs/buy/brow
100
91
 
101
92
  ### `search_marketplace`
102
93
 
103
- Search for items across marketplaces. Returns a summary per listing: **title, price, location, listing ID, and photo count**.
94
+ Search for items across marketplaces.
104
95
 
105
96
  | Parameter | Required | Default | Description |
106
97
  |-----------|----------|---------|-------------|
107
98
  | `query` | Yes | | Search terms |
108
- | `marketplace` | No | `facebook` | `facebook`, `ebay`, or `all` |
99
+ | `marketplace` | No | `facebook` | `facebook`, `ebay`, `depop`, `poshmark`, or `all` |
109
100
  | `location` | No | `san francisco` | City to search in (Facebook only) |
110
101
  | `maxPrice` | No | | Maximum price |
111
102
  | `minPrice` | No | | Minimum price |
112
103
  | `limit` | No | `20` | Max results |
113
- | `showSold` | No | `false` | Include sold/unavailable items (Facebook only) |
104
+ | `showSold` | No | `false` | Include sold items (Facebook only) |
114
105
  | `includeImages` | No | `false` | Include image URLs in output |
106
+ | `sort` | No | `relevance` | Sort order (Depop, Poshmark): `relevance`, `newest`, `most_popular`, `price_low_to_high`, `price_high_to_low` |
107
+ | `condition` | No | | Item condition. eBay: `new`, `like_new`, `good`, `fair`. Depop: `new`, `like_new`, `excellent`, `good`, `fair`, `used`. Poshmark: `new` (NWT), `like_new` (NWOT), `good`, `fair` |
108
+ | `category` | No | | Product category. Depop: `tops`, `bottoms`, `dresses`, `coats-jackets`, `footwear`, `accessories`, `bags`, `jewellery`, `activewear`, `swimwear`. Poshmark: `Jackets_&_Coats`, `Dresses`, `Shoes`, `Accessories`, etc. |
109
+ | `brand` | No | | Brand filter (Poshmark only): e.g. `"Nike"`, `"Levi's"`, `"Gucci"` |
110
+ | `department` | No | | Department filter (Poshmark only): `Women`, `Men`, `Kids` |
111
+ | `sizes` | No | | Size filter (Depop, Poshmark): e.g. `["S", "M", "L"]` or `["US 9", "US 10"]` |
112
+ | `colors` | No | | Color filter (Depop, Poshmark): `black`, `white`, `red`, `blue`, `green`, `yellow`, `orange`, `pink`, `purple`, `brown`, `grey`, `cream`, `multi`, `silver`, `gold` |
115
113
 
116
114
  **Data returned per marketplace:**
117
115
 
118
- | Field | Facebook | eBay |
119
- |-------|----------|------|
120
- | Title | Yes | Yes |
121
- | Price | Yes | Yes |
122
- | Location | City name | City, State |
123
- | Condition | No | Yes |
124
- | Photo count | Yes (1 thumbnail) | Yes (1 thumbnail) |
125
- | Seller | Yes | Yes |
116
+ | Field | Facebook | eBay | Depop | Poshmark |
117
+ |-------|----------|------|-------|----------|
118
+ | Title | Yes | Yes | Yes | Yes |
119
+ | Price | Yes | Yes | Yes | Yes |
120
+ | Location | City | City, State | — | — |
121
+ | Condition | | Yes | — | — |
122
+ | Photo count | 1 thumbnail | 1 thumbnail | 1 thumbnail | 1 thumbnail |
123
+ | Seller | Yes | Yes | — | — |
126
124
 
127
125
  ### `get_listing_details`
128
126
 
@@ -131,71 +129,56 @@ Get full details for a specific listing using an ID from search results.
131
129
  | Parameter | Required | Default | Description |
132
130
  |-----------|----------|---------|-------------|
133
131
  | `listingId` | Yes | | Listing ID from search results |
134
- | `marketplace` | No | `facebook` | `facebook` or `ebay` |
132
+ | `marketplace` | No | `facebook` | `facebook`, `ebay`, `depop`, or `poshmark` |
135
133
 
136
134
  **Data returned per marketplace:**
137
135
 
138
- | Field | Facebook | eBay |
139
- |-------|----------|------|
140
- | Description | Yes | Yes |
141
- | All photos | Yes | Yes |
142
- | Location | City | City, State, Country |
143
- | Seller | Name | Username |
144
- | Delivery types | Yes | No |
145
- | Shipping options | Yes/No flag | Service codes |
136
+ | Field | Facebook | eBay | Depop | Poshmark |
137
+ |-------|----------|------|-------|----------|
138
+ | Description | Yes | Yes | Yes | Yes |
139
+ | All photos | Yes | Yes | Yes | Yes |
140
+ | Location | City | City, State, Country | — | — |
141
+ | Seller | Name | Username | Username | Username |
142
+ | Delivery types | Yes | | — | — |
143
+ | Shipping | Yes/No | Service codes | Yes/No | Always included |
146
144
 
147
145
  ### `list_marketplaces`
148
146
 
149
147
  List all enabled marketplaces and their status.
150
148
 
151
- ## Example Output
152
-
153
- ```
154
- Found 15 listings for "stroller" on facebook
155
- Location: san francisco
156
-
157
- **$25** - Baby stroller
158
- San Francisco, CA
159
- ID: 123456789
160
- 1 photo
161
-
162
- **$50** - Thule Urban Glide Jogging Stroller
163
- San Francisco, CA
164
- ID: 987654321
165
- 1 photo
166
- ```
167
-
168
- Use `get_listing_details` with a listing ID to see full photos, description, and seller info.
169
-
170
149
  ## How It Works
171
150
 
172
- **Facebook Marketplace** — Uses Facebook's internal GraphQL API to search listings directly. No login, no browser automation. Resolves city names to coordinates, then searches with location/price/query filters. Uses undocumented `doc_id` endpoints that may need updating if Facebook changes their frontend.
151
+ **Facebook Marketplace** — Searches listings by location, price, and query. Resolves city names to coordinates. No login or browser needed.
173
152
 
174
153
  **eBay** — Uses the official eBay Browse API with OAuth 2.0 client credentials. Tokens are cached and auto-refreshed.
175
154
 
176
- ## Adding New Marketplaces
155
+ **Depop** Uses a headless browser to search listings with support for category, condition, size, and color filters. The browser instance is shared across requests.
177
156
 
178
- 1. Create a new file in `src/marketplaces/` (e.g., `craigslist.ts`)
179
- 2. Extend `BaseMarketplace` and implement `search()` and optionally `getListingDetails()`
180
- 3. Add the constructor to the `allMarketplaces` registry in `src/marketplaces/index.ts`
157
+ **Poshmark** Uses a headless browser to search listings with support for condition, size, color, sort, and price filters. Poshmark is not location-based — all items ship nationally.
181
158
 
182
159
  ## Development
183
160
 
184
161
  ```bash
162
+ git clone https://github.com/jlsookiki/secondhand-mcp.git
163
+ cd secondhand-mcp
185
164
  npm install
186
165
  npm run build
187
166
  ```
188
167
 
168
+ ### Adding a Marketplace
169
+
170
+ 1. Create a new file in `src/marketplaces/`
171
+ 2. Extend `BaseMarketplace` and implement `search()` and optionally `getListingDetails()`
172
+ 3. Add the constructor to `allMarketplaces` in `src/marketplaces/index.ts`
173
+
189
174
  ## Limitations
190
175
 
191
- - **Facebook Marketplace**: Uses undocumented GraphQL API — may break if Facebook changes `doc_id` values (constants in `src/marketplaces/facebook.ts`)
192
- - **Rate limiting**: Don't make too many requests too quickly
176
+ - **Facebook**: May break if Facebook changes their frontend
193
177
  - **eBay**: Requires developer API keys (free tier available)
178
+ - **Depop**: Requires Chrome/Chromium installed; slower than Facebook/eBay (~5s per search)
179
+ - **Poshmark**: Requires Chrome/Chromium installed; no official API so relies on page scraping
180
+ - **Rate limiting**: Don't make too many requests too quickly
194
181
 
195
182
  ## License
196
183
 
197
184
  MIT
198
-
199
- ## Disclaimer
200
-
201
- This tool is for personal use. Respect each marketplace's Terms of Service.
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared headless browser management for Cloudflare-protected marketplaces.
3
+ *
4
+ * Uses puppeteer-core with the stealth plugin to bypass TLS fingerprinting.
5
+ * Requires system Chrome/Chromium installed.
6
+ * Browser instance is lazy-initialized and shared across requests.
7
+ */
8
+ import { Browser, Page } from 'puppeteer-core';
9
+ export declare function findChrome(): string | null;
10
+ export declare function getBrowser(): Promise<Browser>;
11
+ export declare function newPage(): Promise<Page>;
12
+ export declare function closeBrowser(): Promise<void>;
13
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAwB/C,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAM1C;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAyBnD;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7C;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAKlD"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Shared headless browser management for Cloudflare-protected marketplaces.
4
+ *
5
+ * Uses puppeteer-core with the stealth plugin to bypass TLS fingerprinting.
6
+ * Requires system Chrome/Chromium installed.
7
+ * Browser instance is lazy-initialized and shared across requests.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.findChrome = findChrome;
14
+ exports.getBrowser = getBrowser;
15
+ exports.newPage = newPage;
16
+ exports.closeBrowser = closeBrowser;
17
+ const puppeteer_extra_1 = __importDefault(require("puppeteer-extra"));
18
+ const puppeteer_extra_plugin_stealth_1 = __importDefault(require("puppeteer-extra-plugin-stealth"));
19
+ const fs_1 = require("fs");
20
+ puppeteer_extra_1.default.use((0, puppeteer_extra_plugin_stealth_1.default)());
21
+ let browser = null;
22
+ const CHROME_PATHS = {
23
+ darwin: [
24
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
25
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
26
+ ],
27
+ linux: [
28
+ '/usr/bin/google-chrome',
29
+ '/usr/bin/google-chrome-stable',
30
+ '/usr/bin/chromium-browser',
31
+ '/usr/bin/chromium',
32
+ ],
33
+ win32: [
34
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
35
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
36
+ ],
37
+ };
38
+ function findChrome() {
39
+ const paths = CHROME_PATHS[process.platform] ?? [];
40
+ for (const p of paths) {
41
+ if ((0, fs_1.existsSync)(p))
42
+ return p;
43
+ }
44
+ return null;
45
+ }
46
+ async function getBrowser() {
47
+ if (browser && browser.connected) {
48
+ return browser;
49
+ }
50
+ const executablePath = findChrome();
51
+ if (!executablePath) {
52
+ throw new Error('Chrome/Chromium not found. Install Google Chrome or set a custom path. ' +
53
+ `Checked: ${(CHROME_PATHS[process.platform] ?? []).join(', ')}`);
54
+ }
55
+ browser = await puppeteer_extra_1.default.launch({
56
+ headless: true,
57
+ executablePath,
58
+ args: [
59
+ '--no-sandbox',
60
+ '--disable-setuid-sandbox',
61
+ '--disable-dev-shm-usage',
62
+ '--disable-gpu',
63
+ ],
64
+ });
65
+ return browser;
66
+ }
67
+ async function newPage() {
68
+ const b = await getBrowser();
69
+ const page = await b.newPage();
70
+ await page.setViewport({ width: 1280, height: 800 });
71
+ return page;
72
+ }
73
+ async function closeBrowser() {
74
+ if (browser) {
75
+ await browser.close().catch(() => { });
76
+ browser = null;
77
+ }
78
+ }
79
+ // Clean shutdown
80
+ process.on('exit', () => {
81
+ if (browser) {
82
+ browser.close().catch(() => { });
83
+ }
84
+ });
85
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;AA4BH,gCAMC;AAED,gCAyBC;AAED,0BAKC;AAED,oCAKC;AAzED,sEAAwC;AACxC,oGAA2D;AAE3D,2BAAgC;AAEhC,yBAAS,CAAC,GAAG,CAAC,IAAA,wCAAa,GAAE,CAAC,CAAC;AAE/B,IAAI,OAAO,GAAmB,IAAI,CAAC;AAEnC,MAAM,YAAY,GAA6B;IAC7C,MAAM,EAAE;QACN,8DAA8D;QAC9D,oDAAoD;KACrD;IACD,KAAK,EAAE;QACL,wBAAwB;QACxB,+BAA+B;QAC/B,2BAA2B;QAC3B,mBAAmB;KACpB;IACD,KAAK,EAAE;QACL,4DAA4D;QAC5D,kEAAkE;KACnE;CACF,CAAC;AAEF,SAAgB,UAAU;IACxB,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,IAAA,eAAU,EAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,UAAU;IAC9B,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;IACpC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,yEAAyE;YACzE,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChE,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,MAAO,yBAAiB,CAAC,MAAM,CAAC;QACxC,QAAQ,EAAE,IAAI;QACd,cAAc;QACd,IAAI,EAAE;YACJ,cAAc;YACd,0BAA0B;YAC1B,yBAAyB;YACzB,eAAe;SAChB;KACF,CAAY,CAAC;IAEd,OAAO,OAAO,CAAC;AACjB,CAAC;AAEM,KAAK,UAAU,OAAO;IAC3B,MAAM,CAAC,GAAG,MAAM,UAAU,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/B,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtC,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;IACtB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ const marketplaces_1 = require("./marketplaces");
17
17
  const tools = [
18
18
  {
19
19
  name: 'search_marketplace',
20
- description: `Search for items on secondary marketplaces. Supports: ${(0, marketplaces_1.listMarketplaceNames)().join(', ')}. Returns listing ID, title, price, location, and photo count. Facebook: location-based search, no auth. eBay: keyword search with condition filter, requires API keys. Use get_listing_details with a listing ID for full description, all photos, seller info, and shipping options.`,
20
+ description: `Search for items on secondary marketplaces. Supports: ${(0, marketplaces_1.listMarketplaceNames)().join(', ')}. Returns listing ID, title, price, location, and photo count. Facebook: location-based search, no auth. eBay: keyword search with condition filter, requires API keys. Depop: keyword search with filters for sort, condition, category, brands, sizes, colors (requires Chrome). Poshmark: keyword search with filters for sort, condition, sizes, colors (requires Chrome). Use get_listing_details with a listing ID for full description, all photos, seller info, and shipping options.`,
21
21
  inputSchema: {
22
22
  type: 'object',
23
23
  properties: {
@@ -57,6 +57,37 @@ const tools = [
57
57
  type: 'boolean',
58
58
  description: 'Include full image URLs in results (default: false). Use get_listing_details for full photos.',
59
59
  default: false
60
+ },
61
+ sort: {
62
+ type: 'string',
63
+ description: 'Sort order (Depop, Poshmark). Options: relevance, newest, most_popular, price_low_to_high, price_high_to_low',
64
+ default: 'relevance'
65
+ },
66
+ condition: {
67
+ type: 'string',
68
+ description: 'Item condition filter. eBay: new, like_new, good, fair. Depop: new, like_new, excellent, good, fair, used. Poshmark: new (NWT), like_new (NWOT), good, fair. Use "any" for no filter.',
69
+ },
70
+ category: {
71
+ type: 'string',
72
+ description: 'Product category. Depop: tops, bottoms, dresses, coats-jackets, footwear, accessories, bags, jewellery, activewear, swimwear. Poshmark: use underscore-separated names like Jackets_&_Coats, Dresses, Shoes, Accessories, etc.',
73
+ },
74
+ brand: {
75
+ type: 'string',
76
+ description: 'Filter by brand (Poshmark only). e.g. "Nike", "Levi\'s", "Gucci"',
77
+ },
78
+ department: {
79
+ type: 'string',
80
+ description: 'Filter by department (Poshmark only). Options: Women, Men, Kids',
81
+ },
82
+ sizes: {
83
+ type: 'array',
84
+ items: { type: 'string' },
85
+ description: 'Filter by sizes (Depop, Poshmark). Example: ["S", "M", "L"] or ["US 9", "US 10"]',
86
+ },
87
+ colors: {
88
+ type: 'array',
89
+ items: { type: 'string' },
90
+ description: 'Filter by colors (Depop, Poshmark). Options: black, white, red, blue, green, yellow, orange, pink, purple, brown, grey, cream, multi, silver, gold',
60
91
  }
61
92
  },
62
93
  required: ['query']
@@ -64,7 +95,7 @@ const tools = [
64
95
  },
65
96
  {
66
97
  name: 'get_listing_details',
67
- description: 'Get full details for a specific listing using an ID from search results. Facebook returns: description, all photos, location, seller name, delivery types, shipping availability. eBay returns: description, all photos, location (city/state/country), seller username, shipping service options.',
98
+ description: 'Get full details for a specific listing using an ID from search results. Facebook returns: description, all photos, location, seller name, delivery types, shipping availability. eBay returns: description, all photos, location (city/state/country), seller username, shipping service options. Depop returns: description, all photos, seller username, shipping availability. Poshmark returns: description, all photos, seller username, shipping availability.',
68
99
  inputSchema: {
69
100
  type: 'object',
70
101
  properties: {
@@ -116,6 +147,13 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
116
147
  minPrice: params.minPrice,
117
148
  limit: params.limit || 20,
118
149
  showSold: params.showSold || false,
150
+ sort: params.sort,
151
+ condition: params.condition,
152
+ category: params.category,
153
+ brand: params.brand,
154
+ department: params.department,
155
+ sizes: params.sizes,
156
+ colors: params.colors,
119
157
  };
120
158
  const marketplaceName = params.marketplace || 'facebook';
121
159
  if (marketplaceName === 'all') {
@@ -197,6 +235,14 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
197
235
  const ebay = (0, marketplaces_1.getMarketplace)('ebay');
198
236
  details = await ebay.getListingDetails(listingId);
199
237
  }
238
+ else if (targetMp === 'depop') {
239
+ const depop = (0, marketplaces_1.getMarketplace)('depop');
240
+ details = await depop.getListingDetails(listingId);
241
+ }
242
+ else if (targetMp === 'poshmark') {
243
+ const poshmark = (0, marketplaces_1.getMarketplace)('poshmark');
244
+ details = await poshmark.getListingDetails(listingId);
245
+ }
200
246
  else {
201
247
  const fb = (0, marketplaces_1.getMarketplace)('facebook');
202
248
  details = await fb.getListingDetails(listingId);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Depop Marketplace implementation
3
+ *
4
+ * Uses a headless browser to bypass Cloudflare TLS fingerprinting,
5
+ * then calls the Depop web API directly from within the browser context.
6
+ * This gives us clean JSON without any DOM scraping.
7
+ * No Depop authentication required.
8
+ */
9
+ import { BaseMarketplace } from './base';
10
+ import { SearchParams, SearchResult, ListingDetails } from '../types';
11
+ export declare class DepopMarketplace extends BaseMarketplace {
12
+ readonly name = "depop";
13
+ readonly displayName = "Depop";
14
+ readonly requiresAuth = false;
15
+ search(params: SearchParams): Promise<SearchResult>;
16
+ getListingDetails(slug: string): Promise<ListingDetails>;
17
+ healthCheck(): Promise<boolean>;
18
+ private humanizeSlug;
19
+ }
20
+ //# sourceMappingURL=depop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depop.d.ts","sourceRoot":"","sources":["../../src/marketplaces/depop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAW,cAAc,EAAE,MAAM,UAAU,CAAC;AAiB/E,qBAAa,gBAAiB,SAAQ,eAAe;IACnD,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,WAAW;IAC/B,QAAQ,CAAC,YAAY,SAAS;IAExB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAgGnD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAqDxD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,YAAY;CASrB"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * Depop Marketplace implementation
4
+ *
5
+ * Uses a headless browser to bypass Cloudflare TLS fingerprinting,
6
+ * then calls the Depop web API directly from within the browser context.
7
+ * This gives us clean JSON without any DOM scraping.
8
+ * No Depop authentication required.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DepopMarketplace = void 0;
12
+ const base_1 = require("./base");
13
+ const browser_1 = require("../browser");
14
+ const DEPOP_HOME = 'https://www.depop.com/';
15
+ const SEARCH_API = 'https://webapi.depop.com/api/v2/search/products/';
16
+ const EXTENDED_API = 'https://webapi.depop.com/api/v1/product/by-slug/';
17
+ const PRODUCT_URL = 'https://www.depop.com/products/';
18
+ // Map user-friendly condition names to Depop API values
19
+ const CONDITION_MAP = {
20
+ new: 'brand_new',
21
+ like_new: 'used_like_new',
22
+ excellent: 'used_excellent',
23
+ good: 'used_good',
24
+ fair: 'used_fair',
25
+ };
26
+ class DepopMarketplace extends base_1.BaseMarketplace {
27
+ name = 'depop';
28
+ displayName = 'Depop';
29
+ requiresAuth = false;
30
+ async search(params) {
31
+ const { query, maxPrice, minPrice, limit = 24, sort, condition, category, sizes, colors } = params;
32
+ let page;
33
+ try {
34
+ page = await (0, browser_1.newPage)();
35
+ // Navigate to Depop first to establish Cloudflare cookies/session
36
+ await page.goto(DEPOP_HOME, { waitUntil: 'networkidle2', timeout: 30000 });
37
+ // Build API URL
38
+ const apiUrl = new URL(SEARCH_API);
39
+ apiUrl.searchParams.set('what', query);
40
+ apiUrl.searchParams.set('itemsPerPage', String(limit));
41
+ apiUrl.searchParams.set('country', 'us');
42
+ apiUrl.searchParams.set('currency', 'USD');
43
+ apiUrl.searchParams.set('sort', sort || 'relevance');
44
+ if (minPrice != null)
45
+ apiUrl.searchParams.set('priceMin', String(minPrice));
46
+ if (maxPrice != null)
47
+ apiUrl.searchParams.set('priceMax', String(maxPrice));
48
+ if (condition && condition !== 'any') {
49
+ const depopCondition = CONDITION_MAP[condition];
50
+ if (depopCondition)
51
+ apiUrl.searchParams.set('conditions', depopCondition);
52
+ }
53
+ if (category)
54
+ apiUrl.searchParams.set('groups', category);
55
+ if (sizes)
56
+ for (const s of sizes)
57
+ apiUrl.searchParams.append('sizes', s);
58
+ if (colors)
59
+ for (const c of colors)
60
+ apiUrl.searchParams.append('colours', c);
61
+ // Call the API from within the browser context
62
+ const apiResponse = await page.evaluate(async (url) => {
63
+ try {
64
+ const res = await fetch(url, {
65
+ headers: {
66
+ 'accept': 'application/json',
67
+ },
68
+ });
69
+ if (!res.ok)
70
+ return { error: `HTTP ${res.status}`, data: null };
71
+ const data = await res.json();
72
+ return { error: null, data };
73
+ }
74
+ catch (e) {
75
+ return { error: e.message || String(e), data: null };
76
+ }
77
+ }, apiUrl.toString());
78
+ if (apiResponse.error || !apiResponse.data) {
79
+ return this.createError(`Depop API error: ${apiResponse.error}`);
80
+ }
81
+ const data = apiResponse.data;
82
+ const products = data.products || [];
83
+ const listings = [];
84
+ for (const product of products) {
85
+ if (listings.length >= limit)
86
+ break;
87
+ const slug = product.slug;
88
+ if (!slug)
89
+ continue;
90
+ const priceAmount = product.price?.priceAmount;
91
+ const currency = product.price?.currencyName === 'GBP' ? '£' : '$';
92
+ const priceStr = priceAmount != null ? `${currency}${priceAmount}` : 'Price not listed';
93
+ const priceNumeric = priceAmount != null ? parseFloat(priceAmount) : undefined;
94
+ // Get best available preview image (values are direct URL strings)
95
+ const preview = product.preview;
96
+ const images = [];
97
+ if (preview) {
98
+ const imgUrl = preview['480'] || preview['320'] || preview['640'];
99
+ if (imgUrl)
100
+ images.push(imgUrl);
101
+ }
102
+ listings.push({
103
+ id: slug,
104
+ title: this.humanizeSlug(slug),
105
+ price: priceStr,
106
+ priceNumeric,
107
+ currency,
108
+ url: `${PRODUCT_URL}${slug}`,
109
+ images: images.length > 0 ? images : undefined,
110
+ marketplace: this.name,
111
+ scrapedAt: new Date().toISOString(),
112
+ });
113
+ }
114
+ return {
115
+ marketplace: this.name,
116
+ success: true,
117
+ listings,
118
+ totalFound: data.meta?.resultCount ?? listings.length,
119
+ };
120
+ }
121
+ catch (error) {
122
+ return this.createError(`Depop search failed: ${error}`);
123
+ }
124
+ finally {
125
+ if (page)
126
+ await page.close().catch(() => { });
127
+ }
128
+ }
129
+ async getListingDetails(slug) {
130
+ let page;
131
+ try {
132
+ page = await (0, browser_1.newPage)();
133
+ // Navigate to product page — JSON-LD has description + images
134
+ await page.goto(`${PRODUCT_URL}${slug}/`, { waitUntil: 'networkidle2', timeout: 30000 });
135
+ // Extract JSON-LD structured data (description, images, price, condition)
136
+ const jsonLd = await page.evaluate(`
137
+ (() => {
138
+ const el = document.querySelector('script[type="application/ld+json"]');
139
+ if (!el) return null;
140
+ try { return JSON.parse(el.textContent || ''); } catch { return null; }
141
+ })()
142
+ `);
143
+ // Call extended API for seller/shipping details
144
+ const extended = await page.evaluate(async (url) => {
145
+ try {
146
+ const res = await fetch(url);
147
+ if (res.ok)
148
+ return await res.json();
149
+ return null;
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }, `${EXTENDED_API}${slug}/extended/?lang=en&force_fee_calculation=true`);
155
+ // Extract seller username from meta description ("... - Sold by @username")
156
+ const seller = await page.evaluate(`
157
+ (() => {
158
+ const meta = document.querySelector('meta[name="description"]');
159
+ const content = meta ? meta.getAttribute('content') || '' : '';
160
+ const match = content.match(/Sold by @(\\w+)/);
161
+ return match ? match[1] : undefined;
162
+ })()
163
+ `);
164
+ const images = jsonLd?.image || [];
165
+ const hasShipping = extended?.pricing?.national_shipping_cost != null
166
+ || extended?.has_free_shipping === true;
167
+ return {
168
+ id: slug,
169
+ description: jsonLd?.description ?? undefined,
170
+ images,
171
+ seller,
172
+ isShippingOffered: hasShipping,
173
+ url: `${PRODUCT_URL}${slug}`,
174
+ };
175
+ }
176
+ finally {
177
+ if (page)
178
+ await page.close().catch(() => { });
179
+ }
180
+ }
181
+ async healthCheck() {
182
+ try {
183
+ const result = await this.search({ query: 'test', limit: 1 });
184
+ return result.success;
185
+ }
186
+ catch {
187
+ return false;
188
+ }
189
+ }
190
+ // ── Private helpers ──────────────────────────────────────────────
191
+ humanizeSlug(slug) {
192
+ const parts = slug.split('-');
193
+ if (parts.length <= 2)
194
+ return slug.replace(/-/g, ' ');
195
+ // Remove first part (username) and last part (random suffix)
196
+ const titleParts = parts.slice(1, -1);
197
+ return titleParts
198
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
199
+ .join(' ');
200
+ }
201
+ }
202
+ exports.DepopMarketplace = DepopMarketplace;
203
+ //# sourceMappingURL=depop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depop.js","sourceRoot":"","sources":["../../src/marketplaces/depop.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ import { Marketplace } from './base';
5
5
  export { Marketplace, BaseMarketplace } from './base';
6
6
  export { FacebookMarketplace } from './facebook';
7
7
  export { EbayMarketplace } from './ebay';
8
+ export { DepopMarketplace } from './depop';
9
+ export { PoshmarkMarketplace } from './poshmark';
8
10
  export declare function initializeMarketplaces(): void;
9
11
  export declare function registerMarketplace(marketplace: Marketplace): void;
10
12
  export declare function getMarketplace(name: string): Marketplace | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/marketplaces/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAIrC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAazC,wBAAgB,sBAAsB,IAAI,IAAI,CAgB7C;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAElE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAED,wBAAgB,kBAAkB,IAAI,WAAW,EAAE,CAElD;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/marketplaces/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAOrC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAejD,wBAAgB,sBAAsB,IAAI,IAAI,CAwB7C;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAElE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAED,wBAAgB,kBAAkB,IAAI,WAAW,EAAE,CAElD;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C"}
@@ -3,7 +3,7 @@
3
3
  * Marketplace registry - central place to register and access all marketplace implementations
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EbayMarketplace = exports.FacebookMarketplace = exports.BaseMarketplace = void 0;
6
+ exports.PoshmarkMarketplace = exports.DepopMarketplace = exports.EbayMarketplace = exports.FacebookMarketplace = exports.BaseMarketplace = void 0;
7
7
  exports.initializeMarketplaces = initializeMarketplaces;
8
8
  exports.registerMarketplace = registerMarketplace;
9
9
  exports.getMarketplace = getMarketplace;
@@ -11,18 +11,27 @@ exports.getAllMarketplaces = getAllMarketplaces;
11
11
  exports.listMarketplaceNames = listMarketplaceNames;
12
12
  const facebook_1 = require("./facebook");
13
13
  const ebay_1 = require("./ebay");
14
+ const depop_1 = require("./depop");
15
+ const poshmark_1 = require("./poshmark");
16
+ const browser_1 = require("../browser");
14
17
  var base_1 = require("./base");
15
18
  Object.defineProperty(exports, "BaseMarketplace", { enumerable: true, get: function () { return base_1.BaseMarketplace; } });
16
19
  var facebook_2 = require("./facebook");
17
20
  Object.defineProperty(exports, "FacebookMarketplace", { enumerable: true, get: function () { return facebook_2.FacebookMarketplace; } });
18
21
  var ebay_2 = require("./ebay");
19
22
  Object.defineProperty(exports, "EbayMarketplace", { enumerable: true, get: function () { return ebay_2.EbayMarketplace; } });
23
+ var depop_2 = require("./depop");
24
+ Object.defineProperty(exports, "DepopMarketplace", { enumerable: true, get: function () { return depop_2.DepopMarketplace; } });
25
+ var poshmark_2 = require("./poshmark");
26
+ Object.defineProperty(exports, "PoshmarkMarketplace", { enumerable: true, get: function () { return poshmark_2.PoshmarkMarketplace; } });
20
27
  // Registry of all available marketplaces
21
28
  const marketplaces = new Map();
22
29
  // All known marketplace constructors
23
30
  const allMarketplaces = {
24
31
  facebook: () => new facebook_1.FacebookMarketplace(),
25
32
  ebay: () => new ebay_1.EbayMarketplace(),
33
+ depop: () => new depop_1.DepopMarketplace(),
34
+ poshmark: () => new poshmark_1.PoshmarkMarketplace(),
26
35
  };
27
36
  // Register marketplaces based on MARKETPLACES env var (comma-separated).
28
37
  // If not set, all marketplaces are enabled by default.
@@ -39,6 +48,14 @@ function initializeMarketplaces() {
39
48
  console.error('eBay marketplace enabled but EBAY_CLIENT_ID/EBAY_CLIENT_SECRET not set — skipping');
40
49
  continue;
41
50
  }
51
+ if (name === 'depop' && !(0, browser_1.findChrome)()) {
52
+ console.error('Depop marketplace enabled but Chrome/Chromium not found — skipping');
53
+ continue;
54
+ }
55
+ if (name === 'poshmark' && !(0, browser_1.findChrome)()) {
56
+ console.error('Poshmark marketplace enabled but Chrome/Chromium not found — skipping');
57
+ continue;
58
+ }
42
59
  registerMarketplace(factory());
43
60
  }
44
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketplaces/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAqBH,wDAgBC;AAED,kDAEC;AAED,wCAEC;AAED,gDAEC;AAED,oDAEC;AAlDD,yCAAiD;AACjD,iCAAyC;AAEzC,+BAAsD;AAAhC,uGAAA,eAAe,OAAA;AACrC,uCAAiD;AAAxC,+GAAA,mBAAmB,OAAA;AAC5B,+BAAyC;AAAhC,uGAAA,eAAe,OAAA;AAExB,yCAAyC;AACzC,MAAM,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;AAEzD,qCAAqC;AACrC,MAAM,eAAe,GAAsC;IACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,8BAAmB,EAAE;IACzC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAe,EAAE;CAClC,CAAC;AAEF,yEAAyE;AACzE,uDAAuD;AACvD,SAAgB,sBAAsB;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtG,MAAM,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,8BAA8B,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACxF,OAAO,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;YACnG,SAAS;QACX,CAAC;QACD,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,WAAwB;IAC1D,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketplaces/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA4BH,wDAwBC;AAED,kDAEC;AAED,wCAEC;AAED,gDAEC;AAED,oDAEC;AAjED,yCAAiD;AACjD,iCAAyC;AACzC,mCAA2C;AAC3C,yCAAiD;AACjD,wCAAwC;AAExC,+BAAsD;AAAhC,uGAAA,eAAe,OAAA;AACrC,uCAAiD;AAAxC,+GAAA,mBAAmB,OAAA;AAC5B,+BAAyC;AAAhC,uGAAA,eAAe,OAAA;AACxB,iCAA2C;AAAlC,yGAAA,gBAAgB,OAAA;AACzB,uCAAiD;AAAxC,+GAAA,mBAAmB,OAAA;AAE5B,yCAAyC;AACzC,MAAM,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;AAEzD,qCAAqC;AACrC,MAAM,eAAe,GAAsC;IACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,8BAAmB,EAAE;IACzC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAe,EAAE;IACjC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,wBAAgB,EAAE;IACnC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,8BAAmB,EAAE;CAC1C,CAAC;AAEF,yEAAyE;AACzE,uDAAuD;AACvD,SAAgB,sBAAsB;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtG,MAAM,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,8BAA8B,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACxF,OAAO,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;YACnG,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,IAAA,oBAAU,GAAE,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;YACpF,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,IAAA,oBAAU,GAAE,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;YACvF,SAAS;QACX,CAAC;QACD,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,WAAwB;IAC1D,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Poshmark Marketplace implementation
3
+ *
4
+ * Uses a headless browser to bypass anti-scraping measures,
5
+ * then intercepts Poshmark's internal API responses for clean JSON data.
6
+ * Falls back to DOM extraction if API interception fails.
7
+ * No authentication required for public search.
8
+ */
9
+ import { BaseMarketplace } from './base';
10
+ import { SearchParams, SearchResult, ListingDetails } from '../types';
11
+ export declare class PoshmarkMarketplace extends BaseMarketplace {
12
+ readonly name = "poshmark";
13
+ readonly displayName = "Poshmark";
14
+ readonly requiresAuth = false;
15
+ search(params: SearchParams): Promise<SearchResult>;
16
+ getListingDetails(listingId: string): Promise<ListingDetails>;
17
+ healthCheck(): Promise<boolean>;
18
+ private buildSearchUrl;
19
+ private parseApiResponse;
20
+ private parseDomResults;
21
+ private humanizeSlug;
22
+ }
23
+ //# sourceMappingURL=poshmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poshmark.d.ts","sourceRoot":"","sources":["../../src/marketplaces/poshmark.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAW,cAAc,EAAE,MAAM,UAAU,CAAC;AA4B/E,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,cAAc;IAClC,QAAQ,CAAC,YAAY,SAAS;IAExB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAgDnD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA0D7D,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,cAAc;IAgDtB,OAAO,CAAC,gBAAgB;YAmDV,eAAe;IAsG7B,OAAO,CAAC,YAAY;CAUrB"}
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ /**
3
+ * Poshmark Marketplace implementation
4
+ *
5
+ * Uses a headless browser to bypass anti-scraping measures,
6
+ * then intercepts Poshmark's internal API responses for clean JSON data.
7
+ * Falls back to DOM extraction if API interception fails.
8
+ * No authentication required for public search.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.PoshmarkMarketplace = void 0;
12
+ const base_1 = require("./base");
13
+ const browser_1 = require("../browser");
14
+ const POSHMARK_BASE = 'https://poshmark.com';
15
+ const SEARCH_URL = `${POSHMARK_BASE}/search`;
16
+ const LISTING_URL = `${POSHMARK_BASE}/listing/`;
17
+ // Poshmark's internal REST API path fragment for response interception
18
+ const VM_REST_PATTERN = '/vm-rest/';
19
+ // Map SearchParams condition values to Poshmark's condition identifiers
20
+ const CONDITION_MAP = {
21
+ new: 'nwt', // New With Tags
22
+ like_new: 'nwot', // New Without Tags
23
+ good: 'good',
24
+ fair: 'fair',
25
+ };
26
+ // Map SearchParams sort values to Poshmark URL sort_by values
27
+ const SORT_MAP = {
28
+ relevance: 'relevance',
29
+ newest: 'added_desc',
30
+ price_low_to_high: 'price_asc',
31
+ price_high_to_low: 'price_desc',
32
+ most_popular: 'like_count',
33
+ };
34
+ class PoshmarkMarketplace extends base_1.BaseMarketplace {
35
+ name = 'poshmark';
36
+ displayName = 'Poshmark';
37
+ requiresAuth = false;
38
+ async search(params) {
39
+ const { query, maxPrice, minPrice, limit = 48, sort, condition, category, brand, department, sizes, colors } = params;
40
+ let page;
41
+ try {
42
+ page = await (0, browser_1.newPage)();
43
+ // Prepare to intercept vm-rest API responses
44
+ let apiData = null;
45
+ page.on('response', async (response) => {
46
+ try {
47
+ const url = response.url();
48
+ if (url.includes(VM_REST_PATTERN) && response.status() === 200) {
49
+ const contentType = response.headers()['content-type'] || '';
50
+ if (contentType.includes('application/json')) {
51
+ apiData = await response.json();
52
+ }
53
+ }
54
+ }
55
+ catch { /* ignore parse failures */ }
56
+ });
57
+ // Build search URL with filters
58
+ const searchUrl = this.buildSearchUrl(query, {
59
+ sort, condition, minPrice, maxPrice, category, brand, department, sizes, colors,
60
+ });
61
+ await page.goto(searchUrl, { waitUntil: 'networkidle2', timeout: 30000 });
62
+ // Small buffer for late API responses
63
+ if (!apiData) {
64
+ await new Promise(r => setTimeout(r, 2000));
65
+ }
66
+ // Strategy 1: Parse intercepted API data
67
+ if (apiData?.data && Array.isArray(apiData.data)) {
68
+ return this.parseApiResponse(apiData, limit);
69
+ }
70
+ // Strategy 2: Fall back to DOM extraction
71
+ return await this.parseDomResults(page, limit);
72
+ }
73
+ catch (error) {
74
+ return this.createError(`Poshmark search failed: ${error}`);
75
+ }
76
+ finally {
77
+ if (page)
78
+ await page.close().catch(() => { });
79
+ }
80
+ }
81
+ async getListingDetails(listingId) {
82
+ let page;
83
+ try {
84
+ page = await (0, browser_1.newPage)();
85
+ await page.goto(`${LISTING_URL}${listingId}`, {
86
+ waitUntil: 'networkidle2',
87
+ timeout: 30000,
88
+ });
89
+ // Extract JSON-LD structured data (Product schema)
90
+ const jsonLd = await page.evaluate(`
91
+ (() => {
92
+ const el = document.querySelector('script[type="application/ld+json"]');
93
+ if (!el) return null;
94
+ try { return JSON.parse(el.textContent || ''); } catch { return null; }
95
+ })()
96
+ `);
97
+ // Extract additional details from DOM
98
+ const domData = await page.evaluate(`
99
+ (() => {
100
+ const descEl = document.querySelector('[data-test="listing-description"]')
101
+ || document.querySelector('.listing__description');
102
+ const description = descEl ? descEl.textContent.trim() : undefined;
103
+
104
+ const images = [];
105
+ document.querySelectorAll('[data-test="listing-image"] img, .listing__slideshow img, .slideshow img').forEach(function(img) {
106
+ const src = img.getAttribute('src');
107
+ if (src && !src.includes('placeholder')) images.push(src);
108
+ });
109
+
110
+ const sellerEl = document.querySelector('[data-test="listing-seller-name"]')
111
+ || document.querySelector('.listing__seller-name')
112
+ || document.querySelector('.closet-header__name a');
113
+ const seller = sellerEl ? sellerEl.textContent.trim() : undefined;
114
+
115
+ return { description: description, images: images, seller: seller };
116
+ })()
117
+ `);
118
+ // Merge JSON-LD and DOM data
119
+ const images = jsonLd?.image
120
+ ? (Array.isArray(jsonLd.image) ? jsonLd.image : [jsonLd.image])
121
+ : domData.images || [];
122
+ return {
123
+ id: listingId,
124
+ description: jsonLd?.description ?? domData.description ?? undefined,
125
+ images,
126
+ seller: domData.seller ?? undefined,
127
+ isShippingOffered: true, // Poshmark always includes shipping
128
+ url: `${LISTING_URL}${listingId}`,
129
+ };
130
+ }
131
+ finally {
132
+ if (page)
133
+ await page.close().catch(() => { });
134
+ }
135
+ }
136
+ async healthCheck() {
137
+ try {
138
+ const result = await this.search({ query: 'test', limit: 1 });
139
+ return result.success;
140
+ }
141
+ catch {
142
+ return false;
143
+ }
144
+ }
145
+ // ── Private helpers ──────────────────────────────────────────────
146
+ buildSearchUrl(query, filters) {
147
+ const url = new URL(SEARCH_URL);
148
+ url.searchParams.set('query', query);
149
+ url.searchParams.set('type', 'listings');
150
+ url.searchParams.set('src', 'dir');
151
+ if (filters.sort) {
152
+ const poshSort = SORT_MAP[filters.sort];
153
+ if (poshSort)
154
+ url.searchParams.set('sort_by', poshSort);
155
+ }
156
+ if (filters.condition && filters.condition !== 'any') {
157
+ const poshCondition = CONDITION_MAP[filters.condition];
158
+ if (poshCondition)
159
+ url.searchParams.set('condition', poshCondition);
160
+ }
161
+ if (filters.minPrice != null || filters.maxPrice != null) {
162
+ const min = filters.minPrice ?? 0;
163
+ const max = filters.maxPrice ?? '';
164
+ url.searchParams.append('price[]', `${min}-${max}`);
165
+ }
166
+ if (filters.department) {
167
+ url.searchParams.set('department', filters.department);
168
+ }
169
+ if (filters.brand) {
170
+ url.searchParams.append('brand[]', filters.brand);
171
+ }
172
+ if (filters.category) {
173
+ url.searchParams.set('category_v2', filters.category);
174
+ }
175
+ if (filters.sizes) {
176
+ for (const s of filters.sizes)
177
+ url.searchParams.append('size[]', s);
178
+ }
179
+ if (filters.colors) {
180
+ for (const c of filters.colors)
181
+ url.searchParams.append('color[]', c);
182
+ }
183
+ return url.toString();
184
+ }
185
+ parseApiResponse(apiData, limit) {
186
+ const items = apiData.data || [];
187
+ const listings = [];
188
+ for (const item of items) {
189
+ if (listings.length >= limit)
190
+ break;
191
+ try {
192
+ const id = item.id || item.post_id;
193
+ if (!id)
194
+ continue;
195
+ const priceAmount = item.price_amount?.val
196
+ ?? item.original_price_amount?.val
197
+ ?? item.price;
198
+ const priceStr = priceAmount != null ? `$${priceAmount}` : 'Price not listed';
199
+ const priceNumeric = priceAmount != null ? parseFloat(String(priceAmount)) : undefined;
200
+ const images = [];
201
+ if (item.picture_url)
202
+ images.push(item.picture_url);
203
+ if (Array.isArray(item.pictures)) {
204
+ for (const pic of item.pictures) {
205
+ const picUrl = typeof pic === 'string' ? pic : pic?.url;
206
+ if (picUrl && !images.includes(picUrl))
207
+ images.push(picUrl);
208
+ }
209
+ }
210
+ listings.push({
211
+ id: String(id),
212
+ title: item.title || 'Untitled Listing',
213
+ price: priceStr,
214
+ priceNumeric,
215
+ currency: '$',
216
+ url: `${LISTING_URL}${item.title_slug || id}`,
217
+ images: images.length > 0 ? images : undefined,
218
+ seller: item.creator_username,
219
+ condition: item.condition,
220
+ marketplace: this.name,
221
+ scrapedAt: new Date().toISOString(),
222
+ });
223
+ }
224
+ catch {
225
+ continue;
226
+ }
227
+ }
228
+ return {
229
+ marketplace: this.name,
230
+ success: true,
231
+ listings,
232
+ totalFound: apiData.total_count ?? listings.length,
233
+ };
234
+ }
235
+ async parseDomResults(page, limit) {
236
+ // Wait for listing cards to render
237
+ try {
238
+ await page.waitForSelector('.card', { timeout: 10000 });
239
+ }
240
+ catch {
241
+ return this.createError('Poshmark: No listings found or page failed to load');
242
+ }
243
+ const rawListings = await page.evaluate(`
244
+ (() => {
245
+ var cards = document.querySelectorAll('.card');
246
+ var results = [];
247
+
248
+ cards.forEach(function(card) {
249
+ try {
250
+ // Covershot link has the listing href and image
251
+ var covershot = card.querySelector('a.tile__covershot');
252
+ if (!covershot) return;
253
+ var href = covershot.getAttribute('href') || '';
254
+ if (href.indexOf('/listing/') === -1) return;
255
+
256
+ // Image from picture > img
257
+ var imgEl = covershot.querySelector('img');
258
+ var imgSrc = imgEl ? (imgEl.getAttribute('src') || '') : '';
259
+ var imgAlt = imgEl ? (imgEl.getAttribute('alt') || '') : '';
260
+
261
+ // Title from .tile__title link
262
+ var titleEl = card.querySelector('a.tile__title');
263
+ var title = titleEl ? titleEl.textContent.trim() : imgAlt;
264
+
265
+ // Price from .fw--bold span
266
+ var priceEl = card.querySelector('.fw--bold');
267
+ var price = priceEl ? priceEl.textContent.trim() : '';
268
+
269
+ // Size from .tile__details__pipe__size
270
+ var sizeEl = card.querySelector('.tile__details__pipe__size');
271
+ var size = sizeEl ? sizeEl.textContent.trim() : '';
272
+
273
+ // Brand from .tile__details__pipe__brand
274
+ var brandEl = card.querySelector('.tile__details__pipe__brand');
275
+ var brand = brandEl ? brandEl.textContent.trim() : '';
276
+
277
+ // Seller from data attribute on covershot link
278
+ var listerId = covershot.getAttribute('data-et-prop-lister_id') || '';
279
+
280
+ results.push({
281
+ href: href,
282
+ title: title,
283
+ price: price,
284
+ imgSrc: imgSrc,
285
+ brand: brand,
286
+ size: size,
287
+ seller: ''
288
+ });
289
+ } catch(e) { /* skip */ }
290
+ });
291
+ return results;
292
+ })()
293
+ `);
294
+ const listings = [];
295
+ for (const raw of rawListings) {
296
+ if (listings.length >= limit)
297
+ break;
298
+ if (!raw.href || !raw.href.includes('/listing/'))
299
+ continue;
300
+ // Extract listing slug from URL: /listing/Title-Slug-hexid
301
+ const slug = raw.href.replace(/^.*\/listing\//, '').replace(/\/$/, '');
302
+ if (!slug)
303
+ continue;
304
+ const parsed = this.parsePrice(raw.price);
305
+ // Build title from available data
306
+ let title = raw.title;
307
+ if (!title && raw.brand) {
308
+ title = [raw.brand, raw.size].filter(Boolean).join(' - ');
309
+ }
310
+ if (!title) {
311
+ title = this.humanizeSlug(slug);
312
+ }
313
+ listings.push({
314
+ id: slug,
315
+ title,
316
+ price: raw.price || 'Price not listed',
317
+ priceNumeric: parsed?.numeric,
318
+ currency: parsed?.currency || '$',
319
+ url: `${POSHMARK_BASE}${raw.href.startsWith('/') ? '' : '/'}${raw.href}`,
320
+ images: raw.imgSrc ? [raw.imgSrc] : undefined,
321
+ seller: raw.seller || undefined,
322
+ marketplace: this.name,
323
+ scrapedAt: new Date().toISOString(),
324
+ });
325
+ }
326
+ return {
327
+ marketplace: this.name,
328
+ success: true,
329
+ listings,
330
+ totalFound: listings.length,
331
+ };
332
+ }
333
+ humanizeSlug(slug) {
334
+ const parts = slug.split('-');
335
+ // Remove trailing hex ID if present (Poshmark uses 24-char hex IDs)
336
+ if (parts.length > 1 && /^[a-f0-9]{24}$/i.test(parts[parts.length - 1])) {
337
+ parts.pop();
338
+ }
339
+ return parts
340
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
341
+ .join(' ');
342
+ }
343
+ }
344
+ exports.PoshmarkMarketplace = PoshmarkMarketplace;
345
+ //# sourceMappingURL=poshmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poshmark.js","sourceRoot":"","sources":["../../src/marketplaces/poshmark.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -22,9 +22,15 @@ export interface SearchParams {
22
22
  maxPrice?: number;
23
23
  minPrice?: number;
24
24
  radius?: number;
25
- condition?: 'new' | 'like_new' | 'good' | 'fair' | 'any';
25
+ condition?: 'new' | 'like_new' | 'excellent' | 'good' | 'fair' | 'used' | 'any';
26
26
  limit?: number;
27
27
  showSold?: boolean;
28
+ sort?: 'relevance' | 'newest' | 'price_low_to_high' | 'price_high_to_low' | 'most_popular';
29
+ category?: string;
30
+ brand?: string;
31
+ department?: string;
32
+ sizes?: string[];
33
+ colors?: string[];
28
34
  }
29
35
  export interface SearchResult {
30
36
  marketplace: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,cAAc,CAAC;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "secondhand-mcp",
3
- "version": "0.1.0",
4
- "description": "MCP server for searching secondary marketplaces (Facebook Marketplace, eBay, Craigslist, etc.)",
3
+ "version": "0.3.0",
4
+ "description": "MCP server for searching secondhand marketplaces Facebook Marketplace, eBay, and Depop. Search listings, filter by price/category/condition, and get full details with photos.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
@@ -19,30 +19,37 @@
19
19
  },
20
20
  "keywords": [
21
21
  "mcp",
22
+ "mcp-server",
23
+ "model-context-protocol",
22
24
  "marketplace",
23
25
  "facebook-marketplace",
24
26
  "ebay",
25
- "craigslist",
27
+ "depop",
26
28
  "secondhand",
29
+ "thrift",
27
30
  "resale",
28
31
  "claude",
29
- "anthropic"
32
+ "claude-desktop",
33
+ "ai-tools"
30
34
  ],
31
35
  "author": "Justin Sookikian",
32
36
  "license": "MIT",
33
37
  "dependencies": {
34
- "@modelcontextprotocol/sdk": "~1.5.0"
38
+ "@modelcontextprotocol/sdk": "~1.5.0",
39
+ "puppeteer-core": "^24.37.1",
40
+ "puppeteer-extra": "^3.3.6",
41
+ "puppeteer-extra-plugin-stealth": "^2.11.2"
35
42
  },
36
43
  "devDependencies": {
37
44
  "@types/node": "^20.10.0",
38
- "typescript": "^5.3.0",
39
- "ts-node": "^10.9.0"
45
+ "ts-node": "^10.9.0",
46
+ "typescript": "^5.3.0"
40
47
  },
41
48
  "engines": {
42
49
  "node": ">=18.0.0"
43
50
  },
44
51
  "repository": {
45
52
  "type": "git",
46
- "url": "https://github.com/jlsookiki/secondhand-mcp"
53
+ "url": "git+https://github.com/jlsookiki/secondhand-mcp.git"
47
54
  }
48
55
  }