StatCite
# StatCite
**Economic statistics your AI can actually cite, with a verifier that catches the ones it invents.**
[](https://github.com/asokore/statcite/actions/workflows/ci.yml) · [Live status](https://statcite.com/v1/status) · [AI accuracy benchmark](https://statcite.com/bench) · [Licence ledger](https://statcite.com/sources) · [Verification guide](https://statcite.com/guide)

*Every figure, verdict and citation above is real output from a live call, captured by `tools/make-demo-gif.py` at build time. A model recalling 98% is not a strawman: it was roughly right a few years earlier, which is exactly how stale recall sounds.*
Free remote MCP server + REST API serving official economic statistics from the World Bank, IMF WEO and Fiscal Monitor (current vintage via the IMF DataMapper API, with a DBnomics fallback), BIS policy rates, ECB reference rates, and two regional central banks (the Eastern Caribbean Central Bank and the Central Bank of Barbados, covering Anguilla and Montserrat, which the World Bank does not report), where **every number ships with its full citation**: source, dataset, series ID, canonical URL, licence, retrieval date, a ready-to-paste citation sentence, and BibTeX/APA export formats.
The differentiator is **verification, not lookup**: `verify_stat` checks a claimed figure against the official series and returns `match / close / mismatch / cannot_verify` with diagnostics for the classic errors (wrong year, percent-vs-decimal, millions-vs-billions, sign flips). On a mismatch it re-judges the claim against the previous IMF vintage, so "was right when written, since revised" is never confused with "wrong". When the source cannot support a verdict, it says `cannot_verify` with the reason. It never guesses.
**Three things people use it for**
1. **Fact-check a draft.** The `fact_check` MCP prompt + `verify_claims` audit every macro figure in a document, in batches of 15, each verdict carrying the citation for the correct number.
2. **Cited data for agent reports.** `get_indicator` and `country_snapshot` return official series with paste-ready citations, honest projection labelling, and machine-readable "no published value exists" instead of silent gaps.
3. **Resolve source disagreements.** `compare_sources` fetches one indicator from every official source in its chain and shows the spread (e.g. general-vs-central government debt definitions), each value with its own citation.
## Install in one line
| Client | How |
|---|---|
| Claude (web/desktop) | Open [StatCite in Claude's connector directory](https://claude.ai/directory/connectors/statcite) and click Connect. Fallback: Settings → Connectors → Add custom connector → `https://statcite.com/mcp` |
| Claude Code | `/plugin marketplace add asokore/statcite` then `/plugin install statcite@statcite` (also installs the verify-then-cite skill), or just the server: `claude mcp add --transport http statcite https://statcite.com/mcp` |
| Cursor | [**Install in Cursor**](https://cursor.com/en/install-mcp?name=statcite&config=eyJ1cmwiOiJodHRwczovL3N0YXRjaXRlLmNvbS9tY3AifQ==) · or `{"mcpServers":{"statcite":{"url":"https://statcite.com/mcp"}}}` |
| VS Code | [**Install in VS Code**](https://vscode.dev/redirect/mcp/install?name=statcite&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fstatcite.com%2Fmcp%22%7D) · [Insiders](https://insiders.vscode.dev/redirect/mcp/install?name=statcite&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fstatcite.com%2Fmcp%22%7D&quality=insiders) · or `code --add-mcp '{"name":"statcite","type":"http","url":"https://statcite.com/mcp"}'` |
| ChatGPT | Developer mode → add MCP server, No Authentication (implements the deep-research `search`/`fetch` pair) |
| Cline / stdio-only | `npx -y mcp-remote@0.14.3 https://statcite.com/mcp` (pinned, so a client restart never pulls a new release. See [llms-install.md](llms-install.md)) |
No signup, no API key, no OAuth.
## Side effects
StatCite is a remote server. Over HTTP, calling it installs nothing and runs nothing on your machine. This is what each kind of call does, and where.
| Operation | Calls out from StatCite's server | Writes on your machine | Writes anywhere else | Recorded by StatCite |
|---|---|---|---|---|
| `get_indicator`, `get_series`, `compare_sources`, `country_snapshot`, `inflation_adjust`, `fx_convert`, `fetch` | Yes, to the official source APIs named in the citation (World Bank, IMF, ECB, BIS and DBnomics, with exchange rates through Frankfurter, a relay of ECB reference rates), plus the published CaribStat corpus of ECCB and Central Bank of Barbados series at asokore.github.io/caribstat | No | No | One aggregate usage row |
| `verify_stat`, `verify_claims` | Yes, the same source APIs, to fetch the official figure | No | No | One aggregate usage row, with the verdict kind |
| `search_indicators` | Only to DBnomics, and only when fewer than five results were found locally | No | No | One aggregate usage row |
| `search` | No | No | No | One aggregate usage row |
| `list_sources` | No | No | No | One aggregate usage row |
| Connecting a client over HTTP | No | Only the server entry your client saves in its own config | No | Nothing |
| The stdio bridge (`mcp-remote`) | No | `npx` downloads `mcp-remote` into the npm cache and runs it locally, and `mcp-remote` creates its own config folder (`~/.mcp-auth` unless `MCP_REMOTE_CONFIG_DIR` is set) | No | Nothing |
The usage row holds the transport, the tool name, the registry indicator key, the ISO3 country code, the verify verdict kind, the outcome and the duration. Every one of those comes from a closed list, so nothing you type is stored. No IP address, user agent, header, session id, query text or claimed value is recorded. The code is [`server/src/core/analytics.ts`](server/src/core/analytics.ts) and the policy is at [statcite.com/privacy](https://statcite.com/privacy.html).
Every `get_indicator` and `get_series` result also carries a `limitations` list: codes for what the figure is not, such as a projection, a fallback source's figure, a modelled estimate, a value rounded by the source or a number StatCite computed. A latest value more than 3 years older than the year it was retrieved carries `stale_latest`. When the primary source served it and the registry lists other sources, it also carries `stale_primary`, which names the sources StatCite did not query. An IMF value before the projection boundary StatCite infers carries `outturn_unconfirmed`, because the IMF data StatCite reads does not mark which years are outturns. Each code is read from a structured field of the result or from the indicator registry, and an empty list means none of those conditions was detected.
## Make your agent use it without being asked
Connecting a server puts the tools on the shelf. It does not make an agent reach for them, and an agent that is confident about a number will usually answer from memory. One standing rule fixes that. Paste this into `CLAUDE.md` or `AGENTS.md`, into Cursor Settings → Rules, or into your ChatGPT project instructions:
```text
Before stating any country-level economic figure, get it from StatCite (get_indicator) or check it (verify_stat), even if you think you know it, and include the citation_text it returns.
```
## Try it in 5 seconds
```bash
curl "https://statcite.com/v1/verify?indicator=inflation_cpi&country=USA&period=2023&value=4.1"
curl "https://statcite.com/v1/indicator/govt_debt_gdp?country=JPN&latest_only=true"
curl "https://statcite.com/v1/fx?amount=100&from=USD&to=BBD"
curl -X POST "https://statcite.com/v1/verify_claims" -H "content-type: application/json" \
-d '{"claims":[{"indicator":"inflation_cpi","country":"USA","period":"2023","claimed_value":4.1}]}'
```
## Tools
`get_indicator` · `verify_stat` · `verify_claims` · `compare_sources` · `get_series` · `search_indicators` · `country_snapshot` · `inflation_adjust` · `fx_convert` · `list_sources` · `search` · `fetch`, plus 3 MCP prompts (`fact_check`, `country_brief`, `cite_this_stat`) and 3 resources (registry, licence ledger, SIDS list). 42 active curated indicators, 200+ economies, ~120 currencies. All read-only. Details: [docs](https://statcite.com/docs), and the [verification guide](https://statcite.com/guide) for the method.
## Repo layout
```
server/ Cloudflare Worker: MCP endpoint + REST API + tests (zero runtime deps)
site/ statcite.com static site (landing, docs, llms.txt, OpenAPI, legal)
apify/ Metered twin: Apify actor (pay-per-event) bundling the same core
skill/ Claude skill teaching agents the verify-then-cite workflow
distribution/ Registry manifests, submission steps, launch copy
bench/ pre-registered AI-accuracy benchmark: COVENANT.md, METHODOLOGY.md, question bank, frozen snapshots, runs/ (R1 REPORT + ADDENDA)
docs/ Research report, strategy, launch plan, monetization roadmap
BRIEF.md Context + mandate for anyone (human or agent) picking this up
HANDOFF.md Deployment runbook (the mechanical steps to take it live)
CLAUDE.md Working guide: commands, architecture, invariants
```
## Develop
```bash
cd server
npm install
npm test # fixture-backed, no network
npm run smoke # live end-to-end against real upstream APIs
npm run dev # wrangler dev (local Workers runtime + static site)
npm run deploy # wrangler deploy
```
## Data & licensing
StatCite does not originate the underlying statistical observations. Derived values and verification verdicts are calculated transparently from cited source data with the method disclosed. World Bank (CC BY 4.0); IMF (published IMF statistical data may be copied, redistributed and used in derivative works with attribution as "Source: International Monetary Fund, \<database\>, \<link\>", plus data-integrity, downstream-communication and free-of-charge-disclosure conditions, all carried verbatim in every citation's `license` field); BIS (reproduction and redistribution with attribution); ECB (attribution; reference rates informational); Eurostat via DBnomics (CC BY 4.0); FRED is not served. Its Services Terms of Use (clauses (p) and (q), https://fred.stlouisfed.org/legal/) reserve FRED content from AI/ML use and from caching or redistribution. IMF WEO/Fiscal Monitor projections are labeled as projections. The primary IMF path is the DataMapper API (current edition, verbatim edition label). If unavailable, StatCite falls back to the newest edition DBnomics has ingested, which can lag the IMF's release calendar, so responses cite the resolved vintage, flag stale ones, and every fallback is disclosed (verify_stat/verify_claims return cannot_verify with the fallback value as indicative when the primary failed transiently, rather than judging against a substitute that may differ by definition or vintage. A series the primary permanently lacks is judged against its stable fallback source with disclosure). Server code: MIT.
Built and curated by a professional economist. Contact: hello@statcite.com
TDQS
Scored across 12 tools
Most tools have clearly distinct roles: retrieval, verification, conversion, discovery, and comparison are separated. However, search vs. search_indicators and get_indicator vs. get_series vs. fetch have some boundary overlap that an agent must parse from descriptions. country_snapshot vs. get_indicator is also somewhat overlapping but clarified by the snapshot's bundled scope.
The names use snake_case throughout and are readable, but they mix conventions: verb_noun (get_indicator, verify_stat, compare_sources), bare verbs (search, fetch), and noun/verb forms (country_snapshot, inflation_adjust). The inconsistency is not chaotic, but there is no single predictable pattern.
Twelve tools is well within the ideal range and each tool appears to earn its place across discovery, retrieval, verification, conversion, and source comparison. The set is broad but not bloated for an economic-statistics citation server.
The surface covers source discovery, indicator search, single and multi-source retrieval, country snapshots, currency and inflation adjustment, single-claim and whole-draft verification, and source comparison. It also explicitly handles fallback sources, disabled sources, and unverifiable claims, leaving no obvious lifecycle gap for the stated purpose.