Skip to main content
Glama
dml-bps-mcp

dml-bps-mcp

Official
by digimetalab

DML BPS MCP Server

CI Deploy Release License: MIT Node.js Deployed

MCP (Model Context Protocol) server for BPS (Badan Pusat Statistik) Indonesia official statistics data — by Digimetalab. Enables AI clients like Claude Desktop, Claude Code, Cursor, and others to access official Indonesian statistical data through natural language.

Features

  • 59 tools covering all BPS WebAPI v1 endpoints + AllStats Search + AI-friendly shortcuts + SIMDASI + SDGs + SDDS + KBLI/KBKI classifications

  • AI-friendly — find_data tool with automatic intent detection (resolve region → detect intent → find variable → fetch data)

  • Intent Detection — automatically detects: single value, comparison, trend, ranking, table/breakdown, publication

  • Stopwords-ISO — automatic noise removal for 758 Indonesian + 1298 English words

  • Static Table Fallback — find_data automatically falls back to static tables when dynamic data is unavailable (e.g., religion data)

  • Result Hints — every response includes actionable follow-up tips

  • AllStats Search Integration — unified search + full-text PDF search (no API key required)

  • Smart Fallback — WebAPI search automatically falls back to AllStats if no results

  • 3 MCP Resources — domain list, regencies per province, subjects per domain

  • 5 MCP Prompts — ready-to-use data analysis templates

  • Domain Resolver with fuzzy matching (type "Jatim" → Jawa Timur)

  • Data Formatter that converts raw BPS data into readable format

  • Persistent Learning Store — auto-learns variable mappings, survives restarts

  • In-memory Cache with TTL per data type

  • Rate Limiting — 60 req/min per API key (remote worker)

  • Bilingual — error messages and responses support both Indonesian and English

  • Automatic BPS Attribution in every response (per Terms of Use)

  • BYOK (Bring Your Own Key) — each user must provide their own BPS API key

Related MCP server: satudata-ngawi

Prerequisites

Quick Start

BPS_API_KEY=your_key npx dml-bps-mcp

Clone & Run

git clone https://github.com/Digimetalab/dml-bps-mcp
cd dml-bps-mcp
npm install
npm run build
BPS_API_KEY=your_key npm start

Remote Access via Cloudflare Workers

The server is deployed and publicly available at:

https://dml-bps-mcp.digimetalab.workers.dev/mcp

Health check: https://dml-bps-mcp.digimetalab.workers.dev

Using with Claude.ai

  1. Open claude.ai → Settings → Integrations → Add custom connector

  2. Enter:

    • Name: BPS Statistics

    • URL: https://dml-bps-mcp.digimetalab.workers.dev/mcp

  3. Claude will open the authorization page

  4. Enter your BPS API key (free from webapi.bps.go.id)

  5. Click "Authorize" — done!

The server uses OAuth 2.1 per MCP spec. Your API key is securely stored server-side and never exposed to the client.

Using with Other AI Clients (Remote MCP)

For AI clients supporting remote MCP with OAuth (ChatGPT, Cursor remote, etc.):

MCP Server URL: https://dml-bps-mcp.digimetalab.workers.dev/mcp

The client will automatically initiate the OAuth flow — users only need to enter their BPS API key when the authorization page appears.

Using with Custom Headers (without OAuth)

For clients supporting custom headers (Claude Desktop, Cursor local):

{
  "mcpServers": {
    "dml-bps-mcp": {
      "type": "http",
      "url": "https://dml-bps-mcp.digimetalab.workers.dev/mcp",
      "headers": {
        "X-BPS-API-Key": "your_api_key_here"
      }
    }
  }
}

Self-hosted

Deploy as a serverless worker to your own Cloudflare account:

Deploy to Cloudflare Workers

See the full guide at docs/DEPLOY-WORKERS.md.

Note: BPS WebAPI (https://webapi.bps.go.id) no longer blocks requests from Cloudflare Workers, so you can access it directly (no proxy needed). However, the AllStats Search Engine (https://searchengine.web.bps.go.id) is still blocked by Cloudflare bot challenges. If you use Cloudflare Workers and want AllStats Search/Deep Search features, use bps-api-proxy as a relay (deploy on a server with a residential IP) and set BPS_ALLSTATS_BASE_URL in wrangler.toml to the proxy URL.

MCP Client Configuration

Claude Desktop

File: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)

