Koskamo

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.

ABS Data MCP logo, by AI-CoLabCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by AI-CoLab
MCP endpoint (Streamable HTTP)
https://abs-data-front-door.aicolab.workers.dev/mcp
Vendor documentation

What its tools do

8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Can change data (1)

8 of 8 have a description · 8 of 8 declare behavior hints · 5 of 8 with parameters document them all

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

Community listingRegistry 0.1.0
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
Server-advertised capabilities
{
  "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.

ABS Data: the Australian Bureau of Statistics' public data, fetched live. People describe what they care about, not which dataset: work out which tables bear on their question, then search_tables → describe_table → search_options (for long lists) → get_data. A failed selection names the valid options; use them, don't guess. Quote numbers only from get_data, say where they come from, and explain caveats in the person's terms. For feedback use feedback_form; never call submit_feedback without their OK. More: Code Mode `search` runs code over the whole catalogue document and `execute` runs multi-series analysis in a sandbox. Resources: abs://guide (how to use this server), abs://table/{id}, abs://findings (how ABS's published metadata compares with its data). Prompts: suburb_dossier, compare_capitals, report_issue, explain_metadata_gap. Small-area series are volatile; read multi-year totals, not single years.

Tools

8 advertised

search_tables — Search ABS tables
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_tables input schema
{
  "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"
    }
  }
}
search_tables output schema
{
  "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
}
search_tables annotations
{
  "title": "Search ABS tables",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
describe_table — Describe a table
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

describe_table input schema
{
  "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"
    }
  }
}
describe_table output schema
{
  "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
}
describe_table annotations
{
  "title": "Describe a table",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_options — Search a dimension's options
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_options input schema
{
  "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
    }
  }
}
search_options output schema
{
  "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
}
search_options annotations
{
  "title": "Search a dimension's options",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_data — Get data
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

get_data input schema
{
  "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"
    }
  }
}
get_data output schema
{
  "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
}
get_data annotations
{
  "title": "Get data",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
search — Search the catalogue by writing code
Advertised by the server during the last successful anonymous check.
Advertised read-only

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) }; }

search input schema
{
  "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."
    }
  }
}
search output schema
{
  "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
}
search annotations
{
  "title": "Search the catalogue by writing code",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
execute — Fetch and analyse data by writing code
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

execute input schema
{
  "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."
    }
  }
}
execute output schema
{
  "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
}
execute annotations
{
  "title": "Fetch and analyse data by writing code",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
feedback_form — Open a feedback form
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

feedback_form input schema
{
  "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"
    }
  }
}
feedback_form output schema
{
  "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
}
feedback_form annotations
{
  "title": "Open a feedback form",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_feedback — Send feedback to the maintainers
Advertised by the server during the last successful anonymous check.

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.

submit_feedback input schema
{
  "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"
    }
  }
}
submit_feedback output schema
{
  "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
}
submit_feedback annotations
{
  "title": "Send feedback to the maintainers",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

4 advertised

suburb_dossier — Suburb dossier

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

Usage guide for the four verbs, failure handling and reading the numbers.

guide URI
abs://guide

MIME type: text/markdown

findings — How ABS's metadata compares with its data

Advertised by the server during the last successful anonymous check.

For technical readers: how much of what ABS's published metadata implies actually has data, and how the API's endpoints behave.

findings URI
abs://findings

MIME type: text/markdown

catalogue — The catalogue as one document

Advertised by the server during the last successful anonymous check.

Every table, its key structure and coverage, and every small-dimension option with labels (~2.6MB JSON). Large dimensions list their codelist and size.

catalogue URI
abs://catalogue

MIME type: application/json

openapi — OpenAPI 3.1 document

Advertised by the server during the last successful anonymous check.

The HTTP API's specification, generated from the same contract as these tools.

openapi URI
abs://openapi

MIME type: application/json

abs-data-feedback

Advertised by the server during the last successful anonymous check.

A feedback form the person reviews, edits and sends themselves.

abs-data-feedback URI
ui://abs-data-feedback/1oz8vxu.html

MIME type: text/html;profile=mcp-app

abs-data-chart

Advertised by the server during the last successful anonymous check.

ABS observations as a line chart and a table, with the link to the complete pull.

abs-data-chart URI
ui://abs-data-chart/1jdcql7.html

MIME type: text/html;profile=mcp-app

table — A table's description

Advertised by the server during the last successful anonymous check.

Key structure, coverage and options for one table — the same as describe_table.

table URI template
abs://table/{id}

MIME type: application/json

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.

Too few checks for a percentage yet (1 of 1 answered).

  1. 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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http abs-data-mcp https://abs-data-front-door.aicolab.workers.dev/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add abs-data-mcp --url https://abs-data-front-door.aicolab.workers.dev/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable abs-data-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "abs-data-mcp": {
      "url": "https://abs-data-front-door.aicolab.workers.dev/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "abs-data-mcp": {
      "type": "streamableHttp",
      "url": "https://abs-data-front-door.aicolab.workers.dev/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start abs-data-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "abs-data-mcp": {
      "type": "http",
      "url": "https://abs-data-front-door.aicolab.workers.dev/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http abs-data-mcp https://abs-data-front-door.aicolab.workers.dev/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://abs-data-front-door.aicolab.workers.dev/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.