Truth Bear MCP
Truth Bear is a data service that reports facts with official sources and timestamps, providing verified readings from public agencies such as river gauges, air quality, and power-grid stress. It offers an MCP server for machine callers to access these verified data points, ensuring buyers can check readings against official sources directly.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://api.truthbear.co/mcpWhat its tools do
5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Retrieve official readings from public agencies like river gauges and air quality monitors
- Access verified data on power-grid stress and crop conditions
- Check shipping chokepoint transits and regulatory filings
- Obtain fact-checked data with official source URLs and timestamps
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- truthbear-gauge 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 5 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
5 advertised
verify_citation — Verify a Truth Bear record (free)
FREE. Given a record_hash from any Truth Bear record, look it up and recompute the canonical hash server-side, returning whether it is a genuine Truth Bear official record plus a plain-language reverse lookup of what exactly that hash attests. Use this to check a citation you were handed by another agent or document BEFORE relying on it. No payment, no API key.
{
"type": "object",
"required": [
"record_hash"
],
"properties": {
"record_hash": {
"type": "string",
"description": "sha256:<64 hex>, or a >=8-hex prefix as posted publicly"
}
}
}{
"type": "object",
"required": [],
"properties": {
"note": {
"type": "string",
"description": "Screening-level disclaimer."
},
"error": {
"type": "string",
"description": "Present only when the call failed; human-readable reason."
},
"found": {
"type": "boolean",
"description": "Whether a published Truth Bear reading matches this hash."
},
"scope": {
"type": "string",
"description": "What this hash does and does not attest."
},
"entity": {
"type": [
"string",
"null"
],
"description": "Object id the reading is about."
},
"endpoint": {
"type": "string",
"description": "Always \"gauge/verify\"."
},
"verified": {
"type": "boolean",
"description": "Whether the canonical hash recomputed server-side matches the one supplied."
},
"signal_id": {
"type": [
"string",
"null"
],
"description": "e.g. hydrology.river-level"
},
"ots_status": {
"type": [
"string",
"null"
],
"description": "Per-record field, unused: individual records are not stamped one by one. Anchoring happens per write-batch - see GET /gauge/anchor?hash= for the Merkle inclusion proof and, once the calendar confirms, the Bitcoin block number."
},
"source_ref": {
"type": [
"string",
"null"
],
"description": "URL of the official source record."
},
"undetermined": {
"type": "boolean",
"description": "true when the lookup itself failed (e.g. DB unavailable) - NOT a verdict of \"fake\"."
},
"record_status": {
"type": [
"object",
"null"
],
"properties": {
"note": {
"type": "string",
"description": "Why the record is kept queryable on purpose."
},
"since": {
"type": [
"string",
"null"
],
"description": "UTC ISO second-precision timestamp of when we flagged it."
},
"state": {
"type": "string",
"description": "\"active\" or a withdrawal state such as \"quarantined\"."
},
"reason": {
"type": [
"string",
"null"
],
"description": "Short machine-readable reason code."
}
},
"description": "Three-state disclosure. state=\"active\" for a normal record; a non-active state (e.g. \"quarantined\") means the record is genuine and its hash still verifies, but we have since flagged it as not fit for delivery - do NOT rely on the reading itself. Carries since (UTC ISO) and reason when non-active."
},
"snapshot_date": {
"type": [
"string",
"null"
],
"description": "YYYY-MM-DD of the reading."
},
"reverse_lookup": {
"type": "string",
"description": "Plain-language statement of exactly what this hash attests."
},
"recomputed_hash": {
"type": [
"string",
"null"
],
"description": "sha256:<64 hex> recomputed from the stored record."
},
"hash_core_version": {
"type": [
"integer",
"null"
],
"description": "Version of the canonical hash core used."
},
"is_truth_bear_record": {
"type": [
"boolean",
"null"
],
"description": "true / false, or null when the check could not be run (see undetermined)."
},
"how_to_check_a_claimed_value": {
"type": "string",
"description": "Present when found: how to check a value someone claims."
}
},
"description": "Verdict for one record_hash. On failure this object is an error report instead (see error/detail).",
"additionalProperties": true
}{
"title": "Verify a Truth Bear record (free)",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}find_signal — Find which signals/entities are covered (free)
FREE coverage + freshness manifest: which signal_id lines exist, how many entities each covers, and fresh/recent/stale counts - so you can check "is my entity covered and how fresh" BEFORE paying. Optional filters: industry, signal_id, entity.
{
"type": "object",
"properties": {
"full": {
"type": "boolean",
"description": "true = per-entity detail (larger); default compact summary"
},
"entity": {
"type": "string",
"description": "object id, e.g. a USGS site id"
},
"industry": {
"type": "string",
"description": "restrict to one domain, e.g. hydrology, agriculture, energy"
},
"signal_id": {
"type": "string",
"description": "e.g. hydrology.river-level"
}
}
}{
"type": "object",
"required": [],
"properties": {
"note": {
"type": "string",
"description": "Screening-level disclaimer."
},
"error": {
"type": "string",
"description": "Present only when the call failed; human-readable reason."
},
"detail": {
"type": "string",
"description": "Present on some failures: the upstream endpoint's own error text."
},
"nature": {
"type": "string",
"description": "What this manifest is."
},
"totals": {
"type": "object",
"description": "signal_ids / industries / distinct_entities / freshness counts across the whole catalogue."
},
"signals": {
"type": "array",
"items": {
"type": "object",
"properties": {
"checkup": {
"type": "object",
"description": "Latest patrol result for the line (full mode)."
},
"factory": {
"type": "string",
"description": "Internal collector name (full mode)."
},
"entities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"description": "Object id."
},
"freshness": {
"type": "string",
"description": "fresh | recent | stale."
},
"entity_name": {
"type": "string",
"description": "Human-readable object name."
},
"observed_at": {
"type": "string",
"description": "ISO timestamp of the observation."
},
"overdue_days": {
"type": "number",
"description": "How many days past the declared cycle this object is."
},
"vintage_days": {
"type": "number",
"description": "Age of the underlying source vintage in days."
},
"update_status": {
"type": "string",
"description": "on_schedule | overdue | not_published | unknown, for this object."
},
"data_age_hours": {
"type": "number",
"description": "Age of the observation in hours."
}
},
"additionalProperties": true
},
"description": "Per-entity detail; present only when full=true."
},
"industry": {
"type": [
"string",
"null"
],
"description": "Domain the line belongs to; null when the line is not classified."
},
"signal_id": {
"type": "string",
"description": "e.g. hydrology.river-level"
},
"description": {
"type": "string",
"description": "What the line measures (full mode)."
},
"record_type": {
"type": "string",
"description": "Kind of record the line emits (full mode)."
},
"update_status": {
"type": "string",
"description": "on_schedule | overdue | not_published | unknown."
},
"entities_count": {
"type": "integer",
"description": "How many objects the line covers."
},
"temporal_cycle": {
"type": "string",
"description": "Publication cycle declared by the upstream source (full mode)."
},
"signal_id_label": {
"type": "string",
"description": "Human-readable line name (full mode)."
},
"freshness_counts": {
"type": "object",
"description": "fresh / recent / stale counts for the line."
},
"max_overdue_days": {
"type": "number",
"description": "Largest overdue gap in the line, in days."
},
"latest_observed_at": {
"type": [
"string",
"null"
],
"description": "ISO timestamp of the newest observation; null when the line has never published."
},
"update_status_counts": {
"type": "object",
"description": "Per-status entity counts."
}
},
"additionalProperties": true
},
"description": "One entry per signal line. Compact by default; pass full=true for per-entity detail."
},
"cache_note": {
"type": "string",
"description": "What the cache does and does not affect."
},
"cache_ttl_s": {
"type": "number",
"description": "Cache lifetime of this manifest in seconds."
},
"cache_policy": {
"type": "string",
"description": "Cache policy in force."
},
"freshness_rule": {
"type": "string",
"description": "How fresh/recent/stale are decided."
},
"update_status_rule": {
"type": "object",
"description": "How on_schedule / overdue / not_published / unknown are decided."
},
"freshness_thresholds": {
"type": "object",
"description": "The numeric thresholds behind freshness_rule."
}
},
"description": "Coverage + freshness manifest. On failure this object is an error report instead (see error/detail).",
"additionalProperties": true
}{
"title": "Find which signals/entities are covered (free)",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_official_record — Get the x402 payment challenge for a paid record
Returns the REAL x402 payment challenge (accepts[]: network / asset / payTo / amount) for the paid endpoint that serves a given signal_id+entity, or any listed endpoint addressed directly by `path`. This tool does NOT deliver paid data and does NOT take payment - MCP has no payment layer. Pay at the returned url with your own x402 client (USDC on Base or Solana, gasless EIP-3009; pay from a plain EOA) and you receive the record directly, with record_hash you can verify offline. This tool only fetches the 402 challenge; it delivers no paid data and collects no payment.
{
"type": "object",
"anyOf": [
{
"required": [
"path"
]
},
{
"required": [
"signal_id",
"entity"
]
}
],
"properties": {
"dim": {
"enum": [
"gauge",
"ruler",
"calibrated",
"strata",
"history"
],
"type": "string",
"description": "which product: full read (gauge) or a single add-on; the price of each is in the 402 challenge this tool returns, never here"
},
"path": {
"type": "string",
"description": "Alternative addressing: any listed endpoint path, optionally with its query string (e.g. \"/gauge/chokepoint-region?loc=hormuz\"). The full list of legal paths is the free /manifest?all=1. Use this for the bundles and census lines that are not addressed by signal_id+entity."
},
"entity": {
"type": "string",
"description": "which object within that line, e.g. the USGS site id 07010000"
},
"signal_id": {
"type": "string",
"description": "which signal line, e.g. hydrology.river-level - use find_signal to list them"
}
}
}{
"type": "object",
"required": [],
"properties": {
"got": {
"type": "integer",
"description": "Present on failure: the HTTP status actually returned."
},
"hint": {
"type": "string",
"description": "Present on failure: the next thing to try, e.g. find_signal."
},
"note": {
"type": "string",
"description": "Standing statement that this server never takes payment."
},
"error": {
"type": "string",
"description": "Present only when the call failed; human-readable reason."
},
"detail": {
"type": "string",
"description": "Present on some failures: the upstream endpoint's own error text."
},
"method": {
"type": "string",
"description": "HTTP method to use at pay_at (always GET)."
},
"pay_at": {
"type": "string",
"description": "URL to send the paid GET to."
},
"expected": {
"type": "string",
"description": "Present on failure: what was expected (an HTTP 402 challenge)."
},
"how_to_pay": {
"type": "string",
"description": "How to sign and send the X-PAYMENT header; pay from a plain EOA."
},
"after_payment": {
"type": "string",
"description": "What the paid response carries and how to verify it offline."
},
"x402_challenge": {
"type": "object",
"description": "The upstream 402 body verbatim: x402Version + accepts[] (scheme / network / asset / payTo / amount)."
}
},
"description": "The real x402 payment challenge and how to pay it. No paid data is ever returned here. On failure this object is an error report instead.",
"additionalProperties": false
}{
"title": "Get the x402 payment challenge for a paid record",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}purchase_options — How can I actually buy this? (free)
FREE. Ask how to pay for a listed endpoint and get every channel with its REAL status - including the ones that are wired but not open yet. Three channels exist: x402 micropayment (for an agent with a funded USDC wallet on Base), a stateless subscription Bearer token (for a person or team - no wallet, no private key, no account), and a card rail. This tool takes no payment and holds no key; it only tells you which doors exist and which are open today.
{
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "A listed endpoint path (e.g. \"/gauge/grid-reliability-region\") to get its price alongside the channels. Omit it to get the channel list on its own. The full list of legal paths is the free /manifest?all=1."
}
}
}{
"type": "object",
"required": [],
"properties": {
"error": {
"type": "string",
"description": "present only when the buy endpoint could not be reached"
},
"price": {
"type": "string",
"description": "the listed price, present only when asked_about matches a listed endpoint"
},
"title": {
"type": [
"string",
"null"
],
"description": "the listing title of that endpoint, when it has one"
},
"detail": {
"type": "string",
"description": "the upstream error text, when there is one"
},
"endpoint": {
"type": "string",
"description": "always \"/buy\" - which endpoint answered"
},
"free_first": {
"type": "string",
"description": "what stays free and how to avoid paying for a lookup with no data"
},
"asked_about": {
"type": [
"string",
"null"
],
"description": "the path you asked about, or null if you asked for the channel list on its own"
},
"ways_to_buy": {
"type": "array",
"items": {
"type": "object",
"properties": {
"for": {
"type": "string",
"description": "who this channel is for - agent with a wallet, or a person/team"
},
"how": {
"type": "string",
"description": "what you actually do to pay through this channel"
},
"opens": {
"type": [
"string",
"null"
],
"description": "YYYY-MM-DD - present only while a channel is configured but not open"
},
"caveat": {
"type": "string",
"description": "x402 only: the reference client default per-call cap that silently blocks higher-priced calls"
},
"status": {
"type": "string",
"description": "open | not-self-serve | configured-not-open-yet | unavailable"
},
"channel": {
"enum": [
"x402",
"subscription-token",
"fiat-card"
],
"type": "string",
"description": "which rail"
},
"unlocks": {
"type": "array",
"items": {
"type": "string"
},
"description": "which endpoints this channel unlocks, when it is not per-call"
},
"honest_note": {
"type": "string",
"description": "plain statement of what is not available yet, when that is the case"
}
}
},
"description": "every payment channel with its REAL status - including channels that are wired but not open yet"
},
"note_unknown_path": {
"type": "string",
"description": "present only when asked_about matched no listed endpoint"
}
}
}{
"title": "How can I actually buy this? (free)",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}verify_triangular — Cross-check a line of official series & recompute the verdict (free)
FREE. Cross-verify one GAUGE interweave line: it returns each official series ("leg") in the line with its own record_hash, current/previous values, expected direction and per-leg minMove deadband, plus a count-style state (directions_matched / direction_mismatch / inverse_consistent / not_comparable / insufficient) and N-of-M. Everything needed to recompute the verdict OFFLINE is in the response - verify each leg hash with verify_citation, then recompute dir=sign(current-previous) with the minMove deadband. Descriptive only: no forecast, no causation, no advice. No payment, no API key.
{
"type": "object",
"required": [
"line",
"entity"
],
"properties": {
"line": {
"type": "string",
"description": "which interweave line, e.g. \"E\" (state vs national unemployment) or \"F\" (drought vs crop). Public demo lines are E and F."
},
"entity": {
"type": "string",
"description": "the object within the line, as US-<ST>, e.g. \"US-TX\" (case-insensitive). Required."
}
}
}{
"type": "object",
"required": [],
"properties": {
"legs": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {
"dir": {
"type": [
"integer",
"null"
],
"description": "measured direction THIS window: +1 / -1 / 0 (|Δ|<minMove) / null when a value is missing. NOT the expectation."
},
"as_of": {
"type": [
"string",
"null"
],
"description": "ISO timestamp of the current reading; null when unavailable."
},
"entity": {
"type": "string",
"description": "object id this leg reads, e.g. US-TX or us."
},
"expect": {
"type": [
"integer",
"null"
],
"description": "pre-registered expected direction (+1 or -1) - the arrow, fixed in advance, not this window."
},
"metric": {
"type": "string",
"description": "which scalar in the reading, e.g. rate_pct."
},
"minMove": {
"type": [
"number",
"null"
],
"description": "per-leg deadband: if |current_value-previous_value| < minMove then dir is recorded as 0. Delivered so you can recompute dir yourself."
},
"optional": {
"type": "boolean",
"description": "present when this leg is a non-required confirmation leg (does not change the line state)."
},
"dependent": {
"type": "boolean",
"description": "present when this leg is a super-population of another (e.g. national vs state) - agreement is weak, only mismatch is informative."
},
"signal_id": {
"type": "string",
"description": "e.g. macro.unemployment"
},
"source_ref": {
"type": [
"string",
"null"
],
"description": "URL of the official source record; null when unavailable."
},
"record_hash": {
"type": [
"string",
"null"
],
"description": "per-leg official record hash - POST /gauge/verify (or verify_citation) to check it independently."
},
"source_tier": {
"type": [
"string",
"null"
],
"description": "provenance tier of the leg; null when unavailable."
},
"current_value": {
"type": [
"number",
"null"
],
"description": "newest official reading; null when unavailable."
},
"previous_value": {
"type": [
"number",
"null"
],
"description": "prior official reading; null when unavailable."
},
"contradicts_registered_direction": {
"type": "boolean",
"description": "present on an optional leg that moved against its registered direction."
}
},
"description": "One official series (\"leg\") in the line, with the fields needed to recompute its direction offline.",
"additionalProperties": true
},
"description": "one entry per official series in the line."
},
"line": {
"type": "string",
"description": "the line code you asked for, e.g. E or F."
},
"note": {
"type": "string",
"description": "standing disclaimer: direction is observed, not a trend/forecast/causation claim."
},
"error": {
"type": "string",
"description": "Present only when the call failed; human-readable reason."
},
"state": {
"type": "string",
"description": "directions_matched | direction_mismatch | inverse_consistent | not_comparable | insufficient. A count/observation, NOT an adjudication."
},
"title": {
"type": "string",
"description": "letter-only title (e.g. \"線E\"); never a phenomenon name."
},
"detail": {
"type": "string",
"description": "Present on some failures: the upstream endpoint's own error text."
},
"entity": {
"type": "string",
"description": "the external contract code, e.g. US-TX."
},
"nature": {
"type": [
"string",
"null"
],
"description": "neutral English disclosure; may be null."
},
"reason": {
"type": [
"string",
"null"
],
"description": "stale | missing_current_or_previous | below_min_move | period_misaligned | no_active_drought | parallel_display | null."
},
"matched": {
"type": "integer",
"description": "N: how many REQUIRED legs had measured dir === expect this window."
},
"required": {
"type": "integer",
"description": "M: number of required legs. The public claim is exactly \"N of M moved in the registered direction\"."
},
"statement": {
"type": "string",
"description": "the locked, neutral disclosure sentence with N/M substituted."
},
"pair_state": {
"type": [
"string",
"null"
],
"description": "inverse-pair lines (F/FW) only: holds_stress | holds_relief | broken | insufficient | not_comparable; absent/null on other lines."
},
"verify_hint": {
"type": "string",
"description": "exactly how to recompute the state offline from each leg (record_hash + dir=sign(Δ) with minMove deadband)."
},
"snapshot_window": {
"type": [
"object",
"null"
],
"properties": {
"to": {
"type": "string",
"description": "window end."
},
"from": {
"type": "string",
"description": "window start."
}
},
"description": "the {from,to} window the legs were read over, or null.",
"additionalProperties": true
}
},
"description": "Count-style read of one interweave line: how many official series moved in their pre-registered direction. Descriptive only - no verdict of \"true/false\", no forecast, no causation. On failure this object is an error report instead (see error/detail).",
"additionalProperties": true
}{
"title": "Cross-check a line of official series & recompute the verdict (free)",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 751 ms
- 95th percentile latency
- 751 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 751 ms · metadata changed · 5 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http truth-bear-mcp https://api.truthbear.co/mcpCodex
codex mcp add truth-bear-mcp --url https://api.truthbear.co/mcpCursor
{
"mcpServers": {
"truth-bear-mcp": {
"url": "https://api.truthbear.co/mcp"
}
}
}Cline
{
"mcpServers": {
"truth-bear-mcp": {
"type": "streamableHttp",
"url": "https://api.truthbear.co/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"truth-bear-mcp": {
"type": "http",
"url": "https://api.truthbear.co/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http truth-bear-mcp https://api.truthbear.co/mcpClaude Desktop
https://api.truthbear.co/mcpWindsurf
{
"mcpServers": {
"truth-bear-mcp": {
"serverUrl": "https://api.truthbear.co/mcp"
}
}
}Let your agent find its tools
Find servers like Truth Bear MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.