Hesper Atlas for AI agents
A Model Context Protocol endpoint. The whole published record is free to read, with no credential. Today's live signals need a subscription.
Short answer: point any MCP client at https://hesperatlas.com/mcp. Five tools work immediately and cover the entire signal ledger, winners and losers, plus the open book and the per-name history. Four more return today's action layer and need an API key from an active subscription. Everything returned is educational signal data, never personalized investment advice.
1Connect
The transport is Streamable HTTP: one stateless POST carrying JSON-RPC 2.0. There is no stream to open, no session to keep and, in the current protocol, no initialize handshake. MCP clients handle the request metadata automatically. A plain HTTP client can discover the server like this:
curl -s https://hesperatlas.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' \
-H 'Mcp-Method: server/discover' \
-d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{
"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientInfo":{"name":"curl","version":"1"},
"io.modelcontextprotocol/clientCapabilities":{}}}}'
Every current-protocol request repeats that _meta block and sends matching MCP-Protocol-Version and Mcp-Method headers. A tools/call request also sends Mcp-Name. This makes each request independently routable and prevents a proxy and the application from interpreting different operations.
For a subscription key, add one header. Nothing else changes.
curl -s https://hesperatlas.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' \
-H 'Mcp-Method: tools/call' \
-H 'Mcp-Name: get_signal' \
-H 'Authorization: Bearer hsp_live_...' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"get_signal","arguments":{"symbol":"NVDA"},"_meta":{
"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientInfo":{"name":"curl","version":"1"},
"io.modelcontextprotocol/clientCapabilities":{}}}}'
In an MCP client that takes a remote server URL, add https://hesperatlas.com/mcp as a Streamable HTTP server and set the bearer token if you have one. Current clients may use server/discover; domain-level discovery metadata also lives at /.well-known/mcp.json. 2025-era clients remain supported through their automatic initialize / notifications/initialized flow.
2The tools
| Tool | Access | Returns |
|---|---|---|
get_track_record | Free | Headline record plus a bounded page of the open book. Defaults to 10 open positions; use open_limit and open_offset to page, or limit 0 for summary only. |
get_ledger_stats | Free | Per year, per theme, return distribution, holding periods, ten best and ten worst, closed and open cut on identical buckets. |
get_symbol_record | Free | Every closed round trip on one ticker, plus its open position if it has one. |
list_closed_trades | Free | The raw closed ledger, newest first, filterable and paged. |
get_methodology | Free | How the engine decides, what the numbers claim, the known biases. |
get_signal | Key | Today's bot-safe action and target position, confirmed ownership state, current ledger leg, first longer-history entry, risk level and trigger prices. |
list_signals | Key | recent_entries for chronological entries; recent_buys only for entries still actionable now, plus recent sells, at risk, opportunities, undervalued, catch-up and on-deck. |
get_market_context | Key | Regime, breadth, market heat and the cycle read. |
get_model_portfolio | Key | The model book: best N names to own now, risk-weighted. |
For automation, treat action and suggested_position as authoritative. The confirmed state can still read LONG during the interval after price crosses a published sell line and before the closing-bar engine transition is recorded; in that case the tool returns action: EXIT, recommended_state: FLAT and target position 0. Entry clocks are named explicitly: current_leg matches the public ledger window, while first_entry covers the longer active trend.
Calling a key-only tool without one is not an error you have to handle specially: it returns a structured payload naming the price, the sign-up URL and the free tools that cover the same ground, so an agent can simply tell its user what to do.
3Keys
A subscriber creates a key on the account page and copies it once. Keys are stored hashed, so a lost key is replaced, never recovered. Up to ten active keys per account, each revocable on its own.
A key is a read credential and only that. It is accepted on /mcp and refused everywhere else, so a key you hand to a third-party agent cannot cancel your subscription, change your billing, delete your account or create more keys. A stolen session cookie could do all four; a stolen key cannot.
4Limits and fair use
- 120 calls per minute per key. Without a key, 40 per minute per address.
- Every response is served from a completed local snapshot. Nothing an agent can call triggers even a background recomputation. Time-sensitive payloads carry an
as_ofstamp (and the public ledger also carries itsgeneratedstamp). - One subscription covers one user's own agents. Republishing the paid signal layer, or fanning it out to third parties, is what the terms call redistribution and it is not covered. The free tools carry no such restriction: quote the ledger anywhere, and please cite it.
5What the API deliberately does not return
No raw price history. Every field is Hesper Atlas's own derived output: signals, dates, returns, statistics. If you need candles, use a market-data vendor; that is their product, not ours.
No personalized advice, from any tool. The engine does not know your portfolio, tax position, horizon or risk tolerance, and its output is an impersonal publication. Every payload carries a disclaimer field for exactly this reason: relay it.