MCP server
One remote MCP server, the same data as the API, your own key. Paste the configuration for your client and ask about any place in Australia from inside Claude, Cursor, VS Code, Codex, Windsurf or Zed.
https://dataquoll.io/api/mcpPick your client. Each block is complete; replace the placeholder with your key where one appears.
Where: .mcp.json (project) or ~/.claude.json
One command. Add --scope project to commit the server to a repo for a team, or --scope user to have it in every project.
claude mcp add --transport http dataquoll https://dataquoll.io/api/mcp \ --header "Authorization: Bearer YOUR_API_KEY"
Where: .cursor/mcp.json (project) or ~/.cursor/mcp.json
Cursor reads ${env:...} from your shell, so export DATAQUOLL_API_KEY before launching it and the key never sits in a file.
{
"mcpServers": {
"dataquoll": {
"url": "https://dataquoll.io/api/mcp",
"headers": {
"Authorization": "Bearer ${env:DATAQUOLL_API_KEY}"
}
}
}
}Where: .vscode/mcp.json
The key is servers, not mcpServers. The inputs block prompts for the key once and keeps it in the secret store, which is what the VS Code docs recommend over a literal.
{
"inputs": [
{
"type": "promptString",
"id": "dataquoll-key",
"description": "DataQuoll API key",
"password": true
}
],
"servers": {
"dataquoll": {
"type": "http",
"url": "https://dataquoll.io/api/mcp",
"headers": {
"Authorization": "Bearer ${input:dataquoll-key}"
}
}
}
}Where: ~/.codex/config.toml
Codex takes the NAME of an environment variable, not the key. Export DATAQUOLL_API_KEY before starting Codex; it reads the variable at launch, not per call.
[mcp_servers.dataquoll] url = "https://dataquoll.io/api/mcp" bearer_token_env_var = "DATAQUOLL_API_KEY"
Where: ~/.codeium/windsurf/mcp_config.json
Windsurf names the URL key serverUrl. It interpolates ${env:...} the same way Cursor does.
{
"mcpServers": {
"dataquoll": {
"serverUrl": "https://dataquoll.io/api/mcp",
"headers": {
"Authorization": "Bearer ${env:DATAQUOLL_API_KEY}"
}
}
}
}Where: settings.json
Zed calls them context_servers. With the header set it connects directly; without one it would try an OAuth flow this server does not have.
{
"context_servers": {
"dataquoll": {
"url": "https://dataquoll.io/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}Where: claude_desktop_config.json
Claude Desktop cannot attach a header to a remote server itself (its connector UI takes a URL and OAuth only), so it goes through the mcp-remote bridge. The header is written with NO space after the colon; that is how mcp-remote splits it.
{
"mcpServers": {
"dataquoll": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://dataquoll.io/api/mcp",
"--header",
"Authorization:Bearer YOUR_API_KEY"
]
}
}
}Where: the client's MCP configuration
The shape every Streamable HTTP client understands. The endpoint goes in url and the key in an Authorization header; that is the whole configuration.
{
"url": "https://dataquoll.io/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}Once connected, the assistant chooses tools itself. These are the kinds of questions it can answer, and what each one needs on the key.
| Try asking | Needs |
|---|---|
| What is happening in South Australia right now? Group the active incidents by type. | any key |
| Which river gauges in Queensland are above their minor flood level today? | any key |
| Has postcode 2480 been covered by a disaster declaration since 2019? List each one. | the declarations entitlement |
| What has been recorded within 5 km of -28.81, 153.28, and which declarations covered that area? | the hazard-history entitlement |
Generated from the OpenAPI spec, so this list is the API. A tool that needs an entitlement your key lacks returns a clear error rather than an empty result, so an empty answer never means not entitled.
| Tool | What it does | Needs |
|---|---|---|
list_incidents | List all current incidents | any key |
get_incident | Get a single incident | any key |
nearby_incidents | Find incidents near a location | any key |
incident_snapshot | Audit trail snapshot | any key |
list_historical_incidents | Historical incident data (paid tier) | any key |
list_states | Feed health by state | any key |
declarations_by_postcode | Disaster declaration status for a postcode | the declarations entitlement |
declarations_by_point | Disaster declaration status for an exact point | the declarations entitlement |
hazard_history_by_point | Observed record and declared status for an exact point | the hazard-history entitlement |
list_declarations | List/filter declarations | the declarations entitlement |
declaration_by_agrn | One disaster event by AGRN (across sources) | the declarations entitlement |
get_attribution | Data source attributions | any key |
list_events | List clustered events (incident intelligence) | any key |
get_event | Get a single event with optional linked incidents | any key |
get_schema | API schema and valid enum values | any key |
list_gauges | River gauge stations with live flood status | any key |
get_gauge | One gauge with a 6-hour recent window | any key |
list_gauge_readings | Gauge reading history (paid tier) | any key |
get_gauge_summary | Flood status counts by state or LGA | any key |
Two limits apply. Your key has the monthly quota shown on pricing, and every tool call counts against it exactly as a REST call would. On top of that the MCP endpoint allows 60 calls a minute per IP address, because an agent that misreads a result will happily retry it fifty times; a 429 from that guard tells the client how long to wait.