@0xinsider/mcp 3.19.0 → 3.21.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 CHANGED
@@ -55,6 +55,25 @@ received, followed by the hex-decoded nonce, with SHA-256 and compare the result
55
55
  `commitment_hash`. `0xinsider pick ledger` prints every published commitment in one
56
56
  document. Both reads are public and need no login or key.
57
57
 
58
+ ## Upgrade to 3.21.0
59
+
60
+ Version 3.21 describes a pick read by id alone. The `get_pick_of_the_day` tool's
61
+ `pick_id` now reads one pick of any day without `date`, so the tool says so: a pick id
62
+ from an earlier day returns that pick under the same plan rules as sending its
63
+ `pick_date` as `date`. `pick today --query pick_id=<id>` in the CLI gets the same answer
64
+ from the API, on any version. A `date` that is not the pick's own day still returns
65
+ `not_found` with param `pick_id`. Every other field, command, exit code and tool is
66
+ unchanged.
67
+
68
+ ## Upgrade to 3.20.0
69
+
70
+ Version 3.20 adds the record at the ask. `pick stats` and the `get_pick_of_the_day_stats`
71
+ tool now return `ask_comparison`: the settled picks that recorded the best ask at
72
+ publication (since 2026-10-17), valued at the midpoint the record uses and at that ask,
73
+ each with units and ROI, before fees. It is in the default summary, and `sections`
74
+ accepts `ask_comparison`. The record itself stays at the midpoint. Every other field,
75
+ command, exit code and tool is unchanged.
76
+
58
77
  ## Upgrade to 3.19.0
59
78
 
60
79
  Version 3.19 treats wallet names the way the remote MCP server does. Tool results and
@@ -1,7 +1,7 @@
1
1
  export declare const API_BASE_URL = "https://api.0xinsider.com";
2
2
  export declare const SITE_URL = "https://0xinsider.com";
3
3
  export declare const DEVELOPERS_URL = "https://0xinsider.com/developers";
4
- export declare const VERSION = "3.19.0";
4
+ export declare const VERSION = "3.21.0";
5
5
  export declare const PACKAGE_NAME = "@0xinsider/mcp";
6
6
  export declare const SERVER_NAME = "0xinsider";
7
7
  export declare const API_KEY_ENV_VAR = "OXINSIDER_API_KEY";
package/dist/constants.js CHANGED
@@ -14,7 +14,7 @@ export const DEVELOPERS_URL = `${SITE_URL}/developers`;
14
14
  // flow runs `cd mcp && npm ci` from a clean checkout, where `web/node_modules` need not
15
15
  // exist.
16
16
  // generated-package-version:start
17
- export const VERSION = "3.19.0";
17
+ export const VERSION = "3.21.0";
18
18
  // generated-package-version:end
19
19
  export const PACKAGE_NAME = "@0xinsider/mcp";
20
20
  export const SERVER_NAME = "0xinsider";
