@0xinsider/mcp 3.6.2 → 3.9.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 +60 -18
- package/dist/catalog.generated.d.ts +56 -0
- package/dist/catalog.generated.d.ts.map +1 -1
- package/dist/catalog.generated.js +70 -0
- package/dist/catalog.generated.js.map +1 -1
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/product-cli/index.d.ts.map +1 -1
- package/dist/product-cli/index.js +181 -26
- package/dist/product-cli/index.js.map +1 -1
- package/dist/product-cli/operations.d.ts +24 -0
- package/dist/product-cli/operations.d.ts.map +1 -0
- package/dist/product-cli/operations.js +239 -0
- package/dist/product-cli/operations.js.map +1 -0
- package/dist/prompts/index.js +2 -2
- package/dist/sdk/client.d.ts +262 -151
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +284 -145
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/errors.d.ts +6 -5
- package/dist/sdk/errors.d.ts.map +1 -1
- package/dist/sdk/errors.js +13 -5
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/index.d.ts +4 -26
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +2 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/pagination.d.ts +3 -3
- package/dist/sdk/pagination.js +2 -2
- package/dist/sdk/schema.d.ts +1496 -212
- package/dist/sdk/schema.d.ts.map +1 -1
- package/dist/sdk/webhooks.d.ts +8 -60
- package/dist/sdk/webhooks.d.ts.map +1 -1
- package/dist/sdk/webhooks.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +21 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/account.d.ts +5 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +53 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/category-leaderboards.d.ts +5 -0
- package/dist/tools/category-leaderboards.d.ts.map +1 -0
- package/dist/tools/category-leaderboards.js +71 -0
- package/dist/tools/category-leaderboards.js.map +1 -0
- package/dist/tools/explore-markets.js +2 -2
- package/dist/tools/explore-markets.js.map +1 -1
- package/dist/tools/games.d.ts +4 -0
- package/dist/tools/games.d.ts.map +1 -1
- package/dist/tools/games.js +152 -6
- package/dist/tools/games.js.map +1 -1
- package/dist/tools/get-insider-radar.js +1 -1
- package/dist/tools/get-insider-radar.js.map +1 -1
- package/dist/tools/get-leaderboard.d.ts.map +1 -1
- package/dist/tools/get-leaderboard.js +36 -18
- package/dist/tools/get-leaderboard.js.map +1 -1
- package/dist/tools/get-market-flow.js +1 -1
- package/dist/tools/get-trader-pnl.js +3 -3
- package/dist/tools/get-trader-pnl.js.map +1 -1
- package/dist/tools/get-trader.js +3 -3
- package/dist/tools/get-trending-wallets.js +1 -1
- package/dist/tools/get-whale-trades.d.ts.map +1 -1
- package/dist/tools/get-whale-trades.js +14 -4
- package/dist/tools/get-whale-trades.js.map +1 -1
- package/dist/tools/market-reads.d.ts +2 -0
- package/dist/tools/market-reads.d.ts.map +1 -1
- package/dist/tools/market-reads.js +58 -4
- package/dist/tools/market-reads.js.map +1 -1
- package/dist/tools/pick-of-the-day.d.ts +1 -0
- package/dist/tools/pick-of-the-day.d.ts.map +1 -1
- package/dist/tools/pick-of-the-day.js +22 -2
- package/dist/tools/pick-of-the-day.js.map +1 -1
- package/dist/tools/read-parity.d.ts +1 -0
- package/dist/tools/read-parity.d.ts.map +1 -1
- package/dist/tools/read-parity.js +55 -14
- package/dist/tools/read-parity.js.map +1 -1
- package/dist/tools/search-markets.js +4 -4
- package/dist/tools/search-markets.js.map +1 -1
- package/dist/tools/sport-leaderboards.d.ts +5 -0
- package/dist/tools/sport-leaderboards.d.ts.map +1 -0
- package/dist/tools/sport-leaderboards.js +65 -0
- package/dist/tools/sport-leaderboards.js.map +1 -0
- package/dist/tools/trader-reads.js +1 -1
- package/package.json +5 -5
package/dist/tools/games.js
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
// `backend/src/mcp/tools/schema.rs`, so the remote endpoint and this stdio
|
|
7
7
|
// server answer the same page for the same arguments.
|
|
8
8
|
import { z } from "zod";
|
|
9
|
-
import {
|
|
9
|
+
import { MAX_BATCH_ITEMS } from "../constants.js";
|
|
10
|
+
import { fail, listResult, ok, withMeta } from "./result.js";
|
|
10
11
|
const readAnnotations = {
|
|
11
12
|
readOnlyHint: true,
|
|
12
13
|
destructiveHint: false,
|
|
@@ -16,17 +17,19 @@ const readAnnotations = {
|
|
|
16
17
|
export function registerListGames(server, client) {
|
|
17
18
|
server.registerTool("list_games", {
|
|
18
19
|
title: "List covered games",
|
|
19
|
-
description: `The fixture list: one coherent game per row, so an agent never has to assemble a game from market searches and team-name matching. Each row carries both sides with their provider ids and live scores, the UTC kickoff, the provider's own status, the esports series format, and
|
|
20
|
+
description: `The fixture list: one coherent game per row, so an agent never has to assemble a game from market searches and team-name matching. Each row carries both sides with their provider ids and live scores, the UTC kickoff, the provider's own status, the esports series format, and the game's winner markets (the moneyline, or a soccer game's three 1X2 legs) with their condition_id, outcome token ids and provider moneyline prices. A game's spreads, totals and player props are not on the row: list_game_markets lists every market of one event_slug. Ordered by kickoff, then event_slug; games whose kickoff the provider has not published sort last. For what is on now, pass window=now: without it the list is the whole catalog and starts at the oldest game still open, which can be weeks old.
|
|
20
21
|
|
|
21
22
|
Args:
|
|
22
23
|
- sport (string, optional): canonical bucket, case-insensitive, with - and _ read as a space (table-tennis and Table Tennis are one bucket). Omitted means every covered sport
|
|
23
24
|
- league (string, optional): league tag as coverage.leagues spells it (nfl, epl, cs2), case-insensitive
|
|
24
|
-
- status (string, optional): scheduled, live, paused, ended, postponed, cancelled, suspended, delayed, or unknown
|
|
25
|
+
- status (string, optional): scheduled, live, paused, ended, postponed, cancelled, suspended, delayed, or unknown. ended, cancelled and postponed also list finished games that have left the live board (freshness.source stored) for kickoffs in starts_after..starts_before, by default the 7 days before now; such a page can be short, or empty, while has_more is true, so follow next_cursor until has_more is false
|
|
25
26
|
- starts_after / starts_before (string, optional): RFC 3339 kickoff bounds; a game with no published kickoff is excluded whenever either bound is set
|
|
27
|
+
- window (string, optional): all (default, the whole catalog) or now: games the provider reports in play, plus any other game whose kickoff was at most 3 hours ago or is still to come, without ended, postponed or cancelled games
|
|
26
28
|
- limit (number, 1-100, default 20)
|
|
27
29
|
- cursor (string, optional): opaque gms_v1_ cursor from next_cursor. It pins the page position, not a snapshot: the catalog is live, so a game added or removed between pages moves with it
|
|
30
|
+
- expand (string, optional): sharp_money adds each game's sharp_money, the object get_game_sharp_money returns, read from the sport board's cached aggregate (one board read per sport, so a page stays fast). A game the board did not evaluate reads status not_computed: call get_game_sharp_money for it. A sport whose aggregate could not be read reads status unavailable while the rest of the page is served. Pro and Max
|
|
28
31
|
|
|
29
|
-
Returns: data, has_more, next_cursor, as_of, coverage and meta. Read coverage before reading an empty page: it names the sports and leagues this deployment serves and any scope whose source was unavailable for this read, so an unserved sport is never confused with a quiet night. A sport or status this deployment does not serve returns an empty page, not an error. status.state keeps postponed, cancelled, suspended and delayed distinct from a plain 'not live', and a kickoff in the past is never read as live on its own. Scores are the provider's own strings, because a set score and a run total are not both integers. Carries no
|
|
32
|
+
Returns: data, has_more, next_cursor, as_of, coverage and meta. Read coverage before reading an empty page: it names the sports and leagues this deployment serves and any scope whose source was unavailable for this read, so an unserved sport is never confused with a quiet night. A sport or status this deployment does not serve returns an empty page, not an error. status.state keeps postponed, cancelled, suspended and delayed distinct from a plain 'not live', and a kickoff in the past is never read as live on its own. Scores are the provider's own strings, because a set score and a run total are not both integers. Carries no sharp-money split unless expand is sharp_money, and no holder identity; holders stay on get_market_holders.`,
|
|
30
33
|
inputSchema: z.object({
|
|
31
34
|
sport: z.string().optional()
|
|
32
35
|
.describe("Canonical sport bucket, case-insensitive, with - and _ read as a space; omitted means every covered sport. A bucket this deployment does not serve returns an empty page"),
|
|
@@ -50,12 +53,16 @@ Returns: data, has_more, next_cursor, as_of, coverage and meta. Read coverage be
|
|
|
50
53
|
.describe("RFC 3339 instant; keep only games whose kickoff is at or after it"),
|
|
51
54
|
starts_before: z.string().optional()
|
|
52
55
|
.describe("RFC 3339 instant; keep only games whose kickoff is at or before it. Must be at or after starts_after"),
|
|
56
|
+
window: z.enum(["all", "now"]).default("all")
|
|
57
|
+
.describe("all lists the whole catalog. now lists what is on now: games the provider reports in play, plus any other game whose kickoff was at most 3 hours ago or is still to come, without ended, postponed or cancelled games"),
|
|
53
58
|
// `list_games_schema` in `backend/src/mcp/tools/schema.rs` describes
|
|
54
59
|
// `limit` too (#18083); the two sides must read the same.
|
|
55
60
|
limit: z.number().int().min(1).max(100).default(20)
|
|
56
61
|
.describe("Max results (1-100, default 20)"),
|
|
57
62
|
cursor: z.string().optional()
|
|
58
63
|
.describe("Opaque gms_v1_ cursor from next_cursor; it pins the page position (kickoff and event_slug), not a snapshot"),
|
|
64
|
+
expand: z.enum(["sharp_money"]).optional()
|
|
65
|
+
.describe("sharp_money: add each game's event-level sharp money (the object get_game_sharp_money returns, from the sport board's cached aggregate), so no per-game call is needed"),
|
|
59
66
|
}),
|
|
60
67
|
annotations: readAnnotations,
|
|
61
68
|
}, async (args, ctx) => {
|
|
@@ -81,12 +88,12 @@ Returns: data, has_more, next_cursor, as_of, coverage and meta. Read coverage be
|
|
|
81
88
|
export function registerGetGame(server, client) {
|
|
82
89
|
server.registerTool("get_game", {
|
|
83
90
|
title: "Get one game",
|
|
84
|
-
description: `The same game object list_games returns, for one event_slug: both sides with their provider ids and live scores, the UTC kickoff, the provider's own status, the esports series format, and
|
|
91
|
+
description: `The same game object list_games returns, for one event_slug: both sides with their provider ids and live scores, the UTC kickoff, the provider's own status, the esports series format, and the game's winner markets (the moneyline, or a soccer game's three 1X2 legs) with their condition_id, outcome token ids and provider moneyline prices. For the game's spreads, totals and player props, call list_game_markets with the same event_slug. The slug is the identity the live_sports_updated webhook pulse carries, so a receiver can read the full game straight from a pulse.
|
|
85
92
|
|
|
86
93
|
Args:
|
|
87
94
|
- event_slug (string, required): the game's event slug, for example nfl-buf-nyj-2026-09-22. Matched case-insensitively
|
|
88
95
|
|
|
89
|
-
Returns: the game object with the envelope's meta. status.state keeps postponed, cancelled, suspended and delayed distinct from a plain 'not live'. Each game's own coverage reports whether scores, competitor provider ids and the schedule were available: when competitors reads labels, do not join on names. A slug outside the published coverage answers 404, including a real Polymarket event in a sport this deployment does not serve; list_games names what is covered. Carries no
|
|
96
|
+
Returns: the game object with the envelope's meta. status.state keeps postponed, cancelled, suspended and delayed distinct from a plain 'not live'. Each game's own coverage reports whether scores, competitor provider ids and the schedule were available: when competitors reads labels, do not join on names. A slug outside the published coverage answers 404, including a real Polymarket event in a sport this deployment does not serve; list_games names what is covered. Carries no sharp-money split and no holder identity.`,
|
|
90
97
|
inputSchema: z.object({
|
|
91
98
|
event_slug: z.string().trim().min(1)
|
|
92
99
|
.describe("The game's event slug, for example nfl-buf-nyj-2026-09-22; matched case-insensitively"),
|
|
@@ -102,4 +109,143 @@ Returns: the game object with the envelope's meta. status.state keeps postponed,
|
|
|
102
109
|
}
|
|
103
110
|
});
|
|
104
111
|
}
|
|
112
|
+
export function registerListGameMarkets(server, client) {
|
|
113
|
+
server.registerTool("list_game_markets", {
|
|
114
|
+
title: "List a game's markets",
|
|
115
|
+
description: `Every stored Polymarket market of one event_slug: the moneyline, spreads, totals, team totals, half and quarter lines, player props and the rest, plus the markets of the event's child events (a soccer game's exact score, halftime result and more-markets events), each with its own event_slug. Each row carries the condition_id, the provider's sports_market_type and groupItemTitle, the provider's typed line and, when stated, the outcome index it belongs to, both outcome labels with their CLOB token ids, and active or closed status. Ordered by sports_market_type, then line, then condition_id. Pass a condition_id to get_market_holders, get_market_flow or get_market_snapshot.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
- event_slug (string, required): the event slug from list_games, get_game or a search_markets result, for example nba-bos-orl-2026-11-01. Matched case-insensitively. Live, upcoming and settled events all answer
|
|
119
|
+
- sports_market_type (string, optional): comma-separated provider market types to keep, case-insensitive (spreads, totals, points, first_half_totals). Omitted keeps every type; an unknown type returns an empty page
|
|
120
|
+
- status (string, optional): active, closed or all (default all)
|
|
121
|
+
- limit (number, 1-100, default 20)
|
|
122
|
+
- cursor (string, optional): opaque gmk_v1_ cursor from next_cursor, sent with the same filters
|
|
123
|
+
- expand (string[], optional): sharp_money adds each row's sharp_money: status (computed, not_computed or unavailable; the first read of a game can be unavailable while its split is built, so retry after a few seconds), trader_count, per-outcome usd and S/A/B wallet counts, and money_as_of, the game page's per-line split
|
|
124
|
+
|
|
125
|
+
Returns: data, has_more, next_cursor, event_slug, families and meta. families lists every market type the event holds with its market and active counts, whatever the filters: read it first to choose a sports_market_type. A slug no stored market carries answers 404; an event outside sports and esports answers 404 with reason market_out_of_scope. Carries no price and no holder identity: get_game_holders reads the holders of several of these markets in one call.`,
|
|
126
|
+
inputSchema: z.object({
|
|
127
|
+
event_slug: z.string().trim().min(1)
|
|
128
|
+
.describe("The game's event slug, for example nba-bos-orl-2026-11-01; matched case-insensitively"),
|
|
129
|
+
sports_market_type: z.string().optional()
|
|
130
|
+
.describe("Comma-separated provider market types to keep, case-insensitive: spreads, totals, points, first_half_totals. Omitted keeps every type; the response's families lists the event's types"),
|
|
131
|
+
status: z.enum(["active", "closed", "all"]).default("all")
|
|
132
|
+
.describe("Keep only active or only closed markets; default all"),
|
|
133
|
+
limit: z.number().int().min(1).max(100).default(20)
|
|
134
|
+
.describe("Max results (1-100, default 20)"),
|
|
135
|
+
cursor: z.string().optional()
|
|
136
|
+
.describe("Opaque gmk_v1_ cursor from next_cursor, used with the same filters"),
|
|
137
|
+
expand: z.array(z.enum(["sharp_money"])).optional()
|
|
138
|
+
.describe("sharp_money adds each row's sharp-money split: side USD and S/A/B wallet counts per outcome (#32155)"),
|
|
139
|
+
}),
|
|
140
|
+
annotations: readAnnotations,
|
|
141
|
+
}, async ({ event_slug, expand, ...query }, ctx) => {
|
|
142
|
+
try {
|
|
143
|
+
const response = await client.request(`/api/v1/games/${encodeURIComponent(event_slug)}/markets`, query, expand && expand.length > 0 ? { expand: [...expand] } : undefined, { signal: ctx.mcpReq.signal });
|
|
144
|
+
// Spread explicitly: `event_slug` and `families` are page-level keys
|
|
145
|
+
// outside the standard list envelope, and `families` is what tells an
|
|
146
|
+
// agent which sports_market_type filter finds the props (#32131).
|
|
147
|
+
return ok({
|
|
148
|
+
data: response.data,
|
|
149
|
+
has_more: response.has_more,
|
|
150
|
+
next_cursor: response.next_cursor,
|
|
151
|
+
...(response.event_slug === undefined ? {} : { event_slug: response.event_slug }),
|
|
152
|
+
...(response.families === undefined ? {} : { families: response.families }),
|
|
153
|
+
...(response.meta === undefined ? {} : { meta: response.meta }),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return fail(error);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
export function registerGetGameSharpMoney(server, client) {
|
|
162
|
+
server.registerTool("get_game_sharp_money", {
|
|
163
|
+
title: "Get game sharp money",
|
|
164
|
+
description: `Where the graded money sits on a whole game, in one read: the S, A and B grade wallets' USD on each side (home, away and, for a 1X2 game, draw) summed across the game's markets, each side's integer share of it, the leader, and wallet counts by grade, plus the backend's verdict on the split. The same aggregate the game page on 0xinsider renders, so the two cannot disagree. Use it instead of paging get_market_holders per market and summing.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
- event_slug (string, required): the game's event slug, for example nba-bos-orl-2026-11-01. Matched case-insensitively
|
|
168
|
+
|
|
169
|
+
Returns: data with event_slug, status, lifecycle, verdict, allocation, total_usd, unallocated_usd, trader_count, holders_partial, outcomes[] (side, label, usd, pct, is_leader, wallets.s/a/b), computed_at and money_as_of, plus meta. Every aggregate field is null unless status is computed; null means unknown, never zero. verdict.kind is no_sharp_money, all_on, split, leans (label, pct), leans_over_price (label, divergence_pts: how many probability points the money share sits above the price), no_clear_lean, unavailable (money exists but cannot be attributed) or withheld (the money is published but no directional claim is supported). When allocation is degraded, outcomes sum to total_usd minus unallocated_usd and carry no pct or leader. holders_partial true means a market's holder list was a capped page, so counts and dollars cover part of the holders. A settled game returns its recap with lifecycle settled. A game whose aggregate is still computing answers 503 read_model_warming with Retry-After; read again then. A slug with no sports market answers 404. Pro and Max. Descriptive analytics, not an order instruction.`,
|
|
170
|
+
inputSchema: z.object({
|
|
171
|
+
event_slug: z.string().trim().min(1)
|
|
172
|
+
.describe("The game's event slug, for example nba-bos-orl-2026-11-01; matched case-insensitively"),
|
|
173
|
+
}),
|
|
174
|
+
annotations: readAnnotations,
|
|
175
|
+
}, async ({ event_slug }, ctx) => {
|
|
176
|
+
try {
|
|
177
|
+
const response = await client.request(`/api/v1/games/${encodeURIComponent(event_slug)}/sharp-money`, undefined, undefined, { signal: ctx.mcpReq.signal });
|
|
178
|
+
return ok(withMeta(response.data, response.meta));
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return fail(error);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
// A game's newest fills across every market in it (#32156). Mirrors
|
|
186
|
+
// `get_game_trades` in `backend/src/mcp/tools/contract.rs`.
|
|
187
|
+
export function registerGetGameTrades(server, client) {
|
|
188
|
+
server.registerTool("get_game_trades", {
|
|
189
|
+
title: "List a game's trades",
|
|
190
|
+
description: `A game's newest fills across every market in it, live: the moneyline, spreads, totals and props, player props included, newest first. The same rows the 0xinsider game page's activity rail shows a Pro viewer. Every fill, not only large ones; use get_large_trades with event_slug for the game's large trades with review scores.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
- event_slug (string, required): the game's event slug, for example nba-bos-orl-2026-11-01. Matched case-insensitively
|
|
194
|
+
- limit (number, 1-200, default 100): newest fills to return
|
|
195
|
+
|
|
196
|
+
Returns: data (each fill's id, traded_at, side, outcome, outcome_index, price, shares, size_usd, the signed spread point, the trader's address, display_name and current grade, and the market's condition_id, title, slug and line_label, its name within the game), has_more (always false: poll again rather than page), event_slug, source_stale and meta. source_stale true means the rows are the game's last complete read while its refresh runs. Deduplicate on id across polls. A 503 read_model_warming means the game's first read is still running: retry after Retry-After. An unknown slug answers not_found; an event outside sports and esports answers market_out_of_scope.`,
|
|
197
|
+
inputSchema: z.object({
|
|
198
|
+
event_slug: z.string().trim().min(1)
|
|
199
|
+
.describe("The game's event slug, for example nba-bos-orl-2026-11-01; matched case-insensitively"),
|
|
200
|
+
limit: z.number().int().min(1).max(200).default(100)
|
|
201
|
+
.describe("Newest fills to return (1-200, default 100)"),
|
|
202
|
+
}),
|
|
203
|
+
annotations: readAnnotations,
|
|
204
|
+
}, async ({ event_slug, limit }, ctx) => {
|
|
205
|
+
try {
|
|
206
|
+
const response = await client.request(`/api/v1/games/${encodeURIComponent(event_slug)}/trades`, { limit }, undefined, { signal: ctx.mcpReq.signal });
|
|
207
|
+
// `event_slug` and `source_stale` sit beside the list envelope, as
|
|
208
|
+
// ListMetadata::GameTrades keeps them on the remote endpoint.
|
|
209
|
+
return ok({
|
|
210
|
+
...listResult(response),
|
|
211
|
+
...(response.event_slug === undefined ? {} : { event_slug: response.event_slug }),
|
|
212
|
+
...(response.source_stale === undefined ? {} : { source_stale: response.source_stale }),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return fail(error);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
export function registerGetGameHolders(server, client) {
|
|
221
|
+
server.registerTool("get_game_holders", {
|
|
222
|
+
title: "Get a game's holders",
|
|
223
|
+
description: `The S, A and B graded holders of up to ${MAX_BATCH_ITEMS} markets of one game in one call. Each item is get_market_holders for one market, unfiltered and cut to limit, with its market, scan and totals. Pass condition_ids from list_game_markets; a market that is not one of the game's is that item's not_found. Results preserve request order and duplicate inputs return duplicate rows. Uses the V1 batch item quota, one item per condition_id. A market whose roster is not ready within the request is an item error with reason read_model_warming and retry_at: its scan keeps running, so a retry after that time reads it. Page past limit with get_market_holders.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
- event_slug (string, required): the game's event slug, for example nba-bos-orl-2026-11-01. Matched case-insensitively
|
|
227
|
+
- condition_ids (string[], required): 1-${MAX_BATCH_ITEMS} condition_id values of this game's markets
|
|
228
|
+
- limit (number, 1-100, default 20): holders per market
|
|
229
|
+
|
|
230
|
+
Returns: Ordered batch results with per-item success or error details; an ok item's data carries data (holders), has_more, total, market, scan, totals, computed_at and cached.`,
|
|
231
|
+
inputSchema: z.object({
|
|
232
|
+
event_slug: z.string().trim().min(1)
|
|
233
|
+
.describe("The game's event slug, for example nba-bos-orl-2026-11-01; matched case-insensitively"),
|
|
234
|
+
condition_ids: z.array(z.string().trim().min(1)).min(1).max(MAX_BATCH_ITEMS)
|
|
235
|
+
.describe("condition_id values of this game's markets, from list_game_markets"),
|
|
236
|
+
limit: z.number().int().min(1).max(100).default(20)
|
|
237
|
+
.describe("Max holders per market (1-100, default 20)"),
|
|
238
|
+
}),
|
|
239
|
+
annotations: readAnnotations,
|
|
240
|
+
}, async ({ event_slug, condition_ids, limit }, ctx) => {
|
|
241
|
+
try {
|
|
242
|
+
// The batch envelope is the answer: per-item status, data and error,
|
|
243
|
+
// plus the batch item quota in meta (#32155).
|
|
244
|
+
return ok(await client.request(`/api/v1/games/${encodeURIComponent(event_slug)}/holders`, { limit }, { condition_ids: [...condition_ids] }, { signal: ctx.mcpReq.signal }));
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
return fail(error);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
105
251
|
//# sourceMappingURL=games.js.map
|
package/dist/tools/games.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"games.js","sourceRoot":"","sources":["../../src/tools/games.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,sEAAsE;AACtE,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,sDAAsD;AAGtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"games.js","sourceRoot":"","sources":["../../src/tools/games.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { SUSPICIOUS_TRADES_DESCRIPTION, suspiciousTradesInputSchema, } from "./g
|
|
|
7
7
|
export function registerGetInsiderRadar(server, client) {
|
|
8
8
|
server.registerTool("get_insider_radar", {
|
|
9
9
|
title: "Get Insider Radar Flags",
|
|
10
|
-
description: `Deprecated alias of get_suspicious_trades (#16301), kept live; it calls the deprecated /api/v1/insider-radar path. ${SUSPICIOUS_TRADES_DESCRIPTION}`,
|
|
10
|
+
description: `Deprecated alias of get_suspicious_trades (#16301), kept live until its 2027-02-01 sunset (#29351), then removed; it calls the deprecated /api/v1/insider-radar path. ${SUSPICIOUS_TRADES_DESCRIPTION}`,
|
|
11
11
|
inputSchema: z.object(suspiciousTradesInputSchema),
|
|
12
12
|
annotations: {
|
|
13
13
|
readOnlyHint: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-insider-radar.js","sourceRoot":"","sources":["../../src/tools/get-insider-radar.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,8DAA8D;AAG9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,MAAiB;IAC1E,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"get-insider-radar.js","sourceRoot":"","sources":["../../src/tools/get-insider-radar.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,8DAA8D;AAG9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,MAAiB;IAC1E,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,yKAAyK,6BAA6B,EAAE;QACrN,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,2BAA2B,CAAC;QAClD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE;gBAC7D,KAAK;gBACL,MAAM;gBACN,aAAa;gBACb,QAAQ;gBACR,IAAI;aACL,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-leaderboard.d.ts","sourceRoot":"","sources":["../../src/tools/get-leaderboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"get-leaderboard.d.ts","sourceRoot":"","sources":["../../src/tools/get-leaderboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAmCzC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CA8DjF"}
|
|
@@ -1,41 +1,50 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { fail, listResult } from "./result.js";
|
|
3
3
|
/**
|
|
4
|
-
* The strategies `GET /api/v1/leaderboard`
|
|
4
|
+
* The strategies `GET /api/v1/leaderboard` publishes (`STRATEGY_ENUM` in
|
|
5
5
|
* `backend/src/api_v1/handlers/leaderboard.rs`, the spec's enum, and the SDK's
|
|
6
|
-
* `LEADERBOARD_STRATEGIES`). Any other value is a 400 at the route,
|
|
7
|
-
*
|
|
6
|
+
* `LEADERBOARD_STRATEGIES`). Any other value is a 400 at the route, except the
|
|
7
|
+
* ten retired archetype keys it still accepts as filters that match no wallet
|
|
8
|
+
* (#29628). The schema accepts only the published values (#16548).
|
|
8
9
|
*/
|
|
9
10
|
const LEADERBOARD_STRATEGIES = [
|
|
10
|
-
"accumulator",
|
|
11
|
-
"algo_trader",
|
|
12
|
-
"arbitrageur",
|
|
13
11
|
"category_focused",
|
|
14
|
-
"directional",
|
|
15
12
|
"diversified",
|
|
16
|
-
"event_driven",
|
|
17
13
|
"high_activity",
|
|
18
|
-
"market_maker",
|
|
19
14
|
"mixed",
|
|
20
|
-
"momentum",
|
|
21
|
-
"scalper",
|
|
22
|
-
"speculator",
|
|
23
|
-
"swing_trader",
|
|
24
15
|
"two_sided",
|
|
25
16
|
"unclassified",
|
|
26
17
|
];
|
|
18
|
+
/**
|
|
19
|
+
* The route's `sort`, `dir` and `activity` values (#32237): `SORT_ENUM`,
|
|
20
|
+
* `DIR_ENUM` and `ACTIVITY_ENUM` in the same handler file, and the spec's enums.
|
|
21
|
+
*/
|
|
22
|
+
const LEADERBOARD_SORTS = [
|
|
23
|
+
"rank",
|
|
24
|
+
"grade",
|
|
25
|
+
"volume",
|
|
26
|
+
"predictions",
|
|
27
|
+
"pnl",
|
|
28
|
+
"win_rate",
|
|
29
|
+
"edge",
|
|
30
|
+
];
|
|
31
|
+
const LEADERBOARD_DIRS = ["asc", "desc"];
|
|
32
|
+
const LEADERBOARD_ACTIVITIES = ["all", "active", "inactive"];
|
|
27
33
|
export function registerGetLeaderboard(server, client) {
|
|
28
34
|
server.registerTool("get_leaderboard", {
|
|
29
35
|
title: "Get Trader Leaderboard",
|
|
30
|
-
description: `Get the top-ranked prediction market traders (grades S, A, B only).
|
|
36
|
+
description: `Get the top-ranked prediction market traders (grades S, A, B only). By default in the board's own rank order; sort, dir and activity reorder and scope the same wallets as the site's leaderboard does. Supports cursor pagination and optional filters.
|
|
31
37
|
|
|
32
38
|
Args:
|
|
33
39
|
- limit (number, 1-100, default 20): Max results per page
|
|
34
|
-
- cursor (string, optional): Pagination cursor from previous response
|
|
40
|
+
- cursor (string, optional): Pagination cursor from previous response; it is bound to the sort, dir and activity it was read with
|
|
35
41
|
- category (string, optional): Filter by category slug
|
|
36
|
-
- strategy (string, optional):
|
|
42
|
+
- strategy (string, optional): Trading style: two_sided, category_focused, high_activity, diversified, mixed, unclassified
|
|
43
|
+
- sort (string, optional): rank (default), grade, volume (sports and esports USD volume), predictions, pnl, win_rate (wallets with at least 5 decided markets), edge (price_edge.edge, wallets whose edge ranks); a missing value sorts lowest
|
|
44
|
+
- dir (string, optional): asc or desc; omitted, rank 1 first for rank and largest first for the rest
|
|
45
|
+
- activity (string, optional): all (default), active (last trade 30 days ago or less) or inactive
|
|
37
46
|
|
|
38
|
-
Returns: Ranked list of traders with grade, score, P&L,
|
|
47
|
+
Returns: Ranked list of traders with grade, score, sports and esports P&L, markets, win rate, edge over the price paid, and strategy.`,
|
|
39
48
|
inputSchema: z.object({
|
|
40
49
|
limit: z.number().int().min(1).max(100).default(20)
|
|
41
50
|
.describe("Max results (1-100, default 20)"),
|
|
@@ -45,6 +54,12 @@ Returns: Ranked list of traders with grade, score, P&L, volume, win rate, and st
|
|
|
45
54
|
.describe("Filter by category slug"),
|
|
46
55
|
strategy: z.enum(LEADERBOARD_STRATEGIES).optional()
|
|
47
56
|
.describe("Filter by strategy type"),
|
|
57
|
+
sort: z.enum(LEADERBOARD_SORTS).optional()
|
|
58
|
+
.describe("Order: rank (default, the board's own order), grade, volume (sports and esports USD volume), predictions, pnl, win_rate (wallets with at least 5 decided markets) or edge (price_edge.edge, wallets whose edge ranks). A missing value sorts lowest"),
|
|
59
|
+
dir: z.enum(LEADERBOARD_DIRS).optional()
|
|
60
|
+
.describe("asc or desc. Omitted: rank 1 first for rank, largest first for the rest"),
|
|
61
|
+
activity: z.enum(LEADERBOARD_ACTIVITIES).optional()
|
|
62
|
+
.describe("all (default), active (last trade 30 days ago or less) or inactive"),
|
|
48
63
|
}),
|
|
49
64
|
annotations: {
|
|
50
65
|
readOnlyHint: true,
|
|
@@ -52,13 +67,16 @@ Returns: Ranked list of traders with grade, score, P&L, volume, win rate, and st
|
|
|
52
67
|
idempotentHint: true,
|
|
53
68
|
openWorldHint: false,
|
|
54
69
|
},
|
|
55
|
-
}, async ({ limit, cursor, category, strategy }, ctx) => {
|
|
70
|
+
}, async ({ limit, cursor, category, strategy, sort, dir, activity }, ctx) => {
|
|
56
71
|
try {
|
|
57
72
|
const response = await client.request("/api/v1/leaderboard", {
|
|
58
73
|
limit,
|
|
59
74
|
cursor,
|
|
60
75
|
category,
|
|
61
76
|
strategy,
|
|
77
|
+
sort,
|
|
78
|
+
dir,
|
|
79
|
+
activity,
|
|
62
80
|
}, undefined, { signal: ctx.mcpReq.signal });
|
|
63
81
|
const result = listResult(response);
|
|
64
82
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-leaderboard.js","sourceRoot":"","sources":["../../src/tools/get-leaderboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"get-leaderboard.js","sourceRoot":"","sources":["../../src/tools/get-leaderboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,7 @@ Args:
|
|
|
37
37
|
- timeframe (string, optional): Lookback window: "1h", "4h", "24h", "7d" (default "24h")
|
|
38
38
|
|
|
39
39
|
Returns: Market info, the flow under sharp_money (net_flow_usd, direction YES/NO, large_trade_count, volumes) with smart_money as its deprecated byte-identical alias, and the top 5 graded trader positions.`;
|
|
40
|
-
const MARKET_INTEL_DESCRIPTION = `Deprecated alias of get_market_flow (#16312), kept live; it calls the deprecated /api/v1/market/{condition_id}/intel path, whose envelope keeps object: market_intel. Sharp money flow analysis for a specific prediction market. Shows net flow direction, whale trade count, buy/sell volumes, and top graded trader positions.
|
|
40
|
+
const MARKET_INTEL_DESCRIPTION = `Deprecated alias of get_market_flow (#16312), kept live until its 2027-02-01 sunset (#29351), then removed; it calls the deprecated /api/v1/market/{condition_id}/intel path, whose envelope keeps object: market_intel. Sharp money flow analysis for a specific prediction market. Shows net flow direction, whale trade count, buy/sell volumes, and top graded trader positions.
|
|
41
41
|
|
|
42
42
|
Use search_markets first to find the condition_id for a market.
|
|
43
43
|
|
|
@@ -6,16 +6,16 @@ export const PNL_SECTIONS = ["entries", "stats", "monthly", "year_totals", "draw
|
|
|
6
6
|
export function registerGetTraderPnl(server, client) {
|
|
7
7
|
server.registerTool("get_trader_pnl", {
|
|
8
8
|
title: "Get Trader P&L Time Series",
|
|
9
|
-
description: `Get a trader's daily P&L time series and pre-derived stats
|
|
9
|
+
description: `Get a trader's sports and esports daily P&L time series and pre-derived stats. Returns entries (daily realized P&L and its running sum), period stats (all/90d/30d/7d), monthly aggregation, per-year totals, the drawdown series, series_status, and realized: how the days add up to the wallet's Sports P&L.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
A day's daily_change is the realized P&L of the wallet's sports and esports markets dated to that UTC day (the resolution day, else the last trade day), so the days plus realized.undated_pnl equal realized.realized_pnl, the Sports P&L on the trader object. series_status pending means the series is not computed yet: entries are empty and never mean zero. A resolved trader with no sports or esports day returns an empty structured object (HTTP 200); an unknown address returns not found.
|
|
12
12
|
|
|
13
13
|
Args:
|
|
14
14
|
- address (string, required): Wallet address (0x...), username, or trd_-prefixed trader id
|
|
15
15
|
- from / to (string, optional): Inclusive UTC calendar dates (YYYY-MM-DD) bounding the daily series (entries and drawdown); stats, monthly and year_totals stay defined over the full history
|
|
16
16
|
- sections (string[], optional): Which sections to return: "entries", "stats", "monthly", "year_totals", "drawdown"; omit for all five. A section left out is absent, and an unrecognized name is an error, never ignored
|
|
17
17
|
|
|
18
|
-
Returns: Structured trader P&L object (entries, stats, monthly, year_totals, drawdown). A request that sent from, to or sections also carries view: the bounds applied, the sections present, entries_total, entries_in_window and the pre-window anchor.`,
|
|
18
|
+
Returns: Structured trader P&L object (entries, stats, monthly, year_totals, drawdown, freshness_at, series_status, realized). A request that sent from, to or sections also carries view: the bounds applied, the sections present, entries_total, entries_in_window and the pre-window anchor.`,
|
|
19
19
|
inputSchema: z.object({
|
|
20
20
|
address: traderPnlLookupSchema
|
|
21
21
|
.describe("Wallet address (0x...), username, or trd_-prefixed trader id"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-trader-pnl.js","sourceRoot":"","sources":["../../src/tools/get-trader-pnl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEvE,iGAAiG;AACjG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,CAAU,CAAC;AAEhG,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAiB;IACvE,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"get-trader-pnl.js","sourceRoot":"","sources":["../../src/tools/get-trader-pnl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEvE,iGAAiG;AACjG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,CAAU,CAAC;AAEhG,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAiB;IACvE,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE;;;;;;;;;iSAS8Q;QAC3R,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,qBAAqB;iBAC3B,QAAQ,CAAC,8DAA8D,CAAC;YAC3E,mEAAmE;YACnE,mEAAmE;YACnE,+DAA+D;YAC/D,wCAAwC;YACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;iBACrD,QAAQ,CAAC,oLAAoL,CAAC;YACjM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;iBACnD,QAAQ,CAAC,8JAA8J,CAAC;YAC3K,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;iBAC/C,QAAQ,CAAC,8HAA8H,CAAC;SAC5I,CAAC;QACF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,oEAAoE;YACpE,8DAA8D;YAC9D,MAAM,cAAc,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACpD,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE;gBAC7B,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,kBAAkB,kBAAkB,CAAC,YAAY,CAAC,MAAM,EACxD,EAAE,IAAI,EAAE,EAAE,EAAE,EACZ,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAC9C,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC5G,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/get-trader.js
CHANGED
|
@@ -4,19 +4,19 @@ export const traderLookupSchema = z.string().trim().min(1).max(100);
|
|
|
4
4
|
export function registerGetTrader(server, client) {
|
|
5
5
|
server.registerTool("get_trader", {
|
|
6
6
|
title: "Get trader",
|
|
7
|
-
description: `Look up a prediction market trader by wallet address or username. Returns grade (S through F)
|
|
7
|
+
description: `Look up a prediction market trader by wallet address or username. Returns grade (S through F) and the sports and esports record: realized P&L (pnl.in_scope), markets traded, win rate, and volume. Wallet figures cover sports and esports markets only.
|
|
8
8
|
|
|
9
9
|
Optional expand fields for heavier data:
|
|
10
10
|
- strategy: Trading strategy classification
|
|
11
11
|
- categories: Per-category performance breakdown
|
|
12
|
-
- quant_metrics:
|
|
12
|
+
- quant_metrics: retired since 2026-10-27; accepted and never returned, because its metrics covered every market of the wallet. Read pnl.in_scope or get_trader_pnl for the sports and esports record
|
|
13
13
|
- trust: Per-field provenance (source, freshness, reconciliation, completeness) for grade, P&L, and stats
|
|
14
14
|
|
|
15
15
|
A wallet address with no trader yet returns sync_status "unknown" (not an error). A username or trader id that matches no trader is a not_found error.
|
|
16
16
|
|
|
17
17
|
Args:
|
|
18
18
|
- address (string, required): Ethereum wallet address (0x...) or trader username
|
|
19
|
-
- expand (string[], optional): Heavy fields to include: "strategy", "categories", "
|
|
19
|
+
- expand (string[], optional): Heavy fields to include: "strategy", "categories", "trust" ("quant_metrics" is accepted and returns nothing)
|
|
20
20
|
- max_age_s (integer, optional, 0 or more): Freshness ceiling in seconds. The call answers only when data_quality.status is fresh and data_quality.as_of is no older than this; otherwise it fails with reason freshness_ceiling_unsatisfied (HTTP 409). Nothing is refreshed to meet it
|
|
21
21
|
|
|
22
22
|
Returns: Trader profile with grade, P&L, stats, and optional expanded fields. The trader carries data_quality: status, as_of (the oldest clock the body rests on) and field_groups. fresh means tracked and clocked, not current: compare as_of with your own tolerance. unknown means this read cannot date that group, never that it is recent.`,
|
|
@@ -18,7 +18,7 @@ export function buildTrendingWalletsParams(args) {
|
|
|
18
18
|
export function registerGetTrendingWallets(server, client) {
|
|
19
19
|
server.registerTool("get_trending_wallets", {
|
|
20
20
|
title: "List Trending Wallets",
|
|
21
|
-
description: `List wallets ranked by trailing-window realized P&L (Polymarket-only discovery). Each row carries the window P&L, volume, distinct markets, grade, hot-streak tier, and
|
|
21
|
+
description: `List wallets ranked by trailing-window realized P&L (Polymarket-only discovery). Each row carries the window P&L, volume, distinct markets, grade, hot-streak tier, and its sports and esports realized P&L by day (one point per UTC day of the window, dates ascending, 0 on a day with none; empty while daily_pnl_series_status is pending, which never means zero; it does not sum to the window P&L, which counts every market). Cursor-paginated by window P&L descending.
|
|
22
22
|
|
|
23
23
|
A cold read model returns a 503 retry-after (warming), never a 500 or fabricated ranking.
|
|
24
24
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-whale-trades.d.ts","sourceRoot":"","sources":["../../src/tools/get-whale-trades.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"get-whale-trades.d.ts","sourceRoot":"","sources":["../../src/tools/get-whale-trades.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwGzC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAOjF;AAED,wDAAwD;AACxD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAOjF"}
|
|
@@ -23,6 +23,10 @@ function registerTradeList(server, client, tool) {
|
|
|
23
23
|
.describe("Order of the page. recent is newest first. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, a trade whose share is unavailable last, over the last 30 days. A cursor is bound to the order it was minted in"),
|
|
24
24
|
since: z.string().optional()
|
|
25
25
|
.describe("wt_ id of a trade a previous call returned: answer only the trades recorded after it, in commit order, so a trade recorded late still arrives and none is skipped. Poll with the first trade of the last answer that had trades and deduplicate on id. Recent order only"),
|
|
26
|
+
condition_id: z.string().min(1).optional()
|
|
27
|
+
.describe("One market's large trades: its exact raw provider condition_id. Not with event_slug or since"),
|
|
28
|
+
event_slug: z.string().min(1).optional()
|
|
29
|
+
.describe("Every market of one game (moneyline, spreads, totals and props), the markets get_game_trades reads; for example nba-bos-orl-2026-11-01. An unknown slug is not_found. Recent order only; not with condition_id or since"),
|
|
26
30
|
}),
|
|
27
31
|
annotations: {
|
|
28
32
|
readOnlyHint: true,
|
|
@@ -30,7 +34,7 @@ function registerTradeList(server, client, tool) {
|
|
|
30
34
|
idempotentHint: true,
|
|
31
35
|
openWorldHint: false,
|
|
32
36
|
},
|
|
33
|
-
}, async ({ limit, cursor, min_size, category, min_grade, suspicious_only, min_market_volume_share, sort, since }, ctx) => {
|
|
37
|
+
}, async ({ limit, cursor, min_size, category, min_grade, suspicious_only, min_market_volume_share, sort, since, condition_id, event_slug }, ctx) => {
|
|
34
38
|
try {
|
|
35
39
|
const response = await client.request(tool.path, {
|
|
36
40
|
limit,
|
|
@@ -42,6 +46,8 @@ function registerTradeList(server, client, tool) {
|
|
|
42
46
|
min_market_volume_share,
|
|
43
47
|
sort,
|
|
44
48
|
since,
|
|
49
|
+
condition_id,
|
|
50
|
+
event_slug,
|
|
45
51
|
}, undefined, { signal: ctx.mcpReq.signal });
|
|
46
52
|
const result = listResult(response);
|
|
47
53
|
return ok(result);
|
|
@@ -63,9 +69,11 @@ Args:
|
|
|
63
69
|
- min_market_volume_share (number, 0-1, optional): Keep only trades whose market_volume_share is known and at least this; a fraction, so 0.01 is one percent of the market's traded volume
|
|
64
70
|
- sort (string, optional): "recent" (default, newest first) or "market_volume_share" (biggest share of its market first, over the last 30 days, or from the from bound on the history tools; a cursor is bound to the order it was minted in)
|
|
65
71
|
- since (string, optional): wt_ id of a trade a previous call returned; answers only the trades recorded after it, in commit order, so a trade recorded late still arrives. Poll with the first trade of the last answer that had trades and deduplicate on id; recent order only
|
|
72
|
+
- condition_id (string, optional): One market's large trades, by exact raw provider condition_id; not with event_slug or since
|
|
73
|
+
- event_slug (string, optional): Every market of one game (moneyline, spreads, totals and props), the markets get_game_trades reads; recent order only, not with condition_id or since; an unknown slug is not_found
|
|
66
74
|
|
|
67
|
-
Returns: List of large trades with trader info, market context, size, side, price, current review_score (signal_score is its deprecated twin, same value) and trader grade, point-in-time recorded_review_score (recorded_signal_score is its deprecated twin; null before 2026-08-03) and trader grade_at_trade with grade_at_trade_status (unknown before 2026-09-19), optional suspicion_score, and optional suspicion_track. A null suspicion track means the persisted legacy row has no track label. The page carries data_quality beside data: status, as_of (the oldest clock the page rests on) and field_groups. fresh means tracked and clocked, not current: compare as_of with your own tolerance. unknown means this read cannot date that group, never that it is recent.`;
|
|
68
|
-
const WHALE_TRADES_DESCRIPTION = `Deprecated alias of get_large_trades (#16304), kept live; it calls the deprecated /api/v1/whale-trades path. Get recent large trades from graded prediction market traders. Each trade includes a 0-1 review score, persisted suspicion facts, trader grade, and market context. Cursor-paginated, newest first.
|
|
75
|
+
Returns: List of large trades with trader info, market context, size, side, price, current review_score (signal_score is its deprecated twin, same value, until its 2027-02-01 sunset) and trader grade, point-in-time recorded_review_score (recorded_signal_score is its deprecated twin until its 2027-02-01 sunset; null before 2026-08-03) and trader grade_at_trade with grade_at_trade_status (unknown before 2026-09-19), optional suspicion_score, and optional suspicion_track. A null suspicion track means the persisted legacy row has no track label. The page carries data_quality beside data: status, as_of (the oldest clock the page rests on) and field_groups. fresh means tracked and clocked, not current: compare as_of with your own tolerance. unknown means this read cannot date that group, never that it is recent.`;
|
|
76
|
+
const WHALE_TRADES_DESCRIPTION = `Deprecated alias of get_large_trades (#16304), kept live until its 2027-02-01 sunset (#29351), then removed; it calls the deprecated /api/v1/whale-trades path. Get recent large trades from graded prediction market traders. Each trade includes a 0-1 review score, persisted suspicion facts, trader grade, and market context. Cursor-paginated, newest first.
|
|
69
77
|
|
|
70
78
|
Args:
|
|
71
79
|
- limit (number, 1-100, default 20): Max results per page
|
|
@@ -77,8 +85,10 @@ Args:
|
|
|
77
85
|
- min_market_volume_share (number, 0-1, optional): Keep only trades whose market_volume_share is known and at least this; a fraction, so 0.01 is one percent of the market's traded volume
|
|
78
86
|
- sort (string, optional): "recent" (default, newest first) or "market_volume_share" (biggest share of its market first, over the last 30 days, or from the from bound on the history tools; a cursor is bound to the order it was minted in)
|
|
79
87
|
- since (string, optional): wt_ id of a trade a previous call returned; answers only the trades recorded after it, in commit order, so a trade recorded late still arrives. Poll with the first trade of the last answer that had trades and deduplicate on id; recent order only
|
|
88
|
+
- condition_id (string, optional): One market's large trades, by exact raw provider condition_id; not with event_slug or since
|
|
89
|
+
- event_slug (string, optional): Every market of one game (moneyline, spreads, totals and props), the markets get_game_trades reads; recent order only, not with condition_id or since; an unknown slug is not_found
|
|
80
90
|
|
|
81
|
-
Returns: List of whale trades with trader info, market context, size, side, price, current review_score (signal_score is its deprecated twin, same value) and trader grade, point-in-time recorded_review_score (recorded_signal_score is its deprecated twin; null before 2026-08-03) and trader grade_at_trade with grade_at_trade_status (unknown before 2026-09-19), optional suspicion_score, and optional suspicion_track. A null suspicion track means the persisted legacy row has no track label. The page carries data_quality beside data: status, as_of (the oldest clock the page rests on) and field_groups. fresh means tracked and clocked, not current: compare as_of with your own tolerance. unknown means this read cannot date that group, never that it is recent.`;
|
|
91
|
+
Returns: List of whale trades with trader info, market context, size, side, price, current review_score (signal_score is its deprecated twin, same value, until its 2027-02-01 sunset) and trader grade, point-in-time recorded_review_score (recorded_signal_score is its deprecated twin until its 2027-02-01 sunset; null before 2026-08-03) and trader grade_at_trade with grade_at_trade_status (unknown before 2026-09-19), optional suspicion_score, and optional suspicion_track. A null suspicion track means the persisted legacy row has no track label. The page carries data_quality beside data: status, as_of (the oldest clock the page rests on) and field_groups. fresh means tracked and clocked, not current: compare as_of with your own tolerance. unknown means this read cannot date that group, never that it is recent.`;
|
|
82
92
|
export function registerGetLargeTrades(server, client) {
|
|
83
93
|
registerTradeList(server, client, {
|
|
84
94
|
name: "get_large_trades",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-whale-trades.js","sourceRoot":"","sources":["../../src/tools/get-whale-trades.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEnD,SAAS,iBAAiB,CACxB,MAAiB,EACjB,MAAiB,EACjB,IAAwE;IAExE,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;iBAChD,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;iBAC1B,QAAQ,CAAC,0CAA0C,CAAC;YACvD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;iBACtC,QAAQ,CAAC,0CAA0C,CAAC;YACvD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;iBAC5B,QAAQ,CAAC,8CAA8C,CAAC;YAC3D,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACzD,QAAQ,CAAC,sBAAsB,CAAC;YACnC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;iBACxC,QAAQ,CAAC,qDAAqD,CAAC;YAClE,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACzD,QAAQ,CAAC,+NAA+N,CAAC;YAC5O,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;iBAC9D,QAAQ,CAAC,0PAA0P,CAAC;YACvQ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;iBACzB,QAAQ,CAAC,0QAA0Q,CAAC;
|
|
1
|
+
{"version":3,"file":"get-whale-trades.js","sourceRoot":"","sources":["../../src/tools/get-whale-trades.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
2
2
|
import { ApiClient } from "../client.js";
|
|
3
3
|
export declare function registerGetMarketHolders(server: McpServer, client: ApiClient): void;
|
|
4
|
+
export declare function registerGetMarketTopHolders(server: McpServer, client: ApiClient): void;
|
|
4
5
|
export declare function registerGetMarketCandles(server: McpServer, client: ApiClient): void;
|
|
6
|
+
export declare function registerGetMarketWalletsInOut(server: McpServer, client: ApiClient): void;
|
|
5
7
|
//# sourceMappingURL=market-reads.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-reads.d.ts","sourceRoot":"","sources":["../../src/tools/market-reads.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBzC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAmDnF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAoCnF"}
|
|
1
|
+
{"version":3,"file":"market-reads.d.ts","sourceRoot":"","sources":["../../src/tools/market-reads.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBzC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAmDnF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CA8BtF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAoCnF;AAID,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CA8BxF"}
|