Location and Timezone MCP Server by RoxyAPI
Server Details
City geocoding and timezone resolution for birth data, for AI agents, one API key.
- Status
- Healthy
- Uptime
- 100.0% over 43 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: one lists countries, one lists cities for a specific country, and one resolves arbitrary place names. There is no ambiguity between them; the descriptions are detailed and outline exactly when to use each.
All tools share the 'get_location_' prefix, but the verb-noun pattern is slightly inconsistent: 'get_location_countries' is fine, while 'get_location_countries_iso2' is a bit awkward (countries for a country?), and 'get_location_search' uses a verb at the end. However, the shared prefix and clear intent keep it readable.
With only 3 tools, the set is minimal but covers the core needs of location lookup: country listing, city listing per country, and free-text search. It feels slightly thin for a server that supports 240+ countries, but each tool is substantial and well-scoped.
The three tools cover the primary workflows of browsing countries, browsing cities, and searching. However, missing operations like getting a single country by code or a single city by ID, or reverse geocoding (coordinates to place), are notable gaps that could be useful for certain astrology applications.
Available Tools
3 toolsget_location_countriesList all countries - ISO codes and city coverageARead-onlyInspect
Returns every country with ISO 3166-1 alpha-2 and alpha-3 codes, plus the number of searchable cities per country. Use this endpoint to build country dropdown menus, regional filters, or to check city coverage before querying a birth location. Countries are sorted alphabetically by name. Covers Europe, Americas, Asia, Middle East, Africa, and Oceania.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum items to return per page. Range: 1-250, default 50. | |
| offset | No | Number of items to skip for pagination. Default 0. | |
| compact | No | Set true for the same data in a compact shape: arrays of same-shaped objects arrive columnar as {"__cols":[names],"__rows":[[values]]}. Lossless, typically 40 to 52 percent fewer tokens. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| offset | Yes | |
| countries | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only safety profile is covered. The description usefully adds that results are sorted alphabetically, the geographic scope, and the city-count field. However, the claim 'Returns every country' is not tempered by the pagination parameters (limit/offset default 50), leaving how the full list is retrieved unclear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences front-load the purpose, state concrete use cases, and add sorting and coverage without filler. Every sentence contributes information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, annotations, and a 100%-described parameter schema, the description does not need to restate return fields. It covers purpose, use cases, and ordering; a minor gap is not signaling how pagination interacts with the 'every country' claim.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: limit, offset, and compact each have clear descriptions. The tool description adds no parameter-level semantics beyond implying whole-list retrieval, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb and resource: 'Returns every country with ISO 3166-1 alpha-2 and alpha-3 codes, plus the number of searchable cities per country.' This clearly identifies the output. It does not explicitly name or contrast the sibling endpoints (get_location_countries_iso2, get_location_search), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Positive use cases are explicit: 'build country dropdown menus, regional filters, or to check city coverage before querying a birth location.' No when-not-to-use or alternative routing to siblings is provided, so it lacks the exclusionary guidance required for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_location_countries_iso2Get cities in a country - Geocoding directory sorted by populationARead-onlyInspect
Returns all cities for a specific country, identified by ISO 3166-1 alpha-2 code (e.g. DE for Germany, FR for France, GB for United Kingdom, US for United States). Each city includes geographic coordinates, IANA timezone, and DST-aware UTC offset for direct use in astrology birth chart, horoscope, transit, and panchang calculations. Cities sorted by population with the largest metropolitan areas first.
| Name | Required | Description | Default |
|---|---|---|---|
| iso2 | Yes | ISO 3166-1 alpha-2 country code, case-insensitive. Common codes: DE (Germany), FR (France), GB (United Kingdom), US (United States), ES (Spain), IT (Italy), NL (Netherlands), IN (India), BR (Brazil), JP (Japan). | |
| limit | No | Maximum items to return per page. Range: 1-100, default 20. | |
| offset | No | Number of items to skip for pagination. Default 0. | |
| compact | No | Set true for the same data in a compact shape: arrays of same-shaped objects arrive columnar as {"__cols":[names],"__rows":[[values]]}. Lossless, typically 40 to 52 percent fewer tokens. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| cities | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and destructiveHint=false already in annotations, the description adds valuable context: it details the data included (coordinates, timezone, offsets) and the population-based sorting. This goes beyond the safety annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and includes practical examples and context. The mention of specific use cases (astrology, horoscope) is slightly extraneous but does not bloat the content significantly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover safety, the description is complete enough: it explains what the data is, how it is sorted, and why it might be used. Pagination details are left to the schema, which is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents iso2, limit, offset, and compact. The description adds no parameter-specific meaning beyond what the schema already provides, which meets the baseline for high-coverage schemas but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Returns all cities') and resource ('for a specific country, identified by ISO 3166-1 alpha-2 code'), which distinguishes it from sibling tools like get_location_countries (presumably country list) and get_location_search (general search). The inclusion of example codes further disambiguates the exact input.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies the context (cities by country for astrology calculations) and the sorting behavior, which implies when to use it. However, it does not explicitly mention alternative tools or exclusion conditions, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_location_searchSearch cities worldwide - Geocoding autocomplete with coordinates and timezoneARead-onlyInspect
Turn a place name into coordinates, an IANA timezone and a DST-aware UTC offset, across 235,000+ cities and towns in 240+ countries. Coverage reaches rural towns of a few hundred people and every administrative seat, so a birthplace outside a major metro resolves as reliably as a capital. Matching is case-insensitive, accent-insensitive and partial, so ber matches Berlin, Bern and Bergen, native scripts are transliterated, and historic names resolve to the current place, so bombay returns Mumbai and peking returns Beijing. Results are ordered by match quality first and population second, so an exactly named small town is never buried under a larger city that merely shares its opening letters. Built for birth chart location pickers, horoscope apps, event scheduling, and any feature that needs place-to-coordinates resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Place to search for, written the way a person would. Accepts a bare city (berlin), a city plus country (berlin germany), a comma-qualified place (richfield, utah), a fully qualified place (richfield, utah, united states), or a historic name (bombay, peking, constantinople). Commas are optional, and a qualifier the dataset spells differently, such as USA for United States, still resolves. Matched against city name, alternate names, state or province, and country. Add the state or country whenever the name is common, since that is what separates the six Springfields, and Richfield, Utah from Richfield, Minnesota. | |
| limit | No | Maximum items to return per page. Range: 1-50, default 10. | |
| offset | No | Number of items to skip for pagination. Default 0. | |
| compact | No | Set true for the same data in a compact shape: arrays of same-shaped objects arrive columnar as {"__cols":[names],"__rows":[[values]]}. Lossless, typically 40 to 52 percent fewer tokens. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| cities | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a safe read-only operation, and the description adds substantial behavioral detail: case-insensitive and accent-insensitive matching, partial matching, transliteration, historic name resolution, and ordering by match quality then population. These details meaningfully go beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and each sentence earns its place: coverage, matching behavior, result ordering, and use cases. Despite being detailed, it remains focused and avoids unnecessary repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return shapes. The annotations cover safety, the schema covers all parameters, and the description adds matching rules, coverage scope, and typical use cases, making the tool adequately specified for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters. The description adds value for the q parameter by explaining matching semantics, partial matches, historic names, and ordering behavior, which enriches an agent's understanding beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: turning a place name into coordinates, timezone, and UTC offset across cities worldwide. It clearly conveys a geocoding search tool, but it does not explicitly name or contrast the sibling country-list tools, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: birth chart location pickers, horoscope apps, event scheduling, and any place-to-coordinates resolution feature. It does not mention when not to use it or name alternative tools, but the use cases are specific enough to guide an agent.
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.
3 tool updates
- Changed
get_location_countries2 fields changed- added
Input schema / properties / offset / defaultAdded value: +0 - added
Input schema / properties / offset / minimumAdded value: +0
- Changed
get_location_countries_iso22 fields changed- added
Input schema / properties / offset / defaultAdded value: +0 - added
Input schema / properties / offset / minimumAdded value: +0
- Changed
get_location_search2 fields changed- added
Input schema / properties / offset / defaultAdded value: +0 - added
Input schema / properties / offset / minimumAdded value: +0
3 tool updates
- Changed
get_location_countries3 fields changed- removed
Input schema / properties / offset / defaultRemoved value: -0 - removed
Input schema / properties / offset / minimumRemoved value: -0 - changed
Input schema / properties / offset / typePrevious value: -[ - "integer", - "null" -]New value: +"integer"
- Changed
get_location_countries_iso23 fields changed- removed
Input schema / properties / offset / defaultRemoved value: -0 - removed
Input schema / properties / offset / minimumRemoved value: -0 - changed
Input schema / properties / offset / typePrevious value: -[ - "integer", - "null" -]New value: +"integer"
- Changed
get_location_search3 fields changed- removed
Input schema / properties / offset / defaultRemoved value: -0 - removed
Input schema / properties / offset / minimumRemoved value: -0 - changed
Input schema / properties / offset / typePrevious value: -[ - "integer", - "null" -]New value: +"integer"
3 tool updates
- Changed
get_location_countries1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "countries": { + "items": { + "properties": { + "cityCount": { + "type": "number" + }, + "iso2": { + "type": "string" + }, + "iso3": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "iso2", + "iso3", + "cityCount" + ], + "type": "object" + }, + "type": "array" + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "limit", + "offset", + "countries" + ], + "type": "object" +}
- Changed
get_location_countries_iso21 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "cities": { + "items": { + "properties": { + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "iso2": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "longitude": { + "type": "number" + }, + "population": { + "type": "number" + }, + "province": { + "type": "string" + }, + "timezone": { + "type": "string" + }, + "utcOffset": { + "type": "number" + } + }, + "required": [ + "city", + "province", + "country", + "iso2", + "latitude", + "longitude", + "timezone", + "utcOffset", + "population" + ], + "type": "object" + }, + "type": "array" + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "limit", + "offset", + "cities" + ], + "type": "object" +}
- Changed
get_location_search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "cities": { + "items": { + "properties": { + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "iso2": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "longitude": { + "type": "number" + }, + "population": { + "type": "number" + }, + "province": { + "type": "string" + }, + "timezone": { + "type": "string" + }, + "utcOffset": { + "type": "number" + } + }, + "required": [ + "city", + "province", + "country", + "iso2", + "latitude", + "longitude", + "timezone", + "utcOffset", + "population" + ], + "type": "object" + }, + "type": "array" + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "limit", + "offset", + "cities" + ], + "type": "object" +}
3 tool updates
- Changed
get_location_countries2 fields changed- added
Input schema / examplesAdded value: +[ + {} +] - changed
Input schema / properties / compact / descriptionPrevious value: -"Set true to receive the exact same data in a token-optimized shape that is cheaper for you to read: whitespace is stripped and every array of same-shaped objects is encoded columnar as {\"__cols\":[field names],\"__rows\":[[values]]}, so each field name is sent once instead of once per row. Fully lossless (no field or value is dropped or changed) and typically 40 to 52 percent fewer tokens on large results. Prefer true whenever token or inference cost matters. Default false returns standard indented JSON."New value: +"Set true for the same data in a compact shape: arrays of same-shaped objects arrive columnar as {\"__cols\":[names],\"__rows\":[[values]]}. Lossless, typically 40 to 52 percent fewer tokens."
- Changed
get_location_countries_iso22 fields changed- added
Input schema / examplesAdded value: +[ + { + "iso2": "DE" + } +] - changed
Input schema / properties / compact / descriptionPrevious value: -"Set true to receive the exact same data in a token-optimized shape that is cheaper for you to read: whitespace is stripped and every array of same-shaped objects is encoded columnar as {\"__cols\":[field names],\"__rows\":[[values]]}, so each field name is sent once instead of once per row. Fully lossless (no field or value is dropped or changed) and typically 40 to 52 percent fewer tokens on large results. Prefer true whenever token or inference cost matters. Default false returns standard indented JSON."New value: +"Set true for the same data in a compact shape: arrays of same-shaped objects arrive columnar as {\"__cols\":[names],\"__rows\":[[values]]}. Lossless, typically 40 to 52 percent fewer tokens."
- Changed
get_location_search2 fields changed- added
Input schema / examplesAdded value: +[ + { + "q": "berlin" + } +] - changed
Input schema / properties / compact / descriptionPrevious value: -"Set true to receive the exact same data in a token-optimized shape that is cheaper for you to read: whitespace is stripped and every array of same-shaped objects is encoded columnar as {\"__cols\":[field names],\"__rows\":[[values]]}, so each field name is sent once instead of once per row. Fully lossless (no field or value is dropped or changed) and typically 40 to 52 percent fewer tokens on large results. Prefer true whenever token or inference cost matters. Default false returns standard indented JSON."New value: +"Set true for the same data in a compact shape: arrays of same-shaped objects arrive columnar as {\"__cols\":[names],\"__rows\":[[values]]}. Lossless, typically 40 to 52 percent fewer tokens."
1 tool update
- Changed
get_location_search1 field changed- changed
Input schema / properties / q / descriptionPrevious value: -"City name to search for. Accepts bare city (\"berlin\"), city plus country (\"berlin germany\"), or comma-qualified (\"berlin, germany\", \"springfield, illinois\") for disambiguation. Matches against city name, province/state, or combined \"city country\" queries. Case-insensitive with partial matching (e.g. \"ber\" matches Berlin, Bern, Bergen)."New value: +"Place to search for, written the way a person would. Accepts a bare city (berlin), a city plus country (berlin germany), a comma-qualified place (richfield, utah), a fully qualified place (richfield, utah, united states), or a historic name (bombay, peking, constantinople). Commas are optional, and a qualifier the dataset spells differently, such as USA for United States, still resolves. Matched against city name, alternate names, state or province, and country. Add the state or country whenever the name is common, since that is what separates the six Springfields, and Richfield, Utah from Richfield, Minnesota."
3 tool updates
- Changed
get_location_countries1 field changed- changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
- Changed
get_location_countries_iso21 field changed- changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
- Changed
get_location_search1 field changed- changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
3 tool updates
- Changed
get_location_countries1 field changed- changed
Input schema / properties / compact / descriptionPrevious value: -"Return the same data in a token-optimized compact shape (minified, with same-shaped arrays encoded columnar) to reduce LLM token cost. Lossless: no fields are dropped. Default false."New value: +"Set true to receive the exact same data in a token-optimized shape that is cheaper for you to read: whitespace is stripped and every array of same-shaped objects is encoded columnar as {\"__cols\":[field names],\"__rows\":[[values]]}, so each field name is sent once instead of once per row. Fully lossless (no field or value is dropped or changed) and typically 40 to 52 percent fewer tokens on large results. Prefer true whenever token or inference cost matters. Default false returns standard indented JSON."
- Changed
get_location_countries_iso21 field changed- changed
Input schema / properties / compact / descriptionPrevious value: -"Return the same data in a token-optimized compact shape (minified, with same-shaped arrays encoded columnar) to reduce LLM token cost. Lossless: no fields are dropped. Default false."New value: +"Set true to receive the exact same data in a token-optimized shape that is cheaper for you to read: whitespace is stripped and every array of same-shaped objects is encoded columnar as {\"__cols\":[field names],\"__rows\":[[values]]}, so each field name is sent once instead of once per row. Fully lossless (no field or value is dropped or changed) and typically 40 to 52 percent fewer tokens on large results. Prefer true whenever token or inference cost matters. Default false returns standard indented JSON."
- Changed
get_location_search1 field changed- changed
Input schema / properties / compact / descriptionPrevious value: -"Return the same data in a token-optimized compact shape (minified, with same-shaped arrays encoded columnar) to reduce LLM token cost. Lossless: no fields are dropped. Default false."New value: +"Set true to receive the exact same data in a token-optimized shape that is cheaper for you to read: whitespace is stripped and every array of same-shaped objects is encoded columnar as {\"__cols\":[field names],\"__rows\":[[values]]}, so each field name is sent once instead of once per row. Fully lossless (no field or value is dropped or changed) and typically 40 to 52 percent fewer tokens on large results. Prefer true whenever token or inference cost matters. Default false returns standard indented JSON."
3 tool updates
- Changed
get_location_countries1 field changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "description": "Return the same data in a token-optimized compact shape (minified, with same-shaped arrays encoded columnar) to reduce LLM token cost. Lossless: no fields are dropped. Default false.", + "type": "boolean" +}
- Changed
get_location_countries_iso21 field changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "description": "Return the same data in a token-optimized compact shape (minified, with same-shaped arrays encoded columnar) to reduce LLM token cost. Lossless: no fields are dropped. Default false.", + "type": "boolean" +}
- Changed
get_location_search1 field changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "description": "Return the same data in a token-optimized compact shape (minified, with same-shaped arrays encoded columnar) to reduce LLM token cost. Lossless: no fields are dropped. Default false.", + "type": "boolean" +}
3 tool updates
- First observed
get_location_countries - First observed
get_location_countries_iso2 - First observed
get_location_search
Related MCP Connectors
Swiss Ephemeris for AI agents: exact natal charts, transits, synastry and birth-place resolution
Vedic kundli, panchang, dashas, nakshatras and KP charts for AI agents, one API key.
Western, Vedic, and Chinese astrology calculations, charts, forecasts, and geocoding.
Geocoding, weather forecasts, and timezone lookups
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI agents to compute deterministic astrological data with Swiss Ephemeris, including natal charts, transits, synastry, and birth-place resolution, so they never invent planetary positions.4614 npmMIT

fatenava-mcpofficial
AlicenseAqualityBmaintenanceEnables AI agents to cast deterministic BaZi, Zi Wei Dou Shu, and Western astrology natal charts from birth details, with no setup or API key.135 npmMIT- AlicenseAqualityDmaintenanceGeospatial 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.1819 npmMIT
- AlicenseNot gradedqualityBmaintenanceHigh-precision astrology tools for LLM agents, including natal charts, transits, progressions, synastry, and more, backed by Swiss Ephemeris.1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.