Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Oracle3 prediction-market arbitrage checks

PYPI · ORACLE3

Kalshi and Polymarket data, venue fees, no-arbitrage checks and paper execution for AI agents.

Available components

−18 this week 76 Trust /100

Last scanned (1 hour ago)

Scores higher than 73% of PyPI servers

Category Finance and Payments

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs poetry.core.masonry.api at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 9 of 102 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to YichengYang-Ethan/oracle3-prediction-market-agent). View diagnostics → Pass
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 35 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability69
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 2935 tokens (~225/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management77
  • Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 −18
    • Malware scan: pass → unverified ▼ security
    • Stability: pass → 0.77 functional
  • 29 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 28 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Stability: 0.97 → pass security
  • 27 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 24 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 23 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 22 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed pypi/oracle3@1.2.2

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo YichengYang-Ethan/oracle3-prediction-market-agent
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/YichengYang-Ethan/oracle3-prediction-market-agent/.github/workflows/pypi-publish.yml@refs/tags/v1.2.2
Rekor log index 3023931739
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:b55e0c86e395b7bcb419948d89c035a1254402b6c9c67831ecac512cc97de8f8

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted poetry.core.masonry.api

Background: Why install scripts are a supply-chain risk →

Dependencies 102 packages
Packages resolved 102
Stale 8
No linked repository 2
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 13 exposed · ~2,698 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
check_constraint ~284

Check offline whether prices you supply violate a no-arbitrage relation, and price the cheapest exploiting basket after fees. A pure calculation with no network calls: use it for hypothetical or historical prices, and use check_constraint_live to fetch current quotes instead. Returns violated, profitable_after_fees, the best basket (legs, cost, guaranteed payoff, fees, gross and net edge), every candidate basket, any missing quotes, and the assumptions behind the check (full fills at the quoted prices, a correctly specified relation).

NameTypeReqDescription
contractsnumber–Contracts bought on every leg (default 1). Fees scale with size.
makerboolean–Price fees as resting maker orders instead of taker orders (default false). Maker fees are lower or zero, but a resting order may not fill.
quotesarrayyesOne quote per contract, in the order the relation expects: implication (A, B) where A implies B; complement and same_event (A, B); exclusivity and event_sum every outcome.
relationstringyesBound to test: implication (A implies B, so P(A) <= P(B)), exclusivity (at most one outcome happens), complement (exactly one of two), same_event (one event quoted on two venues) or event_sum (exactl…

Structured output declared, but exposes no named fields.

No examples provided.

check_constraint_live ~302

Fetch live quotes and fee schedules for related markets, then check whether their prices violate a no-arbitrage relation after fees. This is the main research call: find related contracts with search_markets, confirm with get_market that their resolution rules really satisfy the relation, then pass them here. Read-only: it calls the venues' public APIs and places no orders. Returns the check_constraint result (violated, profitable_after_fees, best basket with net edge) plus the quotes it used; to simulate the trade, call paper_order for each leg of the best basket.

NameTypeReqDescription
contractsnumber–Contracts bought on every leg (default 1). Fees scale with size.
makerboolean–Price fees as resting maker orders instead of taker orders (default false). Maker fees are lower or zero, but a resting order may not fill.
marketsarrayyesMarkets to check, each {venue, market_id}, in the order the relation expects: two for implication (A then B), complement and same_event; every outcome for exclusivity and event_sum. Venues may be mix…
relationstringyesBound to test: implication (A implies B, so P(A) <= P(B)), exclusivity (at most one outcome happens), complement (exactly one of two), same_event (one event quoted on two venues) or event_sum (exactl…

Structured output declared, but exposes no named fields.

No examples provided.

fair_value ~197

Convert a market price into the probability it implies under the Wang transform, and report the premium. Solves p_mkt = Phi(Phi^-1(p) + lam) for p; a pure calculation with no network calls. Use it to strip the favourite-longshot premium from a quoted price before comparing it with your own forecast. The default lam = 0.183 is the pooled estimate in Yang (2026), SSRN 6468338; it pools real-money and play-money venues, so treat it as illustrative. Returns market_price, lambda, implied_probability and premium (price minus implied probability).

NameTypeReqDescription
lamnumber–Pricing-wedge parameter lambda of the Wang transform. Positive values mean prices sit above the true probability, most of all for longshots. Default 0.183.
market_pricenumberyesObserved YES price in dollars, strictly between 0 and 1.

Structured output declared, but exposes no named fields.

No examples provided.

get_market ~172

Get one market's details: title, best bid and ask, volume and closing date. Kalshi results include the resolution rules (rules_primary, rules_secondary); Polymarket results include the outcomes, token ids, neg-risk flag and the market's fee schedule. Read the rules of every leg here before trusting a relation in check_constraint_live. For prices plus fee terms only, use get_quote; for depth, use get_orderbook. Public data, no API key.

NameTypeReqDescription
market_idstringyesKalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
venuestringyesVenue: 'kalshi' or 'polymarket'.

Structured output declared, but exposes no named fields.

No examples provided.

get_orderbook ~204

Get the displayed order book for YES and NO as [price, size] levels, best first. Prices are dollars per contract and sizes are contracts. Use it to see how much of a basket can fill near the quoted price before paper_order; use get_quote when only the top of book matters. Kalshi publishes bids only, so each side's asks are derived from the other side's bids (a YES ask of p is a NO bid of 1 - p). Public data, no API key.

NameTypeReqDescription
depthinteger–Price levels per side, 1-50 (clamped). Default 10.
market_idstringyesKalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
venuestringyesVenue: 'kalshi' or 'polymarket'.

Structured output declared, but exposes no named fields.

No examples provided.

get_quote ~195

Get the best bid and ask on YES and NO, in dollars, plus the market's fee schedule. Use it to collect prices for check_constraint, or to read the fee terms (Kalshi multiplier and maker fees, Polymarket taker rate) that trading_fee takes. check_constraint_live fetches quotes itself, so this is not needed before calling it. A missing ask is derived from the opposite side's bid. Returns {venue, market_id, title, yes_bid, yes_ask, no_bid, no_ask, fee_schedule}. Public data, no API key.

NameTypeReqDescription
market_idstringyesKalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
venuestringyesVenue: 'kalshi' or 'polymarket'.

Structured output declared, but exposes no named fields.

No examples provided.

list_relation_types ~92

List the relation types the constraint checks support and the probability bound each enforces. Static reference data with no network or file access, for example implication: P(A) <= P(B). Use it to choose the relation argument of check_constraint or check_constraint_live; to see concrete market pairs saved on this machine, use list_relations instead. Returns {relations: {name: bound}}.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

list_relations ~200

List the market relations saved on this machine by the oracle3 research CLI, optionally filtered. Reads ~/.oracle3/relations.json with no network calls. Use it to reuse pairs already discovered or validated offline, then pass a pair to check_constraint_live. For the abstract relation kinds and their bounds, call list_relation_types instead. Returns the store path, a count and the matching relations (markets, type, status and validation details); the list is empty if the CLI has saved none.

NameTypeReqDescription
market_idstring–Only relations that include this market id (Kalshi ticker or Polymarket id). Empty returns all.
spread_typestring–Only this relation type: same_event, cross_platform, implication, exclusivity, conditional, structural, cointegration or complement. Empty returns all.
statusstring–Only this lifecycle status: discovered, validated, deployed, retired or invalidated. Empty returns all.

Structured output declared, but exposes no named fields.

No examples provided.

paper_order ~286

Simulate buying YES or NO contracts in the local paper ledger, filling against the live order book with venue fees. Never sends an order to a venue. Walks the displayed asks from the best price up to limit_price and charges the venue fee on each level. Use it to test the legs of a basket found by check_constraint_live. Writes ~/.oracle3/mcp_paper_ledger.json (or the path in ORACLE3_MCP_LEDGER); only buys are supported and positions are held at cost. Returns status (filled, partially_filled, unfilled, or rejected when paper cash is short), requested and filled contracts, average price, cost, fees and the per-level fills.

NameTypeReqDescription
contractsnumberyesContracts to buy; must be positive.
limit_pricenumberyesHighest price per contract to pay, in dollars, strictly between 0 and 1; ask levels above it are skipped.
market_idstringyesKalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
sidestringyesSide of the binary contract to buy: 'yes' or 'no'.
venuestringyesVenue: 'kalshi' or 'polymarket'.

Structured output declared, but exposes no named fields.

No examples provided.

paper_portfolio ~105

Show the local paper ledger: cash, open positions and the number of fills. Reads ~/.oracle3/mcp_paper_ledger.json (or ORACLE3_MCP_LEDGER) with no network calls. Use it after paper_order to confirm fills and remaining cash. Starting cash is $10,000; positions are carried at cost, and the ledger does not mark to market or track resolution. Returns the ledger path, initial_cash, cash, positions and fills.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

paper_reset ~87

Erase the local paper ledger and restore the $10,000 starting cash. Deletes all paper positions and fill history; no venue is contacted and real accounts are never touched. Without confirm=true it returns status not_reset and changes nothing. Use it to start a fresh paper-trading session.

NameTypeReqDescription
confirmboolean–Must be true to erase the ledger; otherwise nothing changes.

Structured output declared, but exposes no named fields.

No examples provided.

search_markets ~238

Search open Kalshi or Polymarket markets and return candidates with their best prices. Start here to find market ids, then call get_quote or get_orderbook for live prices, or get_market for resolution details. Reads the venues' public APIs, so no account or API key is needed; Kalshi keyword search scans up to 1,000 open events. Returns {venue, query, count, markets}; each market has market_id, title, best bid and ask in dollars, volume and closing date.

NameTypeReqDescription
limitinteger–Maximum markets to return, 1-100 (clamped). Default 20.
querystring–Case-insensitive keywords matched against event titles, market titles and (on Kalshi) tickers. Empty lists open markets without a keyword filter.
series_tickerstring–Kalshi only: list the open markets of this series (e.g. KXFEDDECISION) instead of searching by keyword; query is then ignored. Ignored on Polymarket.
venuestringyesVenue: 'kalshi' or 'polymarket'.

Structured output declared, but exposes no named fields.

No examples provided.

trading_fee ~336

Compute the venue fee for one fill at a given price and size; a pure calculation with no network calls. Kalshi charges round_up(0.07 x M x C x P x (1 - P)) on taker fills, and 0.0175 x M x C x P x (1 - P) on maker fills where the series has maker fees; Polymarket charges takers rate x C x p x (1 - p) and makers nothing. Use it to price a single leg or a hypothetical fill; take a live market's fee terms from get_quote, and use check_constraint to price a whole basket. Returns fee, fee_per_contract, order_type and the schedule used.

NameTypeReqDescription
contractsnumberyesContracts in the fill; must be positive.
kalshi_maker_feesboolean–Whether the Kalshi series charges maker fees, from get_quote (default false). Ignored for Polymarket.
kalshi_multipliernumber–Kalshi series fee multiplier M, from get_quote's fee_schedule (default 1). Ignored for Polymarket.
makerboolean–Price a resting maker order instead of a taker order (default false).
polymarket_rate––Polymarket taker fee rate for the market, from get_quote. Defaults to 0.07, the highest documented rate. Ignored for Kalshi.
pricenumberyesFill price in dollars per contract, strictly between 0 and 1.
venuestringyesVenue: 'kalshi' or 'polymarket'.

Structured output declared, but exposes no named fields.

No examples provided.

Install

How do I install the Oracle3 prediction-market arbitrage checks MCP server?

Oracle3 prediction-market arbitrage checks runs locally as a PyPI package, launched with uvx oracle3. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · oracle3

# add to Claude Code
claude mcp add yichengyang-ethan-oracle3 -- uvx oracle3
Common questions

What is the Oracle3 prediction-market arbitrage checks MCP server?

Oracle3 prediction-market arbitrage checks is an MCP server listed in the public MCP registry as io.github.YichengYang-Ethan/oracle3. Kalshi and Polymarket data, venue fees, no-arbitrage checks and paper execution for AI agents. This page covers its PyPI package (oracle3).

Is the Oracle3 prediction-market arbitrage checks MCP server safe to use?

Oracle3 prediction-market arbitrage checks scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Oracle3 prediction-market arbitrage checks MCP server expose?

Oracle3 prediction-market arbitrage checks exposes 13 tools: search_markets, get_market, get_orderbook, get_quote, trading_fee, and 8 more. Their descriptions and schemas cost roughly 2,698 tokens of context every time the server is loaded.

Is the Oracle3 prediction-market arbitrage checks MCP server still maintained?

Oracle3 prediction-market arbitrage checks is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Oracle3 prediction-market arbitrage checks MCP server under?

Oracle3 prediction-market arbitrage checks declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.