Skip to main content
Glama
fastmcp-me

chuk-mcp-geocoder

by fastmcp-me

Add to Cursor Add to VS Code Add to Claude Add to ChatGPT Add to Codex Add to Gemini

chuk-mcp-geocoder

Geocoding & Place Discovery MCP Server via Nominatim/OpenStreetMap.

Provides forward/reverse geocoding, bounding box extraction, nearby places discovery, batch geocoding, route waypoints, and administrative boundary lookup — designed to work alongside other MCP geospatial servers (DEM, STAC, etc.).

This is a demonstration project provided as-is for learning and testing purposes.

Python 3.11+

Tools

Tool

Description

geocode

Place name to coordinates (lat, lon, bbox, address)

reverse_geocode

Coordinates to place name and address

bbox_from_place

Place name to [west, south, east, north] bbox for DEM/STAC tools

nearby_places

Find places near a coordinate at multiple scales

admin_boundaries

Administrative hierarchy (country, state, county, city, suburb)

batch_geocode

Geocode multiple place names in one call

route_waypoints

Geocode waypoints in order and compute route distances

distance_matrix

Compute haversine distance matrix between multiple points

geocoder_status

Server status and cache statistics

geocoder_capabilities

Full capabilities listing with LLM guidance

Related MCP server: mapsi-mcp

Installation

The easiest way to use the server is with uvx, which runs it without installing:

uvx chuk-mcp-geocoder

This automatically downloads and runs the latest version. Perfect for Claude Desktop!

# Install from PyPI
uv pip install chuk-mcp-geocoder

# Or clone and install from source
git clone <repository-url>
cd chuk-mcp-geocoder
uv sync --dev

Using pip (Traditional)

pip install chuk-mcp-geocoder

Usage

With Claude Desktop

Option 1: Use the Public Server (Easiest)

Connect to the hosted public server at chuk-mcp-geocoder.fly.dev:

MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "geocoder": {
      "url": "https://chuk-mcp-geocoder.fly.dev/mcp"
    }
  }
}

Option 2: Streamable HTTP URL (Local)

Run the server locally and connect via HTTP:

{
  "mcpServers": {
    "geocoder": {
      "url": "http://localhost:8010/mcp"
    }
  }
}

Then start the server:

uvx chuk-mcp-geocoder http

Option 3: Run Locally with uvx

{
  "mcpServers": {
    "geocoder": {
      "command": "uvx",
      "args": ["chuk-mcp-geocoder"]
    }
  }
}

Option 4: Run Locally with pip

{
  "mcpServers": {
    "geocoder": {
      "command": "chuk-mcp-geocoder"
    }
  }
}

Standalone

Run the server directly:

# With uvx (recommended - always latest version)
uvx chuk-mcp-geocoder

# With uvx in HTTP mode
uvx chuk-mcp-geocoder http

# Or if installed locally
chuk-mcp-geocoder
chuk-mcp-geocoder http

Or with uv/Python:

# STDIO mode (default, for MCP clients)
uv run chuk-mcp-geocoder
# or: python -m chuk_mcp_geocoder.server

# HTTP mode (for web access and streamable HTTP)
uv run chuk-mcp-geocoder http
# or: python -m chuk_mcp_geocoder.server http

# HTTP mode with custom host/port
uv run chuk-mcp-geocoder http --host 0.0.0.0 --port 9000

STDIO mode is for MCP clients like Claude Desktop and mcp-cli. HTTP mode runs a web server on http://localhost:8010 for HTTP-based MCP clients.

Usage with MCP CLI

uv run mcp-cli --server geocoder,dem,stac

Then ask:

"Get the elevation profile for Mersea Island"

The LLM will use bbox_from_place or geocode to resolve the location, then pass coordinates to the DEM server.

Configuration

Environment Variable

Description

Default

NOMINATIM_EMAIL

Contact email for Nominatim API

(none)

NOMINATIM_BASE_URL

Custom Nominatim instance URL

https://nominatim.openstreetmap.org

MCP_STDIO

