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."
}
}
}