protogrid

Search / au.publicdata/mcp

publicdata.au

R0· no sign-in

Search, filter, count and sum Australian government open data, with every version kept.

v2.44.0 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality75good
Trust95of 100
Uptime, 30 days95%
Latency p50273 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "publicdata": {
      "type": "http",
      "url": "https://publicdata.au/mcp"
    }
  }
}
claude mcp add --transport http publicdata https://publicdata.au/mcp
[mcp_servers.publicdata]
url = "https://publicdata.au/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "publicdata": {
      "type": "remote",
      "url": "https://publicdata.au/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "publicdata": {
      "type": "http",
      "url": "https://publicdata.au/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=publicdata&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vcHVibGljZGF0YS5hdS9tY3AifQ%3D%3D"
}
{
  "servers": {
    "publicdata": {
      "type": "http",
      "url": "https://publicdata.au/mcp"
    }
  }
}
{
  "mcpServers": {
    "publicdata": {
      "httpUrl": "https://publicdata.au/mcp"
    }
  }
}
extensions:
  "publicdata":
    enabled: true
    name: "publicdata"
    type: streamable_http
    uri: "https://publicdata.au/mcp"
    timeout: 300

Quality 75 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations12 of 12 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 3,474 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes41 tool changes in 30 days
  • fail
    stability.rug_pull8 tools kept their name but changed most of their description in 30 days; review before trusting them
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

12 tools, about 3,474 tokens to load them all · tool set f19efce3422d · tools last changed 2026-10-12 · checked 2026-10-20 15:57 UTC

Tool changes

  • fetchadded

    Read one served dataset's record as text to quote and cite: its summary, publisher, licence, attribution string, newest version and the URL of that version. It is the fetch that ChatGPT deep research and company knowledge call, with an id from search. It carries no rows. To answer from the data use query_rows or count_rows, and for every version and file use get_dataset. One answer holds the text, with the same facts under metadata. An id that is not served returns an error. The call costs nothing against the rate limit.

  • searchadded

    Find served datasets by keyword and return each one's id, title and citation URL, in the shape ChatGPT deep research and company knowledge call search with. It runs the same search as search_datasets, so every word in query must match. Pass an id to fetch to read the dataset's licence, attribution and newest version. The same id is the slug that list_fields, query_rows and count_rows take. Up to 50 matches come back in one answer, with no paging. Each call costs one of the 60 queries each address may make in 10 seconds.

  • count_rowschangedinput schema, output schema
  • query_rowschangedinput schema, output schema
  • count_rowschangeddescription, output schema
    before

    Count, sum, average, minimum or maximum rows of a served dataset across the whole table, grouped by up to three fields. For the rows themselves use query_rows. Field names and values for group_by and where come from list_fields. sum and avg need a numeric or true-or-false field. min and max take any field. version can be any date in the version history from get_dataset. Groups come back largest first, and truncated means raise limit or narrow where. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

    after · 81% of words in common

    Count, sum, average, minimum or maximum rows of a served dataset across the whole table, grouped by up to three fields. For the rows themselves use query_rows. Field names and values for group_by and where come from list_fields. sum and avg need a numeric or true-or-false field. min and max take any field. version can be any date in the version history from get_dataset. A version too large for one file is stored as period parts and answered from them. A filter on the period field reads only the parts it can match, and parts names the periods read. Groups come back largest first, and truncated means raise limit or narrow where. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

  • query_rowschangeddescription, output schema
    before

    Read individual rows of a served dataset, filtered across the whole table. For totals and breakdowns use count_rows, and for files use get_dataset or list_partitions. Field names and values for where, select and order come from list_fields. Filters hold at most 90 values per call, and a list value cannot contain a comma. version can be any date in the version history from get_dataset. One page holds up to limit rows, and offset steps through the rest until next_offset is null. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

    after · 84% of words in common

    Read individual rows of a served dataset, filtered across the whole table. For totals and breakdowns use count_rows, and for files use get_dataset or list_partitions. Field names and values for where, select and order come from list_fields. Filters hold at most 90 values per call, and a list value cannot contain a comma. version can be any date in the version history from get_dataset. A version too large for one file is stored as period parts and answered from them, in period order. A filter on the period field reads only the parts it can match, and parts names the periods read. One page holds up to limit rows, and offset steps through the rest until next_offset is null. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

  • upvote_datasetchangeddescription
    before

    Add one anonymous vote for a government dataset that publicdata.au does not serve yet, so it is built sooner. To read a served dataset use search_datasets, and to see the votes so far use list_backlog. slug is a vote key from search_catalogue, such as act-3u5a-ve4j, or a list_backlog slug. A dataset that is served, being built or closed returns an error saying it is not open for votes. No identity is recorded, and a second vote from the same caller on the same day adds nothing. The answer gives the dataset's vote total after this call. The call costs nothing against the rate limit.

    after · 96% of words in common

    Add one anonymous vote for a government dataset that publicdata.au does not serve yet, so it is built sooner. To read a served dataset use search_datasets, and to see the votes so far use list_backlog. slug is a vote key from search_catalogue, such as act-3u5a-ve4j, or a list_backlog slug. A dataset that is served, being built or closed returns an error saying it is not open for votes. No identity is recorded, so a vote cannot be withdrawn, and a second vote from the same caller on the same day adds nothing. The answer gives the dataset's vote total after this call. The call costs nothing against the rate limit.

  • count_rowschangeddescription, input schema, output schema
    before

    Count, sum, average, minimum or maximum rows of a served dataset across the whole table, grouped by up to three fields. For the rows themselves use query_rows. Field names and values for group_by and where come from list_fields. sum and avg need a numeric or true-or-false field. min and max take any field. version must be one of the two newest versions. Groups come back largest first, and truncated means raise limit or narrow where. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

    after · 90% of words in common

    Count, sum, average, minimum or maximum rows of a served dataset across the whole table, grouped by up to three fields. For the rows themselves use query_rows. Field names and values for group_by and where come from list_fields. sum and avg need a numeric or true-or-false field. min and max take any field. version can be any date in the version history from get_dataset. Groups come back largest first, and truncated means raise limit or narrow where. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

  • query_rowschangeddescription, input schema, output schema
    before

    Read individual rows of a served dataset, filtered across the whole table. For totals and breakdowns use count_rows. Field names and values for where, select and order come from list_fields. Filters hold at most 90 values per call, and a list value cannot contain a comma. version must be one of the two newest versions. One page holds up to limit rows, and offset steps through the rest until next_offset is null. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

    after · 88% of words in common

    Read individual rows of a served dataset, filtered across the whole table. For totals and breakdowns use count_rows, and for files use get_dataset or list_partitions. Field names and values for where, select and order come from list_fields. Filters hold at most 90 values per call, and a list value cannot contain a comma. version can be any date in the version history from get_dataset. One page holds up to limit rows, and offset steps through the rest until next_offset is null. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.

  • list_partitionschangeddescription
    before

    List the download files that split a served dataset's newest version by one field, such as one file per year. Use it to hand someone a slice of the data as a file. To answer a question use query_rows or count_rows instead, and for the whole table use get_dataset. field must be one of the partition_by fields that list_fields names, and any other field returns a 404 error. Every value comes back in one answer, with no paging. The call costs nothing against the rate limit.

    after · 96% of words in common

    List the download files that split a served dataset's newest version by one field, such as one file per year. Use it to hand someone a slice of the data as a file. It gives file links and no rows, so to answer a question use query_rows or count_rows instead, and for the whole table as one file use get_dataset. field must be one of the partition_by fields that list_fields names, and any other field returns a 404 error. Every value comes back in one answer, with no paging. The call costs nothing against the rate limit.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 95 / 100

