cryptoiz-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/README.md +101 -0
- package/package.json +27 -0
- package/src/index.js +153 -0
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# cryptoiz-mcp
|
|
2
|
+
|
|
3
|
+
> Real-time Solana DEX signals for Claude Desktop — powered by CryptoIZ Alpha Scanner & Divergence Engine.
|
|
4
|
+
|
|
5
|
+
## What is this?
|
|
6
|
+
|
|
7
|
+
`cryptoiz-mcp` is an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that connects Claude Desktop directly to CryptoIZ's proprietary Solana signal data.
|
|
8
|
+
|
|
9
|
+
Ask Claude things like:
|
|
10
|
+
- *"Which Solana tokens are being accumulated today?"*
|
|
11
|
+
- *"Show me bullish divergence signals on 4h timeframe"*
|
|
12
|
+
- *"What are the top alpha signals right now?"*
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
### 1. Add to Claude Desktop config
|
|
17
|
+
|
|
18
|
+
Open `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"mcpServers": {
|
|
23
|
+
"cryptoiz": {
|
|
24
|
+
"command": "npx",
|
|
25
|
+
"args": ["cryptoiz-mcp"],
|
|
26
|
+
"env": {
|
|
27
|
+
"CRYPTOIZ_API_KEY": "ciz_your_key_here"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Restart Claude Desktop
|
|
35
|
+
|
|
36
|
+
That's it. Claude can now call CryptoIZ tools automatically.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Free vs Paid
|
|
41
|
+
|
|
42
|
+
| Feature | Free (no key) | Basic ($15/mo) | Pro ($25/mo) |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| Accumulation signals | Top 3 only | ✅ Full list | ✅ Full list |
|
|
45
|
+
| Alpha score detail | ❌ | ✅ | ✅ |
|
|
46
|
+
| Whale & dolphin signal | ❌ | ✅ | ✅ |
|
|
47
|
+
| Divergence signals | ❌ | ✅ 4h + 1d | ✅ 4h + 1d |
|
|
48
|
+
| Warkudara peaks | ❌ | ❌ | ✅ |
|
|
49
|
+
| Daily call limit | 3/day | 200/day | Unlimited |
|
|
50
|
+
|
|
51
|
+
Get your API key → **[cryptoiz.org/Pricing](https://cryptoiz.org/Pricing)**
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Available Tools
|
|
56
|
+
|
|
57
|
+
### `get_accum_signals`
|
|
58
|
+
Accumulation tokens hari ini dari CryptoIZ Alpha Scanner.
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
Parameters:
|
|
62
|
+
min_score (optional) — Minimum alpha score filter (0-100)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### `get_divergence`
|
|
66
|
+
Divergence signals dari CryptoIZ Divergence Engine.
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Parameters:
|
|
70
|
+
timeframe (optional) — "4h" (default) or "1d"
|
|
71
|
+
limit (optional) — Max results, 1-50 (default: 20)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### `get_status`
|
|
75
|
+
Cek koneksi, tier aktif, dan tools yang tersedia.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Example Prompts
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
"Show me today's accumulation signals with score above 70"
|
|
83
|
+
"Any bullish divergence on 1d timeframe?"
|
|
84
|
+
"Which tokens are whales accumulating right now on Solana?"
|
|
85
|
+
"Give me the top 5 alpha signals from CryptoIZ today"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## About CryptoIZ
|
|
91
|
+
|
|
92
|
+
CryptoIZ adalah AI-powered Solana DEX trading platform. Data sinyal kami berasal dari proprietary scanner yang menganalisis holder tier, whale/dolphin rotation, phase engine, dan divergence — bukan dari lagging indicators.
|
|
93
|
+
|
|
94
|
+
Website: [cryptoiz.org](https://cryptoiz.org)
|
|
95
|
+
Twitter: [@cryptoiz_IDN](https://twitter.com/cryptoiz_IDN)
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cryptoiz-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CryptoIZ MCP Server — Solana DEX Alpha Scanner, Divergence & Accumulation signals for Claude Desktop",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "src/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"cryptoiz-mcp": "src/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "node src/index.js"
|
|
12
|
+
},
|
|
13
|
+
"keywords": ["cryptoiz", "solana", "defi", "mcp", "claude", "crypto", "alpha", "signals", "divergence", "accumulation"],
|
|
14
|
+
"author": "CryptoIZ <cryptoiz.suport@gmail.com> (https://cryptoiz.org)",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/dadang11/cryptoiz-internal-dashboard2"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://cryptoiz.org",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18.0.0"
|
|
26
|
+
}
|
|
27
|
+
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
|
|
6
|
+
const BASE_URL = 'https://rehqwsypjnjirhuiapqh.supabase.co/functions/v1';
|
|
7
|
+
const API_KEY = process.env.CRYPTOIZ_API_KEY || '';
|
|
8
|
+
|
|
9
|
+
async function callApi(endpoint, params = {}) {
|
|
10
|
+
const url = new URL(`${BASE_URL}/${endpoint}`);
|
|
11
|
+
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
12
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
13
|
+
if (API_KEY) headers['x-api-key'] = API_KEY;
|
|
14
|
+
const res = await fetch(url.toString(), { headers });
|
|
15
|
+
const json = await res.json();
|
|
16
|
+
if (!res.ok) throw new Error(json.error || `HTTP ${res.status}`);
|
|
17
|
+
return json;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function formatAlphaScanner(data) {
|
|
21
|
+
if (!data.signals || data.signals.length === 0) return 'Tidak ada sinyal Alpha Scanner saat ini.';
|
|
22
|
+
const lines = [
|
|
23
|
+
`CRYPTOIZ ALPHA SCANNER`,
|
|
24
|
+
`Tier: ${data.tier.toUpperCase()} | Total: ${data.total} | ${new Date(data.fetched_at).toUTCString()}`,
|
|
25
|
+
data.note ? `INFO: ${data.note}` : '',
|
|
26
|
+
'',
|
|
27
|
+
...data.signals.map((s, i) => {
|
|
28
|
+
if (data.tier === 'free') return `${i+1}. ${s.token} — Phase: ${s.phase} [${s.entry_class}]`;
|
|
29
|
+
const whale = s.whale_delta > 0 ? `WHALE+${s.whale_delta}` : `WHALE${s.whale_delta}`;
|
|
30
|
+
const dolph = s.dolphin_delta > 0 ? `DOLPHIN+${s.dolphin_delta}` : `DOLPHIN${s.dolphin_delta}`;
|
|
31
|
+
return `${i+1}. ${s.token} — Score: ${s.alpha_score} | ${s.entry_class} | Phase: ${s.phase}\n ${whale} | ${dolph} | Regime: ${s.regime || 'N/A'}`;
|
|
32
|
+
}).filter(Boolean),
|
|
33
|
+
'', 'Source: CryptoIZ Alpha Entry Scanner | cryptoiz.org',
|
|
34
|
+
];
|
|
35
|
+
return lines.join('\n');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function formatDivergence(data) {
|
|
39
|
+
if (!data.signals || data.signals.length === 0) return `Tidak ada divergence signal (${data.timeframe}).`;
|
|
40
|
+
const lines = [
|
|
41
|
+
`CRYPTOIZ DIVERGENCE SCANNER — ${data.timeframe?.toUpperCase()}`,
|
|
42
|
+
`Tier: ${data.tier.toUpperCase()} | Total: ${data.total} | ${new Date(data.fetched_at).toUTCString()}`,
|
|
43
|
+
'',
|
|
44
|
+
...data.signals.map((s, i) => {
|
|
45
|
+
const type = s.divergence_type === 'bullish' ? 'BULLISH' : s.divergence_type === 'bearish' ? 'BEARISH' : (s.divergence_type||'').toUpperCase();
|
|
46
|
+
const score = s.divergence_score ? `Score: ${s.divergence_score.toFixed(1)}` : '';
|
|
47
|
+
const conf = s.confidence_score ? `Conf: ${s.confidence_score.toFixed(1)}` : '';
|
|
48
|
+
const mc = s.market_cap_usd ? `MC: $${(s.market_cap_usd/1000).toFixed(0)}K` : '';
|
|
49
|
+
const chg = s.price_change_pct ? `${s.price_change_pct>0?'+':''}${s.price_change_pct.toFixed(1)}%` : '';
|
|
50
|
+
return `${i+1}. ${s.token||s.symbol} [${type}]\n ${[score,conf,mc,chg].filter(Boolean).join(' | ')}`;
|
|
51
|
+
}),
|
|
52
|
+
'', 'Source: CryptoIZ Divergence Engine | cryptoiz.org',
|
|
53
|
+
];
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function formatAccumulation(data) {
|
|
58
|
+
if (!data.tokens || data.tokens.length === 0) return 'Tidak ada token dalam mode akumulasi saat ini.';
|
|
59
|
+
const lines = [
|
|
60
|
+
`CRYPTOIZ AKUMULASI`,
|
|
61
|
+
`Tier: ${data.tier.toUpperCase()} | Total: ${data.total} | ${new Date(data.fetched_at).toUTCString()}`,
|
|
62
|
+
data.note ? `INFO: ${data.note}` : '',
|
|
63
|
+
'',
|
|
64
|
+
...data.tokens.map((t, i) => {
|
|
65
|
+
if (data.tier === 'free') return `${i+1}. ${t.token} — ${t.strength} | ${t.accdist}`;
|
|
66
|
+
const s = t.scores;
|
|
67
|
+
return `${i+1}. ${t.token} — Composite: ${s.composite?.toFixed(1)||'N/A'} | ${t.strength}\n Structure: ${s.structure?.toFixed(1)||'-'} | AccDist: ${s.accdist?.toFixed(0)||'-'} | Holder: ${s.holder?.toFixed(1)||'-'} | Market: ${s.market?.toFixed(1)||'-'}`;
|
|
68
|
+
}).filter(Boolean),
|
|
69
|
+
'', 'Source: CryptoIZ Accumulation Dashboard | cryptoiz.org',
|
|
70
|
+
];
|
|
71
|
+
return lines.join('\n');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function formatStatus() {
|
|
75
|
+
return [
|
|
76
|
+
`CryptoIZ MCP Server v1.1.0`, `Status : CONNECTED`,
|
|
77
|
+
`Tier : ${API_KEY ? 'Basic/Pro (API key terdeteksi)' : 'Free (tidak ada API key)'}`,
|
|
78
|
+
``, `Tools tersedia:`,
|
|
79
|
+
` 1. get_alpha_scanner — Sinyal entry terbaik (Alpha Scanner)`,
|
|
80
|
+
` 2. get_divergence — Divergence bullish/bearish 4h atau 1d`,
|
|
81
|
+
` 3. get_accumulation — Token fase akumulasi (Accum Dashboard)`,
|
|
82
|
+
` 4. get_status — Info koneksi & tier`,
|
|
83
|
+
``, `Upgrade: cryptoiz.org/Pricing`,
|
|
84
|
+
].join('\n');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const TOOLS = [
|
|
88
|
+
{
|
|
89
|
+
name: 'get_alpha_scanner',
|
|
90
|
+
description: 'Sinyal dari CryptoIZ Alpha Entry Scanner — token Solana dengan akumulasi terkuat berdasarkan alpha_score. Free: top 3. Basic/Pro: full list + detail.',
|
|
91
|
+
inputSchema: { type: 'object', properties: {
|
|
92
|
+
min_score: { type: 'number', description: 'Filter minimum alpha score (0-100).' },
|
|
93
|
+
entry_class: { type: 'string', enum: ['ALPHA_BUILDING','ALPHA_EARLY','WATCHLIST_ONLY'], description: 'Filter berdasarkan entry class.' },
|
|
94
|
+
}, required: [] },
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'get_divergence',
|
|
98
|
+
description: 'Sinyal divergence dari CryptoIZ — deteksi bullish/bearish divergence antara harga dan aktivitas whale/dolphin. Butuh API key Basic/Pro.',
|
|
99
|
+
inputSchema: { type: 'object', properties: {
|
|
100
|
+
timeframe: { type: 'string', enum: ['4h','1d'], description: 'Timeframe. Default: 4h.' },
|
|
101
|
+
limit: { type: 'number', description: 'Max hasil (1-50). Default: 20.' },
|
|
102
|
+
}, required: [] },
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'get_accumulation',
|
|
106
|
+
description: 'Token dalam fase akumulasi dari CryptoIZ Accumulation Dashboard — menggunakan composite_score (Structure + AccDist + Holder + Market). Identik dengan tab Akumulasi di dashboard.',
|
|
107
|
+
inputSchema: { type: 'object', properties: {
|
|
108
|
+
min_composite: { type: 'number', description: 'Filter minimum composite score (0-100).' },
|
|
109
|
+
}, required: [] },
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'get_status',
|
|
113
|
+
description: 'Cek status koneksi CryptoIZ MCP dan daftar tools tersedia.',
|
|
114
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
|
|
118
|
+
const server = new Server(
|
|
119
|
+
{ name: 'cryptoiz-mcp', version: '1.1.0' },
|
|
120
|
+
{ capabilities: { tools: {} } }
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
124
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
125
|
+
const { name, arguments: args } = request.params;
|
|
126
|
+
try {
|
|
127
|
+
if (name === 'get_status') return { content: [{ type: 'text', text: formatStatus() }] };
|
|
128
|
+
if (name === 'get_alpha_scanner') {
|
|
129
|
+
const data = await callApi('mcp-accum-signals');
|
|
130
|
+
if (args?.min_score && data.tier !== 'free' && data.signals) { data.signals = data.signals.filter(s => s.alpha_score >= args.min_score); data.total = data.signals.length; }
|
|
131
|
+
if (args?.entry_class && data.tier !== 'free' && data.signals) { data.signals = data.signals.filter(s => s.entry_class === args.entry_class); data.total = data.signals.length; }
|
|
132
|
+
return { content: [{ type: 'text', text: formatAlphaScanner(data) }] };
|
|
133
|
+
}
|
|
134
|
+
if (name === 'get_divergence') {
|
|
135
|
+
const params = {};
|
|
136
|
+
if (args?.timeframe) params.tf = args.timeframe;
|
|
137
|
+
if (args?.limit) params.limit = String(args.limit);
|
|
138
|
+
const data = await callApi('mcp-divergence-signals', params);
|
|
139
|
+
return { content: [{ type: 'text', text: formatDivergence(data) }] };
|
|
140
|
+
}
|
|
141
|
+
if (name === 'get_accumulation') {
|
|
142
|
+
const data = await callApi('mcp-accumulation');
|
|
143
|
+
if (args?.min_composite && data.tier !== 'free' && data.tokens) { data.tokens = data.tokens.filter(t => t.scores?.composite >= args.min_composite); data.total = data.tokens.length; }
|
|
144
|
+
return { content: [{ type: 'text', text: formatAccumulation(data) }] };
|
|
145
|
+
}
|
|
146
|
+
return { content: [{ type: 'text', text: `Tool tidak dikenal: ${name}` }], isError: true };
|
|
147
|
+
} catch (err) {
|
|
148
|
+
return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const transport = new StdioServerTransport();
|
|
153
|
+
await server.connect(transport);
|