{
  "mcpServers": {
    "dml-bps-mcp": {
      "command": "npx",
      "args": ["-y", "dml-bps-mcp"],
      "env": {
        "BPS_API_KEY": "your_api_key_here"
      }
    }
  }
}

Claude Code

claude mcp add bps -- npx -y dml-bps-mcp

Or .mcp.json in your project root:

{
  "mcpServers": {
    "bps": {
      "command": "npx",
      "args": ["-y", "dml-bps-mcp"],
      "env": {
        "BPS_API_KEY": "${BPS_API_KEY}"
      }
    }
  }
}

Cursor / VS Code

File ~/.cursor/mcp.json or .vscode/mcp.json:

{
  "mcpServers": {
    "dml-bps-mcp": {
      "command": "npx",
      "args": ["-y", "dml-bps-mcp"],
      "env": {
        "BPS_API_KEY": "your_api_key_here"
      }
    }
  }
}

Tools (59)

AI-Friendly Smart Tools (5)

Tool

Description

find_data

Recommended — Search & fetch data in one step (resolve region + find variable + fetch data)

find_variable

Search BPS data variables by keyword

compare_data

Compare data between regions (2+ regions in a single call)

get_trend

Fetch time-series/multi-year trend data in one call

get_ranking

Rank provinces by indicator (top-N)

For AI: Use find_data for single-region data, compare_data for comparisons, get_trend for trends, get_ranking for rankings. If results are too vague, use find_variable then get_dynamic_data.

WebAPI Tools (32)

Tool

Description

list_domains

List BPS regions (provinces, regencies/cities)

resolve_domain

Convert region name → domain code (fuzzy matching)

list_subjects

List statistics subject categories

list_subject_categories

Subject categories

list_variables

List dynamic table variables

list_vertical_variables

Vertical variables (disaggregation)

list_derived_variables

Derived/aggregated variables

list_periods

Available data periods

list_derived_periods

Derived periods

list_units

Data measurement units

get_dynamic_data

Core — Fetch dynamic table data (requires var_id)

list_static_tables

List static tables

get_static_table

Get static table details (HTML)

list_press_releases

List official press releases (BRS)

get_press_release

Get press release details

list_publications

List publications

get_publication

Get publication details

list_strategic_indicators

Strategic indicators (latest headline data)

get_trade_data

Export/import data by HS code

list_infographics

List BPS infographics

get_infographic

Get infographic details

list_news

List BPS news

get_news

Get news details

list_news_categories

List BPS news categories

list_census_events

List census activities

list_census_topics

Census topics per activity

list_census_areas

List available areas for a census activity

list_census_datasets

List datasets per census activity and topic

get_census_data

Fetch actual census data for an activity, area, and dataset

list_csa_categories

CSA categories

list_csa_subjects

CSA subjects per domain

list_csa_tables

CSA tables per subject

get_csa_table

Get CSA table details (HTML)

list_glossary

Statistics glossary

get_glossary

Get detailed definition of a specific glossary term

search

Cross-type search (WebAPI + AllStats fallback)

cache_clear

Clear cache

AllStats Search Tools (2)

Tool

Description

allstats_search

Unified search across all BPS content (publications, tables, press releases, infographics, microdata, glossary, classifications)

allstats_deep_search

Full-text search inside BPS PDF publications — unique feature, not available via WebAPI

SIMDASI Tools (8)

Tool

Description

list_simdasi_provinces

List 7-digit MFD codes for all provinces (SIMDASI)

list_simdasi_regencies

List MFD codes for regencies in a province

list_simdasi_districts

List MFD codes for districts in a regency

list_simdasi_subjects

List SIMDASI subjects/chapters for an area

list_simdasi_master_tables

List all SIMDASI master tables

list_simdasi_tables

List SIMDASI tables for an area

list_simdasi_tables_by_subject

List SIMDASI tables filtered by area + subject

get_simdasi_table

Get detailed data from a SIMDASI table

SDGs Tools (2)

Tool

Description

list_sdgs

List SDGs indicators (optionally by goal 1-17)

get_sdgs_data

Fetch actual SDGs indicator values by var_id

SDDS Tools (2)

Tool

Description

list_sdds

List SDDS indicators following IMF standards

get_sdds_data

Fetch SDDS indicator data by var_id and model type

Statistical Classification Tools (2)

Tool

Description

list_classifications

