@coinrithm/mcp-trading 0.7.4 → 0.7.5

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/CHANGELOG.md CHANGED
@@ -5,6 +5,32 @@ ships two binaries — `coinrithm-mcp` (the MCP server) and `coinrithm-agent` (t
5
5
  self-host agent runner) — versioned together. The CoinRithm **API contract** is
6
6
  versioned separately (see `openapi.yaml` `info.version`, currently `1.6.0`).
7
7
 
8
+ ## 0.7.5
9
+
10
+ **Release-hygiene bump. Everything below was already merged but never
11
+ reached npm** — the 0.7.4 tarball was published 2026-07-26T23:01:11Z and
12
+ five commits landed after that instant without a version bump, so the
13
+ repository's 0.7.4 and the published 0.7.4 were different code under one
14
+ version number. This release makes the published artifact match the
15
+ source again.
16
+
17
+ - **Security.** MCP dependency audit fixes, 6 findings to 0 (`da65e9e`).
18
+ Anyone on published 0.7.4 is running the pre-audit dependency set.
19
+ - **`pm_data` Gemini exposure** for agents (`3ab04ae`).
20
+ - **Venue methodology and health** exposed as tools (`74cc495`).
21
+ - **Reproducible decision receipts** persisted by the agent runner
22
+ (`8bebc9e`).
23
+ - **Docs.** Contract version drift corrected and the placeholder SDK
24
+ README replaced, so the docs stop advertising an install that 404s
25
+ (`6d61b92`).
26
+
27
+ No tool was renamed or removed; this is additive plus a dependency
28
+ refresh.
29
+
30
+ ⚠ Publishing this package is a **manual** step — `publish-mcp.yml` only
31
+ pushes `server.json` to the MCP registry, it does not run `npm publish`.
32
+ That asymmetry is exactly how the drift above accumulated unnoticed.
33
+
8
34
  ## 0.7.4
9
35
 
10
36
  Docs-only. No tool behavior change, no API-surface change.
package/README.md CHANGED
@@ -8,9 +8,9 @@ no risk — a proving ground to show an agent works *before* anything is on the
8
8
  line, with a public **Agent Arena** leaderboard ranked by realized paper PnL.
9
9
 
10
10
  **Plus a free prediction-market data surface — no key at all.** The same server
11
- ships four keyless `pm_data_*` tools serving CoinRithm's public cross-venue
12
- dataset: live odds across 11 venues (Polymarket, Kalshi, Smarkets, Limitless,
13
- Manifold, Metaculus, PredictIt, Rothera, Futuur, Myriad, ForecastEx), cross-venue matches with a
11
+ ships ten keyless `pm_data_*` tools serving CoinRithm's public cross-venue
12
+ dataset: live odds across 12 venues (Polymarket, Kalshi, Smarkets, Limitless,
13
+ Manifold, Metaculus, PredictIt, Rothera, Futuur, Myriad, ForecastEx, Gemini), cross-venue matches with a
14
14
  liquidity-aware reference probability, a whale-trade tape, and market-wide
15
15
  volume stats ($60B+ all-time tracked). Point any MCP client at the hosted
16
16
  endpoint `https://mcp.coinrithm.com/mcp` and call them anonymously — the API
@@ -80,7 +80,7 @@ DB-driven runtime.
80
80
  The hosted HTTP server holds **no** key: each request brings its own
81
81
  `crk_live_…` in the Authorization header, and the server forwards exactly that
82
82
  key upstream. The Authorization header is **optional** on the hosted endpoint —
83
- the four keyless `pm_data_*` market-data tools work anonymously; every other
83
+ the ten keyless `pm_data_*` market-data tools work anonymously; every other
84
84
  tool requires it. See [`DEPLOY.md`](./DEPLOY.md).
85
85
 
86
86
  ## Configure (stdio)
@@ -137,6 +137,8 @@ tool requires it. See [`DEPLOY.md`](./DEPLOY.md).
137
137
  | `close_futures_position` | trade:futures | `POST /api/agent/futures/close` |
138
138
  | `open_pm_position` | trade:pm | `POST /api/agent/pm/open` ¹ |
139
139
  | `pm_data_overview` | none (public) | compact `GET /api/prediction-markets/overview` |
