stock-scanner-mcp 1.16.3 → 1.16.4
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 +15 -4
- package/dist/sidecar/index.js +77 -9
- package/docs/sidecar-openapi.json +303 -83
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -208,6 +208,14 @@ Data is stored locally in `workspace.json` — no cloud sync, no external calls.
|
|
|
208
208
|
|
|
209
209
|
For the full list of workspace tools, see the [tool reference](#workspace--personalized-context-optional-no-api-key) below.
|
|
210
210
|
|
|
211
|
+
## Documentation
|
|
212
|
+
|
|
213
|
+
- **[Installation & Setup](https://github.com/yyordanov-tradu/stock-scanner-mcp/wiki/Installation-&-Setup)** — Getting the MCP server running in Claude Code or Cursor
|
|
214
|
+
- **[Trading Skills](https://github.com/yyordanov-tradu/stock-scanner-mcp/wiki/Trading-Skills)** — Ready-made workflows for professional analysis
|
|
215
|
+
- **[Sidecar HTTP API](https://github.com/yyordanov-tradu/stock-scanner-mcp/wiki/Sidecar-HTTP-API)** — REST endpoints for non-MCP clients
|
|
216
|
+
- **[Docker Deployment](docs/DOCKER.md)** — Running in containers with workspace persistence
|
|
217
|
+
- **[FAQ & Troubleshooting](https://github.com/yyordanov-tradu/stock-scanner-mcp/wiki/FAQ-&-Troubleshooting)** — Common issues and solutions
|
|
218
|
+
|
|
211
219
|
## Modules
|
|
212
220
|
|
|
213
221
|
| Module | Tools | API Key | Description |
|
|
@@ -399,14 +407,16 @@ An optional HTTP server exposing all tools as REST endpoints for non-MCP integra
|
|
|
399
407
|
npx stock-scanner-sidecar # Start on port 3200
|
|
400
408
|
npx stock-scanner-sidecar --port 8080 # Custom port
|
|
401
409
|
|
|
410
|
+
# Optional: Enable the stateful Market Workspace via HTTP
|
|
411
|
+
npx stock-scanner-sidecar --enable-workspace --data-dir ./my-data
|
|
412
|
+
|
|
402
413
|
# Access the OpenAPI spec
|
|
403
414
|
curl http://localhost:3200/openapi.json
|
|
404
415
|
```
|
|
405
416
|
|
|
406
|
-
See [Sidecar HTTP API](
|
|
407
|
-
```
|
|
417
|
+
See [Sidecar HTTP API](https://github.com/yyordanov-tradu/stock-scanner-mcp/wiki/Sidecar-HTTP-API) for endpoint details.
|
|
408
418
|
|
|
409
|
-
|
|
419
|
+
**64 tools** exposed as REST routes, including `/tradingview/quote`, `/options/chain`, `/workspace/profile`, and more.
|
|
410
420
|
|
|
411
421
|
## Rate Limits
|
|
412
422
|
|
|
@@ -462,7 +472,8 @@ src/
|
|
|
462
472
|
│ └── reddit/ # 3 tools — trending tickers, mentions, sentiment from Reddit
|
|
463
473
|
├── sidecar/
|
|
464
474
|
│ ├── index.ts # HTTP sidecar entry point (port 3200)
|
|
465
|
-
│
|
|
475
|
+
│ ├── routes.ts # Declarative URL routing table
|
|
476
|
+
│ └── server.ts # Dynamic HTTP request handler
|
|
466
477
|
└── shared/
|
|
467
478
|
├── http.ts # HTTP client with timeouts and key sanitization
|
|
468
479
|
├── cache.ts # In-memory TTL cache
|
package/dist/sidecar/index.js
CHANGED
|
@@ -210,9 +210,7 @@ function convertZodToOpenApi(zod) {
|
|
|
210
210
|
const inner = convertZodToOpenApi(def.innerType || def.schema);
|
|
211
211
|
return { ...inner, optional: true, description: description || inner.description };
|
|
212
212
|
}
|
|
213
|
-
if (typeName === "ZodNumber" || defType === "number") {
|
|
214
|
-
return { type: zod.isInt ? "integer" : "number", description };
|
|
215
|
-
}
|
|
213
|
+
if (typeName === "ZodNumber" || defType === "number") return { type: zod.isInt ? "integer" : "number", description };
|
|
216
214
|
if (typeName === "ZodBoolean" || defType === "boolean") return { type: "boolean", description };
|
|
217
215
|
if (typeName === "ZodEnum" || defType === "enum") return { type: "string", enum: def.values, description };
|
|
218
216
|
if (typeName === "ZodString" || defType === "string") return { type: "string", description };
|
|
@@ -245,6 +243,51 @@ function convertZodToOpenApi(zod) {
|
|
|
245
243
|
}
|
|
246
244
|
return { type: "string", description };
|
|
247
245
|
}
|
|
246
|
+
function getResponseSchema(toolName) {
|
|
247
|
+
if (toolName.startsWith("tradingview_") || toolName.startsWith("crypto_")) {
|
|
248
|
+
return {
|
|
249
|
+
type: "array",
|
|
250
|
+
items: {
|
|
251
|
+
type: "object",
|
|
252
|
+
properties: {
|
|
253
|
+
symbol: { type: "string" },
|
|
254
|
+
data: { type: "object", additionalProperties: true }
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
if (toolName.startsWith("edgar_")) {
|
|
260
|
+
return { type: "array", items: { type: "object", additionalProperties: true } };
|
|
261
|
+
}
|
|
262
|
+
if (toolName === "finnhub_quote") {
|
|
263
|
+
return {
|
|
264
|
+
type: "object",
|
|
265
|
+
properties: {
|
|
266
|
+
c: { type: "number", description: "Current price" },
|
|
267
|
+
d: { type: "number", description: "Change" },
|
|
268
|
+
dp: { type: "number", description: "Percent change" },
|
|
269
|
+
h: { type: "number", description: "High price of the day" },
|
|
270
|
+
l: { type: "number", description: "Low price of the day" },
|
|
271
|
+
o: { type: "number", description: "Open price of the day" },
|
|
272
|
+
pc: { type: "number", description: "Previous close price" },
|
|
273
|
+
t: { type: "integer", description: "Timestamp" }
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
if (toolName.startsWith("finnhub_")) {
|
|
278
|
+
return { type: "object", additionalProperties: true };
|
|
279
|
+
}
|
|
280
|
+
if (toolName.startsWith("options_")) {
|
|
281
|
+
return { type: "object", additionalProperties: true };
|
|
282
|
+
}
|
|
283
|
+
if (toolName.startsWith("fred_")) {
|
|
284
|
+
return { type: "array", items: { type: "object", additionalProperties: true } };
|
|
285
|
+
}
|
|
286
|
+
if (toolName.startsWith("workspace_")) {
|
|
287
|
+
return { type: "object", additionalProperties: true };
|
|
288
|
+
}
|
|
289
|
+
return { type: "object", description: "Varies by tool" };
|
|
290
|
+
}
|
|
248
291
|
function generateOpenApiSpec() {
|
|
249
292
|
const mockConfig = {
|
|
250
293
|
env: {
|
|
@@ -315,7 +358,11 @@ function generateOpenApiSpec() {
|
|
|
315
358
|
responses: {
|
|
316
359
|
"200": {
|
|
317
360
|
description: "Successful response",
|
|
318
|
-
content: {
|
|
361
|
+
content: {
|
|
362
|
+
"application/json": {
|
|
363
|
+
schema: getResponseSchema(route.tool)
|
|
364
|
+
}
|
|
365
|
+
}
|
|
319
366
|
},
|
|
320
367
|
"400": {
|
|
321
368
|
description: "Invalid parameters",
|
|
@@ -361,7 +408,9 @@ function generateOpenApiSpec() {
|
|
|
361
408
|
description: prop.description || ""
|
|
362
409
|
};
|
|
363
410
|
if (prop.type === "array") {
|
|
364
|
-
|
|
411
|
+
const desc = prop.description + " (comma-separated list)";
|
|
412
|
+
param.description = desc;
|
|
413
|
+
param.schema = { type: "string", description: desc };
|
|
365
414
|
} else {
|
|
366
415
|
param.schema = prop;
|
|
367
416
|
}
|
|
@@ -455,8 +504,9 @@ function buildTools(config) {
|
|
|
455
504
|
FRED_API_KEY: config.fredApiKey,
|
|
456
505
|
ALPHA_VANTAGE_API_KEY: config.alphaVantageApiKey
|
|
457
506
|
},
|
|
458
|
-
enableWorkspace: false,
|
|
459
|
-
|
|
507
|
+
enableWorkspace: config.enableWorkspace ?? false,
|
|
508
|
+
dataDir: config.dataDir,
|
|
509
|
+
defaultExchange: config.defaultExchange ?? "NASDAQ"
|
|
460
510
|
};
|
|
461
511
|
const allModules = MODULE_CATALOG.map((entry) => entry.factory(mockConfig)).filter((m) => m !== null);
|
|
462
512
|
const enabled = resolveEnabledModules(allModules, mockConfig.env);
|
|
@@ -609,13 +659,29 @@ function parsePort(args) {
|
|
|
609
659
|
}
|
|
610
660
|
return 3200;
|
|
611
661
|
}
|
|
662
|
+
function parseStringFlag(args, flag) {
|
|
663
|
+
const idx = args.indexOf(flag);
|
|
664
|
+
if (idx !== -1 && args[idx + 1]) return args[idx + 1];
|
|
665
|
+
return void 0;
|
|
666
|
+
}
|
|
612
667
|
function main() {
|
|
613
668
|
const args = process.argv.slice(2);
|
|
614
669
|
const port = parsePort(args);
|
|
670
|
+
const enableWorkspace = args.includes("--enable-workspace");
|
|
671
|
+
const dataDir = parseStringFlag(args, "--data-dir") ?? process.env.STOCK_SCANNER_DATA_DIR;
|
|
672
|
+
const defaultExchange = parseStringFlag(args, "--default-exchange") ?? "NASDAQ";
|
|
615
673
|
const finnhubApiKey = process.env.FINNHUB_API_KEY;
|
|
616
674
|
const fredApiKey = process.env.FRED_API_KEY;
|
|
617
675
|
const alphaVantageApiKey = process.env.ALPHA_VANTAGE_API_KEY;
|
|
618
|
-
const server = createServer2({
|
|
676
|
+
const server = createServer2({
|
|
677
|
+
port,
|
|
678
|
+
finnhubApiKey,
|
|
679
|
+
fredApiKey,
|
|
680
|
+
alphaVantageApiKey,
|
|
681
|
+
enableWorkspace,
|
|
682
|
+
dataDir,
|
|
683
|
+
defaultExchange
|
|
684
|
+
});
|
|
619
685
|
const enabled = [];
|
|
620
686
|
const disabled = [];
|
|
621
687
|
if (finnhubApiKey) enabled.push("finnhub");
|
|
@@ -624,8 +690,10 @@ function main() {
|
|
|
624
690
|
else disabled.push("fred (FRED_API_KEY not set)");
|
|
625
691
|
if (alphaVantageApiKey) enabled.push("alpha-vantage");
|
|
626
692
|
else disabled.push("alpha-vantage (ALPHA_VANTAGE_API_KEY not set)");
|
|
693
|
+
if (enableWorkspace) enabled.push("workspace");
|
|
694
|
+
else disabled.push("workspace (--enable-workspace not set)");
|
|
627
695
|
console.error(`[stock-scanner-sidecar] listening on port ${port}`);
|
|
628
|
-
console.error(` Always-on: tradingview, tradingview-crypto, sec-edgar, options, options-cboe, sentiment, coingecko, frankfurter`);
|
|
696
|
+
console.error(` Always-on: tradingview, tradingview-crypto, sec-edgar, options, options-cboe, sentiment, coingecko, frankfurter, reddit`);
|
|
629
697
|
if (enabled.length) console.error(` Enabled: ${enabled.join(", ")}`);
|
|
630
698
|
if (disabled.length) console.error(` Disabled: ${disabled.join(", ")}`);
|
|
631
699
|
const shutdown = () => {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Stock Scanner Sidecar API",
|
|
5
5
|
"description": "REST API for stock and crypto market data, SEC filings, and technical analysis. This is the HTTP sidecar for the stock-scanner-mcp server.",
|
|
6
|
-
"version": "1.16.
|
|
6
|
+
"version": "1.16.4",
|
|
7
7
|
"contact": {
|
|
8
8
|
"name": "Yordan Yordanov",
|
|
9
9
|
"url": "https://github.com/yyordanov-tradu/stock-scanner-mcp"
|
|
@@ -52,8 +52,19 @@
|
|
|
52
52
|
"content": {
|
|
53
53
|
"application/json": {
|
|
54
54
|
"schema": {
|
|
55
|
-
"type": "
|
|
56
|
-
"
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": {
|
|
57
|
+
"type": "object",
|
|
58
|
+
"properties": {
|
|
59
|
+
"symbol": {
|
|
60
|
+
"type": "string"
|
|
61
|
+
},
|
|
62
|
+
"data": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"additionalProperties": true
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
57
68
|
}
|
|
58
69
|
}
|
|
59
70
|
}
|
|
@@ -178,8 +189,19 @@
|
|
|
178
189
|
"content": {
|
|
179
190
|
"application/json": {
|
|
180
191
|
"schema": {
|
|
181
|
-
"type": "
|
|
182
|
-
"
|
|
192
|
+
"type": "array",
|
|
193
|
+
"items": {
|
|
194
|
+
"type": "object",
|
|
195
|
+
"properties": {
|
|
196
|
+
"symbol": {
|
|
197
|
+
"type": "string"
|
|
198
|
+
},
|
|
199
|
+
"data": {
|
|
200
|
+
"type": "object",
|
|
201
|
+
"additionalProperties": true
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
183
205
|
}
|
|
184
206
|
}
|
|
185
207
|
}
|
|
@@ -220,7 +242,7 @@
|
|
|
220
242
|
"name": "tickers",
|
|
221
243
|
"in": "query",
|
|
222
244
|
"required": true,
|
|
223
|
-
"description": "Stock tickers, e.g. ['AAPL', 'MSFT']",
|
|
245
|
+
"description": "Stock tickers, e.g. ['AAPL', 'MSFT'] (comma-separated list)",
|
|
224
246
|
"schema": {
|
|
225
247
|
"type": "string",
|
|
226
248
|
"description": "Stock tickers, e.g. ['AAPL', 'MSFT'] (comma-separated list)"
|
|
@@ -239,8 +261,19 @@
|
|
|
239
261
|
"content": {
|
|
240
262
|
"application/json": {
|
|
241
263
|
"schema": {
|
|
242
|
-
"type": "
|
|
243
|
-
"
|
|
264
|
+
"type": "array",
|
|
265
|
+
"items": {
|
|
266
|
+
"type": "object",
|
|
267
|
+
"properties": {
|
|
268
|
+
"symbol": {
|
|
269
|
+
"type": "string"
|
|
270
|
+
},
|
|
271
|
+
"data": {
|
|
272
|
+
"type": "object",
|
|
273
|
+
"additionalProperties": true
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
244
277
|
}
|
|
245
278
|
}
|
|
246
279
|
}
|
|
@@ -281,7 +314,7 @@
|
|
|
281
314
|
"name": "tickers",
|
|
282
315
|
"in": "query",
|
|
283
316
|
"required": true,
|
|
284
|
-
"description": "Stock tickers, e.g. ['AAPL', 'IBM']",
|
|
317
|
+
"description": "Stock tickers, e.g. ['AAPL', 'IBM'] (comma-separated list)",
|
|
285
318
|
"schema": {
|
|
286
319
|
"type": "string",
|
|
287
320
|
"description": "Stock tickers, e.g. ['AAPL', 'IBM'] (comma-separated list)"
|
|
@@ -310,8 +343,19 @@
|
|
|
310
343
|
"content": {
|
|
311
344
|
"application/json": {
|
|
312
345
|
"schema": {
|
|
313
|
-
"type": "
|
|
314
|
-
"
|
|
346
|
+
"type": "array",
|
|
347
|
+
"items": {
|
|
348
|
+
"type": "object",
|
|
349
|
+
"properties": {
|
|
350
|
+
"symbol": {
|
|
351
|
+
"type": "string"
|
|
352
|
+
},
|
|
353
|
+
"data": {
|
|
354
|
+
"type": "object",
|
|
355
|
+
"additionalProperties": true
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
315
359
|
}
|
|
316
360
|
}
|
|
317
361
|
}
|
|
@@ -352,7 +396,7 @@
|
|
|
352
396
|
"name": "tickers",
|
|
353
397
|
"in": "query",
|
|
354
398
|
"required": true,
|
|
355
|
-
"description": "2-5 stock tickers to compare (e.g. AAPL, MSFT)",
|
|
399
|
+
"description": "2-5 stock tickers to compare (e.g. AAPL, MSFT) (comma-separated list)",
|
|
356
400
|
"schema": {
|
|
357
401
|
"type": "string",
|
|
358
402
|
"description": "2-5 stock tickers to compare (e.g. AAPL, MSFT) (comma-separated list)"
|
|
@@ -371,8 +415,19 @@
|
|
|
371
415
|
"content": {
|
|
372
416
|
"application/json": {
|
|
373
417
|
"schema": {
|
|
374
|
-
"type": "
|
|
375
|
-
"
|
|
418
|
+
"type": "array",
|
|
419
|
+
"items": {
|
|
420
|
+
"type": "object",
|
|
421
|
+
"properties": {
|
|
422
|
+
"symbol": {
|
|
423
|
+
"type": "string"
|
|
424
|
+
},
|
|
425
|
+
"data": {
|
|
426
|
+
"type": "object",
|
|
427
|
+
"additionalProperties": true
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
376
431
|
}
|
|
377
432
|
}
|
|
378
433
|
}
|
|
@@ -452,8 +507,19 @@
|
|
|
452
507
|
"content": {
|
|
453
508
|
"application/json": {
|
|
454
509
|
"schema": {
|
|
455
|
-
"type": "
|
|
456
|
-
"
|
|
510
|
+
"type": "array",
|
|
511
|
+
"items": {
|
|
512
|
+
"type": "object",
|
|
513
|
+
"properties": {
|
|
514
|
+
"symbol": {
|
|
515
|
+
"type": "string"
|
|
516
|
+
},
|
|
517
|
+
"data": {
|
|
518
|
+
"type": "object",
|
|
519
|
+
"additionalProperties": true
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
457
523
|
}
|
|
458
524
|
}
|
|
459
525
|
}
|
|
@@ -533,8 +599,19 @@
|
|
|
533
599
|
"content": {
|
|
534
600
|
"application/json": {
|
|
535
601
|
"schema": {
|
|
536
|
-
"type": "
|
|
537
|
-
"
|
|
602
|
+
"type": "array",
|
|
603
|
+
"items": {
|
|
604
|
+
"type": "object",
|
|
605
|
+
"properties": {
|
|
606
|
+
"symbol": {
|
|
607
|
+
"type": "string"
|
|
608
|
+
},
|
|
609
|
+
"data": {
|
|
610
|
+
"type": "object",
|
|
611
|
+
"additionalProperties": true
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
538
615
|
}
|
|
539
616
|
}
|
|
540
617
|
}
|
|
@@ -614,8 +691,19 @@
|
|
|
614
691
|
"content": {
|
|
615
692
|
"application/json": {
|
|
616
693
|
"schema": {
|
|
617
|
-
"type": "
|
|
618
|
-
"
|
|
694
|
+
"type": "array",
|
|
695
|
+
"items": {
|
|
696
|
+
"type": "object",
|
|
697
|
+
"properties": {
|
|
698
|
+
"symbol": {
|
|
699
|
+
"type": "string"
|
|
700
|
+
},
|
|
701
|
+
"data": {
|
|
702
|
+
"type": "object",
|
|
703
|
+
"additionalProperties": true
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
619
707
|
}
|
|
620
708
|
}
|
|
621
709
|
}
|
|
@@ -664,8 +752,19 @@
|
|
|
664
752
|
"content": {
|
|
665
753
|
"application/json": {
|
|
666
754
|
"schema": {
|
|
667
|
-
"type": "
|
|
668
|
-
"
|
|
755
|
+
"type": "array",
|
|
756
|
+
"items": {
|
|
757
|
+
"type": "object",
|
|
758
|
+
"properties": {
|
|
759
|
+
"symbol": {
|
|
760
|
+
"type": "string"
|
|
761
|
+
},
|
|
762
|
+
"data": {
|
|
763
|
+
"type": "object",
|
|
764
|
+
"additionalProperties": true
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
669
768
|
}
|
|
670
769
|
}
|
|
671
770
|
}
|
|
@@ -714,8 +813,19 @@
|
|
|
714
813
|
"content": {
|
|
715
814
|
"application/json": {
|
|
716
815
|
"schema": {
|
|
717
|
-
"type": "
|
|
718
|
-
"
|
|
816
|
+
"type": "array",
|
|
817
|
+
"items": {
|
|
818
|
+
"type": "object",
|
|
819
|
+
"properties": {
|
|
820
|
+
"symbol": {
|
|
821
|
+
"type": "string"
|
|
822
|
+
},
|
|
823
|
+
"data": {
|
|
824
|
+
"type": "object",
|
|
825
|
+
"additionalProperties": true
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
719
829
|
}
|
|
720
830
|
}
|
|
721
831
|
}
|
|
@@ -785,8 +895,19 @@
|
|
|
785
895
|
"content": {
|
|
786
896
|
"application/json": {
|
|
787
897
|
"schema": {
|
|
788
|
-
"type": "
|
|
789
|
-
"
|
|
898
|
+
"type": "array",
|
|
899
|
+
"items": {
|
|
900
|
+
"type": "object",
|
|
901
|
+
"properties": {
|
|
902
|
+
"symbol": {
|
|
903
|
+
"type": "string"
|
|
904
|
+
},
|
|
905
|
+
"data": {
|
|
906
|
+
"type": "object",
|
|
907
|
+
"additionalProperties": true
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
}
|
|
790
911
|
}
|
|
791
912
|
}
|
|
792
913
|
}
|
|
@@ -919,8 +1040,19 @@
|
|
|
919
1040
|
"content": {
|
|
920
1041
|
"application/json": {
|
|
921
1042
|
"schema": {
|
|
922
|
-
"type": "
|
|
923
|
-
"
|
|
1043
|
+
"type": "array",
|
|
1044
|
+
"items": {
|
|
1045
|
+
"type": "object",
|
|
1046
|
+
"properties": {
|
|
1047
|
+
"symbol": {
|
|
1048
|
+
"type": "string"
|
|
1049
|
+
},
|
|
1050
|
+
"data": {
|
|
1051
|
+
"type": "object",
|
|
1052
|
+
"additionalProperties": true
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
924
1056
|
}
|
|
925
1057
|
}
|
|
926
1058
|
}
|
|
@@ -961,7 +1093,7 @@
|
|
|
961
1093
|
"name": "symbols",
|
|
962
1094
|
"in": "query",
|
|
963
1095
|
"required": true,
|
|
964
|
-
"description": "Crypto pair symbols (e.g. ['BTCUSDT', 'ETHUSDT'])",
|
|
1096
|
+
"description": "Crypto pair symbols (e.g. ['BTCUSDT', 'ETHUSDT']) (comma-separated list)",
|
|
965
1097
|
"schema": {
|
|
966
1098
|
"type": "string",
|
|
967
1099
|
"description": "Crypto pair symbols (e.g. ['BTCUSDT', 'ETHUSDT']) (comma-separated list)"
|
|
@@ -980,8 +1112,19 @@
|
|
|
980
1112
|
"content": {
|
|
981
1113
|
"application/json": {
|
|
982
1114
|
"schema": {
|
|
983
|
-
"type": "
|
|
984
|
-
"
|
|
1115
|
+
"type": "array",
|
|
1116
|
+
"items": {
|
|
1117
|
+
"type": "object",
|
|
1118
|
+
"properties": {
|
|
1119
|
+
"symbol": {
|
|
1120
|
+
"type": "string"
|
|
1121
|
+
},
|
|
1122
|
+
"data": {
|
|
1123
|
+
"type": "object",
|
|
1124
|
+
"additionalProperties": true
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
985
1128
|
}
|
|
986
1129
|
}
|
|
987
1130
|
}
|
|
@@ -1022,7 +1165,7 @@
|
|
|
1022
1165
|
"name": "symbols",
|
|
1023
1166
|
"in": "query",
|
|
1024
1167
|
"required": true,
|
|
1025
|
-
"description": "Crypto symbols (e.g. ['BTCUSDT'])",
|
|
1168
|
+
"description": "Crypto symbols (e.g. ['BTCUSDT']) (comma-separated list)",
|
|
1026
1169
|
"schema": {
|
|
1027
1170
|
"type": "string",
|
|
1028
1171
|
"description": "Crypto symbols (e.g. ['BTCUSDT']) (comma-separated list)"
|
|
@@ -1051,8 +1194,19 @@
|
|
|
1051
1194
|
"content": {
|
|
1052
1195
|
"application/json": {
|
|
1053
1196
|
"schema": {
|
|
1054
|
-
"type": "
|
|
1055
|
-
"
|
|
1197
|
+
"type": "array",
|
|
1198
|
+
"items": {
|
|
1199
|
+
"type": "object",
|
|
1200
|
+
"properties": {
|
|
1201
|
+
"symbol": {
|
|
1202
|
+
"type": "string"
|
|
1203
|
+
},
|
|
1204
|
+
"data": {
|
|
1205
|
+
"type": "object",
|
|
1206
|
+
"additionalProperties": true
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1056
1210
|
}
|
|
1057
1211
|
}
|
|
1058
1212
|
}
|
|
@@ -1123,7 +1277,7 @@
|
|
|
1123
1277
|
"application/json": {
|
|
1124
1278
|
"schema": {
|
|
1125
1279
|
"type": "object",
|
|
1126
|
-
"
|
|
1280
|
+
"additionalProperties": true
|
|
1127
1281
|
}
|
|
1128
1282
|
}
|
|
1129
1283
|
}
|
|
@@ -1214,7 +1368,7 @@
|
|
|
1214
1368
|
"application/json": {
|
|
1215
1369
|
"schema": {
|
|
1216
1370
|
"type": "object",
|
|
1217
|
-
"
|
|
1371
|
+
"additionalProperties": true
|
|
1218
1372
|
}
|
|
1219
1373
|
}
|
|
1220
1374
|
}
|
|
@@ -1305,7 +1459,7 @@
|
|
|
1305
1459
|
"application/json": {
|
|
1306
1460
|
"schema": {
|
|
1307
1461
|
"type": "object",
|
|
1308
|
-
"
|
|
1462
|
+
"additionalProperties": true
|
|
1309
1463
|
}
|
|
1310
1464
|
}
|
|
1311
1465
|
}
|
|
@@ -1366,7 +1520,7 @@
|
|
|
1366
1520
|
"application/json": {
|
|
1367
1521
|
"schema": {
|
|
1368
1522
|
"type": "object",
|
|
1369
|
-
"
|
|
1523
|
+
"additionalProperties": true
|
|
1370
1524
|
}
|
|
1371
1525
|
}
|
|
1372
1526
|
}
|
|
@@ -1427,7 +1581,7 @@
|
|
|
1427
1581
|
"application/json": {
|
|
1428
1582
|
"schema": {
|
|
1429
1583
|
"type": "object",
|
|
1430
|
-
"
|
|
1584
|
+
"additionalProperties": true
|
|
1431
1585
|
}
|
|
1432
1586
|
}
|
|
1433
1587
|
}
|
|
@@ -1498,7 +1652,7 @@
|
|
|
1498
1652
|
"application/json": {
|
|
1499
1653
|
"schema": {
|
|
1500
1654
|
"type": "object",
|
|
1501
|
-
"
|
|
1655
|
+
"additionalProperties": true
|
|
1502
1656
|
}
|
|
1503
1657
|
}
|
|
1504
1658
|
}
|
|
@@ -1559,7 +1713,7 @@
|
|
|
1559
1713
|
"application/json": {
|
|
1560
1714
|
"schema": {
|
|
1561
1715
|
"type": "object",
|
|
1562
|
-
"
|
|
1716
|
+
"additionalProperties": true
|
|
1563
1717
|
}
|
|
1564
1718
|
}
|
|
1565
1719
|
}
|
|
@@ -1620,7 +1774,7 @@
|
|
|
1620
1774
|
"application/json": {
|
|
1621
1775
|
"schema": {
|
|
1622
1776
|
"type": "object",
|
|
1623
|
-
"
|
|
1777
|
+
"additionalProperties": true
|
|
1624
1778
|
}
|
|
1625
1779
|
}
|
|
1626
1780
|
}
|
|
@@ -1681,7 +1835,40 @@
|
|
|
1681
1835
|
"application/json": {
|
|
1682
1836
|
"schema": {
|
|
1683
1837
|
"type": "object",
|
|
1684
|
-
"
|
|
1838
|
+
"properties": {
|
|
1839
|
+
"c": {
|
|
1840
|
+
"type": "number",
|
|
1841
|
+
"description": "Current price"
|
|
1842
|
+
},
|
|
1843
|
+
"d": {
|
|
1844
|
+
"type": "number",
|
|
1845
|
+
"description": "Change"
|
|
1846
|
+
},
|
|
1847
|
+
"dp": {
|
|
1848
|
+
"type": "number",
|
|
1849
|
+
"description": "Percent change"
|
|
1850
|
+
},
|
|
1851
|
+
"h": {
|
|
1852
|
+
"type": "number",
|
|
1853
|
+
"description": "High price of the day"
|
|
1854
|
+
},
|
|
1855
|
+
"l": {
|
|
1856
|
+
"type": "number",
|
|
1857
|
+
"description": "Low price of the day"
|
|
1858
|
+
},
|
|
1859
|
+
"o": {
|
|
1860
|
+
"type": "number",
|
|
1861
|
+
"description": "Open price of the day"
|
|
1862
|
+
},
|
|
1863
|
+
"pc": {
|
|
1864
|
+
"type": "number",
|
|
1865
|
+
"description": "Previous close price"
|
|
1866
|
+
},
|
|
1867
|
+
"t": {
|
|
1868
|
+
"type": "integer",
|
|
1869
|
+
"description": "Timestamp"
|
|
1870
|
+
}
|
|
1871
|
+
}
|
|
1685
1872
|
}
|
|
1686
1873
|
}
|
|
1687
1874
|
}
|
|
@@ -1741,8 +1928,11 @@
|
|
|
1741
1928
|
"content": {
|
|
1742
1929
|
"application/json": {
|
|
1743
1930
|
"schema": {
|
|
1744
|
-
"type": "
|
|
1745
|
-
"
|
|
1931
|
+
"type": "array",
|
|
1932
|
+
"items": {
|
|
1933
|
+
"type": "object",
|
|
1934
|
+
"additionalProperties": true
|
|
1935
|
+
}
|
|
1746
1936
|
}
|
|
1747
1937
|
}
|
|
1748
1938
|
}
|
|
@@ -1803,7 +1993,7 @@
|
|
|
1803
1993
|
"name": "forms",
|
|
1804
1994
|
"in": "query",
|
|
1805
1995
|
"required": false,
|
|
1806
|
-
"description": "Form types to filter (e.g. ['10-K', '10-Q', '8-K'])",
|
|
1996
|
+
"description": "Form types to filter (e.g. ['10-K', '10-Q', '8-K']) (comma-separated list)",
|
|
1807
1997
|
"schema": {
|
|
1808
1998
|
"type": "string",
|
|
1809
1999
|
"description": "Form types to filter (e.g. ['10-K', '10-Q', '8-K']) (comma-separated list)"
|
|
@@ -1813,7 +2003,7 @@
|
|
|
1813
2003
|
"name": "tickers",
|
|
1814
2004
|
"in": "query",
|
|
1815
2005
|
"required": false,
|
|
1816
|
-
"description": "Company tickers to filter (e.g. ['AAPL', 'MSFT'])",
|
|
2006
|
+
"description": "Company tickers to filter (e.g. ['AAPL', 'MSFT']) (comma-separated list)",
|
|
1817
2007
|
"schema": {
|
|
1818
2008
|
"type": "string",
|
|
1819
2009
|
"description": "Company tickers to filter (e.g. ['AAPL', 'MSFT']) (comma-separated list)"
|
|
@@ -1842,8 +2032,11 @@
|
|
|
1842
2032
|
"content": {
|
|
1843
2033
|
"application/json": {
|
|
1844
2034
|
"schema": {
|
|
1845
|
-
"type": "
|
|
1846
|
-
"
|
|
2035
|
+
"type": "array",
|
|
2036
|
+
"items": {
|
|
2037
|
+
"type": "object",
|
|
2038
|
+
"additionalProperties": true
|
|
2039
|
+
}
|
|
1847
2040
|
}
|
|
1848
2041
|
}
|
|
1849
2042
|
}
|
|
@@ -1904,7 +2097,7 @@
|
|
|
1904
2097
|
"name": "forms",
|
|
1905
2098
|
"in": "query",
|
|
1906
2099
|
"required": false,
|
|
1907
|
-
"description": "Form types to filter (e.g. ['10-K', '10-Q', '8-K'])",
|
|
2100
|
+
"description": "Form types to filter (e.g. ['10-K', '10-Q', '8-K']) (comma-separated list)",
|
|
1908
2101
|
"schema": {
|
|
1909
2102
|
"type": "string",
|
|
1910
2103
|
"description": "Form types to filter (e.g. ['10-K', '10-Q', '8-K']) (comma-separated list)"
|
|
@@ -1914,7 +2107,7 @@
|
|
|
1914
2107
|
"name": "tickers",
|
|
1915
2108
|
"in": "query",
|
|
1916
2109
|
"required": false,
|
|
1917
|
-
"description": "Company tickers to filter (e.g. ['AAPL', 'MSFT'])",
|
|
2110
|
+
"description": "Company tickers to filter (e.g. ['AAPL', 'MSFT']) (comma-separated list)",
|
|
1918
2111
|
"schema": {
|
|
1919
2112
|
"type": "string",
|
|
1920
2113
|
"description": "Company tickers to filter (e.g. ['AAPL', 'MSFT']) (comma-separated list)"
|
|
@@ -1943,8 +2136,11 @@
|
|
|
1943
2136
|
"content": {
|
|
1944
2137
|
"application/json": {
|
|
1945
2138
|
"schema": {
|
|
1946
|
-
"type": "
|
|
1947
|
-
"
|
|
2139
|
+
"type": "array",
|
|
2140
|
+
"items": {
|
|
2141
|
+
"type": "object",
|
|
2142
|
+
"additionalProperties": true
|
|
2143
|
+
}
|
|
1948
2144
|
}
|
|
1949
2145
|
}
|
|
1950
2146
|
}
|
|
@@ -1995,7 +2191,7 @@
|
|
|
1995
2191
|
"name": "forms",
|
|
1996
2192
|
"in": "query",
|
|
1997
2193
|
"required": false,
|
|
1998
|
-
"description": "Form types (e.g. ['10-K', '10-Q']). Default: all.",
|
|
2194
|
+
"description": "Form types (e.g. ['10-K', '10-Q']). Default: all. (comma-separated list)",
|
|
1999
2195
|
"schema": {
|
|
2000
2196
|
"type": "string",
|
|
2001
2197
|
"description": "Form types (e.g. ['10-K', '10-Q']). Default: all. (comma-separated list)"
|
|
@@ -2024,8 +2220,11 @@
|
|
|
2024
2220
|
"content": {
|
|
2025
2221
|
"application/json": {
|
|
2026
2222
|
"schema": {
|
|
2027
|
-
"type": "
|
|
2028
|
-
"
|
|
2223
|
+
"type": "array",
|
|
2224
|
+
"items": {
|
|
2225
|
+
"type": "object",
|
|
2226
|
+
"additionalProperties": true
|
|
2227
|
+
}
|
|
2029
2228
|
}
|
|
2030
2229
|
}
|
|
2031
2230
|
}
|
|
@@ -2085,8 +2284,11 @@
|
|
|
2085
2284
|
"content": {
|
|
2086
2285
|
"application/json": {
|
|
2087
2286
|
"schema": {
|
|
2088
|
-
"type": "
|
|
2089
|
-
"
|
|
2287
|
+
"type": "array",
|
|
2288
|
+
"items": {
|
|
2289
|
+
"type": "object",
|
|
2290
|
+
"additionalProperties": true
|
|
2291
|
+
}
|
|
2090
2292
|
}
|
|
2091
2293
|
}
|
|
2092
2294
|
}
|
|
@@ -2156,8 +2358,11 @@
|
|
|
2156
2358
|
"content": {
|
|
2157
2359
|
"application/json": {
|
|
2158
2360
|
"schema": {
|
|
2159
|
-
"type": "
|
|
2160
|
-
"
|
|
2361
|
+
"type": "array",
|
|
2362
|
+
"items": {
|
|
2363
|
+
"type": "object",
|
|
2364
|
+
"additionalProperties": true
|
|
2365
|
+
}
|
|
2161
2366
|
}
|
|
2162
2367
|
}
|
|
2163
2368
|
}
|
|
@@ -2227,8 +2432,11 @@
|
|
|
2227
2432
|
"content": {
|
|
2228
2433
|
"application/json": {
|
|
2229
2434
|
"schema": {
|
|
2230
|
-
"type": "
|
|
2231
|
-
"
|
|
2435
|
+
"type": "array",
|
|
2436
|
+
"items": {
|
|
2437
|
+
"type": "object",
|
|
2438
|
+
"additionalProperties": true
|
|
2439
|
+
}
|
|
2232
2440
|
}
|
|
2233
2441
|
}
|
|
2234
2442
|
}
|
|
@@ -2299,7 +2507,7 @@
|
|
|
2299
2507
|
"application/json": {
|
|
2300
2508
|
"schema": {
|
|
2301
2509
|
"type": "object",
|
|
2302
|
-
"
|
|
2510
|
+
"additionalProperties": true
|
|
2303
2511
|
}
|
|
2304
2512
|
}
|
|
2305
2513
|
}
|
|
@@ -2420,7 +2628,7 @@
|
|
|
2420
2628
|
"application/json": {
|
|
2421
2629
|
"schema": {
|
|
2422
2630
|
"type": "object",
|
|
2423
|
-
"
|
|
2631
|
+
"additionalProperties": true
|
|
2424
2632
|
}
|
|
2425
2633
|
}
|
|
2426
2634
|
}
|
|
@@ -2481,7 +2689,7 @@
|
|
|
2481
2689
|
"application/json": {
|
|
2482
2690
|
"schema": {
|
|
2483
2691
|
"type": "object",
|
|
2484
|
-
"
|
|
2692
|
+
"additionalProperties": true
|
|
2485
2693
|
}
|
|
2486
2694
|
}
|
|
2487
2695
|
}
|
|
@@ -2572,7 +2780,7 @@
|
|
|
2572
2780
|
"application/json": {
|
|
2573
2781
|
"schema": {
|
|
2574
2782
|
"type": "object",
|
|
2575
|
-
"
|
|
2783
|
+
"additionalProperties": true
|
|
2576
2784
|
}
|
|
2577
2785
|
}
|
|
2578
2786
|
}
|
|
@@ -2643,7 +2851,7 @@
|
|
|
2643
2851
|
"application/json": {
|
|
2644
2852
|
"schema": {
|
|
2645
2853
|
"type": "object",
|
|
2646
|
-
"
|
|
2854
|
+
"additionalProperties": true
|
|
2647
2855
|
}
|
|
2648
2856
|
}
|
|
2649
2857
|
}
|
|
@@ -2714,7 +2922,7 @@
|
|
|
2714
2922
|
"application/json": {
|
|
2715
2923
|
"schema": {
|
|
2716
2924
|
"type": "object",
|
|
2717
|
-
"
|
|
2925
|
+
"additionalProperties": true
|
|
2718
2926
|
}
|
|
2719
2927
|
}
|
|
2720
2928
|
}
|
|
@@ -2884,8 +3092,11 @@
|
|
|
2884
3092
|
"content": {
|
|
2885
3093
|
"application/json": {
|
|
2886
3094
|
"schema": {
|
|
2887
|
-
"type": "
|
|
2888
|
-
"
|
|
3095
|
+
"type": "array",
|
|
3096
|
+
"items": {
|
|
3097
|
+
"type": "object",
|
|
3098
|
+
"additionalProperties": true
|
|
3099
|
+
}
|
|
2889
3100
|
}
|
|
2890
3101
|
}
|
|
2891
3102
|
}
|
|
@@ -2955,8 +3166,11 @@
|
|
|
2955
3166
|
"content": {
|
|
2956
3167
|
"application/json": {
|
|
2957
3168
|
"schema": {
|
|
2958
|
-
"type": "
|
|
2959
|
-
"
|
|
3169
|
+
"type": "array",
|
|
3170
|
+
"items": {
|
|
3171
|
+
"type": "object",
|
|
3172
|
+
"additionalProperties": true
|
|
3173
|
+
}
|
|
2960
3174
|
}
|
|
2961
3175
|
}
|
|
2962
3176
|
}
|
|
@@ -3016,8 +3230,11 @@
|
|
|
3016
3230
|
"content": {
|
|
3017
3231
|
"application/json": {
|
|
3018
3232
|
"schema": {
|
|
3019
|
-
"type": "
|
|
3020
|
-
"
|
|
3233
|
+
"type": "array",
|
|
3234
|
+
"items": {
|
|
3235
|
+
"type": "object",
|
|
3236
|
+
"additionalProperties": true
|
|
3237
|
+
}
|
|
3021
3238
|
}
|
|
3022
3239
|
}
|
|
3023
3240
|
}
|
|
@@ -3137,8 +3354,11 @@
|
|
|
3137
3354
|
"content": {
|
|
3138
3355
|
"application/json": {
|
|
3139
3356
|
"schema": {
|
|
3140
|
-
"type": "
|
|
3141
|
-
"
|
|
3357
|
+
"type": "array",
|
|
3358
|
+
"items": {
|
|
3359
|
+
"type": "object",
|
|
3360
|
+
"additionalProperties": true
|
|
3361
|
+
}
|
|
3142
3362
|
}
|
|
3143
3363
|
}
|
|
3144
3364
|
}
|
|
@@ -3770,7 +3990,7 @@
|
|
|
3770
3990
|
"application/json": {
|
|
3771
3991
|
"schema": {
|
|
3772
3992
|
"type": "object",
|
|
3773
|
-
"
|
|
3993
|
+
"additionalProperties": true
|
|
3774
3994
|
}
|
|
3775
3995
|
}
|
|
3776
3996
|
}
|
|
@@ -3818,7 +4038,7 @@
|
|
|
3818
4038
|
"application/json": {
|
|
3819
4039
|
"schema": {
|
|
3820
4040
|
"type": "object",
|
|
3821
|
-
"
|
|
4041
|
+
"additionalProperties": true
|
|
3822
4042
|
}
|
|
3823
4043
|
}
|
|
3824
4044
|
}
|
|
@@ -3896,7 +4116,7 @@
|
|
|
3896
4116
|
"application/json": {
|
|
3897
4117
|
"schema": {
|
|
3898
4118
|
"type": "object",
|
|
3899
|
-
"
|
|
4119
|
+
"additionalProperties": true
|
|
3900
4120
|
}
|
|
3901
4121
|
}
|
|
3902
4122
|
}
|
|
@@ -3944,7 +4164,7 @@
|
|
|
3944
4164
|
"application/json": {
|
|
3945
4165
|
"schema": {
|
|
3946
4166
|
"type": "object",
|
|
3947
|
-
"
|
|
4167
|
+
"additionalProperties": true
|
|
3948
4168
|
}
|
|
3949
4169
|
}
|
|
3950
4170
|
}
|
|
@@ -4013,7 +4233,7 @@
|
|
|
4013
4233
|
"application/json": {
|
|
4014
4234
|
"schema": {
|
|
4015
4235
|
"type": "object",
|
|
4016
|
-
"
|
|
4236
|
+
"additionalProperties": true
|
|
4017
4237
|
}
|
|
4018
4238
|
}
|
|
4019
4239
|
}
|
|
@@ -4091,7 +4311,7 @@
|
|
|
4091
4311
|
"application/json": {
|
|
4092
4312
|
"schema": {
|
|
4093
4313
|
"type": "object",
|
|
4094
|
-
"
|
|
4314
|
+
"additionalProperties": true
|
|
4095
4315
|
}
|
|
4096
4316
|
}
|
|
4097
4317
|
}
|
|
@@ -4150,7 +4370,7 @@
|
|
|
4150
4370
|
"application/json": {
|
|
4151
4371
|
"schema": {
|
|
4152
4372
|
"type": "object",
|
|
4153
|
-
"
|
|
4373
|
+
"additionalProperties": true
|
|
4154
4374
|
}
|
|
4155
4375
|
}
|
|
4156
4376
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stock-scanner-mcp",
|
|
3
3
|
"mcpName": "io.github.yyordanov-tradu/stock-scanner-mcp",
|
|
4
|
-
"version": "1.16.
|
|
4
|
+
"version": "1.16.4",
|
|
5
5
|
"description": "MCP server providing Claude Code with real-time stock and crypto market data, SEC filings, insider trades, and technical analysis",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -80,7 +80,8 @@
|
|
|
80
80
|
"dependencies": {
|
|
81
81
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
82
82
|
"proper-lockfile": "^4.1.2",
|
|
83
|
-
"zod": "^4.3.6"
|
|
83
|
+
"zod": "^4.3.6",
|
|
84
|
+
"zod-to-json-schema": "^3.25.2"
|
|
84
85
|
},
|
|
85
86
|
"devDependencies": {
|
|
86
87
|
"@emnapi/core": "^1.9.2",
|
|
@@ -91,7 +92,6 @@
|
|
|
91
92
|
"tsup": "^8.0.0",
|
|
92
93
|
"tsx": "^4.21.0",
|
|
93
94
|
"typescript": "^6.0.2",
|
|
94
|
-
"vitest": "^4.1.1"
|
|
95
|
-
"zod-to-json-schema": "^3.25.2"
|
|
95
|
+
"vitest": "^4.1.1"
|
|
96
96
|
}
|
|
97
97
|
}
|