Connect an AI Assistant
Tealstreet hosts an MCP connector, so an AI assistant you already use can write Custom Modules directly into your account. The same connector is being expanded into Tealstreet's read-only data connector; 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.
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.
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 exchange.tealstreet.io's public candle service |
get_safe_cex_markets | Safe-cex market metadata through exchange.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.
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. Widgets hold
query results, not code. Turning one into a real custom 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.