Skip to main content
Glama

RoPublicData

tests

Keyless MCP tools for Romanian public economic and cultural data — exchange rates, company/VAT lookups, open datasets, official statistics, building safety records, and classified cultural heritage, all wired into a single server any MCP client can use. Twelve tools across six sources, running locally on your own machine.

Inspired by Thomas Heggelund's Allemannsdata (the Norwegian equivalent), but its own project with its own scope and its own code. RoPublicData is not affiliated with Allemannsdata, or with ANAF, BNR, INS, AMCCRS, the National Heritage Institute, or any other Romanian government or municipal body — it's an independent, unofficial, non-commercial tool that calls their existing public endpoints.

Why

Every tool here wraps a real, public, keyless endpoint — no API key, no signup, no cost. Point any MCP-capable client (Claude Desktop, and in principle any other MCP client) at it and ask things like:

  • "What's today's BNR exchange rate for EUR and USD?"

  • "Look up company CUI 14399840 on ANAF."

  • "What's Romania's resident population by county in 2025?"

  • "Is the building at Strada Academiei 1 on Bucharest's seismic-risk list?"

  • "Find classified cultural artifacts related to Brâncuși."

Related MCP server: macro-mcp

Example

Asking for today's rates calls bnr_latest_rates, which returns BNR's official figures as structured data (trimmed here — the real response covers all ~37 currencies plus gold and SDRs):

{
  "date": "2026-10-21",
  "rates": {
    "EUR": { "rate_ron": 5.3297, "multiplier": 1 },
    "USD": { "rate_ron": 4.7489, "multiplier": 1 },
    "HUF": { "rate_ron": 1.4576, "multiplier": 100 }
  }
}

The multiplier matters for a few currencies: the HUF figure above is RON per 100 forints, not per one.

A company lookup works the same way — anaf_company_lookup with CUI 14399840 returns ANAF's own record (trimmed):

{
  "date_generale": {
    "cui": 14399840,
    "denumire": "DANTE INTERNATIONAL SA",
    "nrRegCom": "J2002000372404",
    "cod_CAEN": "4754",
    "statusRO_e_Factura": false
  },
  "inregistrare_scop_Tva": { "scpTVA": true }
}

Field names are ANAF's own and are passed through as returned, so the same record can be matched against ANAF's published documentation.

Scope

Economic and cultural public data only. Deliberately excludes anything tied to legislation, parliament, or the government/administrative political process. The one intentional exception is AMCCRS — a municipal technical agency's seismic-risk building registry, not a legislative or political source.

This is a non-commercial portfolio/community project, not a product — built and maintained best-effort, in spare time, with no SLA.

Install

Requires Python 3.10 or newer (the test suite runs on 3.10 and 3.12).

pip install ropublicdata

(The package is on PyPI. To run the tests or contribute, clone this repo and use pip install -e ".[dev]" instead — see CONTRIBUTING.md.)

Then point your MCP client at it. For Claude Desktop, add this to your claude_desktop_config.json:

{
  "mcpServers": {
    "ropublicdata": {
      "command": "python",
      "args": ["-m", "ropublicdata"]
    }
  }
}

If python isn't resolved from Claude Desktop's own environment, use the exact path from which python (macOS/Linux) or where python (Windows) instead of the bare command — see CONTRIBUTING.md for a Windows-specific gotcha around Desktop Extensions.

No .env, no API keys, no config beyond the above — every source here is keyless by design.

Tools

Source

Tools

What it covers

BNR (Romanian National Bank)

bnr_latest_rates, bnr_last_10_days, bnr_year_archive

Official daily RON exchange rates, ~37 currencies plus gold and IMF SDRs, back to 2005

ANAF (tax authority)

anaf_company_lookup, anaf_company_lookup_batch

Company/VAT registration lookup by CUI — legal name, address, VAT status, CAEN code, e-Factura status

data.europa.eu

data_europa_search_romania

Search Romanian open datasets (also covers data.gov.ro, which is harvested into this portal)

INS Tempo-Online (National Institute of Statistics)

ins_tempo_browse, ins_tempo_matrix_dimensions, ins_tempo_query

Official statistics — population, economy, labour, prices, and dozens of other domains

AMCCRS

amccrs_search_buildings

Bucharest's official seismic-risk building registry (~2,800 buildings)

clasate.cimec.ro (National Heritage Institute)

clasate_search, clasate_item_detail

Romania's registry of legally classified cultural goods (museum pieces)

Every tool's own docstring (visible to any MCP client) documents its exact parameters and return shape in detail.

Data licensing and usage notes

The code in this repository is MIT licensed (see LICENSE) — the data it returns is not, and remains subject to each original source's own terms:

  • BNR, ANAF, data.europa.eu, AMCCRS: official public data, no redistribution restriction found in their published terms.

  • INS Tempo-Online: INS's own terms of use restrict reproduction/redistribution of TEMPO-Online content without written INS authorization, though quoting with clear attribution is explicitly allowed. Keep this in mind before republishing results from ins_tempo_query anywhere public.

  • clasate.cimec.ro: explicitly CC BY-SA 4.0 licensed, images included — the only source here with an explicit open license.