List KBLI (2009/2015/2017/2020) or KBKI (2015) entries

get_classification

Get detailed information about a specific classification entry

How AI Uses This Server

User: "What was Indonesia's poverty rate in 2023?"

AI uses: find_data(query="poverty", region="Indonesia", year="2023")

Internal process (automatic):
1. Intent Detection: "single_value" → find_data
2. Resolve "Indonesia" → domain 0000
3. Normalize: "poverty" → stopword filtering
4. Find relevant subject → "Kemiskinan dan Ketimpangan"
5. Find variable → "Jumlah Penduduk Miskin" (var_id: 183)
6. Resolve "2023" → period ID 123
7. Fetch data → 25.9 million people
8. Result hints: "Check Gini ratio: get_dynamic_data(var="98")"

If find_data fails, the AI can:
- find_variable(keyword="poverty") → see available variables
- list_strategic_indicators() → latest headline data
- search(keyword="poverty") → find related tables/publications

User: "Compare poverty in East Java and West Java"
AI uses: compare_data(query="poverty", regions="Jawa Timur, Jawa Barat")

User: "Trend of unemployment in Indonesia 2019-2024"
AI uses: get_trend(query="unemployment", region="Indonesia", start_year="2019", end_year="2024")

User: "Top 10 poorest provinces"
AI uses: get_ranking(query="poverty", top_n=10, order="highest")

User: "Religious affiliation statistics in Jombang Regency"
AI uses: find_data(query="religion", region="Kab Jombang")
→ Intent: "table" → find_data with static table fallback
→ Automatically fetches "Population by Religion" static table
→ Result hints: "Check more detail: list_static_tables(keyword="religion")"

Example Queries

"What was Indonesia's poverty rate in 2023?"
"Compare poverty rates between East Java and West Java 2020-2023"
"Unemployment trend in Indonesia from 2019 to 2024"
"Top 10 provinces with highest poverty rate"
"Rank all provinces by HDI 2023"
"Latest press releases about inflation"
"Indonesia's coffee export data for 2024"
"Find publications about telecommunications statistics"
"Search for 'internet access' inside BPS publications"
"What is East Java's HDI?"
"Latest quarterly economic growth"
"Religious affiliation statistics in Klaten Regency"
"Population distribution per district in Jakarta"
"Get population data for Jakarta from the SIMDASI system"
"List SDG indicators for climate action in Indonesia"
"Show me SDDS macroeconomic data for Indonesia"
"What are the KBLI 2020 business classification categories?"

Resources (3)

URI

Description

bps://domains/provinces

List of all Indonesian provinces (cached)

bps://domains/regencies/{prov_id}

Regencies/cities per province

bps://subjects/{domain}

Statistics subjects per domain

Prompts (5)

Prompt

Description

compare_regions

Compare statistics between two regions

trend_analysis

Multi-year data trend analysis

poverty_profile

Poverty profile of a region

economic_overview

Regional economic summary

population_stats

Population statistics

Environment Variables

Variable

Default

Description

BPS_API_KEY

(required)

API key from webapi.bps.go.id

BPS_API_BASE_URL

https://webapi.bps.go.id/v1

API base URL

BPS_DEFAULT_LANG

ind

Default language: ind / eng

BPS_DEFAULT_DOMAIN

0000

Default domain (0000 = National)

BPS_CACHE_ENABLED

true

Enable caching

BPS_CACHE_MAX_ENTRIES

500

Maximum cache entries

BPS_LOG_LEVEL

info

Log level: debug/info/warn/error

Development

Setup

git clone https://github.com/Digimetalab/dml-bps-mcp
cd dml-bps-mcp
npm install

Build & Test

npm run build          # Compile TypeScript
npm run test:unit      # Run unit tests (164 tests)
npm run lint           # ESLint check
npm run typecheck      # TypeScript type check

Running Locally

# With environment variable
BPS_API_KEY=your_key npm start

# Or create a .env file (see .env.example)
cp .env.example .env
# Edit .env, fill in BPS_API_KEY
npm start

Testing with MCP Inspector

MCP Inspector lets you test tools interactively:

# Install and run inspector
npx @modelcontextprotocol/inspector

# In the inspector UI:
# 1. Transport: stdio
# 2. Command: node
# 3. Args: dist/index.js
# 4. Env: BPS_API_KEY=your_key

Or test directly via stdin (without inspector):

