Skip to content

Otto Data — Robinhood Chain

by ottodata.app · remote · no sign-in to list tools · v0.2.0 · published by app.ottodata

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

Deletes · 1Changes · 35

39 tools: 1 can delete or cancel things, 35 change things and 3 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

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

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "report_agent_status" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "report_agent_status" says "status": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

39 tools

Deletes or cancels 1Claude Code: deny
  • execute_onchain_swapExecute a REAL on-chain swap on Robinhood Chain via the Rialto router, signed by Otto's server-side trading wallet.No findings

    Why it is in this group

    • The name "execute_onchain_swap" says "execute": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Execute Onchain Swap
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
Changes things 35Claude Code: ask
  • agent_performanceRealized 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 b…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Agent Performance
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • agent_position_bookServer-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 liv…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Agent Position Book
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • chain_deploymentsNew contract deployments on Robinhood Chain (Ottoscan; full history since genesis).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    New contract deployments on Robinhood Chain (Ottoscan; full history since genesis). tokens_only=True returns only new token contracts.

    Annotations the server declares

    • title: Contract Deployments (Ottoscan)
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • chain_statsRobinhood Chain deployment statistics: daily deploy/token counts, top deployers, total contract/verified counts (Ottoscan analytics).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Robinhood Chain deployment statistics: daily deploy/token counts, top deployers, total contract/verified counts (Ottoscan analytics).

    Annotations the server declares

    • title: Chain Deploy Stats
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • competition_leaderboardPublic 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 cou…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Competition Leaderboard
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • competition_my_portfolioThe 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…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Competition My Portfolio
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • competition_paper_tradePlace a PAPER fill in Otto's trading competition on behalf of the key's owner.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Competition Paper Trade
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • flow_summaryWhale-flow summary per ticker: transfer count, total USD volume, mint/burn USD (supply change) and the largest transfer.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Whale-flow summary per ticker: transfer count, total USD volume, mint/burn USD (supply change) and the largest transfer.

    Annotations the server declares

    • title: Flow Summary by Ticker
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • funding_carry_signalsDeterministic funding-carry candidates joining perp funding (Arcus/Lighter) with perp-vs-spot basis.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Funding Carry Signals
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • gap_trade_signalsDeterministic 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 statis…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Gap Trade Signals
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_attentionReddit 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.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Hood Attention x Basis
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_basis_historyMinute-level basis history for one ticker (newest first).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Minute-level basis history for one ticker (newest first). Example tickers: NVDA, TSLA, SPY. limit max 5000.

    Annotations the server declares

    • title: Hood Basis History
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_earnings_riskEarnings 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…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Hood Earnings Risk
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_feedsRegistry of all tokenized stock and crypto feeds tracked on Robinhood Chain (Chainlink proxy + token contract addresses).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Registry of all tokenized stock and crypto feeds tracked on Robinhood Chain (Chainlink proxy + token contract addresses).

    Annotations the server declares

    • title: Feed & Token Registry
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_gap_sessionsSession-by-session gap history for one ticker (each overnight/weekend session is a separate row).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Session-by-session gap history for one ticker (each overnight/weekend session is a separate row).

    Annotations the server declares

    • title: Gap Session History
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_gaps_liveLive view of the current off-hours session: which tickers trade at the largest premium/discount vs their last close.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Live Off-Hours Gaps
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_gaps_summaryOvernight and weekend premium/discount statistics for all tickers: average, min/max and latest value (bps).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Overnight/Weekend Gap Summary
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_off_hours_catalystsDated catalysts that can move token prices while NASDAQ is closed (nights/weekends) — flattened from all research cards, sorted by date.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Off-Hours Catalysts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_poolsTracked Uniswap (Hood) pools: pool price per token, liquidity (USD) and deviation vs the Chainlink oracle price (dev_bps).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Tracked Uniswap (Hood) pools: pool price per token, liquidity (USD) and deviation vs the Chainlink oracle price (dev_bps). Refreshed every 5 min.

    Annotations the server declares

    • title: Uniswap Pool Prices
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_quoteMinimal 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/liquidi…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Hood Quote
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_sector_rotationSector 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-…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Hood Sector Rotation
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_stock_researchDaily 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…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Hood Stock Research
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • hood_ticker_briefOne-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 Re…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Hood Ticker Brief
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • market_eventsMachine-readable news events (crypto + stocks).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Market News Events
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • narrative_trade_signalsDeterministic candidates for the narrative-trader strategy: per Hood ticker the highest-alpha Reddit signal (alpha_score, evidence, themes), a signal bias (long_candidate = rising …No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Narrative Trade Signals
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • oracle_deviationChainlink-vs-Uniswap pool price deviation (bps, sorted by absolute value).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Oracle vs Pool Deviation
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • partner_my_tradesRecent fills you've reported with partner_report_fill, most recent first.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Recent fills you've reported with partner_report_fill, most recent first.

    Annotations the server declares

    • title: Partner My Trades
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • partner_report_fillReport a fill you already signed and broadcast yourself (via partner_swap_quote) so it appears in Otto's records.No findings

    Why it is in this group

    • The name "partner_report_fill" says "fill": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Partner Report Fill
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • perp_fundingHourly funding rates on tokenized-stock perps (Arcus + Lighter).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Perp Funding Rates
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • perp_spot_basisPerp mark price vs Hood on-chain spot (Chainlink per-share + pool), deviation in bps per ticker.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Perp vs Spot Basis
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • reddit_alpha_signalsTicker alpha signals extracted from Reddit (novelty, mention velocity and cross-sub spread components).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Reddit Alpha Signals
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • reddit_market_regimeCurrent market regime inferred from Reddit chatter (e.g.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Current market regime inferred from Reddit chatter (e.g. mag7_only_rally, risk_on_call_chase) + confidence + flags to watch.

    Annotations the server declares

    • title: Reddit Market Regime
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • report_agent_statusStatus report from a trading agent — the live panel on ottodata.app/agents renders this stream.1 finding

    Why it is in this group

    • The name "report_agent_status" says "status": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "report_agent_status" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "report_agent_status" says "status": a word for reading.

      What this check looks for
    Description, as the server wrote it
    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').

    Annotations the server declares

    • title: Report Agent Status
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • stable_riskDeviation of USDG and other stablecoins from $1 parity (depeg risk, bps).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Deviation of USDG and other stablecoins from $1 parity (depeg risk, bps).

    Annotations the server declares

    • title: Stablecoin Depeg Risk
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • token_flowsLarge on-chain token transfers (whale flows): 32 stock tokens + USDG above the USD threshold.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Whale Token Flows
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 3Claude Code: allow
  • hood_basis_snapshotCurrent basis (premium/discount) snapshot for all Robinhood Chain tokenized stocks.No findings

    Why it is in this group

    • The name "hood_basis_snapshot" says "snapshot": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Hood Basis Snapshot
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • partner_swap_quoteGet an UNSIGNED Rialto swap quote for an approved partner.No findings

    Why it is in this group

    • The description's first verb is "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Partner Swap Quote
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • service_statusTrust status of the Otto data layer: per-feed freshness (age_sec/stale), 24h tick coverage, NASDAQ reference availability and oracle-pause count.No findings

    Why it is in this group

    • The name "service_status" says "status": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Service Status / Data Freshness
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.2.0. Values in angle brackets are yours to fill in.

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

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__otto__hood_basis_snapshot",
      "mcp__otto__service_status",
      "mcp__otto__partner_swap_quote"
    ],
    "ask": [
      "mcp__otto__hood_basis_history",
      "mcp__otto__hood_gaps_summary",
      "mcp__otto__hood_gaps_live",
      "mcp__otto__hood_gap_sessions",
      "mcp__otto__hood_feeds",
      "mcp__otto__reddit_alpha_signals",
      "mcp__otto__reddit_market_regime",
      "mcp__otto__hood_attention",
      "mcp__otto__hood_pools",
      "mcp__otto__oracle_deviation",
      "mcp__otto__stable_risk",
      "mcp__otto__market_events",
      "mcp__otto__token_flows",
      "mcp__otto__flow_summary",
      "mcp__otto__hood_stock_research",
      "mcp__otto__hood_off_hours_catalysts",
      "mcp__otto__hood_earnings_risk",
      "mcp__otto__hood_sector_rotation",
      "mcp__otto__chain_stats",
      "mcp__otto__chain_deployments",
      "mcp__otto__gap_trade_signals",
      "mcp__otto__perp_funding",
      "mcp__otto__perp_spot_basis",
      "mcp__otto__funding_carry_signals",
      "mcp__otto__narrative_trade_signals",
      "mcp__otto__hood_quote",
      "mcp__otto__hood_ticker_brief",
      "mcp__otto__agent_position_book",
      "mcp__otto__agent_performance",
      "mcp__otto__report_agent_status",
      "mcp__otto__competition_paper_trade",
      "mcp__otto__competition_my_portfolio",
      "mcp__otto__competition_leaderboard",
      "mcp__otto__partner_report_fill",
      "mcp__otto__partner_my_trades"
    ],
    "deny": [
      "mcp__otto__execute_onchain_swap"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as otto. Review it before you use it.