Force stdio transport mode

(auto-detect)

Development

Setup

# Clone the repository
git clone <repository-url>
cd chuk-mcp-geocoder

# Install with uv (recommended)
uv sync --dev

# Or with pip
pip install -e ".[dev]"

Running Tests

make test              # Run tests
make test-cov          # Run tests with coverage
make coverage-report   # Show coverage report

Code Quality

make lint      # Run linters
make format    # Auto-format code
make typecheck # Run type checking
make security  # Run security checks
make check     # Run all checks

Building

make build           # Build package
make publish-test    # Upload to TestPyPI for testing
make publish-manual  # Manually upload to PyPI (requires PYPI_TOKEN)
make publish         # Create tag and trigger GitHub Actions release

Architecture

Follows the same 5-layer pattern as chuk-mcp-dem:

  1. core/nominatim.py — Async HTTP client with rate limiting and LRU cache

  2. core/geocoder.py — Async manager with validation and typed dataclass results

  3. models/responses.py — Pydantic v2 response models (extra="forbid", to_text())

  4. constants.py — All configuration, messages, and metadata

  5. tools/*/api.py — MCP tool registration with @mcp.tool() decorators

Public Server

A public instance is hosted at chuk-mcp-geocoder.fly.dev for easy access:

  • URL: https://chuk-mcp-geocoder.fly.dev/mcp

  • Protocol: MCP over HTTPS (Streamable HTTP)

  • Free to use: No API key required

  • Always up-to-date: Running the latest version

Simply add it to your Claude Desktop config:

{
  "mcpServers": {
    "geocoder": {
      "url": "https://chuk-mcp-geocoder.fly.dev/mcp"
    }
  }
}

Data Source

All geocoding data comes from OpenStreetMap via the Nominatim API.

  • Data license: ODbL 1.0

  • API rate limit: 1 request/second (public API)

  • Results are cached in-memory (1 hour TTL)

License

Apache-2.0

Available Tools

10 tools
admin_boundariesA

Get administrative boundary hierarchy for a location.

    Returns the full admin hierarchy from country down to neighbourhood
    for the given coordinates.

    Args:
        lat: Latitude (-90 to 90)
        lon: Longitude (-180 to 180)
        output_mode: "json" (default) or "text"

    Returns:
        Administrative boundaries from largest to smallest
    
ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
output_modeNojson

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It clearly states the tool returns administrative boundaries, implying a read-only operation, without contradicting annotations. It does not explicitly state it is non-destructive, but the context is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loads the purpose, and uses a clear structure with Args and Returns sections, earning its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description adequately covers the three parameters and the general return value ('Administrative boundaries from largest to smallest'), though it could provide more detail on the exact structure of the returned boundaries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description fully compensates by explaining each parameter, including the output_mode choices, providing meaning beyond the schema's type constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get administrative boundary hierarchy for a location' and specifies the hierarchy from country to neighbourhood, distinguishing it from sibling tools like geocode or nearby_places.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for coordinates, but does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_geocodeA

Geocode multiple place names in one call.

    Each query is processed sequentially to respect Nominatim rate limits.
    Individual failures don't abort the batch.

    Args:
        queries: JSON array of place names (e.g. '["Boulder, CO", "Denver, CO"]')
        limit: Maximum results per query (default 1)
        output_mode: "json" (default) or "text"

    Returns:
        Per-query results with coordinates, or error for failed queries

    CRITICAL — LLM retry guidance:
        If any query in the batch fails, re-run only the failed queries
        with simplified names using the single geocode tool. Nominatim
        works best with simple place names — remove landmarks, qualifiers,
        and descriptive words before retrying.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queriesYes
output_modeNojson

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors: sequential processing (rate limit respect) and that individual failures do not abort the batch. It also provides retry advice. No annotations exist, so the description carries the full burden. A minor point is that it does not mention any potential performance or timeout implications, but overall it is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (Args, Returns, CRITICAL guidance) and is front-loaded with the main purpose. It effectively communicates essential information, though the retry guidance could be integrated more concisely. Still, every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description sufficiently covers the tool's behavior, parameters, and error handling. It also provides clear retry logic. It is complete enough for an agent to use correctly, though it could mention expected return format in more detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema has 0% description coverage, the description adds meaning for all three parameters: 'queries' explained as a JSON array of place names (with example), 'limit' as max results per query, and 'output_mode' as 'json' or 'text'. This significantly clarifies usage, though there is a slight inconsistency: schema type for queries is 'string' but description says 'JSON array', which could cause confusion.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Geocode multiple place names in one call.' It distinguishes from siblings by emphasizing batch processing and mentions sequential execution and rate limits, making the purpose specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool, including sequential processing to respect rate limits. It includes critical retry guidance: if a query fails, use the single geocode tool with simplified names, directly addressing failure scenarios and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bbox_from_placeA

Get a bounding box for a place, suitable for DEM/STAC tools.

    Returns bbox as [west, south, east, north] in EPSG:4326, compatible
    with dem_fetch, stac_search, dem_slope, and other geospatial tools.

    Args:
        query: Place name to get bbox for (e.g. "Palm Jumeirah, Dubai")
        padding: Fractional padding to expand bbox (0.1 = 10% on each side, default 0.0)
        output_mode: "json" (default) or "text"

    Returns:
        Bounding box [west, south, east, north], center point, and approximate area

    CRITICAL — LLM retry workflow when no results are found:
        If the query returns no results, you MUST retry automatically — do
        NOT ask the user. Simplify the query progressively:

        1. Remove specific landmarks/features, keep the broader place.
           "Strood Causeway, Mersea Island" → "Mersea Island"
        2. Drop region/country qualifiers if still no results.
           "Mersea Island, Essex, UK" → "Mersea Island"
        3. Try alternative or official names for the place.
        4. If using a broader place, consider adding padding to cover the
           area of interest (e.g. padding=0.1 for 10% expansion).

        Always retry at least twice before reporting failure.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
paddingNo
output_modeNojson

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so description carries full burden. Discloses return format (bbox, center, area) and EPSG:4326. Includes retry behavior. Does not cover rate limits or error handling beyond retry, but adequate for a read-only geocoding tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

First line front-loads core purpose. Retry workflow is detailed but necessary. Could be slightly more concise, but structure is logical and efficient for LLM guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains return value. Covers all 3 parameters and includes retry logic. For a tool with 3 params and no nested objects, it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage 0%, but description provides detailed semantics: 'query' with example, 'padding' as fractional expansion with default, 'output_mode' options. Adds meaning beyond bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'Get' and resource 'bounding box for a place'. Specifies bbox format as [west, south, east, north] in EPSG:4326 and lists compatible tools (dem_fetch, stac_search, etc.), distinguishing it from sibling geocoding tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states it is suitable for DEM/STAC tools and provides a detailed retry workflow on no results, guiding the LLM to simplify queries. Lacks explicit when-not-to-use, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

distance_matrixA

Compute haversine distance matrix between multiple points.

    Pure computation — no API calls needed. Accepts points as either
    [lat, lon] pairs or {"name": ..., "lat": ..., "lon": ...} objects.

    Args:
        points: JSON array of points. Each point is either:
                - [lat, lon] pair (auto-named "Point 1", "Point 2", ...)
                - {"name": "Label", "lat": 40.0, "lon": -105.0}
        output_mode: "json" (default) or "text"

    Returns:
        NxN distance matrix in metres between all point pairs
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pointsYes
output_modeNojson

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully bears the burden of behavioral disclosure. It clearly states that no API calls are made, explains input formats, output mode, and the return value (NxN distance matrix in metres). This is comprehensive for a computation-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is reasonably concise, using a docstring format with Args/Returns sections. It could be slightly more front-loaded (the first sentence is clear), but overall every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only 2 parameters, no output schema, and no annotations, the description is fully complete: it explains both input formats, the output mode, and the return type (distance matrix in metres). No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does so thoroughly: details both point formats (array or object), auto-naming behavior, and output_mode options (json/text default). This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it computes a haversine distance matrix between multiple points. It specifies that it is pure computation without API calls, and provides input format examples. The purpose is distinct from sibling tools (geocoding, routing).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Pure computation — no API calls needed,' which helps an agent choose this offline tool over potentially slower or costlier alternatives. It implies appropriate usage but does not list exclusions or when-not-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

geocodeA

Forward geocode a place name to coordinates.

    Searches the OpenStreetMap/Nominatim database for places matching
    the query and returns coordinates, bounding boxes, and address details.

    Args:
        query: Place name or address to search for (e.g. "Boulder, Colorado")
        limit: Maximum results (1-50, default 5)
        countrycodes: Comma-separated ISO 3166-1 country codes to filter (e.g. "us,gb")
        language: Preferred response language (e.g. "en", "de", "fr")
        output_mode: "json" (default) or "text"

    Returns:
        List of matching places with coordinates, bbox, and address details

    CRITICAL — LLM retry workflow when no results are found:
        Nominatim works best with simple, well-known place names. Specific
        or compound names (e.g. "Strood Causeway, Mersea Island, UK") often
        return nothing.

        If the query returns no results, you MUST retry automatically — do
        NOT ask the user. Follow this cascade:

        1. Remove qualifiers and landmarks — keep only the core place name.
           "Strood Causeway, Mersea Island, UK" → "Mersea Island, UK"
           "Portland Harbor, Maine" → "Portland, Maine"
        2. Simplify further — drop region/country qualifiers.
           "Mersea Island, UK" → "Mersea Island"
           "Portland, Maine" → "Portland"
        3. Use countrycodes to narrow broad queries (e.g. countrycodes="gb").
        4. If the place is near a well-known location, geocode that instead
           and report the approximate area.
        5. Try alternative or official names — "The Strood" instead of
           "Strood Causeway", etc.

        Always retry at least twice with progressively simpler terms before
        telling the user the location could not be found.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
languageNo
output_modeNojson
countrycodesNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses use of Nominatim, retry behavior, and notes that simple names work best. Does not explicitly mention read-only nature or authentication, but provides adequate behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections for description, args, returns, and a detailed 'CRITICAL' section. The retry workflow is verbose but valuable. Could be more concise, but front-loads purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, no output schema, and no annotations, the description is comprehensive. Covers all parameters, return format, and provides a critical retry strategy for edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description explains all 5 parameters: query (with example), limit (range/default), countrycodes (ISO codes), language (example), output_mode (options). Adds significant meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Forward geocode a place name to coordinates' and specifies the database (OpenStreetMap/Nominatim). It distinguishes from siblings like reverse_geocode by focusing on forward geocoding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Includes a detailed retry workflow for when no results are found, guiding the LLM on how to handle failures. Does not explicitly state when not to use or compare with alternatives, but provides clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

geocoder_capabilitiesB

Get full server capabilities.

    Returns the complete list of tools, Nominatim API details,
    and LLM-friendly usage guidance.

    Args:
        output_mode: "json" (default) or "text"

    Returns:
        Full server capabilities including tool lists and guidance
    
ParametersJSON Schema
NameRequiredDescriptionDefault
output_modeNojson

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only mentions the return value. It lacks disclosure of behavioral traits such as idempotency, side effects, rate limits, or authentication requirements, which is insufficient for a tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two short lines plus structured Args/Returns. It is front-loaded with the core purpose, though could be slightly more informative without sacrificing brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and minimal parameter details, the description is incomplete. It mentions 'LLM-friendly usage guidance' without explaining what that entails, leaving the agent without enough context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning for the output_mode parameter by listing default and options, but does not clarify what each output mode returns. With 0% schema coverage, more detail would be expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns 'full server capabilities' including tool lists, API details, and usage guidance. It is distinct from sibling tools which focus on geocoding, status, or other operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for discovering capabilities, but it does not explicitly state when to use it versus alternatives like geocoder_status or other sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

geocoder_statusA

Get geocoder server status.

    Returns server version, Nominatim URL, cache stats, and tool count.

    Args:
        output_mode: "json" (default) or "text"

    Returns:
        Server status information
    
ParametersJSON Schema
NameRequiredDescriptionDefault
output_modeNojson

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose behavioral traits such as side effects, rate limits, or authentication requirements. It only describes the return value, leaving the agent without information on potential impacts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with clear sections for description, args, and returns. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter) and the description's coverage of purpose, return values, and parameter options, it is complete enough for an agent to use correctly. No output schema exists, but return fields are explicitly listed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description adds meaning by specifying valid values for 'output_mode' ('json' default, 'text'). This compensates for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get geocoder server status' and lists specific return values (server version, Nominatim URL, cache stats, tool count), clearly distinguishing it from sibling tools like geocode or reverse_geocode.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given on when to use this tool versus alternatives. The description implies it is for checking server status but does not provide exclusions or context for when it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nearby_placesA

Find places near a coordinate.

    Discovers nearby places at different scales (buildings, streets,
    suburbs, cities) using reverse geocoding at multiple zoom levels.

    Args:
        lat: Latitude (-90 to 90)
        lon: Longitude (-180 to 180)
        limit: Maximum number of results (default 10)
        categories: Comma-separated OSM categories to filter (e.g. "natural,tourism")
        output_mode: "json" (default) or "text"

    Returns:
        List of nearby places with distances, sorted by proximity
    
ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
limitNo
categoriesNo
output_modeNojson

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It reveals behavior like using reverse geocoding at multiple zoom levels and returning sorted results. However, it lacks details on error handling (invalid coordinates), rate limits, or authentication needs. The read-only nature is implied but not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief summary followed by parameter documentation in a clean format. It is concise yet informative, with no wasted words. The parameter doc is slightly verbose but still efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description adequately explains the return value (list of places with distances sorted by proximity). It covers the tool's purpose, parameters, and output. However, it does not mention pagination, result limits beyond 'limit' parameter, or edge cases like no results found.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates. Each parameter (lat, lon, limit, categories, output_mode) is explained with context (e.g., comma-separated OSM categories, default values). It adds meaning beyond the schema, though output_mode could benefit from listing allowed values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Find places near a coordinate' and explains the scaling concept (buildings, streets, etc.), which distinguishes it from siblings like 'geocode' (text to coordinates) and 'reverse_geocode' (coordinates to address). However, it does not explicitly contrast with siblings, so a perfect score is not warranted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description describes what the tool does and implies usage for discovering nearby places, but it does not provide explicit guidance on when to use this tool versus alternatives (e.g., when to use 'reverse_geocode' versus this). No when-not or exclusion criteria are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reverse_geocodeA

Reverse geocode coordinates to a place name and address.

    Looks up the nearest place for the given coordinates and returns
    the display name, structured address, and bounding box.

    Args:
        lat: Latitude (-90 to 90)
        lon: Longitude (-180 to 180)
        zoom: Detail level 0-18 (18=building, 10=city, 3=country, default 18)
        language: Preferred response language (e.g. "en", "de", "fr")
        output_mode: "json" (default) or "text"

    Returns:
        Place name, address components, and bounding box
    
ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
zoomNo
languageNo
output_modeNojson

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It implies a read-only lookup but does not explicitly state that the tool is non-destructive or detail any side effects, permissions, or rate limits. The behavioral traits are partially covered (e.g., zoom level impact), but more transparency would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with a brief intro, an Args section, and a Returns section. Every sentence adds value: it defines the operation, lists parameters with context, and summarizes output. There is no redundancy, and it is appropriately sized for a 5-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema, the description should detail the return structure. It mentions 'display name, structured address, and bounding box' but does not specify the format (e.g., JSON keys or text). For a tool with 5 parameters and no output schema, more detail on the return would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by explaining each parameter: lat/lon ranges, zoom levels with examples, language format, and output_mode options. This adds meaningful context beyond the schema's type/default information. However, it lacks detailed examples for the language parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Reverse geocode coordinates to a place name and address.' It specifies the input (coordinates) and output (display name, structured address, bounding box), making it unambiguous. The verb 'reverse geocode' is specific to the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives like 'geocode' or 'nearby_places.' While the purpose implies it's for coordinate-to-place conversion, no when-to-use or when-not-to-use context is given, which would help the agent choose among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

route_waypointsA

Geocode waypoints in order and compute route distances.

    Resolves each waypoint to coordinates, then computes haversine
    distances between consecutive points.

    Args:
        waypoints: JSON array of place names in route order
                   (e.g. '["Boulder, CO", "Denver, CO", "Aspen, CO"]')
        output_mode: "json" (default) or "text"

    Returns:
        Resolved waypoints, leg distances, total distance, and bounding box

    CRITICAL — LLM retry guidance:
        If a waypoint fails to resolve, simplify its name and retry the
        entire route. Remove landmarks, qualifiers, and descriptive words.
        Use the single geocode tool to test problematic names first.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
waypointsYes
output_modeNojson

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully bears the burden of disclosure. It states the algorithm (haversine distances), return structure (resolved waypoints, leg distances, total distance, bounding box), and retry behavior. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, Returns, CRITICAL). It is concise—no unnecessary words—and front-loads the core purpose. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description fully documents return values (resolved waypoints, leg distances, total distance, bounding box). It also provides critical retry guidance, making it complete for a tool with only 2 parameters and no nested objects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully explains both parameters: 'waypoints' is a JSON array of place names with an example, and 'output_mode' defaults to 'json' with 'text' as alternative. This adds essential meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it geocodes waypoints and computes route distances, with a specific verb ('Geocode') and resource ('waypoints in order'). It distinguishes itself from sibling tools like 'geocode' (single place) and 'distance_matrix' (likely driving distances) by focusing on sequential waypoint resolution and haversine distances.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit CRITICAL retry guidance for when waypoints fail, instructing to simplify names and test with geocode. However, it does not explicitly compare with sibling tools like 'distance_matrix' for when to use straight-line vs driving distances.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 10 tool updatesv0.1.0
    • First observedadmin_boundaries
    • First observedbatch_geocode
    • First observedbbox_from_place
    • First observeddistance_matrix
    • First observedgeocode
    • First observedgeocoder_capabilities
    • First observedgeocoder_status
    • First observednearby_places
    • First observedreverse_geocode
    • First observedroute_waypoints

TDQS

A3.9/5.0
Disambiguation4/5

Most tools have distinct purposes, but bbox_from_place and geocode overlap slightly (both take place names) and batch_geocode is a batch version of geocode. Descriptions clarify differences, so agents can likely distinguish them.

Naming Consistency3/5

All names use snake_case and are descriptive, but they mix verb phrases (geocode, reverse_geocode), noun phrases (geocoder_status, admin_boundaries), and compound expressions (bbox_from_place, nearby_places). No single consistent pattern.

Tool Count5/5

10 tools is appropriate for a geocoding server, covering forward/reverse geocoding, batch operations, bbox extraction, nearby places, admin boundaries, routing, and distance computation without being excessive.

Completeness4/5

Covers core geocoding operations well. Minor gaps: no explicit search by category or type, but nearby_places and admin_boundaries provide related functionality. The retry workflows in descriptions enhance completeness.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    An MCP server providing geocoding and place discovery services via Nominatim and OpenStreetMap. It enables users to perform forward and reverse geocoding, extract bounding boxes, and find nearby places or administrative hierarchies.
    10
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Geospatial API tools for AI agents — geocoding, reverse geocoding, routing, isochrone, distance matrix, static maps, H3 hexagons, elevation, GPS map-matching, point-in-polygon, address normalisation, timezone lookup, and batch geocoding. Built on OpenStreetMap infrastructure. Cost-effective alternative to Google Maps API.
    18
    37
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/fastmcp-me/chuk-mcp-geocoder'

If you have feedback or need assistance with the MCP directory API, please join our Discord server