Docs / For Agents

Geographic data for
agents and MCP clients.

Remote MCP server and hosted API for deterministic geography-aware queries. Free discovery. Free and paid execution lanes. Live pack catalog.

What you get

Live packs across disasters, FX rates, and global indicators. All packs share a common location model and query contract.

  • Free: currency, volcanoes, hurricanes, floods, tornadoes, UN SDG, World Factbook, WorldPop
  • Paid via x402 on Base USDC: earthquakes, tsunamis

Browse all packs

Connect your agent

New here: use plain HTTP for the very first successful result, or use MCP if your client already supports remote MCP servers. Both paths hit the same hosted backend.

  • Remote MCP client: https://app.daedalmap.com/mcp
  • Plain HTTP: /api/v1/catalog, /api/v1/packs/{pack_id}, /api/v1/query/dataset
  • Pack-specific registry entry: narrow facades at /mcp/currency, /mcp/earthquakes, etc.

MCP quickstart

If you already have an MCP-capable client, point it at https://app.daedalmap.com/mcp, list tools, then call one narrow tool. If you just want the fastest first result, skip to Agent Examples and follow the plain HTTP flow first.

curl https://app.daedalmap.com/mcp

curl -X POST https://app.daedalmap.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-06-18" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list"
  }'
  • get_catalog — list every published pack
  • get_pack — full pack schema: metric inventory with stats, query rules, and a paste-ready example body. Call this before any query.
  • query_dataset — generic structured query against any pack (matches POST /api/v1/query/dataset)
  • get_earthquake_events, get_volcanic_activity, get_tsunami_events, get_fx_rates — narrow per-pack tools with sensible defaults. Use when the question is a simple event or rate fetch for a named region and time window.

One question, every pack

Every pack returns rows keyed on the same loc_id. Earthquakes in Japan, the population of Japan, and Japan's currency timeline all come back with loc_id=JPN. Cross-pack joins are a client-side zip on a single column. No country-name normalization. No fuzzy matching. No per-source dictionaries.

# 1. Earthquake counts for Japan, last 25 years
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{"source_id":"earthquakes_events",
       "metrics":["event_count"],
       "filters":{"region_ids":["JPN"],
                  "time":{"start":"2000-01-01","end":"2025-12-31"}}}'

# 2. Poverty headcount ratio for Japan, same window
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{"source_id":"01",
       "metrics":["ind_1_2_1"],
       "filters":{"region_ids":["JPN"],
                  "time":{"start":2000,"end":2025}}}'

# Both responses key on loc_id=JPN. Join in five lines.

This is the differentiator vs single-source MCP wrappers. One geographic key across every domain - disasters, demographics, economics, climate, currency.

Learn loc_id

Client setup

Expand your client below.

Claude Code
claude mcp add --transport http daedalmap https://app.daedalmap.com/mcp

claude mcp list

JSON config equivalent:

{
  "mcpServers": {
    "daedalmap": {
      "type": "http",
      "url": "https://app.daedalmap.com/mcp"
    }
  }
}
Codex
codex mcp add daedalmap --url https://app.daedalmap.com/mcp

codex mcp list
ChatGPT developer mode
  • Enable developer mode in ChatGPT settings.
  • Add a remote MCP connector.
  • Use https://app.daedalmap.com/mcp as the server URL.
Gemini SDK
from google import genai

client = genai.Client()

mcp_server = {
    "type": "mcp_server",
    "name": "daedalmap",
    "url": "https://app.daedalmap.com/mcp",
}

interaction = client.interactions.create(
    model="gemini-2.5-flash",
    input="List the published DaedalMap packs and suggest one first query.",
    tools=[mcp_server],
)
Mistral SDK

If your Mistral runtime supports a remote MCP client, point it at https://app.daedalmap.com/mcp. Otherwise use the hosted HTTP API at /api/v1/ directly.

Local and open-weight runtimes

If your agent framework supports remote MCP, use https://app.daedalmap.com/mcp. Otherwise call /api/v1/catalog, /api/v1/packs/{pack_id}, and /api/v1/query/dataset directly.

First flow

  1. Call GET /api/v1/catalog — see all live packs at a glance.
  2. Call GET /api/v1/packs/{pack_id} for each pack you plan to use. This is the workhorse endpoint. It returns the complete metric inventory with per-metric statistics, a quick_start block with step-by-step rules and a paste-ready query body, temporal and geographic coverage, and the list of countries missing from each metric. Read quick_start.important_rules before writing any query.
  3. Copy quick_start.first_query_template and modify region_ids, time, and metrics to match your question.
  4. Call POST /api/v1/query/dataset. Free packs return rows directly. Paid packs return a 402 challenge with the exact price; retry with payment.
  5. For questions that cross two packs, run step 4 once per pack and join rows on loc_id client-side.

The metric stats block (min, median, max) in the pack response is a diagnostic tool, not just a description. If a max value looks like a year or an implausible number, that signals a data quality edge case worth checking before building on that metric.

Copyable request shapes for every pack

Canonical first, live second

Agent callers should prefer DaedalMap's hosted canonical pack tools first. For earthquakes and tsunamis, that means using the published pack lanes and their processed event history before considering any upstream wrapper.

  • Preferred: get_earthquake_events and /api/v1/query/dataset against the earthquakes pack.
  • Routing hint: use get_pack as the source of truth for canonical_available_through, preferred_tool, and any live_fallback_tool guidance.
  • Fallback only: live wrapper tools for preliminary upstream data when the caller explicitly asks for live/preliminary updates or needs a window not yet present in the canonical hosted lane.
  • Explore mode: the human Explore chat should stay on DaedalMap canonical data and should not silently switch to an upstream live wrapper.

This keeps cross-pack joins, loc_id alignment, enriched fields, and published artifact behavior stable by default.

Pricing

Base price is $0.01 for up to 100 rows, then $0.0001 per additional row. The 402 challenge shows the exact amount before any charge. Requests above the pack row limit are rejected rather than charged.