cryptoiz-mcp 3.3.0 → 3.5.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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +57 -15
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cryptoiz-mcp",
3
- "version": "3.3.0",
3
+ "version": "3.5.0",
4
4
  "description": "CryptoIZ MCP Server — Solana DEX signals with x402 micropayments. Pay $0.01 USDC per call.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/index.js CHANGED
@@ -57,13 +57,11 @@ const FOOTER = [
57
57
  `SUBSCRIBE : https://cryptoiz.org/Pricing`,
58
58
  ].join('\n');
59
59
 
60
- const CA_LINE = (addr) => {
61
- if (!addr || addr === 'N/A') return ` TRADE_LINK : N/A`;
62
- return [
63
- ` CONTRACT_ADDRESS : ${addr}`,
64
- ` TRADE_ON_JUPITER : https://jup.ag/swap/SOL-${addr}`,
65
- ` TRADE_ON_RAYDIUM : https://raydium.io/swap/?inputCurrency=sol&outputCurrency=${addr}`,
66
- ].join('\n');
60
+ // CA embedded in name line — proven to work (v3.0.x)
61
+ // Claude cannot separate name from CA when on same line
62
+ const CA_LINE = (name, addr) => {
63
+ if (!addr || addr === 'N/A') return `${name} | CA: NOT AVAILABLE`;
64
+ return `${name} | CA: ${addr} | JUPITER: https://jup.ag/swap/SOL-${addr}`;
67
65
  };
68
66
 
69
67
  // ══════════════════════════════════════════════════════════════════
@@ -96,8 +94,7 @@ function formatAlpha(data) {
96
94
  parseFloat(t.alpha_score) >= 75 ? '⚡ STRONG SIGNAL' :
97
95
  parseFloat(t.alpha_score) >= 65 ? '👁 WATCH' : '📋 MONITOR';
98
96
  return [
99
- `[${String(i+1).padStart(2,'0')}] ${t.name || 'Unknown'} — ${urgency}`,
100
- CA_LINE(t.contract_address || 'N/A'),
97
+ `[${String(i+1).padStart(2,'0')}] ${CA_LINE(t.name || "Unknown", t.contract_address || "N/A")} — ${urgency}`,
101
98
  ``,
102
99
  ` SIGNAL_CLASS : ${t.signal_class}`,
103
100
  ` ALPHA_SCORE : ${N(t.alpha_score)} / 100`,
@@ -195,8 +192,7 @@ function formatDivergence(data) {
195
192
  parseFloat(s.divergence_score) > 50 ? '👁 MODERATE' : '📋 LOW';
196
193
  lines.push([
197
194
  ``,
198
- ` [${String(i+1).padStart(2,'0')}] ${s.name || 'Unknown'} — Signal Strength: ${urgency}`,
199
- CA_LINE(s.contract_address || 'N/A'),
195
+ ` [${String(i+1).padStart(2,'0')}] ${CA_LINE(s.name || "Unknown", s.contract_address || "N/A")} — ${urgency}`,
200
196
  ``,
201
197
  ` DIVERGENCE_TYPE : ${s.divergence_type}`,
202
198
  ` DIVERGENCE_SCORE : ${N(s.divergence_score)}`,
@@ -258,8 +254,7 @@ function formatAccumulation(data) {
258
254
  t.accumulation_strength?.includes('STRONG') ? '⚡ STRONG FORMING' :
259
255
  t.accumulation_strength?.includes('FORMING') ? '👁 FORMING' : '📋 WEAK/NOISY';
260
256
  return [
261
- `[${String(i+1).padStart(2,'0')}] ${t.name || 'Unknown'} — ${urgency}`,
262
- CA_LINE(t.contract_address || 'N/A'),
257
+ `[${String(i+1).padStart(2,'0')}] ${CA_LINE(t.name || "Unknown", t.contract_address || "N/A")} — ${urgency}`,
263
258
  ``,
264
259
  ` ACCUMULATION_STRENGTH : ${t.accumulation_strength || 'N/A'}`,
265
260
  ` ACCDIST_STATUS : ${t.accdist_status || 'N/A'}`,
@@ -440,7 +435,7 @@ const TOOLS = [
440
435
  // ══════════════════════════════════════════════════════════════════
441
436
  // SERVER
442
437
  // ══════════════════════════════════════════════════════════════════
443
- const server = new Server({ name: 'cryptoiz-mcp', version: '3.3.0' }, { capabilities: { tools: {} } });
438
+ const server = new Server({ name: 'cryptoiz-mcp', version: '3.5.0' }, { capabilities: { tools: {} } });
444
439
  server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
445
440
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
446
441
  const { name, arguments: args } = request.params;
@@ -473,7 +468,54 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
473
468
  return { content: [{ type: 'text', text: formatBTC(data) }] };
474
469
  }
475
470
 
476
- return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
471
+ if (name === 'get_token_ca') {
472
+ const tokenName = args?.token_name || '';
473
+ const data = await payAndFetch(`${GATEWAY_URL}?tool=get_alpha_scanner`);
474
+
475
+ if (data.error) return { content: [{ type: 'text', text: `Error: ${data.error}` }], isError: true };
476
+
477
+ // Search by name (case insensitive)
478
+ const signals = data.signals || [];
479
+ const match = signals.find(s =>
480
+ (s.name || '').toLowerCase().includes(tokenName.toLowerCase()) ||
481
+ tokenName.toLowerCase().includes((s.name || '').toLowerCase())
482
+ );
483
+
484
+ if (!match) {
485
+ return { content: [{ type: 'text', text: [
486
+ `Token "${tokenName}" not found in today's CryptoIZ signals.`,
487
+ ``,
488
+ `Available tokens today: ${signals.map(s => s.name).join(', ')}`,
489
+ ``,
490
+ `Try get_alpha_scanner to see all available tokens.`,
491
+ ].join('\n') }] };
492
+ }
493
+
494
+ return { content: [{ type: 'text', text: [
495
+ `TOKEN VERIFICATION — ${match.name}`,
496
+ ``,
497
+ `⚠ IMPORTANT: Many fake tokens use the same name.`,
498
+ `⚠ ONLY use this exact contract address to avoid scams.`,
499
+ ``,
500
+ `TOKEN_NAME : ${match.name}`,
501
+ `CONTRACT_ADDRESS : ${match.contract_address}`,
502
+ ``,
503
+ `TRADE LINKS (verified):`,
504
+ `BUY_ON_JUPITER : https://jup.ag/swap/SOL-${match.contract_address}`,
505
+ `BUY_ON_RAYDIUM : https://raydium.io/swap/?inputCurrency=sol&outputCurrency=${match.contract_address}`,
506
+ ``,
507
+ `CURRENT SIGNALS:`,
508
+ `ALPHA_SCORE : ${match.alpha_score}`,
509
+ `SIGNAL_CLASS : ${match.signal_class}`,
510
+ `MARKET_CAP : ${match.market_cap_now || 'N/A'}`,
511
+ `PRICE_NOW : $${match.price_now_usd || 'N/A'}`,
512
+ ``,
513
+ `Data from CryptoIZ — https://cryptoiz.org`,
514
+ `Not financial advice. Always DYOR.`,
515
+ ].join('\n') }] };
516
+ }
517
+
518
+ return { content: [{ type: 'text', text: `Unknown tool: \${name}` }], isError: true };
477
519
  } catch (err) {
478
520
  return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
479
521
  }