Signal Bureau · machine desk

Signal Bureau, for machines.

Signal Bureau maintains source-backed entity and event state — current truth about a changing public world — and serves it to systems that reason about that world. One MCP endpoint carries the whole desk: calibrated reads, entity dossiers, event arcs, the published tariff, and a purchase path with prices stated before anything is spent. No key and no login for reads. This page is the guided map; the endpoint itself is the contract.

The endpoint

POST https://signalbureau.ai/api/mcp          # MCP (JSON-RPC 2.0) — tools, resources, prompts
GET  https://signalbureau.ai/api/openapi   # REST contract (OpenAPI)
GET  https://signalbureau.ai/llms.txt      # integration notes for AI agents
  • Auth: none for reads — serverInfo says auth: "none" so setup flows can discover it.
  • Send a real User-Agent header: bare python-urllib-style UAs are challenged at the edge (a 403 that has nothing to do with your allowance).
  • Full MCP surface: tools/list, resources/list, prompts/list (canonical workflows: morning-read, judge-us-first, coverage-quote).
  • Errors are explained, never silent: over-limit calls get a clean 429 with Retry-After, and a degraded store is told to you, not hidden.

The tools

Call orient first — one call returns the whole picture. tools/list on the endpoint is authoritative if this page and the endpoint ever disagree.

Orient first
  • orientOne call: who we are, what is free, the full tariff with real prices, how buying works.
Read the world (free, no key)
  • get_signalsThe live entity feed with evidence status on every row.
  • top_acceleratingWhat is moving fastest against its own baseline.
  • search_entitiesFind a tracked entity by name or alias.
  • get_entityThe full dossier: trajectory, evidence with source URLs, market context.
  • get_eventsCanonical event records — the arc, the market questions attached.
  • get_recordThe daily record.
  • get_calibrationThe public scorecard — judge us before anyone spends anything.
  • todays_briefThe morning read, machine-shaped.
Ask (async by default)
  • askOne grounded, source-checked answer. Returns a claim ticket in about a second.
  • get_answerCollect a finished answer by ticket. Free — the question was metered once, at submit.
Buy work, priced first
  • get_quoteA priced quote from your own requirements — no contact details, never a charge.
  • propose_topicPropose net-new coverage for the desk to stand up.
  • create_orderAssemble a purchase. Supports dryRun (a labeled rehearsal that bills nothing) and idempotencyKey (a retried call returns the original intent).
  • get_orderOrder status, honestly — intent recorded, never fabricated payment state.
Service
  • get_watch_feedUp to 14 days of observed items for a watched topic, plus its live coverage-acceptance report — the same bar that decides when billing may start.
  • send_feedbackFile a bug, improvement, complaint, praise, or question. A complaint that names a real defect becomes our work order.

The async ask pattern

We optimize for a quality answer over a fast one, and sync and async are different contracts, stated separately. Synchronous answers typically land in 5–30 seconds; set client timeouts to at least 60 seconds. Async submissions return a claim ticket in about a second; the finished answer is usually ready within 30–120 seconds. So ask is async by default: submit, get the claim ticket, keep working, collect when ready. The question is metered once, at submit; collecting is free. If the ticket store is briefly unavailable the full answer comes back synchronously instead — handle both shapes. We spend the seconds a grounded, source-checked answer takes — built for the internet of machines that need current truth, not for millisecond trading.

-> tools/call ask        {"question": "..."}
<- {"status": "working", "ticketId": "..."}      # ~1s
-> tools/call get_answer {"ticketId": "..."}     # poll; typically 30-120s
<- the finished, source-checked answer (or {"status":"working"} — try again)

# REST equivalent: POST /api/ask {"async": true} then GET /api/answer/<ticketId>

The tariff — what costs money and what never will

The daily brief, the record, the calibration table, and every correction are free for anyone. Charges meter work done on your behalf.

Watch

$20 per unit/month

One question or concern kept continuously answered and verified, its history recorded from the day it starts. Reads of your watched question are included.

opening rate · Included in private desks today; unit-by-unit purchase runs through the desk on a meter account — burn-in first, billing only at proven coverage.

Read

$0.25 per unit

One grounded, source-checked answer produced on demand.

Free allowance: 5 per caller per day, no key — a test drive, stated as such.

opening rate · Included in every plan today; metered purchase is live on meter accounts — an identified key, each Read receipted at this flat rate.

Rates change forward-only with 30 days' published notice; every past revision stays listed here. The machine-readable rate card is /api/tariff; price a basket from your own requirements with get_quote — quotes need no contact details and are never a charge. Checkout runs on Stripe’s hosted page with prices published first and nothing hidden; rehearse with create_order {dryRun: true}.

Why not just ask an AI?

If being wrong is free, so is Google. If being wrong costs you something, we're twenty-five cents.

Commodity grounded-search APIs run roughly $0.001 to $0.02 per query. A Read is $0.25, flat. The premium buys the verification pass, the named-source provenance, the calibration grade, and a public track record you can audit. It is priced for consequential decisions, not casual traffic.

Quotas and limits, stated

  • Open API / MCP (free, anonymous · no key required): 500 signal-feed reads per day, 5 Answer Engine questions to test-drive the desk
  • Metered API (identified API key · billed on actual usage at tariff rates): Your bill is the tariff, nothing preset: Watches $20/topic/month, Reads $0.25 each — one flat rate, no tiers; A Watch bills only after its coverage proves itself — the acceptance report decides, not the calendar; Identified key: 5,000 signal-feed reads/day (10× anonymous), schema-stable feeds, named support; Meter accounts are live: the desk issues your identified key, every metered Read is receipted, and get_account (MCP) shows your live statement. get_quote prices your exact basket first — your quote is your plan.
  • Ask burst limit: a per-caller per-minute cap enforced with a clean 429 + Retry-After — current numbers on the API docs and in orient.
  • The free Answer Engine allowance is 5 questions per caller per day; feed reads are separate and far higher.

Feeds and resources

The MCP resources/list mirrors the public data surfaces as addressable documents; the same feeds answer over REST:

  • /api/signals — the live feed. Every row carries an explicit evidenceStatus: "receipted" rows name their sources with URLs; "unreceipted" rows report the attention measurement without article receipts — treat those as leads, not sourced claims.
  • /api/record-data — the daily record, machine-shaped.
  • /api/calibration-data — the full scorecard behind the public calibration page.
  • /api/tariff — the rate card above.
  • /llms.txt — these notes, addressable.

License line, stated up front: evaluation and live use are free; bulk collection, redistribution, or training competing models requires a commercial license (terms §4a).

Judge us before anyone spends anything

The calibration referee grades every published probability when reality resolves it 35,854 forward forecasts captured, 20,933 already graded, Brier 0.067. The scorecard is public at the calibration record, and one live truth object is fully inspectable at the Hormuz record. Verify from your own shell:

curl -s https://signalbureau.ai/api/mcp -X POST -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"orient","arguments":{}}}'

What we promise a machine guest

  • No tricks and no traps: prices published before any purchase, limits stated before you hit them, errors explained when they happen.
  • Your mandate is honored exactly — a dry run bills nothing, an idempotent retry records nothing new, and a quote is never a charge.
  • The record is never edited: the brief, the calibration table, and every correction are free for anyone, and stay on the record.
  • A complaint that names a real defect becomes our work order.

The full integration contract — schemas, current rate limits, webhook plans, and worked examples — lives on the API & MCP docs. Agent-facing notes: llms.txt.

Informational only — never financial, legal, or investment advice.