Skip to content
Back to thinair-geo

Card snapshot

geo.thinair.co · 2026-10-02 11:38:36 UTC · 47ce3039543e3ce76cccf94129d671805a173ea7f6d47d4950dd506d37a1c6b1

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "protocolVersion": "0.3.0",
  "name": "thinair-geo",
  "description": "ThinAir Geo \u2014 full-stack geo tools for AI agents via MCP. One server covering geocoding, multi-profile routing (auto, truck, bicycle, pedestrian), isochrones, live traffic, weather, and place search.",
  "version": "2.2.0",
  "url": "https://geo.thinair.co/mcp",
  "preferredTransport": "JSONRPC",
  "provider": {
    "organization": "ThinAir",
    "url": "https://thinair.co"
  },
  "documentationUrl": "https://geo.thinair.co/developers",
  "iconUrl": "https://geo.thinair.co/favicon.ico",
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/plain"
  ],
  "skills": [
    {
      "id": "geocode",
      "name": "geocode",
      "description": "Address \u2192 coordinates. Global coverage, cached and accurate. Available on every plan.",
      "tags": [
        "geocode",
        "free"
      ]
    },
    {
      "id": "geocode_structured",
      "name": "geocode_structured",
      "description": "Structured-field geocoding \u2014 address, locality, region, postalcode, country \u2192 precise match. Available on every plan.",
      "tags": [
        "geocode",
        "free"
      ]
    },
    {
      "id": "reverse_geocode",
      "name": "reverse_geocode",
      "description": "Coordinates \u2192 nearest address or place name. Available on every plan.",
      "tags": [
        "geocode",
        "free"
      ]
    },
    {
      "id": "batch_geocode",
      "name": "batch_geocode",
      "description": "Up to 50 addresses in one call, cached for repeat lookups. Available on every plan.",
      "tags": [
        "geocode",
        "free"
      ]
    },
    {
      "id": "place_get",
      "name": "place_get",
      "description": "Re-fetch any place or intersection by its stable public id (ta_place_ / ta_intersection_). Available on every plan.",
      "tags": [
        "geocode",
        "free"
      ]
    },
    {
      "id": "resolve_intersection",
      "name": "resolve_intersection",
      "description": "Street A \u00d7 Street B \u2192 the exact corner: a stable ta_intersection_ id + coordinates. Available on every plan.",
      "tags": [
        "geocode",
        "free"
      ]
    },
    {
      "id": "search_places",
      "name": "search_places",
      "description": "POIs near a point \u2014 truck stops, fuel, rest areas, restaurants. Available on every plan.",
      "tags": [
        "places",
        "free"
      ]
    },
    {
      "id": "explore",
      "name": "explore",
      "description": "Cities and venues near a location with population filtering. Requires the pro plan or higher.",
      "tags": [
        "places",
        "pro"
      ]
    },
    {
      "id": "directions",
      "name": "directions",
      "description": "Turn-by-turn routing with ETAs, restrictions, 10 truck profiles. Available on every plan.",
      "tags": [
        "routing",
        "free"
      ]
    },
    {
      "id": "distance_matrix",
      "name": "distance_matrix",
      "description": "Many-to-many travel times and distances between sets of points in one call. Available on every plan.",
      "tags": [
        "routing",
        "free"
      ]
    },
    {
      "id": "isochrone",
      "name": "isochrone",
      "description": "Drive-time reachability polygon \u2014 how far can you go in N minutes? Requires the starter plan or higher.",
      "tags": [
        "routing",
        "starter"
      ]
    },
    {
      "id": "locate",
      "name": "locate",
      "description": "Road-network context for one coordinate \u2014 road name, class, speed limit, legality, timezone. Available on every plan.",
      "tags": [
        "routing",
        "free"
      ]
    },
    {
      "id": "map_match",
      "name": "map_match",
      "description": "Snap a raw GPS breadcrumb trail to the road network \u2014 matched geometry, distance, confidence, match status. Available on every plan.",
      "tags": [
        "routing",
        "free"
      ]
    },
    {
      "id": "trace_attributes",
      "name": "trace_attributes",
      "description": "Per-segment road attributes for a matched trace \u2014 names, classes, speed limits, surfaces. Available on every plan.",
      "tags": [
        "routing",
        "free"
      ]
    },
    {
      "id": "geofence_contains",
      "name": "geofence_contains",
      "description": "Point-in-polygon test \u2014 is a coordinate inside a supplied geofence? Available on every plan.",
      "tags": [
        "places",
        "free"
      ]
    },
    {
      "id": "traffic",
      "name": "traffic",
      "description": "Live speed & congestion for 30 US metros, real-time refresh. Requires the starter plan or higher.",
      "tags": [
        "traffic",
        "starter"
      ]
    },
    {
      "id": "weather",
      "name": "weather",
      "description": "Current conditions + 16-day forecast + severe alerts + minute precipitation. Available on every plan.",
      "tags": [
        "weather",
        "free"
      ]
    },
    {
      "id": "quota",
      "name": "quota",
      "description": "Check current usage and plan limits. Available on every plan.",
      "tags": [
        "account",
        "free"
      ]
    },
    {
      "id": "issue_api_key",
      "name": "issue_api_key",
      "description": "Mint a fresh ta_geo_ API key for your account and rotate \u2014 the previous key keeps working for one hour, then stops. Available on every plan.",
      "tags": [
        "account",
        "free"
      ]
    }
  ],
  "securitySchemes": {
    "oauth2": {
      "type": "oauth2",
      "description": "OAuth 2.1 with PKCE. Dynamic client registration is open; the consent screen names the requesting client.",
      "flows": {
        "authorizationCode": {
          "authorizationUrl": "https://geo.thinair.co/authorize",
          "tokenUrl": "https://geo.thinair.co/token",
          "scopes": {
            "tools:read": "tools:read",
            "keys:write": "keys:write"
          }
        }
      }
    },
    "apiKey": {
      "type": "apiKey",
      "in": "header",
      "name": "Authorization",
      "description": "Bearer ta_geo_\u2026 key."
    }
  },
  "security": [
    {
      "oauth2": [
        "tools:read",
        "keys:write"
      ]
    },
    {
      "apiKey": []
    }
  ],
  "x-thinair": {
    "organization": {
      "name": "ThinAir",
      "url": "https://thinair.co"
    },
    "siblingProducts": [
      {
        "name": "ThinAir Data",
        "description": "Query PostgreSQL, MySQL and SQL Server in plain English over MCP and REST.",
        "url": "https://data.thinair.co",
        "mcp": "https://data.thinair.co/mcp",
        "agentCard": "https://data.thinair.co/.well-known/agent-card.json"
      }
    ],
    "plans": [
      {
        "plan": "free",
        "daily_request_limit": 15,
        "price": "Free"
      },
      {
        "plan": "dev_trial",
        "daily_request_limit": 1000,
        "price": "Free (time-limited trial)"
      },
      {
        "plan": "starter",
        "daily_request_limit": 500,
        "price": "$9/mo"
      },
      {
        "plan": "pro",
        "daily_request_limit": 10000,
        "price": "$29/mo"
      },
      {
        "plan": "business",
        "daily_request_limit": 50000,
        "price": "$99/mo"
      },
      {
        "plan": "enterprise",
        "daily_request_limit": null,
        "price": "Custom (contact sales)"
      }
    ],
    "billing": {
      "model": "human-approved subscription",
      "checkout_url": "https://geo.thinair.co/checkout",
      "note": "Agents do not pay autonomously. A quota, tier-denied, or 429 response carries an upgrade_url; present it to the user, who completes payment. The same OAuth session or API key continues with the new limits."
    }
  }
}