# Otto Data — Robinhood Chain (remote · api.ottodata.app)

Live Robinhood Chain tokenized-stock data: basis vs NASDAQ, gaps, pools, whale flows.

- Trust score: 67/100 (medium)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `api.ottodata.app`: 67/100 (this document), [markdown](https://verifymcp.io/servers/app-ottodata-otto/api.md), [page](https://verifymcp.io/servers/app-ottodata-otto/api)

## Channel facts

- Endpoint: `https://api.ottodata.app/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.2.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, 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-08-03.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (execute_onchain_swap).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 78/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4015 tokens (~102/item across 39 items; 39 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 67/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http app-ottodata-otto https://api.ottodata.app/mcp
```

### Codex

```toml
[mcp_servers.app-ottodata-otto]
url = "https://api.ottodata.app/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "app-ottodata-otto": {
      "type": "remote",
      "url": "https://api.ottodata.app/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add app-ottodata-otto --url https://api.ottodata.app/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  app-ottodata-otto:
    url: "https://api.ottodata.app/mcp"
```

### Other

```json
{
  "mcpServers": {
    "app-ottodata-otto": {
      "type": "http",
      "url": "https://api.ottodata.app/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## 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-08-03 (score 67, +1)

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

### 2026-08-01 (score 66, +1)

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

### 2026-07-31 (score 65, +2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 63, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 62, +1)

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

### 2026-07-27 (score 61, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 61)

First indexed and scored.

## MCP tools (39)

### `hood_basis_snapshot` (~75 tokens)

Current basis (premium/discount) snapshot for all Robinhood Chain
    tokenized stocks. Per ticker: chainlink_px (on-chain price), ref_last
    (NASDAQ), basis_bps (+ = token trades at a premium), overnight_bps (move
    vs last close) and the oracle_paused flag.

### `hood_basis_history` (~56 tokens)

Minute-level basis history for one ticker (newest first). Example
    tickers: NVDA, TSLA, SPY. limit max 5000.

Input parameters:

- `limit` (integer)
- `ticker` (string, required)

### `hood_gaps_summary` (~63 tokens)

Overnight and weekend premium/discount statistics for all tickers:
    average, min/max and latest value (bps). Tokens trade 24/5, so this
    measures the drift that builds up while NASDAQ is closed.

Input parameters:

- `days` (integer)

### `hood_gaps_live` (~49 tokens)

Live view of the current off-hours session: which tickers trade at the
    largest premium/discount vs their last close. Returns 'regular' when the
    stock market is open.

### `hood_gap_sessions` (~44 tokens)

Session-by-session gap history for one ticker (each overnight/weekend
    session is a separate row).

Input parameters:

- `days` (integer)
- `ticker` (string, required)

### `hood_feeds` (~34 tokens)

Registry of all tokenized stock and crypto feeds tracked on Robinhood
    Chain (Chainlink proxy + token contract addresses).

### `reddit_alpha_signals` (~95 tokens)

Ticker alpha signals extracted from Reddit (novelty, mention velocity
    and cross-sub spread components). signal_type: ticker_alpha|crowded_trade|
    event_mispricing|squeeze_watch. tickers is comma-separated (NVDA,TSLA).

Input parameters:

- `limit` (integer)
- `min_alpha` (number)
- `signal_type` (string)
- `tickers` (string)

### `reddit_market_regime` (~41 tokens)

Current market regime inferred from Reddit chatter (e.g.
    mag7_only_rally, risk_on_call_chase) + confidence + flags to watch.

### `hood_attention` (~67 tokens)

Reddit attention/alpha score joined with live basis for Hood tokenized
    stocks: which tokens have social interest AND an on-chain premium/discount
    at the same time. Fan-out (same post, many tickers) is deduplicated.

Input parameters:

- `min_alpha` (number)

### `hood_pools` (~51 tokens)

Tracked Uniswap (Hood) pools: pool price per token, liquidity (USD) and
    deviation vs the Chainlink oracle price (dev_bps). Refreshed every 5 min.

### `oracle_deviation` (~72 tokens)

Chainlink-vs-Uniswap pool price deviation (bps, sorted by absolute
    value). status: ok (<100), warning (100-500), alert (>500). Large
    deviations are normal in low-liquidity pools — check liquidity_usd.

Input parameters:

- `min_abs_bps` (number)

### `stable_risk` (~30 tokens)

Deviation of USDG and other stablecoins from $1 parity (depeg risk, bps).

### `market_events` (~97 tokens)

Machine-readable news events (crypto + stocks). symbols is
    comma-separated (NVDA,BTC), event_type: listing|hack|regulation|earnings|
    etf|partnership|macro|liquidation|stablecoin|general. importance 0-100.

Input parameters:

- `event_type` (string)
- `limit` (integer)
- `min_importance` (integer)
- `symbols` (string)

### `token_flows` (~98 tokens)

Large on-chain token transfers (whale flows): 32 stock tokens + USDG
    above the USD threshold. direction: mint|burn|transfer. Mints/burns show
    the tokenized stock supply changing (issuance/redemption).

Input parameters:

- `direction` (string)
- `hours` (integer)
- `limit` (integer)
- `min_usd` (number)
- `ticker` (string)

### `flow_summary` (~43 tokens)

Whale-flow summary per ticker: transfer count, total USD volume,
    mint/burn USD (supply change) and the largest transfer.

Input parameters:

- `hours` (integer)

### `hood_stock_research` (~182 tokens)

Daily deep-research report: score (0-100), rating (strong_buy|buy|hold|
    avoid) and 4 analysis columns per Hood tokenized stock: thesis, dated
    catalysts (off_hours-flagged, verified earnings dates), financials (PE
    ttm/fwd, growth, margins, valuation_label: expensive|fair|discount|n_a),
    competitors (peers + positioning) and news_summary ([+]/[=]/[-] tagged).
    The api_data field carries exact API numbers (price, market cap, 1d/7d/30d,
    52w, target mean/hi/lo, analyst rec counts) — use it when precision
    matters. With ticker: one card + live basis join; empty: full report.

Input parameters:

- `ticker` (string)

### `hood_off_hours_catalysts` (~54 tokens)

Dated catalysts that can move token prices while NASDAQ is closed
    (nights/weekends) — flattened from all research cards, sorted by date.
    For agents watching overnight gap and weekend risk.

### `hood_earnings_risk` (~124 tokens)

Earnings risk for Hood tokenized stocks (weekly earnings radar): per
    ticker report_date/time, days_to_earnings, implied_move_pct (option-implied
    expected move), beat_probability (0-100), PEAD status + live basis join.
    Earnings released while NASDAQ is closed make the token gap — watch small
    days_to_earnings for off-hours risk management. tickers: CSV filter
    (empty = full Hood universe).

Input parameters:

- `days_ahead` (integer)
- `tickers` (string)

### `hood_sector_rotation` (~142 tokens)

Sector rotation context for Hood tokenized stocks (API-only tracker
    refreshed every 3h): market regime (risk_on|risk_off|mixed), an 11-SPDR
    sector score/label/flow board and a per-ticker join — sector score
    (0-100), label (inflow|interest|neutral|outflow_leaning|outflow), flow
    trend, theme matches + live basis. Answers where money is rotating and
    whether your token's sector is in inflow or outflow. tickers: CSV filter
    (empty = full Hood universe).

Input parameters:

- `tickers` (string)

### `service_status` (~58 tokens)

Trust status of the Otto data layer: per-feed freshness (age_sec/stale),
    24h tick coverage, NASDAQ reference availability and oracle-pause count.
    Call before making trading decisions — status: ok|degraded|down.

### `chain_stats` (~43 tokens)

Robinhood Chain deployment statistics: daily deploy/token counts, top
    deployers, total contract/verified counts (Ottoscan analytics).

Input parameters:

- `days` (integer)

### `chain_deployments` (~61 tokens)

New contract deployments on Robinhood Chain (Ottoscan; full history
    since genesis). tokens_only=True returns only new token contracts.

Input parameters:

- `limit` (integer)
- `tokens_only` (boolean)
- `verified_only` (boolean)

### `gap_trade_signals` (~165 tokens)

Deterministic signals for the gap-trader strategy: per Hood ticker the
    overnight gap it currently carries (bps), a signal (long_at_open |
    avoid_or_reduce | none), 14-day gap statistics, the hit rate of pre-open
    gap direction vs open direction (hit_rate_14d) and risk flags
    (oracle_paused, stale, low_liquidity, earnings_within_48h). Signals are
    NOT orders — sizing and approval belong to the user. The most informative
    window is pre-open 09:15-09:29 ET; signals are suppressed while the market
    is open (session=regular).

Input parameters:

- `days` (integer)
- `min_abs_bps` (number)

### `perp_funding` (~104 tokens)

Hourly funding rates on tokenized-stock perps (Arcus + Lighter). Without
    params: latest value per venue+ticker pair (funding_apr_pct = annualized
    %). With ticker: history. Tokens trade 24/7 while the stock market does
    not — weekend/overnight funding is the price of that mismatch.

Input parameters:

- `limit` (integer)
- `ticker` (string)
- `venue` (string)

### `perp_spot_basis` (~93 tokens)

Perp mark price vs Hood on-chain spot (Chainlink per-share + pool),
    deviation in bps per ticker. A large |perp_vs_chainlink_bps| means the
    perp and spot price the same stock differently — a cross-venue opportunity
    or a stale-oracle signal. Fields are null for markets without a Hood spot.

Input parameters:

- `min_abs_bps` (number)

### `funding_carry_signals` (~143 tokens)

Deterministic funding-carry candidates joining perp funding
    (Arcus/Lighter) with perp-vs-spot basis. Per ticker: funding rate +
    annualized funding_apr_pct, perp-vs-Chainlink gap (bps) and a label —
    carry_long_spot_short_perp (hold Hood spot, short the perp, collect
    positive funding), carry_short_spot_long_perp (inverse) or no_carry —
    plus the standard risk flags. min_abs_bps filters on
    |perp_vs_chainlink_bps|. Signals are NOT orders.

Input parameters:

- `min_abs_bps` (number)

### `narrative_trade_signals` (~125 tokens)

Deterministic candidates for the narrative-trader strategy: per Hood
    ticker the highest-alpha Reddit signal (alpha_score, evidence, themes), a
    signal bias (long_candidate = rising attention | avoid_or_fade = crowded
    trade | context = regime info), live Chainlink price, basis and risk
    flags. The `reason` field is the Reddit summary — carry it into status
    reports and the chart as the buy/sell rationale. Signals are NOT orders.

Input parameters:

- `hours` (integer)
- `min_alpha` (number)

### `hood_quote` (~93 tokens)

Minimal fast quote for one Hood ticker: Chainlink price (token +
    per-share), NASDAQ references (ref_last, ref_prev_close), basis/overnight
    bps, the most liquid pool's price/liquidity/deviation and
    oracle_paused/stale flags. Use for sizing and fill pricing instead of
    pulling the full 32-ticker snapshot.

Input parameters:

- `ticker` (string, required)

### `hood_ticker_brief` (~110 tokens)

One-call brief for a single Hood ticker: live quote (price, basis,
    pool, risk flags), research card (rating/score/thesis/catalysts), earnings
    risk, sector rotation context, best Reddit attention signal, 24h
    whale-flow summary and recent tagged news. Replaces 6-7 separate tool
    calls when an agent researches one ticker. Missing upstream sources
    fail-soft: the field is null.

Input parameters:

- `ticker` (string, required)

### `agent_position_book` (~119 tokens)

Server-side derived open position book for a trading agent:
    every order_filled event without a later matching position_closed on the
    same ticker counts as open, joined with the live Chainlink price for
    unrealized P&L (bps and USD). Replaces rebuilding the book from raw
    agent events. agent: gap-trader | narrative-trader.
    mode: '' (all) | paper | live | onchain — filter positions by execution mode.

Input parameters:

- `agent` (string)
- `mode` (string)

### `agent_performance` (~118 tokens)

Realized trading performance for an agent, derived from
    position_closed events: trade count, win rate, total/average P&L (bps),
    total P&L (USD), average holding hours, per-ticker breakdown and the last
    20 closed trades. agent: gap-trader | narrative-trader.
    mode: '' (all) | paper | live | onchain — filter trades by execution mode.

Input parameters:

- `agent` (string)
- `days` (integer)
- `mode` (string)

### `report_agent_status` (~178 tokens)

Status report from a trading agent — the live panel on
    ottodata.app/agents renders this stream. kind: run_started | signals |
    order_proposed | order_approved | order_filled | order_skipped |
    position_closed | run_summary | error. agent: gap-trader |
    narrative-trader. key: the operator's OTTO_AGENT_KEY value (wrong keys are
    rejected). Call at every runbook step; keep message short and
    human-readable (e.g. 'BUY 3 NVDA @ 184.20 limit — gap +82bps').

Input parameters:

- `agent` (string)
- `key` (string, required)
- `kind` (string, required)
- `message` (string, required)
- `payload`
- `run_id` (string)
- `ticker` (string)

### `execute_onchain_swap` (~272 tokens)

Execute a REAL on-chain swap on Robinhood Chain via the Rialto router,
    signed by Otto's server-side trading wallet. side=buy spends `usd_amount`
    USDG to buy the ticker's Hood token; side=sell sells `qty` tokens back to
    USDG. The server enforces hard guardrails independently of the caller:
    USDG<->allowlisted-token pairs only, per-trade and daily USD caps, and a
    slippage cap. On success the matching order_filled/position_closed event
    (payload mode=onchain, with tx_hash) is written automatically — the
    position book, performance stats and trade chart update without a
    separate report_agent_status call. key: the operator's OTTO_AGENT_KEY.
    agent: gap-trader | narrative-trader. Returns tx_hash, fill qty/price/usd
    and pnl_bps (sells with a known entry).

Input parameters:

- `agent` (string)
- `key` (string, required)
- `qty` (number)
- `reason` (string)
- `run_id` (string)
- `side` (string, required)
- `slippage_bps` (integer)
- `ticker` (string, required)
- `usd_amount` (number)

### `competition_paper_trade` (~215 tokens)

Place a PAPER fill in Otto's trading competition on behalf of the
    key's owner. No real funds move — the fill is priced server-side at the
    latest Chainlink price (callers can never supply a price). api_key: the
    personal otto_pk_ key issued when the wallet joined at
    ottodata.app/competition. side: buy | sell. qty: token quantity (shares).
    Include a short `reason` — it shows up in the owner's trade history.
    Rules enforced server-side: $10,000 starting budget, long-only, max
    $2,000 notional per trade, max 10 open positions, max 40 trades/day.
    On a rule violation the response is {"error": "..."} — read it and
    adjust instead of retrying blindly.

Input parameters:

- `api_key` (string, required)
- `qty` (number, required)
- `reason` (string)
- `side` (string, required)
- `ticker` (string, required)

### `competition_my_portfolio` (~96 tokens)

The competition paper portfolio behind an otto_pk_ key: cash, equity,
    return %, realized/unrealized P&L, open positions with live prices,
    recent trades (each tagged with its source: your MCP agent or Otto's
    hosted gap/narrative engine) and the entry's strategy prefs. Check this
    before sizing a new competition_paper_trade.

Input parameters:

- `api_key` (string, required)

### `competition_leaderboard` (~90 tokens)

Public leaderboard of Otto's paper trading competition: every
    participant ranked by return % on the shared $10,000 starting budget,
    with equity, P&L, open position count, trade count and last activity.
    No key required. Fills are server-priced from Chainlink, so rankings
    cannot be gamed with self-reported prices.

Input parameters:

- `limit` (integer)

### `partner_swap_quote` (~239 tokens)

Get an UNSIGNED Rialto swap quote for an approved partner. YOU sign
    and broadcast the returned transaction yourself, with your own wallet's
    private key, on your own infrastructure — Otto never sees or holds your
    key and never submits anything on your behalf. api_key: the otto_pn_
    key Otto's admin issued you directly. sell_token/buy_token: Hood token
    contract addresses (0x...). sell_amount: human units of sell_token (e.g.
    "25" USDG, not wei). taker: the wallet address that will actually sign
    and hold the position. Returns the raw Rialto quote including tx.to,
    tx.data, tx.value and min_buy_amount — everything needed to build and
    sign the transaction. After broadcasting, call partner_report_fill so
    the trade shows up in Otto's records.

Input parameters:

- `api_key` (string, required)
- `buy_token` (string, required)
- `sell_amount` (string, required)
- `sell_token` (string, required)
- `slippage_bps` (integer)
- `taker` (string, required)

### `partner_report_fill` (~135 tokens)

Report a fill you already signed and broadcast yourself (via
    partner_swap_quote) so it appears in Otto's records. Otto does NOT
    verify the transaction on-chain in this version — it trusts the
    partner it already approved. side: buy | sell. tx_hash: the
    transaction hash from your own broadcast.

Input parameters:

- `api_key` (string, required)
- `price` (number)
- `qty` (number)
- `reason` (string)
- `side` (string, required)
- `ticker` (string, required)
- `tx_hash` (string, required)
- `usd` (number)

### `partner_my_trades` (~40 tokens)

Recent fills you've reported with partner_report_fill, most recent
    first.

Input parameters:

- `api_key` (string, required)
- `limit` (integer)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/app-ottodata-otto/api#diagnostics

## Score history

- 2026-08-03: 67
- 2026-08-02: 66
- 2026-08-01: 66
- 2026-07-31: 65
- 2026-07-30: 63
- 2026-07-29: 62
- 2026-07-28: 62
- 2026-07-27: 61
- 2026-07-26: 61

## Links

- Remote endpoint: https://api.ottodata.app/mcp
- Repository: https://github.com/Degergokalp/otto-data
- Website: https://ottodata.app/
- Changelog RSS feed: https://verifymcp.io/servers/app-ottodata-otto/api/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/app-ottodata-otto/api/changelog.json
- HTML version of this page: https://verifymcp.io/servers/app-ottodata-otto/api
