marketnow-mcp 1.0.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/LICENSE +21 -0
- package/README.md +124 -0
- package/index.js +282 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 MarketNow
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# MarketNow MCP Server
|
|
2
|
+
|
|
3
|
+
> Search, discover, and install MCP skills from any agent runtime.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/marketnow-mcp)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
The [MarketNow](https://marketnow.site) marketplace as an MCP server. Allows any MCP-compatible agent (Claude Desktop, Cursor, Cline, etc.) to search and discover skills directly from their runtime — without leaving the conversation.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g marketnow-mcp
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Or use directly with npx (no install needed):
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx marketnow-mcp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
### Claude Desktop
|
|
25
|
+
|
|
26
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"mcpServers": {
|
|
31
|
+
"marketnow": {
|
|
32
|
+
"command": "npx",
|
|
33
|
+
"args": ["-y", "marketnow-mcp"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Cursor
|
|
40
|
+
|
|
41
|
+
Add to Settings → MCP:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"mcpServers": {
|
|
46
|
+
"marketnow": {
|
|
47
|
+
"command": "npx",
|
|
48
|
+
"args": ["-y", "marketnow-mcp"]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Cline / VS Code
|
|
55
|
+
|
|
56
|
+
Add to your MCP config:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"marketnow": {
|
|
62
|
+
"command": "npx",
|
|
63
|
+
"args": ["-y", "marketnow-mcp"],
|
|
64
|
+
"env": {}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Tools Exposed
|
|
71
|
+
|
|
72
|
+
| Tool | Description |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `search_skills` | Search skills by query, category, or max price |
|
|
75
|
+
| `get_skill` | Get full details of a specific skill |
|
|
76
|
+
| `list_categories` | List all 25 categories with counts |
|
|
77
|
+
| `get_manifest` | Get marketplace metadata (totals, pricing) |
|
|
78
|
+
| `get_install_command` | Get the npx install command for a skill |
|
|
79
|
+
|
|
80
|
+
## Example Usage
|
|
81
|
+
|
|
82
|
+
Once connected, you can ask Claude:
|
|
83
|
+
|
|
84
|
+
- "Find me a skill to scrape websites and extract prices"
|
|
85
|
+
- "What's the cheapest AI/ML skill on MarketNow?"
|
|
86
|
+
- "Show me all skills in the Security category"
|
|
87
|
+
- "Get the install command for mn-ai-00001"
|
|
88
|
+
|
|
89
|
+
Claude will use the MarketNow MCP server to search the marketplace and return results with prices, descriptions, and install commands.
|
|
90
|
+
|
|
91
|
+
## How It Works
|
|
92
|
+
|
|
93
|
+
The MCP server fetches the public API at `https://marketnow.site/api/skills.json` (cached for 1 hour). It exposes 5 tools that agents can call to discover skills without leaving their runtime.
|
|
94
|
+
|
|
95
|
+
- **No API key required** for read operations
|
|
96
|
+
- **CORS-enabled** — works from browser and Node.js
|
|
97
|
+
- **1-hour cache** — minimizes bandwidth and latency
|
|
98
|
+
- **5,000+ skills** — the largest curated MCP skill catalog
|
|
99
|
+
|
|
100
|
+
To purchase a skill, the agent opens the buy URL in a browser.
|
|
101
|
+
|
|
102
|
+
## Pricing
|
|
103
|
+
|
|
104
|
+
All skills on MarketNow are micro-priced:
|
|
105
|
+
|
|
106
|
+
- **$0.99** — utility, single-function MCP servers
|
|
107
|
+
- **$1.99** — standard integrations
|
|
108
|
+
- **$2.99** — multi-feature tools (most common)
|
|
109
|
+
- **$4.99** — sophisticated multi-endpoint tools
|
|
110
|
+
- **$9.99** — enterprise-grade, specialized
|
|
111
|
+
|
|
112
|
+
Average price: **$2.50**. One-time payment, lifetime license. No subscriptions.
|
|
113
|
+
|
|
114
|
+
## Links
|
|
115
|
+
|
|
116
|
+
- **Website**: [https://marketnow.site](https://marketnow.site)
|
|
117
|
+
- **Registry**: [https://marketnow.site/registry](https://marketnow.site/registry)
|
|
118
|
+
- **Submit a skill**: [https://marketnow.site/submit](https://marketnow.site/submit)
|
|
119
|
+
- **API docs**: [https://marketnow.site/api/agent.json](https://marketnow.site/api/agent.json)
|
|
120
|
+
- **GitHub**: [https://github.com/edgarfloresguerra2011-a11y/marketnow](https://github.com/edgarfloresguerra2011-a11y/marketnow)
|
|
121
|
+
|
|
122
|
+
## License
|
|
123
|
+
|
|
124
|
+
MIT
|
package/index.js
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MarketNow MCP Server
|
|
4
|
+
* ====================
|
|
5
|
+
*
|
|
6
|
+
* El propio MarketNow como un MCP server. Permite a cualquier agente
|
|
7
|
+
* compatible con MCP (Claude, Cursor, etc.) buscar y descubrir skills
|
|
8
|
+
* del marketplace directamente desde su runtime.
|
|
9
|
+
*
|
|
10
|
+
* Herramientas expuestas:
|
|
11
|
+
* - search_skills(query, category?, max_price?) → lista de skills matching
|
|
12
|
+
* - get_skill(skill_id) → detalle de una skill específica
|
|
13
|
+
* - list_categories() → todas las categorías con count
|
|
14
|
+
* - get_manifest() → metadata del marketplace (totals, pricing, etc.)
|
|
15
|
+
* - get_install_command(skill_id) → comando npx para instalar la skill
|
|
16
|
+
*
|
|
17
|
+
* Uso:
|
|
18
|
+
* npx @marketnow/mcp-server
|
|
19
|
+
*
|
|
20
|
+
* O añadir a tu agente (ej. Claude Desktop):
|
|
21
|
+
* {
|
|
22
|
+
* "mcpServers": {
|
|
23
|
+
* "marketnow": {
|
|
24
|
+
* "command": "npx",
|
|
25
|
+
* "args": ["-y", "@marketnow/mcp-server"]
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
32
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
33
|
+
import {
|
|
34
|
+
CallToolRequestSchema,
|
|
35
|
+
ListToolsRequestSchema,
|
|
36
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
37
|
+
|
|
38
|
+
const API_BASE = 'https://marketnow.site/api';
|
|
39
|
+
|
|
40
|
+
// ─── Fetch helpers ──────────────────────────────────────────────────────────
|
|
41
|
+
let skillsCache = null;
|
|
42
|
+
let cacheTime = 0;
|
|
43
|
+
const CACHE_TTL = 3600_000; // 1 hour
|
|
44
|
+
|
|
45
|
+
async function fetchSkills() {
|
|
46
|
+
if (skillsCache && Date.now() - cacheTime < CACHE_TTL) {
|
|
47
|
+
return skillsCache;
|
|
48
|
+
}
|
|
49
|
+
const res = await fetch(`${API_BASE}/skills.json`);
|
|
50
|
+
if (!res.ok) throw new Error(`Failed to fetch skills: ${res.status}`);
|
|
51
|
+
skillsCache = await res.json();
|
|
52
|
+
cacheTime = Date.now();
|
|
53
|
+
return skillsCache;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function fetchManifest() {
|
|
57
|
+
const res = await fetch(`${API_BASE}/manifest.json`);
|
|
58
|
+
if (!res.ok) throw new Error(`Failed to fetch manifest: ${res.status}`);
|
|
59
|
+
return res.json();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function fetchCategories() {
|
|
63
|
+
const res = await fetch(`${API_BASE}/categories.json`);
|
|
64
|
+
if (!res.ok) throw new Error(`Failed to fetch categories: ${res.status}`);
|
|
65
|
+
return res.json();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ─── Tool implementations ───────────────────────────────────────────────────
|
|
69
|
+
async function searchSkills(args) {
|
|
70
|
+
const { query = '', category, max_price, limit = 10 } = args;
|
|
71
|
+
const skills = await fetchSkills();
|
|
72
|
+
|
|
73
|
+
let results = skills;
|
|
74
|
+
|
|
75
|
+
if (category) {
|
|
76
|
+
results = results.filter(s => s.category?.toLowerCase() === category.toLowerCase());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (max_price !== undefined) {
|
|
80
|
+
results = results.filter(s => s.price <= max_price);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (query) {
|
|
84
|
+
const q = query.toLowerCase();
|
|
85
|
+
results = results
|
|
86
|
+
.map(s => {
|
|
87
|
+
const nameMatch = (s.name || '').toLowerCase().includes(q) ? 10 : 0;
|
|
88
|
+
const descMatch = (s.description || '').toLowerCase().includes(q) ? 5 : 0;
|
|
89
|
+
const tagMatch = (s.tags || []).some(t => String(t).toLowerCase().includes(q)) ? 8 : 0;
|
|
90
|
+
const score = nameMatch + descMatch + tagMatch;
|
|
91
|
+
return { skill: s, score };
|
|
92
|
+
})
|
|
93
|
+
.filter(x => x.score > 0)
|
|
94
|
+
.sort((a, b) => b.score - a.score)
|
|
95
|
+
.slice(0, limit)
|
|
96
|
+
.map(x => x.skill);
|
|
97
|
+
} else {
|
|
98
|
+
results = results.slice(0, limit);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
count: results.length,
|
|
103
|
+
skills: results.map(s => ({
|
|
104
|
+
id: s.id,
|
|
105
|
+
name: s.name,
|
|
106
|
+
slug: s.slug,
|
|
107
|
+
description: s.description?.slice(0, 200),
|
|
108
|
+
category: s.category,
|
|
109
|
+
price: s.price,
|
|
110
|
+
currency: s.currency || 'USD',
|
|
111
|
+
install: s.install,
|
|
112
|
+
sentinel_score: s.sentinel_score,
|
|
113
|
+
url: `https://marketnow.site/skill/${s.id}`,
|
|
114
|
+
})),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function getSkill(args) {
|
|
119
|
+
const { skill_id } = args;
|
|
120
|
+
if (!skill_id) throw new Error('skill_id is required');
|
|
121
|
+
const skills = await fetchSkills();
|
|
122
|
+
const skill = skills.find(s => s.id === skill_id || s.slug === skill_id);
|
|
123
|
+
if (!skill) throw new Error(`Skill not found: ${skill_id}`);
|
|
124
|
+
return {
|
|
125
|
+
...skill,
|
|
126
|
+
url: `https://marketnow.site/skill/${skill.id}`,
|
|
127
|
+
buy_url: `https://marketnow.site/skill/${skill.id}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function listCategories() {
|
|
132
|
+
return await fetchCategories();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function getInstallCommand(args) {
|
|
136
|
+
const { skill_id } = args;
|
|
137
|
+
if (!skill_id) throw new Error('skill_id is required');
|
|
138
|
+
const skills = await fetchSkills();
|
|
139
|
+
const skill = skills.find(s => s.id === skill_id || s.slug === skill_id);
|
|
140
|
+
if (!skill) throw new Error(`Skill not found: ${skill_id}`);
|
|
141
|
+
return {
|
|
142
|
+
skill_id: skill.id,
|
|
143
|
+
name: skill.name,
|
|
144
|
+
install_command: skill.install || `npx -y @marketnow/install ${skill.slug}`,
|
|
145
|
+
price: skill.price,
|
|
146
|
+
currency: skill.currency || 'USD',
|
|
147
|
+
note: `Buy this skill at https://marketnow.site/skill/${skill.id} to get a license key, then run the install command.`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ─── MCP Server setup ───────────────────────────────────────────────────────
|
|
152
|
+
const server = new Server(
|
|
153
|
+
{
|
|
154
|
+
name: 'marketnow',
|
|
155
|
+
version: '1.0.0',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
capabilities: {
|
|
159
|
+
tools: {},
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
165
|
+
tools: [
|
|
166
|
+
{
|
|
167
|
+
name: 'search_skills',
|
|
168
|
+
description: 'Search the MarketNow marketplace for MCP-compatible skills. Returns matching skills with price, category, and install command. Use this when an agent or user needs to find a tool for a specific task.',
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: 'object',
|
|
171
|
+
properties: {
|
|
172
|
+
query: {
|
|
173
|
+
type: 'string',
|
|
174
|
+
description: 'Natural language or keyword search (e.g. "scrape website", "discord bot", "database query")',
|
|
175
|
+
},
|
|
176
|
+
category: {
|
|
177
|
+
type: 'string',
|
|
178
|
+
description: 'Filter by category (optional). One of: AI/ML, Data, Web/API, Security, DevOps, Communication, etc.',
|
|
179
|
+
},
|
|
180
|
+
max_price: {
|
|
181
|
+
type: 'number',
|
|
182
|
+
description: 'Maximum price in USD (optional, e.g. 2.99)',
|
|
183
|
+
},
|
|
184
|
+
limit: {
|
|
185
|
+
type: 'number',
|
|
186
|
+
description: 'Max results to return (default 10, max 50)',
|
|
187
|
+
default: 10,
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'get_skill',
|
|
194
|
+
description: 'Get full details of a specific skill by ID or slug.',
|
|
195
|
+
inputSchema: {
|
|
196
|
+
type: 'object',
|
|
197
|
+
properties: {
|
|
198
|
+
skill_id: {
|
|
199
|
+
type: 'string',
|
|
200
|
+
description: 'Skill ID (e.g. mn-ai-00001) or slug',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
required: ['skill_id'],
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
name: 'list_categories',
|
|
208
|
+
description: 'List all skill categories with counts.',
|
|
209
|
+
inputSchema: { type: 'object', properties: {} },
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: 'get_manifest',
|
|
213
|
+
description: 'Get marketplace metadata: total skills, pricing tiers, API endpoints.',
|
|
214
|
+
inputSchema: { type: 'object', properties: {} },
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
name: 'get_install_command',
|
|
218
|
+
description: 'Get the install command for a skill (to run after purchasing).',
|
|
219
|
+
inputSchema: {
|
|
220
|
+
type: 'object',
|
|
221
|
+
properties: {
|
|
222
|
+
skill_id: {
|
|
223
|
+
type: 'string',
|
|
224
|
+
description: 'Skill ID or slug',
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
required: ['skill_id'],
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
}));
|
|
232
|
+
|
|
233
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
234
|
+
const { name, arguments: args } = request.params;
|
|
235
|
+
|
|
236
|
+
try {
|
|
237
|
+
let result;
|
|
238
|
+
switch (name) {
|
|
239
|
+
case 'search_skills':
|
|
240
|
+
result = await searchSkills(args || {});
|
|
241
|
+
break;
|
|
242
|
+
case 'get_skill':
|
|
243
|
+
result = await getSkill(args || {});
|
|
244
|
+
break;
|
|
245
|
+
case 'list_categories':
|
|
246
|
+
result = await listCategories();
|
|
247
|
+
break;
|
|
248
|
+
case 'get_manifest':
|
|
249
|
+
result = await getManifest();
|
|
250
|
+
break;
|
|
251
|
+
case 'get_install_command':
|
|
252
|
+
result = await getInstallCommand(args || {});
|
|
253
|
+
break;
|
|
254
|
+
default:
|
|
255
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
content: [
|
|
260
|
+
{
|
|
261
|
+
type: 'text',
|
|
262
|
+
text: JSON.stringify(result, null, 2),
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
};
|
|
266
|
+
} catch (err) {
|
|
267
|
+
return {
|
|
268
|
+
content: [
|
|
269
|
+
{
|
|
270
|
+
type: 'text',
|
|
271
|
+
text: `Error: ${err.message}`,
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
isError: true,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// ─── Start server ───────────────────────────────────────────────────────────
|
|
280
|
+
const transport = new StdioServerTransport();
|
|
281
|
+
await server.connect(transport);
|
|
282
|
+
console.error('MarketNow MCP Server running on stdio');
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "marketnow-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MarketNow MCP Server — search, discover, and install MCP skills from any agent runtime (Claude Desktop, Cursor, Cline)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"marketnow-mcp": "index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "node index.js",
|
|
12
|
+
"dev": "node --watch index.js"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"mcp",
|
|
16
|
+
"model-context-protocol",
|
|
17
|
+
"marketplace",
|
|
18
|
+
"agent-skills",
|
|
19
|
+
"ai",
|
|
20
|
+
"claude",
|
|
21
|
+
"cursor",
|
|
22
|
+
"cline",
|
|
23
|
+
"marketnow",
|
|
24
|
+
"mcp-server"
|
|
25
|
+
],
|
|
26
|
+
"author": "MarketNow <eddyflores100@gmail.com>",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"homepage": "https://marketnow.site",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/edgarfloresguerra2011-a11y/marketnow.git",
|
|
32
|
+
"directory": "mcp-server"
|
|
33
|
+
},
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/edgarfloresguerra2011-a11y/marketnow/issues"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@modelcontextprotocol/sdk": "^0.5.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"index.js",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE"
|
|
47
|
+
]
|
|
48
|
+
}
|