kira-dosm
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KIRA_HOST | No | Host interface for the HTTP transport. Set to 0.0.0.0 to listen on all interfaces. | 127.0.0.1 |
| KIRA_PORT | No | Port for the HTTP transport when KIRA_TRANSPORT=http. | 8000 |
| KIRA_TRANSPORT | No | Transport mode for the MCP server: 'stdio' or 'http'. Defaults to stdio. | stdio |
| KIRA_CACHE_TTL_SECONDS | No | In-process cache TTL in seconds for DOSM queries. Set 0 to disable. | 3600 |
| KIRA_RATE_LIMIT_PER_MINUTE | No | Per-client-IP rate limit for the HTTP transport (requests per minute). Set 0 to disable. | 60 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| find_seriesA | Find candidate series for a natural-language question about Malaysian official statistics. Returns ranked candidates, each with a one-line reason for the match — always call this before get_series if you don't already have a series id. A curated KIRA series is not the only source of truth here: this only
searches the ~20 series KIRA has registered so far, a small fraction
of what DOSM actually publishes (open.dosm.gov.my/data-catalogue has
the full list). An empty result means "not curated yet," not "this
data doesn't exist" — see the |
| describe_seriesA | Full metadata for a series: coverage, unit, base years, known breaks/rebases, and caveats. Call this before trusting a comparison across time or before deciding whether a transform is needed. |
| get_seriesA | Fetch values for a series, optionally transformed (yoy/mom/qoq) and filtered by date range or geography. Every response carries a provenance block and a warnings array — never treat the bare numbers as the whole answer; read the warnings. |
| compare_seriesA | Align two or more series on a common date index. Refuses to compare a series against its own seasonally-adjusted/not-adjusted counterpart (see each series' sa_counterpart field) rather than silently returning a misleading comparison — call describe_series on each id first if you're unsure whether that applies. |
| explain_breakA | Why does this series jump/change at a given date? Returns each documented break (rebase, methodology change, classification revision, census baseline shift) in plain language, or says there are none. |
| latest_releaseB | The newest available data point for a series, plus an estimated next release date derived from the series' frequency and typical release lag. The estimate is not authoritative — DOSM's own release calendar is the source of truth. |
| computeA | Statistical operations beyond a plain lookup:
|
| raw_queryA | Escape hatch for shapes the curated tools don't cover — e.g. a
division/sector/group breakdown a series' source table carries but no
registry entry filters to (get_series only ever returns the one row
per date the registry's |
| raw_query_urlA | Escape hatch for a dataset find_series returns nothing for and
that has no registry entry at all — not even for raw_query, which
still requires an existing series_id. find_series only searches
KIRA's ~20 curated series; DOSM publishes far more than that (open
.dosm.gov.my/data-catalogue has the full list). If find_series comes
up empty, don't conclude the data doesn't exist — check DOSM's
catalogue (or web search) for a storage.dosm.gov.my /
storage.data.gov.my Parquet URL, then query it directly here, same
sandboxing as raw_query (single read-only SELECT, aliased as
|
| list_geographiesA | State / district / parliament (parlimen) / state assembly (DUN)
codes and hierarchy, sourced from DOSM's population tables. |
| lookup_classificationA | Look up or traverse a DOSM classification system: |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 11 tools
Each tool targets a distinct phase of the workflow—discovery, metadata, values, comparisons, breaks, geography, transforms, raw SQL—and the raw_query vs raw_query_url distinction is clear. The one soft spot is compute deliberately duplicating get_series's yoy/mom/qoq transforms, which could cause an agent to pick either for the same task.
Most names follow a clear verb_noun pattern such as find_series, describe_series, get_series, and list_geographies. compute, raw_query, and raw_query_url break the pattern slightly, but the names remain readable and predictable overall.
Eleven tools is well-scoped for a statistics server, covering the full research workflow without bloat. Each tool has a clear role, and the two raw-query escapes are justified by the curated-only limitation of the main registry.
The set covers discovery, metadata, retrieval, comparison, break explanation, release timing, geography, derived statistics, classification lookup, and raw access, leaving no obvious dead ends. The escape hatches for uncurated datasets address the one major limitation of the curated registry.