mcp-gauge
Verify official facts with Bitcoin-anchored proof. 180+ signals, x402 pay-per-call.
使うべきか
品質と安全性
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"mcp-gauge": {
"url": "https://aeml-x402.zeabur.app/mcp"
}
}
}リモートエンドポイント
https://aeml-x402.zeabur.app/mcpstreamable-httphttps://api.truthbear.co/mcpstreamable-httpできること
ツール一覧
ツール(5)
🟢verify_citation(record_hash)
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",
"properties": {
"record_hash": {
"type": "string",
"description": "sha256:<64 hex>, or a >=8-hex prefix as posted publicly"
}
},
"required": [
"record_hash"
]
}出力スキーマ
{
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"description": "Always \"gauge/verify\"."
},
"found": {
"type": "boolean",
"description": "Whether a published Truth Bear reading matches this hash."
},
"verified": {
"type": "boolean",
"description": "Whether the canonical hash recomputed server-side matches the one supplied."
},
"is_truth_bear_record": {
"type": [
"boolean",
"null"
],
"description": "true / false, or null when the check could not be run (see undetermined)."
},
"undetermined": {
"type": "boolean",
"description": "true when the lookup itself failed (e.g. DB unavailable) - NOT a verdict of \"fake\"."
},
"reverse_lookup": {
"type": "string",
"description": "Plain-language statement of exactly what this hash attests."
},
"record_status": {
"type": [
"object",
"null"
],
"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.",
"properties": {
"state": {
"type": "string",
"description": "\"active\" or a withdrawal state such as \"quarantined\"."
},
"since": {
"type": [
"string",
"null"
],
"description": "UTC ISO second-precision timestamp of when we flagged it."
},
"reason": {
"type": [
"string",
"null"
],
"description": "Short machine-readable reason code."
},
"note": {
"type": "string",
"description": "Why the record is kept queryable on purpose."
}
}
},
"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."
},
"signal_id": {
"type": [
"string",
"null"
],
"description": "e.g. hydrology.river-level"
},
"entity": {
"type": [
"string",
"null"
],
"description": "Object id the reading is about."
},
"snapshot_date": {
"type": [
"string",
"null"
],
"description": "YYYY-MM-DD of the reading."
},
"source_ref": {
"type": [
"string",
"null"
],
"description": "URL of the official source record."
},
"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."
},
"scope": {
"type": "string",
"description": "What this hash does and does not attest."
},
"how_to_check_a_claimed_value": {
"type": "string",
"description": "Present when found: how to check a value someone claims."
},
"note": {
"type": "string",
"description": "Screening-level disclaimer."
},
"error": {
"type": "string",
"description": "Present only when the call failed; human-readable reason."
}
},
"required": [],
"description": "Verdict for one record_hash. On failure this object is an error report instead (see error/detail).",
"additionalProperties": true
}🟢find_signal(industry, signal_id, entity, full)
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": {
"industry": {
"type": "string",
"description": "restrict to one domain, e.g. hydrology, agriculture, energy"
},
"signal_id": {
"type": "string",
"description": "e.g. hydrology.river-level"
},
"entity": {
"type": "string",
"description": "object id, e.g. a USGS site id"
},
"full": {
"type": "boolean",
"description": "true = per-entity detail (larger); default compact summary"
}
}
}出力スキーマ
{
"type": "object",
"properties": {
"nature": {
"type": "string",
"description": "What this manifest is."
},
"note": {
"type": "string",
"description": "Screening-level disclaimer."
},
"freshness_rule": {
"type": "string",
"description": "How fresh/recent/stale are decided."
},
"freshness_thresholds": {
"type": "object",
"description": "The numeric thresholds behind freshness_rule."
},
"update_status_rule": {
"type": "object",
"description": "How on_schedule / overdue / not_published / unknown are decided."
},
"cache_ttl_s": {
"type": "number",
"description": "Cache lifetime of this manifest in seconds."
},
"cache_policy": {
"type": "string",
"description": "Cache policy in force."
},
"cache_note": {
"type": "string",
"description": "What the cache does and does not affect."
},
"totals": {
"type": "object",
"description": "signal_ids / industries / distinct_entities / freshness counts across the whole catalogue."
},
"signals": {
"type": "array",
"description": "One entry per signal line. Compact by default; pass full=true for per-entity detail.",
"items": {
"type": "object",
"properties": {
"signal_id": {
"type": "string",
"description": "e.g. hydrology.river-level"
},
"signal_id_label": {
"type": "string",
"description": "Human-readable line name (full mode)."
},
"industry": {
"type": [
"string",
"null"
],
"description": "Domain the line belongs to; null when the line is not classified."
},
"latest_observed_at": {
"type": [
"string",
"null"
],
"description": "ISO timestamp of the newest observation; null when the line has never published."
},
"record_type": {
"type": "string",
"description": "Kind of record the line emits (full mode)."
},
"description": {
"type": "string",
"description": "What the line measures (full mode)."
},
"factory": {
"type": "string",
"description": "Internal collector name (full mode)."
},
"temporal_cycle": {
"type": "string",
"description": "Publication cycle declared by the upstream source (full mode)."
},
"checkup": {
"type": "object",
"description": "Latest patrol result for the line (full mode)."
},
"entities_count": {
"type": "integer",
"description": "How many objects the line covers."
},
"freshness_counts": {
"type": "object",
"description": "fresh / recent / stale counts for the line."
},
"update_status": {
"type": "string",
"description": "on_schedule | overdue | not_published | unknown."
},
"update_status_counts": {
"type": "object",
"description": "Per-status entity counts."
},
"max_overdue_days": {
"type": "number",
"description": "Largest overdue gap in the line, in days."
},
"entities": {
"type": "array",
"description": "Per-entity detail; present only when full=true.",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"description": "Object id."
},
"entity_name": {
"type": "string",
"description": "Human-readable object name."
},
"observed_at": {
"type": "string",
"description": "ISO timestamp of the observation."
},
"data_age_hours": {
"type": "number",
"description": "Age of the observation in hours."
},
"freshness": {
"type": "string",
"description": "fresh | recent | stale."
},
"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."
},
"overdue_days": {
"type": "number",
"description": "How many days past the declared cycle this object is."
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
},
"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."
}
},
"required": [],
"description": "Coverage + freshness manifest. On failure this object is an error report instead (see error/detail).",
"additionalProperties": true
}🟢get_official_record(path, signal_id, entity, dim)
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",
"properties": {
"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."
},
"signal_id": {
"type": "string",
"description": "which signal line, e.g. hydrology.river-level - use find_signal to list them"
},
"entity": {
"type": "string",
"description": "which object within that line, e.g. the USGS site id 07010000"
},
"dim": {
"type": "string",
"enum": [
"gauge",
"ruler",
"calibrated",
"strata",
"history"
],
"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"
}
},
"anyOf": [
{
"required": [
"path"
]
},
{
"required": [
"signal_id",
"entity"
]
}
]
}出力スキーマ
{
"type": "object",
"properties": {
"pay_at": {
"type": "string",
"description": "URL to send the paid GET to."
},
"method": {
"type": "string",
"description": "HTTP method to use at pay_at (always GET)."
},
"x402_challenge": {
"type": "object",
"description": "The upstream 402 body verbatim: x402Version + accepts[] (scheme / network / asset / payTo / amount)."
},
"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."
},
"note": {
"type": "string",
"description": "Standing statement that this server never takes payment."
},
"expected": {
"type": "string",
"description": "Present on failure: what was expected (an HTTP 402 challenge)."
},
"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."
},
"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."
}
},
"required": [],
"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
}🟢purchase_options(path)
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",
"properties": {
"endpoint": {
"type": "string",
"description": "always \"/buy\" - which endpoint answered"
},
"asked_about": {
"type": [
"string",
"null"
],
"description": "the path you asked about, or null if you asked for the channel list on its own"
},
"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"
},
"note_unknown_path": {
"type": "string",
"description": "present only when asked_about matched no listed endpoint"
},
"ways_to_buy": {
"type": "array",
"description": "every payment channel with its REAL status - including channels that are wired but not open yet",
"items": {
"type": "object",
"properties": {
"channel": {
"type": "string",
"enum": [
"x402",
"subscription-token",
"fiat-card"
],
"description": "which rail"
},
"status": {
"type": "string",
"description": "open | not-self-serve | configured-not-open-yet | unavailable"
},
"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"
},
"caveat": {
"type": "string",
"description": "x402 only: the reference client default per-call cap that silently blocks higher-priced calls"
},
"unlocks": {
"type": "array",
"items": {
"type": "string"
},
"description": "which endpoints this channel unlocks, when it is not per-call"
},
"opens": {
"type": [
"string",
"null"
],
"description": "YYYY-MM-DD - present only while a channel is configured but not open"
},
"honest_note": {
"type": "string",
"description": "plain statement of what is not available yet, when that is the case"
}
}
}
},
"free_first": {
"type": "string",
"description": "what stays free and how to avoid paying for a lookup with no data"
},
"error": {
"type": "string",
"description": "present only when the buy endpoint could not be reached"
},
"detail": {
"type": "string",
"description": "the upstream error text, when there is one"
}
},
"required": []
}🟢verify_triangular(line, entity)
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",
"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."
}
},
"required": [
"line",
"entity"
]
}出力スキーマ
{
"type": "object",
"properties": {
"line": {
"type": "string",
"description": "the line code you asked for, e.g. E or F."
},
"title": {
"type": "string",
"description": "letter-only title (e.g. \"線E\"); never a phenomenon name."
},
"entity": {
"type": "string",
"description": "the external contract code, e.g. US-TX."
},
"snapshot_window": {
"type": [
"object",
"null"
],
"description": "the {from,to} window the legs were read over, or null.",
"properties": {
"from": {
"type": "string",
"description": "window start."
},
"to": {
"type": "string",
"description": "window end."
}
},
"additionalProperties": true
},
"legs": {
"type": "array",
"description": "one entry per official series in the line.",
"items": {
"type": "object",
"description": "One official series (\"leg\") in the line, with the fields needed to recompute its direction offline.",
"properties": {
"signal_id": {
"type": "string",
"description": "e.g. macro.unemployment"
},
"entity": {
"type": "string",
"description": "object id this leg reads, e.g. US-TX or us."
},
"metric": {
"type": "string",
"description": "which scalar in the reading, e.g. rate_pct."
},
"dir": {
"type": [
"integer",
"null"
],
"description": "measured direction THIS window: +1 / -1 / 0 (|Δ|<minMove) / null when a value is missing. NOT the expectation."
},
"expect": {
"type": [
"integer",
"null"
],
"description": "pre-registered expected direction (+1 or -1) - the arrow, fixed in advance, not this window."
},
"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."
},
"current_value": {
"type": [
"number",
"null"
],
"description": "newest official reading; null when unavailable."
},
"previous_value": {
"type": [
"number",
"null"
],
"description": "prior official reading; null when unavailable."
},
"as_of": {
"type": [
"string",
"null"
],
"description": "ISO timestamp of the current reading; 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_ref": {
"type": [
"string",
"null"
],
"description": "URL of the official source record; null when unavailable."
},
"source_tier": {
"type": [
"string",
"null"
],
"description": "provenance tier of the leg; null when unavailable."
},
"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."
},
"contradicts_registered_direction": {
"type": "boolean",
"description": "present on an optional leg that moved against its registered direction."
}
},
"required": [],
"additionalProperties": true
}
},
"state": {
"type": "string",
"description": "directions_matched | direction_mismatch | inverse_consistent | not_comparable | insufficient. A count/observation, NOT an adjudication."
},
"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."
},
"nature": {
"type": [
"string",
"null"
],
"description": "neutral English disclosure; may be null."
},
"note": {
"type": "string",
"description": "standing disclaimer: direction is observed, not a trend/forecast/causation claim."
},
"verify_hint": {
"type": "string",
"description": "exactly how to recompute the state offline from each leg (record_hash + dir=sign(Δ) with minMove deadband)."
},
"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."
},
"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."
}
},
"required": [],
"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
}コミュニティ
エビデンス