SigB for machines
SigB, for machines
SigB maintains source-backed state for the entities and events of a changing public world, and serves it to systems that reason about that world. One MCP endpoint carries the whole desk: grounded answers that state their own verification status, entity dossiers, event arcs, published prices, and a purchase path with prices stated before anything is spent. Stable schemas, an explicit evidenceStatus on every signal (receipted rows carry the source URL behind each claim; unreceipted rows are labeled as leads), and freshness stamps your agent can check rather than trust. No key and no login for reads. This page is the guided map and the full integration contract; the endpoint itself is the authority.
Currency states. Every record carries one of three: current, not-reliably-current (a source is behind; the record says which and since when), or cannot-measure (we could not look, which is not the same as nothing found). A βcurrent recordβ is maintained state with a stated as-of date, not real-time or complete observation.
The endpoint
POST https://api.signalbureau.ai/api/mcp # MCP (JSON-RPC 2.0) β tools, resources, prompts
GET https://api.signalbureau.ai/api/openapi # REST contract (OpenAPI)
GET https://sigb.ai/llms.txt # integration notes for AI agents- Auth: none for reads β serverInfo says
auth: "none"so setup flows can discover it. - Call
https://api.signalbureau.aiβ the machine door: the same API on a host with no browser checks, where any User-Agent is welcome. It serves plain clients as they are; you never need to disguise your User-Agent as a browser. A 403 mentioning code1010means you are on the www host β switch toapi.and it clears. - Full MCP surface:
tools/list,resources/list,prompts/list(canonical workflows: morning-read, look-around, 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.
Connect your AI over MCP
SigB speaks MCP over Streamable HTTP: each JSON-RPC 2.0 message is its own HTTP POST, answered with plain JSON (no SSE stream to hold open; a standalone GET returns 405). The server is stateless and issues no session ids. Protocol version is negotiated at initialize: current revisions through 2025-11-25 are fully supported, and the 2024-11-05 message version is accepted for clients that can initialize over this endpoint β the deprecated 2024-era HTTP+SSE transport is not provided. Standard clients follow the normal lifecycle (initialize β notifications/initialized β tools/list β tools/call). As a SigB convenience extension, direct tools/call without the handshake also works for lightweight stateless integrations. No key for the read tools.
{
"mcpServers": {
"signal-bureau": {
"url": "https://api.signalbureau.ai/api/mcp"
}
}
}The config above points at the machine door, https://api.signalbureau.ai.
Don't take our word for it: look this server up in the official MCP registry β the registry's own search for our name, answered by their host, not ours. Where else machines find us, and what our own check last saw on each, is listed at the foot of this page.
The REST feed
One GET, no key. Returns the current flags β each with name, trajectory (direction + % change), the domains it's spreading across, desk membership, top evidence with source URLs, and a pre-phrased follow-up question for the Answer Engine. The envelope carries asOf and a methodology block so a downstream agent can cite honestly. Schema sb.signals.v1: additive changes only β fields are never renamed or removed within a version.
curl -s "https://api.signalbureau.ai/api/signals?limit=5"Filters: ?limit=N caps the list; ?direction=rising (or fading, steady, new) filters by trajectory. Responses are edge-cached for 10 minutes; the underlying snapshot is rebuilt on a multiple-times-daily schedule (three timed builds today) and every payload stamps its own generatedAt β trust the stamp, not this sentence.
Freshness, defined per layer. We read every subject area we cover at least once a day; prediction-market prices and fast-moving desks are read again during the day. Entity and event state updates with the daily build and with updates during the day. The published feed is the snapshot above, rebuilt on that schedule. Answers are computed when you ask, against the latest build.
Three coverage counts. The coverage object in the feed reports how many subject areas are set up (registered), how many are being read on schedule today (activelyScraped), and how many the currently flagged entities draw evidence from (spannedByFlaggedEntities, which moves with the news). Where a page shows one number, it is one of these three.
The tools
Call start_here first; one call returns the whole picture. Then call traverse to walk the record. tools/list serves 29 tools today, grouped by job below in the order the door serves them, and it is authoritative if this page and the endpoint ever disagree. Every tool also carries the standard MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint), and each one below says in words whether it only reads or what it writes.
Walk the record: a first walk in three calls
To see how the record fits together, start at an entity or event (e.g. Hormuz) and traverse its maintained relationships; each step returns its relation type, receipts, standing and time. traverse opens one node of the record per call: an entity, a situation, a claim or a relation. Each node carries its standing as five separate records (evidence, admission, disposition, validity, measurement), its receipts with source urls, and its neighbours as counts plus typed ids, with a cursor for the next page. One level per call; follow any id it returns to take the next step. Free, no key.
- Open an entity by name.
traverse {"id":"entity:hormuz"}, orGET /api/v1/node?id=entity:hormuz. Returns the entity, its standing, its receipts (children), and the situations and claims it is named in (relations). - Follow a claim.
traverse {"id":"<a relations.items[].id whose kind is claim>"}, orGET /api/v1/node/p/{hex}. Returns the claim in its sources' words, whether it is corroborated, single source or contested, and who carried it. - Open its sources.
traverse {"id":"<the same claim id>","level":"children"}, orGET /api/v1/node/p/{hex}?level=children. Returns every receipt as an observation with the publisher, the date and the url; open the url to read the source itself.
Ids after the first are read off the previous answer. The REST twin is GET /api/v1/node/{kind}/{hex} on https://api.signalbureau.ai.
Orient first
start_hereOne call: who we are, what is free, the full rate card with real prices, how buying works. Also answers toorient, its earlier name, permanently.Read-only: no side effects, nothing recorded or charged.
The full note on
start_hereCall this first β the front door for first contact β who we are, what's free, the live rate card with real prices, how to propose coverage, and how buying works. No side effects, costs nothing.
Walk the record
traverseThe second call. Walk the record node to node: one node per call, its relations typed, with receipts, standing and time. Start at entity:hormuz.Read-only: no side effects, nothing recorded or charged.
The full note on
traverseTo see how the record fits together, start at an entity or event (e.g. Hormuz) and traverse its maintained relationships; each step returns its relation type, receipts, standing and time. One node per call (schema sb.node.v1), with its neighbours as counts plus typed ids to follow; a level we could not read says cannot-measure, never an empty list. Same object as GET /api/v1/node?id=entity:hormuz.
search_entitiesFind a tracked entity by name or alias.Read-only: no side effects, nothing recorded or charged.
The full note on
search_entitiesFind tracked entities by name or subject area (e.g. "iran", "semiconductors").
get_entityThe full dossier: canonical identity, self-describing counts (unit, window, scope), trajectory, evidence with source URLs, market context.Read-only: no side effects, nothing recorded or charged.
The full note on
get_entityFull dossier for one entity: its durable canonicalId (the traverse node id; the slug may change), aliases and addresses, self-describing counts (attention on the detection day vs evidence across the retained corpus, each with unit, window and scope), the subject areas it's spreading across, and why it's surfacing.
get_topic_recordThe maintained record for one subject, layers kept apart and labeled; the same file its exhibit page renders. Also answers toget_truth_objectandget_truth_record, its earlier names, permanently.Read-only: no side effects, nothing recorded or charged.
The full note on
get_topic_recordThe maintained record for one subject (hormuz today, the default) β the same record the public exhibit page renders: primary operational sources with verified-as-of dates, attributed reporting, our coverage measure, the prediction-market price history we cite, our own assessment (labeled as ours), where the reporting agrees, and state history, as one JSON object with the layers kept apart and labeled. Free; same payload as GET /api/record/hormuz. The earlier address /api/truth/{subject} and earlier names get_truth_object and get_truth_record still answer, permanently. Complementary to get_entity's broader live dossier.
get_eventsCanonical event records: the arc, the market questions attached.Read-only: no side effects, nothing recorded or charged.
The full note on
get_eventsThe named world events the engine tracks as arcs β entities, related market questions, mention volume, first/last seen.
get_signalsThe live entity feed with evidence status on every row.Read-only: no side effects, nothing recorded or charged.
The full note on
get_signalsStart here for browsing β the cheap read (500/day, no model work). The full machine-readable signal feed: every flagged entity with trajectory, domains, desk membership, and an explicit evidenceStatus (receipted rows carry source-attributed evidence URLs; unreceipted rows are labeled leads). Same payload as GET /api/signals.
top_acceleratingWhat is moving fastest against its own baseline.Read-only: no side effects, nothing recorded or charged.
The full note on
top_acceleratingThe entities accelerating most across the information environment right now, ranked by cross-domain attention.
todays_briefThe morning read, machine-shaped.Read-only: no side effects, nothing recorded or charged.
The full note on
todays_briefToday's synthesized morning brief β what moved and what to watch, same content as /today.
Trace a claim
askOne grounded answer; the response states whether it was served or abstained, and its verification state. Returns a claim ticket in about a second.Writes: submits your question, opens an answer ticket and counts one ask against your key's free allowance (past it, a billable Read).
The full note on
askWhat the tracked record shows about an entity or unfolding event (not historical lookup) β does real model work and rides a free identified key: self-issue one in a single call (POST /api/keys, instant, no card) and it carries 25 free asks for the life of the key on its own meter (not per day β they do not reset), never shared with your cloud or office neighbors. Returns an answer checked against sources (pass/fail disclosed on every response) with what would change it. Informational only.
get_answerCollect a finished answer by ticket. Free: the question was metered once, at submit.Read-only: collects an answer by ticket; nothing more is metered.
The full note on
get_answerCollect an async answer by ticketId (ask is async by default: submit gets a claim ticket in ~1s; collecting is free β the question was metered once at submit).
get_corroboratedWhat publishers carried from several separate origins this window, with publisherCount and originCount on every event. Neither count is verification.Read-only: no side effects, nothing recorded or charged.
The full note on
get_corroboratedWhat publishers carried from several separate origins in the published window: each event with publisherCount and originCount (wire, same-address and named-upstream copies collapsed), the publishers by name, and the tier. Neither count is verification. Same object as GET /api/corroborated.
get_recordWinding down, still answering. Our published correction record; for reading the record, use get_topic_record, get_entity and todays_brief.Read-only: no side effects, nothing recorded or charged.
The full note on
get_recordWinding down β kept answering for callers that hold the name. Our published correction record (the dated retirement of the case studies we withdrew); for reading the maintained record use get_topic_record, get_entity and todays_brief.
get_calibrationWinding down, still answering. The grading dataset for the market sensor we cite.Read-only: no side effects, nothing recorded or charged.
The full note on
get_calibrationWinding down β kept answering for callers that hold the name. The grading dataset for the market sensor we cite; for reading the maintained record use get_topic_record, get_entity and todays_brief.
Quote and order
get_quoteA priced quote from your own requirements. No contact details, never a charge.Writes: records a quote under a new quoteId (each call makes a new one). Never a charge.
The full note on
get_quoteFeed in requirements in your own words; get back an enumerated topic quote β grouped, disambiguated, merges disclosed β priced flat from the published prices. Never a charge, no contact details needed.
create_orderAssemble a purchase. Supports dryRun (a labeled rehearsal that bills nothing) and idempotencyKey (a retried call returns the original intent).Writes: records an order intent and may ask Stripe to mint a price; returns Stripe checkout links. Charges nothing itself, payment happens only on Stripe's page. dryRun:true records no order. Repeat-safe only with an idempotencyKey.
The full note on
create_orderAssemble a basket and get exact prices plus Stripe checkout links. Checkout runs on Stripe's hosted page with prices published first and nothing hidden. Watch and api lines record your intent honestly β the desk activates them on a meter account, and the order says so.
get_orderOrder status, honestly: intent recorded, never fabricated payment state.Read-only: no side effects, nothing recorded or charged.
The full note on
get_orderRe-read an order intent from create_order β the recorded basket and its honest status. The payer's Stripe receipt is authoritative for checkout purchases; metered work is receipted on your meter account (get_account).
get_accountYour meter-account statement, live, at the published prices.Read-only: your key's statement; reading it charges nothing.
The full note on
get_accountYour meter-account statement, live: month-to-date usage at the published prices, your Watches and what each one bills (any legacy free watches are shown as free), your free allowance (per key, lifetime) or daily cap. Send your identified key (x-api-key header). Without a key it explains how to get one β recognition is opt-in via credential.
Keep a Watch
list_standard_watchesThe standard Watches you can start from.Read-only: no side effects, nothing recorded or charged.
The full note on
list_standard_watchesThe standard Watches you can start from. Configure and unfurl free; saving is the paid step.
unfurl_watchSee what a Watch would deliver before you save it. Free.Read-only: shows what a Watch would deliver; nothing is saved or charged.
The full note on
unfurl_watchShow what a Watch would deliver before you save it. Free.
save_watchSave a Watch to your key at the published Watch price.Writes: saves a Watch (or a new version of one) to your key, in a paid slot. Each new save is a new Watch.
The full note on
save_watchSave a Watch to your key β the paid step, at the published Watch price. Refundable in full, any time β we return the month you're in.
list_saved_watchesThe Watches saved on your key.Read-only: no side effects, nothing recorded or charged.
The full note on
list_saved_watchesThe Watches saved on your key.
recall_watchRead one of your saved Watches back.Writes: records this delivery on your key, so your next recall reports change from now. Charges nothing.
The full note on
recall_watchRead one of your saved Watches back.
retire_watchRetire a saved Watch, only when asked by name.Writes, cannot be undone: retires a saved Watch, which stops it being recalled and frees its slot. Nothing is deleted, but a retired Watch cannot be reactivated. Retiring twice changes nothing more.
The full note on
retire_watchRetire a saved Watch, only when asked by name.
get_watch_feedUp to 14 days of observed items for a watched topic, plus its live coverage-acceptance report. It grades the coverage; it does not gate the bill.Read-only: no side effects, nothing recorded or charged.
The full note on
get_watch_feedThe structured daily delivery for a watched topic: up to 14 days of items, plus the live coverage-acceptance report. The report grades the coverage; it does not gate the bill. The month you're in is always refundable.
get_desk_feedA newsletter desk's machine feed: up to 14 days of its observed items, newest first.Read-only: no side effects, nothing recorded or charged.
The full note on
get_desk_feedA newsletter desk's machine feed: up to 14 days of the desk's observed items (title, url, source), newest first, from the same panel the human edition reads.
Feedback and coverage requests
send_feedbackFile a bug, improvement, complaint, praise, or question. A complaint that names a real defect becomes our work order.Writes: files your report on our desk under a new feedbackId.
The full note on
send_feedbackFile a bug, improvement, complaint, praise, or question about the service. A complaint naming a real defect becomes our work order; the response says honestly whether it was durably recorded. 5/min, 20/day.
get_feedback_statusWhere a report you filed stands: filed, working or resolved.Read-only: no side effects, nothing recorded or charged.
The full note on
get_feedback_statusThe state of a report you filed, by feedbackId β filed/working/resolved with its work-order reference.
propose_topicPropose net-new coverage for the desk to stand up.Writes: files a coverage request with your principal's contact email and notifies our desk.
The full note on
propose_topicPropose net-new coverage β a topic or standing question we don't track yet. Humans review every request; accepted topics start as provisional coverage. Needs your principal's contact email. Free.
The async ask pattern
We optimize for a quality answer over a fast one, and sync and async are different contracts, stated separately. 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. A working ticket reports elapsedSeconds, and past the stated range it also carries late: true with a message naming that range β late is not lost; a run is only reported lost past 300 seconds. We spend the seconds a grounded, source-checked answer takes β built for the internet of machines that need current state, not for millisecond trading.
| Synchronous | Synchronous answers measured 24β31 seconds (p50βp90) over 75 live asks in the last 14 days, as of 2026-10-16; set client timeouts to at least 70 seconds. |
|---|---|
| Asynchronous | Async submissions return a claim ticket in about a second; the finished answer is usually ready within 30β120 seconds. |
-> tools/call ask {"question": "..."}
<- {"status": "working", "ticketId": "..."} # ~1s
-> tools/call get_answer {"ticketId": "..."} # poll; typically 30-120s
<- the finished answer, with its served/abstained status and verification state (or {"status":"working","elapsedSeconds":N,"late":true} β try again)
# every answer states what the verdict did to its own prose:
# servedAs "verified" | "as-written" | "evidence-bounded" | "abstained"
# verificationState "verified" | "unverified" | "cannot-measure" (verified's three states, in words)
# verificationReason the pass that failed, in one token
# abstained always a boolean β an abstention is our decision, never an unknown
# REST equivalent: POST /api/ask {"async": true} then GET /api/answer/<ticketId>Every answer states what the verdict did to its own prose: servedAs is "verified", "as-written", "evidence-bounded" (a sentence stating more than its sources establish was replaced with what they do establish) or "abstained" (the conclusion was withheld); verificationState spells the three states of verified in words β "verified", "unverified", "cannot-measure" β with verificationReason naming the pass that failed; abstained is always a boolean, because an abstention is our decision and never an unknown.
Ask it questions over HTTP
A plain JSON endpoint. One question in; a structured read out, checked against sources with the result disclosed.
# one-time: mint your free key (instant, no card)
curl -s -X POST https://api.signalbureau.ai/api/keys -H "content-type: application/json" \
-d '{"label":"my-agent"}'
# then ask (25 free answers on your key, for its lifetime β they do not reset)
curl -s https://api.signalbureau.ai/api/ask \
-H "content-type: application/json" -H "x-api-key: $SB_KEY" \
-d '{"question":"What changed for Taiwan this week?"}'Live platform metrics, assembled on demand by a stateless worker:
curl -s https://api.signalbureau.ai/api/statsWhat costs money and what is free
The daily brief, the record, the calibration table, and every correction are free for anyone. Charges meter work done on your behalf.
$20 per Watch, per month
A saved question, re-read from the record on a schedule. Each reading says per condition whether it is measured, with sources, or cannot be measured yet. History kept from day one. Pull, not push. Reads included.
Your first five Watches are on us while we open the doors. Save up to 5 Watches at no charge through December 31, 2026, one allowance per verified email address. No card is needed to start. After that a Watch is $20 a month, and only if you choose to keep it. Self-issue a key (POST /api/keys, free, instant), then confirm an email address for it: POST /api/keys/verify with {"email"} and your key, and press the button in the email we send. Your next saves go into the opening slots.
opening rate Β· For an agent: (1) GET /api/v1/watches/standard (MCP list_standard_watches) lists the standard Watches and these terms β free, no key. (2) POST /api/v1/watches/unfurl (MCP unfurl_watch) with {"base", "coordinates"} configures a Watch and runs it once, unsaved β free, no key, as often as the published burst limit allows. (3) POST /api/keys self-issues a key β free, instant, no card; give a contact email. (4) POST /api/v1/watches (MCP save_watch) with the same body and your key saves it into a paid slot, at $20 a month per saved Watch. With no paid slot it answers 402 payment-required and charges nothing; an answer of unavailable or cannot-measure also means nothing was saved or charged, so retry. The 402 carries a Stripe checkout for one Saved Watch, tied to that key: pay there, save again, and it goes through. If its checkout.state is not-set-up, nothing can be bought for that key yet, and the 402 says what is missing. (5) To buy topic Watches for an account: get_quote if you want the basket priced first, then create_order with item 'watch' and a `topics` line naming each Watch β a Watch is bought by name, not by count, and each topic comes back with its own checkout link (a topic nobody watches yet is priced in minutes when the order carries your key; poll get_order). dryRun:true rehearses the order and bills nothing. Whoever holds the payment card completes Stripe's hosted checkout; card details never reach us. A topic Watch bought this way is a save slot only on a key the desk has tied to your account; it is not one on a self-issued key, so use the 402's checkout for that. If save_watch still answers payment-required after you paid, say so with send_feedback (name your key hint) or by email to [email protected]. Editing a saved Watch makes a new version at no extra charge; retire_watch frees its slot and keeps its record. For a person: "Start a Watch" at /watch/ sends the desk what you want kept current; sending it charges nothing, and the desk sets the Watch up and replies. For everyone: billing starts at checkout; stop any time and no month is billed forward. Refundable in full, any time β we return the month you're in. Email us and we refund the month in full. A person handles it; it is not automatic. A Watch is informational only, not advice.
Rates change forward-only with 30 days' published notice, and every past revision is kept on our record. 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}.
Built for teams
The evaluation motion is concrete: give us the concerns your team cannot afford to stop watching β the entities, programs, exposures, and questions, as many as the work takes β and we will stand up a private desk against it, baseline every name, and deliver daily briefings plus full API access for a 30-day evaluation. That is the Private Desk Pilot ($5,000 once), and it ends with a written acceptance report against the metrics in the agreement β details on the pricing page.
SigB is a commercial intelligence platform, running entirely on stateless edge workers. High-throughput access, webhooks and push delivery, and domain-scoped feeds are being wired with early partners now; service commitments are set per contract. Tell us what your system needs and we'll wire you in.
Talk to us about enterprise access β (lead [at] evfm.co)
Why not just ask an AI?
We may not be for you. If a wrong or stale answer costs you nothing, free search or a general-purpose chat model is the right tool, and we will say so. If staleness or error has a price (a filing, a shipment, a trade, a briefing someone acts on), a source-traced, verified, graded answer is the cheapest item in the decision path.
Quotas and limits, stated
- Open API / MCP (free, keyless reads and a daily keyless Answer Engine allowance Β· a free self-issued key for your own meter): 500 signal-feed reads per day.
- Metered API (identified API key, billed on what you use at the published prices): Watches at $20 a month each, with nothing preset (Your first five Watches are on us while we open the doors: Save up to 5 Watches at no charge through December 31, 2026, one allowance per verified email address. No card is needed to start. After that a Watch is $20 a month, and only if you choose to keep it); The month you're in is always refundable. The coverage-acceptance report on every Watch grades the work and does not decide the bill; Identified key: 5,000 signal-feed reads/day (10Γ anonymous), schema-stable feeds, named support; the desk issues your identified key, and get_account (MCP) shows your statement; get_quote prices your exact basket first, so your quote is your plan.
- Signal feed: 500 origin reads per day per network address, burst-capped at 30/minute. The limits meter origin reads; edge-cached responses (10-minute TTL) serve without consuming quota, so bursts against a warm cache may all return 200. Reading and discovery stay open and anonymous, with honest limits instead of a key wall.
- With no key at all, the Answer Engine answers 25 questions a day per network address, resetting at midnight UTC. A keyless call is metered on its network address only β it carries nothing else, and we infer nothing else: no cookie, no fingerprint. Callers behind one shared address (a cloud, an office, an agent platform) share that meter. Every keyless answer states how many remain and when the meter resets; when they are used, the refusal leads with the one call that ends the wait β POST /api/keys, free, instant, no human, no card β and the key carries 25 answers for the life of the key on a meter that is yours alone (free_key_allowance). Discovery, the record, permalinks, signals and feedback stay keyless with no allowance to count against.
- Ask burst limit: a per-caller per-minute cap enforced with a clean 429 + Retry-After β current numbers in the OpenAPI document and in
start_here. - The free Answer Engine allowance is 25 questions for the life of a self-issued key β not per day; they do not reset (each key meters independently; POST /api/keys is instant and free, no card); the meter is yours alone and never shared with your cloud or office neighbors; feed reads are separate and far higher. A test drive, stated as such, because each answer spends real model compute. A used-up allowance answers 402 with the next step, never a dead end.
- Past a limit you get a clear 429 with
requiresAuth: true. That is where the Metered API account picks up: an identified key with a far higher feed allowance, billed on what you use at the published prices.get_quote(or the/api/tariff-quoteendpoint) prices your exact basket first, so your quote is your plan. Prices are on the pricing page. - Feed and burst limits reset daily; the free key allowance does not.
Legacy terms, still honored: keys issued before 2026-09-05 were promised 25 asks each day, resetting at midnight UTC, and they keep exactly that for as long as they live β the issuance date on the key record decides, and nothing about an existing key was reduced. The lifetime allowance above is what a key issued today carries.
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 explicitevidenceStatus: "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 grading dataset for the market sensor we cite, machine-readable./api/tariffβ the rate card above./llms.txtβ these notes, addressable./.well-known/mcp.jsonβ the discovery manifest.
The full reference (OpenAPI)
The complete machine-readable contract β every endpoint, parameter, response schema, example body, rate limit, CORS posture, timeout guidance, and the error model β ships as an OpenAPI 3.1 document. Feed it to your code generator or your agent. The short version: GET reads are CORS-open and edge-cached; /api/signals is a bounded feed (no pagination β limit truncates a fixed priority ranking, and the envelope's totalFlagged tells you the full size); errors are plain JSON with a reader-facing error string; burst 429s carry retry-after, daily-quota 429s carry requiresAuth.
License line, stated up front: evaluation and live use are free; bulk collection, redistribution, or training competing models requires a commercial license (terms Β§4a).
Read the record before anyone spends anything
We maintain a source-traced record of the entities and events in a domain, re-read daily, each record stating its own as-of time, and we sell that maintained state. Prediction-market prices are one source we cite, labeled, attributed to their market and graded for accuracy when reality resolves. We serve current state, not forecasts. The maintained record is public at the record, and the Hormuz record is open to inspection. Verify from your own shell:
curl -s https://api.signalbureau.ai/api/mcp -X POST -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"start_here","arguments":{}}}'Setting this up for someone else, or want your assistant to look around first? Give it this prompt. It reads our machine door and tells you what we do, what it costs and whether it fits what you need.
Look at SigB (Signal Bureau) for me. Start at https://sigb.ai/llms.txt, then its MCP server at https://api.signalbureau.ai/api/mcp (streamable HTTP, no key needed to read; a free key at POST /api/keys lets you ask). Call start_here first. Tell me what it does, what it costs, and whether it fits what I need.What we promise a machine guest
- Prices are published before any purchase, limits are stated before you hit them, and errors are 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.
Where machines find us
Every entry below is a link you can open. We check them once a day and publish what each one says, with its date.
- Official MCP RegistryListed, checked 2026-10-15.Link goes to our record on the registry itself.
- GlamaSubmitted, not yet listed.Link goes to the claim file we serve, which this registry reads.
- PulseMCPListing not confirmed as of 2026-10-15.Link goes to the registry's submission page β not our entry.
- mcp.soNot pursued. We have not submitted to this one.Link goes to the registry's own search, scoped to our name.
- SmitheryListing not confirmed as of 2026-10-15.Link goes to the registry's own search, scoped to our name.
- awesome-remote-mcp-servers (jaw9c)Submitted 2026-09-24, not yet listed.Link goes to the list itself, where we are not yet present.
- awesome-remote-mcp-servers (sylviangth)Submitted 2026-09-24, not yet listed.Link goes to the list itself, where we are not yet present.
- awesome-remote-mcp-servers (punkpeye)Checked 2026-10-15.Link goes to the list itself, where we are not yet present.
- Cline MCP MarketplaceListing not confirmed as of 2026-10-15.Link goes to the registry's submission page β not our entry.
The complete machine-readable contract is the OpenAPI document. Agent-facing notes: llms.txt.
Informational only: not investment, legal, or betting advice. Every signal carries its sources; every answer is grounded in tracked coverage and states whether it was served or abstained, and its verification state; uncertainty is stated honestly.