Foursquare Places MCP (v3 Places API) — POI lookup with rich tags and popularity. Pairs with overpass (OSM coverage) and geo/nominatim for location-based searches.
Three well-named tools with clear, actionable descriptions (avg 180 chars). All tools have complete input schemas with typed properties and descriptions. However, output schemas are not documented, LLMs cannot predict response structure for downstream chaining. Parameter descriptions are good but lack explicit constraints (e.g., radius_m range 1-100000 stated in description but not as JSON Schema minima/maxima). No error handling guidance or recovery paths documented. Missing tool annotations (readOnlyHint, idempotentHint). search_places has no required parameters despite needing at least query OR (near OR lat/lon), this ambiguity invites invalid calls.
Get full details for a Foursquare place by fsq_id. Returns name, categories, address, geocodes, social media, website, hours, rating, price, popularity, tips counts.
POIs near a lat/lon without a search term — useful for "what's around me?" agents. Optionally filter by Foursquare category.
Search Foursquare places. Combine `query` (free text like "coffee", "italian food", "hardware store") with a location anchor — either `near` (e.g., "Brooklyn, NY"), or `latitude`+`longitude`, or `bbox`. Returns place name, fsq_id, categories, address, distance, lat/lon, and popularity.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nested objects) for downstream tool chaining. normalizePlace() returns a flattened object but this is invisible to callers.
search_places has no required parameters. At least one of query, near, or (latitude+longitude) must be provided, but the schema declares required: []. This allows invalid calls like search_places({}) with no location anchor.
Numeric parameter constraints (radius_m: 1-100000, limit: 1-50) stated only in descriptions, not in JSON Schema. LLMs cannot parse natural-language constraints; use minimum/maximum in schema.
No tool annotations (readOnlyHint, idempotentHint). All three tools are read-only and idempotent, but this is not declared in the schema. Agents cannot distinguish safe tools from destructive ones.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
No error recovery guidance. callTool() throws generic errors ('Foursquare: unauthorized', 'Foursquare: rate-limit') without suggesting next steps. LLMs cannot self-correct or retry intelligently.