Connect an AI Assistant
Tealstreet hosts an MCP connector, so an AI assistant you already use can read market, onchain and prediction-market data, build dashboards, and write Custom Modules, hotkey scripts and chart studies directly into your account. Available permissions are always shown on the consent screen before anything is granted.
Connecting
Add this URL as an MCP server in your assistant:
https://preview.tealstreet.io/api/mcp
There is nothing to generate and no key to copy. The first time your assistant calls it, you will be sent to a Tealstreet consent page listing exactly what it is asking for, and you approve or cancel there.
This hosted connector is Tealstreet's only MCP server. The CLI does not run one.
Adding it to your client
| Client | How |
|---|---|
| Claude (web/desktop) | Settings → Connectors → Add custom connector, paste the URL |
| Claude Code | claude mcp add --transport http tealstreet https://preview.tealstreet.io/api/mcp |
| Cursor | ~/.cursor/mcp.json: { "mcpServers": { "tealstreet": { "url": "https://preview.tealstreet.io/api/mcp" } } } |
| OpenCode | opencode.json: { "mcp": { "tealstreet": { "type": "remote", "url": "https://preview.tealstreet.io/api/mcp" } } } |
Any client that speaks remote (streamable HTTP) MCP with OAuth works the same way: give it the URL, and it opens the consent page on first use.
Whitelabel domains use their own host — connect to the site you actually log in to.
Only connect an assistant you trust. It can create, change and delete your custom modules. It cannot place orders, move funds, or read your exchange API keys.
Trade through your local CLI
The connector itself never places orders. If you have the
Tealstreet CLI installed, an assistant that can run
shell commands (Claude Code, Cursor, OpenCode and similar) can trade through it,
on your machine, signing requests with keys stored there. It needs CLI 0.10.18
or newer; the assistant checks and has you run tealstreet update if not.
get_cli_reference tells the assistant how: check for the CLI with
tealstreet --version, walk you through installing it, signing in and adding
or syncing your keys when something is missing, then run orders as
tealstreet exec --json -a <account> -s <symbol> '<command>' and read back a
result code. It is told to confirm every order with you first and to offer
simulated orders (sim on) for a first trade.
| Tool | Permission | What it returns |
|---|---|---|
get_cli_reference | modules:read | CLI detection, step-by-step setup, the exec --json pattern and its codes |
What it can and cannot do
Available permissions are shown on the consent screen:
| Permission | What it allows |
|---|---|
modules:read | List and read your modules |
modules:write | Create, change and delete your modules |
market:read | Read public market data |
onchain:read | Read public onchain and address-keyed analytics |
account:read | Read your private balances, positions, orders, fills and ledger from connected exchange accounts |
thirdparty:read | Read private data from third-party sources you connect |
dashboard:write | Create MCP dashboard sessions and widgets |
None of these scopes can place orders, move funds, or reveal exchange API
keys. onchain:read is for public address-keyed analytics, not a user's
private wallet history. Private CEX positions, balances, fills, orders, ledger,
and reconciliation inputs require account:read plus constrained grants: the
authorization request must name the exact account/source set with
mcp_grant_constraints, for example
{"version":1,"accounts":[{"source":"bybit","accountId":"main"}],"thirdParty":[{"source":"arkham"}]}.
Wildcard or user-wide private data grants are refused. A module the assistant
writes is still subject to the same sandbox and the same safety screen as code
you type yourself.
Self-discovery tools:
| Tool | Permission | What it returns |
|---|---|---|
get_mcp_context_dsl_reference | dashboard:write | The mcp-context/v1 DSL, scopes, callback contract, dashboard piping and examples |
list_mcp_context_planes | dashboard:write | Available context-query planes for the hosted runtime |
plan_mcp_context_query | dashboard:write | Bounded MCP tool steps plus dashboard widget metadata for a query |
Agents should call get_mcp_context_dsl_reference before composing dashboard
queries. It is the canonical in-protocol reference for the DSL, polling refresh
metadata, callback events, and how planned query results are piped into MCP
dashboard widgets.
Hosted private CEX account tools currently include:
| Tool | What it returns |
|---|---|
list_cex_accounts | Granted CEX accounts and latest snapshot timestamps |
get_cex_account_balance_snapshot | Latest cached balance/equity snapshot for one account |
get_cex_account_position_snapshot | Latest cached position-history snapshot for one account |
get_cex_account_order_snapshot | Latest cached order-history snapshot for one account |
get_cex_account_historical_fills | Bounded venue-keyed historical fill rows for one account |
get_cex_account_historical_orders | Bounded venue-keyed historical order rows for one account |
get_cex_account_historical_positions | Bounded historical closed-position rows for one account |
These tools read cached account-history rows by constrained source plus
accountId. They do not return encrypted exchange configs, API keys, or
account-sync blobs. Historical tools read historical_fills,
historical_orders, and historical_positions; historical_coverage remains
ingestion-private and is not exposed.
Public market data tools currently include:
| Tool | What it returns |
|---|---|
list_market_data_sources | Publicdata source metadata and exchange health |
get_public_tickers | A bounded ticker snapshot for one publicdata exchange |
get_public_ticker | One symbol on one publicdata exchange |
get_top_movers | Top 24h percentage movers across publicdata exchanges |
get_top_volume | Top 24h quote-volume markets across publicdata exchanges |
get_top_funding | Top absolute funding-rate markets across publicdata |
get_exchange_proxy_candles | Historical candles through data.tealstreet.io's public candle service |
get_safe_cex_markets | Safe-cex market metadata through data.tealstreet.io's candle service |
get_safe_cex_market | One safe-cex market by symbol or id through the candle service |
get_polymarket_events | Public Polymarket events with compact market rows |
search_polymarket_events | Public Polymarket event and tag search |
get_polymarket_midpoints | Batched public Polymarket CLOB midpoint prices |
get_polymarket_order_book | Depth-bounded public Polymarket CLOB book levels |
get_polymarket_price_history | Public Polymarket CLOB price-history points |
list_market_data_sources | Which public market-data sources this runtime can reach |
list_news_sources | Which news sources are available to you |
get_recent_news | Recent TealNews headlines, filterable by source, handle or symbol |
The safe-cex market tools use exchange-services'
/candles/api/market-data/markets route and return warnings when a metadata
snapshot is missing or stale.
get_exchange_proxy_candles is a strict read-only adapter for the
exchange-services /candles/api/market-data/candles route. It accepts only
validated candle query fields and is not a generic URL proxy.
Polymarket tools are public read-only DEX tools. They use Tealstreet's
Polymarket /v1/* public route contract when configured, return read/cache
metadata instead of claiming exchange freshness, and never expose account data,
API keys, or order placement.
Prediction-market tools
Built on Tealstreet's prediction-market model rather than raw Polymarket fields, so they answer trader questions instead of returning wire data.
| Tool | Permission | What it returns |
|---|---|---|
screen_prediction_markets | market:read | Markets filtered by implied probability, resolution window, liquidity |
get_prediction_event | market:read | One event, its outcomes, and probabilities normalized across them |
find_prediction_arbitrage | market:read | Mutually exclusive sets buyable below 1.00 at the best ask |
get_prediction_resolution_calendar | market:read | Where upcoming settlements cluster by date |
get_prediction_liquidity_profile | market:read | Spread, resting depth, and how much of a position could exit |
An arbitrage result is deliberately conservative: it is only reported when the full candidate set is present, every market is still trading, and every leg has a real ask. Edge is quoted per complete set before fees, slippage, and the size actually resting on the book.
Your modules, hotkeys and studies
Each kind is written to a draft first and goes live only when committed
(see Drafts and commits). The get_*_api_types tools
return the exact contract to write against; call them first.
| Tool | Permission | What it does |
|---|---|---|
get_module_api_types | modules:read | Custom-module type definitions and the runtime rules types cannot express |
list_modules / read_module | modules:read | Your modules, and one module's source |
validate_module / explain_module | modules:read | Typecheck and pre-screen; summarise what it reads and whether it can trade |
write_module / commit_module / delete_module | modules:write | Draft, screen and store, delete |
publish_module | modules:write | Publish the committed module to the marketplace |
get_hotkey_api_types | modules:read | The custom-hotkey script contract |
list_hotkey_scripts / list_hotkey_script_drafts / read_hotkey_script | modules:read | Your synced hotkey scripts, drafts, and one script's source |
validate_hotkey_script / explain_hotkey_script | modules:read | Validate; summarise which order actions it can take |
write_hotkey_script / commit_hotkey_script / delete_hotkey_script | modules:write | Draft, store, delete |
share_hotkey_script / publish_hotkey_script / unpublish_hotkey_script | modules:write | Share link, marketplace listing, remove the listing |
get_tealchart_study_api_types | modules:read | The Tealchart study (Tealscript) contract |
list_tealchart_studies / list_tealchart_study_drafts / read_tealchart_study | modules:read | Your synced studies, drafts, and one study's source |
validate_tealchart_study / explain_tealchart_study | modules:read | Validate; summarise capabilities (studies are read-only) |
write_tealchart_study / commit_tealchart_study / delete_tealchart_study | modules:write | Draft, store, delete |
Hotkey scripts can place orders when you press them. Writing one through MCP stores the order actions it needs but does not approve them; sharing or publishing one requires the assistant to name those actions explicitly.
Public onchain tools
| Tool | Permission | What it returns |
|---|---|---|
get_onchain_address_portfolio | onchain:read | Public positions one address holds at one venue, with a bounded max loss |
get_prediction_address_exposure | onchain:read | One public Polymarket address as exposure, worst case and resolution dates |
Tools that read your private data
These only appear when the grant carries the matching permission, and the private CEX tools additionally require the grant to name the specific accounts they may read.
| Tool | Permission | What it returns |
|---|---|---|
list_cex_accounts | account:read | The connected accounts this grant may read |
get_cex_account_equity_curve | account:read | Hourly equity-curve points for one granted account |
summarize_cex_account_performance | account:read | Aggregate performance summary for granted accounts |
reconcile_cex_account_fills | account:read | Hedge-match reconciliation across granted accounts |
get_personal_recent_news | thirdparty:read | Your personal news feed from sources you connected |
get_arkham_alerts | thirdparty:read | Alerts delivered to your Arkham webhook |
Dashboard tools
dashboard:write lets an assistant build a dashboard you can open in the
browser: create_mcp_dashboard_session, list_mcp_dashboard_sessions,
get_mcp_dashboard_session, add_mcp_dashboard_widget,
update_mcp_dashboard_widget and refresh_mcp_dashboard_widgets.
commit_mcp_dashboard screens and stores it; editing afterwards returns it to
draft until the next commit. Widgets hold query results, not code. Turning one
into a real custom module (promote_mcp_dashboard_module) needs
modules:write as well and goes through the normal module safety screen —
and a widget built from private account data cannot be exported at all.
Hyperliquid analytics tools currently include:
| Tool | Permission | What it returns |
|---|---|---|
get_hyperliquid_leaderboard | onchain:read | Crawled Hyperliquid leaderboard rows |
get_hyperliquid_large_positions | onchain:read | Bounded scan for large public positions |
get_hyperliquid_address_positions | onchain:read | Latest crawled clearinghouse positions for an address |
get_hyperliquid_address_fills | onchain:read | Recent crawled fills for an address |
get_hyperliquid_address_value_curve | onchain:read | Crawled account-value curve points for an address |
The three get_hyperliquid_address_* tools take a public address; none of these read a user's own wallet or any connected exchange account.
Drafts and commits
An assistant writes in two steps, which mirrors how the editor already works — your keystrokes go to local storage instantly and are only stored in your account a couple of seconds later, once they have been screened.
- Draft — instant, unscreened, and held on the server. A draft is not live: it does not appear in your terminal, does not reach your other devices, and does not survive as a module until it is committed. It does survive your assistant's session ending.
- Commit — runs the safety screen. If it passes, the module is stored and loads in your terminal and on your other devices.
A module your assistant says it "saved" may only be drafted. That is why
the terminal marks it: a module with uncommitted work shows (draft) in the
module picker and a notice in the editor. If you see that, ask your assistant
to commit.
An open tab picks up a committed module the next time it loads modules — reload the tab if you want to see it immediately.
Why a write gets refused
Refusals are normal and specific; your assistant is told which one it hit.
| Refusal | Why |
|---|---|
No top-level Component | The runtime looks up a function binding called Component. Without it a module loads and renders nothing. |
| Does not compile | Checked before anything is stored, and before the screen is asked. Free and unlimited. |
| Reserved name | Global Module and Override… are system-managed. |
| Too long | A module has to be small enough to typecheck and screen. |
| Safety screen refused it | The module did something it should not. Your previously committed version is untouched. |
| Can only run locally | The screen allowed it but not for storage, so it is not synced. Nothing is lost — the draft stays. |
| Daily limit reached | A cap on automated changes, so a stuck assistant cannot fill or empty your library. |
| A newer version exists | Something else changed the module since your assistant last saw it. |
Every refusal leaves both the draft and the last committed version intact. An assistant that is told "no" has not lost your work.
Disconnecting
Remove the server from your assistant's configuration, or revoke the connection from Tealstreet's Connected apps settings tab.
Troubleshooting
- The consent page asks me to log in — you are signed out. Log in and the page returns.
- My assistant says it saved, but nothing is in my terminal — it drafted
without committing. Look for the
(draft)marker and ask it to commit. - Committed, but the panel still shows the old version — reload the tab.
- "Daily limit reached" — the cap resets at midnight UTC.