Koskamo

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.

Truth Bear MCP logo, by Truth BearCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by Truth Bear
MCP endpoint (Streamable HTTP)
https://api.truthbear.co/mcp
Vendor documentation

What its tools do

5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

5 of 5 have a description · 5 of 5 declare behavior hints · 5 of 5 with parameters document them all

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

Community listingRegistry 1.0.5
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
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Truth Bear serves official-source screening records; every paid record ships record_hash + signed citation so you can verify it offline. verify_citation and find_signal are free. Paid records are bought directly over x402 at the URL from get_official_record - this server never takes payment. Descriptive only: no advice, no forecasts, no adjudication.

Tools

5 advertised

verify_citation — Verify a Truth Bear record (free)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

verify_citation input schema
{
  "type": "object",
  "required": [
    "record_hash"
  ],
  "properties": {
    "record_hash": {
      "type": "string",
      "description": "sha256:<64 hex>, or a >=8-hex prefix as posted publicly"
    }
  }
}
verify_citation output schema
{
  "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
}
verify_citation annotations
{
  "title": "Verify a Truth Bear record (free)",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
find_signal — Find which signals/entities are covered (free)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

find_signal input schema
{
  "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"
    }
  }
}
find_signal output schema
{
  "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
}
find_signal annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

get_official_record input schema
{
  "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"
    }
  }
}
get_official_record output schema
{
  "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
}
get_official_record annotations
{
  "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)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

purchase_options input schema
{
  "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."
    }
  }
}
purchase_options output schema
{
  "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"
    }
  }
}
purchase_options annotations
{
  "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)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

verify_triangular input schema
{
  "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."
    }
  }
}
verify_triangular output schema
{
  "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
}
verify_triangular annotations
{
  "title": "Cross-check a line of official series & recompute the verdict (free)",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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.

Too few checks for a percentage yet (1 of 1 answered).

  1. 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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http truth-bear-mcp https://api.truthbear.co/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add truth-bear-mcp --url https://api.truthbear.co/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable truth-bear-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "truth-bear-mcp": {
      "url": "https://api.truthbear.co/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "truth-bear-mcp": {
      "type": "streamableHttp",
      "url": "https://api.truthbear.co/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start truth-bear-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "truth-bear-mcp": {
      "type": "http",
      "url": "https://api.truthbear.co/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http truth-bear-mcp https://api.truthbear.co/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://api.truthbear.co/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.