SingStat Table Builder MCP — Department of Statistics Singapore. Provides access to Singapore official statistics tables via the Department of Statistics Singapore's public API.
Three tools with complete schemas and descriptions. Naming follows verb_noun convention (search_, table_). Descriptions are adequate (100-200 chars) but lack actionable context for LLM selection. Parameters are typed and mostly described, but lack constraints (enums, ranges, format specs). Output schemas are not documented, LLMs cannot predict response structure. No error handling guidance. Missing idempotency hints and dependency documentation.
Search Singapore official statistics tables (Department of Statistics Singapore) by keyword. Returns resource ids and titles. The `id` of a result (e.g. "M810001") is the resourceId used by table_data and table_metadata.
Fetch the time-series data rows for a Singapore statistics table by resourceId (get ids from search_tables). Data is returned under `Data` with a `row` array of series, each containing dated `columns`. Filter time periods with `timeFilter` (comma-separated periods like "2020,2021") or `between` (a from,to range like "2010,2020"); page with offset/limit.
Get the structure/metadata for a Singapore statistics table by resourceId (get ids from search_tables): theme, subject, frequency, period coverage and the list of variables/series. Result is under `Data.records`.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields are in Data.records for table_metadata, or the row/columns structure for table_data). This forces agents to guess and risks parsing errors.
Parameter 'searchOption' in search_tables has enum constraint but description includes example values ('all', 'title', 'variable').
No error handling guidance. If resourceId is invalid or API returns 4xx/5xx, LLM receives raw error text (e.g., 'SingStat: 404 Not Found'). Should guide LLM to retry with search_tables or suggest valid IDs.
Parameter 'limit' and 'offset' in table_data lack numeric constraints (min/max). Unbounded integers let LLMs pass absurd values (limit=999999) that break pagination or timeout.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
No dependency hints. Description of table_data should state 'Call search_tables() first to get valid resourceId values.' This prevents wasted calls and guides multi-step planning.