# Test initialize
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | node --env-file=.env dist/index.js

# Test find_data
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}\n{"jsonrpc":"2.0","method":"notifications/initialized"}\n{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"find_data","arguments":{"query":"inflation","region":"Indonesia"}}}\n' | node --env-file=.env dist/index.js

Testing Remote Worker (Local)

# Start worker locally
npm run dev:worker

# Test in another terminal
curl -X POST http://localhost:8787/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "X-BPS-API-Key: your_key" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'

Project Structure

src/
├── auth/           # API key & OAuth2 providers
├── client/         # BPS WebAPI & AllStats HTTP clients
├── config/         # Configuration & defaults
├── prompts/        # MCP prompt templates
├── resources/      # MCP resources (domain lists)
├── services/       # Cache, domain resolver, data formatter
│   ├── intent-detector.ts   # Intent detection (comparison, trend, ranking, table)
│   ├── learning.ts          # Persistent learning store + stopwords-iso
│   ├── domain-resolver.ts   # Fuzzy domain matching
│   └── data-formatter.ts    # Format BPS data to markdown
├── tools/          # MCP tool definitions (59 tools)
│   ├── smart.tools.ts              # find_data, find_variable (AI shortcuts)
│   ├── analysis.tools.ts           # compare_data, get_trend, get_ranking
│   ├── dynamic-data.tools.ts       # Core data tools
│   ├── search.tools.ts             # Search with AllStats fallback
│   ├── allstats.tools.ts           # AllStats search & deep search
│   ├── domain.tools.ts             # Domain resolution tools
│   ├── publication.tools.ts        # Publications & press releases
│   ├── trade.tools.ts              # Foreign trade data
│   ├── census.tools.ts             # Census data tools
│   ├── simdasi.tools.ts            # SIMDASI tools
│   ├── sdgs.tools.ts               # SDGs tools
│   ├── sdds.tools.ts               # SDDS tools
│   ├── classification.tools.ts     # KBLI/KBKI classification tools
│   ├── csa.tools.ts                # CSA subject tools
│   ├── static-table.tools.ts       # Static table tools
│   ├── reference.tools.ts          # Strategic indicators, infographics
│   ├── infographic.tools.ts        # Infographic tools
│   ├── news.tools.ts               # News tools
│   ├── glossary.tools.ts           # Glossary tools
│   └── utility.tools.ts            # cache_clear, server info
├── transport/      # stdio transport
├── utils/          # Logger and error handling
├── index.ts        # CLI entry point (stdio)
├── worker.ts       # Cloudflare Worker entry point (HTTP)
└── server.ts       # MCP server factory

GitHub Actions / CI/CD

This project uses three automated workflows on every push to main:

Workflow

Description

Required Secrets

CI

Lint, typecheck, unit tests

—

Deploy Workers

Deploy to Cloudflare Workers

CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID

Release

Automated versioning & changelog

RELEASE_PLEASE_TOKEN

To set up your fork, add these secrets at: https://github.com/<your-org>/dml-bps-mcp/settings/secrets/actions

Support & Donations

This project is developed by Digimetalab. If you find this project useful and would like to support ongoing development and server hosting, you can contribute through:

Attribution

Source: Badan Pusat Statistik (BPS) — https://www.bps.go.id This service uses the BPS (Badan Pusat Statistik) API.

License

MIT

Available Tools

58 tools
cache_clearA

Clear BPS data cache. Useful to ensure latest data is fetched directly from the API.

Inputs: no named parameters.

compare_dataA

Compare statistical data across regions in one step. Use this tool when the user wants to compare data between 2 or more regions. Note: only supports comparison for 1 year. For multi-year comparison, use get_trend per region.

Example user queries suitable for this tool:

  • "compare poverty in East Java and West Java"

  • "HDI DKI Jakarta vs Banten vs West Java"

  • "unemployment comparison across provinces in Java"

  • "which has higher poverty East Java or West Java?"

Inputs: query (required), regions (required), year.

find_dataA

Primary AI tool: search and retrieve BPS data in one step. Automatically: detect intent → resolve region → find variable → fetch data.

Intent Detection (automatic):

  • Single value (specific number) → find_data

  • Comparison ("compare X and Y") → delegate to compare_data

  • Trend ("trend 2019-2024") → delegate to get_trend

  • Ranking ("top 10 poorest provinces") → delegate to get_ranking

  • Table/Breakdown ("religion by subdistrict") → find_data + static table fallback

  • Publication ("find publication") → delegate to search

