# @altronis/sgdata-mcp > A Singapore government data MCP server. **87 tools — 24 curated datasets + 7 SingStat tables + 6 live real-time feeds, CLI mode, data visualization, cross-dataset queries, natural language queries.** > Covering ACRA + HDB + URA + COE + CPI + GDP + employment + IRAS + MAS FX + MOE + ECDA + tourism + retail + population + crime + health + energy + hawkers + air quality + weather + carparks + live dengue. > No API keys. Runs anywhere MCP runs. Full write-up: https://altronis.sg/blog/sgdata-mcp [![npm version](https://img.shields.io/npm/v/@altronis/sgdata-mcp.svg)](https://www.npmjs.com/package/@altronis/sgdata-mcp) [![license: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE) [![node](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](https://nodejs.org) [![MCP](https://img.shields.io/badge/MCP-2024--11--05-blue.svg)](https://modelcontextprotocol.io) `@altronis/sgdata-mcp` is an [MCP](https://modelcontextprotocol.io) server that lets Claude, Cursor, Continue, or any other MCP-compatible client query Singapore government open data directly from data.gov.sg — corporate registry, real estate, labour, prices, public services, capital flows, crime, health, demographics, energy, and more. It runs as a local stdio process on your machine. No hosted backend, no API keys. Small curated datasets cache locally at `~/.sgdata-mcp/sgdata.sqlite`; large datasets (ACRA, HDB resale) and real-time feeds query data.gov.sg server-side so they never download a whole dataset onto your disk. **v0.5.0:** 13 new tools + a smaller footprint. **Real-time feeds** — `sg_psi` (air quality), `sg_weather_forecast`, `sg_air_temperature`, `sg_rainfall`, `sg_carpark_availability`, and `sg_dengue_clusters` (live NEA clusters — current dengue, vs the frozen weekly-bulletin feed). **SingStat tables** — `sg_household_income`, `sg_wages`, `sg_deaths`, `sg_marriages`, `sg_divorces`, `sg_trade`, `sg_labour_force`. **`sg_search_datasets` now actually searches** (data.gov.sg's `q` param is a no-op upstream, so it filters a cached catalog locally). **ACRA + HDB-resale tools query server-side** (`datastore_search`) instead of ingesting the full 56 MB / 23 MB datasets — no more multi-GB local cache. FX tools fixed (upstream metadata endpoint 404s; they now read live data via `datastore_search`). > ⚠️ **`sg_acra_formations_by_ssic` is a heavy tool.** ACRA's SSIC+year filter > can't be pushed server-side, so it crawls 27 shards with rate-limit backoff — > expect ~1–3 minutes, and for older years the count is a lower bound > (`bounded: true`). For fast formation **counts** by SSIC use the SingStat > `sg_formations_history` / `sg_formations_compare` / `sg_formations_monthly` > tools instead. **v0.4.1:** `sg_dataset_query` no longer hangs on very large datasets (size-gated server-side paging via `datastore_search` + a 60s ingest guard); `sg_fx_rate` / `sg_fx_history` now accept ISO currency codes (`USD`, `GBP`, `JPY`, `EUR`, …); `sg_tourism_latest` now emits `data_freshness` (its upstream stops at 2014); and the `_history` tools return an `available` label list on a no-match so callers can self-correct. **v0.4.0 highlights:** `data_freshness` metadata block emitted on every `_latest` tool — `last_period`, `last_record_date`, `age_days`, and a categorical `level` of `fresh` / `ok` / `stale` / `frozen` so agents can detect when an upstream data.gov.sg feed has gone silent. Fixes silent stale-data on `sg_disease_latest` (MOH stopped publishing the Weekly Infectious Disease Bulletin via data.gov.sg around epi week 2022-W52). **v0.3.2:** Monthly business formations + cessations + net growth tools via SingStat Table Builder. Track month-by-month company creation vs closure for any SSIC industry. 74 tools total. **v0.3.1:** Annual formation counts by industry via SingStat Table Builder. **v0.3.0:** 8 new datasets, CLI mode, ASCII sparkline visualization, cross-dataset correlation queries, natural language query routing. ## Data freshness `@altronis/sgdata-mcp` is only as fresh as data.gov.sg. Some datasets are updated weekly (COE bidding, CPI), some monthly (unemployment, CPI sub-items), some quarterly (URA private property), and some have effectively stopped updating. Starting in v0.4.0 every `_latest` tool returns a `data_freshness` block so you can detect drift programmatically: ```json { "datasetId": "d_ca168b2cb763640d72c4600a68f9909e", "epi_week": "2022-W52", "cases": [...], "data_freshness": { "last_period": "2022-W52", "last_record_date": "2023-01-01", "age_days": 1234, "level": "frozen", "warning": "Upstream dataset appears frozen — latest record is 2022-W52..." } } ``` **Known frozen datasets (as of v0.4.1):** | Tool | Upstream dataset | Last update | Recommended action | |---|---|---|---| | `sg_disease_latest`, `sg_disease_trend`, `sg_disease_list` | MOH Weekly Infectious Disease Bulletin | 2022-W52 | Cross-check `moh.gov.sg` weekly bulletin PDFs. PRs welcome to swap in a live source. | | `sg_tourism_latest`, `sg_tourism_history` | STB Annual Tourism Receipts | 2014 | Cross-check `stb.gov.sg` / SingStat for newer receipts. PRs welcome. | If you find another upstream feed has gone silent, please open an issue — we'll add it to this table and surface the warning in the tool description. --- ## What you can ask Claude Drop this server into Claude Desktop and you immediately unlock questions like: - *"Find all AI/ML companies (SSIC 62019) incorporated in Singapore in 2025."* - *"What's the median resale price of 4-room HDB flats in Punggol over the last 6 months?"* - *"What is the latest COE Category A premium, and how has it trended over 12 months?"* - *"How many dengue cases were reported this week?"* - *"What's Singapore's unemployment rate? Show me the trend."* - *"Compare GDP growth vs crime rates over the last 5 years."* - *"How many scam cases were recorded in 2024?"* - *"What is Singapore's population and how fast is it growing?"* - *"How much electricity did Singapore generate last month?"* - *"Are birth rates declining? Show me the last 12 months."* - *"What were Singapore's tourism receipts by component?"* - *"Find hawker centres near Tampines."* - *"Which CPI categories are running hottest vs headline inflation?"* - *"Look up DBS Bank by UEN 196800306E."* Your model picks the right tool, fills in the filters, and returns structured rows. You never write a URL. --- ## Quick start ### Claude Desktop Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows): ```json { "mcpServers": { "sg-data": { "command": "npx", "args": ["-y", "@altronis/sgdata-mcp"] } } } ``` Restart Claude Desktop. The 74 `sg_*` tools appear in the MCP tools menu. ### Cursor Add to `~/.cursor/mcp.json`: ```json { "mcpServers": { "sg-data": { "command": "npx", "args": ["-y", "@altronis/sgdata-mcp"] } } } ``` ### Claude Code ```bash claude mcp add sg-data -- npx -y @altronis/sgdata-mcp ``` ### CLI mode (new in v0.3.0) Query Singapore data directly from the terminal — no MCP client needed: ```bash # Natural language query npx @altronis/sgdata-mcp query "What is Singapore's unemployment rate?" npx @altronis/sgdata-mcp query "How many dengue cases this week?" npx @altronis/sgdata-mcp query "Latest COE prices" # Call a specific tool npx @altronis/sgdata-mcp tool sg_crime_compare '{"year":"2024"}' npx @altronis/sgdata-mcp tool sg_hawker_search '{"query":"bedok"}' # List available tools and datasets npx @altronis/sgdata-mcp list npx @altronis/sgdata-mcp datasets ``` ### Standalone (kick the tyres) ```bash # Run the MCP server directly npx -y @altronis/sgdata-mcp # Smoke-test via stdio printf '%s\n' \ '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0"}}}' \ '{"jsonrpc":"2.0","method":"notifications/initialized"}' \ '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \ | npx -y @altronis/sgdata-mcp ``` --- ## What's in the box ### Datasets (24) | # | Dataset | Agency | Tools | |---|---------|--------|-------| | 1 | ACRA Corporate Entities (~2M+) | ACRA | 3 | | 2 | HDB Resale Flat Prices (2017+) | HDB | 2 | | 3 | COE Bidding Results | LTA | 3 | | 4 | MOE Schools | MOE | 3 | | 5 | HDB Carpark Information | HDB | 3 | | 6 | GDP YoY Growth (quarterly) | SingStat | 3 | | 7 | Consumer Price Index (monthly) | SingStat | 3 | | 8 | MOM Median Gross Monthly Income | MOM | 2 | | 9 | Employment by Sector (annual) | SingStat | 3 | | 10 | URA Private Residential Transactions | URA | 3 | | 11 | International Visitor Arrivals | STB | 3 | | 12 | Retail Sales Index (monthly) | SingStat | 3 | | 13 | MAS Exchange Rates (monthly avg) | MAS | 3 | | 14 | IRAS Tax Collection (annual) | IRAS | 3 | | 15 | ECDA Childcare & Kindergarten Centres | ECDA | 3 | | 16 | **Unemployment Rate (quarterly)** | MOM | 2 | | 17 | **Population Indicators (annual)** | SingStat | 2 | | 18 | **Infectious Disease Cases (weekly)** | MOH | 3 | | 19 | **Electricity Generation (monthly)** | EMA | 2 | | 20 | **Live-Births by Sex/Ethnicity (monthly)** | SingStat | 2 | | 21 | **Crime Cases Recorded (annual)** | SPF | 3 | | 22 | **Tourism Receipts (annual)** | STB | 2 | | 23 | **Government Hawker Centres** | NEA | 2 | | 24 | **Business Entity Formations & Cessations** | ACRA/DOS | 6 | Plus **3 generic fallback tools**, **1 visualization tool**, **2 cross-dataset tools**, and **1 natural language query tool**. Total: **74 tools.** --- ### New in v0.3.0 #### Data visualization — `sg_visualize` Generate ASCII sparkline charts and summary statistics from any time series. Returns sparklines, min/max/mean/latest, period-over-period change, and chart-ready JSON for frontend rendering. ``` SG Unemployment Rate (SA): ▁█████▄▄████ Latest: 2 % | Change: +0 (+0%) | Range: 1.8–2 | Mean: 1.97 ``` #### Cross-dataset queries — `sg_cross_dataset` Compare any two datasets side-by-side over time. Automatically aligns different time granularities (monthly, quarterly, annual): ```json { "dataset_a": "cpi_monthly", "dataset_b": "retail_sales", "limit": 5 } ``` Returns aligned rows with both values for correlation analysis. #### Natural language queries — `sg_ask` Ask questions in plain English — the tool routes to the right dataset automatically: ``` "What is Singapore's unemployment rate?" → sg_unemployment_latest "How many dengue cases?" → sg_disease_latest "COE prices" → sg_coe_latest "Crime statistics" → sg_crime_latest ``` #### CLI mode — no MCP client needed Query data directly from your terminal: ```bash sgdata-cli query "Singapore population growth" sgdata-cli tool sg_crime_compare '{"year":"2024"}' sgdata-cli datasets ``` --- ### Tools (74) #### Meta tools | Tool | Description | |------|-------------| | `sg_ask` | Natural language query — ask any question about Singapore data in plain English | | `sg_visualize` | ASCII sparkline + summary stats + chart-ready JSON from any numeric series | | `sg_cross_dataset` | Compare two datasets over time with automatic period alignment | | `sg_list_datasets` | List all 24 curated datasets with IDs, names, and agencies | #### Generic tools — any data.gov.sg dataset | Tool | Description | |------|-------------| | `sg_search_datasets` | Full-text discovery across all data.gov.sg datasets | | `sg_dataset_schema` | Column labels, agency, format for any dataset ID | | `sg_dataset_query` | Query any dataset with filters, auto-downloads and caches | #### Curated dataset tools (67) **ACRA** (3): `sg_acra_search_entities`, `sg_acra_get_entity`, `sg_acra_formations_by_ssic` **HDB Resale** (2): `sg_hdb_resale_search`, `sg_hdb_resale_stats` **COE** (3): `sg_coe_latest`, `sg_coe_history`, `sg_coe_demand_supply` **MOE Schools** (3): `sg_moe_search_schools`, `sg_moe_school_by_name`, `sg_moe_schools_near` **HDB Carparks** (3): `sg_hdb_carpark_lookup`, `sg_hdb_carparks_by_address`, `sg_hdb_carparks_by_type` **GDP** (3): `sg_gdp_latest`, `sg_gdp_history`, `sg_gdp_industry_compare` **CPI** (3): `sg_cpi_latest`, `sg_cpi_history`, `sg_cpi_yoy` **Income** (2): `sg_median_income_lookup`, `sg_median_income_history` **Employment** (3): `sg_employment_by_sector`, `sg_employment_sector_history`, `sg_employment_growth` **URA Property** (3): `sg_ura_private_txn_latest`, `sg_ura_private_txn_history`, `sg_ura_new_sale_pipeline` **Visitor Arrivals** (3): `sg_visitors_latest`, `sg_visitors_history`, `sg_visitors_top_sources` **Retail Sales** (3): `sg_retail_sales_latest`, `sg_retail_sales_history`, `sg_retail_sales_yoy` **MAS FX** (3): `sg_fx_rate`, `sg_fx_history`, `sg_fx_basket` **IRAS Tax** (3): `sg_iras_collection`, `sg_iras_collection_history`, `sg_iras_tax_mix` **ECDA Childcare** (3): `sg_ecda_search_centres`, `sg_ecda_centres_near`, `sg_ecda_vacancy_summary` **Unemployment** (2): `sg_unemployment_latest`, `sg_unemployment_history` **Population** (2): `sg_population_latest`, `sg_population_history` **Disease/Health** (3): `sg_disease_latest`, `sg_disease_trend`, `sg_disease_list` **Electricity** (2): `sg_electricity_latest`, `sg_electricity_history` **Births** (2): `sg_births_latest`, `sg_births_history` **Crime** (3): `sg_crime_latest`, `sg_crime_history`, `sg_crime_compare` **Tourism** (2): `sg_tourism_latest`, `sg_tourism_history` **Hawker Centres** (2): `sg_hawker_search`, `sg_hawker_stats` **Business Formations & Cessations** (6): `sg_formations_latest`, `sg_formations_history`, `sg_formations_compare`, `sg_formations_monthly`, `sg_cessations_monthly`, `sg_net_formations` --- ## Architecture ``` ┌─────────────────┐ spawn ┌──────────────────────┐ │ Claude Desktop │ ──────────▶ │ sgdata-mcp (node) │ │ /Cursor/Code │ ◀── stdio ─▶│ runs on your machine │ └─────────────────┘ └──────┬───────────────┘ │ HTTPS (first fetch only) ▼ api.data.gov.sg/v2/... │ ▼ ~/.sgdata-mcp/sgdata.sqlite (shared local SQLite cache) ``` --- ## Caching policy - **Location.** `~/.sgdata-mcp/sgdata.sqlite` by default. - **Override.** Set `SGDATA_MCP_CACHE_DIR=/custom/path`. - **Refresh cadence.** Per-dataset — daily for ECDA, weekly for HDB/COE/disease, monthly for ACRA/CPI/GDP/FX/retail/visitors/births/electricity, quarterly for MOE/URA/employment/unemployment, annually for IRAS/income/crime/population/tourism. - **Wipe.** `rm ~/.sgdata-mcp/sgdata.sqlite` — next query rebuilds. - **Disk.** ~480 MB with ACRA, under 20 MB without. --- ## Comparison | | `@altronis/sgdata-mcp` | `sgdata-mcp` (by vdineshk) | |---|---|---| | Tools | **74** | 5 | | Coverage | Corporate registry, real estate, prices, labour, tourism, FX, tax, public services, crime, health, demographics, energy | Real-time weather, traffic, carpark availability | | CLI mode | Yes | No | | Data visualization | Yes (sparklines + chart-ready JSON) | No | | Cross-dataset queries | Yes | No | | NL query routing | Yes | No | | Caching | Yes (SQLite) | No | | API keys | None | None | Both packages complement each other — install both for the full picture. --- ## Disclaimer This tool fetches and caches data from [data.gov.sg](https://data.gov.sg). While we take care to preserve data integrity during ingestion, **you should independently verify any data before making decisions based on it**. - **Data accuracy.** All data originates from Singapore government agencies via data.gov.sg. We do not alter source values, but column mappings, wide-to-long transformations, and caching may introduce discrepancies. Always cross-check critical figures against the [official source](https://data.gov.sg). - **Not professional advice.** This tool is not a substitute for professional financial, legal, medical, or policy advice. GDP figures, crime statistics, disease counts, property prices, and other data are provided for informational purposes only. - **Staleness.** Cached data may be hours to weeks behind the source depending on the dataset's refresh window. Check `ingestedAt` timestamps if freshness matters. - **No warranty.** This software is provided "as is" under the MIT licence, without warranty of any kind. --- ## FAQ **Do I need an API key?** No. data.gov.sg open datasets are public. **Where is the data stored?** On your machine, in `~/.sgdata-mcp/sgdata.sqlite`. **How often is data refreshed?** Per-dataset, from daily to annually. **Is this production-ready?** Yes. 74 tools, all tested against live data. File issues on GitHub if you hit anything sharp. **Can I add my own dataset?** Yes — either use the generic tools for ad-hoc queries, or open a PR adding a handler under `src/datasets/`. --- ## License MIT ## Attribution Contains information from [data.gov.sg](https://data.gov.sg) under the [Singapore Open Data Licence v1.0](https://beta.data.gov.sg/open-data-licence). --- ## Contributing Found a bug? Want a dataset added? Open an issue or PR on [GitHub](https://github.com/sypherin/sgdata-mcp).