140
+ | `pm_data_sources` | none (public) | venue methodology, coverage, and comparable volume bases |
141
+ | `pm_data_sources_health` | none (public) | per-venue freshness, lag, and degraded reasons |
140
142
  | `pm_data_events` | none (public) | compact `GET /api/prediction-markets/events` |
141
143
  | `pm_data_event` (source, slug, detail?) | none (public) | bounded event evidence by default; `detail: "full"` returns the untouched API record |
142
144
  | `pm_data_whales` (limit, default 10) | none (public) | compact `GET /api/prediction-markets/whales` |
@@ -145,9 +147,9 @@ tool requires it. See [`DEPLOY.md`](./DEPLOY.md).
145
147
  | `pm_data_canonical` (key?, limit, cursor) | none (public) | `GET /api/prediction-markets/canonical` (+ `/:key` detail) |
146
148
  | `pm_data_volume_history` | none (public) | `GET /api/prediction-markets/volume-history` |
147
149
 
148
- The eight `pm_data_*` tools wrap CoinRithm's free public cross-venue dataset
149
- (all 11 venues: Polymarket, Kalshi, Smarkets, Limitless, Manifold,
150
- Metaculus, PredictIt, Rothera, Futuur, Myriad, ForecastEx). They require no API key, never attach yours, and
150
+ The ten `pm_data_*` tools wrap CoinRithm's free public cross-venue dataset
151
+ (all 12 venues: Polymarket, Kalshi, Smarkets, Limitless, Manifold,
152
+ Metaculus, PredictIt, Rothera, Futuur, Myriad, ForecastEx, Gemini). They require no API key, never attach yours, and
151
153
  are research surfaces: `pm_data_events` list rows carry `referenceProbability`
152
154
  (a liquidity-aware cross-venue consensus on matched questions); `pm_data_event`