Quick Reference — Common Topics

Topic

Fastest Method

var_id (national)

Poverty (count)

find_data or get_dynamic_data

183, 185

Poverty (%)

find_data or get_dynamic_data

184, 192

Unemployment (TPT %)

get_dynamic_data(var="543")

543

Unemployment (count)

get_dynamic_data(var="674")

674

Inflation (YoY)

list_strategic_indicators

-

Economic growth

list_strategic_indicators

-

HDI

list_strategic_indicators or get_dynamic_data

1706

Gini Ratio

get_dynamic_data(var="98")

98

Population

get_dynamic_data(var="1452")

1452

GRDP

list_strategic_indicators(domain=province_code)

-

Exports/Imports

list_strategic_indicators or get_trade_data

-

Religion

find_data or list_static_tables

-

Publications/BRS

search or allstats_search

-

Text in PDF

allstats_deep_search

-

Strategy:

  1. Latest headline figures → list_strategic_indicators

  2. Historical/specific numeric data → find_data or get_dynamic_data + var_id above

  3. Search publications/tables/BRS → search or allstats_search

  4. Search text inside PDFs → allstats_deep_search

Examples:

  • find_data(query="penduduk miskin", region="Indonesia", year="2023")

  • find_data(query="pengangguran", region="Jawa Timur", year="2023")

  • find_data(query="PDRB", region="Bali", year="2023")

  • find_data(query="pemeluk agama", region="Kabupaten Jombang")

Inputs: query (required), year, region.

find_variableA

Search BPS data variables by keyword. Searches across all relevant subjects.

Usage examples:

  • find_variable(keyword="penduduk") → variables related to population

  • find_variable(keyword="kemiskinan", domain="3500") → poverty variables in East Java

  • find_variable(keyword="inflasi") → national inflation variables

After getting a var_id from this tool, use get_dynamic_data to retrieve the data.

Inputs: keyword (required), domain, subject.

get_census_dataA

Fetch actual census data for a specific activity, area, and dataset. Use list_census_events, list_census_areas, and list_census_datasets first to get the required IDs.

Inputs: dataset (required), kegiatan (required), wilayah_sensus (required).

get_classificationA

Get detailed information about a specific statistical classification entry by its ID. Use list_classifications first to find the ID.

Inputs: id (required), model (required).

get_csa_tableA

Retrieve details of a single CSA table (includes table content in HTML format).

Inputs: id (required), domain (required).

get_dynamic_dataA

Fetch data from BPS dynamic tables. This tool requires a specific variable ID.

IMPORTANT: Use find_data first for automatic search. Use this tool only if you already know the var_id.

Common variables (national, domain=0000):

  • 1452: Population (thousand people)

  • 185: Poverty Percentage

  • 523: Open Unemployment Rate (%)

  • 108: GDP Growth Rate (%)

  • 1706: Human Development Index (HDI)

  • 2103: Gini Ratio

Use find_variable to search for other variable IDs.

Inputs: var (required), domain (required), th, turth, +2 more.

get_glossaryA

Get detailed definition of a specific glossary term by its ID. Use list_glossary to find term IDs.

Inputs: id (required).

get_infographicA

Retrieve details of a single BPS infographic including full description and download link.

Inputs: id (required), domain (required).

get_newsA

Retrieve details of a single news item from the BPS website.

Inputs: id (required), domain (required).

get_press_releaseB

Retrieve details of a single BPS Press Release (BRS).

Inputs: id (required), domain (required).

get_publicationB

Retrieve details of a single BPS publication.

Inputs: id (required), domain (required).

get_rankingA

Retrieve province rankings by a given indicator in one step. Use this tool when the user wants to see rankings, top-N, or comparisons across all provinces.

Example user queries suitable for this tool:

  • "10 poorest provinces in Indonesia"

  • "HDI ranking across all provinces"

  • "provinces with highest unemployment"

  • "poverty ranking per province 2023"

  • "5 provinces with the largest population"

Inputs: query (required), year, order, top_n.

get_sdds_dataA

Fetch actual SDDS indicator data. Use list_sdds first to find the var_id and model type. For 'data' model, this fetches dynamic table data. For 'statictable' model, it fetches a static table.

Inputs: var_id (required), year, model.

get_sdgs_dataA

