coinopai-mcp 1.2.8 → 1.2.10

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
@@ -7,21 +7,21 @@
7
7
  [![payments](https://img.shields.io/badge/payments-x402%20USDC-0052FF)](https://x402.org)
8
8
  [![network](https://img.shields.io/badge/network-Base-0052FF)](https://base.org)
9
9
 
10
- **Directional market intelligence with built-in outcome verification.**
10
+ **Auditable market context with calibrated forecast ranges and outcome verification.**
11
11
 
12
12
  **Source:** https://github.com/forgemeshlabs/coinopai-mcp
13
13
 
14
- An MCP server that lets AI agents buy Kronos market intelligence with [x402](https://x402.org) micropayments on Base. Kronos does not just generate signals: every decision gets a `decision_id`, and every `decision_id` can be audited against later market prices.
14
+ An MCP server that lets AI agents buy Kronos market context with [x402](https://x402.org) micropayments on Base. Kronos is not a buy/sell oracle: it gives agents calibrated ranges, risk context, decision journals, and audit records they can verify.
15
15
 
16
16
  > This repo is the MCP client layer; paid intelligence is served from hosted CoinOpAI x402 endpoints.
17
17
 
18
- > Wrong predictions are shown too. That's the point.
18
+ > Weak calls and wrong calls are shown too. That's the point.
19
19
 
20
20
  ## Why Kronos Is Different
21
21
 
22
- Most signal APIs stop after making a prediction. Kronos assigns a `decision_id` and lets every decision be audited against future market behavior.
22
+ Most market APIs stop after returning a direction. Kronos leads with calibrated ranges and risk context, then assigns a `decision_id` so every decision can be audited against future market behavior.
23
23
 
24
- The moat is the verification loop:
24
+ The moat is the audit loop:
25
25
 
26
26
  ```
27
27
  preflight -> decision -> audit
@@ -61,26 +61,26 @@ The agent calls a tool → the MCP server receives an `HTTP 402` → automatical
61
61
 
62
62
  ---
63
63
 
64
- ## The Verified Loop ($0.27/cycle)
64
+ ## The Auditable Loop ($0.27/cycle)
65
65
 
66
66
  ```
67
67
  check_trade_preflight ──→ get_crypto_decision ──→ [wait 1h] ──→ audit_trade_decision
68
68
  $0.05 $0.15 $0.07
69
69
 
70
- Is now allowed? CONSIDER_LONG/SHORT GOOD_DECISION
71
- Cooldown check? NO_ACTION BAD_DIRECTION
72
- Regime ok? + decision_id NOISE
73
- Signal strength? + next_step hint + pnl_pct
70
+ Market state? Directional context Outcome record
71
+ Cooldown context? Confidence context Direction held?
72
+ Regime context? + decision_id Verdict
73
+ Data freshness? + audit hint + pnl_pct
74
74
  ```
75
75
 
76
- Every decision is self-verifying. The `decision_id` links the prediction to the outcome. The audit fetches real market prices and produces a verdict. Nothing is hidden.
76
+ Every decision is self-verifying. The `decision_id` links the setup to the outcome. The audit fetches real market prices and produces a verdict. Nothing is hidden.
77
77
 
78
78
  ## Current Status
79
79
 
80
80
  **Live**
81
- - Signals
81
+ - Model context
82
82
  - Risk assessment
83
- - Decision guidance
83
+ - Decision journaling
84
84
  - Outcome verification
85
85
  - Forecast: conformally-calibrated 80% price range (~0.80 empirical coverage)
86
86
 
@@ -88,19 +88,19 @@ Every decision is self-verifying. The `decision_id` links the prediction to the
88
88
  - Directional edge: none demonstrated in backtest (~51% accurate) — the calibrated range is the validated product, not the direction
89
89
  - Forecast vs execution agreement analysis: collecting evidence
90
90
 
91
- The calibrated forecast range is live and validated (conformal, ~0.80 coverage). The directional point estimate remains a weak input only — verify everything via the audit loop.
91
+ The calibrated forecast range is live and validated (conformal, ~0.80 coverage). Directional values are supporting context, not standalone trade instructions. Use them with the calibrated range, risk state, and audit record.
92
92
 
93
- ## Signal Scale
93
+ ## Directional Context
94
94
 
95
- | Signal | Meaning |
95
+ | Value | Meaning |
96
96
  |--------|---------|
97
- | Positive | Bullish directional read |
98
- | Negative | Bearish directional read |
97
+ | Positive | Bullish model context |
98
+ | Negative | Bearish model context |
99
99
  | 0.00-0.01 | Weak magnitude |
100
100
  | 0.01-0.03 | Moderate magnitude |
101
101
  | 0.03+ | Strong magnitude |
102
102
 
103
- Signals are probabilistic model outputs, not guarantees or human recommendations.
103
+ Directional values are supporting context, not guarantees, human recommendations, or standalone trade instructions. Use them with the calibrated range, risk state, and audit record.
104
104
 
105
105
  ---
106
106
 
@@ -112,7 +112,7 @@ Signals are probabilistic model outputs, not guarantees or human recommendations
112
112
  "allowed": true,
113
113
  "symbol": "BTC/USD",
114
114
  "market_state": "NORMAL",
115
- "signal_strength": 0.72,
115
+ "signal_strength": "weak_or_mixed",
116
116
  "regime": "TREND",
117
117
  "cooldown_remaining_seconds": 0
118
118
  }
@@ -122,10 +122,15 @@ Signals are probabilistic model outputs, not guarantees or human recommendations
122
122
  ```json
123
123
  {
124
124
  "symbol": "BTC/USD",
125
- "suggested_action": "CONSIDER_LONG",
126
- "confidence": 0.72,
125
+ "directional_bias": "upward",
126
+ "confidence": 0.514,
127
+ "compliance_mode": "market_intelligence_only",
127
128
  "regime": "TREND",
128
129
  "decision_id": "a3f8c1d2-9472-4dfe-b459-5df17b282614",
130
+ "directional_edge": "none_demonstrated",
131
+ "why_not_high": [
132
+ "Directional confidence is capped by observed historical accuracy, not boosted by signal magnitude."
133
+ ],
129
134
  "next_step": "Call audit_trade_decision with this decision_id after 1h using window=1h"
130
135
  }
131
136
  ```
@@ -140,15 +145,7 @@ Signals are probabilistic model outputs, not guarantees or human recommendations
140
145
  }
141
146
  ```
142
147
 
143
- **Live results from real runs:**
144
-
145
- | Symbol | Decision | Confidence | 1h Outcome | Verdict |
146
- |--------|----------|-----------|------------|---------|
147
- | XRP | SHORT | 1.0 | -0.54% | ✅ GOOD_DECISION |
148
- | ETH | LONG | 0.68 | -0.32% | ❌ BAD_DIRECTION |
149
- | BTC | LONG | 0.40 | +0.01% | — NOISE |
150
-
151
- It gets some right. It gets some wrong. The loop makes both visible.
148
+ Audit verdicts include `GOOD_DECISION`, `BAD_DIRECTION`, `NOISE`, `NO_ACTION_TAKEN`, and `PENDING`. Kronos gets some right, gets some wrong, and exposes both through the same record.
152
149
 
153
150
  ---
154
151
 
@@ -156,12 +153,13 @@ It gets some right. It gets some wrong. The loop makes both visible.
156
153
 
157
154
  | Tool | What it does | Cost | Affiliate |
158
155
  |------|-------------|------|-----------|
159
- | `check_trade_preflight` | Gate check: market allowed, cooldown, regime, signal strength | $0.05 | ✓ |
160
- | `get_crypto_decision` | CONSIDER\_LONG/SHORT/NO\_ACTION + `decision_id` | $0.15 | ✓ |
156
+ | `check_trade_preflight` | Gate check: market allowed, cooldown, regime, model context | $0.05 | ✓ |
157
+ | `get_crypto_decision` | Probabilistic decision journal + `decision_id` | $0.15 | ✓ |
161
158
  | `audit_trade_decision` | Verify against real prices: verdict + PnL% | $0.07 | ✓ |
162
- | `get_crypto_signals` | Directional market intelligence for BTC, ETH, SOL, XRP, ADA | $0.05 | ✓ |
163
- | `get_crypto_signal_history` | Up to 168h of signal history for analysis | $0.05 | ✓ |
159
+ | `get_crypto_signals` | Model context for BTC, ETH, SOL, XRP, ADA | $0.05 | ✓ |
160
+ | `get_crypto_signal_history` | Up to 168h of context history for analysis | $0.05 | ✓ |
164
161
  | `get_crypto_forecast` | Conformally-calibrated 80% price range (~0.80 empirical coverage) for BTC, ETH, SOL, XRP, ADA | $0.05 | ✓ |
162
+ | `review_signal_anomaly` | Score signal features for unusual conditions; returns review labels, drivers, and component scores | $0.07 | — |
165
163
  | `get_crypto_risk` | Market risk state and cooldown context | $0.02 | — |
166
164
  | `search_agent_automations` | Search 819 agent automation prompts | $0.01 | — |
167
165
  | `get_agent_automation` | Full prompt + workflow steps by slug | $0.01 | — |
@@ -191,7 +189,7 @@ Add to `~/.claude/settings.json`:
191
189
  }
192
190
  ```
193
191
 
194
- Restart Claude Code. The 10 tools appear automatically.
192
+ Restart Claude Code. The tools appear automatically.
195
193
 
196
194
  ### Claude Desktop
197
195
 
@@ -239,16 +237,27 @@ Prepared MCP Registry identity: `io.github.forgemeshlabs/coinopai-mcp`. Refresh
239
237
  const pre = await mcp.call("check_trade_preflight", { symbol: "BTC" })
240
238
  if (!pre.allowed) return // cooldown, bad regime, or stale data
241
239
 
242
- // Step 2 — get decision ($0.15)
240
+ // Step 2 — get decision journal ($0.15)
243
241
  const dec = await mcp.call("get_crypto_decision", { symbol: "BTC" })
244
- if (dec.suggested_action === "NO_ACTION") return
245
242
 
246
243
  // Store the decision_id — you'll need it to close the loop
247
- const { decision_id, suggested_action, confidence } = dec
244
+ const { decision_id, directional_bias, confidence } = dec
248
245
 
249
- // Step 3 — act on the decision here...
246
+ // Optional — review a feature set for anomaly context ($0.07)
247
+ const anomaly = await mcp.call("review_signal_anomaly", {
248
+ symbol: "BTC",
249
+ window: "24h",
250
+ features: {
251
+ price_change: 0.018,
252
+ volume_change: 0.42,
253
+ volatility: 0.031,
254
+ signal_confidence: 72,
255
+ risk_score: 31
256
+ }
257
+ })
258
+ // review_label: "normal_review" | "review" | "elevated_review" | "critical_review"
250
259
 
251
- // Step 4 — audit 1 hour later ($0.07)
260
+ // Step 3 — audit 1 hour later ($0.07)
252
261
  const audit = await mcp.call("audit_trade_decision", {
253
262
  decision_id,
254
263
  window: "1h"
@@ -342,7 +351,7 @@ Normal x402 flow — CoinOpAI receives 100% of the listed price. Nothing changes
342
351
 
343
352
  ## Disclaimer
344
353
 
345
- Decision outputs are probabilistic signals for experimental automated workflows only. Not financial advice. Early system with a small sample size. Results will vary. Never risk capital you can't afford to lose.
354
+ Decision outputs are probabilistic context and journal entries for experimental automated workflows only. Not financial advice. Directional bias alone has not been validated as a standalone trading strategy. Results will vary. Never risk capital you can't afford to lose.
346
355
 
347
356
  ---
348
357
 
package/index.js CHANGED
@@ -5,7 +5,7 @@ const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
5
5
  const { StdioServerTransport } = require("@modelcontextprotocol/sdk/server/stdio.js");
6
6
  const { CallToolRequestSchema, ListToolsRequestSchema } = require("@modelcontextprotocol/sdk/types.js");
7
7
  const { x402Client, x402HTTPClient } = require("@x402/core/client");
8
- const { registerExactEvmScheme } = require("@x402/evm/exact/client");
8
+ const { ExactEvmScheme } = require("@x402/evm/exact/client");
9
9
  const { toClientEvmSigner } = require("@x402/evm");
10
10
  const { privateKeyToAccount } = require("viem/accounts");
11
11
  const { createPublicClient, createWalletClient, http, parseAbi } = require("viem");
@@ -36,6 +36,7 @@ const IMAGEGEN_URL = "https://imagegen.coinopai.com";
36
36
  const PYRIMID_PRODUCTS_IMAGEGEN = {
37
37
  "/generate": { productId: 3n, priceUsdc: 100000n },
38
38
  };
39
+ const BASE_RPC_URL = process.env.BASE_RPC_URL || "https://mainnet.base.org";
39
40
 
40
41
  const TOOLS = [
41
42
  {
@@ -68,7 +69,7 @@ const TOOLS = [
68
69
  },
69
70
  {
70
71
  name: "get_crypto_signals",
71
- description: "Latest Kronos directional market intelligence for BTC, ETH, SOL, XRP, ADA. Positive = bullish, negative = bearish; magnitude under 0.01 is weak, 0.01-0.03 moderate, 0.03+ strong. Costs $0.05 USDC.",
72
+ description: "Latest Kronos model context for BTC, ETH, SOL, XRP, ADA. Directional values are supporting context, not standalone trade instructions; use them with the calibrated range, risk state, and audit record. Costs $0.05 USDC.",
72
73
  inputSchema: {
73
74
  type: "object",
74
75
  properties: {
@@ -83,7 +84,7 @@ const TOOLS = [
83
84
  },
84
85
  {
85
86
  name: "get_crypto_signal_history",
86
- description: "Recent Kronos signal history for BTC/ETH/SOL/XRP/ADA. Use it to inspect directional context before or after a decision. Costs $0.05 USDC.",
87
+ description: "Recent Kronos context history for BTC/ETH/SOL/XRP/ADA. Use it to inspect model context and freshness before or after a decision. Costs $0.05 USDC.",
87
88
  inputSchema: {
88
89
  type: "object",
89
90
  properties: {
@@ -94,7 +95,7 @@ const TOOLS = [
94
95
  },
95
96
  {
96
97
  name: "get_crypto_decision",
97
- description: "Get probabilistic decision guidance from Kronos, then verify it. Returns CONSIDER_LONG/SHORT/NO_ACTION with confidence, regime, and a decision_id. Call audit_trade_decision with that ID after the evaluation window to see whether the direction held. Costs $0.15 USDC.",
98
+ description: "Create a market-intelligence journal entry from Kronos context. Returns directional_bias, confidence context, compliance metadata, regime, anomaly/calibration context, and a decision_id. Call audit_trade_decision with that ID after the evaluation window to see what happened. Costs $0.15 USDC.",
98
99
  inputSchema: {
99
100
  type: "object",
100
101
  properties: {
@@ -106,7 +107,7 @@ const TOOLS = [
106
107
  },
107
108
  {
108
109
  name: "check_trade_preflight",
109
- description: "Step 1 of the verified decision loop. Checks market state, cooldown, data freshness, and signal strength before calling get_crypto_decision. Costs $0.05 USDC.",
110
+ description: "Step 1 of the auditable decision loop. Checks market state, cooldown, data freshness, and model context before calling get_crypto_decision. Costs $0.05 USDC.",
110
111
  inputSchema: {
111
112
  type: "object",
112
113
  properties: {
@@ -131,7 +132,7 @@ const TOOLS = [
131
132
  },
132
133
  {
133
134
  name: "get_crypto_forecast",
134
- description: "Conformally-calibrated price forecast: an honest 80% prediction interval (range_80, ~0.80 empirical coverage) plus point return and upside probability for BTC/ETH/SOL/XRP/ADA. The directional point has no demonstrated backtest edge (~51% accurate) — the calibrated range is the validated product. Costs $0.05 USDC.",
135
+ description: "Conformally-calibrated price forecast: an honest 80% prediction interval (range_80, ~0.80 empirical coverage) plus point return and upside probability for BTC/ETH/SOL/XRP/ADA. Directional bias is supporting context; the calibrated range is the validated product. Costs $0.05 USDC.",
135
136
  inputSchema: {
136
137
  type: "object",
137
138
  properties: {
@@ -139,6 +140,22 @@ const TOOLS = [
139
140
  affiliate_id: { type: "string", description: "Optional Pyrimid affiliate ID (af_xxxxx). Affiliate earns a commission from within the listed price — no extra cost to you." }
140
141
  }
141
142
  }
143
+ },
144
+ {
145
+ name: "review_signal_anomaly",
146
+ description: "Score a market signal feature set for unusual conditions before downstream analysis. Returns anomaly_score, anomaly_level, review_label, drivers, component scores, and market-intelligence disclaimers. Not financial advice and not a market activity instruction. Costs $0.07 USDC.",
147
+ inputSchema: {
148
+ type: "object",
149
+ properties: {
150
+ symbol: { type: "string", description: "Symbol to review, e.g. BTC, ETH, SOL, XRP, ADA, AAPL, SPY" },
151
+ window: { type: "string", description: "Observation window label, e.g. 24h (default: 24h)" },
152
+ features: {
153
+ type: "object",
154
+ description: "Numeric feature values to score, such as price_change, volume_change, volatility, signal_confidence, risk_score, social_velocity, or onchain_velocity."
155
+ }
156
+ },
157
+ required: ["symbol", "features"]
158
+ }
142
159
  }
143
160
  ];
144
161
 
@@ -147,20 +164,42 @@ function buildHttpClient() {
147
164
  if (!key) throw new Error("WALLET_PRIVATE_KEY required — set a Base wallet private key with USDC funded");
148
165
  const pk = key.startsWith("0x") ? key : "0x" + key;
149
166
  const account = privateKeyToAccount(pk);
150
- const signer = toClientEvmSigner(account);
151
- const coreClient = registerExactEvmScheme(new x402Client(), { signer });
167
+ const coreClient = new x402Client().register("eip155:*", new ExactEvmScheme(toClientEvmSigner(account)));
152
168
  return { httpClient: new x402HTTPClient(coreClient), account };
153
169
  }
154
170
 
155
171
  const sleep = (ms) => new Promise(r => setTimeout(r, ms));
156
172
 
173
+ async function createChainTimedPaymentPayload(httpClient, paymentRequired) {
174
+ try {
175
+ const publicClient = createPublicClient({ chain: base, transport: http(BASE_RPC_URL) });
176
+ const block = await publicClient.getBlock();
177
+ const chainNow = Number(block.timestamp);
178
+ const originalNow = Date.now;
179
+ const localNow = Math.floor(originalNow() / 1000);
180
+ const timeout = Number(paymentRequired.accepts?.[0]?.maxTimeoutSeconds || 300);
181
+ const lowerBound = localNow + 30 - timeout;
182
+ const upperBound = chainNow + 600;
183
+ const signingNow = Math.min(Math.max(chainNow, lowerBound), upperBound);
184
+ // x402 derives EIP-3009 validity windows from Date.now; choose a timestamp valid for both Base block time and facilitator wall-clock checks.
185
+ Date.now = () => signingNow * 1000;
186
+ try {
187
+ return await httpClient.createPaymentPayload(paymentRequired);
188
+ } finally {
189
+ Date.now = originalNow;
190
+ }
191
+ } catch (_) {
192
+ return httpClient.createPaymentPayload(paymentRequired);
193
+ }
194
+ }
195
+
157
196
  // Pyrimid affiliate flow — approve + routePayment on-chain, then retry with tx hash
158
197
  async function callPyrimid(account, path, affiliateId, baseUrl, products) {
159
198
  const pathname = new URL(path, baseUrl).pathname;
160
199
  const product = products[pathname];
161
200
  if (!product) throw new Error(`No Pyrimid product registered for ${pathname}`);
162
201
  const url = baseUrl + path;
163
- const transport = http();
202
+ const transport = http(BASE_RPC_URL);
164
203
  const publicClient = createPublicClient({ chain: base, transport });
165
204
  const walletClient = createWalletClient({ account, chain: base, transport });
166
205
 
@@ -192,10 +231,14 @@ async function callPaid(ctx, path, affiliateId, opts = {}) {
192
231
  const baseUrl = opts.baseUrl || BASE_URL;
193
232
  const pyrimidProducts = opts.pyrimidProducts || PYRIMID_PRODUCTS;
194
233
  const pathname = new URL(path, baseUrl).pathname;
234
+ const method = opts.method || "GET";
235
+ const body = opts.body;
236
+ const bodyHeaders = body ? { "Content-Type": "application/json" } : {};
237
+ const bodyInit = body ? { body: JSON.stringify(body) } : {};
195
238
 
196
239
  // Use Pyrimid affiliate flow when affiliate_id present and product is registered.
197
240
  // Fall back to direct x402 if the affiliate route is unavailable or not yet cataloged.
198
- if (affiliateId && pyrimidProducts[pathname]) {
241
+ if (method === "GET" && affiliateId && pyrimidProducts[pathname]) {
199
242
  try {
200
243
  return await callPyrimid(account, path, affiliateId, baseUrl, pyrimidProducts);
201
244
  } catch (_) {
@@ -206,7 +249,7 @@ async function callPaid(ctx, path, affiliateId, opts = {}) {
206
249
  // Standard x402 EIP-3009 flow
207
250
  const url = baseUrl + path;
208
251
  const extraHeaders = affiliateId ? { "X-Affiliate-ID": affiliateId } : {};
209
- const res = await fetch(url, { headers: extraHeaders });
252
+ const res = await fetch(url, { method, headers: { ...bodyHeaders, ...extraHeaders }, ...bodyInit });
210
253
 
211
254
  if (res.status === 402) {
212
255
  let body;
@@ -214,15 +257,24 @@ async function callPaid(ctx, path, affiliateId, opts = {}) {
214
257
  const paymentRequired = httpClient.getPaymentRequiredResponse(
215
258
  (name) => res.headers.get(name), body
216
259
  );
217
- const paymentPayload = await httpClient.createPaymentPayload(paymentRequired);
260
+ const paymentPayload = await createChainTimedPaymentPayload(httpClient, paymentRequired);
218
261
  const paidRes = await fetch(url, {
219
- headers: { ...httpClient.encodePaymentSignatureHeader(paymentPayload), ...extraHeaders },
262
+ method,
263
+ headers: { ...bodyHeaders, ...httpClient.encodePaymentSignatureHeader(paymentPayload), ...extraHeaders },
264
+ ...bodyInit,
220
265
  });
221
266
  if (!paidRes.ok) {
222
267
  const errBody = await paidRes.text().catch(() => paidRes.statusText);
223
268
  throw new Error(`HTTP ${paidRes.status}: ${errBody.slice(0, 200)}`);
224
269
  }
225
- return paidRes.json();
270
+ const data = await paidRes.json();
271
+ try {
272
+ const settleResponse = httpClient.getPaymentSettleResponse((name) => paidRes.headers.get(name));
273
+ if (settleResponse && data && typeof data === "object" && !Array.isArray(data)) {
274
+ return { ...data, _payment: settleResponse };
275
+ }
276
+ } catch (_) {}
277
+ return data;
226
278
  }
227
279
 
228
280
  if (!res.ok) {
@@ -240,7 +292,7 @@ async function main() {
240
292
  }
241
293
 
242
294
  const server = new Server(
243
- { name: "coinopai-mcp", version: "1.2.8" },
295
+ { name: "coinopai-mcp", version: "1.2.10" },
244
296
  { capabilities: { tools: {} } }
245
297
  );
246
298
 
@@ -286,6 +338,16 @@ async function main() {
286
338
  case "get_crypto_forecast":
287
339
  data = await callPaid(paymentContext, `/api/kronos/forecast?symbol=${encodeURIComponent(args.symbol || "BTC")}`, affiliateId);
288
340
  break;
341
+ case "review_signal_anomaly":
342
+ data = await callPaid(paymentContext, "/api/anomaly", null, {
343
+ method: "POST",
344
+ body: {
345
+ symbol: args.symbol || "BTC",
346
+ window: args.window || "24h",
347
+ features: args.features || {},
348
+ },
349
+ });
350
+ break;
289
351
  default:
290
352
  throw new Error("Unknown tool: " + name);
291
353
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "coinopai-mcp",
3
- "version": "1.2.8",
3
+ "version": "1.2.10",
4
4
  "mcpName": "io.github.forgemeshlabs/coinopai-mcp",
5
- "description": "Directional crypto market intelligence MCP with x402 payments, decision guidance, and built-in outcome verification",
5
+ "description": "Auditable market intelligence MCP with x402 payments, calibrated forecast ranges, anomaly review, risk context, and outcome audits",
6
6
  "main": "index.js",
7
7
  "bin": {
8
8
  "coinopai-mcp": "index.js"
@@ -28,6 +28,9 @@
28
28
  "forgemesh",
29
29
  "crypto",
30
30
  "signals",
31
+ "forecast",
32
+ "risk",
33
+ "audit",
31
34
  "coinbase",
32
35
  "base",
33
36
  "usdc",
@@ -45,8 +48,8 @@
45
48
  },
46
49
  "dependencies": {
47
50
  "@modelcontextprotocol/sdk": "^1.10.1",
48
- "@x402/core": "^2.12.0",
49
- "@x402/evm": "^2.12.0",
51
+ "@x402/core": "2.11.0",
52
+ "@x402/evm": "2.11.0",
50
53
  "viem": "^2.0.0"
51
54
  }
52
55
  }
package/server.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.forgemeshlabs/coinopai-mcp",
4
- "description": "Directional crypto market intelligence with decision guidance, outcome verification, and x402 micropayments on Base.",
4
+ "description": "Auditable market intelligence with calibrated forecast ranges, anomaly review, outcome verification, and x402 micropayments on Base.",
5
5
  "repository": {
6
6
  "url": "https://github.com/forgemeshlabs/coinopai-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "1.2.6",
9
+ "version": "1.2.10",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "coinopai-mcp",
14
- "version": "1.2.6",
14
+ "version": "1.2.10",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },