asrai-mcp 0.5.2 → 0.5.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 CHANGED
@@ -6,7 +6,13 @@ Crypto market analysis MCP server for Claude Desktop — pay-per-use via x402 on
6
6
 
7
7
  ## Quick start
8
8
 
9
- **Step 1** — Add to Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
9
+ **Step 1** — Add to your Claude Desktop config:
10
+
11
+ | OS | Config path |
12
+ |---|---|
13
+ | macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
14
+ | Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
15
+ | Linux | `~/.config/Claude/claude_desktop_config.json` |
10
16
 
11
17
  ```json
12
18
  {
@@ -22,6 +28,23 @@ Crypto market analysis MCP server for Claude Desktop — pay-per-use via x402 on
22
28
  }
23
29
  ```
24
30
 
31
+ **Or** store your key in `~/.env` (loaded automatically — no `env` block needed in config):
32
+
33
+ ```
34
+ PRIVATE_KEY=0x<your_base_wallet_private_key>
35
+ ```
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "asrai": {
41
+ "command": "npx",
42
+ "args": ["-y", "asrai-mcp"]
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
25
48
  **Step 2** — Restart Claude Desktop. Done.
26
49
 
27
50
  Each API call costs **$0.001 USDC** from your wallet on Base mainnet. Make sure your wallet has a small USDC balance (~$1–2 to start).
@@ -60,16 +83,6 @@ Default session cap: **$2.00 USDC**. To change:
60
83
  }
61
84
  ```
62
85
 
63
- ## Alternative install (if you prefer)
64
-
65
- ```bash
66
- # via uvx (requires uv)
67
- uvx asrai-mcp
68
-
69
- # via pip
70
- pip install asrai-mcp
71
- ```
72
-
73
86
  ## Links
74
87
 
75
88
  - Homepage: https://asrai.me/agents
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asrai-mcp",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Asrai crypto analysis MCP server — pay-per-use via x402 on Base. Zero install: just npx.",
5
5
  "keywords": [
6
6
  "mcp",
package/src/server.js CHANGED
@@ -169,7 +169,11 @@ const TOOLS = [
169
169
  },
170
170
  {
171
171
  name: "portfolio",
172
- description: "Get portfolio analysis. Optionally filter by a specific coin.",
172
+ description:
173
+ "Get Abu's curated crypto portfolio — a model portfolio of carefully selected holdings. " +
174
+ "Use when users ask 'what should I invest in?', 'build me a portfolio', 'what coins to buy', " +
175
+ "or 'give me investment advice'. No symbol = full portfolio overview. " +
176
+ "Symbol provided = Abu's position and analysis for that specific coin.",
173
177
  inputSchema: {
174
178
  type: "object",
175
179
  properties: { symbol: { type: "string", description: "Optional coin symbol to filter" } },
package/src/tools.js CHANGED
@@ -55,7 +55,7 @@ async function _get(path) {
55
55
  const fetchWithPayment = buildFetch();
56
56
  const res = await fetchWithPayment(`${BASE_URL}${path}`, {
57
57
  headers: X402_HEADERS,
58
- signal: AbortSignal.timeout(90_000),
58
+ signal: AbortSignal.timeout(120_000),
59
59
  });
60
60
  const text = await res.text();
61
61
  try { return JSON.parse(text); } catch { return text; }
@@ -68,7 +68,7 @@ async function _post(path, body) {
68
68
  method: "POST",
69
69
  headers: { ...X402_HEADERS, "Content-Type": "application/json" },
70
70
  body: JSON.stringify(body),
71
- signal: AbortSignal.timeout(90_000),
71
+ signal: AbortSignal.timeout(120_000),
72
72
  });
73
73
  const text = await res.text();
74
74
  try { return JSON.parse(text); } catch { return text; }
@@ -98,6 +98,21 @@ export async function market_overview() {
98
98
  "/api/gainers-losers/",
99
99
  "/api/rsi/",
100
100
  "/api/top-bottom/",
101
+ "/api/cmcai/",
102
+ "/api/cbbi/",
103
+ "/api/channel-summary/",
104
+ "/api/cashflow/market",
105
+ "/api/cmc-sentiment/",
106
+ "/api/socialdominance/",
107
+ "/api/ath/",
108
+ "/api/ichimoku-trend/",
109
+ "/api/bounce-dip/",
110
+ "/api/sar-coins/",
111
+ "/api/macd-coins/",
112
+ "/api/emacross/",
113
+ "/api/techrating/",
114
+ "/api/volume/",
115
+ "/api/highvolumelowcap/",
101
116
  ), null, 2);
102
117
  }
103
118
 
@@ -111,6 +126,11 @@ export async function technical_analysis(symbol, timeframe = "1D") {
111
126
  `/api/macd-dema/${s}usdt/${timeframe}`,
112
127
  `/api/alphatrend/${s}usdt/${timeframe}`,
113
128
  `/api/td/${s}usdt/${timeframe}`,
129
+ `/api/forecasting/${s}usdt`,
130
+ `/api/smartmoney/${s}usdt/${timeframe}`,
131
+ `/api/support-resistance/${s}usdt/${timeframe}`,
132
+ `/api/ew/${s}usdt/${timeframe}`,
133
+ `/api/ichimoku/${s}usdt/${timeframe}`,
114
134
  ), null, 2);
115
135
  }
116
136
 
@@ -167,12 +187,23 @@ export async function cashflow(mode, symbol = "") {
167
187
 
168
188
  export async function coin_info(symbol) {
169
189
  const s = symbol.toLowerCase();
170
- return JSON.stringify(await _gather(
190
+
191
+ // Phase 1: sequential (x402 wallet conflict prevents parallel)
192
+ const data = await _gather(
171
193
  `/api/coinstats/${s}`,
172
194
  `/api/info/${s}`,
173
195
  `/api/price/${s}`,
174
196
  `/api/tags/${s}`,
175
- ), null, 2);
197
+ `/api/cmcai/${s}`,
198
+ );
199
+
200
+ // Phase 2: dexscreener via contract_address if available
201
+ const contractAddress = data[`/api/info/${s}`]?.info_data?.contract_address;
202
+ if (contractAddress) {
203
+ data[`/api/dexscreener/${contractAddress}`] = await _get(`/api/dexscreener/${contractAddress}`);
204
+ }
205
+
206
+ return JSON.stringify(data, null, 2);
176
207
  }
177
208
 
178
209
  export async function dexscreener(contract_address, chain = "") {