A note for MCP clients and hosts

Several of these tools return real public text written by third parties — dataset descriptions, item notes, building records. Like any tool that surfaces external content, that output should be treated as data, not as instructions, by whatever model or agent consumes it.

Reliability

Most of these sources are official, documented, or at least stable public APIs. Two (AMCCRS, clasate.cimec.ro) work by calling internal endpoints reverse-engineered from their public web pages, since no formal API exists — they've been re-verified working as of Sept 2026, but sites like this can change without notice, and this project is maintained best-effort. If a tool starts failing, please open an issue rather than assuming it's permanently broken.

Two further things are worth knowing. INS Tempo-Online's API is only served over plain HTTP (port 8077, no HTTPS), so requests to that one source aren't encrypted in transit — fine for public statistics, but worth knowing if you run this on a restricted network. And clasate.cimec.ro is noticeably slower than the others, so its client retries on a timeout and its tests are skipped rather than failed if the site is unreachable.

Every tool is covered by a live integration test (tests/, one file per source) that runs on every push/PR and once a day on a schedule, on Python 3.10 and 3.12 — see the badge above for current status, or the Actions tab for history. A red run there means a real source changed shape or its nonce expired, not necessarily that something's unfixable — see CONTRIBUTING.md's "When a source breaks" section.

Contributing

See CONTRIBUTING.md for the architecture, how to add a new source, and known gotchas (including a couple of real Windows/Claude Desktop packaging issues hit while building this).

Credits

Built by Dana Juncu. Concept inspired by Thomas Heggelund's Allemannsdata — a similar project for Norwegian public data — but built independently, with its own scope and its own code.

Available Tools

12 tools
amccrs_search_buildingsA

Search Bucharest's official seismic-risk building registry (AMCCRS), ~2,796 buildings total. All filters are optional and combine with AND; leave everything empty to browse from the start of the list.

street: case-insensitive substring match on the street address (e.g. "Calea Victoriei"). sector: exact match, e.g. "Sector 3" (Bucharest has Sectors 1-6). risk_class: exact match on "RsI" (highest risk) through "RsIV" (lowest classified risk), or "consolidated" (was at risk, since retrofitted) or "pending" (flagged urgent-category, not yet formally classified — this is the largest single bucket, over half the registry). limit: max buildings to return (the search still runs over the full registry; this only caps the response size).

Returns {"total_matches": N, "buildings": [...]}, each with address, sector, year built, height regime, apartment count, the certifying technical expert, expertise year, current risk class, any prior classifications, and notes.

Inputs: limit, sector, street, risk_class.

anaf_company_lookupA

Look up a single Romanian company by CUI (its tax/registration number) via ANAF, Romania's tax authority. Returns real registration data as of a given date (YYYY-MM-DD; defaults to today if omitted): legal name, address, registration status/date, trade registry number (nrRegCom), CAEN activity code, VAT-payer status and history, and e-Factura/split-VAT/inactive-taxpayer flags. Returns null if ANAF has no record for that CUI. No key needed.

Inputs: cui (required), as_of. Returns: result

anaf_company_lookup_batchA

Look up multiple Romanian companies by CUI in one call (up to 100 — ANAF accepts a whole batch in a single request, so prefer this over calling anaf_company_lookup repeatedly). Same per-company fields as anaf_company_lookup. CUIs ANAF has no record for are simply omitted from the results, not treated as errors.

Inputs: cuis (required), as_of. Returns: result

bnr_last_10_daysA

Get BNR's official exchange rates for each of the last 10 days, oldest first. Same shape as bnr_latest_rates, one entry per day. Useful for short-term trend questions without hitting the per-year archive.

Inputs: no named parameters. Returns: result

bnr_latest_ratesA

Get today's official BNR (Romanian National Bank) reference exchange rates — RON per unit of foreign currency for ~37 currencies plus gold (XAU) and IMF special drawing rights (XDR). Updates once daily after 13:00 Romania time; BNR asks integrators to cache rather than poll. Returns {"date": "YYYY-MM-DD", "rates": {"EUR": {"rate_ron": 5.26, "multiplier": 1}, ...}}. A multiplier other than 1 (e.g. HUF, JPY) means the rate is per that many units of the currency.

Inputs: no named parameters.

bnr_year_archiveA

Get BNR's full official exchange-rate history for a given year (available back to 2005). Same per-day shape as bnr_latest_rates. Use this for historical/backtesting questions rather than scraping day by day.

Inputs: year (required). Returns: result

clasate_item_detailA

