Tickerbot is the stock market, in SQL. An AI trading agent is a model with the table as its tools: computed answers that fit in context.
Free plan. Every ticker, every signal, real-time data, all-time history.
the recipe
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",
…
}The calls behind it: MCP: @tickerbot/mcp-server · POST /v2/scan · POST /v2/scan/subscribe
questions
The market as one computed table: 20,864+ tickers × 421+ signals, precomputed, refreshed continuously, and queried in SQL. Every read runs live, as of any past moment, or as a push. The main endpoints are /v2/tickers for one symbol’s full row, /v2/signals for every ticker matching a named signal, and /v2/scan for the whole market matching a SQL WHERE clause.
Every US-listed equity plus rates, FX and crypto, with the full schema of 421+ signals computed for each ticker. The data refreshes continuously, and all-time history sits behind every column.
A data API sells inputs (bars, ticks, statements) and leaves the derived values your product actually acts on for you to compute, refresh, and store, per symbol, continuously. Tickerbot sells the finished state: conditions like above_sma_200 are already columns, past answers are already reproducible, and the pipeline between raw data and product is the part you skip.
Computed state: hand a model raw data and its context window fills with math to do; hand it computed answers and the context goes to decisions. A scan returns the tickers matching your condition: a list, not a workload. Every call here is also a native tool call: install the MCP server and Claude, ChatGPT, Cursor, or any MCP runtime queries the market directly.
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.
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.
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.