@@ -2814,11 +2814,11 @@ export type PickOfTheDay = {
2814
2814
  outcome?: "pending" | "win" | "loss" | "void";
2815
2815
  /** Pre-formatted SETTLEMENT STATUS for display: "Win" / "Loss" / "Void" / "Pending" -- the outcome enum above as a label. Convenience only; outcome is the source value. NOTE: this is the win/loss STATUS, not the backed side. The backed side is pick_outcome_label ("Belgium (-2.5)") -- a different field answering a different question. */
2816
2816
  outcome_display?: string;
2817
- /** The backed side phrased as a bet: a team for a moneyline (e.g. "Portugal"), the handicap line for a spread (e.g. "Belgium (-2.5)"), or "{team} to advance" for a knockout advancement market (e.g. "Spain to advance"). */
2817
+ /** The backed side as a short label: a team for a moneyline (e.g. "Bengals"), the team and handicap for a spread (e.g. "Seahawks (-14.5)"), the line and side for a total (e.g. "O/U 38.5 (Under)"), or "{team} to advance" for a knockout advancement market (e.g. "Spain to advance"). */
2818
2818
  pick_outcome_label?: string;
2819
2819
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the backed outcome; omitted when unavailable (e.g. unsynced markets). */
2820
2820
  token_id?: string;
2821
- /** The backed side phrased as a bet (e.g. "Portugal to win"). */
2821
+ /** The backed side as the pick's headline reads it (e.g. "Bengals to win", "Seahawks (-14.5)", "O/U 38.5 (Under)"). */
2822
2822
  position?: string;
2823
2823
  /** One-line summary of which side sharp money is backing. On a pick dated 2026-08-12 or later it counts the S and A grade wallets the pick lists on the backed side, the sharp_wallet_count value, and names those grades: "26 S and A grade wallets on Alexander Shevchenko", or "1 S or A grade wallet on ...". The list can leave out wallets that hold the side. The site's "profitable wallets" counts the S, A and B grade wallets the pick lists, so its number can be larger for the same pick. A pick whose only recorded backing is its lead wallet reads "Recorded lead wallet on ...". Earlier picks, and a pick recorded without graded holders, keep the sentence recorded with them. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. */
2824
2824
  side_summary?: string;
@@ -2919,7 +2919,7 @@ export type PickOfTheDay = {
2919
2919
  disclaimer?: string;
2920
2920
  /** Entitled published picks whose holder proof is unreadable, ordered by rank. Unauthorized ranks appear only in locked_picks and cannot trigger proof warming. Read retry_at for the next read. */
2921
2921
  proof_pending_picks?: ProofPendingPickSlot[];
2922
- /** Optional full-response entry authorization. Missing or expired authorization cannot authorize an automated entry. */
2922
+ /** Optional full-response entry authorization. The pick's release issues it once, only when a fresh check then finds the pick meets the selection standard in force at release and its current price still allows an entry. A pick released without one never gains one later, so read its absence as no automated entry for this pick, not as pending. Missing or expired authorization cannot authorize an automated entry. */
2923
2923
  entry_authorization?: PotdEntryAuthorization;
2924
2924
  /** Unauthorized unresolved published or scheduled ranks. Contains no game, provider identity, price, or identifying clock. Pro may upgrade to Max to open these ranks. */
2925
2925
  locked_picks?: {
@@ -2939,7 +2939,7 @@ export type PickOfTheDay = {
2939
2939
  * @deprecated
2940
2940
  */
2941
2941
  supersedes_pick_id: string | null;
2942
- /** Optional full-only lead wallet publication facts. Omitted on legacy picks or when the recorded evidence is unavailable. */
2942
+ /** Optional full-only lead wallet publication facts: the profitable wallet whose position and record certified the pick when it was released. Many picks have no certified lead, and a pick released without one never gains one later. Also omitted on legacy picks or when the recorded evidence is unavailable in this response. */
2943
2943
  lead_backer?: PickLeadBacker;
2944
2944
  /** On the top level of today's set read. The instant until which today's list of published picks can still grow: present while another pick can still be added to the day, absent once the day is final. Absent for a past `date`, on `picks` items and on a `pick_id` read. A later pick is possible, not promised; schedule one read before this instant instead of polling. */
2945
2945
  more_picks_until?: string;
@@ -3006,6 +3006,8 @@ export type PickOfTheDay = {
3006
3006
  };
3007
3007
  /** When the pick was published: the recorded instant, the same one the archive returns for it. release_at is the scheduled release. Sent on every pick; absent with the other pick fields on a state=none body. */
3008
3008
  published_at?: string;
3009
+ /** When outcome was LAST written to a settled value (RFC3339 UTC), the same instant the archive and the commitment ledger return for the pick. It moves with a corrected market re-mapping an already-settled pick. Omitted (not null) for a pending pick and for a pick that settled before the instant was recorded, so absence means the instant is unknown, never that the pick is unsettled -- outcome answers that. Additive and optional for mixed-version client compatibility. */
3010
+ resolved_at?: string;
3009
3011
  };
3010
3012
  export type PickOfTheDayArchive = {
3011
3013
  /** Published Pick of the Day selections that have not been withdrawn, newest first by pick_date and then pick_rank within each product day. Withdrawn rows stay excluded after settlement. */
@@ -3849,6 +3851,23 @@ export type PickOfTheDayStats = {
3849
3851
  pick_id: string;
3850
3852
  pick_rank: number;
3851
3853
  }[];
3854
+ ask_comparison: {
3855
+ ask: {
3856
+ roi_display: string | null;
3857
+ roi_pct: number | null;
3858
+ units: number | null;
3859
+ units_display: string | null;
3860
+ };
3861
+ from_date: string | null;
3862
+ from_date_display: string | null;
3863
+ midpoint: {
3864
+ roi_display: string | null;
3865
+ roi_pct: number | null;
3866
+ units: number | null;
3867
+ units_display: string | null;
3868
+ };
3869
+ valued_decided: number;
3870
+ };
3852
3871
  };
3853
3872
  /** The stats with `view=summary` or `sections`: only the named sections, listed in `sections`. `view=summary` names every section except `series`, `days`, `categories`, `months` and `voids`. */
3854
3873
  export type PickOfTheDayStatsSections = {
@@ -4289,6 +4308,23 @@ export type PickOfTheDayStatsSections = {
4289
4308
  pick_id: string;
4290
4309
  pick_rank: number;
4291
4310
  }[];
4311
+ ask_comparison?: {
4312
+ ask: {
4313
+ roi_display: string | null;
4314
+ roi_pct: number | null;
4315
+ units: number | null;
4316
+ units_display: string | null;
4317
+ };
4318
+ from_date: string | null;
4319
+ from_date_display: string | null;
4320
+ midpoint: {
4321
+ roi_display: string | null;
4322
+ roi_pct: number | null;
4323
+ units: number | null;
4324
+ units_display: string | null;
4325
+ };
4326
+ valued_decided: number;
4327
+ };
4292
4328
  };
4293
4329
  /** A settled uncommitted pick's market, side and price. The same eight fields as PickOfTheDayCommitmentPayload, in the same key order, so a settled pick's side and price sit under payload whatever the entry's state. It is NOT a commitment: no hash was taken over it before the game, and it proves nothing about when the pick was made. */
4294
4330
  export type PickOfTheDayUncommittedPayload = {
@@ -4317,9 +4353,9 @@ export type PickSportsContext = {
4317
4353
  competition_label?: string;
4318
4354
  /** League logo URL (provider-owned). */
4319
4355
  league_logo: string | null;
4320
- /** The team mapped to the market's YES outcome, or the parent-event home/first team when event_matchup is true. */
4356
+ /** The team mapped to the market's YES outcome, or the game's first team when event_matchup is true. To lay the two teams out in the game's order, read side_order. */
4321
4357
  yes_team: PickSportsTeam | null;
4322
- /** The team mapped to the market's NO outcome, or the parent-event away/second team when event_matchup is true. */
4358
+ /** The team mapped to the market's NO outcome, or the game's second team when event_matchup is true. */
4323
4359
  no_team: PickSportsTeam | null;
4324
4360
  /** Provider game identifier (Polymarket Gamma gameId); omitted when the provider supplies none. */
4325
4361
  game_id?: number;
@@ -4327,14 +4363,16 @@ export type PickSportsContext = {
4327
4363
  event_matchup: boolean;
4328
4364
  /** Present only alongside event_matchup: the event team the binary leg is about (provider group_item_title matched to a matchup team, e.g. Belgium for "Will Belgium win?"), i.e. the winner on a Yes resolution. Omitted for teamless legs (draw, totals, prop). */
4329
4365
  event_subject_team?: PickSportsTeam;
4330
- /** The two teams as a single whole-game label, joined "<home> – <away>" (en-dash) in provider display order (e.g. "Portugal – Uzbekistan"). Composed server-side from the provider team names (no title/slug parsing). Present when both teams resolve a name; omitted for single-subject, teamless, or non-two-team contexts. */
4366
+ /** Which of yes_team and no_team the game lists first, in Polymarket's order for the event (the order of its title: the away team first in US leagues, the home team first in soccer). yes_first when yes_team is the first team, no_first when no_team is. A spread's Yes side is the favorite, so it is often the game's second team. Lay the teams out in this order to show every pick on one game the same way; yes_team and no_team keep their Yes and No meaning. Omitted when the order is unknown: lay out yes_team first. */
4367
+ side_order?: "yes_first" | "no_first";
4368
+ /** The two teams as a single whole-game label, joined "<first> – <second>" (en-dash) in the game's order, the order side_order names (e.g. "LA Clippers – Phoenix Suns"), so every pick on one game carries the same title. Composed server-side from the provider team names (no title/slug parsing). Present when both teams resolve a name; omitted for single-subject, teamless, or non-two-team contexts. */
4331
4369
  matchup_title?: string;
4332
4370
  };
4333
4371
  /** A single sports team or competitor in a Pick of the Day market's sports context. Identity and score fields are provider-owned and nullable. The structured score fields (`sets`, `format`, `sets_won`) and the tennis fields (`headshot`, `headshot_revision`, `tour`) are backend-owned and are OMITTED rather than null when they do not apply, so a consumer must treat an absent key and a null the same way. */
4334
4372
  export type PickSportsTeam = {
4335
4373
  /** Team display label as it appears on the market outcome (e.g. "Portugal"). */
4336
4374
  label: string | null;
4337
- /** Abbreviated team label (e.g. "POR"). */
4375
+ /** The team's abbreviation in upper case (e.g. "POR"), the same on every market of the game. A competitor Polymarket gives no abbreviation can carry its name here instead. */
4338
4376
  short_label: string | null;
4339
4377
  /** The name to show for this team or competitor, the same on every surface (e.g. "UCF Knights", "Oklahoma City Thunder", "Portugal"). `label` keeps the market outcome's own spelling. */
4340
4378
  full_name: string | null;
@@ -7109,7 +7147,7 @@ export interface OperationQuery {
7109
7147
  date?: string;
7110
7148
  /** full (default) is the whole recorded set: every pick with its thesis, and its holders, lead backer, sports context and entry_authorization when recorded, and the top-level copy of the first pick. summary returns pick_date, pick_count, the disclaimer once, and each entitled pick's identity, side, price, result, return and grade (pick_id, publication_order, is_free_selection, matchup, category, display_category, event_slug, polymarket_url, token_id, pick_outcome_label, outcome, backed_price, stake_usd, return_usd, unit_score, top_grade, holder_count, clv_status, clv_pct, release_at, game_started, game_ended), with the same scheduled_picks, proof_pending_picks, locked_picks and more_picks_until. The locked-only state=none body is the same in both views. Any other value returns 400 bad_request with error.param=view. */
7111
7149
  view?: "full" | "summary";
7112
- /** One entitled published pick of the day, by its stable decimal-string pick_id. The body carries that pick once, as picks[0], beside state, pick_date and pick_count=1. It leaves out the top-level copy of the first pick that a set read without pick_id repeats, and scheduled_picks, proof_pending_picks, locked_picks and more_picks_until. Pair it with date for a past day's pick. A pick_id that is not among the day's entitled published picks returns 404 not_found with error.param=pick_id; one whose holder proof is not readable yet returns 503 read_model_warming with Retry-After; a value that is not a positive canonical decimal returns 400 bad_request with error.param=pick_id. */
7150
+ /** One entitled published pick, by its stable decimal-string pick_id. Without date it reads the pick on its own product day, whatever day published it, under the same tier rule as date with pick_id. The body carries that pick once, as picks[0], beside state, pick_date and pick_count=1. It leaves out the top-level copy of the first pick that a set read without pick_id repeats, and scheduled_picks, proof_pending_picks, locked_picks and more_picks_until. With date, the pick must be one of that day's. A pick_id that is not among the day's entitled published picks (its own day without date, or the date sent) returns 404 not_found with error.param=pick_id, as does one that no served pick has (unknown, skipped or withdrawn); one whose holder proof is not readable yet returns 503 read_model_warming with Retry-After; a value that is not a positive canonical decimal returns 400 bad_request with error.param=pick_id. */
7113
7151
  pick_id?: string;
7114
7152
  };
7115
7153
  getPickOfTheDayArchive: {
@@ -7125,10 +7163,10 @@ export interface OperationQuery {
7125
7163
  getPickOfTheDayStats: {
7126
7164
  /** full (default) is every section. summary returns view, sections and every section except the five that grow with the record: series, days, categories, months and voids. In summary and sections bodies hit_rate carries no series; series is its own top-level section. Ignored when sections is sent. Any other value returns 400 bad_request with error.param=view. */
7127
7165
  view?: "full" | "summary";
7128
- /** Exactly the sections to return, in the body's order whatever the request order. Repeatable and comma-separated: hit_rate, series, market_expectations, outcome_stats, days, categories, sports, tiers, months, price_bands, market_types, total_sides, streaks, records, voids. The body names them in sections and carries view=sections. An unrecognized name returns 400 bad_request with error.param=sections rather than being ignored. */
7129
- sections?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
7166
+ /** Exactly the sections to return, in the body's order whatever the request order. Repeatable and comma-separated: hit_rate, series, market_expectations, outcome_stats, ask_comparison, days, categories, sports, tiers, months, price_bands, market_types, total_sides, streaks, records, voids. The body names them in sections and carries view=sections. An unrecognized name returns 400 bad_request with error.param=sections rather than being ignored. */
7167
+ sections?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "ask_comparison" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
7130
7168
  /** Backward-compatible bracket alias for sections, for clients that emit array keys. Repeatable and comma-separated, with the same names. */
7131
- "sections[]"?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
7169
+ "sections[]"?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "ask_comparison" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
7132
7170
  };
7133
7171
  getPlatforms: Record<string, never>;
7134
7172
  getPositionTimeline: {