cityjson-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CJDB_BIN | No | Optional cjdb executable override. | cjdb |
| CJIO_BIN | No | Optional cjio executable override. | cjio |
| CJVAL_BIN | No | Optional cjval executable override. | cjval |
| PGPASSWORD | No | PostgreSQL password used by cjdb for database import/export. | |
| VAL3DITY_BIN | No | Optional val3dity executable override. | val3dity |
| CITYGML_TOOLS_BIN | No | Optional citygml-tools executable override. | citygml-tools |
| CITYJSON_MCP_INPUT | No | Input directory used by cityjson_import. | ./input |
| CITYJSON_MCP_WORKSPACE | No | Managed source and derived datasets. | ./.cityjson-mcp-workspace |
| CITYJSON_MCP_ALLOWED_ROOTS | No | Authorized filesystem roots. Use ':' on macOS/Linux and ';' on Windows. | current directory |
| CITYJSON_MCP_COMMAND_TIMEOUT_MS | No | External command timeout. | 120000 |
| CITYJSON_MCP_MAX_DOWNLOAD_BYTES | No | Maximum inline MCP download size. Datum streams downloads directly. | 26214400 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| cityjson_backend_statusA | Check which external CityJSON/CityGML engines are installed and callable. Run this first when a backend-dependent operation fails. |
| cityjson_openA | Open a CityJSON file by a full server-visible path inside an allowed root. This is an advanced path-based operation. For files delivered to the configured input inbox, use cityjson_import with a filename instead. |
| cityjson_list_importsA | List JSON files in the configured input inbox. Use this when the user did not name an attached/imported file or when cityjson_import reports multiple candidates. Returns filenames only; never ask the user for an absolute path. |
| cityjson_importA | Import a CityJSON file already placed in the configured input inbox and return an immutable dataset handle. Pass only its filename, never an absolute path. If filename is omitted, the import succeeds only when the inbox contains exactly one JSON file. |
| cityjson_import_textA | Fallback for small programmatically supplied CityJSON documents only. The complete JSON travels through the MCP request, so never use it for normal chat attachments or large models; use cityjson_import instead. |
| cityjson_downloadA | Prepare an opened or transformed dataset for download. The web host streams the managed file directly; standalone MCP clients receive an embedded application/json resource within the configured inline-size limit. |
| cityjson_infoA | Return metadata, object counts, types, LoDs, attribute names, transform and extensions for an opened dataset. |
| cityjson_saveC | Copy an opened/derived CityJSON dataset to an explicit destination path. |
| cityjson_list_objectsB | List CityObjects with IDs, types, selected attributes and LoDs. Supports filtering by CityObject type and pagination. |
| cityjson_get_objectB | Return one complete CityObject and a computed real-world bounding box derived from referenced vertices. |
| cityjson_queryB | Query CityObjects natively by IDs, types, 2D bbox and attribute predicates. Attribute predicates support eq, neq, gt, gte, lt, lte, contains and in. |
| cityjson_validate_schemaA | Validate a dataset with the official cjval validator: JSON syntax, CityJSON schemas, extensions and additional structural consistency checks. |
| cityjson_validate_geometryA | Validate CityJSON 3D primitives with val3dity according to ISO 19107 concepts and CityJSON-specific geometric checks. Returns a detailed report plus a compact reportSummary containing every invalid object ID and error-code count. |
| cityjson_validateA | Run cjval and val3dity and return one combined structural + geometric validation result. geometry.reportSummary contains the complete invalidObjectIds list for reliable follow-up subsets. |
| cityjson_subsetC | Create a derived CityJSON subset with cjio using IDs, bbox, radius, random count or CityObject types. Returns a new dataset_id. |
| cityjson_filter_lodA | Keep only one level of detail using cjio lod_filter. Returns a new dataset_id. |
| cityjson_reprojectB | Reproject coordinates to a target EPSG CRS with cjio. The source dataset must already define a CRS. Returns a new dataset_id. |
| cityjson_assign_crsA | Assign/update the EPSG reference without changing coordinate values using cjio. Returns a new dataset_id. |
| cityjson_translateB | Translate CityJSON coordinates with cjio. With minxyz, coordinates are shifted relative to the supplied minimum; without it cjio uses the model minimum. |
| cityjson_clean_verticesA | Remove duplicate and orphan vertices with cjio vertices_clean. Returns a new dataset_id. |
| cityjson_triangulateB | Triangulate surfaces with cjio. Use sloppy=true only when the robust triangulator fails. |
| cityjson_mergeA | Merge two or more opened CityJSON datasets with cjio. Returns a new dataset_id. |
| cityjson_attribute_renameB | Rename an attribute across CityObjects with cjio. |
| cityjson_attribute_removeC | Remove an attribute across CityObjects with cjio. |
| cityjson_remove_texturesB | Remove all textures with cjio. Returns a new dataset_id. |
| cityjson_remove_materialsB | Remove all materials with cjio. Returns a new dataset_id. |
| cityjson_upgradeB | Upgrade an older supported CityJSON file to the version supported by the installed cjio. |
| cityjson_exportB | Export an opened CityJSON dataset with cjio to jsonl, obj, stl, glb or b3dm. |
| citygml_to_cityjsonA | Convert a CityGML 1.0/2.0/3.0 GML/XML dataset to CityJSON using citygml-tools. A regular CityJSON output is automatically opened and returned as a dataset_id. |
| cityjson_to_citygmlA | Convert an opened CityJSON dataset to CityGML using citygml-tools. The installed citygml-tools version controls the default target encoding. |
| cityjson_db_importB | Convert the dataset to CityJSONSeq with cjio and import it into PostgreSQL/PostGIS using cjdb. PostgreSQL password should be supplied through PGPASSWORD, not tool arguments. |
| cityjson_db_exportA | Export all objects or a read-only SELECT-defined subset from cjdb to CityJSONSeq and optionally collect it into a normal CityJSON dataset handle. |
| cityjson_spec_outlineA | Return the bundled outline and canonical URLs for the current CityJSON specification and schemas. |
| cityjson_spec_readA | Fetch the canonical CityJSON 2.0.2 living specification and return either the beginning or a context window around a search query. |
| cityjson_schema_readA | Fetch one canonical CityJSON 2.0.2 JSON Schema by name. |
| cityjson_extensions_registryC | Fetch the official CityJSON Extensions registry and optionally return context around a search term. |
| cityjson_extension_schemaB | Fetch a registered CityJSON Extension schema from the canonical cityjson.github.io registry URL. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| cityjson-reference-index | Specification chapters, schema names and canonical reference URLs. |
TDQS
Scored across 37 tools
Most tools map cleanly to distinct operations (validate vs validate_schema vs validate_geometry; import vs open vs import_text). A few boundaries rely on careful reading, such as open vs import and export vs db_export, but the descriptions generally make the intended use clear.
All tools consistently use the cityjson_ prefix followed by lowercase snake_case verb phrases such as list_imports, validate_geometry, assign_crs, and db_export. No camelCase, no arbitrary verb mixing, and the pattern is predictable across the entire set.
At 37 tools, the server is well past the 25-tool threshold for a heavy surface. While the domain is broad, many tools are thin wrappers around the same underlying cjio engine, and the count adds cognitive load without clearly earning every slot.
The surface covers import/open, query, validation, transformation, export, conversion, database round-tripping, and spec/schema access, which is strong for CityJSON processing. Minor gaps remain, such as no obvious way to list open dataset handles or delete objects, but these are workable limitations rather than dead ends.