provenance85
liveness98
freshness100
hygiene100

+repository +dns-namespace +website +reachable +uptime-95% +updated-8d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://publicdata.au/mcp streamable-httpnoneyes95%273 ms2025-11-252026-10-20

Tools (12)

count_rowsread-onlyCount, sum, average, minimum or maximum rows of a served dataset across the whole table, grouped by up to three fields. For the rows themselves use query_rows. Field names and values for group_by and where come from list_fields. sum and avg need a numeric or true-or-false field. min and max take any field. version can be any date in the version history from get_dataset. A version too large for one file is stored as period parts and answered from them. A filter on the period field reads only the parts it can match, and parts names the periods read. Groups come back largest first, and truncated means raise limit or narrow where. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.
diff_versionsread-onlyCompare two consecutive versions of a served dataset row by row on its key fields, to see what a publisher changed between releases. from and to must be adjacent dates in the version history from get_dataset, older first. Any other pair returns a 404 error, so step through a longer span one pair at a time. A dataset with no key, which list_fields shows as an empty key, gets row counts only, and a dataset with one version has nothing to compare. One answer holds the counts of rows added, removed, changed and unchanged, the keys of the rows added, removed and changed, and up to ten changed rows with their old and new values. The call costs nothing against the rate limit.
fetchread-onlyRead one served dataset's record as text to quote and cite: its summary, publisher, licence, attribution string, newest version and the URL of that version. It is the fetch that ChatGPT deep research and company knowledge call, with an id from search. It carries no rows. To answer from the data use query_rows or count_rows, and for every version and file use get_dataset. One answer holds the text, with the same facts under metadata. An id that is not served returns an error. The call costs nothing against the rate limit.
get_datasetread-onlyRead a served dataset's data package and full version history: licence, attribution, whole-table files and the version dates diff_versions and the version parameter take. It carries no rows. To answer from the rows use query_rows or count_rows, and for field names use list_fields. slug is lowercase letters, digits and hyphens, the part after /d/ in a dataset page URL, such as au-road-deaths. The whole history comes back in one answer, with no paging. It needs no key or sign-in, and costs nothing against the rate limit. A slug that is not served returns a 404 error.
list_backlogread-onlyList the datasets people have asked publicdata.au to build, most votes first. Use it to see what is wanted or under way, or to check that a vote counted. To add a vote use upvote_dataset. To read a dataset that is already served use search_datasets. Votes on catalogue records that no entry has claimed yet come back apart, under the vote key search_catalogue uses. The whole backlog comes back in one answer, with no paging, and the call costs nothing against the rate limit.
list_fieldsread-onlyList a served dataset's fields, with their types, descriptions, ranges and values, before querying it. Call it before query_rows or count_rows unless you already know the exact names and values, because where matches values exactly and an unknown field is an error. It also names the key fields diff_versions compares on and the partition fields list_partitions accepts. slug is lowercase letters, digits and hyphens, the part after /d/ in a dataset page URL, such as au-road-deaths. The answer describes the newest version, in one page. The call costs nothing against the rate limit. A slug that is not served or not loaded for queries returns an error.
list_partitionsread-onlyList the download files that split a served dataset's newest version by one field, such as one file per year. Use it to hand someone a slice of the data as a file. It gives file links and no rows, so to answer a question use query_rows or count_rows instead, and for the whole table as one file use get_dataset. field must be one of the partition_by fields that list_fields names, and any other field returns a 404 error. Every value comes back in one answer, with no paging. The call costs nothing against the rate limit.
query_rowsread-onlyRead individual rows of a served dataset, filtered across the whole table. For totals and breakdowns use count_rows, and for files use get_dataset or list_partitions. Field names and values for where, select and order come from list_fields. Filters hold at most 90 values per call, and a list value cannot contain a comma. version can be any date in the version history from get_dataset. A version too large for one file is stored as period parts and answered from them, in period order. A filter on the period field reads only the parts it can match, and parts names the periods read. One page holds up to limit rows, and offset steps through the rest until next_offset is null. An unknown field or version returns an error naming it. Each call costs two of the 60 queries each address may make in 10 seconds.
searchread-onlyFind served datasets by keyword and return each one's id, title and citation URL, in the shape ChatGPT deep research and company knowledge call search with. It runs the same search as search_datasets, so every word in query must match. Pass an id to fetch to read the dataset's licence, attribution and newest version. The same id is the slug that list_fields, query_rows and count_rows take. Up to 50 matches come back in one answer, with no paging. Each call costs one of the 60 queries each address may make in 10 seconds.
search_catalogueread-onlySearch every dataset listed on Australia's government portals, including the many publicdata.au does not serve yet. Its records describe data held elsewhere, which cannot be queried here. Use it when search_datasets finds nothing, to find where a dataset is published, or to pick one for upvote_dataset. query matches every word against the title, summary and publisher, as search_datasets does. A page holds 20 records, those that can take a vote first. Pass next_offset as offset for the next page, up to 5000. Each call costs three of the 60 queries each address may make in 10 seconds.
search_datasetsread-onlyFind the slug of a served dataset. Start here for any question about Australian government data, since the other tools read only the datasets this finds. Every word in query must match the title, summary, publisher, keywords or a field name. A word matches its plural and other endings but never as a prefix, so bus does not find business. Up to 50 matches come back in one answer, with no paging. If nothing matches, try fewer or broader words, then search_catalogue. Each call costs one of the 60 queries each address may make in 10 seconds.
upvote_datasetAdd one anonymous vote for a government dataset that publicdata.au does not serve yet, so it is built sooner. To read a served dataset use search_datasets, and to see the votes so far use list_backlog. slug is a vote key from search_catalogue, such as act-3u5a-ve4j, or a list_backlog slug. A dataset that is served, being built or closed returns an error saying it is not open for votes. No identity is recorded, so a vote cannot be withdrawn, and a second vote from the same caller on the same day adds nothing. The answer gives the dataset's vote total after this call. The call costs nothing against the rate limit.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "au.publicdata/mcp",
  "_meta": {
    "io.modelcontextprotocol.registry/publisher-provided": {
      "surface_sha256": "4b29606cf7b40990db7eb5793e1701925c357e6955dbcaf8b846deff2cab308e"
    }
  },
  "icons": [
    {
      "src": "https://publicdata.au/favicon.svg",
      "sizes": [
        "any"
      ],
      "mimeType": "image/svg+xml"
    },
    {
      "src": "https://publicdata.au/icon-512.png",
      "sizes": [
        "512x512"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "publicdata.au",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://publicdata.au/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "2.44.0",
  "repository": {
    "url": "https://github.com/National-Digital/publicdata.au",
    "source": "github"
  },
  "websiteUrl": "https://publicdata.au/agents/#mcp",
  "description": "Search, filter, count and sum Australian government open data, with every version kept."
}