publicdata.au
Search, filter, count and sum Australian government open data, with every version kept.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mcp": {
"url": "https://publicdata.au/mcp"
}
}
}Remote endpoints
https://publicdata.au/mcpstreamable-httpWhat it can do
Tool inventory
Tools (8)
🟢search_datasets(query)
Find datasets on publicdata.au by title, publisher or field name. Returns slug, title, publisher, licence, dataset page and the latest download URL.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Words from a title, publisher or field name"
}
},
"required": [
"query"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"title": {
"type": "string"
},
"publisher": {
"type": [
"string",
"null"
]
},
"licence": {
"type": [
"string",
"null"
]
},
"page": {
"type": [
"string",
"null"
]
},
"latest": {
"type": [
"string",
"null"
]
}
},
"required": [
"slug",
"title"
]
}
}
},
"required": [
"results"
]
}🟢get_dataset(slug)
Read one dataset: its Frictionless data package (fields, types, licence, attribution, download URLs) and every version.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Dataset slug from search_datasets"
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"datapackage": {
"type": "object"
},
"versions": {}
},
"required": [
"datapackage",
"versions"
]
}🟢list_partitions(slug, field)
List the per-value download files of a dataset for one partition field, with the row count and URL of each, to download a slice of the data.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Dataset slug from search_datasets"
},
"field": {
"type": "string",
"description": "A partition field named in the data package, for example crash_year or loc_local_government_area"
}
},
"required": [
"slug",
"field"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"field": {
"type": "string"
},
"version_base": {
"type": "string"
},
"partitions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {},
"rows": {
"type": "integer"
},
"url": {
"type": "string"
}
},
"required": [
"value",
"rows",
"url"
]
}
}
},
"required": [
"field",
"version_base",
"partitions"
]
}🟢query_rows(slug, where, select, order, limit, ...)
Return rows from a dataset, filtered across the whole table by the query API. Returns up to limit rows, the number of rows that match, the offset of the next page, the version answered and the attribution string.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Dataset slug from search_datasets"
},
"where": {
"type": "object",
"description": "Filters by field name, applied to the whole table. A value may be a scalar for an exact, case-sensitive match, a list of scalars to match any of them, null to match blank or suppressed cells, {\"min\": n, \"max\": n} for an inclusive range, or {\"like\": \"*text*\"} for a case-insensitive match where * is the wildcard. A blank cell never matches a scalar, a list or a range.",
"additionalProperties": true
},
"select": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to return. Every field when absent."
},
"order": {
"type": "string",
"description": "field.asc or field.desc, comma-separated. The publisher's row order when absent."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50,
"description": "Rows to return, 1 to 500. 50 when absent."
},
"offset": {
"type": "integer",
"minimum": 0,
"default": 0,
"description": "Rows to skip. next_offset in each answer gives the next page."
},
"version": {
"type": "string",
"description": "A version date, YYYY-MM-DD, from get_dataset. The newest version loaded for queries when absent."
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"version": {
"type": [
"string",
"null"
]
},
"rows": {
"type": "array",
"items": {
"type": "object"
}
},
"matched": {
"type": "integer"
},
"next_offset": {
"type": [
"integer",
"null"
]
},
"query": {
"type": "string"
},
"attribution": {
"type": [
"string",
"null"
]
}
},
"required": [
"version",
"rows",
"matched",
"next_offset",
"query"
]
}🟢count_rows(slug, group_by, metric, where, limit, ...)
Count rows in a dataset, or sum, average, min or max a field, grouped by up to three fields and filtered across the whole table by the query API. Returns groups sorted from largest, the number of rows that match, the version answered and the attribution string.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Dataset slug from search_datasets"
},
"group_by": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 3,
"description": "Fields to group by, for example [\"crash_severity\"]. One total when absent."
},
"metric": {
"type": "string",
"default": "count",
"description": "count, or sum, avg, min or max of a field written as sum.field_name. count when absent."
},
"where": {
"type": "object",
"description": "Filters by field name, applied to the whole table. A value may be a scalar for an exact, case-sensitive match, a list of scalars to match any of them, null to match blank or suppressed cells, {\"min\": n, \"max\": n} for an inclusive range, or {\"like\": \"*text*\"} for a case-insensitive match where * is the wildcard. A blank cell never matches a scalar, a list or a range.",
"additionalProperties": true
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 1000,
"default": 100,
"description": "Groups to return, 1 to 1000. 100 when absent."
},
"version": {
"type": "string",
"description": "A version date, YYYY-MM-DD, from get_dataset. The newest version loaded for queries when absent."
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"version": {
"type": [
"string",
"null"
]
},
"group_by": {
"type": "array",
"items": {
"type": "string"
}
},
"metric": {
"type": "string"
},
"groups": {
"type": "array",
"items": {
"type": "object"
}
},
"truncated": {
"type": "boolean"
},
"matched": {
"type": "integer"
},
"query": {
"type": "string"
},
"attribution": {
"type": [
"string",
"null"
]
}
},
"required": [
"version",
"group_by",
"metric",
"groups",
"truncated",
"matched",
"query"
]
}🟢diff_versions(slug, from, to)
Compare two versions of a dataset by its key: rows added, removed and changed.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Dataset slug from search_datasets"
},
"from": {
"type": "string",
"description": "Older version date, YYYY-MM-DD"
},
"to": {
"type": "string",
"description": "Newer version date, YYYY-MM-DD"
}
},
"required": [
"slug",
"from",
"to"
],
"additionalProperties": false
}Output Schema
{
"type": "object"
}🟢search_catalogue(query, jurisdiction, votable_only)
Search every dataset on Australia's government portals. A row's state says whether it can take a vote; pass its vote key to vote.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Words from a title, description or publisher"
},
"jurisdiction": {
"type": "string",
"enum": [
"cth",
"nsw",
"vic",
"qld",
"wa",
"sa",
"tas",
"act",
"nt"
],
"description": "One government. All when absent."
},
"votable_only": {
"type": "boolean",
"default": false,
"description": "Leave out records that cannot take a vote"
}
},
"required": [
"query"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"catalogue_read": {
"type": "string"
},
"records": {
"type": "integer"
},
"total": {
"type": "integer"
},
"next_offset": {
"type": [
"integer",
"null"
]
},
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"summary": {
"type": "string"
},
"publisher": {
"type": "string"
},
"publisher_page": {
"type": "string"
},
"jur": {
"type": "string"
},
"url": {
"type": "string"
},
"licence": {
"type": "string"
},
"formats": {
"type": "string"
},
"modified": {
"type": "string"
},
"state": {
"type": "string",
"enum": [
"votable",
"chosen",
"served",
"closed"
]
},
"vote": {
"type": "string"
},
"page": {
"type": "string"
},
"reason": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"title",
"state",
"vote"
]
}
}
},
"required": [
"catalogue_read",
"rows"
]
}🟡vote(slug)
Add one vote so a dataset is built sooner. No identity is recorded, and each browser counts once a day.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The vote key of a search_catalogue row, or a backlog slug from /backlog.json"
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"votes": {
"type": "integer"
}
},
"required": [
"slug",
"votes"
]
}Community
Evidence