# Oracle3 prediction-market arbitrage checks (pypi · oracle3)

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

- Trust score: 76/100 (medium)
- Change this week: −18
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- pypi · `oracle3`: 76/100 (this document), [markdown](https://verifymcp.io/servers/yichengyang-ethan-oracle3/oracle3.md), [page](https://verifymcp.io/servers/yichengyang-ethan-oracle3/oracle3)

## Channel facts

- Registry: `pypi`
- Package: `oracle3`
- Version: `1.2.2`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs poetry.core.masonry.api at install time, a recognised build step with no custom scripting around it.
  - 9 of 102 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to YichengYang-Ethan/oracle3-prediction-market-agent).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 35 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 69/100
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 77/100
  - Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## 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.

### Claude

```bash
claude mcp add yichengyang-ethan-oracle3 -- uvx oracle3
```

### Cursor

```json
{
  "mcpServers": {
    "yichengyang-ethan-oracle3": {
      "command": "uvx",
      "args": [
        "oracle3"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "yichengyang-ethan-oracle3": {
      "command": "uvx",
      "args": [
        "oracle3"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add yichengyang-ethan-oracle3 -- uvx oracle3
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "yichengyang-ethan-oracle3": {
      "type": "local",
      "command": [
        "uvx",
        "oracle3"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add yichengyang-ethan-oracle3 --command uvx --arg oracle3
```

### Hermes

```yaml
mcp_servers:
  yichengyang-ethan-oracle3:
    command: "uvx"
    args: ["oracle3"]
```

### Netclaw

```json
{
  "McpServers": {
    "yichengyang-ethan-oracle3": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "oracle3"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add yichengyang-ethan-oracle3 -t stdio -c uvx -a oracle3
```

### Other

```json
{
  "mcpServers": {
    "yichengyang-ethan-oracle3": {
      "command": "uvx",
      "args": [
        "oracle3"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 76, −18)

- [security regression] Malware scan: pass → unverified
- [functional] Stability: pass → 0.77

### 2026-10-29 (score 94, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-28 (score 79, −15)

- [security regression] Malware scan: pass → unverified
- [security] Stability: 0.97 → pass

### 2026-10-27 (score 94, +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.

### 2026-10-25 (score 93, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-24 (score 78, +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.

### 2026-10-23 (score 77, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-22 (score 92, +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.

## MCP tools (13)

### `search_markets` (~238 tokens)

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.

Input parameters:

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

### `get_market` (~172 tokens)

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.

Input parameters:

- `market_id` (string, required): Kalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
- `venue` (string, required): Venue: 'kalshi' or 'polymarket'.

### `get_orderbook` (~204 tokens)

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.

Input parameters:

- `depth` (integer): Price levels per side, 1-50 (clamped). Default 10.
- `market_id` (string, required): Kalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
- `venue` (string, required): Venue: 'kalshi' or 'polymarket'.

### `get_quote` (~195 tokens)

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.

Input parameters:

- `market_id` (string, required): Kalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
- `venue` (string, required): Venue: 'kalshi' or 'polymarket'.

### `trading_fee` (~336 tokens)

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.

Input parameters:

- `contracts` (number, required): Contracts in the fill; must be positive.
- `kalshi_maker_fees` (boolean): Whether the Kalshi series charges maker fees, from get_quote (default false). Ignored for Polymarket.
- `kalshi_multiplier` (number): Kalshi series fee multiplier M, from get_quote's fee_schedule (default 1). Ignored for Polymarket.
- `maker` (boolean): 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.
- `price` (number, required): Fill price in dollars per contract, strictly between 0 and 1.
- `venue` (string, required): Venue: 'kalshi' or 'polymarket'.

### `check_constraint` (~284 tokens)

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).

Input parameters:

- `contracts` (number): Contracts bought on every leg (default 1). Fees scale with size.
- `maker` (boolean): 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.
- `quotes` (array, required): One 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.
- `relation` (string, required): Bound 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…

### `check_constraint_live` (~302 tokens)

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.

Input parameters:

- `contracts` (number): Contracts bought on every leg (default 1). Fees scale with size.
- `maker` (boolean): 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.
- `markets` (array, required): Markets 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…
- `relation` (string, required): Bound 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…

### `list_relation_types` (~92 tokens)

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}}.

### `fair_value` (~197 tokens)

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).

Input parameters:

- `lam` (number): 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_price` (number, required): Observed YES price in dollars, strictly between 0 and 1.

### `list_relations` (~200 tokens)

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.

Input parameters:

- `market_id` (string): Only relations that include this market id (Kalshi ticker or Polymarket id). Empty returns all.
- `spread_type` (string): Only this relation type: same_event, cross_platform, implication, exclusivity, conditional, structural, cointegration or complement. Empty returns all.
- `status` (string): Only this lifecycle status: discovered, validated, deployed, retired or invalidated. Empty returns all.

### `paper_order` (~286 tokens)

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.

Input parameters:

- `contracts` (number, required): Contracts to buy; must be positive.
- `limit_price` (number, required): Highest price per contract to pay, in dollars, strictly between 0 and 1; ask levels above it are skipped.
- `market_id` (string, required): Kalshi market ticker (e.g. KXFEDDECISION-28JAN-H0) or Polymarket market id (e.g. 2589812), as returned by search_markets.
- `side` (string, required): Side of the binary contract to buy: 'yes' or 'no'.
- `venue` (string, required): Venue: 'kalshi' or 'polymarket'.

### `paper_portfolio` (~105 tokens)

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.

### `paper_reset` (~87 tokens)

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.

Input parameters:

- `confirm` (boolean): Must be true to erase the ledger; otherwise nothing changes.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/yichengyang-ethan-oracle3/oracle3#diagnostics

## Score history

- 2026-11-05: 76
- 2026-11-04: 94
- 2026-11-03: 94
- 2026-11-02: 94
- 2026-11-01: 94
- 2026-10-31: 94
- 2026-10-30: 94
- 2026-10-29: 94
- 2026-10-28: 79
- 2026-10-27: 94
- 2026-10-26: 93
- 2026-10-25: 93
- 2026-10-24: 78
- 2026-10-23: 77
- 2026-10-22: 92
- 2026-10-21: 91
- 2026-10-20: 80
- 2026-10-19: 73
- 2026-10-18: 89
- 2026-10-17: 84
- 2026-10-16: 89
- 2026-10-15: 88
- 2026-10-14: 88
- 2026-10-13: 72
- 2026-10-12: 76
- 2026-10-07: 69
- 2026-10-05: 58
- 2026-10-04: 83
- 2026-10-03: 68
- 2026-10-02: 82

## 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.

## Links

- PyPI project: https://pypi.org/project/oracle3/
- Socket report: https://socket.dev/pypi/package/oracle3
- Repository: https://github.com/YichengYang-Ethan/oracle3-prediction-market-agent
- Website: https://yichengyang-ethan.github.io/oracle3-prediction-market-agent/
- Changelog RSS feed: https://verifymcp.io/servers/yichengyang-ethan-oracle3/oracle3.xml
- Changelog JSON feed: https://verifymcp.io/servers/yichengyang-ethan-oracle3/oracle3.json
- HTML version of this page: https://verifymcp.io/servers/yichengyang-ethan-oracle3/oracle3
