mcp-geoes
This server lets an AI agent discover, inspect, query, and visualize Spanish geological and cartographic data (IGME/IGN) through MCP tools, including composing multi-source maps with legends.
List services: enumerate available catalog services (ArcGIS) from a source.
Describe services and layers: get metadata such as layers, extents, CRS, formats, field schemas, and capabilities.
Query layer attributes: run SQL-style
wherefilters, select fields, order results, paginate withoffset, and optionally filter by bounding box, returning GeoJSON.Identify at a point: retrieve attributes at a given lon/lat for one or more layers.
Export a single-source map: render a source as an image for a bounding box.
Get legends: obtain structured or image-based legends for a source or layer.
Compose multi-source maps: align several sources into one map image with a combined legend, with options for title, size, and legend placement.
Provides access to Spanish geological data published by IGME through ArcGIS REST services, enabling queries for geological units, lithologies, faults, and other geology attributes.
Provides access to Spanish base mapping and orthophotos published by the Instituto Geográfico Nacional through OGC WMS and WMTS services, enabling map composition and imagery overlays.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-geoes¿Hay fallas cuaternarias cerca de este punto? Enséñame un mapa sobre la ortofoto."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
IGN-IGME-MCP
Ask an AI agent about Spanish geology and get an answer with a map.
This is an MCP server that puts the public cartography of Spain — the IGME's geology and the IGN's base mapping and orthophotos — behind a single set of tools an agent can use, and composes them into one image when a question needs both.
One question, two publishers, one answer:
"¿Hay fallas cuaternarias cerca de este punto? Enséñame un mapa sobre la ortofoto."
The faults come from the IGME over ArcGIS REST, the orthophoto from the IGN over OGC WMS, and they arrive as a single aligned image with a legend saying which is which.
Read-only, always. Every operation is a GET; there is no editing path anywhere in the codebase.
Why it exists
Spain publishes an enormous amount of high-quality geospatial data for free — and almost none of it is reachable from an AI assistant. Three problems stand in the way, and this project is the answer to each:
The data lives behind two incompatible protocol families. The IGME runs ArcGIS Server; the IGN publishes OGC WMS and WMTS. An agent should not have to know, so the tools are the same for both — and a source that cannot do something says so and names the alternative, instead of returning an empty result that reads like "there is nothing there".
Real questions cross publishers. "Are there active faults nearby, and what does the ground look like?" is one question and two organisations. Splitting it across two servers pushes the join into the agent, which is where scale confusion and misattribution creep in.
A map without provenance is a liability. A geological contact read from a 1:1,000,000 synthesis and one from a 1:50,000 sheet are not interchangeable, and an agent that cannot tell them apart will use the first to answer about a parcel. Every answer here carries its service, publisher and nominal scale.
New to WMS, WMTS or ArcGIS REST? → docs/theory.md
Related MCP server: QGIS MCP Server
What it can do
Find a place | turn "Suances" into a map envelope — a municipality's real boundary, not a guessed square |
Say what exists | enumerate every source, from both publishers, before assuming one |
Answer at a point | which geological unit, which lithology, which flight date — with the scale it was read at |
Query by attributes | SQL-style filtering with transparent paging, where the source supports it |
Draw maps | one source framed on a place, or several stacked and aligned to the pixel with a combined legend |
Describe itself | what each source publishes, what it can do, and what its fields mean |
Refuse usefully | when a source cannot answer, it says why and what can |
See it in use → docs/examples.md
Quick start
Requires Python ≥ 3.11 and uv.
git clone <this repository> && cd IGN-IGME-MCP
uv sync --all-extras
uv run pytest # the whole suite, offline
uv run mcp-geoes --list-profiles
uv run mcp-geoes --profile general --validateThen connect a client. The configuration files ship with the repository, with all five profiles already declared — open it and start the server you want:
Client | File |
VS Code | |
Claude Code | |
Claude Desktop |
Anything else that speaks MCP runs the same command:
uv run mcp-geoes --profile geologiaWiring, hosted transport and multi-profile caveats →
examples/mcp_clients.md
Then ask it "¿qué cartografía tienes de Suances?" or "¿qué unidad geológica hay ahí?".
Five profiles, one process each — the tool list an agent sees is what keeps its choices accurate. The split is by domain, never by publisher: real questions cross the IGME and the IGN in the same sentence.
Profile | For | Tools |
| "what do you have for this place?" — both publishers, short answer | 19 |
| the IGN as subject: orthophoto, MTN sheets, historical series, relief | 25 |
| the IGME's geology, with the IGN's cartography to read it against | 27 |
| active faults, seismicity, ground movements, neotectonics | 21 |
| hydrogeology and permeability over the IGN's hydrography | 21 |
Counts include the thirteen generic tools, which always register.
What each profile declares, which one to pick, and how to write another →
docs/profiles.md
Prefer to see it work before wiring up a client?
uv run python scripts/demo_tools.py --out working/ # the tools, live
uv run python scripts/demo_compose.py --out working/ # a composed map
uv run python scripts/demo_discovery.py --place Suances --out working/Full instructions, container and hosting → docs/deployment.md
How it fits together
AI agent ──MCP──▶ mcp_geoes ──▶ domain profile (YAML, Spanish)
│
├──▶ arcgis_client ──▶ IGME (ArcGIS REST)
├──▶ ogc_client ──▶ IGN (WMS · WMTS)
└──▶ map_compose ──▶ one image, one legendThree ideas carry the design:
Capabilities are declared, never assumed. Each source states what it can answer. Asking for anything else raises an error naming the alternative — never a plausible empty result.
Questions start from places, not coordinates. resolve_place turns a name
into an envelope, and every map tool takes place= instead of bbox=.
Composition happens in EPSG:3857. Layers from different publishers can only be stacked if all were rendered for the same envelope in the same projection. Tool signatures still speak lon/lat; the conversion is done for you.
Profiles add knowledge, never code. A YAML file names its sources across both publishers, their semantics, its closed vocabularies and its convenience tools. A new domain — hydrogeology, geological risk, mining — is a new file.
Why each of those, and what was rejected → docs/architecture.md
· Requirements and their tests → docs/specs.md
Documentation
Document | For |
the GIS concepts, if you are new to them, with pointers to the standards | |
what you must write when you publish — the IGN's and IGME's attribution terms | |
what a profile declares, the five shipped ones, and how to add one | |
what you can ask, what comes back, and what it refuses | |
the design decisions and why they were taken | |
numbered requirements, acceptance criteria, milestones | |
build, test, run, containerise, host, and keep it current | |
client configuration, copy-paste |
Each package also has its own README: geo_core,
geo_http, arcgis_client,
ogc_client, map_compose,
mcp_geoes.
Layout
IGN-IGME-MCP/
├── packages/
│ ├── geo_core/ # backend contract, model, geometry, logging
│ ├── geo_http/ # shared transport: retries, cache, timing
│ ├── arcgis_client/ # ArcGIS Server REST → IGME
│ ├── ogc_client/ # OGC WMS, WMTS and WFS → IGN, regional SDIs
│ ├── map_compose/ # composition engine and combined legend
│ └── mcp_geoes/ # the MCP server and the profile loader
├── profiles/ # domain profiles (YAML + prompt), in Spanish
├── docs/ # theory · profiles · examples · architecture · specs · deployment
├── scripts/ # demos, live validation, catalog audit
├── docker/ # container healthcheck
└── tests/Troubleshooting
Three log levels on one axis, because troubleshooting a chain of agent → server → two origins means asking three questions in order:
Level | Answers | Emits |
| what did the agent ask for, and did it work? | one line per tool call: tool, backend, duration, status |
| what did we ask the origins? | one line per upstream request: URL, status, bytes, cache, duration |
| what exactly went over the wire? | full URL, every parameter, truncated payload |
Every record carries a call_id that propagates from the tool call down to the
HTTP request, so one grep reconstructs a whole interaction. Pass the agent's
own trace id as trace_id and the two timelines join.
uv run mcp-geoes --profile geologia --log-level TRACE --log-format jsonLogs go to stderr: under the stdio transport, stdout carries the MCP protocol itself.
Language
The code, its comments and its documentation are in English, because layers
0–2 are reusable well beyond Spain. The domain profiles are in Spanish —
tool names, field semantics, prompts, vocabularies — because the data is Spanish
(UNIDAD, LITOLOGIA, "Triásico"), users ask in Spanish, and a translation step
between question, tool and data is exactly where models introduce mapping
errors.
Licence and attribution
The software is MIT.
The data is not. It belongs to the Instituto Geológico y Minero de España (IGME, CSIC) and the Instituto Geográfico Nacional (IGN), who publish it freely on the condition that you cite the source. That condition travels with the data: when you put one of these maps in a report, a site or a product, the obligation to attribute is yours.
This server gives you everything you need to meet it — publisher, nominal scale, edition date and the official product page ride along with every answer — but it cannot meet it for you, because it does not know where your result ends up.
The IGN requires the literal form PNOA 2023 CC-BY 4.0 scne.es, prefixed with
"Obra derivada de" if you modified anything — and composing counts. The IGME
requires Origen de los datos: © Instituto Geológico y Minero de España (IGME).
Read docs/licensing.md before you publish anything.
It has both formulas, what counts as a derived work, and a checklist.
This project is not affiliated with, endorsed by, or maintained by either institute.
Available Tools
8 toolscompose_mapA
Compose one map from several sources, aligned, with a combined legend. Name a composition the profile declares, or list sources bottom-first. legend_mode is panel, below, separate or none — use 'separate' for rich geological keys. The bbox is lon/lat; projection, pixel grid and legend filtering are handled for you.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| title | No | ||
| width | No | ||
| height | No | ||
| sources | No | ||
| composition | No | ||
| legend_mode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full disclosure duty. It explains that bbox is lon/lat, that projection, pixel grid, and legend filtering are handled automatically, and that sources are ordered bottom-first. This meaningfully describes behavior beyond the bare schema and gives the agent operational expectations, though it stops short of describing output format or error behavior.
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?
Two sentences, front-loaded with the core purpose and no filler. The first sentence states the operation; the second packs the essential input semantics. Every clause earns its place.
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?
For a 7-parameter tool with no annotations and no output schema, the description covers the non-obvious aspects: named compositions, source ordering, legend modes, and automatic projection/pixel-grid handling. It does not spell out whether composition and sources may be combined, nor the exact returned format, but these are minor gaps given the strong operational guidance provided.
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 0%, so the description must compensate. It explains bbox coordinates, the composition-or-sources choice, bottom-first ordering, and legend_mode values with a use recommendation for 'separate'. Width, height, and title are not deeply explained, but the statement about pixel-grid handling and the param names provide enough orientation for a capable agent.
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 opens with a specific operation and resource: 'Compose one map from several sources, aligned, with a combined legend.' This clearly distinguishes compose_map from sibling tools like query_layer, get_legend, and export_map by framing it as multi-source assembly. It also names the two input modes (composition or sources), removing ambiguity about what the tool does.
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 provides clear usage context: use a declared `composition` or list `sources` bottom-first, and choose `legend_mode` with a specific recommendation for geological keys. It does not explicitly name alternatives or state when not to use the tool, but the intended use case is clear enough for an agent to route correctly among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_layerA
Describe a layer: fields with their types and coded-value domains, geometry type and record count. WMS sources publish no field schema and say so.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| layer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It openly states that WMS sources publish no field schema and that the tool will say so, which is useful behavioral context. It does not discuss errors or permissions, but for an introspection tool with an output schema, the key behavior is disclosed.
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?
Two efficient sentences: the first front-loads the core purpose and output, and the second adds the important WMS exception. There is no redundancy or filler.
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?
For a simple two-parameter tool with an output schema, the description adequately explains what the tool returns and highlights a source-specific limitation. It is slightly incomplete because it leaves parameter provenance and sibling-tool selection to inference, but those gaps are not severe.
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?
With 0% schema description coverage, the description needed to clarify source and layer_id, but it does not explain their formats, origins, or how they relate to other tools. The mention of 'WMS sources' gives a small hint, but an agent still has little guidance on what values to provide.
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?
Uses a specific verb and resource ('Describe a layer') and enumerates the exact return payload: fields with types, coded-value domains, geometry type, and record count. This clearly distinguishes it from siblings like describe_service and query_layer. The WMS caveat further sharpens the tool's scope.
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 intended use is implied: call this when layer metadata or schema is needed. However, it does not explicitly mention when to prefer this over describe_service, list_services, or get_legend, nor does it state exclusions or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_serviceB
Service metadata: layers with their ids, extent, CRS, formats, limits, and the capabilities this source actually supports.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It signals a read-only metadata operation and adds a useful nuance: it returns capabilities the source 'actually supports,' not just declared capabilities. It does not discuss auth or errors, but the output schema covers the return shape and this is a benign describe operation.
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 a single, front-loaded sentence with no filler. It packs the output scope into a concise list, making it easy to scan, though it could have spent a few words on the source parameter.
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?
The output schema exists, so return values do not need to be fully spelled out. However, the one required parameter is left undocumented and there is no guidance on choosing this tool over closely related siblings, leaving a moderate gap.
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 0% and the description never explains what 'source' should be — a service ID, URL, or name. The phrase 'this source' weakly ties the parameter to a service, but that is not enough for an agent to reliably construct valid input.
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 names the resource ('service') and enumerates the metadata contents: layers with ids, extent, CRS, formats, limits, and supported capabilities. This distinguishes it from sibling tools like describe_layer or list_services, though it uses a noun phrase rather than an explicit verb.
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 implies it should be used when service-level metadata is needed, but it does not explicitly state when to prefer describe_service over describe_layer or list_services, nor does it mention any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_mapA
Render one source for a bbox [minlon,minlat,maxlon,maxlat] in WGS84 degrees and return it as an image. For several sources on one map use compose_map.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| width | No | ||
| height | No | ||
| layers | No | ||
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does so reasonably: it discloses the output form (image), the coordinate system (WGS84), and the bbox ordering. It does not mention potential output format details, layer handling, or error behavior, but there is no contradiction or hidden destructive behavior implied.
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 exceptionally concise: two short sentences, no filler, with the primary behavior and output type stated first and the routing alternative stated second. Every sentence earns its place.
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?
For a tool with 5 parameters, no annotations, and no output schema, the description covers the essential invocation context: what to render, the bbox format, and how it differs from compose_map. The main gap is lack of explanation for the optional layers, width, and height parameters, but schema defaults and names mitigate that gap enough for an agent to make a competent call.
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?
Since schema description coverage is 0%, the description needs to compensate. It usefully explains source and bbox semantics, including coordinate order and units. However, optional parameters like width, height, and layers are not described, so the agent must infer their meaning from their names and schema defaults. This is adequate for required parameters but incomplete for optional ones.
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?
Purpose clarity is excellent. It uses a specific verb ('Render'), names the resource ('one source'), defines the spatial extent ('bbox [minlon,minlat,maxlon,maxlat]'), and states the return type ('image'). It also distinguishes itself from the sibling compose_map by explicitly noting the single-source scope.
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 when-to-use guidance: use this tool for a single source in a bbox, and explicitly directs the agent to compose_map for multiple sources. The bbox coordinate order is also given, leaving little ambiguity about how to construct the required parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_legendC
Legend of a source: structured entries (ArcGIS) or an image (WMS).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| layer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals a key behavioral trait: the return format depends on the source type (structured entries for ArcGIS, image for WMS). With no annotations, the description carries the full burden, and it does provide some behavioral context beyond the name and schema. However, it does not disclose other relevant behaviors such as error handling, permissions, or how layer_id affects the output.
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 a single 11-word sentence with no filler, repetition, or unnecessary detail. It is front-loaded with the core concept and immediately specifies the key format difference. Every word contributes meaning.
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 no annotations and no parameter descriptions, the description is too thin for an agent to reliably invoke the tool. It does not explain the meaning of 'source' or 'layer_id', nor does it clarify when to use this tool relative to siblings like describe_layer or export_map. The presence of an output schema is helpful, but the description alone leaves important gaps.
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?
Input schema description coverage is 0%, and the description adds no meaning for either 'source' or 'layer_id'. The ArcGIS/WMS distinction hints at source behavior, but it does not explain what values are expected or how layer_id influences the result. The tool fails to compensate for the undocumented schema.
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 that the tool returns the legend of a source and distinguishes between structured entries for ArcGIS and an image for WMS. This communicates the core resource and output type, and the ArcGIS/WMS distinction helps separate it from sibling tools like describe_layer or query_layer. However, it lacks an explicit verb like 'retrieve' or 'get', relying on the tool name to carry the action.
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?
There is no guidance on when to use this tool versus alternatives such as describe_layer or query_layer. The description gives no context about when a legend is needed, no exclusions, and no mention of sibling tools or conditions that would make another tool more appropriate. An agent is left to infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
identify_at_pointC
What is at a point: attributes at the given lon/lat (WGS84) for one or more layers of a source.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes | ||
| layers | No | ||
| source | Yes | ||
| tolerance | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It mentions WGS84 and the return of attributes, implying a read-like operation, but it does not explain tolerance behavior, layer filtering semantics, error conditions, or response structure. This is insufficient for an unpsecified geospatial operation.
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 concise and front-loaded with the core question, followed by the precise coordinate reference and layer scope. It contains no filler, though its brevity leaves substantial room for richer 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 5 parameters, no annotations, and no schema descriptions, the description omits important details like tolerance meaning, layers default behavior, and expected output beyond generic 'attributes'. The presence of an output schema helps but does not make up for missing parameter and usage context in the description.
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 0%, so the description is the only param guidance. It clarifies that lon/lat are in WGS84 and that it applies to one or more layers of a source, which partially covers source, lon, lat, and layers. However, it entirely ignores tolerance and does not explain how layers are specified or filtered, so the compensation is incomplete.
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 the operation: it returns attributes for a given lon/lat in WGS84 for one or more layers of a source. This distinguishes it from sibling tools like describe_layer or list_services by tying the operation to a spatial point, though it does not explicitly differentiate from query_layer.
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?
No guidance is given on when to use this tool instead of query_layer or other siblings. There are no explicit use cases, exclusions, or alternative tool references, leaving the agent to infer when identify_at_point is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesC
List the services published by a source that has a catalog (ArcGIS).
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | ||
| source | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states only that the tool lists services; it does not disclose whether folder scopes results, whether the response is paginated, or what happens when the source lacks a catalog. This is minimal behavioral disclosure for a read tool.
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 a single sentence with no filler, and the main scope is front-loaded. However, the brevity partly reflects missing behavioral and parameter detail rather than efficient compression of complete information.
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 two parameters, no annotations, and a set of sibling tools, the description leaves important gaps: folder semantics, source format, and appropriate usage relative to alternatives. The presence of an output schema covers return-value expectations, but the description is still incomplete 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 description coverage is 0% and the schema provides no parameter descriptions. The description gives partial semantics for 'source' (a source with an ArcGIS catalog) but says nothing about 'folder,' its default, or its effect on the results. It does not compensate for the missing schema descriptions.
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 clear verb ('List') and resource ('services published by a source that has a catalog (ArcGIS)'), which distinguishes it from sibling tools like describe_service that focus on a single service or layer. It could be more explicit in contrasting with those siblings, but the core purpose is unambiguous.
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?
There is no guidance on when to use this tool versus alternatives such as describe_service or query_layer. The only contextual hint is 'source that has a catalog (ArcGIS),' which implies a prerequisite but does not explain how to identify such a source or what to do after listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_layerA
Query layer attributes and return GeoJSON in WGS84. Supports a SQL where, field selection, ordering and a bbox [minlon,minlat,maxlon,maxlat]. If exceededTransferLimit is true, repeat with offset. Only sources that declare the 'query' capability.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| limit | No | ||
| where | No | 1=1 | |
| offset | No | ||
| source | Yes | ||
| layer_id | Yes | ||
| order_by | No | ||
| out_fields | No | * | |
| return_geometry | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it discloses the output CRS (WGS84), the pagination pattern via exceededTransferLimit and offset, and the source capability prerequisite. It does not deeply discuss errors or side effects, but the query nature makes those less critical.
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 concise and front-loaded: first sentence states purpose and output, second sentence lists capabilities, third gives pagination guidance, fourth gives source constraint. Every sentence earns its place without repetition or fluff.
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 9-parameter complexity, the description covers the essential behaviors: filtering, output format, coordinate system, pagination, and capability prerequisite. The output schema exists and can carry return-value details. Minor gaps remain around limit semantics and return_geometry behavior, but overall context is solid.
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 0%, so the description must compensate. It meaningfully explains several parameters: where (SQL), out_fields ('field selection'), order_by ('ordering'), bbox (with coordinate format), and offset (pagination). It does not detail limit or return_geometry, but covers the most important semantics.
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 operation ('Query layer attributes'), the output format ('GeoJSON in WGS84'), and core controls (where, field selection, ordering, bbox). It clearly differentiates this from sibling metadata/rendering tools such as describe_layer and export_map by focusing on data-retrieval semantics.
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 provides clear context for when to use the tool: querying layer data with SQL-like filtering, bbox, and pagination. It does not explicitly enumerate alternatives or say 'use X instead', but the intended use case is strongly implied by the capability constraint 'Only sources that declare the query capability'.
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.
8 tool updates
v0.1.0- First observed
compose_map - First observed
describe_layer - First observed
describe_service - First observed
export_map - First observed
get_legend - First observed
identify_at_point - First observed
list_services - First observed
query_layer
TDQS
Each tool targets a distinct operation: listing services, describing services or layers, getting legends, querying attributes, identifying by point, and rendering maps. The overlap between query_layer and identify_at_point is minimal and well-differentiated by interaction style.
All tool names follow a clear verb_noun snake_case pattern (list_services, describe_layer, get_legend, export_map). Even identify_at_point fits the pattern with a prepositional phrase, and no mixed conventions appear.
Eight tools is well-scoped for a geospatial service client, covering discovery, metadata, query, legend retrieval, and map rendering without redundancy or bloat.
The tool surface covers the full geospatial workflow: catalog browsing, metadata inspection, query, point identification, legend access, single-source export, and multi-source composition. No obvious dead ends or missing core operations.
Maintenance
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
GIS tools for AI agents: 65 free tools + 8 paid (hazard/site-scouting/GeoJSON export)
Verifiable Earth ground truth for AI agents: water, hazard, ground stability, resource, with proof.
Ask in plain English, get a rendered, shareable map from live public data. 24 geospatial tools.
Geospatial AI MCP server — satellite imagery, embeddings, weather, GNS governance
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables LLM agents to perform Bayesian Maximum Entropy geostatistical analysis through natural language rather than code, supporting spatial, network, and physics-informed uncertainty modeling.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with QGIS, supporting project management, layer inspection, spatial queries, styling, and map export in both headless and desktop modes.-

Magic Lane MCP Serverofficial
AlicenseBqualityBmaintenanceEnables AI agents to become geospatially intelligent assistants with tools for location search, smart routing, round trip planning, reverse geocoding, isochrone analysis, route visualization, geofence management, and interactive map display.8297Apache 2.0- AlicenseBqualityBmaintenanceProvides sovereign geospatial awareness by wrapping open, non-US-dependent geospatial APIs for AI-agent situational awareness, environmental compliance, and disaster response.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/davidcervigonluna/IGN-IGME-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server