ABS Data MCP
An open-source MCP server that provides AI assistants with live, read-only access to Australian Bureau of Statistics data. It filters the ABS API to only offer tables and options that actually contain data, helping agents find, fetch, and explain statistical tables with their caveats.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://abs-data-front-door.aicolab.workers.dev/mcpWhat its tools do
8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Can change data (1)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Search for specific ABS statistical tables
- Fetch live data from ABS dataflows
- Explain data with associated caveats
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- abs-data probe-2026-09-09T01-21-59-176Z
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 8 advertised
- Resources
- 6 advertised
- Resource templates
- 1 advertised
- Prompts
- 4 advertised
{
"tools": {
"listChanged": true
},
"prompts": {
"listChanged": true
},
"resources": {
"listChanged": true
},
"extensions": {
"io.modelcontextprotocol/ui": {}
},
"completions": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
8 advertised
search_tables — Search ABS tables
Find ABS statistical tables (dataflows) by topic words, geography level or frequency. Matches table names, topics and dimension names, and also option labels inside dimensions — a search for 'rent' finds CPI through its INDEX option 'Rents' and reports the match in matchedOptions. Census tables published at several geography levels are collapsed to one result with familyGeographies listing the others (use the geography filter to pick one). Every result has data. When the person describes a situation rather than a dataset, search for each thing it depends on (prices, wages, rents, population...). Start here, then describe_table.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free text over ids, names, topics, dimensions"
},
"frequency": {
"enum": [
"A",
"S",
"Q",
"M",
"W",
"D"
],
"type": "string",
"description": "A annual, S semi-annual, Q quarterly, M monthly, W weekly, D daily"
},
"geography": {
"type": "string",
"description": "Restrict to a geography level, e.g. SA2, LGA"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"results",
"total",
"provenance"
],
"properties": {
"total": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"results": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"seriesCount",
"frequencies",
"coverage",
"density",
"family",
"geography",
"dimensions",
"topics"
],
"properties": {
"id": {
"type": "string",
"description": "Dataflow id, e.g. CPI"
},
"name": {
"type": [
"string",
"null"
]
},
"family": {
"type": [
"string",
"null"
],
"description": "Census table family, e.g. C21_G01"
},
"topics": {
"type": "array",
"items": {
"type": "string"
}
},
"density": {
"type": [
"number",
"null"
]
},
"coverage": {
"type": "object",
"required": [
"from",
"to"
],
"properties": {
"to": {
"type": [
"string",
"null"
],
"description": "Latest observed period"
},
"from": {
"type": [
"string",
"null"
],
"description": "Earliest observed period, e.g. 2002-Q1"
}
},
"additionalProperties": false
},
"geography": {
"type": [
"string",
"null"
],
"description": "Geography level for family members, e.g. LGA"
},
"dimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Dimension ids in key order"
},
"description": {
"type": [
"string",
"null"
],
"description": "ABS's own description, trimmed"
},
"frequencies": {
"type": "array",
"items": {
"enum": [
"A",
"S",
"Q",
"M",
"W",
"D"
],
"type": "string",
"description": "A annual, S semi-annual, Q quarterly, M monthly, W weekly, D daily"
}
},
"seriesCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Series confirmed to exist by retrieval"
},
"matchedOptions": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimension",
"code",
"label"
],
"properties": {
"code": {
"type": "string"
},
"label": {
"type": [
"string",
"null"
]
},
"dimension": {
"type": "string"
}
},
"additionalProperties": false
}
},
"familyGeographies": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}
},
"provenance": {
"type": "object",
"required": [
"runId",
"observedAt"
],
"properties": {
"runId": {
"type": "string"
},
"observedAt": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"title": "Search ABS tables",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}describe_table — Describe a table
A table's dimensions in key order, its coverage dates, and its options. Dimensions with up to 64 options list them inline with labels; larger ones (geography, occupations) say how many and are searchable with search_options.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"table"
],
"properties": {
"table": {
"type": "string",
"minLength": 1,
"description": "Dataflow id, e.g. CPI"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"table",
"dimensions",
"keyFormat",
"exampleUrl",
"provenance"
],
"properties": {
"table": {
"type": "object",
"required": [
"id",
"name",
"seriesCount",
"frequencies",
"coverage",
"density",
"family",
"geography",
"dimensions",
"topics"
],
"properties": {
"id": {
"type": "string",
"description": "Dataflow id, e.g. CPI"
},
"name": {
"type": [
"string",
"null"
]
},
"family": {
"type": [
"string",
"null"
],
"description": "Census table family, e.g. C21_G01"
},
"topics": {
"type": "array",
"items": {
"type": "string"
}
},
"density": {
"type": [
"number",
"null"
]
},
"coverage": {
"type": "object",
"required": [
"from",
"to"
],
"properties": {
"to": {
"type": [
"string",
"null"
],
"description": "Latest observed period"
},
"from": {
"type": [
"string",
"null"
],
"description": "Earliest observed period, e.g. 2002-Q1"
}
},
"additionalProperties": false
},
"geography": {
"type": [
"string",
"null"
],
"description": "Geography level for family members, e.g. LGA"
},
"dimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Dimension ids in key order"
},
"description": {
"type": [
"string",
"null"
],
"description": "ABS's own description, trimmed"
},
"frequencies": {
"type": "array",
"items": {
"enum": [
"A",
"S",
"Q",
"M",
"W",
"D"
],
"type": "string",
"description": "A annual, S semi-annual, Q quarterly, M monthly, W weekly, D daily"
}
},
"seriesCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Series confirmed to exist by retrieval"
},
"matchedOptions": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimension",
"code",
"label"
],
"properties": {
"code": {
"type": "string"
},
"label": {
"type": [
"string",
"null"
]
},
"dimension": {
"type": "string"
}
},
"additionalProperties": false
}
},
"familyGeographies": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"keyFormat": {
"type": "string",
"description": "Dimension ids joined by '.', the order a selection is serialised in"
},
"dimensions": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"position",
"codelist",
"optionCount"
],
"properties": {
"id": {
"type": "string"
},
"options": {
"type": "array",
"items": {
"type": "object",
"required": [
"code",
"label"
],
"properties": {
"code": {
"type": "string"
},
"label": {
"type": [
"string",
"null"
]
},
"parent": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}
},
"codelist": {
"type": [
"string",
"null"
]
},
"position": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"optionCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"determinedBy": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}
},
"exampleUrl": {
"type": "string",
"format": "uri"
},
"provenance": {
"type": "object",
"required": [
"runId",
"observedAt"
],
"properties": {
"runId": {
"type": "string"
},
"observedAt": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"title": "Describe a table",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}search_options — Search a dimension's options
Find option codes by label text within one dimension of one table — e.g. a suburb name in a geography dimension. Returns codes to use in get_data's select.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"table",
"dimension",
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Match against option codes and labels"
},
"table": {
"type": "string",
"minLength": 1
},
"dimension": {
"type": "string",
"minLength": 1
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"options",
"total",
"provenance"
],
"properties": {
"total": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"options": {
"type": "array",
"items": {
"type": "object",
"required": [
"code",
"label"
],
"properties": {
"code": {
"type": "string"
},
"label": {
"type": [
"string",
"null"
]
},
"parent": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}
},
"provenance": {
"type": "object",
"required": [
"runId",
"observedAt"
],
"properties": {
"runId": {
"type": "string"
},
"observedAt": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"title": "Search a dimension's options",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_data — Get data
Fetch observations. `select` maps dimension ids to option codes or labels (several allowed); omitted dimensions match everything. The selection is verified live against ABS before fetching, so a call that succeeds always returns real data. Returns up to maxRows observations (default 500, most recent 12 periods per series unless a period range is given), a summary, and the URL for the complete pull. If an option or combination does not exist you are asked to choose from the valid ones.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"table"
],
"properties": {
"lastN": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "Most recent N observations per series; default 12 when no period is given"
},
"table": {
"type": "string",
"minLength": 1
},
"firstN": {
"type": "integer",
"maximum": 1000,
"minimum": 1
},
"select": {
"type": "object",
"default": {},
"description": "dimension id -> option code or label (or several). Omitted dimensions match everything.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
}
]
}
},
"maxRows": {
"type": "integer",
"default": 500,
"maximum": 2000,
"minimum": 1,
"description": "Cap on returned observations"
},
"endPeriod": {
"type": "string"
},
"startPeriod": {
"type": "string",
"description": "e.g. 2020, 2020-Q1, 2020-03"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"table",
"key",
"seriesMatched",
"rows",
"rowsReturned",
"truncated",
"periodRange",
"fullDataUrl",
"availabilityUrl",
"provenance"
],
"properties": {
"key": {
"type": "string",
"description": "The resolved selection as an SDMX key"
},
"rows": {
"type": "array",
"items": {
"type": "object",
"required": [
"series",
"period",
"value"
],
"properties": {
"unit": {
"type": [
"string",
"null"
]
},
"value": {
"type": [
"number",
"null"
]
},
"period": {
"type": "string"
},
"series": {
"type": "string",
"description": "The series key, e.g. 1.10001.10.50.Q"
},
"status": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}
},
"table": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"provenance": {
"type": "object",
"required": [
"runId",
"observedAt"
],
"properties": {
"runId": {
"type": "string"
},
"observedAt": {
"type": "string"
}
},
"additionalProperties": false
},
"fullDataUrl": {
"type": "string",
"format": "uri"
},
"periodRange": {
"type": "object",
"required": [
"from",
"to"
],
"properties": {
"to": {
"type": [
"string",
"null"
],
"description": "Latest observed period"
},
"from": {
"type": [
"string",
"null"
],
"description": "Earliest observed period, e.g. 2002-Q1"
}
},
"additionalProperties": false
},
"rowsReturned": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"seriesMatched": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"availabilityUrl": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
}{
"title": "Get data",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}search — Search the catalogue by writing code
Run JavaScript against the whole catalogue document — every table, its dimensions, coverage and small-dimension options — in an isolated sandbox with no network. Use it to answer questions the fixed verbs make awkward: 'which tables have both an SA2 geography and a quarterly frequency?', 'list every dimension name and how often it appears', 'find codelists whose labels mention rent'. Your code runs inside an async function with `catalogue` in scope; `return` a JSON-serialisable value; console.log output is captured. // The `catalogue` object available in search(): interface Catalogue { provenance: { runId: string; observedAt: string }; corpus: { tables: number; seriesConfirmed: number; seriesImpliedByMetadata: number; density: number }; tables: Record<string, { // keyed by table id, e.g. catalogue.tables.CPI id: string; name: string|null; description: string|null; seriesCount: number; frequencies: string[]; coverage: { from: string|null; to: string|null }; density: number|null; family: string|null; geography: string|null; topics: string[]; dimensions: { id: string; position: number; codelist: string|null; optionCount: number; literal: boolean }[]; }>; options: { literal: Record<string, Record<string, string|null>>; // codelist id -> { code: label } for small codelists (<=64 options) branded: Record<string, number>; // large codelists -> option count (use abs.searchOptions in execute) }; }
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "JavaScript. `catalogue` is in scope. Must return a value."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ok",
"logs"
],
"properties": {
"ok": {
"type": "boolean"
},
"logs": {
"type": "array",
"items": {
"type": "string"
}
},
"error": {
"type": "string"
},
"result": {},
"truncated": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"title": "Search the catalogue by writing code",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}execute — Fetch and analyse data by writing code
Run JavaScript in an isolated sandbox whose only capability is `abs`, a client with the same four verbs as this server (searchTables, describeTable, searchOptions, getData) and the same guarantees: every selection is verified against ABS before fetching. Use it for multi-series or multi-table analysis — fetch several series, compute growth rates, rank capitals, join tables — and `return` only the computed result, so large payloads never reach the conversation. No network beyond `abs`. Budgets: 10s CPU, 50 calls, 25s wall clock, 200KB result. Your code runs inside an async function; use `await`; console.log is captured. // The `abs` object available in execute(): interface Abs { searchTables(input: { query?: string; geography?: string; frequency?: "A"|"S"|"Q"|"M"|"W"|"D"; limit?: number }): Promise<{ results: TableSummary[]; total: number }>; describeTable(table: string): Promise<{ table: TableSummary; dimensions: { id: string; position: number; optionCount: number; options?: { code: string; label: string|null }[] }[]; keyFormat: string }>; searchOptions(input: { table: string; dimension: string; query: string; limit?: number }): Promise<{ options: { code: string; label: string|null; parent?: string|null }[]; total: number }>; getData(input: { table: string; select?: Record<string, string|string[]>; startPeriod?: string; endPeriod?: string; lastN?: number; firstN?: number; maxRows?: number }): Promise<{ key: string; rows: { series: string; period: string; value: number|null; unit?: string|null }[]; rowsReturned: number; truncated: boolean; seriesMatched: number; fullDataUrl: string }>; } interface TableSummary { id: string; name: string|null; seriesCount: number; frequencies: string[]; coverage: { from: string|null; to: string|null }; dimensions: string[]; family: string|null; geography: string|null; matchedOptions?: { dimension: string; code: string; label: string|null }[] } // getData throws an Error whose message is JSON: { reason, dimension, message, validOptions?, alternatives? } — catch it, read validOptions, correct and retry.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "JavaScript. `abs` is in scope. Must return a value."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ok",
"logs"
],
"properties": {
"ok": {
"type": "boolean"
},
"logs": {
"type": "array",
"items": {
"type": "string"
}
},
"error": {
"type": "string"
},
"result": {},
"truncated": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"title": "Fetch and analyse data by writing code",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}feedback_form — Open a feedback form
Open a feedback form for the person, prefilled with your draft, so they can report a problem or suggest an improvement to this ABS connector — or flag something wrong in ABS's own data. Use it whenever the person wants to give feedback, or agrees when you offer after something went wrong. Fill in what you know from the conversation: kind, a one-line summary in their words, details, and the tool, table, selection and error involved. Never include personal information about anyone, and never fill in a contact email the person did not give you. This tool sends nothing: on hosts that show interactive views the person reviews, edits and sends the form themselves; elsewhere, follow the `next` field.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"kind": {
"enum": [
"bug",
"data",
"missing",
"idea",
"docs",
"praise",
"other"
],
"type": "string",
"description": "bug: something broke; data: a figure or label looks wrong; missing: an expected table or option is absent; idea: an improvement; docs: unclear guidance; praise: it worked well; other"
},
"tool": {
"type": "string",
"maxLength": 64,
"description": "The tool involved, e.g. get_data"
},
"about": {
"enum": [
"connector",
"abs"
],
"type": "string",
"default": "connector",
"description": "connector: this connector or its site; abs: ABS's own data or API (so it can be passed on to ABS)"
},
"error": {
"type": "string",
"maxLength": 1000,
"description": "The error reason or message returned, if any"
},
"table": {
"type": "string",
"maxLength": 64,
"description": "The ABS table id involved, e.g. CPI"
},
"contact": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254,
"description": "Only if the person chose to give an email address for a reply. Never guess or fill one in."
},
"details": {
"type": "string",
"maxLength": 5000,
"description": "What happened and what was expected. No personal information about anyone."
},
"summary": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "One line, in the person's own words"
},
"assistant": {
"type": "string",
"maxLength": 80,
"description": "The AI tool in use, e.g. Claude, ChatGPT, Copilot"
},
"selection": {
"type": "string",
"maxLength": 1000,
"description": "The selection or query involved, as JSON or the SDMX key"
},
"shareWithAbs": {
"type": "boolean",
"default": false,
"description": "Only true if the person agreed this may be passed on to ABS, contact address included"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"draft",
"next"
],
"properties": {
"next": {
"type": "string"
},
"draft": {
"type": "object",
"properties": {
"kind": {
"enum": [
"bug",
"data",
"missing",
"idea",
"docs",
"praise",
"other"
],
"type": "string",
"description": "bug: something broke; data: a figure or label looks wrong; missing: an expected table or option is absent; idea: an improvement; docs: unclear guidance; praise: it worked well; other"
},
"tool": {
"type": "string",
"maxLength": 64,
"description": "The tool involved, e.g. get_data"
},
"about": {
"enum": [
"connector",
"abs"
],
"type": "string",
"default": "connector",
"description": "connector: this connector or its site; abs: ABS's own data or API (so it can be passed on to ABS)"
},
"error": {
"type": "string",
"maxLength": 1000,
"description": "The error reason or message returned, if any"
},
"table": {
"type": "string",
"maxLength": 64,
"description": "The ABS table id involved, e.g. CPI"
},
"contact": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254,
"description": "Only if the person chose to give an email address for a reply. Never guess or fill one in."
},
"details": {
"type": "string",
"maxLength": 5000,
"description": "What happened and what was expected. No personal information about anyone."
},
"summary": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "One line, in the person's own words"
},
"assistant": {
"type": "string",
"maxLength": 80,
"description": "The AI tool in use, e.g. Claude, ChatGPT, Copilot"
},
"selection": {
"type": "string",
"maxLength": 1000,
"description": "The selection or query involved, as JSON or the SDMX key"
},
"shareWithAbs": {
"type": "boolean",
"default": false,
"description": "Only true if the person agreed this may be passed on to ABS, contact address included"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"title": "Open a feedback form",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}submit_feedback — Send feedback to the maintainers
Send feedback about this ABS connector (or a report about ABS's own data) to its maintainers. Only call this after the person has seen the exact text and said to send it — prefer feedback_form, which lets them edit it first. Use about='abs' for wrong figures or broken behaviour in ABS's own data or API; set shareWithAbs only if the person agreed it may be passed on to ABS. Never include personal information about anyone, and include a contact email only if the person gave one for a reply. Returns a reference like FB-7Q2K9C to give the person.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"kind",
"summary"
],
"properties": {
"kind": {
"enum": [
"bug",
"data",
"missing",
"idea",
"docs",
"praise",
"other"
],
"type": "string",
"description": "bug: something broke; data: a figure or label looks wrong; missing: an expected table or option is absent; idea: an improvement; docs: unclear guidance; praise: it worked well; other"
},
"tool": {
"type": "string",
"maxLength": 64,
"description": "The tool involved, e.g. get_data"
},
"about": {
"enum": [
"connector",
"abs"
],
"type": "string",
"default": "connector",
"description": "connector: this connector or its site; abs: ABS's own data or API (so it can be passed on to ABS)"
},
"error": {
"type": "string",
"maxLength": 1000,
"description": "The error reason or message returned, if any"
},
"table": {
"type": "string",
"maxLength": 64,
"description": "The ABS table id involved, e.g. CPI"
},
"contact": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254,
"description": "Only if the person chose to give an email address for a reply. Never guess or fill one in."
},
"details": {
"type": "string",
"maxLength": 5000,
"description": "What happened and what was expected. No personal information about anyone."
},
"summary": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "One line, in the person's own words"
},
"assistant": {
"type": "string",
"maxLength": 80,
"description": "The AI tool in use, e.g. Claude, ChatGPT, Copilot"
},
"selection": {
"type": "string",
"maxLength": 1000,
"description": "The selection or query involved, as JSON or the SDMX key"
},
"shareWithAbs": {
"type": "boolean",
"default": false,
"description": "Only true if the person agreed this may be passed on to ABS, contact address included"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"receivedAt",
"message"
],
"properties": {
"id": {
"type": "string",
"description": "Reference for this submission, e.g. FB-7Q2K9C"
},
"message": {
"type": "string"
},
"receivedAt": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Send feedback to the maintainers",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}Prompts
4 advertised
suburb_dossier — Suburb dossier
Build a small-area profile for any Australian suburb or locality: population history, age profile, building pipeline, and census income, language and industry — at SA2 level.
- place
- A suburb, town or locality name, e.g. Fitzroy (required)
- include_census
- 'yes' to add 2021 Census income/language/industry panels
compare_capitals — Compare the capital cities
Compare an indicator across Australia's capital cities — CPI components, rents, labour force.
- indicator
- What to compare, e.g. 'rents', 'unemployment rate', 'all groups CPI' (required)
explain_metadata_gap — Explain the metadata gap
Explain, with live examples, why ABS's published metadata implies 23.8× more data than exists — and why this front door only offers what does.
- table
- A table to use as the worked example; defaults to CPI
report_issue — Send feedback about this connector
Report a problem, a wrong-looking figure or an idea to the connector's maintainers. Drafts it from the conversation; you review it before anything is sent.
- what
- What went wrong or what you'd like, in a few words
Resources
6 advertised
guide — How to use the ABS Data front door
Usage guide for the four verbs, failure handling and reading the numbers.
abs://guidefindings — How ABS's metadata compares with its data
For technical readers: how much of what ABS's published metadata implies actually has data, and how the API's endpoints behave.
abs://findingscatalogue — The catalogue as one document
Every table, its key structure and coverage, and every small-dimension option with labels (~2.6MB JSON). Large dimensions list their codelist and size.
abs://catalogueopenapi — OpenAPI 3.1 document
The HTTP API's specification, generated from the same contract as these tools.
abs://openapiabs-data-feedback
A feedback form the person reviews, edits and sends themselves.
ui://abs-data-feedback/1oz8vxu.htmlabs-data-chart
ABS observations as a line chart and a table, with the link to the complete pull.
ui://abs-data-chart/1jdcql7.htmltable — A table's description
Key structure, coverage and options for one table — the same as describe_table.
abs://table/{id}90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 665 ms
- 95th percentile latency
- 665 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 665 ms · metadata changed · 8 tool(s), 6 resource(s), 1 resource template(s), 4 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http abs-data-mcp https://abs-data-front-door.aicolab.workers.dev/mcpCodex
codex mcp add abs-data-mcp --url https://abs-data-front-door.aicolab.workers.dev/mcpCursor
{
"mcpServers": {
"abs-data-mcp": {
"url": "https://abs-data-front-door.aicolab.workers.dev/mcp"
}
}
}Cline
{
"mcpServers": {
"abs-data-mcp": {
"type": "streamableHttp",
"url": "https://abs-data-front-door.aicolab.workers.dev/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"abs-data-mcp": {
"type": "http",
"url": "https://abs-data-front-door.aicolab.workers.dev/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http abs-data-mcp https://abs-data-front-door.aicolab.workers.dev/mcpClaude Desktop
https://abs-data-front-door.aicolab.workers.dev/mcpWindsurf
{
"mcpServers": {
"abs-data-mcp": {
"serverUrl": "https://abs-data-front-door.aicolab.workers.dev/mcp"
}
}
}Let your agent find its tools
Find servers like ABS Data MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.