coinopai-mcp 2.1.0 → 2.2.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 +4 -1
- package/index.js +73 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -168,6 +168,9 @@ Fresh audits can return `pending_window` until the evaluation window matures.
|
|
|
168
168
|
| `get_crypto_signals` | Model context for BTC, ETH, SOL, XRP, ADA | $0.05 | ✓ |
|
|
169
169
|
| `get_crypto_signal_history` | Up to 168h of context history for analysis | $0.05 | ✓ |
|
|
170
170
|
| `get_crypto_forecast` | Conformally-calibrated 80% price range (~0.80 empirical coverage) for BTC, ETH, SOL, XRP, ADA | $0.05 | ✓ |
|
|
171
|
+
| `get_perp_funding` | **Futures.** Live perp funding, mark/index, open interest, crowding (Kraken Futures + Hyperliquid) | $0.02 | — |
|
|
172
|
+
| `check_futures_risk` | **Futures.** Will this side / leverage / entry survive the calibrated range? Liquidation distance + verdict | $0.05 | — |
|
|
173
|
+
| `get_futures_decision` | **Futures.** LONG / SHORT / FLAT with stop and target on the calibrated range, leverage cap, liquidation, sizing, funding cost | $0.15 | — |
|
|
171
174
|
| `review_signal_anomaly` | Score signal features for unusual conditions; returns review labels, drivers, and component scores | $0.07 | — |
|
|
172
175
|
| `get_crypto_risk` | Market risk state and cooldown context | $0.02 | — |
|
|
173
176
|
| `search_agent_automations` | Search 819 agent automation prompts | $0.01 | — |
|
|
@@ -320,7 +323,7 @@ Free-tier tool responses may carry a single disclosed sponsored card from [Lulu
|
|
|
320
323
|
|
|
321
324
|
- **Eligible tools:** `search_agent_automations`, `list_automation_categories`, `get_agent_automation`, `check_trade_preflight` — and only when the response did **not** settle an x402 payment (no `_payment` receipt). A paid response never carries a card.
|
|
322
325
|
- **Current state:** one tool is free — `list_tools` (a plain fetch of `/menu`, no wallet, no payment) — so that is the only tool where a card can render today. The other four allowlisted tools are still paid, so no card attaches to them; the switch is server-side: when the operator makes one of those endpoints free (a plain `200` with no `402`), cards start appearing there with no client change.
|
|
323
|
-
- **Paid tools never carry it:** `get_crypto_signals`, `get_crypto_risk`, `get_crypto_signal_history`, `get_crypto_decision`, `audit_trade_decision`, `get_crypto_forecast`, `review_signal_anomaly` never touch the ads SDK.
|
|
326
|
+
- **Paid tools never carry it:** `get_crypto_signals`, `get_crypto_risk`, `get_crypto_signal_history`, `get_crypto_decision`, `audit_trade_decision`, `get_crypto_forecast`, `review_signal_anomaly`, `get_futures_decision`, `get_perp_funding`, `check_futures_risk` never touch the ads SDK.
|
|
324
327
|
- **Strip it:** `delete result.sponsored`.
|
|
325
328
|
- **Where the card comes from:** ForgeMesh's own publisher card is attached server-side to `GET https://x402.coinopai.com/menu`, so `list_tools` simply passes it through — this package ships **no** ad credentials and makes **no** calls to the ads network on its own.
|
|
326
329
|
- **Operator env vars (forks only):** `LULU_ADS_PUBLISHER_ID` and `LULU_ADS_API_KEY` let a fork attach its own publisher card client-side (both required; if either is missing the package makes zero calls to the ads network and responses are unchanged). `LULU_ADS_ENABLED=false` is a kill switch.
|
package/index.js
CHANGED
|
@@ -185,6 +185,63 @@ const TOOLS = [
|
|
|
185
185
|
required: ["decision_id"]
|
|
186
186
|
}
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
name: "get_futures_decision",
|
|
190
|
+
annotations: {
|
|
191
|
+
readOnlyHint: false,
|
|
192
|
+
destructiveHint: false,
|
|
193
|
+
idempotentHint: false,
|
|
194
|
+
openWorldHint: true,
|
|
195
|
+
},
|
|
196
|
+
description: "Kronos Futures: perpetual-futures decision package. Direction LONG / SHORT / FLAT from the Kronos signal, stop-loss and take-profit on the calibrated 80% range, leverage cap keeping liquidation outside 2x the stop, liquidation price, risk-based position size for your equity, and live perp funding cost. Market intelligence only; no exchange execution. Costs $0.15 USDC.",
|
|
197
|
+
inputSchema: {
|
|
198
|
+
type: "object",
|
|
199
|
+
properties: {
|
|
200
|
+
symbol: { type: "string", description: "Symbol: BTC, ETH, SOL, XRP, ADA (default: BTC)" },
|
|
201
|
+
equity: { type: "number", description: "Account equity in USD for position sizing (optional)" },
|
|
202
|
+
max_loss_pct: { type: "number", description: "Max loss per position as a fraction of equity (default 0.01)" },
|
|
203
|
+
max_leverage: { type: "number", description: "Your leverage ceiling, 1-5 (default 5)" }
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: "get_perp_funding",
|
|
209
|
+
annotations: {
|
|
210
|
+
readOnlyHint: true,
|
|
211
|
+
destructiveHint: false,
|
|
212
|
+
idempotentHint: false,
|
|
213
|
+
openWorldHint: true,
|
|
214
|
+
},
|
|
215
|
+
description: "Kronos Futures: live perpetual funding rates (1h, 8h, annualized), mark/index price, open interest, and crowding label (LONG_CROWDED / SHORT_CROWDED / BALANCED) for BTC, ETH, SOL, XRP, ADA from Kraken Futures and Hyperliquid. Costs $0.02 USDC.",
|
|
216
|
+
inputSchema: {
|
|
217
|
+
type: "object",
|
|
218
|
+
properties: {
|
|
219
|
+
symbol: { type: "string", description: "Optional single symbol; omit for all five" }
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
name: "check_futures_risk",
|
|
225
|
+
annotations: {
|
|
226
|
+
readOnlyHint: true,
|
|
227
|
+
destructiveHint: false,
|
|
228
|
+
idempotentHint: false,
|
|
229
|
+
openWorldHint: true,
|
|
230
|
+
},
|
|
231
|
+
description: "Kronos Futures: will a leveraged perp position survive the calibrated range? Returns liquidation price and distance, adverse range bound, verdict (SURVIVES_RANGE / THIN_BUFFER / LIQUIDATION_INSIDE_RANGE), max surviving leverage, P&L at both range bounds, and funding cost. Costs $0.05 USDC.",
|
|
232
|
+
inputSchema: {
|
|
233
|
+
type: "object",
|
|
234
|
+
properties: {
|
|
235
|
+
symbol: { type: "string", description: "Symbol: BTC, ETH, SOL, XRP, ADA (default: BTC)" },
|
|
236
|
+
side: { type: "string", description: "LONG or SHORT" },
|
|
237
|
+
leverage: { type: "number", description: "Leverage to test (1-125)" },
|
|
238
|
+
entry: { type: "number", description: "Entry price (defaults to current perp mark)" },
|
|
239
|
+
notional: { type: "number", description: "Position notional in USD for funding cost (optional)" },
|
|
240
|
+
horizon_hours: { type: "number", description: "Hours held for funding cost (optional)" }
|
|
241
|
+
},
|
|
242
|
+
required: ["side", "leverage"]
|
|
243
|
+
}
|
|
244
|
+
},
|
|
188
245
|
{
|
|
189
246
|
name: "get_crypto_forecast",
|
|
190
247
|
annotations: {
|
|
@@ -304,6 +361,13 @@ async function callPyrimid(account, path, affiliateId, baseUrl, products) {
|
|
|
304
361
|
return paidRes.json();
|
|
305
362
|
}
|
|
306
363
|
|
|
364
|
+
function queryString(params) {
|
|
365
|
+
const parts = Object.entries(params)
|
|
366
|
+
.filter(([, v]) => v !== undefined && v !== null && v !== "")
|
|
367
|
+
.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`);
|
|
368
|
+
return parts.length ? `?${parts.join("&")}` : "";
|
|
369
|
+
}
|
|
370
|
+
|
|
307
371
|
async function callPaid(ctx, path, affiliateId, opts = {}) {
|
|
308
372
|
const { httpClient, account } = ctx;
|
|
309
373
|
const baseUrl = opts.baseUrl || BASE_URL;
|
|
@@ -423,6 +487,15 @@ async function main() {
|
|
|
423
487
|
case "get_crypto_forecast":
|
|
424
488
|
data = await callPaid(paymentContext, `/api/kronos/forecast?symbol=${encodeURIComponent(args.symbol || "BTC")}`, affiliateId);
|
|
425
489
|
break;
|
|
490
|
+
case "get_futures_decision":
|
|
491
|
+
data = await callPaid(paymentContext, `/api/kronos/futures/decision${queryString({ symbol: args.symbol || "BTC", equity: args.equity, max_loss_pct: args.max_loss_pct, max_leverage: args.max_leverage })}`, null);
|
|
492
|
+
break;
|
|
493
|
+
case "get_perp_funding":
|
|
494
|
+
data = await callPaid(paymentContext, `/api/kronos/futures/funding${queryString({ symbol: args.symbol })}`, null);
|
|
495
|
+
break;
|
|
496
|
+
case "check_futures_risk":
|
|
497
|
+
data = await callPaid(paymentContext, `/api/kronos/futures/risk${queryString({ symbol: args.symbol || "BTC", side: args.side, leverage: args.leverage, entry: args.entry, notional: args.notional, horizon_hours: args.horizon_hours })}`, null);
|
|
498
|
+
break;
|
|
426
499
|
case "review_signal_anomaly":
|
|
427
500
|
data = await callPaid(paymentContext, "/api/anomaly", null, {
|
|
428
501
|
method: "POST",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coinopai-mcp",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"mcpName": "io.github.forgemeshlabs/coinopai-mcp",
|
|
5
5
|
"description": "Auditable market intelligence MCP with x402 payments, calibrated forecast ranges, anomaly review, risk context, and outcome audits",
|
|
6
6
|
"main": "index.js",
|