Fetch actual SDGs indicator data for a specific variable. Use list_sdgs first to find the var_id, then call this to get the data values.

Inputs: var_id (required), year.

get_simdasi_tableA

Get detailed data from a SIMDASI table for a specific area and year. Requires wilayah (7-digit MFD), tahun (year), and id_tabel from list_simdasi_tables.

Inputs: tahun (required), wilayah (required), id_tabel (required).

get_static_tableA

Retrieve details of a single BPS static table (includes table content in HTML format).

Inputs: id (required), domain (required).

get_trade_dataA

Retrieve foreign trade data (exports/imports) by HS code. Data includes value and volume of Indonesia's trade.

Inputs: year (required), period (required), source (required), hs_code (required), +1 more.

get_trendA

Retrieve time-series data (multi-year trend) in one step. Use this tool when the user wants to see data trends year over year.

Example user queries suitable for this tool:

  • "poverty trend Indonesia 2019-2023"

  • "HDI development in East Java last 5 years"

  • "how has unemployment been from 2020 to 2024?"

  • "poverty data West Java year to year"

Inputs: query (required), region, end_year, start_year.

list_census_areasA

List available areas/regions for a specific census activity. Use list_census_events to get the activity ID. Returns MFD codes used as wilayah_sensus in get_census_data.

Inputs: kegiatan (required).

list_census_datasetsA

List available datasets for a specific census activity and topic. Use list_census_events and list_census_topics first.

Inputs: topik (required), kegiatan (required).

list_census_eventsA

List BPS census activities (Population Census, Economic Census, Agricultural Census, etc.). Use the activity ID to fetch census topics and data.

Inputs: no named parameters.

list_census_topicsA

List data topics available for a specific census activity. Use list_census_events to get the activity ID.

Inputs: kegiatan (required).

list_classificationsA

List BPS statistical classification entries by model. Supports KBLI (2009/2015/2017/2020 — business classification based on ISIC) and KBKI (2015 — commodity classification). Use 'level' parameter to filter by hierarchy level.

Inputs: model (required), level.

list_csa_categoriesC

List BPS CSA (Classification of Statistical Activities) categories. CSA is an international statistical activity classification.

Inputs: domain.

list_csa_subjectsC

List CSA subjects for a given domain and category.

Inputs: domain, subcat.

list_csa_tablesB

List CSA tables for a given domain and subject.

Inputs: page, domain, subject.

list_derived_periodsB

List derived periods for a given variable.

Inputs: var, domain.

list_derived_variablesA

List derived variables (aggregated categories). Examples: total, average.

Inputs: var, domain.

list_domainsA

List BPS domains/regions (province, regency/city). Use type='prov' for provinces, 'kab' for all regencies, 'kabbyprov' for regencies per province.

Inputs: prov, type.

list_glossaryB

Search terms in the BPS statistical glossary. Useful for understanding definitions and meanings of statistical indicators.

Inputs: page, domain, keyword.

list_infographicsB

List BPS infographics. Infographics contain easy-to-understand statistical data visualizations.

Inputs: page, domain, keyword.

list_newsA

List news from the BPS website. Unlike BRS (Official Statistics News), these are general BPS news items.

Inputs: page, domain, keyword.

list_news_categoriesA

List BPS news categories (e.g., Sensus dan Survey, Statistik Lain). Use the category name as newscat filter in list_news.

Inputs: domain.

list_periodsB

List available data periods for a given variable. Periods can be years, semesters, quarters, or months.

Inputs: var, domain.

list_press_releasesA

List BPS Press Releases (Berita Resmi Statistik / BRS). BRS contains the latest official data releases.

Inputs: page, year, month, domain, +1 more.

list_publicationsC

List BPS publications. Publications contain in-depth analysis and statistical reports.

Inputs: page, year, month, domain, +1 more.

list_sddsA

List Special Data Dissemination Standard (SDDS) indicators from BPS. SDDS covers macroeconomic data following IMF standards. Each indicator has a var_id and model type ('data' or 'statictable') used to fetch actual values. Domain is always 0000 (National).

Inputs: no named parameters.

list_sdgsA

List Sustainable Development Goals (SDGs) indicators from BPS. Optionally filter by goal number (1-17). Each indicator has a var_id that can be used with get_dynamic_data to fetch actual values. Domain is always 0000 (National).

Inputs: goal.

