# geonames-mcp-server (remote · geonames.caseyjhand.com)

Search GeoNames places, walk admin hierarchies, reverse geocode, get postal codes and country info.

- Trust score: 88/100 (high trust)
- Change this week: +1
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `geonames.caseyjhand.com`: 88/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-geonames-mcp-server/geonames.md), [page](https://verifymcp.io/servers/cyanheads-geonames-mcp-server/geonames)
- npm · `@cyanheads/geonames-mcp-server`: 39/100, [markdown](https://verifymcp.io/servers/cyanheads-geonames-mcp-server/cyanheads-geonames-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-geonames-mcp-server/cyanheads-geonames-mcp-server)

## Channel facts

- Endpoint: `https://geonames.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.2.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 83/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 73/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 5371 tokens (~596/item across 9 items; 8 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 100/100
  - No destabilizing schema changes in the last 30 days.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the geonames-mcp-server server?

geonames-mcp-server is a hosted endpoint at https://geonames.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http cyanheads-geonames-mcp-server 'https://geonames.caseyjhand.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "cyanheads-geonames-mcp-server": {
      "url": "https://geonames.caseyjhand.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "cyanheads-geonames-mcp-server": {
      "type": "http",
      "url": "https://geonames.caseyjhand.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.cyanheads-geonames-mcp-server]
url = "https://geonames.caseyjhand.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-geonames-mcp-server": {
      "type": "remote",
      "url": "https://geonames.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-geonames-mcp-server --url 'https://geonames.caseyjhand.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-geonames-mcp-server:
    url: "https://geonames.caseyjhand.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "cyanheads-geonames-mcp-server": {
      "Transport": "http",
      "Url": "https://geonames.caseyjhand.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add cyanheads-geonames-mcp-server -t streamable-http -u 'https://geonames.caseyjhand.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "cyanheads-geonames-mcp-server": {
      "type": "http",
      "url": "https://geonames.caseyjhand.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-01 (score 88, 0)

- [security] Stability: 0.97 → pass

### 2026-10-31 (score 88, +1)

No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-29 (score 87, +3)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “geonames_get_children” rewrote its description, which is the text the model reads
- [functional] First check of Schema quality: 100
- [functional] New resource “geonames-guide”
- [functional] Server version: 0.1.3 → 0.2.0
- [cosmetic] “geonames_reverse_geocode” reworded the description of “cities”
- [cosmetic] “geonames_search_places” reworded the description of “cities”
- [cosmetic] “geonames_get_children” reworded the description of “nameContains”
- [cosmetic] “geonames_get_countries” reworded the description of “nameContains”
- [cosmetic] “geonames_list_reference” reworded the description of “nameContains”

### 2026-10-28 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (8)

### `geonames_search_places` (~1277 tokens)

Search GeoNames places

Search the GeoNames gazetteer of 13M+ places by name and filters: country, admin division by its GeoNames code (adminCode1 TX with countries US for Texas), feature class (P populated places, A admin divisions, T mountains and terrain, H water, S buildings and spots), feature code (PPLC capitals, ADM1 states, MT mountains, AIRP airports), population tier, and bounding box. Results carry the geonameId that geonames_get_place, geonames_get_hierarchy, and geonames_get_children take. The default match requires a query term in the place name while letting other terms match the country or admin names ("Berlin, Germany"). Costs 1 GeoNames credit per call.

Input parameters:

- `adminCode1` (string): First-level admin division (state, province, region) to search inside, by its GeoNames admin code: TX is Texas in US. Take it from geonames_get_place or geonames_reverse_geocode (adminLevels[].code a…
- `adminCode2` (string): Second-level admin division (a US county, a French département) to search inside, by its GeoNames admin code: 033 is King County in WA. Take it from geonames_get_place or geonames_reverse_geocode (ad…
- `adminCode3` (string): Third-level admin division to search inside, by its GeoNames admin code: 09162 is Munich in DE. Take it from geonames_get_place or geonames_reverse_geocode (adminLevels[].code at level 3). Needs admi…
- `adminCode4` (string): Fourth-level admin division to search inside, by its GeoNames admin code: 92012 is Boulogne-Billancourt in FR. Take it from geonames_get_place or geonames_reverse_geocode (adminLevels[].code at level…
- `boundingBox` (object): Keep only places inside this box. The box cannot cross the 180° meridian: split such an area into two searches.
- `cities` (string): Keep only populated places (class P) with a population of at least 1,000 (cities1000), 5,000 (cities5000), or 15,000 (cities15000), plus seats of admin divisions: GeoNames' cities tiers. A city's sec…
- `countries` (array): ISO 3166-1 country codes, up to 10, as a list: alpha-2 (US, GB, DE), alpha-3 (USA, GBR, DEU), or three-digit numeric (840, 826, 276), each sent to GeoNames as alpha-2. UK is accepted for GB and FL fo…
- `featureClasses` (array): GeoNames feature classes: A admin divisions, H water, L areas, P populated places, R roads, S spots and buildings, T terrain, U undersea, V vegetation. With featureCodes too, the two lists intersect:…
- `featureCodes` (array): GeoNames feature codes (PPLC capital, ADM1 state, MT mountain, AIRP airport), up to 20, as a list. Each code implies its class; with featureClasses too, the two lists intersect, so featureClasses mus…
- `geonamesUsername` (string): Your own GeoNames username, so the call spends that account's free credits instead of the server's. Omit it to use the server's account. The account needs free web services enabled on its geonames.or…
- `limit` (integer): Maximum entries to return, 1 to 1,000. This tool returns at most 100 per call: a larger limit is held to 100, and the notice says so when more entries remain. Default 10.
- `match` (string): How query is matched. name_required (the default) needs at least one query term in the place name while other terms may match the country or admin names; any_field lets every term match any of those…
- `offset` (integer): Entries to skip before the first one returned, for paging, 0 to 5000. Default 0.
- `orderBy` (string): Result order: relevance or population, largest first. Omit it for GeoNames' own order, which matches relevance except with match name_prefix.
- `query` (string): Place name to search for, such as Springfield or "Berlin, Germany", up to 200 characters. match sets how it is compared. Omit it to search by filters alone, which then needs at least one of countries…

Output parameters:

- `cap` (number): The limit applied: limit as given, or 100 when it asked for more.
- `effectiveQuery` (string): The match mode, query, and filters as the server sent them to GeoNames.
- `error` (object): Present when the call failed. Absent on success.
- `nextOffset` (number): Offset of the next page; absent on the last page and once offset is 5000. Capped at 5000, the last offset GeoNames' free service accepts, so that page can repeat rows of this one.
- `notice` (string): Guidance: why nothing matched, or how to reach the next page (naming a limit held to 100), and which places on the page lie in countries that countries does not list.
- `places` (array): Places on this page, in the requested order.
- `shown` (number): Places returned on this page.
- `totalCount` (number): GeoNames' count of matching places, before paging.
- `truncated` (boolean): True when more matching places remain past this page.

### `geonames_get_place` (~345 tokens)

Get a GeoNames place

Fetch the full GeoNames record for one geonameId: coordinates, feature type, the admin chain with each level's code, name, and geonameId, timezone, bounding box, recorded and DEM elevation, population, Wikipedia URL, names in other languages, postal codes, and external identifiers (IATA, ICAO, UN/LOCODE, Wikidata). Take the geonameId from geonames_search_places, geonames_reverse_geocode, geonames_get_children, or geonames_get_countries. An unknown id returns found: false. Costs 1 GeoNames credit; repeat lookups are cached.

Input parameters:

- `geonameId` (string, required): GeoNames feature id as a digit string up to 2147483647, such as "5809844" (Seattle): the geonameId the other geonames tools return, sent as a string.
- `geonamesUsername` (string): Your own GeoNames username, so the call spends that account's free credits instead of the server's. Omit it to use the server's account. The account needs free web services enabled on its geonames.or…
- `nameLanguages` (array): Keep only alternate names in these languages, up to 20, as a list. A tag also matches its regional forms: zh keeps names GeoNames tags zh, zh-CN, or zh-TW. Omit to return every alternate name, includ…

Output parameters:

- `error` (object): Present when the call failed. Absent on success.
- `found` (boolean): False when GeoNames has no feature with this geonameId.
- `guidance` (string): What to do next; present only when found is false.
- `notice` (string): Present when the record has no country but carries a timezone: says the zone is the one GeoNames associates with the record, and how to get the time at a point.
- `place` (object): The full record; absent when found is false.

### `geonames_get_hierarchy` (~208 tokens)

Get a GeoNames hierarchy

Return the parent chain of a GeoNames feature, ordered from Earth and its continent through the country and admin divisions down to the feature itself, each with its geonameId, feature code, and coordinates. Use it to find which country, state, and county contain a place, or to fill an admin path for a geonameId. An unknown id returns found: false. Costs 1 GeoNames credit; cached.

Input parameters:

- `geonameId` (string, required): GeoNames feature id as a digit string up to 2147483647, such as "5809844" (Seattle): the geonameId the other geonames tools return, sent as a string.
- `geonamesUsername` (string): Your own GeoNames username, so the call spends that account's free credits instead of the server's. Omit it to use the server's account. The account needs free web services enabled on its geonames.or…

Output parameters:

- `chain` (array): Administrative ancestors, Earth first and the requested feature last; empty when found is false. Levels a feature does not sit under are skipped.
- `error` (object): Present when the call failed. Absent on success.
- `found` (boolean): False when GeoNames has no feature with this geonameId.
- `geonameId` (number): The geonameId that was requested.
- `guidance` (string): What to do next; present only when found is false.

### `geonames_get_children` (~621 tokens)

List GeoNames children

List the direct children of a GeoNames feature — Earth's continents, a continent's countries, a country's first-level divisions, a state's counties, a city's sections — in the administrative tree, or in the tourism tree (islands, coasts, and their municipalities; almost all in Spain) or the dependency tree (a country's dependent territories). Start from a country's geonameId (geonames_get_countries) or any admin division's. Children are mostly admin divisions (class A) and populated places (class P); continents and coasts are class L and islands class T. For other feature types inside a country or admin division, use geonames_search_places with its country in countries and its admin codes (adminLevels of geonames_get_place), which match exactly; a boundingBox also takes in neighboring areas, so keep it for a place that is not a division. GeoNames answers a tourism or dependency request with the administrative children when the feature has no such tree, so the tool compares the two lists and sets sameAsAdministrative when they match, keeping the rows (a real tree can match too). The full child list is fetched once (1 GeoNames credit) and cached, so paging and nameContains filtering are free; a tourism or dependency call also reads the administrative list for the comparison, 1 more credit unless it is cached.

Input parameters:

- `geonameId` (string, required): GeoNames id of the parent feature as a digit string up to 2147483647, such as "6252001" (United States): the geonameId the other geonames tools return, sent as a string.
- `geonamesUsername` (string): Your own GeoNames username, so the call spends that account's free credits instead of the server's. Omit it to use the server's account. The account needs free web services enabled on its geonames.or…
- `hierarchy` (string): Which tree to descend: administrative (the default: continents (class L), countries, admin divisions, populated places), tourism (islands (class T), coasts (class L), and their municipalities; almost…
- `limit` (integer): Maximum entries to return, 1 to 1,000. This tool returns at most 500 per call: a larger limit is held to 500, and the notice says so when more entries remain. Default 100.
- `nameContains` (string): Keep only children whose name or toponym name contains every word of this text as a substring (kansas also matches Arkansas), ignoring case, accents, and punctuation. Give at least one letter or digi…
- `offset` (integer): Entries to skip before the first one returned, for paging. Default 0.

Output parameters:

- `cap` (number): The limit applied: limit as given, or 500 when it asked for more.
- `children` (array): Children on this page, in GeoNames' order; empty when found is false or the feature has none.
- `error` (object): Present when the call failed. Absent on success.
- `found` (boolean): False when GeoNames has no feature with this geonameId.
- `guidance` (string): What to do next; present only when found is false.
- `hierarchy` (string): The tree that was descended.
- `nextOffset` (number): Offset of the next page; absent on the last page.
- `notice` (string): Guidance when a tourism or dependency answer is the administrative children, there are no children, nothing matched, the offset is past the end, more pages remain (naming a limit held to 500), or Geo…
- `parentGeonameId` (number): The geonameId whose children were requested.
- `sameAsAdministrative` (boolean): Tourism and dependency trees only, when the feature has children there: true when they are exactly its administrative children (same geonameIds and total). GeoNames answers with the administrative ch…
- `shown` (number): Children returned on this page.
- `totalCount` (number): Children matching nameContains, before paging.
- `truncated` (boolean): True when more children remain past this page.

### `geonames_reverse_geocode` (~834 tokens)

Reverse geocode with GeoNames

Resolve a latitude/longitude to the country and admin subdivisions that contain it (down to ADM5, each with its geonameId and ISO 3166-2 code where one exists), or the ocean or sea when the point is offshore, plus the nearest populated places with distances; these include neighborhood sections (PPLX) and historical places (PPLH), marked by featureCode. Set featureClasses or featureCodes to list the nearest features of that type instead (peaks, lakes, airports), cities to keep only places above a population tier, and includeTimezone for the IANA timezone with local time, sunrise, and sunset (offshore points get only GeoNames' UTC-offset estimate). A harbor, pier, or shoreline point can fall just outside every country outline and resolve to the sea; coastalBufferKm (up to 50) matches the nearest country within that distance instead. Costs 1 GeoNames credit for containment, with or without the buffer, plus 3 for nearest populated places or 4 for nearest features (nearbyLimit 0 skips them), 1 for the ocean when no country contains the point or lies within the buffer, and 1 for the timezone.

Input parameters:

- `cities` (string): Keep only nearby populated places with a population of at least 1,000 (cities1000), 5,000 (cities5000), or 15,000 (cities15000), plus seats of admin divisions: GeoNames' cities tiers. A city's sectio…
- `coastalBufferKm` (number): When no country contains the point, match the nearest country within this many kilometres, 0 to 50. Default 0: exact containment only. Set it for a harbor, pier, or shoreline point, which can fall ju…
- `featureClasses` (array): List the nearest features of these GeoNames classes instead of populated places: A admin divisions, H water, L areas, P populated places, R roads, S spots and buildings, T terrain, U undersea, V vege…
- `featureCodes` (array): List the nearest features with these GeoNames codes instead of populated places (MT mountain, PK peak, LK lake, AIRP airport), up to 20, as a list. Each code implies its class; with featureClasses to…
- `geonamesUsername` (string): Your own GeoNames username, so the call spends that account's free credits instead of the server's. Omit it to use the server's account. The account needs free web services enabled on its geonames.or…
- `includeTimezone` (boolean): Also return the timezone: IANA id, UTC offsets, local time, sunrise, and sunset (1 more credit). Default false.
- `lat` (number, required): Latitude in decimal degrees, -90 to 90.
- `lng` (number, required): Longitude in decimal degrees, -180 to 180.
- `nearbyLimit` (integer): How many nearest places or features to list, 0 to 1,000. This tool returns at most 50 per call: a larger nearbyLimit is held to 50, and the notice says so when more lie within the radius. Default 5.…
- `radiusKm` (number): Radius in kilometres for the nearby lookup, above 0 and at most 300 (GeoNames' free-tier limit). Default 20.

Output parameters:

- `adminLevels` (array): Admin divisions containing the point, first level first; for a country matched within coastalBufferKm, the divisions of its part nearest the point. Empty offshore, and where GeoNames records no subdi…
- `cap` (number): The nearbyLimit applied: nearbyLimit as given, or 50 when it asked for more.
- `country` (object): The country containing the point, or with coastalBufferKm the nearest country within that distance (then distanceInKm is set); absent offshore and in unmapped areas.
- `error` (object): Present when the call failed. Absent on success.
- `lat` (number): The latitude that was looked up.
- `lng` (number): The longitude that was looked up.
- `nearby` (array): Nearest places or features, nearest first; empty when nearbyKind is none.
- `nearbyKind` (string): What nearby lists: populated_places, features (featureClasses or featureCodes was set), or none (nearbyLimit 0).
- `notice` (string): Guidance when the point is offshore or unmapped, its country was matched within coastalBufferKm, nothing is nearby, more lie within the radius than nearby holds (naming a nearbyLimit held to 50, and…
- `ocean` (object): The ocean or sea at the point; present only when no country contains it or lies within coastalBufferKm.
- `shown` (number): Nearby places or features returned.
- `timezone` (object): The timezone at the point; present only with includeTimezone.
- `truncated` (boolean): True when more places or features lie within the radius than nearby holds.

### `geonames_find_postal_codes` (~724 tokens)

Find GeoNames postal codes

Look up postal codes in the GeoNames postal database (122 countries): mode code resolves a postal code to its place, admin names, and centroid; mode place_name finds postal codes for a place name; both page with offset, up to 5000; mode nearby lists postal codes within radiusKm (up to 30 km) of a coordinate, nearest first. Ireland returns only Eircode routing keys and Malta only the letter prefix; the United Kingdom (GB), Canada, and the Netherlands hold both full codes and their outward or district prefixes. Check coverage with geonames_list_reference topic postal_countries. Costs 1 GeoNames credit (2 for nearby); a code or place_name lookup with countries that returns nothing at offset 0 also reads the postal coverage list, 1 more credit unless that list is cached. Repeat lookups are cached.

Input parameters:

- `countries` (array): Countries to look up postal codes in: ISO 3166-1 codes, up to 10, as a list: alpha-2 (US, GB, DE), alpha-3 (USA, GBR, DEU), or three-digit numeric (840, 826, 276), each sent to GeoNames as alpha-2. U…
- `geonamesUsername` (string): Your own GeoNames username, so the call spends that account's free credits instead of the server's. Omit it to use the server's account. The account needs free web services enabled on its geonames.or…
- `lat` (number): Latitude in decimal degrees, -90 to 90. Required in mode nearby.
- `limit` (integer): Maximum entries to return, 1 to 1,000. This tool returns at most 100 per call: a larger limit is held to 100, and the notice says so when more entries remain. Default 10.
- `lng` (number): Longitude in decimal degrees, -180 to 180. Required in mode nearby.
- `mode` (string, required): What to look up. code: the place for postalCode (required). place_name: the postal codes of placeName (required). nearby: postal codes around lat and lng (both required; countries not accepted).
- `offset` (integer): Postal codes to skip before the first one returned, 0 to 5000. Default 0. Modes code and place_name only; pass the nextOffset of the previous page to read the next one.
- `placeName` (string): Place name to find postal codes for, up to 100 characters. GeoNames matches it against place, admin, and country names. Required in mode place_name; in mode code it narrows the match; not used in mod…
- `postalCode` (string): Postal code to resolve, such as 98101, SW1A 1AA, or K1A 0A1: capital letters, digits, spaces, and hyphens, up to 12 characters. Required in mode code; in mode place_name it narrows the match; not use…
- `radiusKm` (number): Search radius in kilometres for mode nearby, above 0 and at most 30 (GeoNames' free-tier limit). Default 10.

Output parameters:

- `cap` (number): The limit applied: limit as given, or 100 when it asked for more.
- `error` (object): Present when the call failed. Absent on success.
- `mode` (string): The lookup mode that ran.
- `nextOffset` (number): Offset of the next page in modes code and place_name; absent on the last page, in mode nearby, and once offset is 5000. Capped at 5000, the last offset GeoNames' free service accepts, so that page ca…
- `notice` (string): Guidance: why nothing matched or nothing lies at offset, or how to reach the postal codes past this page (naming a limit held to 100), and which postal codes on the page lie in countries that countri…
- `postalCodes` (array): Matching postal codes on this page; nearest first in mode nearby.
- `shown` (number): Postal codes returned on this page.
- `truncated` (boolean): True when more postal codes remain past this page; in mode nearby, more lie within radiusKm.

### `geonames_get_countries` (~396 tokens)

GeoNames country facts

Get GeoNames country facts — ISO alpha-2, alpha-3, and numeric codes, FIPS code, geonameId, capital, population, area in km², continent, languages, currency, postal-code format, and mainland bounding box — for the countries named, a continent, or all 250. The geonameId anchors geonames_get_children (a country's first-level divisions) and geonames_get_hierarchy. The full table is fetched once a day (1 GeoNames credit) and cached.

Input parameters:

- `continent` (string): Keep only countries on this continent: AF Africa, AN Antarctica, AS Asia, EU Europe, NA North America, OC Oceania, SA South America.
- `countries` (array): Countries to return by ISO 3166-1 code: alpha-2 (US), alpha-3 (USA), or three-digit numeric (840), up to 250, as a list. UK is accepted for GB and FL for LI. Match country names with nameContains ins…
- `geonamesUsername` (string): Your own GeoNames username, spent only when the country table is not already cached, so the call uses that account's credit instead of the server's. The account needs free web services enabled on its…
- `limit` (integer): Maximum entries to return, 1 to 1,000. This tool returns at most 250 per call: a larger limit is held to 250, and the notice says so when more entries remain. Default 50.
- `nameContains` (string): Keep only countries whose English name contains every word of this text as a substring (niger also matches Nigeria), ignoring case, accents, and punctuation. Give at least one letter or digit.
- `offset` (integer): Entries to skip before the first one returned, for paging. Default 0.

Output parameters:

- `cap` (number): The limit applied: limit as given, or 250 when it asked for more.
- `countries` (array): Countries on this page, in GeoNames order (by alpha-2 code).
- `error` (object): Present when the call failed. Absent on success.
- `nextOffset` (number): Offset of the next page; absent on the last page.
- `notFound` (array): Requested codes that match no GeoNames country; empty when every code matched.
- `notice` (string): Guidance when nothing matched, the offset is past the end, or more pages remain (naming a limit held to 250).
- `shown` (number): Countries returned on this page.
- `totalCount` (number): Countries matching the filters, before paging.
- `truncated` (boolean): True when more countries remain past this page.

### `geonames_list_reference` (~361 tokens)

GeoNames reference vocabulary

Decode GeoNames vocabulary used by the other tools: topic feature_classes lists the 9 one-letter classes; topic feature_codes lists the 684 feature codes with names and definitions, filterable by class and text; topic postal_countries lists the 122 countries with postal-code data and each one's code range and count. feature_classes and feature_codes are bundled and spend no credits; postal_countries costs 1 GeoNames credit a day (cached).

Input parameters:

- `featureClass` (string): Topic feature_codes only: keep the codes of this one-letter class (A, H, L, P, R, S, T, U, V).
- `geonamesUsername` (string): Topic postal_countries only, and only when the list is not already cached: your own GeoNames username, so the call spends that account's credit instead of the server's. The account needs free web ser…
- `limit` (integer): Maximum entries to return, 1 to 1,000. This tool returns at most 700 per call: a larger limit is held to 700, and the notice says so when more entries remain. Default 100.
- `nameContains` (string): Keep only entries whose code, name, or description contains every word of this text as a substring (port also matches airport), ignoring case, accents, and punctuation. Give at least one letter or di…
- `offset` (integer): Entries to skip before the first one returned, for paging. Default 0.
- `topic` (string, required): Vocabulary to list: feature_classes (the 9 one-letter classes), feature_codes (the 684 codes), or postal_countries (countries with postal-code data).

Output parameters:

- `cap` (number): The limit applied: limit as given, or 700 when it asked for more.
- `entries` (array): Entries on this page, in GeoNames order.
- `error` (object): Present when the call failed. Absent on success.
- `nextOffset` (number): Offset of the next page; absent on the last page.
- `notice` (string): Guidance when nothing matched, the offset is past the end, or more pages remain (naming a limit held to 700).
- `shown` (number): Entries returned on this page.
- `topic` (string): The topic listed.
- `totalCount` (number): Entries matching the topic and filters, before paging.
- `truncated` (boolean): True when more entries remain past this page.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-geonames-mcp-server/geonames#diagnostics

## Score history

- 2026-11-05: 88
- 2026-11-04: 88
- 2026-11-03: 88
- 2026-11-02: 88
- 2026-11-01: 88
- 2026-10-31: 88
- 2026-10-30: 87
- 2026-10-29: 87
- 2026-10-28: 84
- 2026-10-27: 83
- 2026-10-26: 83
- 2026-10-25: 82
- 2026-10-24: 82
- 2026-10-23: 81
- 2026-10-22: 81
- 2026-10-21: 80
- 2026-10-20: 80
- 2026-10-19: 80
- 2026-10-18: 79
- 2026-10-17: 79
- 2026-10-16: 79
- 2026-10-15: 78
- 2026-10-14: 78
- 2026-10-13: 78
- 2026-10-12: 77
- 2026-10-10: 76
- 2026-10-09: 76
- 2026-10-04: 73
- 2026-10-03: 73
- 2026-10-02: 72

## Common questions

### What is the geonames-mcp-server server?

geonames-mcp-server is listed in the public MCP registry as io.github.cyanheads/geonames-mcp-server. Search GeoNames places, walk admin hierarchies, reverse geocode, get postal codes and country info. This page covers its hosted endpoint (https://geonames.caseyjhand.com/mcp).

### Is the geonames-mcp-server server safe to use?

geonames-mcp-server scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the geonames-mcp-server server expose?

geonames-mcp-server exposes 8 tools: geonames_search_places, geonames_get_place, geonames_get_hierarchy, geonames_get_children, geonames_reverse_geocode, and 3 more. Their descriptions and schemas cost roughly 4,766 tokens of context every time the server is loaded.

### Does the geonames-mcp-server server require authentication?

No. We connected to geonames-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the geonames-mcp-server server still maintained?

geonames-mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://geonames.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/geonames-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-geonames-mcp-server/geonames.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-geonames-mcp-server/geonames.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-geonames-mcp-server/geonames