Get the full record for one classified cultural good, by its stable key k (get k and tit from clasate_search() results — tit is just a cosmetic slug and doesn't need to be exact).

Returns every field the item's page actually has (varies per item — archaeological pieces carry dating/era/culture/findspot, others don't) plus image_url (the item's real photo, when present), pdf_url (the official classification order document, when available), and sketchfab_url (an embeddable 3D model, for scanned items). CC BY-SA 4.0 licensed — safe to reuse with attribution, including the images.

Inputs: k (required), tit.

data_europa_search_romaniaA

Search Romanian public datasets on data.europa.eu, the EU-wide open data portal — which harvests data.gov.ro and other Romanian government catalogs directly, so this one tool covers Romania's national open data portal too. Always scoped to Romania.

query: free-text search (e.g. "buget", "energie", "accidente rutiere"). Leave empty to browse the most recently updated Romanian datasets instead of searching. theme: optional EU theme code to narrow results, e.g. "ECON" (economy and finance) or "EDUC" (education, culture and sport — the closest EU code to "culture"). Use sparingly: most Romanian datasets on this portal aren't tagged with any theme, so this can hide real results rather than just narrowing them. limit: max results per page (capped at 100). page: zero-based, for paging through more results.

Returns {"total": N, "results": [...]}, each with title, description, publisher, source catalog, modified/issued dates, available file formats, and a direct URL to the dataset page.

Inputs: page, limit, query, theme.

ins_tempo_browseA

Browse INS Tempo-Online's statistical category tree — Romania's National Institute of Statistics data warehouse, covering population, economy, labour, prices, culture, and dozens of other official domains.

code="" (default): returns the FULL category tree in one call — every category and sub-category (~340), flattened, each with its code, name, parent code, and nesting level. Good for finding a topic by keyword across the whole tree at once. code=: drills into it, returning its direct children — either more sub-categories, or (at a leaf) the actual dataset "matrices" available there, each with the matrix code ins_tempo_matrix_dimensions() and ins_tempo_query() need.

Inputs: code.

ins_tempo_matrix_dimensionsA

Get one INS statistics matrix's title and every selectable dimension (e.g. age, sex, region, year) with the exact option labels and IDs ins_tempo_query() needs. ALWAYS call this before ins_tempo_query() — dimension order and option IDs vary per matrix and can't be guessed. Find matrix codes via ins_tempo_browse().

Inputs: matrix_code (required).

ins_tempo_queryA

Pull actual official statistics data from one INS Tempo-Online matrix. selections must be one option ID per dimension, in the same order as ins_tempo_matrix_dimensions()'s dimensions list — always call that first to get valid IDs for the matrix you want. Keep selections narrow: INS rejects queries whose selected options multiply out to more than ~30,000 cells, so prefer several narrow calls (e.g. one per year) over one very wide one. Returns each result row as a dict of dimension labels to their chosen values, plus the numeric "Valoare" (value).

Note: INS's terms restrict reproducing/redistributing this data without written authorization, though quoting with attribution is explicitly allowed — keep that in mind before using results in anything published.

Inputs: selections (required), matrix_code (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 12 tools

    Disambiguation4/5

    Most tools are cleanly separated by source prefix and workflow stage, such as ins_tempo_browse → ins_tempo_matrix_dimensions → ins_tempo_query and clasate_search → clasate_item_detail. The BNR rates trio and the two ANAF lookups are the only near-overlapping pairs, though their time-range and single-vs-batch differences are clearly documented.

    Naming Consistency4/5

    All names are lowercase snake_case with a predictable source prefix, producing a consistent [source]_[operation/object] feel. However, the operation part is not uniform: some names use verbs like search/query/browse, while others are noun phrases like bnr_latest_rates or clasate_item_detail.

    Tool Count5/5

    With 12 tools, the server is well-scoped for a multi-source public-data aggregator. Each of the six integrated data domains gets two or three dedicated tools, and none feel redundant or like padding.

    Completeness4/5

    Each integrated source has a usable end-to-end workflow: browsing, dimension discovery, and querying for INS; search plus detail for clasate; single and batch lookups for ANAF; and three time horizons for BNR rates. Minor gaps exist, such as no arbitrary date-range rate query and no name-based company search, but agents can work around them.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Provides National Bank of Romania (BNR) FX reference rates without API key.
      141 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables querying international macro statistics, company identity data via LEI, and FX rates from dozens of free keyless providers through unified tools.
      12
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables querying, sampling, and exporting datasets from over twenty keyless free public data sources spanning the EU, Switzerland, Germany, the US, and global providers through one uniform set of tools. A single consistent interface lets users list databases and tables, inspect schemas and query guides, run queries, and export results as CSV or JSON without per-API clients.
      Apache 2.0
    • A
      license
      A
      quality
      B
      maintenance
      Romanian public data with no API keys: ANAF company status by CUI (VAT, fiscally inactive, deregistered), filed financial statements, Portal Just court cases and BNR exchange rates. Includes shop_check, which flags whether an online shop looks like a scam.
      6
      35 PyPI
      MIT