list_simdasi_districtsA

List 7-digit MFD codes for districts in a regency, used in SIMDASI. Use list_simdasi_regencies to get the parent MFD code.

Inputs: parent (required).

list_simdasi_master_tablesB

List all SIMDASI master tables available in the system.

Inputs: no named parameters.

list_simdasi_provincesA

List 7-digit MFD codes for all provinces used in SIMDASI (Sistem Informasi Manajemen Data Statistik Terintegrasi). Use these codes as the 'wilayah' parameter for other SIMDASI tools.

Inputs: no named parameters.

list_simdasi_regenciesA

List 7-digit MFD codes for regencies/cities in a province, used in SIMDASI. Use list_simdasi_provinces to get the parent MFD code.

Inputs: parent (required).

list_simdasi_subjectsA

List SIMDASI subjects/chapters available for a specific area. Requires a 7-digit MFD wilayah code from list_simdasi_provinces.

Inputs: wilayah (required).

list_simdasi_tablesA

List SIMDASI tables available for a specific area. Requires a 7-digit MFD wilayah code from list_simdasi_provinces.

Inputs: wilayah (required).

list_simdasi_tables_by_subjectA

List SIMDASI tables filtered by area and subject. Requires wilayah (7-digit MFD) and id_subjek from list_simdasi_subjects.

Inputs: wilayah (required), id_subjek (required).

list_static_tablesA

List BPS static tables. Static tables contain pre-formatted data in HTML table format.

Inputs: page, year, month, domain, +1 more.

list_strategic_indicatorsA

List BPS strategic indicators — latest headline data (inflation, economic growth, poverty, unemployment, HDI, exports/imports, etc.).

Use this tool for a quick summary of key indicators for a region. Data includes the latest value. For multi-year historical data, use find_data or get_dynamic_data.

Inputs: var, page, domain.

list_subject_categoriesB

List BPS statistical subject categories. Categories group related subjects.

Inputs: domain.

list_subjectsA

List available BPS statistical data subjects for a given domain. Subjects are main data categories (e.g. Population, Poverty, Trade).

Inputs: domain, subcat.

list_unitsA

List data units used in a given domain. Examples: Person, Percent, Rupiah.

Inputs: domain.

list_variablesC

List data variables in BPS dynamic tables. Variables determine specific data you can retrieve (e.g. Population Count, Poverty Rate).

Inputs: page, year, domain, subject.

list_vertical_variablesA

List vertical variables (breakdown/disaggregation) for a given variable. Examples: gender, age group.

Inputs: var, domain.

resolve_domainA

Convert region name to BPS domain code. Supports official names, abbreviations (Jatim, Jabar, Jogja), and fuzzy matching.

Inputs: query (required).

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 58 tools

    Disambiguation3/5

    Multiple search tools (search, allstats_search, allstats_deep_search, find_data, find_variable) overlap in function, with descriptions providing fallback order but still creating ambiguity. Similarly, several list_* tools for regions and SIMDASI tables have subtle differences that could cause misselection.

    Naming Consistency4/5

    The majority of tools use a consistent verb_noun pattern (list_*, get_*, find_*, compare_*). Exceptions like allstats_search, allstats_deep_search, and cache_clear deviate slightly but do not break the overall readable and predictable structure.

    Tool Count2/5

    With 58 tools, the server is significantly over-scaled, exceeding the 25+ threshold for 'too many.' Many tools are redundant or could be consolidated (e.g., multiple search variants and regional listing helpers), making the set heavy for agents to navigate.

    Completeness5/5

    The tool set thoroughly covers BPS's statistical data products: dynamic tables, static tables, censuses, SIMDASI, publications, press releases, news, classifications, SDGs, SDDS, trade data, and glossary. High-level AI tools (find_data, compare_data, get_trend, get_ranking) fill common workflow gaps, leaving no evident missing operations for a read-only data access API.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      MCP server for accessing Indonesian local government data from Satu Data Ngawi. Enables querying datasets, organizations, categories, and statistics through natural language.
      6
      6 npm
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      An MCP server that provides official statistical data for development indicators in Asia-Pacific. It wraps the ESCAP Data Explorer API, letting any MCP-compatible host query SDG and thematic data through natural language.
      5
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      MCP server for accessing USDA National Agricultural Statistics Service (Quick Stats) data, enabling natural language queries about agricultural statistics.
      312 npm
      MIT