153
155
  includes `crossSourceMatches` (the same real-world question priced on other
@@ -18,6 +18,10 @@ function traceHeaders(trace) {
18
18
  h["X-CoinRithm-Strategy-Label"] = trace.strategyLabel;
19
19
  if (typeof trace.confidence === "number")
20
20
  h["X-CoinRithm-Confidence"] = String(trace.confidence);
21
+ if (trace.observationHash)
22
+ h["X-CoinRithm-Observation-Hash"] = trace.observationHash;
23
+ if (trace.indicatorVersion)
24
+ h["X-CoinRithm-Indicator-Version"] = trace.indicatorVersion;
21
25
  return h;
22
26
  }
23
27
  export class CoinRithmClient {
@@ -1,3 +1,4 @@
1
+ export declare const INDICATOR_VERSION = "coinrithm.indicators.v1";
1
2
  export interface Candle {
2
3
  open: number;
3
4
  high: number;
@@ -10,6 +10,9 @@
10
10
  //
11
11
  // Every function returns null when there are too few candles, so callers can
12
12
  // omit an indicator from the observation rather than emit a misleading number.
13
+ // Bump whenever indicator inputs, defaults, formulas, rounding, or output
14
+ // semantics change. Stored beside each observation hash and in manifest.lock.
15
+ export const INDICATOR_VERSION = "coinrithm.indicators.v1";
13
16
  const closesOf = (c) => c.map((x) => x.close);
14
17
  const finite = (n) => Number.isFinite(n);
15
18
  // Simple moving average of the last `period` values.
@@ -4,6 +4,7 @@ export interface AgentManifest {
4
4
  spec: string;
5
5
  resolverVersion: string;
6
6
  runnerVersion: string;
7
+ indicatorVersion: string;
7
8
  resolvedConfig: Record<string, unknown>;
8
9
  resolvedSpec: AgentSpec;
9
10
  provenance: Provenance;
@@ -6,12 +6,14 @@ import { writeFileSync, mkdirSync } from "node:fs";
6
6
  import { join } from "node:path";
7
7
  import { sha256, stableStringify, toPosix } from "./util.js";
8
8
  import { RESOLVER_VERSION, RUNNER_VERSION, MANIFEST_SCHEMA, } from "./version.js";
9
+ import { INDICATOR_VERSION } from "./indicators.js";
9
10
  export function buildManifest(resolved, spec) {
10
11
  // configHash binds the RESOLVED spec to the resolver + schema version, so a
11
12
  // run reproduces only against the same compile (not just the same files).
12
13
  const configHash = sha256(stableStringify({
13
14
  resolvedSpec: spec,
14
15
  resolverVersion: RESOLVER_VERSION,
16
+ indicatorVersion: INDICATOR_VERSION,
15
17
  schema: MANIFEST_SCHEMA,
16
18
  }));
17
19
  return {
@@ -19,6 +21,7 @@ export function buildManifest(resolved, spec) {
19
21
  spec: spec.spec || "coinrithm.agent.v1",
20
22
  resolverVersion: RESOLVER_VERSION,
21
23
  runnerVersion: RUNNER_VERSION,
24
+ indicatorVersion: INDICATOR_VERSION,
22
25
  resolvedConfig: resolved.rawFrontmatter,
23
26
  resolvedSpec: spec,
24
27
  provenance: resolved.provenance,
@@ -0,0 +1,6 @@
1
+ import type { Observation } from "./types.js";
2
+ export interface ObservationReceipt {
3
+ observationHash: string;
4
+ indicatorVersion: string;
5
+ }
6
+ export declare function buildObservationReceipt(observation: Observation): ObservationReceipt;
@@ -0,0 +1,10 @@
1
+ // A compact, privacy-safe receipt for the exact structured observation used by
2
+ // one decision. We persist the digest, never the full prompt or model output.
3
+ import { INDICATOR_VERSION } from "./indicators.js";
4
+ import { sha256, stableStringify } from "./util.js";
5
+ export function buildObservationReceipt(observation) {
6
+ return {
7
+ observationHash: sha256(stableStringify(observation)),
8
+ indicatorVersion: INDICATOR_VERSION,
9
+ };
10
+ }
@@ -17,6 +17,7 @@ import { makeDecisionId, makeTrace, exportRunEvidence } from "./runEvidence.js";
17
17
  import { rollDay, checkKillSwitch, accrueRealized, saveState, } from "./state.js";
18
18
  import { asObj, asNum, asStr } from "./extract.js";
19
19
  import { parseCadenceMs, sleep } from "./util.js";
20
+ import { buildObservationReceipt } from "./observationReceipt.js";
20
21
  // Independent-forecast kill-switch. Default ON: the fleet elicits + submits its
21
22
  // OWN forecastProbability on PM opens. Set HOUSE_AGENT_FORECAST_ENABLED to
22
23
  // "false"/"0"/"no"/"off" to ship pm/open requests WITHOUT the field, byte-identical
@@ -371,6 +372,10 @@ export async function runCycle(deps) {
371
372
  // OBSERVE
372
373
  const obs = await observe(client, spec, state, baseTrace);
373
374
  const observation = obs.observation;
375
+ const observationReceipt = buildObservationReceipt(observation);
376
+ // Reads build the observation, so its hash cannot exist before they finish.
377
+ // From this point every durable write carries the exact decision-input receipt.
378
+ Object.assign(baseTrace, observationReceipt);
374
379
  accrueRealized(state, observation.newClosedTrades);
375
380
  state.cursor = observation.syncCursor;
376
381
  for (const t of observation.newClosedTrades) {
@@ -419,13 +424,20 @@ export async function runCycle(deps) {
419
424
  disabled: true,
420
425
  disabledReason: state.disabledReason,
421
426
  live,
427
+ ...observationReceipt,
422
428
  };
423
429
  }
424
430
  if (obs.skip) {
425
431
  state.consecutiveRejectCycles += 1;
426
432
  saveState(stateFile, state);
427
433
  log(`skip: ${obs.skip}`);
428
- return { decision: "skip", skipReason: obs.skip, planned: [], live };
434
+ return {
435
+ decision: "skip",
436
+ skipReason: obs.skip,
437
+ planned: [],
438
+ live,
439
+ ...observationReceipt,
440
+ };
429
441
  }
430
442
  // GATE (slice 2): only SPEND an LLM call when a deterministic trigger fires — a
431
443
  // flagged entry setup or an open position to manage. No trigger => a cheap
@@ -451,6 +463,7 @@ export async function runCycle(deps) {
451
463
  estimatedCostUsd: 0,
452
464
  writeAttempted: 0,
453
465
  writeAccepted: 0,
466
+ ...observationReceipt,
454
467
  };
455
468
  }
456
469
  // DECIDE. Two paths share the same downstream validate+act loop:
@@ -519,6 +532,7 @@ export async function runCycle(deps) {
519
532
  decisionType: "model_error",
520
533
  writeAttempted: 0,
521
534
  writeAccepted: 0,
535
+ ...observationReceipt,
522
536
  };
523
537
  }
524
538
  const parsed = parseDecision(res.text);
@@ -539,6 +553,7 @@ export async function runCycle(deps) {
539
553
  decisionType: "model_error",
540
554
  writeAttempted: 0,
541
555
  writeAccepted: 0,
556
+ ...observationReceipt,
542
557
  };
543
558
  }
544
559
  state.consecutiveModelFailures = 0;
@@ -578,6 +593,7 @@ export async function runCycle(deps) {
578
593
  writeAttempted: decision.actions.length,
579
594
  writeAccepted: 0,
580
595
  ...(postedOpportunity ? { opportunity: postedOpportunity } : {}),
596
+ ...observationReceipt,
581
597
  };
582
598
  }
583
599
  // VALIDATE (+ ACT when live). Quote evidence is fetched by the runner.
@@ -778,13 +794,16 @@ export async function runCycle(deps) {
778
794
  const seq = state.intentSeq[intentKey] ?? 0;
779
795
  const idem = `${runId}:${intentKey}:${seq}`;
780
796
  const meta = action;
781
- const trace = makeTrace(runId, decisionId, spec, meta.confidence ?? decision.confidence,
782
- // The trade's "why" on the Arena live floor. Prefer the model's per-action
783
- // summary; else the decision rationale, but kept HONEST about this action's
784
- // market (a multi-action decision's rationale can be about a DIFFERENT market
785
- // than a secondary trade see rationaleForAction). Sanitized short reasoning
786
- // onlynever raw chain-of-thought.
787
- rationaleForAction(action, decision.rationale, meta.rationaleSummary, decision.actions.length));
797
+ const trace = {
798
+ ...makeTrace(runId, decisionId, spec, meta.confidence ?? decision.confidence,
799
+ // The trade's "why" on the Arena live floor. Prefer the model's per-action
800
+ // summary; else the decision rationale, but kept HONEST about this action's
801
+ // market (a multi-action decision's rationale can be about a DIFFERENT market
802
+ // than a secondary trade see rationaleForAction). Sanitized short reasoning
803
+ // only never raw chain-of-thought.
804
+ rationaleForAction(action, decision.rationale, meta.rationaleSummary, decision.actions.length)),
805
+ ...observationReceipt,
806
+ };
788
807
  const r = await executeAction(client, action, observation, trace, idem, provenance);
789
808
  planned.push({
790
809
  action,
@@ -868,6 +887,7 @@ export async function runCycle(deps) {
868
887
  writeAttempted: decision.actions.length,
869
888
  writeAccepted: planned.filter((p) => p.accepted).length,
870
889
  ...(postedOpportunity ? { opportunity: postedOpportunity } : {}),
890
+ ...observationReceipt,
871
891
  };
872
892
  }
873
893
  export async function runLoop(deps, opts = {}) {
@@ -301,6 +301,8 @@ export interface AgentTrace {
301
301
  strategyLabel?: string;
302
302
  confidence?: number;
303
303
  rationaleSummary?: string;
304
+ observationHash?: string;
305
+ indicatorVersion?: string;
304
306
  }
305
307
  export interface ApiResult {
306
308
  ok: boolean;
@@ -330,6 +332,8 @@ export interface CycleResult {
330
332
  disabled?: boolean;
331
333
  disabledReason?: string;
332
334
  live: boolean;
335
+ observationHash?: string;
336
+ indicatorVersion?: string;
333
337
  triggerCodes?: string[];
334
338
  llmCallMade?: boolean;
335
339
  tokensIn?: number;
package/dist/client.d.ts CHANGED
@@ -48,6 +48,10 @@ export declare class CoinRithmClient {
48
48
  getPublicPmOverview(query?: {
49
49
  fiat?: string;
50
50
  }): Promise<ApiResult>;
51
+ getPublicPmSources(query?: {
52
+ fiat?: string;
53
+ }): Promise<ApiResult>;
54
+ getPublicPmSourcesHealth(): Promise<ApiResult>;
51
55
  listPublicPmEvents(query?: {
52
56
  q?: string;
53
57
  source?: string;
package/dist/client.js CHANGED
@@ -203,6 +203,12 @@ export class CoinRithmClient {
203
203
  getPublicPmOverview(query) {
204
204
  return this.publicRequest("/api/prediction-markets/overview", query);
205
205
  }
206
+ getPublicPmSources(query) {
207
+ return this.publicRequest("/api/prediction-markets/sources", query);
208
+ }
209
+ getPublicPmSourcesHealth() {
210
+ return this.publicRequest("/api/prediction-markets/sources/health");
211
+ }
206
212
  listPublicPmEvents(query) {
207
213
  return this.publicRequest("/api/prediction-markets/events", query);
208
214
  }
package/dist/tools.js CHANGED
@@ -1426,8 +1426,8 @@ export function registerTools(server, client) {
1426
1426
  title: "Cross-venue prediction-market statistics",
1427
1427
  description: "Free public cross-venue prediction-market statistics: total/open/" +
1428
1428
  "closed market counts, total volume, 24h volume, and liquidity " +
1429
- "aggregated across all 11 venues (Polymarket, Kalshi, Rothera, " +
1430
- "Limitless, Smarkets, Manifold, Metaculus, PredictIt, Futuur, Myriad, ForecastEx), plus market " +
1429
+ "aggregated across all 12 venues (Polymarket, Kalshi, Rothera, " +
1430
+ "Limitless, Smarkets, Manifold, Metaculus, PredictIt, Futuur, Myriad, ForecastEx, Gemini), plus market " +
1431
1431
  "highlights in a compact discovery shape. Use pm_data_event for full " +
1432
1432
  "event evidence. Freshness is SOURCE-AWARE — each venue ingests " +
1433
1433
  "independently; per-venue health (freshness tier, lag, stale reason) " +
@@ -1445,11 +1445,40 @@ export function registerTools(server, client) {
1445
1445
  outputSchema: API_RESULT_OUTPUT_SCHEMA,
1446
1446
  annotations: readOnlyAnnotations("Cross-venue prediction-market statistics"),
1447
1447
  }, async ({ fiat }) => present(mapSuccessfulBody(await client.getPublicPmOverview({ fiat }), compactPublicPmOverview)));
1448
+ server.registerTool("pm_data_sources", {
1449
+ title: "Prediction-market venue methodology and coverage",
1450
+ description: "Free public methodology and comparable coverage for every CoinRithm " +
1451
+ "prediction-market venue: source kind, supported metrics, market counts, " +
1452
+ "explicit 24h/cumulative volume bases, currency basis, comparability, " +
1453
+ "and as-of timestamps. Use this before comparing venue totals so a " +
1454
+ "completed-day figure is never described as rolling 24h and play-money " +
1455
+ "points are never described as USD. No API key required.",
1456
+ inputSchema: {
1457
+ fiat: z
1458
+ .string()
1459
+ .optional()
1460
+ .describe("Fiat currency code for monetary figures (default usd)."),
1461
+ },
1462
+ outputSchema: API_RESULT_OUTPUT_SCHEMA,
1463
+ annotations: readOnlyAnnotations("Prediction-market venue methodology and coverage"),
1464
+ }, async ({ fiat }) => present(await client.getPublicPmSources({ fiat })));
1465
+ server.registerTool("pm_data_sources_health", {
1466
+ title: "Prediction-market venue freshness and health",
1467
+ description: "Free public per-venue ingest health across all CoinRithm sources: " +
1468
+ "freshness tier, observed lag, stale/degraded reason, coverage counts, " +
1469
+ "and current health timestamps. Check this before using a quote or " +
1470
+ "claiming cross-venue coverage; a venue being in the catalogue does " +
1471
+ "not by itself prove its hot prices meet the live freshness target. " +
1472
+ "No API key required.",
1473
+ inputSchema: {},
1474
+ outputSchema: API_RESULT_OUTPUT_SCHEMA,
1475
+ annotations: readOnlyAnnotations("Prediction-market venue freshness and health"),
1476
+ }, async () => present(await client.getPublicPmSourcesHealth()));
1448
1477
  server.registerTool("pm_data_events", {
1449
1478
  title: "Search prediction markets across all venues",
1450
- description: "Free public search over prediction-market events across ALL 11 " +
1479
+ description: "Free public search over prediction-market events across ALL 12 " +
1451
1480
  "venues (Polymarket, Kalshi, Rothera, Limitless, Smarkets, " +
1452
- "Manifold, Metaculus, PredictIt, Futuur, Myriad, ForecastEx) — broader than discover_pm_markets, which is " +
1481
+ "Manifold, Metaculus, PredictIt, Futuur, Myriad, ForecastEx, Gemini) — broader than discover_pm_markets, which is " +
1453
1482
  "scoped to the paper-tradeable venues. Returns titles, probabilities, " +
1454
1483
  "volume/liquidity, status, and source per event, plus " +
1455
1484
  "the five highest-probability outcomes and the full outcome count. " +
@@ -1468,7 +1497,7 @@ export function registerTools(server, client) {
1468
1497
  .string()
1469
1498
  .optional()
1470
1499
  .describe("Optional venue filter: polymarket, kalshi, rothera, limitless, " +
1471
- "smarkets, manifold, metaculus, predictit, futuur, myriad, or forecastex."),
1500
+ "smarkets, manifold, metaculus, predictit, futuur, myriad, forecastex, or gemini."),
1472
1501
  status: z
1473
1502
  .string()
1474
1503
  .optional()
@@ -1525,7 +1554,7 @@ export function registerTools(server, client) {
1525
1554
  source: z
1526
1555
  .string()
1527
1556
  .describe("Venue slug: polymarket, kalshi, rothera, limitless, smarkets, " +
1528
- "manifold, metaculus, predictit, futuur, myriad, or forecastex."),
1557
+ "manifold, metaculus, predictit, futuur, myriad, forecastex, or gemini."),
1529
1558
  slug: z.string().describe("Event slug on that venue."),
1530
1559
  fiat: z
1531
1560
  .string()
package/package.json CHANGED
@@ -1,86 +1,86 @@
1
- {
2
- "name": "@coinrithm/mcp-trading",
3
- "version": "0.7.4",
4
- "mcpName": "io.github.CoinRithm/mcp-trading",
5
- "description": "CoinRithm paper-trading toolkit: an MCP server (coinrithm-mcp) AND a self-host agent runner (coinrithm-agent) for spot, futures, and prediction markets with a user-minted API key.",
6
- "type": "module",
7
- "author": "CoinRithm",
8
- "homepage": "https://coinrithm.com/agentic-trading",
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/CoinRithm/coinrithm-agent-trading.git",
12
- "directory": "packages/mcp-trading"
13
- },
14
- "bugs": {
15
- "url": "https://github.com/CoinRithm/coinrithm-agent-trading/issues"
16
- },
17
- "publishConfig": {
18
- "access": "public"
19
- },
20
- "bin": {
21
- "coinrithm-mcp": "dist/index.js",
22
- "coinrithm-agent": "dist/agent/index.js"
23
- },
24
- "main": "dist/index.js",
25
- "files": [
26
- "dist",
27
- "README.md",
28
- "CHANGELOG.md"
29
- ],
30
- "scripts": {
31
- "build": "tsc -p tsconfig.json",
32
- "typecheck": "tsc -p tsconfig.json --noEmit",
33
- "test": "vitest run",
34
- "lint": "eslint src",
35
- "lint:fix": "eslint src --fix",
36
- "format": "prettier --write \"src/**/*.ts\"",
37
- "format:check": "prettier --check \"src/**/*.ts\"",
38
- "start": "node dist/index.js",
39
- "start:http": "node dist/http.js",
40
- "smoke:agent": "npm run build && node scripts/agent-smoke.mjs",
41
- "prepare": "npm run build"
42
- },
43
- "engines": {
44
- "node": ">=18"
45
- },
46
- "keywords": [
47
- "mcp",
48
- "mcp-server",
49
- "model-context-protocol",
50
- "ai-agent",
51
- "agent-trading",
52
- "trading",
53
- "paper-trading",
54
- "crypto",
55
- "futures",
56
- "prediction-markets",
57
- "polymarket",
58
- "kalshi",
59
- "claude",
60
- "chatgpt",
61
- "gemini",
62
- "cursor",
63
- "open-knowledge-format",
64
- "okf",
65
- "model-agnostic",
66
- "leaderboard",
67
- "coinrithm"
68
- ],
69
- "license": "MIT",
70
- "dependencies": {
71
- "@modelcontextprotocol/sdk": "^1.0.0",
72
- "express": "^4.21.0",
73
- "yaml": "^2.5.0",
74
- "zod": "^3.23.8"
75
- },
76
- "devDependencies": {
77
- "@eslint/js": "^9.13.0",
78
- "@types/express": "^4.17.21",
79
- "@types/node": "^20.14.0",
80
- "eslint": "^9.13.0",
81
- "prettier": "^3.3.3",
82
- "typescript": "^5.5.0",
83
- "typescript-eslint": "^8.11.0",
84
- "vitest": "^2.1.0"
85
- }
86
- }
1
+ {
2
+ "name": "@coinrithm/mcp-trading",
3
+ "version": "0.7.5",
4
+ "mcpName": "io.github.CoinRithm/mcp-trading",
5
+ "description": "CoinRithm paper-trading toolkit: an MCP server (coinrithm-mcp) AND a self-host agent runner (coinrithm-agent) for spot, futures, and prediction markets with a user-minted API key.",
6
+ "type": "module",
7
+ "author": "CoinRithm",
8
+ "homepage": "https://coinrithm.com/agentic-trading",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/CoinRithm/coinrithm-agent-trading.git",
12
+ "directory": "packages/mcp-trading"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/CoinRithm/coinrithm-agent-trading/issues"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "bin": {
21
+ "coinrithm-mcp": "dist/index.js",
22
+ "coinrithm-agent": "dist/agent/index.js"
23
+ },
24
+ "main": "dist/index.js",
25
+ "files": [
26
+ "dist",
27
+ "README.md",
28
+ "CHANGELOG.md"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.json",
32
+ "typecheck": "tsc -p tsconfig.json --noEmit",
33
+ "test": "vitest run",
34
+ "lint": "eslint src",
35
+ "lint:fix": "eslint src --fix",
36
+ "format": "prettier --write \"src/**/*.ts\"",
37
+ "format:check": "prettier --check \"src/**/*.ts\"",
38
+ "start": "node dist/index.js",
39
+ "start:http": "node dist/http.js",
40
+ "smoke:agent": "npm run build && node scripts/agent-smoke.mjs",
41
+ "prepare": "npm run build"
42
+ },
43
+ "engines": {
44
+ "node": ">=18"
45
+ },
46
+ "keywords": [
47
+ "mcp",
48
+ "mcp-server",
49
+ "model-context-protocol",
50
+ "ai-agent",
51
+ "agent-trading",
52
+ "trading",
53
+ "paper-trading",
54
+ "crypto",
55
+ "futures",
56
+ "prediction-markets",
57
+ "polymarket",
58
+ "kalshi",
59
+ "claude",
60
+ "chatgpt",
61
+ "gemini",
62
+ "cursor",
63
+ "open-knowledge-format",
64
+ "okf",
65
+ "model-agnostic",
66
+ "leaderboard",
67
+ "coinrithm"
68
+ ],
69
+ "license": "MIT",
70
+ "dependencies": {
71
+ "@modelcontextprotocol/sdk": "^1.0.0",
72
+ "express": "^4.21.0",
73
+ "yaml": "^2.5.0",
74
+ "zod": "^3.23.8"
75
+ },
76
+ "devDependencies": {
77
+ "@eslint/js": "^9.13.0",
78
+ "@types/express": "^4.17.21",
79
+ "@types/node": "^20.14.0",
80
+ "eslint": "^9.13.0",
81
+ "prettier": "^3.3.3",
82
+ "typescript": "^5.5.0",
83
+ "typescript-eslint": "^8.11.0",
84
+ "vitest": "^2.1.0"
85
+ }
86
+ }