An agent is only as good as what its tools return. A raw feed is a firehose that can’t fit in context; computed state does. Install one MCP server and the whole table — 20,822+ tickers × 421+ signals — becomes tool calls the model makes itself: who matches a condition, a ticker’s full row, its history, the news. Answers, not workloads, so the context window goes to the decision. Execution stays behind your own broker tool.
Free plan. Every ticker, every signal, real-time data, all-time history.
what you get
| Native tool calls | The MCP server exposes scan, tickers, series, news, universes and webhooks to Claude, ChatGPT, Cursor, or any MCP runtime — one config block |
| Computed answers | A scan returns the tickers matching a condition — a list the model reasons over, not bars it has to compute RSI from |
| Whole-market questions | "Which large caps went oversold while holding their 200-day?" is one tool call over every US equity |
| Memory of the past | The same tools accept asof: the agent can ask what was true on any past day, with no look-ahead |
| Event-driven | Subscribe the conditions the agent cares about and wake it on the webhook — the market becomes the scheduler |
| Tool definitions, generated | Copy-paste tool schemas for Claude, OpenAI, Gemini and MCP, generated from the live API so they never drift |
Every read runs in three tenses: live, as of any past moment (add ?asof=; no look-ahead, no survivorship bias), or on push — the same query as a webhook that fires when the answer changes. Under it sits the computed table: every US equity plus rates, FX and crypto, every signal precomputed and refreshed continuously, all-time history. Data included — there’s no feed to bring.
one call
What the agent does with “which large caps are oversold but still above their 200-day?” — one call, computed answer back:
Agent → tickerbot_scan({ q: "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e9" })
← { "as_of": "2026-08-23T15:18:49Z", "count": 3,
"results": [ { "ticker": "LION", "name": "Lionsgate Studios Corp.", "price": 11.67, … },
{ "ticker": "KRG", "name": "Kite Realty Group Trust", "price": 26.15, … },
{ "ticker": "DVA", "name": "DaVita Inc.", "price": 173.79, … } ] }
Agent: Three names match — here's the list, and what stands out…Three rows, not three hundred bars. The model never computed an RSI; it asked a question and got the state. The same call is POST /v2/scan over HTTP for a headless agent loop.
Ready to wire it into something? Build an AI trading agent below walks it end to end. Reference: the MCP server · POST /v2/scan · scan subscriptions · the signals catalog.
build it
An agent is only as good as what its tools return. Feed it computed state instead of raw data and the context goes to the decision: every ticker × every signal, queryable by the model itself.
1. Give the model the market — One config block installs the MCP server in Claude, ChatGPT, Cursor, or any MCP runtime. Scans, tickers, series, news, and webhooks become tools the model calls itself.
{
"mcpServers": {
"tickerbot": {
"command": "npx",
"args": ["-y", "@tickerbot/mcp-server"],
"env": { "TICKERBOT_API_KEY": "tb_live_…" }
}
}
}2. Ask in English — The agent compiles the question into tool calls on its own — one prompt, one scan, computed answers back.
You: which large caps went oversold this week while holding their 200-day?
Agent → tickerbot_scan({ q: "rsi_14 < 30 AND above_sma_200
AND market_cap > 1e10" })
← { count: 7, results: [ { ticker, price, rsi_14, … } × 7 ] }
Agent: Seven names match — here's the list, and what stands out…3. Write the agent loop — For a headless agent: market state from Tickerbot, decisions from Claude, execution through your broker as a separate tool you control. The SDK's tool runner drives the loop — each cycle is one call.
import Anthropic from '@anthropic-ai/sdk'
import { betaZodTool } from '@anthropic-ai/sdk/helpers/beta/zod'
import { z } from 'zod'
const anthropic = new Anthropic() // ANTHROPIC_API_KEY from env
const KEY = process.env.TICKERBOT_API_KEY
// Market state: the same scan as every other guide, as a tool
const scanMarket = betaZodTool({
name: 'scan_market',
description: 'Run a SQL WHERE clause over every ticker; returns matching rows.',
inputSchema: z.object({
q: z.string().describe('e.g. "rsi_14 < 30 AND market_cap > 1e10"'),
}),
run: async ({ q }) =>
fetch('https://api.tickerbot.io/v2/scan', {
method: 'POST',
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ q }),
}).then((r) => r.text()),
})
// Execution stays behind YOUR broker tool — market state is read-only
const placeOrder = betaZodTool({
name: 'place_order',
description: 'Buy or sell through the broker.',
inputSchema: z.object({
side: z.enum(['buy', 'sell']), ticker: z.string(), qty: z.number(),
}),
run: async ({ side, ticker, qty }) => {
console.log('ORDER', side, ticker, qty) // …or your broker's API — every action logged
return 'accepted'
},
})
async function cycle() {
const final = await anthropic.beta.messages.toolRunner({
model: 'claude-opus-5',
max_tokens: 16000,
system: 'You manage a small momentum book. Max 5 positions. Explain before ordering.',
messages: [{ role: 'user', content: 'Review the market and act if warranted.' }],
tools: [scanMarket, placeOrder],
})
for (const block of final.content) if (block.type === 'text') console.log(block.text)
}
setInterval(cycle, 5 * 60 * 1000)That separation — execution behind your own broker tool, every action logged — is what makes an agent auditable.
4. Let the market interrupt — Subscribe the conditions the agent cares about and wake it on the webhook instead of polling — app.post('/wake', () => cycle()) — and the market becomes the scheduler.
curl -X POST "https://api.tickerbot.io/v2/scan/subscribe" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e10",
"target_url": "https://your-agent.example.com/wake" }'{
"id": "wh_Clk9b8KHRLk",
"q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e10",
"channel": "webhook",
"target_url": "https://your-agent.example.com/wake",
"signing_secret": "whsec_…",
"status": "active",
…
}MCP: @tickerbot/mcp-server | Every endpoint as a native tool call: Claude, ChatGPT, Cursor, any runtime |
GET /docs/mcp | MCP server install + copy-paste tool definitions for Claude, OpenAI, Gemini, and MCP, auto-generated |
POST /v2/scan | The agent’s workhorse: any question over the whole market, one call |
POST /v2/scan/subscribe | Event-driven agents: wake on state change instead of polling |
questions
Anything that speaks MCP — Claude Desktop and Claude Code, ChatGPT, Cursor, and custom runtimes — via @tickerbot/mcp-server. For a headless agent, the same endpoints are plain HTTP with generated tool definitions for the Anthropic, OpenAI and Gemini SDKs on /docs/mcp.
Context. Hand a model raw bars and it spends its window doing indicator math, badly and expensively, before it can reason; hand it rsi_14 < 30 as a column and the window goes to the decision. Computed state is also auditable: the condition the agent acted on is a string you can read, rerun as of that moment, and log.
Because every action it takes — an alert, a screen result, an order — is a condition over derived values: RSI below 30, price above the 200-day average, volume three times normal. Raw data doesn’t contain those. Something has to compute and refresh them for every symbol, continuously, and keep the history so past answers are reproducible. That’s a data pipeline, not a feature — you either build and operate it, or query one that already runs.
Every US-listed equity plus rates, FX and crypto, with the full schema computed for each ticker. History is all-time on every plan, delisted tickers included, so as-of reads return the market as it stood. Live signals recompute every minute during US market hours and 24/7 for crypto; fundamentals refresh daily.
The Free plan needs no card and carries the full data side: every ticker, every signal, real-time data, all-time history and as-of queries, at 10,000 calls a month and 60 a minute. Paid plans start at $29/mo, remove the monthly cap, and raise the rate limit; webhooks and streaming come with them. Data depth is never a tier lever: every plan sees the same table.
in the wild
What people are saying.
“dude. whoah.”
“Tickerbot is insane. It turns Claude into a quant.”
“Best value for hobbyists and advanced traders alike.”
get started
Free plan. Every ticker, every signal, real-time data, all-time history.