@gmpsignal/mcp-server 0.0.0-stage → 1.1.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.
Files changed (4) hide show
  1. package/README.md +44 -2
  2. package/bin/cli.mjs +528 -0
  3. package/index.mjs +120 -0
  4. package/package.json +52 -5
package/README.md CHANGED
@@ -1,3 +1,45 @@
1
- # Temporary Holding Version
1
+ # `gmpsignal-mcp` — Official MCP Server Launcher for GMPSignal's 40 Apify Intelligence APIs
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Connect **40 production-grade JSON APIs & Apify Actors** by **[GMPSignal (`@gmpsignal`)](https://apify.com/gmpsignal)** directly into **Claude Desktop, Cursor, Windsurf, and MCP-compatible AI Agents** with a single command.
4
+
5
+ ---
6
+
7
+ ## Quick Usage
8
+
9
+ ### 1. Print Ready-to-Paste Claude Desktop / Cursor MCP Config
10
+ ```bash
11
+ npx gmpsignal-mcp --print-config --suite flagship
12
+ ```
13
+
14
+ ### 2. List All 40 Actors by Vertical Suite
15
+ ```bash
16
+ npx gmpsignal-mcp --list
17
+ ```
18
+
19
+ ### 3. Run Directly as an MCP Server in `claude_desktop_config.json` or `.cursor/mcp.json`
20
+ ```json
21
+ {
22
+ "mcpServers": {
23
+ "gmpsignal": {
24
+ "command": "npx",
25
+ "args": ["-y", "gmpsignal-mcp", "--suite", "flagship"],
26
+ "env": {
27
+ "APIFY_TOKEN": "<YOUR_APIFY_API_TOKEN>"
28
+ }
29
+ }
30
+ }
31
+ }
32
+ ```
33
+
34
+ ---
35
+
36
+ ## Available `--suite` Presets
37
+
38
+ | Suite Name | Included Intelligence Tools |
39
+ |---|---|
40
+ | `flagship` *(Default)* | Top 11 global Actors: DEX Security Auditor, Crypto OrderBook Arbitrage, Multi-Chain Wallet AML, DeFi Yield/TVL, Polymarket/Kalshi Odds, B2B Tech-Stack & Contacts, Global Sanctions/GLEIF KYB, CISA KEV + EPSS Cyber, YC/GitHub Startup Radar, OpenAlex Scientific R&D, and Shopify Store Scraper |
41
+ | `crypto` | 6 Quantitative Crypto, DeFi, OrderBook, Wallet AML & Prediction Market Actors |
42
+ | `b2b` | 4 B2B Lead Enrichment, Shopify E-Commerce, VC Deal-Flow & European Jobs Actors |
43
+ | `compliance` | 8 KYB/Sanctions, CISA KEV Cybersecurity, OpenAlex R&D, SEC EDGAR, FDA & EU TED Actors |
44
+ | `regional` | 22 Seismic, Central Bank FX, Balkan Marketplace & Regional Mobility Actors |
45
+ | `all` | All 40 GMPSignal Apify Actors |
package/bin/cli.mjs ADDED
@@ -0,0 +1,528 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @file cli.mjs
4
+ * @description Official Model Context Protocol (MCP) JSON-RPC 2.0 stdio server and CLI launcher
5
+ * for the GMPSignal 40-Actor Enterprise Data, Quantitative Crypto, Prediction Markets,
6
+ * B2B Enrichment, KYB/Sanctions, Cybersecurity & Regulatory Intelligence Suite on Apify.
7
+ * Supports full offline/container introspection (initialize, tools/list, resources/list,
8
+ * prompts/list) for Glama.ai / Smithery.ai inspections and executes live Apify Actor runs on tools/call.
9
+ */
10
+
11
+ import readline from 'node:readline';
12
+ import { GMPSIGNAL_SUITES, resolveActorsForSuite, buildMcpServerConfig } from '../index.mjs';
13
+
14
+ /**
15
+ * Detailed MCP Tool schemas for GMPSignal's Flagship & Regional Apify Intelligence Actors.
16
+ * @type {Array<{name: string, actorSlug: string, description: string, inputSchema: Object}>}
17
+ */
18
+ const MCP_TOOL_DEFINITIONS = [
19
+ {
20
+ name: 'dex_token_scanner_security_auditor',
21
+ actorSlug: 'gmpsignal~dex-token-scanner-security-auditor',
22
+ description: 'Scan DEX tokens across Solana, Ethereum, Base, Arbitrum, and BSC using DexScreener and GoPlus Security APIs to detect honeypots, mint/freeze authority, buy/sell taxes, and liquidity locks.',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ chainId: { type: 'string', description: 'Target blockchain network (e.g., solana, ethereum, base, arbitrum, bsc).', default: 'solana' },
27
+ searchQuery: { type: 'string', description: 'Token symbol, name, or contract/pair address to audit.', default: 'SOL' },
28
+ minLiquidityUsd: { type: 'number', description: 'Minimum pool liquidity in USD.', default: 10000 },
29
+ maxResults: { type: 'integer', description: 'Maximum number of audited token pairs to return.', default: 15 }
30
+ },
31
+ required: []
32
+ }
33
+ },
34
+ {
35
+ name: 'crypto_orderbook_arbitrage_scanner',
36
+ actorSlug: 'gmpsignal~crypto-orderbook-arbitrage-scanner',
37
+ description: 'Analyze live Level-2 order book depth, $10k/$50k/$100k execution slippage, and cross-exchange arbitrage spreads across Binance, Bybit, Kraken, Coinbase, OKX, and KuCoin.',
38
+ inputSchema: {
39
+ type: 'object',
40
+ properties: {
41
+ symbols: { type: 'array', items: { type: 'string' }, description: 'Trading pairs to scan (e.g., BTCUSDT, ETHUSDT, SOLUSDT).', default: ['BTCUSDT', 'ETHUSDT'] },
42
+ exchanges: { type: 'array', items: { type: 'string' }, description: 'Exchanges to compare.', default: ['binance', 'bybit', 'kraken', 'coinbase'] },
43
+ maxResults: { type: 'integer', description: 'Maximum order book records to return.', default: 20 }
44
+ },
45
+ required: []
46
+ }
47
+ },
48
+ {
49
+ name: 'multichain_wallet_aml_risk_screener',
50
+ actorSlug: 'gmpsignal~multichain-wallet-aml-risk-screener',
51
+ description: 'Screen EVM and Solana wallet addresses for native balances, transaction velocity, mixer exposure, sanctions flags, and automated AML risk scores.',
52
+ inputSchema: {
53
+ type: 'object',
54
+ properties: {
55
+ addresses: { type: 'array', items: { type: 'string' }, description: 'Wallet addresses to screen.' },
56
+ chains: { type: 'array', items: { type: 'string' }, description: 'Chains to query (ethereum, base, arbitrum, polygon, bsc, solana).', default: ['ethereum'] },
57
+ maxTransactions: { type: 'integer', description: 'Maximum recent transactions to inspect per wallet.', default: 10 }
58
+ },
59
+ required: ['addresses']
60
+ }
61
+ },
62
+ {
63
+ name: 'defi_yield_tvl_stablecoin_monitor',
64
+ actorSlug: 'gmpsignal~defi-yield-tvl-stablecoin-monitor',
65
+ description: 'Monitor DeFi yield farming APY pools, multi-chain protocol TVL momentum, and stablecoin peg health using live DeFiLlama intelligence.',
66
+ inputSchema: {
67
+ type: 'object',
68
+ properties: {
69
+ mode: { type: 'string', description: 'Query mode: yield_pools, protocol_tvl, or stablecoins.', default: 'yield_pools' },
70
+ chains: { type: 'array', items: { type: 'string' }, description: 'Chains to filter (e.g., Ethereum, Solana, Arbitrum, Base).', default: ['Ethereum', 'Solana'] },
71
+ minTvlUsd: { type: 'number', description: 'Minimum pool TVL in USD.', default: 1000000 },
72
+ maxResults: { type: 'integer', description: 'Maximum records to return.', default: 25 }
73
+ },
74
+ required: []
75
+ }
76
+ },
77
+ {
78
+ name: 'prediction_markets_polymarket_kalshi_scanner',
79
+ actorSlug: 'gmpsignal~prediction-markets-polymarket-kalshi-scanner',
80
+ description: 'Fetch real-time implied probabilities, yes/no odds, trading volume, liquidity, and arbitrage opportunities across Polymarket, Kalshi, and Manifold Markets.',
81
+ inputSchema: {
82
+ type: 'object',
83
+ properties: {
84
+ sources: { type: 'array', items: { type: 'string' }, description: 'Prediction market venues (polymarket, kalshi, manifold).', default: ['polymarket', 'kalshi'] },
85
+ keyword: { type: 'string', description: 'Optional keyword filter for market questions.', default: '' },
86
+ minVolumeUsd: { type: 'number', description: 'Minimum market volume in USD.', default: 1000 },
87
+ maxResults: { type: 'integer', description: 'Maximum prediction markets to return.', default: 25 }
88
+ },
89
+ required: []
90
+ }
91
+ },
92
+ {
93
+ name: 'b2b_company_techstack_contacts_enricher',
94
+ actorSlug: 'gmpsignal~b2b-company-techstack-contacts-enricher',
95
+ description: 'Enrich B2B company domains with decision-maker emails, phone numbers, social profiles, 38+ technology stack fingerprints, MX/SPF/DMARC security posture, and RDAP registration data.',
96
+ inputSchema: {
97
+ type: 'object',
98
+ properties: {
99
+ domains: { type: 'array', items: { type: 'string' }, description: 'Company domains to enrich (e.g., stripe.com, apify.com).' },
100
+ extractContacts: { type: 'boolean', description: 'Extract emails, phones, and social links.', default: true },
101
+ detectTechStack: { type: 'boolean', description: 'Detect frontend, analytics, CRM, and infrastructure technologies.', default: true },
102
+ maxResults: { type: 'integer', description: 'Maximum enriched domain records to return.', default: 10 }
103
+ },
104
+ required: ['domains']
105
+ }
106
+ },
107
+ {
108
+ name: 'global_sanctions_pep_gleif_kyb_screener',
109
+ actorSlug: 'gmpsignal~global-sanctions-pep-gleif-kyb-screener',
110
+ description: 'Screen corporate entities and individuals against GLEIF Legal Entity Identifiers (LEI), OFAC/UN/EU global sanctions lists, and PEP compliance databases.',
111
+ inputSchema: {
112
+ type: 'object',
113
+ properties: {
114
+ entities: { type: 'array', items: { type: 'string' }, description: 'Company or individual names to screen for KYB/AML compliance.' },
115
+ includeGleifLei: { type: 'boolean', description: 'Query official GLEIF LEI corporate registry.', default: true },
116
+ includeSanctionsMatch: { type: 'boolean', description: 'Screen against global sanctions and watchlists.', default: true },
117
+ maxResults: { type: 'integer', description: 'Maximum compliance records to return.', default: 15 }
118
+ },
119
+ required: ['entities']
120
+ }
121
+ },
122
+ {
123
+ name: 'cyber_cve_kev_epss_vulnerability_scanner',
124
+ actorSlug: 'gmpsignal~cyber-cve-kev-epss-vulnerability-scanner',
125
+ description: 'Correlate CISA Known Exploited Vulnerabilities (KEV), FIRST.org 30-day EPSS exploitation probabilities, and NVD CVSS v3 severity scores for DevSecOps prioritization.',
126
+ inputSchema: {
127
+ type: 'object',
128
+ properties: {
129
+ mode: { type: 'string', description: 'Scan mode: cisa_kev or specific_cves.', default: 'cisa_kev' },
130
+ vendorFilter: { type: 'string', description: 'Optional vendor or product filter (e.g., Microsoft, Cisco, Linux).', default: '' },
131
+ minEpssScore: { type: 'number', description: 'Minimum 30-day EPSS exploitation probability (0.0 to 1.0).', default: 0.05 },
132
+ maxResults: { type: 'integer', description: 'Maximum CVE records to return.', default: 25 }
133
+ },
134
+ required: []
135
+ }
136
+ },
137
+ {
138
+ name: 'startup_vc_dealflow_yc_github_radar',
139
+ actorSlug: 'gmpsignal~startup-vc-dealflow-yc-github-radar',
140
+ description: 'Discover high-traction startups and open-source developer tools across Y Combinator (YC), GitHub Trending repositories, and Hacker News launches.',
141
+ inputSchema: {
142
+ type: 'object',
143
+ properties: {
144
+ sources: { type: 'array', items: { type: 'string' }, description: 'Deal-flow sources (yc_companies, github_trending, hackernews_launch).', default: ['yc_companies', 'github_trending', 'hackernews_launch'] },
145
+ keyword: { type: 'string', description: 'Optional industry or technology keyword filter.', default: '' },
146
+ maxResults: { type: 'integer', description: 'Maximum startup/repository records to return.', default: 25 }
147
+ },
148
+ required: []
149
+ }
150
+ },
151
+ {
152
+ name: 'academic_patent_research_citation_intelligence',
153
+ actorSlug: 'gmpsignal~academic-patent-research-citation-intelligence',
154
+ description: 'Search peer-reviewed scientific papers, citation velocity, DOI metadata, and open-access PDFs across OpenAlex, Semantic Scholar, Crossref, and arXiv.',
155
+ inputSchema: {
156
+ type: 'object',
157
+ properties: {
158
+ query: { type: 'string', description: 'Scientific research topic, keyword, or author query.', default: 'autonomous AI agents' },
159
+ sources: { type: 'array', items: { type: 'string' }, description: 'Academic databases (openalex, semantic_scholar, arxiv, crossref).', default: ['openalex', 'semantic_scholar', 'arxiv'] },
160
+ minYear: { type: 'integer', description: 'Minimum publication year.', default: 2024 },
161
+ maxResults: { type: 'integer', description: 'Maximum papers to return.', default: 20 }
162
+ },
163
+ required: ['query']
164
+ }
165
+ },
166
+ {
167
+ name: 'shopify_global_store_products_scraper',
168
+ actorSlug: 'gmpsignal~shopify-global-store-products-scraper',
169
+ description: 'Extract complete product catalogs, SKU variants, stock availability, compare-at prices, and discount percentages from any global Shopify store domain.',
170
+ inputSchema: {
171
+ type: 'object',
172
+ properties: {
173
+ stores: { type: 'array', items: { type: 'string' }, description: 'Shopify store domains (e.g., allbirds.com, kyliecosmetics.com).', default: ['allbirds.com', 'kyliecosmetics.com'] },
174
+ searchKeyword: { type: 'string', description: 'Optional keyword filter for product title or tags.', default: '' },
175
+ onlyInStock: { type: 'boolean', description: 'Return only in-stock products.', default: false },
176
+ maxProductsPerStore: { type: 'integer', description: 'Maximum products per store.', default: 15 },
177
+ maxResults: { type: 'integer', description: 'Maximum total products to return.', default: 30 }
178
+ },
179
+ required: ['stores']
180
+ }
181
+ },
182
+ {
183
+ name: 'sec_edgar_filings_scraper',
184
+ actorSlug: 'gmpsignal~sec-edgar-filings',
185
+ description: 'Fetch official US SEC EDGAR corporate filings (10-K, 10-Q, 8-K, Form 4 insider transactions) by ticker, CIK, or form type.',
186
+ inputSchema: {
187
+ type: 'object',
188
+ properties: {
189
+ tickers: { type: 'array', items: { type: 'string' }, description: 'Stock tickers or CIK codes (e.g., AAPL, NVDA, MSFT).', default: ['AAPL', 'NVDA'] },
190
+ forms: { type: 'array', items: { type: 'string' }, description: 'SEC form types (e.g., 10-K, 10-Q, 8-K, 4).', default: ['10-K', '10-Q', '8-K'] },
191
+ maxResults: { type: 'integer', description: 'Maximum filings to return.', default: 25 }
192
+ },
193
+ required: []
194
+ }
195
+ },
196
+ {
197
+ name: 'eu_ted_public_tenders_scraper',
198
+ actorSlug: 'gmpsignal~eu-ted-tenders-scraper',
199
+ description: 'Search European Union Tenders Electronic Daily (TED) public procurement notices, CPV codes, contracting authorities, and official PDF/HTML links.',
200
+ inputSchema: {
201
+ type: 'object',
202
+ properties: {
203
+ searchQuery: { type: 'string', description: 'Procurement keyword or CPV topic.', default: 'software' },
204
+ maxResults: { type: 'integer', description: 'Maximum tender notices to return.', default: 25 }
205
+ },
206
+ required: []
207
+ }
208
+ },
209
+ {
210
+ name: 'fda_warning_letters_compliance_scraper',
211
+ actorSlug: 'gmpsignal~fda-warning-letters-scraper',
212
+ description: 'Monitor US FDA pharmaceutical, medical device, biologics, and food GMP inspection warning letters and violation categories.',
213
+ inputSchema: {
214
+ type: 'object',
215
+ properties: {
216
+ searchKeyword: { type: 'string', description: 'Optional company name or violation keyword.', default: '' },
217
+ maxResults: { type: 'integer', description: 'Maximum warning letters to return.', default: 25 }
218
+ },
219
+ required: []
220
+ }
221
+ },
222
+ {
223
+ name: 'fda_recalls_enforcement_monitor',
224
+ actorSlug: 'gmpsignal~fda-recalls-enforcement',
225
+ description: 'Query official US openFDA drug, medical device, and food recall enforcement reports.',
226
+ inputSchema: {
227
+ type: 'object',
228
+ properties: {
229
+ category: { type: 'string', description: 'Recall category (drug, device, food).', default: 'drug' },
230
+ maxResults: { type: 'integer', description: 'Maximum recall reports to return.', default: 25 }
231
+ },
232
+ required: []
233
+ }
234
+ },
235
+ {
236
+ name: 'earthquake_monitor_usgs_emsc_afad',
237
+ actorSlug: 'gmpsignal~earthquake-monitor-usgs-emsc-afad',
238
+ description: 'Track cross-verified global and regional seismic events in real time across USGS, EMSC, and AFAD networks.',
239
+ inputSchema: {
240
+ type: 'object',
241
+ properties: {
242
+ minMagnitude: { type: 'string', description: 'Minimum Richter magnitude threshold (e.g., "3.0", "4.5").', default: '4.5' },
243
+ maxResults: { type: 'integer', description: 'Maximum seismic events to return.', default: 25 }
244
+ },
245
+ required: []
246
+ }
247
+ }
248
+ ];
249
+
250
+ /**
251
+ * Executes an Apify Actor synchronously via REST API v2 when a tool is invoked.
252
+ *
253
+ * @param {string} actorSlug - Target Apify Actor slug (`gmpsignal~...`).
254
+ * @param {Object} args - Tool input arguments.
255
+ * @returns {Promise<Array<Object>>} Dataset items returned by the Actor run.
256
+ */
257
+ async function invokeApifyActor(actorSlug, args) {
258
+ const token = process.env.APIFY_TOKEN || '';
259
+ if (!token) {
260
+ throw new Error('APIFY_TOKEN environment variable is required to execute live Apify Actor runs. Get your token at https://console.apify.com/settings/integrations');
261
+ }
262
+ const url = `https://api.apify.com/v2/acts/${encodeURIComponent(actorSlug)}/run-sync-get-dataset-items?token=${encodeURIComponent(token)}`;
263
+ const response = await fetch(url, {
264
+ method: 'POST',
265
+ headers: {
266
+ 'Content-Type': 'application/json',
267
+ 'Accept': 'application/json'
268
+ },
269
+ body: JSON.stringify(args || {})
270
+ });
271
+ if (!response.ok) {
272
+ const errBody = await response.text();
273
+ throw new Error(`Apify Actor ${actorSlug} returned HTTP ${response.status}: ${errBody}`);
274
+ }
275
+ return await response.json();
276
+ }
277
+
278
+ /**
279
+ * Sends a JSON-RPC 2.0 response over stdout.
280
+ *
281
+ * @param {string|number|null} id - Request ID.
282
+ * @param {Object} result - Result payload.
283
+ */
284
+ function sendJsonRpcResult(id, result) {
285
+ const payload = {
286
+ jsonrpc: '2.0',
287
+ id,
288
+ result
289
+ };
290
+ process.stdout.write(`${JSON.stringify(payload)}\n`);
291
+ }
292
+
293
+ /**
294
+ * Sends a JSON-RPC 2.0 error over stdout.
295
+ *
296
+ * @param {string|number|null} id - Request ID.
297
+ * @param {number} code - JSON-RPC error code.
298
+ * @param {string} message - Error description.
299
+ */
300
+ function sendJsonRpcError(id, code, message) {
301
+ const payload = {
302
+ jsonrpc: '2.0',
303
+ id,
304
+ error: {
305
+ code,
306
+ message
307
+ }
308
+ };
309
+ process.stdout.write(`${JSON.stringify(payload)}\n`);
310
+ }
311
+
312
+ /**
313
+ * Handles an incoming JSON-RPC 2.0 message from the MCP host or inspection harness.
314
+ *
315
+ * @param {Object} message - Parsed JSON-RPC 2.0 message.
316
+ * @returns {Promise<void>}
317
+ */
318
+ async function handleJsonRpcMessage(message) {
319
+ if (!message || typeof message !== 'object') {
320
+ return;
321
+ }
322
+
323
+ const { id, method, params } = message;
324
+
325
+ if (method === 'initialize') {
326
+ sendJsonRpcResult(id, {
327
+ protocolVersion: (params && params.protocolVersion) ? params.protocolVersion : '2024-11-05',
328
+ capabilities: {
329
+ tools: { listChanged: false },
330
+ resources: { subscribe: false, listChanged: false },
331
+ prompts: { listChanged: false }
332
+ },
333
+ serverInfo: {
334
+ name: 'gmpsignal-mcp-server',
335
+ version: '1.1.0'
336
+ }
337
+ });
338
+ return;
339
+ }
340
+
341
+ if (method === 'notifications/initialized' || method === 'initialized') {
342
+ return;
343
+ }
344
+
345
+ if (method === 'ping') {
346
+ sendJsonRpcResult(id, {});
347
+ return;
348
+ }
349
+
350
+ if (method === 'tools/list') {
351
+ sendJsonRpcResult(id, {
352
+ tools: MCP_TOOL_DEFINITIONS.map((t) => ({
353
+ name: t.name,
354
+ description: t.description,
355
+ inputSchema: t.inputSchema
356
+ }))
357
+ });
358
+ return;
359
+ }
360
+
361
+ if (method === 'resources/list') {
362
+ sendJsonRpcResult(id, {
363
+ resources: [
364
+ {
365
+ uri: 'mcp://gmpsignal/actors-catalog',
366
+ name: 'GMPSignal 40-Actor Enterprise Intelligence Suite Catalog',
367
+ description: 'Complete list of 40 Apify Actors organized across Crypto/Quant, B2B/E-Commerce, KYB/Cyber/Regulatory, and Regional suites.',
368
+ mimeType: 'application/json'
369
+ }
370
+ ]
371
+ });
372
+ return;
373
+ }
374
+
375
+ if (method === 'resources/read') {
376
+ const uri = params && params.uri ? params.uri : 'mcp://gmpsignal/actors-catalog';
377
+ sendJsonRpcResult(id, {
378
+ contents: [
379
+ {
380
+ uri,
381
+ mimeType: 'application/json',
382
+ text: JSON.stringify(GMPSIGNAL_SUITES, null, 2)
383
+ }
384
+ ]
385
+ });
386
+ return;
387
+ }
388
+
389
+ if (method === 'prompts/list') {
390
+ sendJsonRpcResult(id, {
391
+ prompts: [
392
+ {
393
+ name: 'crypto_token_due_diligence',
394
+ description: 'Perform smart-contract rugpull auditing and multi-exchange order book slippage analysis on a target crypto token.',
395
+ arguments: [
396
+ { name: 'tokenSymbol', description: 'Token symbol or contract address (e.g., SOL, PEPE).', required: true },
397
+ { name: 'chainId', description: 'Blockchain network (e.g., solana, ethereum, base).', required: false }
398
+ ]
399
+ },
400
+ {
401
+ name: 'b2b_lead_and_kyb_compliance_check',
402
+ description: 'Enrich a company domain with tech-stack and contacts while screening the corporate entity against GLEIF LEI and global sanctions.',
403
+ arguments: [
404
+ { name: 'domain', description: 'Company website domain (e.g., stripe.com).', required: true },
405
+ { name: 'companyName', description: 'Legal entity name for KYB screening.', required: true }
406
+ ]
407
+ }
408
+ ]
409
+ });
410
+ return;
411
+ }
412
+
413
+ if (method === 'prompts/get') {
414
+ const promptName = params && params.name ? params.name : 'crypto_token_due_diligence';
415
+ const promptArgs = (params && params.arguments) || {};
416
+ sendJsonRpcResult(id, {
417
+ description: `GMPSignal automated workflow prompt for ${promptName}`,
418
+ messages: [
419
+ {
420
+ role: 'user',
421
+ content: {
422
+ type: 'text',
423
+ text: `Execute the GMPSignal MCP tools for ${promptName} with parameters: ${JSON.stringify(promptArgs)}`
424
+ }
425
+ }
426
+ ]
427
+ });
428
+ return;
429
+ }
430
+
431
+ if (method === 'tools/call') {
432
+ const toolName = params && params.name;
433
+ const toolArgs = (params && params.arguments) || {};
434
+ const toolDef = MCP_TOOL_DEFINITIONS.find((t) => t.name === toolName);
435
+ if (!toolDef) {
436
+ sendJsonRpcError(id, -32602, `Unknown GMPSignal MCP tool: ${toolName}`);
437
+ return;
438
+ }
439
+ try {
440
+ const items = await invokeApifyActor(toolDef.actorSlug, toolArgs);
441
+ sendJsonRpcResult(id, {
442
+ content: [
443
+ {
444
+ type: 'text',
445
+ text: JSON.stringify(items, null, 2)
446
+ }
447
+ ],
448
+ isError: false
449
+ });
450
+ } catch (err) {
451
+ sendJsonRpcResult(id, {
452
+ content: [
453
+ {
454
+ type: 'text',
455
+ text: `Error executing ${toolDef.actorSlug}: ${err.message}`
456
+ }
457
+ ],
458
+ isError: true
459
+ });
460
+ }
461
+ return;
462
+ }
463
+
464
+ if (id !== undefined && id !== null) {
465
+ sendJsonRpcError(id, -32601, `Method not found: ${method}`);
466
+ }
467
+ }
468
+
469
+ /**
470
+ * Parses CLI flags or starts the native JSON-RPC 2.0 MCP server over stdio.
471
+ */
472
+ function main() {
473
+ const argv = process.argv.slice(2);
474
+ let suite = 'flagship';
475
+ let listOnly = false;
476
+ let printConfig = false;
477
+
478
+ for (let i = 0; i < argv.length; i += 1) {
479
+ const arg = argv[i];
480
+ if (arg === '--suite' && argv[i + 1]) {
481
+ suite = argv[i + 1];
482
+ i += 1;
483
+ } else if (arg === '--list') {
484
+ listOnly = true;
485
+ } else if (arg === '--print-config') {
486
+ printConfig = true;
487
+ }
488
+ }
489
+
490
+ if (listOnly) {
491
+ console.log('GMPSignal 40-Actor Intelligence Suites (https://apify.com/gmpsignal):');
492
+ for (const [suiteKey, actorList] of Object.entries(GMPSIGNAL_SUITES)) {
493
+ console.log(`\n[${suiteKey.toUpperCase()}] (${actorList.length} Actors):`);
494
+ for (const slug of actorList) {
495
+ console.log(` - ${slug}`);
496
+ }
497
+ }
498
+ return;
499
+ }
500
+
501
+ if (printConfig) {
502
+ const configObj = buildMcpServerConfig(suite);
503
+ console.log(JSON.stringify(configObj, null, 2));
504
+ return;
505
+ }
506
+
507
+ const rl = readline.createInterface({
508
+ input: process.stdin,
509
+ terminal: false
510
+ });
511
+
512
+ rl.on('line', (line) => {
513
+ const trimmed = line.trim();
514
+ if (!trimmed) return;
515
+ try {
516
+ const parsed = JSON.parse(trimmed);
517
+ handleJsonRpcMessage(parsed).catch((err) => {
518
+ if (parsed && parsed.id !== undefined) {
519
+ sendJsonRpcError(parsed.id, -32603, err.message);
520
+ }
521
+ });
522
+ } catch (_err) {
523
+ sendJsonRpcError(null, -32700, 'Parse error');
524
+ }
525
+ });
526
+ }
527
+
528
+ main();
package/index.mjs ADDED
@@ -0,0 +1,120 @@
1
+ /**
2
+ * @file index.mjs
3
+ * @description Programmatic SDK and Suite Registry for the GMPSignal 40-Actor Enterprise
4
+ * Data & Model Context Protocol (MCP) Intelligence Suite on Apify.
5
+ */
6
+
7
+ /**
8
+ * Curated Actor suites organized by vertical use case.
9
+ * @type {Record<string, Array<string>>}
10
+ */
11
+ export const GMPSIGNAL_SUITES = {
12
+ flagship: [
13
+ 'gmpsignal/dex-token-scanner-security-auditor',
14
+ 'gmpsignal/crypto-orderbook-arbitrage-scanner',
15
+ 'gmpsignal/multichain-wallet-aml-risk-screener',
16
+ 'gmpsignal/defi-yield-tvl-stablecoin-monitor',
17
+ 'gmpsignal/prediction-markets-polymarket-kalshi-scanner',
18
+ 'gmpsignal/b2b-company-techstack-contacts-enricher',
19
+ 'gmpsignal/global-sanctions-pep-gleif-kyb-screener',
20
+ 'gmpsignal/cyber-cve-kev-epss-vulnerability-scanner',
21
+ 'gmpsignal/startup-vc-dealflow-yc-github-radar',
22
+ 'gmpsignal/academic-patent-research-citation-intelligence',
23
+ 'gmpsignal/shopify-global-store-products-scraper'
24
+ ],
25
+ crypto: [
26
+ 'gmpsignal/dex-token-scanner-security-auditor',
27
+ 'gmpsignal/crypto-orderbook-arbitrage-scanner',
28
+ 'gmpsignal/multichain-wallet-aml-risk-screener',
29
+ 'gmpsignal/defi-yield-tvl-stablecoin-monitor',
30
+ 'gmpsignal/prediction-markets-polymarket-kalshi-scanner',
31
+ 'gmpsignal/turkey-crypto-exchange-prices'
32
+ ],
33
+ b2b: [
34
+ 'gmpsignal/b2b-company-techstack-contacts-enricher',
35
+ 'gmpsignal/shopify-global-store-products-scraper',
36
+ 'gmpsignal/startup-vc-dealflow-yc-github-radar',
37
+ 'gmpsignal/german-jobs-scraper'
38
+ ],
39
+ compliance: [
40
+ 'gmpsignal/global-sanctions-pep-gleif-kyb-screener',
41
+ 'gmpsignal/cyber-cve-kev-epss-vulnerability-scanner',
42
+ 'gmpsignal/academic-patent-research-citation-intelligence',
43
+ 'gmpsignal/sec-edgar-filings',
44
+ 'gmpsignal/fda-warning-letters-scraper',
45
+ 'gmpsignal/fda-recalls-enforcement',
46
+ 'gmpsignal/eu-ted-tenders-scraper',
47
+ 'gmpsignal/global-product-recalls'
48
+ ],
49
+ regional: [
50
+ 'gmpsignal/earthquake-monitor-usgs-emsc-afad',
51
+ 'gmpsignal/europe-mediterranean-earthquakes-emsc-official-data',
52
+ 'gmpsignal/turkey-earthquakes-afad-official-data',
53
+ 'gmpsignal/islamic-prayer-times-worldwide-monthly-calendars',
54
+ 'gmpsignal/njuskalo-scraper',
55
+ 'gmpsignal/bolha-scraper',
56
+ 'gmpsignal/olx-ba-scraper',
57
+ 'gmpsignal/halooglasi-serbia-scraper',
58
+ 'gmpsignal/kupujemprodajem-scraper',
59
+ 'gmpsignal/pazar3-merrjep-balkan-scraper',
60
+ 'gmpsignal/tcmb-exchange-rates-official-turkish-central-bank-fx',
61
+ 'gmpsignal/turkey-gold-prices',
62
+ 'gmpsignal/turkey-weather-mgm-official',
63
+ 'gmpsignal/turkey-on-duty-pharmacies-nobetci-eczane-daily',
64
+ 'gmpsignal/turkey-fuel-prices-81-provinces-daily-benzin-motorin-lpg',
65
+ 'gmpsignal/turkey-car-rental-prices-city-airport-index',
66
+ 'gmpsignal/turkey-hotels-explorer-ratings-amenities',
67
+ 'gmpsignal/turkey-domestic-flight-prices',
68
+ 'gmpsignal/eksi-sozluk-scraper-entries-trending',
69
+ 'gmpsignal/turkey-greek-islands-ferry-schedules',
70
+ 'gmpsignal/turkey-bus-routes-prices',
71
+ 'gmpsignal/hepsiemlak-scraper-turkey-real-estate-listings'
72
+ ]
73
+ };
74
+
75
+ /**
76
+ * Resolves the unique list of GMPSignal Actor slugs for a given suite name.
77
+ *
78
+ * @param {string} suiteName - Suite identifier ('flagship', 'crypto', 'b2b', 'compliance', 'regional', or 'all').
79
+ * @returns {Array<string>} Array of full Apify Actor slugs (`gmpsignal/<slug>`).
80
+ */
81
+ export function resolveActorsForSuite(suiteName = 'flagship') {
82
+ const normalized = String(suiteName || 'flagship').toLowerCase().trim();
83
+ if (normalized === 'all') {
84
+ const unique = new Set([
85
+ ...GMPSIGNAL_SUITES.crypto,
86
+ ...GMPSIGNAL_SUITES.b2b,
87
+ ...GMPSIGNAL_SUITES.compliance,
88
+ ...GMPSIGNAL_SUITES.regional
89
+ ]);
90
+ return Array.from(unique);
91
+ }
92
+ return GMPSIGNAL_SUITES[normalized] || GMPSIGNAL_SUITES.flagship;
93
+ }
94
+
95
+ /**
96
+ * Builds a complete Claude Desktop / Cursor MCP configuration object.
97
+ *
98
+ * @param {string} suiteName - Target suite identifier.
99
+ * @param {string} apiTokenPlaceholder - Placeholder or actual Apify API token.
100
+ * @returns {Object} JSON-serializable MCP configuration object.
101
+ */
102
+ export function buildMcpServerConfig(suiteName = 'flagship', apiTokenPlaceholder = '<YOUR_APIFY_API_TOKEN>') {
103
+ const actors = resolveActorsForSuite(suiteName);
104
+ return {
105
+ mcpServers: {
106
+ [`gmpsignal-${suiteName}`]: {
107
+ command: 'npx',
108
+ args: [
109
+ '-y',
110
+ '@apify/actors-mcp-server',
111
+ '--actors',
112
+ actors.join(',')
113
+ ],
114
+ env: {
115
+ APIFY_TOKEN: apiTokenPlaceholder
116
+ }
117
+ }
118
+ }
119
+ };
120
+ }
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
- "name": "@gmpsignal/mcp-server",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
2
+ "name": "@gmpsignal/mcp-server",
3
+ "version": "1.1.0",
4
+ "description": "Official @gmpsignal Model Context Protocol (MCP) Server & CLI Launcher for the 40-Actor Enterprise Data, Quantitative Crypto, Prediction Markets, B2B Enrichment, KYB/Sanctions, Cybersecurity & Regulatory Suite on Apify.",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "bin": {
8
+ "gmpsignal-mcp-server": "./bin/cli.mjs",
9
+ "gmpsignal-mcp": "./bin/cli.mjs"
10
+ },
11
+ "files": [
12
+ "bin/",
13
+ "index.mjs",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "start": "node ./bin/cli.mjs",
18
+ "list": "node ./bin/cli.mjs --list",
19
+ "print-config": "node ./bin/cli.mjs --print-config"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/devburaq/gmpsignal-mcp-n8n-starter-kit.git"
24
+ },
25
+ "keywords": [
26
+ "mcp",
27
+ "mcp-server",
28
+ "model-context-protocol",
29
+ "apify",
30
+ "claude-desktop",
31
+ "cursor",
32
+ "ai-agents",
33
+ "dexscreener",
34
+ "polymarket",
35
+ "kalshi",
36
+ "b2b-enrichment",
37
+ "kyb-sanctions",
38
+ "cisa-kev",
39
+ "epss",
40
+ "shopify-scraper",
41
+ "sec-edgar",
42
+ "gmpsignal"
43
+ ],
44
+ "author": "GMPSignal <https://apify.com/gmpsignal>",
45
+ "license": "MIT",
46
+ "homepage": "https://github.com/devburaq/gmpsignal-mcp-n8n-starter-kit",
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ }
53
+ }