@lofder/dsers-mcp-product 1.3.7 → 1.4.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 +164 -74
- package/dist/auth/browser-finder.d.ts +5 -5
- package/dist/auth/browser-finder.d.ts.map +1 -1
- package/dist/auth/browser-finder.js +13 -95
- package/dist/auth/browser-finder.js.map +1 -1
- package/dist/auth/cdp-session.d.ts.map +1 -1
- package/dist/auth/cdp-session.js +89 -38
- package/dist/auth/cdp-session.js.map +1 -1
- package/dist/auth/index.d.ts +3 -5
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth.d.ts +36 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +173 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/safari-fallback.d.ts.map +1 -1
- package/dist/auth/safari-fallback.js +7 -2
- package/dist/auth/safari-fallback.js.map +1 -1
- package/dist/auth/terminal-prompt.d.ts.map +1 -1
- package/dist/auth/terminal-prompt.js +6 -3
- package/dist/auth/terminal-prompt.js.map +1 -1
- package/dist/auth/token-store.d.ts +10 -2
- package/dist/auth/token-store.d.ts.map +1 -1
- package/dist/auth/token-store.js +32 -5
- package/dist/auth/token-store.js.map +1 -1
- package/dist/cli.js +51 -68
- package/dist/cli.js.map +1 -1
- package/dist/dsers/account.d.ts.map +1 -1
- package/dist/dsers/account.js.map +1 -1
- package/dist/dsers/auth.d.ts +5 -6
- package/dist/dsers/auth.d.ts.map +1 -1
- package/dist/dsers/auth.js +57 -84
- package/dist/dsers/auth.js.map +1 -1
- package/dist/dsers/client.d.ts +0 -1
- package/dist/dsers/client.d.ts.map +1 -1
- package/dist/dsers/client.js +7 -14
- package/dist/dsers/client.js.map +1 -1
- package/dist/dsers/config.d.ts +19 -16
- package/dist/dsers/config.d.ts.map +1 -1
- package/dist/dsers/config.js +22 -30
- package/dist/dsers/config.js.map +1 -1
- package/dist/dsers/product.d.ts.map +1 -1
- package/dist/dsers/product.js +5 -10
- package/dist/dsers/product.js.map +1 -1
- package/dist/dsers/settings.d.ts.map +1 -1
- package/dist/dsers/settings.js.map +1 -1
- package/dist/error-map.d.ts.map +1 -1
- package/dist/error-map.js +4 -6
- package/dist/error-map.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -13
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +15 -2
- package/dist/instructions.js.map +1 -1
- package/dist/job-store.d.ts.map +1 -1
- package/dist/job-store.js.map +1 -1
- package/dist/oauth/crypto.d.ts.map +1 -1
- package/dist/oauth/crypto.js.map +1 -1
- package/dist/provider/helpers.d.ts +28 -0
- package/dist/provider/helpers.d.ts.map +1 -0
- package/dist/provider/helpers.js +265 -0
- package/dist/provider/helpers.js.map +1 -0
- package/dist/provider/import-ops.d.ts +23 -0
- package/dist/provider/import-ops.d.ts.map +1 -0
- package/dist/provider/import-ops.js +350 -0
- package/dist/provider/import-ops.js.map +1 -0
- package/dist/provider/index.d.ts +38 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +172 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/normalize.d.ts +7 -0
- package/dist/provider/normalize.d.ts.map +1 -0
- package/dist/provider/normalize.js +239 -0
- package/dist/provider/normalize.js.map +1 -0
- package/dist/provider/push.d.ts +15 -0
- package/dist/provider/push.d.ts.map +1 -0
- package/dist/provider/push.js +420 -0
- package/dist/provider/push.js.map +1 -0
- package/dist/provider/store.d.ts +7 -0
- package/dist/provider/store.d.ts.map +1 -0
- package/dist/provider/store.js +152 -0
- package/dist/provider/store.js.map +1 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +82 -241
- package/dist/provider.js.map +1 -1
- package/dist/push-guard.d.ts.map +1 -1
- package/dist/push-guard.js +3 -7
- package/dist/push-guard.js.map +1 -1
- package/dist/push-options.js.map +1 -1
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +1 -2
- package/dist/resolver.js.map +1 -1
- package/dist/rules.d.ts.map +1 -1
- package/dist/rules.js +39 -13
- package/dist/rules.js.map +1 -1
- package/dist/service/browse-shared.d.ts +6 -0
- package/dist/service/browse-shared.d.ts.map +1 -0
- package/dist/service/browse-shared.js +26 -0
- package/dist/service/browse-shared.js.map +1 -0
- package/dist/service/browse.d.ts +20 -0
- package/dist/service/browse.d.ts.map +1 -0
- package/dist/service/browse.js +159 -0
- package/dist/service/browse.js.map +1 -0
- package/dist/service/find-product.d.ts +12 -0
- package/dist/service/find-product.d.ts.map +1 -0
- package/dist/service/find-product.js +51 -0
- package/dist/service/find-product.js.map +1 -0
- package/dist/service/helpers.d.ts +20 -0
- package/dist/service/helpers.d.ts.map +1 -0
- package/dist/service/helpers.js +163 -0
- package/dist/service/helpers.js.map +1 -0
- package/dist/service/import-flow.d.ts +6 -0
- package/dist/service/import-flow.d.ts.map +1 -0
- package/dist/service/import-flow.js +141 -0
- package/dist/service/import-flow.js.map +1 -0
- package/dist/service/import-list.d.ts +6 -0
- package/dist/service/import-list.d.ts.map +1 -0
- package/dist/service/import-list.js +103 -0
- package/dist/service/import-list.js.map +1 -0
- package/dist/service/index.d.ts +37 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +132 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/my-products.d.ts +7 -0
- package/dist/service/my-products.d.ts.map +1 -0
- package/dist/service/my-products.js +51 -0
- package/dist/service/my-products.js.map +1 -0
- package/dist/service/preview.d.ts +7 -0
- package/dist/service/preview.d.ts.map +1 -0
- package/dist/service/preview.js +235 -0
- package/dist/service/preview.js.map +1 -0
- package/dist/service/push-flow.d.ts +12 -0
- package/dist/service/push-flow.d.ts.map +1 -0
- package/dist/service/push-flow.js +251 -0
- package/dist/service/push-flow.js.map +1 -0
- package/dist/service/status.d.ts +6 -0
- package/dist/service/status.d.ts.map +1 -0
- package/dist/service/status.js +90 -0
- package/dist/service/status.js.map +1 -0
- package/dist/service.d.ts +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +23 -32
- package/dist/service.js.map +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +162 -114
- package/dist/tools.js.map +1 -1
- package/dist/types/dsers-api.d.ts +133 -0
- package/dist/types/dsers-api.d.ts.map +1 -0
- package/dist/types/dsers-api.js +2 -0
- package/dist/types/dsers-api.js.map +1 -0
- package/package.json +15 -5
package/README.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
# DSers MCP Product —
|
|
1
|
+
# DSers MCP Product — Dropshipping Automation: AliExpress to Shopify & Wix with AI
|
|
2
2
|
|
|
3
|
+
[](https://safeskill.dev/scan/@lofder/dsers-mcp-product)
|
|
3
4
|
[](https://smithery.ai/server/@dsersx/product-mcp)
|
|
4
5
|
[](https://www.npmjs.com/package/@lofder/dsers-mcp-product)
|
|
5
6
|
[](https://registry.modelcontextprotocol.io/servers/io.github.lofder/dsers-mcp-product)
|
|
6
7
|
[](https://glama.ai/mcp/servers/lofder/dsers-mcp-product)
|
|
7
8
|
|
|
8
|
-
> An open-source MCP server to automate DSers product import, bulk edit
|
|
9
|
+
> An open-source MCP server to automate DSers product sourcing, import, bulk edit, and push to Shopify or Wix using AI.
|
|
9
10
|
|
|
10
11
|
> [English](#english) | [中文](#中文)
|
|
11
12
|
|
|
@@ -15,13 +16,13 @@
|
|
|
15
16
|
|
|
16
17
|
## English
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
**DSers MCP Product** is an open-source [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server that lets AI Agents automate the entire DSers import workflow — from AliExpress / Alibaba / [Accio.com](https://www.accio.com/) product URL to Shopify or Wix store listing. Bulk import, batch edit variants, clean AliExpress titles, apply pricing rules, and push to multiple stores — all with a single sentence to your AI agent.
|
|
19
|
+
**DSers MCP Product** is an open-source [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server that lets AI Agents automate the entire DSers import workflow — from product sourcing to Shopify or Wix store listing. Search the DSers product pool, import from AliExpress / Alibaba / [Accio.com](https://www.accio.com/), bulk edit variants, apply pricing rules, and push to multiple stores — all with a single sentence to your AI agent.
|
|
21
20
|
|
|
22
21
|
#### What can it do?
|
|
23
22
|
|
|
23
|
+
- **Product sourcing** — search the DSers product pool by keyword or image, find products to sell
|
|
24
24
|
- **One-click import** — paste a product link, your AI agent imports it into DSers automatically
|
|
25
|
+
- **Browse your catalog** — view your import staging list and products already pushed to stores
|
|
25
26
|
- **Clean up titles** — strips the messy keyword-stuffed AliExpress titles into something readable
|
|
26
27
|
- **Pricing rules** — markup multiplier (e.g. 2.5x), fixed markup (e.g. +$5), compare-at / sale prices
|
|
27
28
|
- **Batch import** — import multiple products at once with a list of URLs
|
|
@@ -29,7 +30,7 @@
|
|
|
29
30
|
- **Safety checks** — automatically blocks pushes that would result in below-cost pricing, zero price, or zero stock
|
|
30
31
|
- **SEO optimization** — let AI rewrite the title and description for better search rankings before pushing
|
|
31
32
|
|
|
32
|
-
The server is hosted on [Vercel](https://
|
|
33
|
+
The server is hosted on [Vercel](https://ai.silentrillmcp.com/dropshipping/mcp) and published across multiple platforms:
|
|
33
34
|
|
|
34
35
|
### Available On
|
|
35
36
|
|
|
@@ -44,6 +45,7 @@ The server is hosted on [Vercel](https://dsers-mcp-product.vercel.app/api/mcp) a
|
|
|
44
45
|
| MCP Marketplace | [mcp-marketplace.io](https://mcp-marketplace.io/server/io-github-lofder-dsers-mcp-product) |
|
|
45
46
|
| awesome-mcp-servers | [punkpeye/awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers) |
|
|
46
47
|
| Dev.to | [Article: I Built an MCP Server to Automate Dropshipping](https://dev.to/_95a3e57463e6442feacd0/i-built-an-mcp-server-to-automate-dropshipping-product-imports-3m5b) |
|
|
48
|
+
| Dev.to | [Tutorial: How to Automate AliExpress to Shopify with AI](https://dev.to/_95a3e57463e6442feacd0/how-to-automate-aliexpress-to-shopify-product-import-with-ai-step-by-step-guide-3f5a) |
|
|
47
49
|
|
|
48
50
|
### Supported product sources
|
|
49
51
|
|
|
@@ -71,7 +73,6 @@ This works for both AliExpress and Alibaba products found on Accio.
|
|
|
71
73
|
| [ARCHITECTURE.md](ARCHITECTURE.md) | Three-layer architecture, directory structure, data flow |
|
|
72
74
|
| [USAGE.md](USAGE.md) | Installation, client config (Cursor, Claude Desktop), scenario examples |
|
|
73
75
|
| [SKILL.md](SKILL.md) | AI agent instruction file — workflow, rules, push options, error handling |
|
|
74
|
-
| [SKILL-CN.md](SKILL-CN.md) | Chinese human-readable guide for SKILL.md |
|
|
75
76
|
|
|
76
77
|
### What You Need
|
|
77
78
|
|
|
@@ -104,21 +105,33 @@ A browser window opens to the official DSers login page. You log in on DSers's o
|
|
|
104
105
|
|
|
105
106
|
That's it. No passwords in config files.
|
|
106
107
|
|
|
108
|
+
**Remote server (no install needed):**
|
|
109
|
+
|
|
110
|
+
If you don't want to install anything locally, you can connect directly to the hosted MCP server at `https://ai.silentrillmcp.com/dropshipping/mcp`. This works with any MCP client that supports Streamable HTTP transport. You'll be prompted to authorize with your DSers account on first connect.
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"mcpServers": {
|
|
115
|
+
"dropshipping": {
|
|
116
|
+
"url": "https://ai.silentrillmcp.com/dropshipping/mcp"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
107
122
|
Also listed on the official [MCP Registry](https://registry.modelcontextprotocol.io/servers/io.github.lofder/dsers-mcp-product).
|
|
108
123
|
|
|
109
|
-
### Authentication —
|
|
124
|
+
### Authentication — OAuth 2.1
|
|
110
125
|
|
|
111
126
|
Your DSers password **never touches this tool**. Here's how login works:
|
|
112
127
|
|
|
113
128
|
1. You run `npx @lofder/dsers-mcp-product login`
|
|
114
|
-
2. Your browser opens the
|
|
115
|
-
3. You
|
|
116
|
-
4. The tool
|
|
117
|
-
5. Done —
|
|
129
|
+
2. Your browser opens the DSers OAuth authorization page
|
|
130
|
+
3. You authorize access on DSers's own website
|
|
131
|
+
4. The tool receives an OAuth token and encrypts it locally
|
|
132
|
+
5. Done — the MCP server uses the token automatically. No passwords in config files.
|
|
118
133
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
**Sessions last about 6 hours.** When it expires, your AI agent will ask you to run `login` again — takes 10 seconds.
|
|
134
|
+
**Tokens refresh automatically** — a long-lived refresh token keeps your session active without manual re-login. You should rarely need to run `login` again.
|
|
122
135
|
|
|
123
136
|
**Switching accounts?**
|
|
124
137
|
|
|
@@ -127,7 +140,7 @@ npx @lofder/dsers-mcp-product logout
|
|
|
127
140
|
npx @lofder/dsers-mcp-product login
|
|
128
141
|
```
|
|
129
142
|
|
|
130
|
-
> **For developers:** The server also accepts
|
|
143
|
+
> **For developers:** The server also accepts `DSERS_ACCESS_TOKEN` and `DSERS_REFRESH_TOKEN` env vars for headless/CI environments.
|
|
131
144
|
|
|
132
145
|
### Usage Examples
|
|
133
146
|
|
|
@@ -139,6 +152,12 @@ Once set up, just talk to your AI agent in plain language:
|
|
|
139
152
|
|
|
140
153
|
> "Batch import these 3 products and push them all to my store: [URL1] [URL2] [URL3]"
|
|
141
154
|
|
|
155
|
+
> "Search for phone cases under $5 on the DSers product pool"
|
|
156
|
+
|
|
157
|
+
> "Show me what's in my import list"
|
|
158
|
+
|
|
159
|
+
> "What products have I pushed to my store?"
|
|
160
|
+
|
|
142
161
|
> "Push this product to all my connected stores"
|
|
143
162
|
|
|
144
163
|
> "Rewrite the title and description for SEO, then push to my store"
|
|
@@ -156,21 +175,11 @@ Or browse at [smithery.ai/server/@dsersx/product-mcp](https://smithery.ai/server
|
|
|
156
175
|
### Install from Source
|
|
157
176
|
|
|
158
177
|
```bash
|
|
159
|
-
# Clone
|
|
160
178
|
git clone https://github.com/lofder/dsers-mcp-product.git
|
|
161
179
|
cd dsers-mcp-product
|
|
162
|
-
|
|
163
|
-
# Install
|
|
164
180
|
npm install
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
cp .env.example .env
|
|
168
|
-
|
|
169
|
-
# Type check
|
|
170
|
-
npx tsc --noEmit
|
|
171
|
-
|
|
172
|
-
# Run with Smithery dev
|
|
173
|
-
npx @smithery/cli dev ./src/index.ts
|
|
181
|
+
npm run build
|
|
182
|
+
npm test
|
|
174
183
|
```
|
|
175
184
|
|
|
176
185
|
### Project Structure
|
|
@@ -178,32 +187,48 @@ npx @smithery/cli dev ./src/index.ts
|
|
|
178
187
|
```
|
|
179
188
|
dsers-mcp-product/
|
|
180
189
|
├── src/
|
|
181
|
-
│ ├──
|
|
182
|
-
│ ├──
|
|
183
|
-
│ ├──
|
|
190
|
+
│ ├── cli.ts # npx entry — stdio transport, login/logout
|
|
191
|
+
│ ├── index.ts # MCP server init, tool registration
|
|
192
|
+
│ ├── instructions.ts # Server-level prompts (agent instructions)
|
|
193
|
+
│ ├── tools.ts # 12 MCP tools — schema + handler
|
|
184
194
|
│ ├── rules.ts # Rule validation & application engine
|
|
195
|
+
│ ├── push-guard.ts # Pre-push safety checks
|
|
185
196
|
│ ├── push-options.ts # Push option normalization
|
|
186
197
|
│ ├── resolver.ts # URL normalization (AliExpress/Alibaba/Accio)
|
|
187
|
-
│ ├──
|
|
188
|
-
│
|
|
189
|
-
│
|
|
190
|
-
│
|
|
191
|
-
│
|
|
192
|
-
│
|
|
193
|
-
│
|
|
194
|
-
│
|
|
195
|
-
├──
|
|
196
|
-
├──
|
|
198
|
+
│ ├── provider/ # DSers API adapter (split by concern)
|
|
199
|
+
│ │ ├── index.ts # Provider class + interface
|
|
200
|
+
│ │ ├── store.ts # Store discovery, platform detection
|
|
201
|
+
│ │ ├── import-ops.ts # Import, save draft, delete
|
|
202
|
+
│ │ ├── push.ts # Push execution, shipping logistics
|
|
203
|
+
│ │ ├── normalize.ts # Data normalization
|
|
204
|
+
│ │ └── helpers.ts # Shared utilities
|
|
205
|
+
│ ├── service/ # Business logic orchestration
|
|
206
|
+
│ │ ├── index.ts # ImportFlowService class
|
|
207
|
+
│ │ ├── import-flow.ts # Import workflows
|
|
208
|
+
│ │ ├── push-flow.ts # Push workflows
|
|
209
|
+
│ │ ├── preview.ts # Preview & visibility
|
|
210
|
+
│ │ ├── status.ts # Job status & deletion
|
|
211
|
+
│ │ ├── import-list.ts # Import list browsing (with enrich)
|
|
212
|
+
│ │ ├── my-products.ts # Pushed products browsing
|
|
213
|
+
│ │ └── find-product.ts # Product pool search
|
|
214
|
+
│ ├── dsers/ # Low-level DSers API wrappers
|
|
215
|
+
│ │ ├── config.ts # Configuration
|
|
216
|
+
│ │ ├── auth.ts # Session management
|
|
217
|
+
│ │ ├── client.ts # Authenticated HTTP client
|
|
218
|
+
│ │ ├── account.ts # Store & user APIs
|
|
219
|
+
│ │ ├── product.ts # Product & import APIs
|
|
220
|
+
│ │ └── settings.ts # Shipping, pricing, billing APIs
|
|
221
|
+
│ └── auth/ # Browser login (CDP)
|
|
222
|
+
├── test/ # Vitest unit tests (298 tests)
|
|
197
223
|
├── package.json
|
|
198
|
-
|
|
199
|
-
└── .env.example
|
|
224
|
+
└── tsconfig.json
|
|
200
225
|
```
|
|
201
226
|
|
|
202
|
-
###
|
|
227
|
+
### Twelve Tools
|
|
203
228
|
|
|
204
229
|
| # | Tool | What it does |
|
|
205
230
|
|---|------|-------------|
|
|
206
|
-
| 1 | `dsers_store_discover` | See your connected stores,
|
|
231
|
+
| 1 | `dsers_store_discover` | See your connected stores, shipping methods, pricing rules, and capabilities |
|
|
207
232
|
| 2 | `dsers_rules_validate` | Test your pricing or title rules before applying — catches mistakes early |
|
|
208
233
|
| 3 | `dsers_product_import` | Paste a product URL, optionally apply pricing/title rules, and get a preview before pushing |
|
|
209
234
|
| 4 | `dsers_product_preview` | Review a product you already imported — title, price, variants, stock at a glance |
|
|
@@ -212,8 +237,11 @@ dsers-mcp-product/
|
|
|
212
237
|
| 7 | `dsers_store_push` | Send products to your Shopify or Wix store — one at a time, in bulk, or to all stores at once |
|
|
213
238
|
| 8 | `dsers_job_status` | Check if a push finished and whether it succeeded |
|
|
214
239
|
| 9 | `dsers_product_delete` | Delete a product from the DSers import list (irreversible, requires confirmation) |
|
|
240
|
+
| 10 | `dsers_import_list` | Browse your import staging list with cost & sell price, stock, markup status |
|
|
241
|
+
| 11 | `dsers_my_products` | See products already pushed to a store, with supplier links for re-import |
|
|
242
|
+
| 12 | `dsers_find_product` | Search the DSers product pool by keyword or image — results link directly to import |
|
|
215
243
|
|
|
216
|
-
All tools return clear error messages so your AI agent knows what went wrong and what to do next
|
|
244
|
+
All tools return clear error messages so your AI agent knows what went wrong and what to do next.
|
|
217
245
|
|
|
218
246
|
### Pre-Push Safety Checks
|
|
219
247
|
|
|
@@ -252,11 +280,38 @@ Ready-made workflows your AI client can use directly:
|
|
|
252
280
|
|
|
253
281
|
### What's Next
|
|
254
282
|
|
|
283
|
+
- Product pool search enhancements (category filters, URL-based search, product detail view)
|
|
255
284
|
- Support more store platforms that DSers already connects to (eBay, Wish, etc.)
|
|
256
285
|
- Smarter pricing rule templates
|
|
257
286
|
- More granular inventory sync options
|
|
258
287
|
|
|
259
|
-
Got an idea or feature request? [Open an issue](https://github.com/lofder/dsers-mcp-product/issues) —
|
|
288
|
+
Got an idea or feature request? [Open an issue](https://github.com/lofder/dsers-mcp-product/issues) — contributions are very welcome.
|
|
289
|
+
|
|
290
|
+
### FAQ
|
|
291
|
+
|
|
292
|
+
**What is DSers MCP Product?**
|
|
293
|
+
DSers MCP Product is a free, open-source MCP server that automates dropshipping product imports from AliExpress, Alibaba, and 1688 to Shopify and Wix stores using AI agents like Claude and Cursor. Instead of manually copying product data, you tell your AI agent what to do in plain English.
|
|
294
|
+
|
|
295
|
+
**How does it work?**
|
|
296
|
+
You type a command like "Import this product, mark up 2.5x, push to my store" in Cursor or Claude Desktop. The MCP server handles the entire workflow: fetching product data, applying pricing rules, editing variants, and pushing to your connected stores.
|
|
297
|
+
|
|
298
|
+
**Is it free?**
|
|
299
|
+
Yes. The tool is open-source (MIT license) and completely free to use. You only need a free DSers account and a Shopify or Wix store connected in DSers.
|
|
300
|
+
|
|
301
|
+
**Is it safe? Do I need to share my password?**
|
|
302
|
+
No passwords are stored or transmitted. Authentication uses a zero-password browser login — you log in on DSers's own website, and the tool picks up the session token. Your credentials never touch the MCP server. The project scored 92/100 on [SafeSkill](https://safeskill.dev/scan/@lofder/dsers-mcp-product) security scanning.
|
|
303
|
+
|
|
304
|
+
**What AI clients does it support?**
|
|
305
|
+
Cursor, Claude Desktop, Claude Code, Windsurf, and any MCP-compatible client that supports stdio transport.
|
|
306
|
+
|
|
307
|
+
**How is this different from AliDropify, AutoDS, or other dropshipping tools?**
|
|
308
|
+
Most dropshipping tools have their own UI and require you to click through web interfaces. DSers MCP Product takes a fundamentally different approach — it connects directly to your AI agent, so you automate workflows through conversation instead of clicking buttons. It's also open-source and free, with no subscription tiers.
|
|
309
|
+
|
|
310
|
+
**What product sources does it support?**
|
|
311
|
+
AliExpress, Alibaba.com, Accio.com (Alibaba's AI sourcing tool), and 1688 (requires DSers authorization).
|
|
312
|
+
|
|
313
|
+
**Can I push to multiple stores at once?**
|
|
314
|
+
Yes. The `dsers_store_push` tool supports pushing a single product to all your connected Shopify and Wix stores in one command, with per-store pricing and visibility options.
|
|
260
315
|
|
|
261
316
|
### Also Available
|
|
262
317
|
|
|
@@ -272,13 +327,13 @@ MIT
|
|
|
272
327
|
|
|
273
328
|
## 中文
|
|
274
329
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
**DSers MCP Product** 是一个开源的 [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) 服务器,让 AI Agent 自动完成 DSers 的整个商品导入流程 —— 从速卖通 / Alibaba / [Accio.com](https://www.accio.com/) 商品链接到 Shopify 或 Wix 店铺上架。批量导入、批量编辑变体、清理速卖通标题、应用定价规则、推送到多个店铺 —— 只需一句话给你的 AI agent。
|
|
330
|
+
**DSers MCP Product** 是一个开源的 [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) 服务器,让 AI Agent 自动完成 DSers 的整个商品流程 —— 从选品搜索到 Shopify 或 Wix 店铺上架。搜索 DSers 商品池、从速卖通 / Alibaba / [Accio.com](https://www.accio.com/) 导入商品、批量编辑变体、应用定价规则、推送到多个店铺 —— 只需一句话给你的 AI agent。
|
|
278
331
|
|
|
279
332
|
#### 能做什么?
|
|
280
333
|
|
|
334
|
+
- **选品搜索** — 在 DSers 商品池里按关键词或图片搜索,找到值得卖的商品
|
|
281
335
|
- **一句话导入** — 贴个商品链接,AI 助手自动导入到 DSers
|
|
336
|
+
- **浏览商品库** — 查看导入待推送列表和已上架商品,包含成本价、售价、加价状态
|
|
282
337
|
- **标题清理** — 把速卖通那些关键词堆砌的乱标题整理成人话
|
|
283
338
|
- **定价规则** — 加价倍率(比如 2.5 倍)、固定加价(比如 +5 美金)、划线价
|
|
284
339
|
- **批量导入** — 一次丢一堆链接,全部导入
|
|
@@ -286,7 +341,7 @@ MIT
|
|
|
286
341
|
- **安全校验** — 推送前自动拦截低于成本价、零售价为零、库存为零的商品
|
|
287
342
|
- **SEO 优化** — 让 AI 重写标题和描述,提高搜索排名后再推送
|
|
288
343
|
|
|
289
|
-
服务已托管在 [Vercel](https://
|
|
344
|
+
服务已托管在 [Vercel](https://ai.silentrillmcp.com/dropshipping/mcp),并发布到多个平台:
|
|
290
345
|
|
|
291
346
|
### 发布平台
|
|
292
347
|
|
|
@@ -301,6 +356,7 @@ MIT
|
|
|
301
356
|
| MCP Marketplace | [mcp-marketplace.io](https://mcp-marketplace.io/server/io-github-lofder-dsers-mcp-product) |
|
|
302
357
|
| awesome-mcp-servers | [punkpeye/awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers) |
|
|
303
358
|
| Dev.to | [技术文章:I Built an MCP Server to Automate Dropshipping](https://dev.to/_95a3e57463e6442feacd0/i-built-an-mcp-server-to-automate-dropshipping-product-imports-3m5b) |
|
|
359
|
+
| Dev.to | [教程:How to Automate AliExpress to Shopify with AI](https://dev.to/_95a3e57463e6442feacd0/how-to-automate-aliexpress-to-shopify-product-import-with-ai-step-by-step-guide-3f5a) |
|
|
304
360
|
|
|
305
361
|
### 支持的商品来源
|
|
306
362
|
|
|
@@ -328,7 +384,6 @@ Accio 上搜出来的速卖通和阿里巴巴商品都能用。
|
|
|
328
384
|
| [ARCHITECTURE.md](ARCHITECTURE.md) | 三层架构、目录结构、数据流 |
|
|
329
385
|
| [USAGE.md](USAGE.md) | 安装、客户端配置(Cursor、Claude Desktop)、使用场景 |
|
|
330
386
|
| [SKILL.md](SKILL.md) | AI agent 指令文件 — 工作流、规则、推送选项、错误处理 |
|
|
331
|
-
| [SKILL-CN.md](SKILL-CN.md) | SKILL.md 的中文说明 |
|
|
332
387
|
|
|
333
388
|
### 使用前提
|
|
334
389
|
|
|
@@ -361,21 +416,33 @@ npx @lofder/dsers-mcp-product login
|
|
|
361
416
|
|
|
362
417
|
搞定。配置文件里不需要任何密码。
|
|
363
418
|
|
|
419
|
+
**在线版(免安装):**
|
|
420
|
+
|
|
421
|
+
如果不想在本地安装,可以直接连接托管的 MCP 服务端 `https://ai.silentrillmcp.com/dropshipping/mcp`。支持 Streamable HTTP transport 的 MCP 客户端都能用,首次连接会引导你授权 DSers 账号。
|
|
422
|
+
|
|
423
|
+
```json
|
|
424
|
+
{
|
|
425
|
+
"mcpServers": {
|
|
426
|
+
"dropshipping": {
|
|
427
|
+
"url": "https://ai.silentrillmcp.com/dropshipping/mcp"
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
364
433
|
同时已收录到官方 [MCP Registry](https://registry.modelcontextprotocol.io/servers/io.github.lofder/dsers-mcp-product)。
|
|
365
434
|
|
|
366
|
-
### 授权认证 —
|
|
435
|
+
### 授权认证 — OAuth 2.1
|
|
367
436
|
|
|
368
437
|
你的 DSers 密码**完全不经过本工具**。登录过程是这样的:
|
|
369
438
|
|
|
370
439
|
1. 运行 `npx @lofder/dsers-mcp-product login`
|
|
371
|
-
2. 浏览器自动打开 DSers
|
|
372
|
-
3. 你在 DSers
|
|
373
|
-
4.
|
|
440
|
+
2. 浏览器自动打开 DSers OAuth 授权页
|
|
441
|
+
3. 你在 DSers 网站上授权
|
|
442
|
+
4. 工具拿到 OAuth token,加密存到本地
|
|
374
443
|
5. 搞定 — 之后 MCP 直接能用,配置文件里不需要写任何密码
|
|
375
444
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
**登录大约 6 小时有效。** 过期了 AI 助手会提醒你重新跑一下 `login`,10 秒的事。
|
|
445
|
+
**Token 自动续期** — refresh token 会自动保持登录状态,你基本不需要重新登录。
|
|
379
446
|
|
|
380
447
|
**换账号?**
|
|
381
448
|
|
|
@@ -384,7 +451,7 @@ npx @lofder/dsers-mcp-product logout
|
|
|
384
451
|
npx @lofder/dsers-mcp-product login
|
|
385
452
|
```
|
|
386
453
|
|
|
387
|
-
> **开发者注:** headless / CI
|
|
454
|
+
> **开发者注:** headless / CI 环境支持通过 `DSERS_ACCESS_TOKEN` 和 `DSERS_REFRESH_TOKEN` 环境变量传入凭据。
|
|
388
455
|
|
|
389
456
|
### 使用示例
|
|
390
457
|
|
|
@@ -396,6 +463,12 @@ npx @lofder/dsers-mcp-product login
|
|
|
396
463
|
|
|
397
464
|
> "批量导入这 3 个商品,全部推到店铺:[链接1] [链接2] [链接3]"
|
|
398
465
|
|
|
466
|
+
> "帮我搜一下 5 美金以下的手机壳"
|
|
467
|
+
|
|
468
|
+
> "看下我的导入列表里有什么"
|
|
469
|
+
|
|
470
|
+
> "我已经推送了哪些商品到店铺?"
|
|
471
|
+
|
|
399
472
|
> "把这个商品推到我所有店铺"
|
|
400
473
|
|
|
401
474
|
> "帮我把标题和描述重写一下做 SEO 优化,然后推送"
|
|
@@ -413,24 +486,14 @@ npx @smithery/cli mcp add @dsersx/product-mcp --client cursor
|
|
|
413
486
|
### 从源码安装
|
|
414
487
|
|
|
415
488
|
```bash
|
|
416
|
-
# 克隆
|
|
417
489
|
git clone https://github.com/lofder/dsers-mcp-product.git
|
|
418
490
|
cd dsers-mcp-product
|
|
419
|
-
|
|
420
|
-
# 安装
|
|
421
491
|
npm install
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
cp .env.example .env
|
|
425
|
-
|
|
426
|
-
# 类型检查
|
|
427
|
-
npx tsc --noEmit
|
|
428
|
-
|
|
429
|
-
# 开发运行
|
|
430
|
-
npx @smithery/cli dev ./src/index.ts
|
|
492
|
+
npm run build
|
|
493
|
+
npm test
|
|
431
494
|
```
|
|
432
495
|
|
|
433
|
-
###
|
|
496
|
+
### 十二个工具
|
|
434
497
|
|
|
435
498
|
| # | 工具 | 干什么的 |
|
|
436
499
|
|---|------|---------|
|
|
@@ -443,8 +506,11 @@ npx @smithery/cli dev ./src/index.ts
|
|
|
443
506
|
| 7 | `dsers_store_push` | 把商品推到你的 Shopify 或 Wix 店铺 — 单个推、批量推、或一次推到所有店铺 |
|
|
444
507
|
| 8 | `dsers_job_status` | 看看推送完了没、成功了没 |
|
|
445
508
|
| 9 | `dsers_product_delete` | 从 DSers 导入列表中删除商品(不可恢复,需确认) |
|
|
509
|
+
| 10 | `dsers_import_list` | 浏览导入待推送列表,含成本价、售价、库存、加价状态 |
|
|
510
|
+
| 11 | `dsers_my_products` | 查看已推到店铺的商品,带供应商链接方便重新导入 |
|
|
511
|
+
| 12 | `dsers_find_product` | 在 DSers 商品池搜索,支持关键词和以图搜图,结果可直接导入 |
|
|
446
512
|
|
|
447
|
-
报错时会返回清晰的消息,AI
|
|
513
|
+
报错时会返回清晰的消息,AI 助手能看懂出了什么问题、该怎么办。
|
|
448
514
|
|
|
449
515
|
### 推送前安全校验
|
|
450
516
|
|
|
@@ -475,12 +541,36 @@ MCP 客户端可直接展示给用户的工作流模板:
|
|
|
475
541
|
|
|
476
542
|
### 后续计划
|
|
477
543
|
|
|
544
|
+
- 商品池搜索增强(分类过滤、URL 搜索、商品详情查看)
|
|
478
545
|
- 支持更多 DSers 已接入的店铺平台(eBay、Wish 等)
|
|
479
546
|
- 更智能的定价规则模板
|
|
480
547
|
- 更精细的库存同步选项
|
|
481
548
|
|
|
482
549
|
有想法或需求?欢迎 [提 issue](https://github.com/lofder/dsers-mcp-product/issues) —— 非常欢迎其他开发者的建议和贡献。
|
|
483
550
|
|
|
551
|
+
### 常见问题
|
|
552
|
+
|
|
553
|
+
**DSers MCP Product 是什么?**
|
|
554
|
+
一个免费开源的 MCP 服务器,让 AI Agent(如 Claude、Cursor)自动完成从速卖通/Alibaba/1688 到 Shopify/Wix 店铺的商品导入全流程。不用手动复制商品数据,用自然语言对话就能操作。
|
|
555
|
+
|
|
556
|
+
**怎么用?**
|
|
557
|
+
在 Cursor 或 Claude Desktop 里输入"导入这个商品,加价 2.5 倍,推送到我的店铺",MCP 服务器自动完成抓取商品数据、应用定价规则、编辑变体、推送到店铺的全部流程。
|
|
558
|
+
|
|
559
|
+
**收费吗?**
|
|
560
|
+
完全免费。项目开源(MIT 协议),你只需要一个免费的 DSers 账号和已连接的 Shopify 或 Wix 店铺。
|
|
561
|
+
|
|
562
|
+
**安全吗?需要提供密码吗?**
|
|
563
|
+
不需要。登录采用零密码浏览器认证——你在 DSers 官网登录,工具只接收会话令牌,密码永远不会经过 MCP 服务器。项目在 [SafeSkill](https://safeskill.dev/scan/@lofder/dsers-mcp-product) 安全扫描中获得 92/100 分。
|
|
564
|
+
|
|
565
|
+
**支持哪些 AI 客户端?**
|
|
566
|
+
Cursor、Claude Desktop、Claude Code、Windsurf,以及任何支持 stdio 传输的 MCP 兼容客户端。
|
|
567
|
+
|
|
568
|
+
**和 AliDropify、AutoDS 等 Dropshipping 工具有什么区别?**
|
|
569
|
+
大多数 Dropshipping 工具有自己的界面,需要点来点去。DSers MCP Product 完全不同——它直接连接你的 AI Agent,用对话代替点击来自动化工作流。而且完全开源免费,没有订阅分级。
|
|
570
|
+
|
|
571
|
+
**能同时推送到多个店铺吗?**
|
|
572
|
+
可以。`dsers_store_push` 支持一条命令将商品推送到所有已连接的 Shopify 和 Wix 店铺,支持按店铺设置不同的定价和可见性。
|
|
573
|
+
|
|
484
574
|
### 其他版本
|
|
485
575
|
|
|
486
576
|
也提供 [Python 版本](https://github.com/lofder/dsers-mcp-product-py),适用于本地 stdio 部署。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export declare function
|
|
1
|
+
/**
|
|
2
|
+
* Open a URL in the system's default browser.
|
|
3
|
+
* Uses spawn() with explicit arguments to avoid command injection.
|
|
4
|
+
*/
|
|
5
|
+
export declare function openBrowser(url: string): void;
|
|
6
6
|
//# sourceMappingURL=browser-finder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-finder.d.ts","sourceRoot":"","sources":["../../src/auth/browser-finder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser-finder.d.ts","sourceRoot":"","sources":["../../src/auth/browser-finder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAW7C"}
|
|
@@ -1,99 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
];
|
|
13
|
-
const LINUX_COMMANDS = [
|
|
14
|
-
["Google Chrome", "google-chrome-stable"],
|
|
15
|
-
["Google Chrome", "google-chrome"],
|
|
16
|
-
["Chromium", "chromium-browser"],
|
|
17
|
-
["Chromium", "chromium"],
|
|
18
|
-
["Microsoft Edge", "microsoft-edge-stable"],
|
|
19
|
-
["Microsoft Edge", "microsoft-edge"],
|
|
20
|
-
["Brave Browser", "brave-browser"],
|
|
21
|
-
["Brave Browser", "brave-browser-stable"],
|
|
22
|
-
["Opera", "opera"],
|
|
23
|
-
["Vivaldi", "vivaldi-stable"],
|
|
24
|
-
["Vivaldi", "vivaldi"],
|
|
25
|
-
];
|
|
26
|
-
const WIN_PATHS = [
|
|
27
|
-
["Google Chrome", "Google\\Chrome\\Application\\chrome.exe"],
|
|
28
|
-
["Microsoft Edge", "Microsoft\\Edge\\Application\\msedge.exe"],
|
|
29
|
-
["Brave Browser", "BraveSoftware\\Brave-Browser\\Application\\brave.exe"],
|
|
30
|
-
["Opera", "Opera\\opera.exe"],
|
|
31
|
-
["Vivaldi", "Vivaldi\\Application\\vivaldi.exe"],
|
|
32
|
-
["Chromium", "Chromium\\Application\\chrome.exe"],
|
|
33
|
-
];
|
|
34
|
-
function whichSync(cmd) {
|
|
35
|
-
if (!/^[a-z0-9._-]+$/i.test(cmd))
|
|
36
|
-
return null;
|
|
37
|
-
try {
|
|
38
|
-
return execSync(`which ${cmd} 2>/dev/null`, { encoding: "utf-8", timeout: 3000 }).trim() || null;
|
|
1
|
+
/**
|
|
2
|
+
* Open a URL in the system's default browser.
|
|
3
|
+
* Uses spawn() with explicit arguments to avoid command injection.
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
export function openBrowser(url) {
|
|
7
|
+
const cmd = process.platform === "darwin" ? "open"
|
|
8
|
+
: process.platform === "win32" ? "cmd"
|
|
9
|
+
: "xdg-open";
|
|
10
|
+
if (process.platform === "win32") {
|
|
11
|
+
spawnSync(cmd, ["/c", "start", "", url], { stdio: "ignore" });
|
|
39
12
|
}
|
|
40
|
-
|
|
41
|
-
|
|
13
|
+
else {
|
|
14
|
+
spawnSync(cmd, [url], { stdio: "ignore" });
|
|
42
15
|
}
|
|
43
16
|
}
|
|
44
|
-
function findOnMacOS() {
|
|
45
|
-
for (const [name, p] of MACOS_BROWSERS) {
|
|
46
|
-
if (existsSync(p))
|
|
47
|
-
return { name, path: p };
|
|
48
|
-
}
|
|
49
|
-
// mdfind fallback for non-standard install locations
|
|
50
|
-
try {
|
|
51
|
-
const result = execSync('mdfind "kMDItemCFBundleIdentifier == com.google.Chrome" 2>/dev/null', { encoding: "utf-8", timeout: 3000 }).trim();
|
|
52
|
-
if (result) {
|
|
53
|
-
const appPath = result.split("\n")[0];
|
|
54
|
-
const execPath = join(appPath, "Contents/MacOS/Google Chrome");
|
|
55
|
-
if (existsSync(execPath))
|
|
56
|
-
return { name: "Google Chrome", path: execPath };
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch { /* mdfind unavailable or timed out */ }
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
function findOnLinux() {
|
|
63
|
-
for (const [name, cmd] of LINUX_COMMANDS) {
|
|
64
|
-
const p = whichSync(cmd);
|
|
65
|
-
if (p)
|
|
66
|
-
return { name, path: p };
|
|
67
|
-
}
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
function findOnWindows() {
|
|
71
|
-
const roots = [
|
|
72
|
-
process.env.PROGRAMFILES ?? "C:\\Program Files",
|
|
73
|
-
process.env["PROGRAMFILES(X86)"] ?? "C:\\Program Files (x86)",
|
|
74
|
-
process.env.LOCALAPPDATA ?? "",
|
|
75
|
-
].filter(Boolean);
|
|
76
|
-
for (const [name, rel] of WIN_PATHS) {
|
|
77
|
-
for (const root of roots) {
|
|
78
|
-
const full = join(root, rel);
|
|
79
|
-
if (existsSync(full))
|
|
80
|
-
return { name, path: full };
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// Edge is pre-installed on Windows 10+ in a special location
|
|
84
|
-
const edgeSys = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
|
|
85
|
-
if (existsSync(edgeSys))
|
|
86
|
-
return { name: "Microsoft Edge", path: edgeSys };
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
export function findChromiumBrowser() {
|
|
90
|
-
const platform = process.platform;
|
|
91
|
-
if (platform === "darwin")
|
|
92
|
-
return findOnMacOS();
|
|
93
|
-
if (platform === "linux")
|
|
94
|
-
return findOnLinux();
|
|
95
|
-
if (platform === "win32")
|
|
96
|
-
return findOnWindows();
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
17
|
//# sourceMappingURL=browser-finder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-finder.js","sourceRoot":"","sources":["../../src/auth/browser-finder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"browser-finder.js","sourceRoot":"","sources":["../../src/auth/browser-finder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM;QACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK;YACtC,CAAC,CAAC,UAAU,CAAC;IAEf,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdp-session.d.ts","sourceRoot":"","sources":["../../src/auth/cdp-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cdp-session.d.ts","sourceRoot":"","sources":["../../src/auth/cdp-session.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAyQD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAe,GACpC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAqGhC"}
|