Skip to main content
Glama
Yarroudh

cityjson-mcp

by Yarroudh

CityJSON MCP

Локальный сервер Model Context Protocol (MCP) для реальной работы с CityJSON, а не только для чтения спецификации.

Он предоставляет MCP-клиентам, таким как Claude Desktop, Cursor и VS Code, стабильный CityJSON-ориентированный API инструментов, основанный на:

  • cjio — манипуляции с CityJSON, фильтрация, операции с CRS, очистка, слияние и экспорт.

  • cjval — официальная проверка синтаксиса, схемы и структуры CityJSON/CityJSONSeq.

  • val3dity — проверка 3D-геометрической корректности примитивов CityJSON.

  • citygml-tools — конвертация CityGML ↔ CityJSON.

  • cjdb + PostgreSQL/PostGIS — постоянное хранение/импорт/экспорт CityJSON.

  • Спецификация CityJSON 2.0.2, JSON-схемы и реестр расширений — живой канонический справочный доступ для агента.

Сервер предоставляет 38 MCP-инструментов. Преобразования используют иммутабельные дескрипторы наборов данных: такая операция, как cityjson_subset, возвращает новый dataset_id и не перезаписывает исходный набор данных. Необязательный одностраничный чат-хост передаёт вложения браузера во входную папку MCP и отправляет настроенной модели только дескрипторы наборов данных.

Статус: это практическая реализация v0.1. Рекомендуемый Docker-образ включает все внешние бэкенды; разработка без Docker всё равно требует установки отдельных команд.

Архитектура

flowchart LR
  CLIENT["MCP clients<br/>Claude Desktop · Cursor · VS Code"]
  BROWSER["One-page chat<br/>browser + attachments"]
  CHAT["Chat host<br/>model API + MCP client"]
  MODEL["Tool-capable model<br/>Anthropic · OpenAI"]
  INPUT["Input inbox<br/>streamed CityJSON files"]
  SERVER["Docker container<br/>CityJSON MCP · stdio server"]
  CORE["Dataset manager<br/>immutable handles + path policy"]
  NATIVE["Native inspection/query<br/>JSON + CityObjects + bbox"]
  CJIO["cjio<br/>transform · subset · export"]
  CJVAL["cjval<br/>schema + structural validation"]
  VAL3["val3dity<br/>3D geometry validation"]
  CGML["citygml-tools<br/>CityGML ↔ CityJSON"]
  CJDB["cjdb + PostGIS<br/>persistence"]
  KNOW["CityJSON 2.0.2 references<br/>spec + schemas + extensions"]

  CLIENT -->|MCP stdio| SERVER
  BROWSER --> CHAT
  BROWSER -->|file stream| INPUT
  CHAT --> MODEL
  CHAT -->|MCP stdio| SERVER
  INPUT --> CORE
  SERVER --> CORE
  CORE --> NATIVE
  CORE --> CJIO
  CORE --> CJVAL
  CORE --> VAL3
  CORE --> CGML
  CORE --> CJDB
  SERVER --> KNOW

Скачать PNG — высокое разрешение

API, ориентированный на MCP, намеренно не предоставляет произвольные shell-команды, такие как run_cjio("..."). Каждый MCP-инструмент имеет типизированную входную схему. Команды вызываются с помощью spawn(..., { shell: false }), что сохраняет стабильный контракт для агента и избегает интерполяции shell-строк.

Related MCP server: lunar

Типичный рабочий процесс агента

flowchart TD
  START["User asks about a CityJSON file"]
  IMPORT["cityjson_import<br/>returns dataset_id"]
  INSPECT["Inspect/query<br/>info · list_objects · get_object · query"]
  VALIDATE["Validate<br/>cjval + val3dity"]
  TRANSFORM["Transform<br/>subset · LoD · CRS · clean · triangulate · merge"]
  DERIVED["New immutable dataset_id"]
  OUTPUT["Output<br/>save · export · CityGML · cjdb"]
  KNOW["Need semantics?<br/>spec · schema · extensions"]

  START --> IMPORT
  IMPORT --> INSPECT
  IMPORT --> VALIDATE
  IMPORT --> TRANSFORM
  TRANSFORM --> DERIVED
  DERIVED --> VALIDATE
  DERIVED --> OUTPUT
  INSPECT --> OUTPUT
  VALIDATE --> OUTPUT
  INSPECT --> KNOW
  VALIDATE --> KNOW

Скачать PNG — высокое разрешение

Пользователь может, например, сказать:

Импортируй rotterdam.city.json, проверь как структуру CityJSON, так и 3D-геометрию, оставь только здания внутри bbox [90000, 435000, 91000, 436000], перепроецируй результат в EPSG:28992, очисти дублирующиеся и осиротевшие вершины, проверь результат снова и верни его с помощью cityjson_download.

MCP-клиент может выполнить этот запрос примерно так:

  1. cityjson_import

  2. cityjson_validate

  3. cityjson_subset

  4. cityjson_reproject

  5. cityjson_clean_vertices

  6. cityjson_validate

  7. cityjson_save

Каждое преобразование возвращает новый dataset_id, поэтому промежуточные состояния остаются доступными во время разговора.


Быстрый старт

Одностраничный чат DATUM с прямыми вложениями

Включённое чат-приложение DATUM — это самый простой рабочий процесс с вложениями. Оно передаёт каждое вложение браузера в CITYJSON_MCP_INPUT, импортирует его через работающий MCP-сервер и предоставляет модели только итоговый dataset_id и сводку.

Вы можете дополнительно предварительно настроить модель по умолчанию в локальном файле окружения:

cp .env.example .env

Выберите стиль API, затем укажите ID модели, поддерживающей инструменты, её ключ и базовый URL. Например, DeepSeek использует стиль, совместимый с OpenAI:

MODEL_PROVIDER=openai
MODEL_NAME=deepseek-v4-pro
MODEL_API_KEY=your-api-key
MODEL_BASE_URL=https://api.deepseek.com

Этот файл необязателен: модель, провайдер, API-ключ и базовый URL также можно ввести в диалоговом окне Configure model приложения. Учётные данные из диалога хранятся только в памяти сервера для сессии браузера и никогда не возвращаются в браузер и не передаются MCP-инструменту.

MODEL_PROVIDER принимает anthropic или openai, потому что он выбирает протокол API, а не компанию, предоставляющую модель. anthropic использует Messages; openai использует совместимые с OpenAI Chat Completions и, следовательно, также поддерживает совместимые сервисы, такие как DeepSeek, через MODEL_BASE_URL.

Запустите полное приложение. Это поведение по умолчанию, поскольку образ содержит cjio, cjval, val3dity, citygml-tools и cjdb:

npm install
npm run chat

Затем откройте http://127.0.0.1:3000. Прикрепление файла автоматически выполняет следующую последовательность:

browser multipart stream → input inbox → cityjson_import → dataset_id → model tool loop

npm run chat эквивалентно:

docker compose -f docker/docker-compose.chat.yml up --build

Конфигурация Compose привязывает приложение только к 127.0.0.1 и хранит входные/рабочие данные в Docker-томах. Она читает необязательную модель по умолчанию из .env; в противном случае приложение открывает диалог настройки модели.

Для разработки на хосте, где уже установлены все пять исполняемых файлов, используйте npm run chat:host. Режим хоста выполняет проверку готовности бэкендов и отказывается рекламировать неработающий набор инструментов. CHAT_ALLOW_PARTIAL_BACKENDS=true отменяет эту проверку только для намеренной инспекционной разработки.

Автономные MCP-клиенты с полным Docker-рантаймом

Docker-образ содержит MCP-сервер и все пять бэкендов. Установите Docker Desktop, затем загрузите образ из Docker Hub:

docker pull yarroudh/cityjson-mcp:latest

Убедитесь, что все бэкенды присутствуют:

docker run --rm --entrypoint node yarroudh/cityjson-mcp:latest /app/scripts/doctor.mjs

Вывод должен сообщать OK для cjio, cjval, val3dity, citygml-tools и cjdb.

Настройка входной папки

MCP сам по себе не передаёт обычные вложения чата. Для Claude Desktop и других автономных клиентов смонтируйте хост-каталог один раз. Замените /absolute/path/to/cityjson-files на реальный абсолютный каталог:

{
  "mcpServers": {
    "cityjson": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "--mount",
        "type=bind,source=/absolute/path/to/cityjson-files,target=/input,readonly",
        "--env",
        "CITYJSON_MCP_ALLOWED_ROOTS=/input:/data",
        "--env",
        "CITYJSON_MCP_INPUT=/input",
        "yarroudh/cityjson-mcp:latest"
      ]
    }
  }
}

Хост-каталог появляется как /input внутри Docker. Пользователи и агенты ссылаются только на имя файла:

Импортируй model.city.json и сделай сводку.

Агент вызывает cityjson_import({"filename":"model.city.json"}). cityjson_list_imports может обнаружить доступные имена файлов, а cityjson_import копирует выбранный источник в неизменяемое управляемое рабочее пространство. Входной монт не может быть изменён.

Пути вложений чата, такие как /mnt/user-data/... и /home/claude/..., принадлежат частному окружению клиента. Они не существуют внутри MCP-контейнера. cityjson_import_text остаётся доступным только для небольших программно предоставленных JSON-текстов; cityjson_upload — это устаревший совместимый псевдоним, а не реальный канал загрузки файлов.

Образ включает cjio, cjval, val3dity, citygml-tools и cjdb; не требуются хост-библиотеки Python, Rust, Java или геопространственные библиотеки. Docker автоматически загружает новые слои образа при необходимости после повторного выполнения docker pull yarroudh/cityjson-mcp:latest.

Для сборки из исходников закешируйте два медленных этапа компиляции перед сборкой остального образа:

npm install
npm run docker:cache:val3dity
npm run docker:cache:cjval
npm run docker:build
npm run docker:doctor

Если более поздний слой завершится с ошибкой, повторный запуск финальной команды переиспользует завершённые слои val3dity и cjval вместо компиляции с нуля.

Опционально: запуск без Docker

Следующие разделы нужны только при запуске node src/index.mjs напрямую вместо использования полного Docker-образа.

1. Требования

Сам MCP-сервер требует:

  • Node.js 20+

  • npm

Установите его JavaScript-зависимости:

cd cityjson-mcp
npm install

Затем проверьте исходный код и нативные тесты:

npm run check
npm test

Проверьте, какие внешние бэкенды доступны:

npm run doctor

MCP может запуститься, даже если некоторые бэкенды отсутствуют. Только инструменты, зависящие от отсутствующего бэкенда, будут давать сбой. Агент также может сам вызвать cityjson_backend_status.

2. Установите нужные бэкенды

cjio

Официальный проект: https://github.com/cityjson/cjio

python -m pip install 'cjio[export,reproject,validate]'

Дополнительные пакеты полезны, потому что перепроецирование, триангуляция/экспорт и связанные операции требуют дополнительных Python-пакетов.

cjval

Официальный проект: https://github.com/cityjson/cjval

Установите Rust, затем:

cargo install cjval --features build-binary

val3dity

Официальный проект: https://github.com/tudelft3d/val3dity

На macOS вышестоящий проект предоставляет формулу Homebrew:

brew tap tudelft3d/software
brew install val3dity

На Windows используйте исполняемый файл релиза вышестоящего проекта. На Linux следуйте инструкциям сборки CMake/CGAL/Eigen/GEOS вышестоящего проекта. val3dity в настоящее время проверяет CityJSON/CityJSONSeq напрямую; текущие релизы больше не разбирают CityGML, поэтому сначала используйте citygml_to_cityjson, если ваш источник — CityGML.

citygml-tools

Официальный проект: https://github.com/ciitygml4j/citygml-tools

Текущие релизы требуют Java 17+. Скачайте и распакуйте дистрибутив, затем убедитесь, что запускатель citygml-tools находится в PATH, или укажите CITYGML_TOOLS_BIN на запускатель. Текущая стабильная версия на момент подготовки этого README — 2.5.0.

cjdb

Официальный проект: https://github.com/cityjson/cjdb

python -m pip install cjdb

cjdb требует PostgreSQL с PostGIS. Файл разработки compose включён в docker/docker-compose.postgis.yml.

3. Авторизуйте папки, к которым MCP может обращаться

Сервер отклоняет пути к файлам вне явно авторизованных корней.

Пример для macOS/Linux:

export CITYJSON_MCP_ALLOWED_ROOTS="/Users/me/citydata:/Volumes/3d-city-models"
export CITYJSON_MCP_INPUT="/Users/me/citydata/input"
export CITYJSON_MCP_WORKSPACE="/Users/me/citydata/.cityjson-mcp-workspace"

Windows использует точки с запятой между корнями:

C:\citydata;D:\city-models

Рабочее пространство хранит производные наборы данных CityJSON, отчёты валидатора и промежуточные файлы CityJSONSeq. Оно создаётся автоматически.

Необязательные переопределения исполняемых файлов:

export CJIO_BIN=/custom/path/cjio
export CJVAL_BIN=/custom/path/cjval
export VAL3DITY_BIN=/custom/path/val3dity
export CITYGML_TOOLS_BIN=/custom/path/citygml-tools
export CJDB_BIN=/custom/path/cjdb

Для cjdb установите пароль PostgreSQL в окружении процесса, а не в аргументах MCP:

export PGPASSWORD='...'

4. Тестирование сервера вручную

Серверы stdio MCP обычно «ничего не делают» при прямом запуске, потому что ожидают MCP JSON-RPC сообщений на stdin. Вы всё равно можете подтвердить запуск с помощью:

npm run doctor
npm test

Затем настройте одного из MCP-клиентов ниже. Предоставленные шаблоны запускают полный Docker-образ. Участники могут заменить команду Docker на абсолютный путь к node src/index.mjs и установить переменные окружения выше.


Добавление в Claude Desktop

Локальные MCP-конфигурации Claude Desktop используют объект mcpServers. Предоставленный шаблон запускает опубликованный образ без монтирования хоста. Добавьте монтирование, показанное в быстром старте, при работе с большими файлами.

Шаблон Claude Desktop находится в config/claude-desktop.json.

{
  "mcpServers": {
    "cityjson": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "yarroudh/cityjson-mcp:latest"]
    }
  }
}

Типичные расположения конфигурации для локальных серверов Claude Desktop:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Объедините шаблон с конфигурацией клиента, затем полностью закройте и снова откройте Claude Desktop. Каталог config/ содержит шаблоны; Claude не читает его автоматически.

В обычном чате Claude нажмите +, откройте Connectors, включите cityjson и разрешите его инструменты в разделе Tool access. Коннектор доступен только в чатах, где он включён. /input существует внутри контейнера коннектора, а не в среде кода Claude.

Чтобы проверить использование инструментов на macOS:

tail -f "$HOME/Library/Logs/Claude/mcp-server-cityjson.log"

Успешные вызовы отображаются как method="tools/call", за которыми следует результат сервера. Нажмите Ctrl+C, чтобы остановить просмотр.

Claude Desktop также поддерживает упакованные MCP-пакеты/расширения. Этот репозиторий поставляется в виде исходного ZIP, чтобы оставаться прозрачным и редактируемым; прямая конфигурация stdio выше — это самая простая настройка для разработки.


Добавление в Claude Code

Шаблон Claude Code находится в config/claude-code.json. Скопируйте его в .mcp.json в проекте, где вы запускаете Claude Code:

cp config/claude-code.json .mcp.json

Перезапустите Claude Code или переподключите его MCP-серверы после изменения конфигурации.


Добавление в Cursor

Cursor поддерживает локальные stdio MCP-серверы в mcp.json.

Шаблон включён в config/cursor-mcp.json.

Конфигурация проекта:

your-project/
└── .cursor/
    └── mcp.json

Глобальная конфигурация:

~/.cursor/mcp.json

Пример:

{
  "mcpServers": {
    "cityjson": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "--rm", "-i", "yarroudh/cityjson-mcp:latest"]
    }
  }
}

После включения Cursor обнаруживает MCP-инструменты и может выбирать их автоматически. Вы также можете явно указать инструмент в подсказке, например:

Используй cityjson_validate для этой модели, затем объясни каждую ошибку val3dity, используя спецификацию CityJSON, где это уместно.

Документация Cursor: https://cursor.com/docs/mcp


Добавление в VS Code

VS Code использует mcp.json, ключ верхнего уровня которого — servers.

Шаблон включён в config/vscode-mcp.json.

Конфигурация рабочего пространства:

your-project/
└── .vscode/
    └── mcp.json

Пример:

{
  "servers": {
    "cityjson": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "--rm", "-i", "yarroudh/cityjson-mcp:latest"]
    }
  }
}

Откройте палитру команд и используйте команды управления MCP-сервером для проверки/запуска сервера при необходимости. VS Code также поддерживает песочницу MCP на поддерживаемых платформах; её можно наложить поверх собственной политики разрешённых корней сервера.

Документация VS Code: https://code.visualstudio.com/docs/agents/reference/mcp-configuration

Модель настройки клиента

flowchart LR
  CLAUDE["Claude Desktop<br/>claude_desktop_config.json"]
  CLAUDECODE["Claude Code<br/>.mcp.json"]
  CURSOR["Cursor<br/>.cursor/mcp.json"]
  VSCODE["VS Code<br/>.vscode/mcp.json"]
  WEB["CityJSON chat<br/>browser"]
  HOST["Chat host<br/>model + MCP client"]
  DOCKER["CityJSON MCP Docker image<br/>MCP stdio"]
  INPUT["Input inbox<br/>/input"]
  WS["Managed workspace<br/>/data"]
  TOOLS["Bundled backends<br/>cjio · cjval · val3dity · citygml-tools · cjdb"]

  CLAUDE --> DOCKER
  CLAUDECODE --> DOCKER
  CURSOR --> DOCKER
  VSCODE --> DOCKER
  WEB -->|stream attachments| INPUT
  WEB --> HOST
  HOST --> DOCKER
  INPUT --> DOCKER
  DOCKER --> WS
  DOCKER --> TOOLS

Скачать PNG — высокое разрешение


Каталог инструментов

Набор данных и диагностика

Инструмент

Бэкенд

Назначение

Ключевые входные данные

cityjson_backend_status

native

Сообщает, доступны ли cjio, cjval, val3dity, citygml-tools и cjdb; также возвращает настройки политики путей.

нет

cityjson_list_imports

native

Выводит список JSON-файлов, доступных в настроенной входной папке.

нет

cityjson_import

native

Импортирует файл из входной папки по имени и возвращает неизменяемый dataset_id.

необязательный filename

cityjson_import_text

native

Запасной вариант для небольших текстов для программных клиентов; содержимое передаётся через MCP JSON.

content, необязательный filename

cityjson_open

native

Открывает обычный JSON-файл CityJSON и возвращает dataset_id и структурную сводку.

source

cityjson_upload

native

Устаревший совместимый псевдоним cityjson_import_text; не является бинарной загрузкой.

content, необязательный filename

cityjson_download

native

Подготавливает открытую или преобразованную модель для прямой потоковой передачи в веб или встроенной загрузки через MCP.

dataset_id, необязательный filename

cityjson_info

native

Сводка по типу/версии, количеству объектов, LoD, атрибутам, метаданным, transform и расширениям.

dataset_id

cityjson_save

native

Копирует открытый/производный набор данных в явно разрешённый путь.

dataset_id, destination, overwrite

cityjson_import

Используйте этот инструмент для файлов, доставленных во входную папку чат-приложением или размещённых в смонтированном каталоге:

{
  "filename": "amsterdam.city.json"
}

Если имя файла неизвестно, вызовите cityjson_list_imports. Если опустить filename, импорт выполняется автоматически только при наличии ровно одного JSON-файла. Инструмент копирует и проверяет источник перед возвратом дескриптора.

cityjson_import_text

Используйте этот инструмент только тогда, когда небольшой документ CityJSON уже существует в виде текста в рабочем процессе приложения:

{
  "filename": "model.city.json",
  "content": "{\"type\":\"CityJSON\",\"version\":\"2.0\",\"CityObjects\":{},\"vertices\":[]}"
}

Содержимое структурно проверяется перед записью в управляемое рабочее пространство. Он не подходит для вложений из браузера/чата, поскольку полный документ передаётся через MCP-запрос. cityjson_upload сохранён как устаревший псевдоним для совместимости.

cityjson_open

cityjson_open остаётся доступным для продвинутых клиентов, которые намеренно указывают полный путь, видимый серверу, внутри разрешённого корневого каталога. Обычные рабочие процессы с входной папкой и вложениями должны использовать cityjson_import.

cityjson_download

Используйте этот инструмент для получения исходного или преобразованного набора данных, когда в контейнер не смонтирован каталог хоста:

{
  "dataset_id": "cj_abc123def456",
  "filename": "cleaned.city.json"
}

В DATUM хост напрямую передаёт неизменяемый файл рабочего пространства и показывает кнопку загрузки, поэтому большие результаты не проходят через контекст модели или MCP JSON. Автономные MCP-клиенты получают встроенный ресурс application/json; этот встроенный путь по умолчанию ограничен 25 МиБ и управляется переменной CITYJSON_MCP_MAX_DOWNLOAD_BYTES.

Пример результата:

{
  "datasetId": "cj_4ad572e79331",
  "version": "2.0",
  "cityObjectCount": 12543,
  "vertexCount": 382901,
  "lods": ["1.2", "2.2"]
}

Дескриптор — это метаданные в памяти, указывающие на файл; сам документ CityJSON не копируется при простом открытии.

Проверка и запросы

Инструмент

Бэкенд

Назначение

Ключевые входные данные

cityjson_list_objects

native

Постраничный список CityObject с ID, типом, атрибутами, LoD и связями.

dataset_id, необязательные types, limit, offset

cityjson_get_object

native

Возвращает один полный CityObject и вычисляет его 3D-ограничивающий прямоугольник по указанным вершинам.

dataset_id, object_id

cityjson_query

native

Фильтрация по ID, типам CityObject, 2D-ограничивающему прямоугольнику и предикатам атрибутов.

dataset_id, ids, types, bbox, attributes, пагинация

cityjson_query — предпочтительный способ позволить LLM просматривать большие модели, не отправляя весь документ CityJSON в контекст модели.

Пример:

{
  "dataset_id": "cj_4ad572e79331",
  "types": ["Building", "BuildingPart"],
  "bbox": [85000, 446000, 86000, 447000],
  "attributes": {
    "yearOfConstruction": { "gte": 2000 },
    "status": { "in": ["existing", "planned"] }
  },
  "limit": 100
}

Операторы предикатов атрибутов:

  • eq

  • neq

  • gt

  • gte

  • lt

  • lte

  • contains

  • in

Фильтр по ограничивающему прямоугольнику — это [minX, minY, maxX, maxY] в системе координат набора данных. Ограничивающие прямоугольники объектов вычисляются по указанным вершинам объекта и transform из CityJSON, если он присутствует.

Проверка

flowchart LR
  DATA["Opened CityJSON<br/>dataset_id"]
  ALL["cityjson_validate"]
  CJVAL["cityjson_validate_schema<br/>cjval"]
  VAL3["cityjson_validate_geometry<br/>val3dity"]
  STRUCT["JSON + schema + structural<br/>consistency result"]
  GEOM["ISO 19107-style 3D<br/>geometry report"]
  COMBINE["Combined validation result"]

  DATA --> ALL
  ALL --> CJVAL
  ALL --> VAL3
  CJVAL --> STRUCT
  VAL3 --> GEOM
  STRUCT --> COMBINE
  GEOM --> COMBINE

Скачать PNG — высокое разрешение

Инструмент

Бэкенд

Назначение

Ключевые входные данные

cityjson_validate_schema

cjval

Официальная проверка синтаксиса/схемы CityJSON и структурной согласованности.

dataset_id, необязательные локальные extension_schemas

cityjson_validate_geometry

val3dity

Проверяет поддерживаемые 3D-примитивы и возвращает JSON-отчёт val3dity.

dataset_id, verbose

cityjson_validate

cjval + val3dity

Запускает оба валидатора одновременно и возвращает один объединённый результат.

dataset_id

Когда какой валидатор использовать

Используйте cityjson_validate_schema для таких вопросов, как:

  • Является ли JSON синтаксически корректным CityJSON?

  • Соответствует ли он схеме CityJSON?

  • Согласованы ли ссылки родитель/потомок?

  • Существуют ли индексы вершин?

  • Структурно согласованы ли массивы семантики/материалов/текстур?

  • Корректны ли схемы расширений?

Используйте cityjson_validate_geometry для проверки геометрической корректности примитивов MultiSurface, CompositeSurface, Solid, MultiSolid и CompositeSolid, а также связанных специфических для CityJSON геометрических проверок.

Для обычного запроса пользователя «проверьте этот CityJSON» используйте cityjson_validate.

Пример:

{
  "dataset_id": "cj_4ad572e79331"
}

Если предупреждение cjval сообщает о дублирующихся или неиспользуемых вершинах, естественный цикл исправления таков:

  1. cityjson_clean_vertices

  2. cityjson_validate_schema

  3. при необходимости cityjson_validate_geometry

Преобразование и манипуляции

Все инструменты в этом разделе возвращают новый дескриптор набора данных.

Инструмент

Бэкенд

Назначение

Важные входные данные

cityjson_subset

cjio

Выбор/исключение CityObject по ID, ограничивающему прямоугольнику, радиусу, случайному количеству и/или типам CityObject.

ids, bbox, radius, random, types, exclude

cityjson_filter_lod

cjio

Оставить один LoD.

lod

cityjson_reproject

cjio

Преобразование координат в целевую систему координат EPSG.

epsg, необязательный digit

cityjson_assign_crs

cjio

Назначить ссылку EPSG без изменения координат.

epsg

cityjson_translate

cjio

Перенос начала координат, при необходимости с явным минимальным XYZ.

необязательный minxyz

cityjson_clean_vertices

cjio

Удаление дублирующихся и осиротевших вершин.

dataset_id

cityjson_triangulate

cjio

Триангуляция поверхностей.

sloppy

cityjson_merge

cjio

Объединение двух или более открытых наборов данных.

dataset_ids

cityjson_attribute_rename

cjio

Переименование атрибута CityObject во всей модели.

old_name, new_name

cityjson_attribute_remove

cjio

Удаление атрибута у всех CityObject.

name

cityjson_remove_textures

cjio

Удаление информации о текстурах.

dataset_id

cityjson_remove_materials

cjio

Удаление информации о материалах.

dataset_id

cityjson_upgrade

cjio

Обновление более старой версии CityJSON, поддерживаемой установленным cjio.

dataset_id

Примеры подмножеств

Здания в ограничивающем прямоугольнике:

{
  "dataset_id": "cj_4ad572e79331",
  "types": ["Building"],
  "bbox": [85000, 446000, 86000, 447000]
}

Конкретные объекты:

{
  "dataset_id": "cj_4ad572e79331",
  "ids": ["NL.IMBAG.Pand.001", "NL.IMBAG.Pand.002"]
}

Всё, кроме объектов растительности:

{
  "dataset_id": "cj_4ad572e79331",
  "types": ["SolitaryVegetationObject", "PlantCover"],
  "exclude": true
}

Работа с системой координат

Используйте cityjson_assign_crs только тогда, когда координаты уже выражены в нужной системе координат, а метаданные отсутствуют/неверны. Этот инструмент не преобразует координаты.

Используйте cityjson_reproject, когда координаты действительно нужно преобразовать:

{
  "dataset_id": "cj_4ad572e79331",
  "epsg": 28992
}

Для надёжного перепроецирования исходная модель должна иметь пригодную исходную систему координат.

Экспорт и интероперабельность

Инструмент

Бэкенд

Назначение

Входные данные

cityjson_export

cjio

Экспорт в CityJSONSeq/JSONL, OBJ, STL, GLB или B3DM.

dataset_id, format, destination, sloppy

citygml_to_cityjson

citygml-tools

Преобразование CityGML GML/XML в CityJSON или CityJSONSeq; обычный вывод CityJSON автоматически открывается.

source, json_lines

cityjson_to_citygml

citygml-tools

Преобразование открытой модели CityJSON в CityGML.

dataset_id, необязательные crs_name, output_directory

Пример экспорта:

{
  "dataset_id": "cj_4ad572e79331",
  "format": "glb",
  "destination": "/data/buildings.glb"
}

Пример CityGML → CityJSON:

{
  "source": "/input/model.gml",
  "json_lines": false
}

Пример CityJSON → CityGML:

{
  "dataset_id": "cj_4ad572e79331",
  "crs_name": "urn:ogc:def:crs:EPSG::28992",
  "output_directory": "/data/citygml-output"
}

Обёртка намеренно не добавляет собственную опцию целевой версии CityGML/CityJSON. citygml-tools поддерживает CityGML 1.0/2.0/3.0 и CityJSON 1.0/1.1/2.0, но точное поведение CLI для целевой версии может различаться в зависимости от версии вышестоящего релиза; настройки по умолчанию установленного бэкенда остаются авторитетными.

Инструменты базы данных

Инструмент

Бэкенд

Назначение

Входные данные

cityjson_db_import

cjio + cjdb + PostGIS

Преобразует обычный CityJSON в CityJSONSeq, затем импортирует в схему PostgreSQL/PostGIS.

dataset_id, connection, необязательные списки индексов

cityjson_db_export

cjdb + cjio

Экспортирует всю схему cjdb или выбранный набор идентификаторов объектов в CityJSONSeq; при необходимости собирает их в обычный dataset_id CityJSON.

connection, необязательные query, collect

Объект подключения:

{
  "host": "localhost",
  "user": "cityjson",
  "database": "cityjson",
  "schema": "rotterdam"
}

Импорт:

{
  "dataset_id": "cj_4ad572e79331",
  "connection": {
    "host": "localhost",
    "user": "cityjson",
    "database": "cityjson",
    "schema": "rotterdam"
  },
  "attribute_indexes": ["yearOfConstruction"],
  "partial_attribute_indexes": ["function"]
}

Экспорт подмножества:

{
  "connection": {
    "host": "localhost",
    "user": "cityjson_reader",
    "database": "cityjson",
    "schema": "rotterdam"
  },
  "query": "SELECT object_id FROM rotterdam.cj_object WHERE object_id LIKE 'NL.IMBAG.%'",
  "collect": true
}

Обёртка отклоняет SQL, отличный от SELECT, точки с запятой и очевидные изменяющие ключевые слова. Это защитное ограничение, а не граница безопасности SQL: используйте роль базы данных только с правами, соответствующими операции. Для экспорта используйте роль, которая не может изменять данные.

Знание спецификации, схемы и расширений

Инструмент

Источник

Назначение

cityjson_spec_outline

встроенный индекс

Возвращает актуальные справочные метаданные, структуру глав и известные имена схем без доступа к сети.

cityjson_spec_read

каноническая спецификация CityJSON

Загружает текст спецификации CityJSON 2.0.2; может возвращать контекст вокруг запроса.

cityjson_schema_read

каноническая конечная точка схемы CityJSON TU Delft

Загружает именованную JSON-схему CityJSON 2.0.2 как разобранный JSON.

cityjson_extensions_registry

официальный реестр cityjson/extensions

Получает реестр, при необходимости вокруг поискового термина.

cityjson_extension_schema

канонический URL расширений CityJSON

Загружает конкретную зарегистрированную схему расширения по имени/версии.

Пример поиска по спецификации:

{
  "query": "Geometry templates",
  "max_chars": 20000
}

Пример поиска по основной схеме:

{
  "name": "geomprimitives.schema.json"
}

Пример обнаружения расширения:

{
  "query": "noise"
}

Затем загрузка конкретной схемы:

{
  "name": "noise",
  "version": "2.0.0"
}

Почему это не зависит от cityjson/cj-mcp

cityjson/cj-mcp полезен для получения глав спецификации. Этому серверу требуются более широкие операции, поэтому адаптер знаний читает канонические источники спецификации/схемы/расширений CityJSON напрямую и включает небольшой детерминированный справочный индекс 2.0.2. Это позволяет избежать второго процесса MCP и режима отказа из-за расхождения версий.

Будущий адаптер сможет делегировать cityjson_spec_read серверу cj-mcp без изменения публичных имён инструментов MCP.


Рекомендуемые подсказки / рецепты

Эти подсказки предполагают, что каталог файлов хоста настроен как входная папка. Агент использует имена файлов и никогда не проверяет /input в собственном окружении кода.

Проверка перед изменением

Импортируй tile.city.json с помощью cityjson_import. Сообщи мне версию CityJSON, СК, количество CityObject по типам, LoD, имена атрибутов и расширения. Ничего не изменяй.

Ожидаемые инструменты: cityjson_import → cityjson_info.

Проверка и диагностика

Импортируй tile.city.json, затем проверь его с помощью cjval и val3dity. Используй только инструменты коннектора CityJSON. Отдели предупреждения cjval от ошибок, сгруппируй ошибки val3dity по кодам ошибок, определи затронутые идентификаторы CityObject и обратись к спецификации CityJSON, если ошибка касается структурного правила CityJSON. Если отчёт о проверке превышает лимит вывода инструмента, создай непересекающиеся пространственные подмножества, проверь каждое подмножество и агрегируй счётчики без двойного подсчёта. Не изменяй исходный файл.

Ожидаемые инструменты: cityjson_import → cityjson_validate → при необходимости cityjson_get_object / cityjson_spec_read.

Безопасный цикл очистки

Импортируй tile.city.json, выполни структурную проверку, и если единственные структурные предупреждения — это дублирующиеся или неиспользуемые вершины, создай очищенный производный набор данных, выполни полную проверку снова и верни результат с помощью cityjson_download как tile-clean.city.json. Никогда не перезаписывай оригинал.

Ожидаемые инструменты: cityjson_import → cityjson_validate_schema → cityjson_clean_vertices → cityjson_validate → cityjson_save.

Пространственная выборка

Из файла city.city.json во входной папке извлеки только объекты Building и BuildingPart, пересекающие bbox [85000, 446000, 86000, 447000], сохрани LoD 2.2, перепроецируй в EPSG:28992, проверь результат, затем верни его с помощью cityjson_download как extract.city.json.

Ожидаемые инструменты: cityjson_import → cityjson_subset → cityjson_filter_lod → cityjson_reproject → cityjson_validate → cityjson_save.

Совместимость с CityGML

Преобразуй /input/source.gml в CityJSON, проверь типы объектов и LoD в результате, проверь его с помощью cjval и val3dity и сообщи о любой информации, которая могла быть потеряна или нормализована при преобразовании.

Ожидаемые инструменты: citygml_to_cityjson → cityjson_info → cityjson_validate, плюс обращение к спецификации, когда это полезно.

Рабочий процесс с базой данных

Импортируй файл municipality.city.json из входной папки, проверь его, затем импортируй в PostgreSQL на хосте localhost, база данных cityjson, схема municipality. Добавь индекс атрибута для yearOfConstruction. Используй пароль базы данных из окружения процесса MCP.

Ожидаемые инструменты: cityjson_import → cityjson_validate_schema → cityjson_db_import.

Рассуждение с учётом расширений

Эта модель объявляет расширение CityJSON noise. Найди документацию/схему зарегистрированного расширения, объясни дополнительные свойства, которые оно допускает, и проверь модель с её локальной схемой расширения, если я её предоставлю.

Ожидаемые инструменты: cityjson_info → cityjson_extensions_registry → cityjson_extension_schema → при необходимости cityjson_validate_schema.


Жизненный цикл данных и неизменяемость

Ключевая конструкция:

browser attachment ──stream──> input inbox ──cityjson_import──> cj_A
mounted inbox file ──────────────────────────cityjson_import──> cj_A
authorized path ─────────────────────────────cityjson_open────> cj_A
                                  │
                                  ├── subset ───────> cj_B
                                  │                   │
                                  │                   └── reproject ──> cj_C
                                  │
                                  └── validate (does not modify data)
  • cityjson_import копирует файл из входной папки в управляемое рабочее пространство, проверяет его и возвращает начальный идентификатор набора данных.

  • cityjson_open регистрирует явно авторизованный видимый сервером путь для расширенных рабочих процессов.

  • cityjson_import_text — это запасной вариант для небольших документов; его устаревший псевдоним cityjson_upload не обрабатывает бинарные вложения.

  • Преобразование просит бэкенд записать новый файл внутри CITYJSON_MCP_WORKSPACE.

  • Сервер открывает созданный файл и присваивает ему новый случайный dataset_id.

  • cityjson_save — это явный шаг, который копирует выбранное состояние в место назначения, выбранное пользователем.

Это значительно упрощает агенту сравнение результатов проверки до/после и предотвращает молчаливую перезапись исходного файла обычными вызовами преобразования.


Модель безопасности

Этот сервер выполняет мощные геопространственные программы локально. Относитесь к установке сервера MCP как к установке локального кода.

Встроенные защитные механизмы:

  1. Разрешённые корни — операции с путями хоста должны находиться в пределах CITYJSON_MCP_ALLOWED_ROOTS, CITYJSON_MCP_INPUT или управляемого рабочего пространства. Загрузкам из браузера присваиваются случайные безопасные имена файлов внутри входного каталога.

  2. Нет произвольного инструмента оболочки — нет команды run_shell или неограниченного инструмента MCP run_cjio.

  3. Нет интерполяции оболочки — внешние программы вызываются с массивами аргументов и shell: false.

  4. Типизированные схемы инструментов — Zod ограничивает типы, перечисления, целые числа EPSG, формы bbox, идентификаторы схем базы данных и т. д.

  5. Пароль PostgreSQL остаётся в окружении — схемы инструментов базы данных не содержат поля пароля.

  6. Защита SQL экспорта БД — принимаются только одиночные строки SELECT без точек с запятой или очевидных изменяющих ключевых слов. Всё равно используйте роль базы данных только с необходимыми правами.

  7. Тайм-аут/ограничение вывода команд — для подпроцессов по умолчанию установлен тайм-аут 120 секунд и ограниченный захваченный вывод. Установите CITYJSON_MCP_COMMAND_TIMEOUT_MS для больших задач.

Для общих или производственных сред запускайте MCP под учётной записью/контейнером ОС только с теми правами на файловую систему и базу данных, которые ему действительно нужны.


Docker

Включённый docker/Dockerfile устанавливает:

  • среду выполнения Node + зависимости пакетов MCP

  • cjio

  • cjdb

  • cjval

  • val3dity

  • citygml-tools

Большинству пользователей следует загрузить опубликованный образ:

docker pull yarroudh/cityjson-mcp:latest

Для локальной сборки из исходников закешируйте два дорогих этапа компиляции перед сборкой остального:

docker build -f docker/Dockerfile --target val3dity-builder -t cityjson-mcp-val3dity-builder .
docker build -f docker/Dockerfile --target cjval-builder -t cityjson-mcp-cjval-builder .
docker build -f docker/Dockerfile -t cityjson-mcp .

Выполните docker run --rm --entrypoint node cityjson-mcp /app/scripts/doctor.mjs после локальной сборки, чтобы проверить все пять исполняемых файлов.

Публикация из GitHub Actions

Рабочий процесс в .github/workflows/docker-publish.yml собирает образы linux/amd64 и linux/arm64 на нативных раннерах, создаёт один мультиплатформенный манифест и отправляет его в yarroudh/cityjson-mcp.

Настройте репозиторий GitHub в разделе Settings → Secrets and variables → Actions:

  • Переменная DOCKERHUB_USERNAME: yarroudh

  • Секрет DOCKERHUB_TOKEN: токен доступа Docker Hub с правом записи в этот репозиторий

Запустите рабочий процесс вручную со вкладки Actions или опубликуйте тег версии:

git tag v0.1.0
git push origin v0.1.0

Тег версии публикует 0.1.0, 0.1 и latest. Кэш BuildKit сохраняется для последующих запусков, поэтому неизменённые слои val3dity и cjval не нужно компилировать заново.

Разработка PostGIS:

docker compose -f docker/docker-compose.postgis.yml up -d

См. docker/README.md.


Структура разработки

cityjson-mcp/
├── src/
│   ├── index.mjs                 # MCP server entry point
│   ├── core/
│   │   ├── dataset-manager.mjs   # immutable dataset handles
│   │   ├── cityjson-native.mjs   # parsing, summaries, bbox, queries
│   │   ├── path-policy.mjs       # allowed filesystem roots
│   │   └── command-runner.mjs    # safe subprocess execution
│   ├── adapters/
│   │   ├── cjio.mjs
│   │   ├── cjval.mjs
│   │   ├── val3dity.mjs
│   │   ├── citygml-tools.mjs
│   │   ├── cjdb.mjs
│   │   └── knowledge.mjs
│   ├── tools/
│   │   └── register-tools.mjs
│   └── util/
├── resources/spec/               # deterministic CityJSON 2.0.2 reference index
├── config/                       # Claude/Cursor/VS Code examples
├── diagrams/                     # Mermaid source + high-resolution PNG exports
├── examples/
├── scripts/
├── test/
└── docker/

Уровень протокола MCP использует стабильную линию v2 официального TypeScript SDK сервера Model Context Protocol и транспорт stdio.


Диаграммы

Все исходники Mermaid хранятся в diagrams/*.mmd. Проверенные PNG-файлы генерируются из тех же определений графов при выводе Graphviz с разрешением 300 DPI, с размерами в диапазоне нескольких тысяч пикселей, чтобы они оставались чёткими в документах/слайдах.

Перегенерируйте их:

python3 scripts/render_diagrams.py

Рендерер поддерживает подмножество блок-схем Mermaid, используемое в этом README, и требует исполняемый файл Graphviz dot.

Текущие PNG-файлы:


Тесты

Нативные тесты не требуют внешнего геопространственного бэкенда:

npm test

Они проверяют:

  • разбор CityJSON и генерацию сводки

  • вычисление bbox преобразованных/декантированных объектов

  • нативные запросы типов/bbox/атрибутов

  • включённый пример JSON

Проверьте синтаксис каждого исходного файла .mjs:

npm run check

Внешние адаптеры намеренно являются тонкими обёртками вокруг своих официальных CLI. Для среды развёртывания добавьте интеграционные тесты, привязанные к точным версиям бэкендов, которые вы разворачиваете.


Известные ограничения / решения v0.1

  • Нативный cityjson_open в настоящее время загружает обычный JSON-файл CityJSON в память. Для чрезвычайно больших потоков CityJSONSeq используйте серверные рабочие процессы или добавьте потоковый адаптер.

  • Дескрипторы наборов данных существуют в течение всего времени жизни процесса MCP-сервера; перезапуск клиента/сервера делает старые значения dataset_id недействительными. После перезапуска повторно открывайте исходные/сохранённые файлы.

  • Производные файлы рабочей области не удаляются автоматически. Это сделано намеренно для прослеживаемости, но периодически очищайте рабочую область.

  • cityjson_query вычисляет ограничивающие прямоугольники (bbox) на основе геометрии, явно хранящейся на каждом CityObject. Он не объединяет автоматически всю дочернюю геометрию в bbox родительского объекта.

  • cityjson_spec_read, cityjson_schema_read и инструменты реестра расширений/схем требуют исходящего сетевого доступа к каноническим конечным точкам CityJSON. cityjson_spec_outline работает на основе встроенного индекса.

  • cityjson_to_citygml намеренно оставляет выбор версии целевого CityGML на усмотрение установленных по умолчанию настроек citygml-tools вместо того, чтобы полагаться на непроверенный флаг CLI.

  • val3dity — это программное обеспечение GPL-3.0; этот проект вызывает исполняемый файл как внешний бэкенд и не включает его в свой состав. Изучите лицензионные последствия для вашей собственной модели распространения/развёртывания.

  • Предоставляемый базовый образ Docker не включает val3dity или citygml-tools.


Ссылки на вышестоящие проекты


Лицензия

Код в этом репозитории предоставляется под лицензией MIT; см. LICENSE.

Внешние бэкенды остаются отдельным программным обеспечением под собственными лицензиями. В частности, val3dity — GPL-3.0, citygml-tools — Apache-2.0, а cjio/cjval/cjdb имеют собственные файлы лицензий вышестоящих проектов. Ничто в этом репозитории не перелицензирует эти проекты.

Available Tools

37 tools
citygml_to_cityjsonConvert 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.

NameRequiredDescriptionDefault
sourceYes
json_linesNo

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description bears the transparency burden. It does disclose a meaningful output behavior: a regular CityJSON output is automatically opened and returned as a dataset_id. It does not cover side effects, error handling, or behavior when json_lines is true, leaving some ambiguity.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action and followed by the output behavior, with no redundant phrasing. The mention of citygml-tools is minor but not damaging.

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

Completeness3/5

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

For a no-annotation, no-output-schema conversion tool with two parameters, the description gives the essential purpose and result but omits the meaning of json_lines and any constraints on source. It is minimally usable for the default path but not fully complete.

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

Parameters2/5

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

The input schema has no descriptions and the description has 0% parameter coverage, so the description needed to explain both parameters. It indirectly refers to the CityGML source dataset but never names the source property or explains that json_lines toggles a CityJSON Lines variant. The optional parameter is entirely unexplained.

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

Purpose5/5

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

The description uses a specific action (convert), resource (CityGML 1.0/2.0/3.0 GML/XML to CityJSON), and explicitly names the direction, so an agent can distinguish it from sibling tools like cityjson_to_citygml. It also scopes the accepted input formats clearly.

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

Usage Guidelines4/5

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

It clearly implies the tool is for converting CityGML inputs to CityJSON, with supported input versions stated. It does not, however, name alternative tools for cases like already-CityJSON inputs or reverse conversion, so exclusions are absent rather than explicit.

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

cityjson_assign_crsAssign CityJSON CRSA

Assign/update the EPSG reference without changing coordinate values using cjio. Returns a new dataset_id.

NameRequiredDescriptionDefault
epsgYes
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses that coordinate values are not changed and that the tool returns a new dataset_id, covering the most important side-effect and output behavior. It does not detail error cases or whether the original dataset is mutated, but for this simple assignment operation the disclosure is reasonably complete.

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

Conciseness4/5

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

The description is two short sentences with the core behavior front-loaded. The phrase 'using cjio' is mild filler that an agent does not need, but the overall size is appropriate and the return behavior is included.

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

Completeness4/5

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

For a two-parameter tool with no output schema, the description covers the required semantic context: what the tool does, what it does not do, and what it returns. The schema covers dataset_id and requiredness. It could be more complete by explicitly stating whether the input dataset is left unchanged, but the description is adequate for correct invocation.

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

Parameters3/5

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

The dataset_id parameter is already documented in the schema, but the epsg parameter has no schema description. The tool description ties epsg to the 'EPSG reference' concept and clarifies it is not a coordinate transformation, which adds some meaning. However, it does not provide examples, valid-range guidance, or further semantics beyond what the parameter name already implies.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Assign/update the EPSG reference') and adds the key distinguishing constraint 'without changing coordinate values', which separates it from tools like cityjson_reproject. An agent can tell what this tool does and what it deliberately avoids doing.

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

Usage Guidelines4/5

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

The phrase 'without changing coordinate values' provides clear usage context: use this when setting/updating CRS metadata rather than transforming geometry. It stops short of explicitly naming an alternative tool or saying 'use reproject when coordinate values must change', so it does not fully earn a 5.

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

cityjson_attribute_removeRemove CityJSON attributeC

Remove an attribute across CityObjects with cjio.

NameRequiredDescriptionDefault
nameYes
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

C2.9/5.0
Behavior2/5

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 communicates that this is a removal/mutation operation but does not say whether it is irreversible, whether it operates in memory, what happens if the attribute does not exist, or what the return value is.

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

Conciseness5/5

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

The description is a single focused sentence with no filler. It front-loads the core action and resource, making it easy to scan.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description is too thin. It omits important operational context such as the effect on the dataset, whether the operation is reversible, and what the tool returns, leaving an agent to infer key behavior from the sibling tool family.

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

Parameters3/5

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

Schema coverage is 50%, with dataset_id well documented but name only given a type and minLength. The description adds the useful context that the tool removes an 'attribute', which helps map the name parameter to an attribute name, but it does not fully compensate for the missing schema-level description of name.

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

Purpose4/5

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

The description clearly states a specific action ('Remove an attribute') applied to a specific resource ('CityObjects with cjio'). It is distinguishable from the sibling cityjson_attribute_rename, though it does not explicitly name it.

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

Usage Guidelines2/5

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

No guidance is given about when to prefer this tool over alternatives such as cityjson_attribute_rename or other transformation tools. The description does not mention prerequisites, effects, or operation context.

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

cityjson_attribute_renameRename CityJSON attributeB

Rename an attribute across CityObjects with cjio.

NameRequiredDescriptionDefault
new_nameYes
old_nameYes
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description must fully convey behavioral traits. It states that renaming happens across CityObjects, but does not disclose whether the operation mutates in place, whether changes need to be saved, what happens if old_name is missing or new_name already exists, or any other side effects. This is a significant gap for a mutation tool.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler or redundant detail. Every word contributes to identifying the action, scope, and implementation context.

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

Completeness2/5

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

For a tool with no annotations, no output schema, and low parameter coverage, the description is too minimal. It does not explain the return value, whether the dataset handle is updated or returned, whether persistence is required via cityjson_save, or how collisions are handled. These are important for an agent to invoke the tool correctly in a multi-step workflow.

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

Parameters3/5

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

Schema description coverage is only 33%, with dataset_id documented but old_name and new_name left to their property names. The description 'Rename an attribute across CityObjects' helps map old_name and new_name to attribute names and clarifies scope, but it does not add constraints like uniqueness, existence requirements, or name validity rules. It partially compensates for the schema gap.

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

Purpose5/5

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

The description names a specific verb ('Rename'), a concrete resource ('an attribute'), and a clear scope ('across CityObjects'), which distinguishes it from sibling mutation tools like cityjson_attribute_remove. Despite the title being similar, the description adds operational specificity.

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

Usage Guidelines3/5

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

It implies the tool should be used when renaming an attribute across CityObjects, but it does not explicitly state when to use it versus alternatives such as cityjson_attribute_remove, nor does it mention any prerequisites or exclusions. The usage context is present but not explicit.

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

cityjson_backend_statusCityJSON backend statusA

Check which external CityJSON/CityGML engines are installed and callable. Run this first when a backend-dependent operation fails.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the burden of explaining behavior. It states that the tool checks installation and callability, which is useful, but it does not disclose output format, possible side effects, or whether external processes are invoked. This is acceptable for a simple status check but not fully transparent.

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

Conciseness5/5

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

Two short, purposeful sentences with no wasted words. The key action is front-loaded and the usage recommendation follows naturally.

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

Completeness4/5

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

For a zero-parameter diagnostic tool, the description covers what the tool does and when to run it. It does not specify the return value format, but the intent is clear enough; a brief note on output would make it fully complete.

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

Parameters4/5

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

The tool has zero parameters, so there is nothing for the description to add about parameter meaning. The baseline of 4 applies because no parameter documentation burden exists.

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

Purpose5/5

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

The description uses a specific verb ('Check') and names a specific resource ('external CityJSON/CityGML engines installed and callable'), clearly distinguishing this diagnostic tool from the many file-operation siblings. It also frames the tool's role relative to backend-dependent failures.

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

Usage Guidelines4/5

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

It explicitly tells the agent when to run this tool: 'Run this first when a backend-dependent operation fails.' It does not mention exclusions or alternatives, but there are no obvious status-check siblings, so the guidance is clear and actionable.

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

cityjson_clean_verticesClean CityJSON verticesA

Remove duplicate and orphan vertices with cjio vertices_clean. Returns a new dataset_id.

NameRequiredDescriptionDefault
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses that the tool removes vertices and returns a new dataset_id, which is helpful, but it does not explicitly address whether the input dataset is modified, deleted, or left intact. The phrase 'Returns a new dataset_id' suggests a new result, but side effects remain implicit.

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

Conciseness5/5

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

Two short sentences, action first, return value second, with no filler. The reference to cjio vertices_clean is relevant because it identifies the implementation and adds useful context without bloat.

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

Completeness4/5

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

For a tool with only one required parameter and no output schema, this is nearly complete: the input contract is defined by the schema and the return contract is stated in the description. The main missing piece is explicit input-dataset side-effect disclosure, but the operation's simplicity mitigates the gap.

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

Parameters3/5

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

The single parameter dataset_id is fully documented in the schema (100% coverage), so the description does not need to compensate. It adds no extra parameter-specific meaning beyond the schema, matching the baseline.

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

Purpose5/5

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

The description uses a specific verb ('Remove') and a concrete resource ('duplicate and orphan vertices'), and names the backend operation ('cjio vertices_clean'). This makes the tool's function unmistakable and clearly differentiates it from siblings like cityjson_filter_lod or cityjson_attribute_remove.

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

Usage Guidelines3/5

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

The description implies usage for cleaning vertices, but it does not explicitly state when to choose this tool over alternatives or point to any sibling tools. It leaves the selection criteria entirely to the agent's inference.

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

cityjson_db_exportExport CityJSON from cjdbA

Export all objects or a read-only SELECT-defined subset from cjdb to CityJSONSeq and optionally collect it into a normal CityJSON dataset handle.

NameRequiredDescriptionDefault
queryNoOptional SELECT query that returns object_id rows. Mutating SQL and semicolons are rejected.
collectNo
connectionYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations to lean on, the description carries the full transparency burden and does a good job. It discloses that the operation is read-only via 'read-only SELECT-defined subset', and the schema further reinforces this by stating mutating SQL and semicolons are rejected. It also reveals the optional collection behavior and output as a 'CityJSON dataset handle'. This goes beyond merely stating the action, though it could additionally clarify that the export does not modify the database or describe error/edge-case behavior.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that leads with the core action and primary purpose, then appends the optional behavior. Every phrase earns its place: 'all objects or a read-only SELECT-defined subset' defines scope, 'from cjdb to CityJSONSeq' defines boundaries, and 'optionally collect...handle' defines the output mode. There is no padding, repetition, or irrelevant detail.

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

Completeness3/5

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

Given moderate complexity (a nested connection object, three parameters, and no output schema), the description gives a good overview but leaves the agent without important operational details. It does not explain what the returned 'handle' actually is, how connection credentials are used, or what happens when 'query' is omitted (though 'all objects' implies default). Since there are no annotations or output schema, these gaps are more consequential, placing it at an adequate but incomplete level.

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

Parameters3/5

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

Schema description coverage is only 33% (only 'query' gets description text), and the overall description partially compensates by explaining that the 'query' parameter selects an object_id subset and 'collect' toggles between CityJSONSeq and a normal CityJSON dataset handle. However, the 'connection' nested object remains undocumented in both the schema and description, and the description does not explain the all-objects default behavior with the same explicitness. It adds meaningful context for query/collect but leaves the most complex parameter underserved.

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

Purpose5/5

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

The description clearly states a specific verb ('Export'), a precise source ('from cjdb'), and an output format ('to CityJSONSeq'), distinguishing it from sibling export tools like cityjson_export by emphasizing the database origin. It also names the two operational modes: all objects or a SELECT-defined subset, and the optional collection behavior, leaving no ambiguity about the tool's core function.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool: exporting either the entire cjdb content or a subset specified by a read-only SELECT query. It also explains the optional 'collect' behavior that changes the output form. However, it does not explicitly contrast this tool with alternatives such as cityjson_export or cityjson_db_import, so it stops short of full when-to-use vs when-not guidance.

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

cityjson_db_importImport CityJSON into cjdbB

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.

NameRequiredDescriptionDefault
connectionYes
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.
attribute_indexesNo
partial_attribute_indexesNo

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. It usefully discloses that the tool converts to CityJSONSeq with cjio, imports via cjdb, and requires PGPASSWORD rather than a password argument. However, it does not disclose side effects on the database, such as whether existing tables are overwritten, whether the schema is created, or what the tool returns.

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

Conciseness5/5

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

Two sentences, front-loaded with the main action and the operational security requirement. There is no fluff or redundant restatement. Every sentence contributes necessary information.

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

Completeness2/5

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

This is a database import operation with no annotations, no output schema, and incomplete parameter documentation. The description omits important context such as the meaning of attribute indexes, what happens on conflicts, whether the operation is idempotent, and what the success or failure response looks like. It is not complete enough for an agent to invoke the tool confidently in all realistic cases.

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

Parameters2/5

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

Schema description coverage is only 25%, with only dataset_id documented. The description does not explain the connection object fields, attribute_indexes, or partial_attribute_indexes beyond the schema's minimal structure. It adds the PGPASSWORD context, but that does not compensate for the lack of meaning for most parameters.

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

Purpose4/5

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

The description clearly states the action: convert the dataset to CityJSONSeq with cjio and import it into PostgreSQL/PostGIS using cjdb. This gives a specific verb, resource, and target database. It does not explicitly name sibling alternatives like cityjson_db_export, but the import direction is clear enough to distinguish it from export-related tools.

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

Usage Guidelines3/5

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

The description implies the tool is used when a dataset should be loaded into a PostgreSQL/PostGIS database. It also gives a prerequisite: the PostgreSQL password is supplied via PGPASSWORD. However, it does not explicitly state when to use this tool over alternatives, such as cityjson_db_export or other transformation tools.

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

cityjson_downloadDownload CityJSON contentA

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.

NameRequiredDescriptionDefault
filenameNoOptional suggested download filename.
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. It discloses useful context: web-host streaming vs. standalone embedded resource, and the inline-size limit. It does not mention side effects, prerequisites, or error behavior, but the core delivery behavior is explained.

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

Conciseness5/5

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

Two sentences with no filler. The main purpose is front-loaded, and the delivery-mode relationship is stated compactly in the second sentence. Every clause contributes useful information.

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

Completeness4/5

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

Because there is no output schema, the description wisely explains the return mechanism for both web-host and standalone clients, including the inline-size cap. It does not cover failure handling when the limit is exceeded, but for a two-parameter tool with a clear core flow, the description is largely complete.

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

Parameters3/5

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

The input schema already documents both parameters, with 100% coverage and clear descriptions for dataset_id and filename. The description adds no parameter-specific meaning beyond restating that the dataset is opened or transformed.

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

Purpose4/5

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

The description identifies a specific action ('Prepare ... for download') and the resource ('an opened or transformed dataset'), which is clear. It does not explicitly distinguish this from related siblings like cityjson_export or cityjson_save, but the delivery-mode detail provides enough differentiation.

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

Usage Guidelines3/5

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

The phrase 'opened or transformed dataset' implies the tool is used after an import or transformation step. It does not state when to prefer this tool over export/save alternatives or provide exclusions, so usage guidance is only implied rather than explicit.

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

cityjson_exportExport CityJSONB

Export an opened CityJSON dataset with cjio to jsonl, obj, stl, glb or b3dm.

NameRequiredDescriptionDefault
formatYes
sloppyNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.
destinationYes

TDQS

B3.3/5.0
Behavior2/5

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

There are no annotations, so the description must carry the behavioral disclosure burden. It only restates the export action and target formats; it doesnot disclose whether files are written to the destination, whether existing outputs are overwritten, whether the source dataset is moutated, or how the 'slopy' flag changes behavior.

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

Conciseness5/5

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

Single sentence, no fluff, core information front-loaded. It is easy to scan and contains no redundant clauses.

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

Completeness2/5

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

For a tool with no annotations, no output schema, and two ambiguous parameters ('destination' and 'sloppy'), the definition is too minimal. An agent cannot reliably infer how to provide the destination or what behavior 'sloppy' toggles during export.

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

Parameters2/5

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

With only 25% schema description coverage, the description must compensate for undocumented parameters. It implicitly covers 'format' by listing output formats, but it adds nothing about 'destination' semantics or 'sloppy' behavior, both of which the schema also leaves undocumented.

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

Purpose5/5

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

States a specific verb ('Export'), a specific resource ('an opened CityJSON dataset'), and the exact set of output formats (jsonl, obj, stl, glb, b3dm). This clearly differentiates it from transformation, validation, and broader save tools in the sibling list.

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

Usage Guidelines3/5

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

The phrase 'opened CityJSON dataset' implies the tool should be used after an import/open operation, and the format list clues the intended use. However, it never explicitly says when to choose this over export-related siblings such as cityjson_db_export or the save tool, and it does not mention exclusions or prerequisites.

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

cityjson_extension_schemaRead a CityJSON Extension schemaB

Fetch a registered CityJSON Extension schema from the canonical cityjson.github.io registry URL.

NameRequiredDescriptionDefault
nameYes
versionYes

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are present, so the description carries the burden. The phrase 'Fetch ... from the canonical ... URL' conveys a read-only remote retrieval and identifies the source. It doesnot, however, disclose behavior on invalid versions, missing extensions, or the exact returned representation, which would make the behavior more transparent.

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

Conciseness5/5

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

The description is a single, focused sentence with no filler. The action and target are front-loaded, and the canonical URL is supplied as useful context without excess detail.

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

Completeness3/5

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

This is a low-complexity retrieval tool, and the required parameters and their formats are fully specified by the input schema. However, with no annotations and no output schema, the description is missing explicit return-value or error behavior guidance, so an agent must infer what the tool returns and how failures are signaled.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain the semantics of 'name' or 'version'. The parameter names are self-explanatory and the JSON Schema patterns define valid formats, but the tool description itself adds no meaning beyond what the schema already provides.

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

Purpose4/5

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

The description identifies a specific verb+resource: fetching a registered CityJSON Extension schema from the canonical registry URL. The title and description align, and the resource is concrete enough to distinguish this from most sibling tools. However, it does not explicitly contrast itself with cityjson_extensions_registry, which is the closest sibling for registry operations.

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

Usage Guidelines3/5

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

The canonical registry URL and 'registered Extension schema' imply that this tool should be used when an agent needs a specific schema by name and version. There is no explicit statement about when to prefer cityjson_extensions_registry or other schema-related tools, nor any exclusionary guidance, so the usage context is implied rather than explicit.

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

cityjson_extensions_registryBrowse CityJSON Extensions registryC

Fetch the official CityJSON Extensions registry and optionally return context around a search term.

NameRequiredDescriptionDefault
queryNo
max_charsNo

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the behavioral disclosure burden. It states 'Fetch' (suggesting a read operation) but does not describe output format, truncation behavior, registry size, rate limits, or any side effects. The max_chars parameter hints at length control, but the description does not explain how the tool behaves around it.

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

Conciseness4/5

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

The description is a single sentence with no filler, and it front-loads the core purpose. It is efficient for a simple fetch tool, though the optional clause could be slightly more precise about what 'context' means.

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

Completeness2/5

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

For a tool with no output schema and no annotations, the description should explain what the response contains and how the parameters affect it. It does not mention the output type, what the returned context looks like, or how max_chars caps the result, leaving important details for the agent to discover.

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

Parameters2/5

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

Schema description coverage is 0%, so the description needs to compensate for documenting parameters. It only partially covers 'query' by referring to 'a search term,' but max_chars is completely unexplained. The description adds minimal meaning beyond the schema's raw property names.

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

Purpose4/5

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

The description has a specific verb ('Fetch') and a clear resource ('official CityJSON Extensions registry'), and the optional search-term context clarifies a distinct feature. However, it does not explicitly contrast with sibling tools like cityjson_extension_schema, so differentiation relies on inference.

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

Usage Guidelines2/5

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

The description implies the tool is for browsing the registry and optionally searching within it, but it gives no explicit guidance about when to use this tool versus alternatives. There is no mention of when not to use it or how it relates to sibling registry/extension tools.

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

cityjson_filter_lodFilter CityJSON LoDA

Keep only one level of detail using cjio lod_filter. Returns a new dataset_id.

NameRequiredDescriptionDefault
lodYes
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It does disclose that the output is a new dataset_id and that the operation keeps only one LoD, which implies the dropped LoDs are not retained in the result. However, it does not state whether the original dataset is mutated, whether it remains available, or whether the operation is reversible.

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

Conciseness5/5

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

Two short sentences with no filler or repetition. The action is front-loaded, the implementation is named, and the return behavior is stated. Every sentence earns its place.

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

Completeness3/5

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

The tool is simple and the description covers the core purpose and output, but there are meaningful gaps: lod value semantics are not specified, there is no mention of side effects on the input dataset, and no output schema exists to clarify what the new dataset_id represents. Overall this is adequate but incomplete for fully reliable invocation.

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

Parameters2/5

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

Schema description coverage is 50%: dataset_id is documented, but lod has no description. The tool description adds little beyond restating that lod refers to 'one level of detail', which is already implied by the tool name. It does not provide acceptable formats, examples, or allowed LoD values, so an agent may not know whether to pass '1', '2', '1.2', or another representation.

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

Purpose5/5

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

States a specific action ('Keep only one level of detail') on a CityJSON dataset and names the underlying cjio lod_filter operation. This clearly distinguishes it from sibling tools like cityjson_subset or cityjson_attribute_remove, which perform different transformations. The return statement also clarifies that this is a filtering step producing a new dataset handle.

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

Usage Guidelines3/5

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

The description implies when to use the tool: when a CityJSON dataset should be reduced to a single level of detail. However, it provides no explicit when-not-to-use guidance and does not mention alternatives, such as cityjson_subset or other transform tools. The usage context is interpretable but not directly stated.

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

cityjson_get_objectGet CityObjectB

Return one complete CityObject and a computed real-world bounding box derived from referenced vertices.

NameRequiredDescriptionDefault
object_idYes
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose a useful behavioral detail: the bounding box is computed from referenced vertices, and 'Return' implies a read-only operation. However, it does not describe error behavior for missing/invalid object IDs, response format, or whether any dataset state is affected.

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

Conciseness5/5

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

A single sentence that is direct and front-loaded, with no unnecessary words. It conveys the core action and a key output detail efficiently.

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

Completeness3/5

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

The description covers the main output (complete CityObject and bounding box), and the schema provides dataset_id context. But with no output schema and no annotations, it lacks details on error cases, object_id provenance, and return structure beyond the high-level summary.

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

Parameters2/5

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

Schema description coverage is only 50%: dataset_id is explained, but object_id is only given a type and minLength. The description does not compensate by explaining what object_id represents, how it is formatted, or how to discover valid IDs.

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

Purpose5/5

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

The description states a specific action ('Return') and resource ('one complete CityObject'), and adds a distinctive output detail ('computed real-world bounding box derived from referenced vertices'). This clearly distinguishes it from sibling list/query operations that operate on many objects.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives such as cityjson_list_objects or cityjson_query. It does not mention prerequisites, such as obtaining a valid object_id from another tool, nor when a different tool should be preferred.

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

cityjson_importImport CityJSON from the input inboxA

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.

NameRequiredDescriptionDefault
filenameNoFilename shown by cityjson_list_imports or supplied by the chat application attachment metadata.

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses that the result is an immutable dataset handle and that import succeeds only if the inbox contains exactly one JSON file when filename is omitted. This adds meaningful behavior beyond the schema, though it does not cover error cases or persistence details.

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

Conciseness5/5

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

Three sentences, zero filler, and the most important constraint (filename only, no path) is front-loaded. Every sentence earns its place.

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

Completeness4/5

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

For a tool with one optional parameter, no annotations, and no output schema, the description covers the input source, parameter constraint, omission behavior, and return type. It is not exhaustive about failure modes or the handle format, but it is sufficient for correct invocation in most cases.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds important parameter semantics beyond the schema: never pass an absolute path, and the behavior when filename is omitted. This meaningfully disambiguates the single optional parameter.

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

Purpose5/5

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

The description states a specific verb ('Import'), a precise resource ('a CityJSON file already placed in the configured input inbox'), and an explicit outcome ('return an immutable dataset handle'). It also contrasts with the sibling cityjson_list_imports and cityjson_import_text by anchoring on the inbox source, so the agent can distinguish it from related tools.

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

Usage Guidelines4/5

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

The description gives clear context: the file must already be in the inbox, and the filename must be passed rather than an absolute path. It also explains the ambiguity condition when filename is omitted. It does not explicitly name alternatives or state when not to use this tool, but the intended usage is unmistakable.

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

cityjson_import_textImport a small CityJSON text documentA

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.

NameRequiredDescriptionDefault
contentYesComplete UTF-8 CityJSON document as JSON text.
filenameNoDisplay filename used for the managed workspace copy.import.city.json

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It adds a useful behavioral constraint: the complete JSON travels through the MCP request, explaining the size limit. However, it does not describe side effects, return value, or error behavior, so the disclosure is only partial.

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

Conciseness5/5

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

Two concise, front-loaded sentences. The first sentence states the scope and limitation; the second gives the alternative. No waste, and the key warning is placed first.

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

Completeness4/5

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

For a low-complexity tool with two well-described parameters and no output schema, the description is sufficient to guide correct invocation: it covers the use case, size constraint, and preferred sibling. It omits return/result details, but not enough to degrade confident calling.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description adds the transport-related constraint relevant to the content parameter, but does not add meaning beyond what the schema already provides for either parameter.

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

Purpose5/5

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

The description clearly states the tool's purpose: importing small, programmatically supplied CityJSON documents as a fallback. It specifically distinguishes itself from the main cityjson_import sibling by naming the alternative and the condition that selects it.

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

Usage Guidelines5/5

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

Explicitly says when to use this tool ('small programmatically supplied CityJSON documents only'), when not to use it ('normal chat attachments or large models'), and names the alternative (cityjson_import instead).

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

cityjson_infoInspect CityJSONA

Return metadata, object counts, types, LoDs, attribute names, transform and extensions for an opened dataset.

NameRequiredDescriptionDefault
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It clearly describes the read-only nature by saying 'Return', and it enumerates the output categories, which goes beyond the title. However, it does not disclose error behavior for invalid dataset_ids, whether the dataset is modified, or any restrictions on when the information is available.

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

Conciseness5/5

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

Single sentence, no fluff, enumerates the exact kinds of information returned. The key verb and resource are at the beginning, making the purpose immediately clear.

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

Completeness4/5

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

The schema plus description fully covers how to invoke the tool (dataset_id) and what to expect (metadata, counts, types, LoDs, attributes, transform, extensions). No output schema exists, but the description gives a comprehensive preview of return contents. Minor gaps include error conditions and exact return structure, but these do not prevent correct selection or invocation.

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

Parameters3/5

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

The schema description for dataset_id is thorough, specifying that it is a handle returned by specific tools, so schema coverage is 100%. The tool description doesn't add much parameter-level meaning, but it does not need to because the schema already documents the single parameter clearly.

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

Purpose5/5

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

The description uses a specific verb with a clear resource: 'Return metadata, object counts, types, LoDs, attribute names, transform and extensions for an opened dataset.' This distinguishes it from sibling tools like cityjson_list_objects or cityjson_get_object, which operate on individual objects rather than providing a dataset-level summary.

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

Usage Guidelines3/5

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

The phrase 'for an opened dataset' implies the tool should be used after cityjson_open or cityjson_import, but it does not explicitly state when to prefer this over alternatives like cityjson_list_objects or cityjson_query. There are no specific exclusion criteria or comparisons to sibling tools.

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

cityjson_list_importsList CityJSON input filesA

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden, and it does disclose what the tool returns: 'Returns filenames only.' It alsotells the agent to never ask for an absolute path, which is useful interaction behavior. It could go slightly further by noting side-effect-free behavior, but the word 'list' plus the return statement make the safety profile reasonably clear.

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

Conciseness5/5

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

Two short sentences, with the core purpose first, then usage conditions, then a user-interaction constraint. Every sentence adds value; there is no boilerplate or redundant text.

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

Completeness5/5

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

For an zero-parameter list tool with no output schema, this description is complete: it specifies the source (configured input inbox), the scope (JSON files), the return content (filenames only), the trigger conditions, and an explicit interaction constraint. Nothing critical is missing for an agent to select and invoke it correctly.

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

Parameters4/5

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

The tool has zero parameters, and the input schema is an empty object, so the schema fully covers the parameter surface. The description appropriately adds no unnecessary paramter detail; the baseline of 4 for a zero-parameter tool applies.

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

Purpose5/5

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

The description states a specific verb and resource: 'List JSON files in the configured input inbox.' This clearly distinguishes the tool from siblings like cityjson_open or cityjson_import by indicating it is a listing operation over the input inbox, not an open/import action.

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

Usage Guidelines5/5

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

It explicitly says when to use the tool: 'when the user did not name an attached/imported file or when cityjson_import reports multiple candidates.' It also instructs against asking for absolute paths, giving the agent clear behavioral guardrails. This is strong usage guidance for a simple listing tool.

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

cityjson_list_objectsList CityObjectsB

List CityObjects with IDs, types, selected attributes and LoDs. Supports filtering by CityObject type and pagination.

NameRequiredDescriptionDefault
limitNo
typesNo
offsetNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It disclosees output contents and mentions filtering and pagination, which is useful. However, it does not clarify what 'selected attributes' means, how pagination results are returned, or any other behavioral constraints such as limits or read-only implications.

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

Conciseness5/5

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

The description is a single concise sentence with no filler. The main action and output contents are front-loaded, and the filtering/pagination capabilities follow efficiently. Every phrase earns its place.

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

Completeness4/5

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

For a listing tool with no output schema, the description provides a reasonable summary of what will be returned and which capabilities are available. It is slightly incomplete because 'selected attributes' is vague and there is no statement about response shape or dataset prerequisites beyond the schema, but the core calling context is present.

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

Parameters3/5

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

Schema description coverage is only 25% (dataset_id only). The description compensates somewhat by referenceing filtering by CityObject type and pagination, which map to the 'types', 'limit', and 'offset' parameters. However, it does not explicitly define each parameter's behavior or add meaningful detail beyond the schema, leaving coverage incomplete.

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

Purpose4/5

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

The description clearly states a specific action ('List') and resource ('CityObjects'), and enumerates the returned fields (IDs, types, selected attributes, LoDs). Naming 'CityObjects' and supporting filtering/pagination is clear, but it does not explicitly distinguish itself from siblings like cityjson_get_object or cityjson_query, 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.

Usage Guidelines2/5

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

The description tells the agent the tool lists CityObjects, but gives no guidance on when to prefer it over alternatives such as cityjson_get_object, cityjson_query, or cityjson_info. No when-to-use / when-not-to-use or alternative routing is provided.

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

cityjson_mergeMerge CityJSON datasetsA

Merge two or more opened CityJSON datasets with cjio. Returns a new dataset_id.

NameRequiredDescriptionDefault
dataset_idsYes

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavior. It only says a new dataset_id is returned; it does not state whether the input datasets are mutated or remain open, whether merging requires compatible CRs/schemata, or whether the operation has side effects. For a transformation tool, these are material gaps.

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

Conciseness5/5

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

Two short sentences with no redundancy. The operation is front-loaded and the return value is stated clearly. Every phrase contributes to the tool's selection and invocation.

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

Completeness4/5

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

For a single-parameter tool with no annotations and no output schema, the description covers the core operation, the input princile, and the return value as a new dataset_id. It does not exhaustively describe merge semantics or error conditions, but an agent has enough information to call it correctly.

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

Parameters3/5

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

Schema description coverage is 0%, so the description carries more responsibility. It partially compensates by indicating the inputs are 'opened CityJSON datasets' and 'two or more', which maps to the dataset_ids array and minItems=2, but it does not explain that entries must be dataset handle strings. That detail only lives in the schema's item description.

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

Purpose5/5

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

Description uses a specific verb 'Merge' on a specific resource 'CityJSON datasets', with a clear input condition ('opened') and method ('with cjio'). The sibling list contains no other merge-like tool, so the agent can distinguish this operation from alternatives.

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

Usage Guidelines4/5

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

The phrase 'opened CityJSON datasets' clearly indicates datasets must already be loaded/open, and 'two or more' sets the cardinality condition. It does not explicitly mention alternatives or exclusions, but the context is unambiguous enough for selection.

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

cityjson_openOpen CityJSON from a Docker mountA

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.

NameRequiredDescriptionDefault
sourceYesFull server-visible path inside an allowed root. This cannot be a path from a chat attachment.

TDQS

A3.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden. It mentions constraints like allowed root and chat attachment exclusion, but does not disclose side effects, whether the file becomes active state, what happens on success, or error behavior. 'Open' is ambiguous regarding its lasting impact.

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

Conciseness5/5

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

Two sentences, no fluff, with the core purpose and the key constraint front-loaded. The alternative is stated efficiently without repetition.

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

Completeness3/5

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

For a one-parameter tool with no output schema and no annotations, the description is mostly adequate but leaves open what happens after opening and how the resulting file is used by later tools. It also does not explain the allowed-root concept further. It is usable but not fully self-sufficient.

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

Parameters3/5

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

There is only one parameter and the schema already documents it fully (full server-visible path, not a chat attachment). The description mirrors that and adds the advanced/conventional framing, but no new parameter-level details.

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

Purpose5/5

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

Clearly states the operation: opening a CityJSON file by a full server-visible path within an allowed root. It also distinguishes itself from cityjson_import, which uses a filename for inbox files.

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

Usage Guidelines5/5

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

Explicitly says when to use this tool (advanced path-based access inside allowed root) and when to use the alternative (cityjson_import for files in the input inbox). This provides strong routing guidance.

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

cityjson_queryQuery CityObjectsB

Query CityObjects natively by IDs, types, 2D bbox and attribute predicates. Attribute predicates support eq, neq, gt, gte, lt, lte, contains and in.

NameRequiredDescriptionDefault
idsNo
bboxNo2D bbox [minX, minY, maxX, maxY] in the dataset CRS.
limitNo
typesNo
offsetNo
attributesNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral burden. It helpfully discloses the supported attribute predicate operators (eq, neq, gt, gte, lt, lte, contains, in) and that thebbox is 2D. However, it does not disclose return shape, pagination behavior, how multiple predicates combine, or whether this is a read-only operation beyond what 'Query' implies.

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

Conciseness5/5

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

The description is concise and well-structured: one sentence states the purpose and filter capabilities, and the second sentence lists the supported predicate operators. There is no filler or redundant information.

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

Completeness3/5

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

Given the tool has 7 parameters, no annotations, and no output schema, the description is minimally adequate but not complete. It explains the main query dimensions but omits attribute predicate object syntax, pagination semantics, how criteria are combined, and what the result contains, which an agent would need for reliable use.

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

Parameters3/5

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

Schema description coverage is only 29%, so the description must compensate. It maps the main params (ids, types, bbox, attributes) to filter categories and documents supported operators, which adds real value. However, it does not explain how attribute predicates are structured as an object or clarify the limit/offset parameters, leaving important gaps for correct invocation.

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

Purpose4/5

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

The description clearly states the operation ('Query CityObjects') and enumerates the query dimensions: IDs, types, 2D bbox, and attribute predicates. It is specific enough to understand the core function, though it does not explicitly distinguish it from closely related siblings such as cityjson_list_objects or cityjson_get_object.

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

Usage Guidelines2/5

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

No explicit guidance is given about when to use this tool versus alternatives. The description implies that it should be used for filtering CityObjects by the listed criteria, but it does not state exclusionary conditions or name sibling tools that might be more appropriate for listing all objects, fetching a single object, or subsetting.

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

cityjson_remove_materialsRemove CityJSON materialsB

Remove all materials with cjio. Returns a new dataset_id.

NameRequiredDescriptionDefault
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does reveal that a new dataset_id is returned, which is useful, but it does not state whether the original dataset is modified, whether the operation is destructive, or what side effects removing all materials may have.

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

Conciseness5/5

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

The description is two short sentences with the core action first and the return value second. Every sentence earns its place, and there is no filler.

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

Completeness3/5

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

For a one-parameter transformation tool with no annotations and no output schema, this description is minimally sufficient: it tells the agent what is removed and that a new dataset_id is returned. However, it lacks side-effect information and usage context, so it is not fully complete for confident selection among the many transformation siblings.

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

Parameters3/5

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

Schedule coverage is 100%, and the dataset_id parameter is already described in the schema as a dataset handle from previous import/open/transformation tools. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description uses a specific verb ('Remove') and a specific resource ('all materials'), and it names the implementation ('cjio'). It is clear enough to be distinguished from the similar sibling cityjson_remove_textures, though it does not explicitly contrast the two.

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

Usage Guidelines2/5

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

The description provides no guidance about when to use this tool versus alternatives such as cityjson_remove_textures or other transformation tools. It states only the operation itself, leaving usage conditions to inference.

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

cityjson_remove_texturesRemove CityJSON texturesB

Remove all textures with cjio. Returns a new dataset_id.

NameRequiredDescriptionDefault
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It states the core effect and that a new dataset_id is returned, but does not disclose whether the original dataset is modified, whether removal is irreversible, or any side effects.

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

Conciseness4/5

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

The description is short and front-loaded with the key operation. The phrase 'with cjio' adds marginal value, but otherwise there is no wasted text.

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

Completeness3/5

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

For a simple one-parameter tool, the description covers the operation and the return value. However, with no annotations, no output schema, and no mention of side effects or alternatives, it remains minimally adequate rather than complete.

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

Parameters3/5

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

Schema description coverage is 100% and the only parameter, dataset_id, is clearly documented in the schema. The description adds no parameter detail, but the baseline of 3 applies because the schema already handles the semantics.

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

Purpose5/5

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

The description states a specific verb and resource: 'Remove all textures'. This clearly identifies what the tool does and is enough to distinguish it from siblings like cityjson_remove_materials.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus alternatives. It does not mention cityjson_remove_materials, clean transformations, or any when-to-use/when-not-to-use context.

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

cityjson_reprojectReproject CityJSONB

Reproject coordinates to a target EPSG CRS with cjio. The source dataset must already define a CRS. Returns a new dataset_id.

NameRequiredDescriptionDefault
epsgYes
digitNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that the operation uses cjio, requires an existing CRS, and returns a new dataset_id, which communicates the non-in-place nature of the result. However, it does not mention whether the original dataset is modified, how the optional 'digit' affects transformation, or failure behavior if the source lacks a CRS.

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

Conciseness5/5

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

Three concise sentences with no filler: the operation, the key prerequisite, and the result type. Information is front-loaded and each sentence serves a distinct purpose.

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

Completeness2/5

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

For a transformation tool with no annotations and no output schema, the description is missing meaningful context about the 'digit' parameter, side effects on the source dataset, and possible error conditions. The included return value and prerequisite are useful but insufficient for an agent to fully understand the tool's behavior.

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

Parameters2/5

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

Schema description coverage is only 33%; only dataset_id has a schema description. The description helps with 'epsg' by stating 'target EPSG CRS', but provides no information about the 'digit' parameter, leaving its purpose ambiguous. It does not compensate enough for the low schema coverage.

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

Purpose4/5

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

The description uses a specific verb ('Reproject') and names the target resource ('coordinates to a target EPSG CRS'), making the operation clear. It implies a distinction from assign_crs by requiring the source to already define a CRS, but does not explicitly name sibling alternatives.

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

Usage Guidelines4/5

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

The statement 'The source dataset must already define a CRS' provides an explicit prerequisite, helping an agent decide when this tool is appropriate. It lacks explicit 'when not to use' alternatives, but the prerequisite offers clear contextual guidance.

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

cityjson_saveSave CityJSONC

Copy an opened/derived CityJSON dataset to an explicit destination path.

NameRequiredDescriptionDefault
overwriteNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.
destinationYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the behavioral disclosure burden. It only says 'Copy' to a destination path and gives no information about overwrite behavior, side effects on the original dataset, error conditions, or what happens to associated resources like textures and materials.

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

Conciseness4/5

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

The description is a single, front-loaded sentence with no filler or redundancy. It earns its place by giving the core operation and object, though it is concise at the expense of needed behavioral detail.

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

Completeness2/5

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

For a mutation-like save operation with no annotations, no output schema, and low parameter coverage, this description is too thin. It omits overwrite semantics, expected destination path format, and what the tool returns or confirms after saving, leaving an agent without enough context to invoke it confidently.

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

Parameters2/5

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

Schema description coverage is only 33%, and the description does not compensate. It hints at the destination parameter via 'destination path' and at the dataset_id via 'opened/derived dataset', but the overwrite parameter is completely unexplained, and destination lacks any semantic detail beyond its name.

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

Purpose4/5

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

The description clearly states the operation ('Copy') and target resource ('opened/derived CityJSON dataset') with an explicit outcome ('destination path'). It is specific enough to distinguish this from import/download/export siblings, though it does not explicitly name a differentiating alternative.

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

Usage Guidelines3/5

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

The phrase 'opened/derived' implies the tool applies to datasets already loaded or produced by other tools, offering some usage context. However, there is no explicit guidance about when not to use it or how it compares to alternatives like cityjson_export or cityjson_download.

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

cityjson_schema_readRead CityJSON JSON SchemaA

Fetch one canonical CityJSON 2.0.2 JSON Schema by name.

NameRequiredDescriptionDefault
nameNocityjson.schema.json

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. The verb 'Fetch' clearly indicates a read-only retrieval operation, and 'canonical ... JSON Schema' identifies the domain. It does not describe the response shape, error behavior, or whether the raw JSON is returned directly, but these are low-risk details for a simple fetch.

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

Conciseness5/5

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

The description is a single, tightly worded sentence with no wasted content. It front-loads the action, resource, version, and selection method immediately.

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

Completeness4/5

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

For a one-parameter read tool with an enum and default in the schema, the description is mostly sufficient: it tells the agent what is fetched and how selection works. It lacks explicit return-value or usage-context details, and there is no output schema, but the low complexity makes this an acceptable gap.

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

Parameters3/5

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

Schema description coverage is 0%, and the description adds only 'by name', which is minimal. However, the single 'name' parameter is fully constrained by an enum and a default in the input schema, so the parameter is still unambiguous. The description adds modest context by framing these as canonical CityJSON 2.0.2 schemas, but does not explain how to choose among the enum values.

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

Purpose5/5

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

The description states a specific verb ('Fetch'), exact resource ('one canonical CityJSON 2.0.2 JSON Schema'), and selection mechanism ('by name'). The 'canonical' qualifier helps distinguish this from related schema or specification tools.

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

Usage Guidelines2/5

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

No explicit usage guidance is provided, and no alternative tools are named. The phrase 'canonical CityJSON 2.0.2' implies official schemas, but the agent is left to infer when to choose this over sibling tools like cityjson_extension_schema or cityjson_spec_read.

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

cityjson_spec_outlineCityJSON specification outlineA

Return the bundled outline and canonical URLs for the current CityJSON specification and schemas.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. 'Return' clearly signals a read-only information retrieval operation, and 'bundled' implies the data is local rather than fetched remotely. It identifies what is returned without detailing exact formatting, but for a zero-parameter informational tool that is sufficient.

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

Conciseness5/5

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

One sentence with no redundant phrasing; the verb and object are front-loaded so an agent immediately knows what the tool does. Every word earns its place.

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

Completeness4/5

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

Given the low complexity, zero parameters, no output schema, and no annotations, the description is nearly complete for safe invocation. It names both output components, outline and canonical URLs. A brief pointer to cityjson_spec_read for full content would improve context, but is not required for correct usage.

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

Parameters4/5

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

There are zero parameters, so the baseline is 4. The description does not need to explain parameter behavior, and the empty schema leaves nothing unknown for caller preparation.

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

Purpose5/5

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

States a specific verb ('Return') and a concrete resource: the bundled outline and canonical URLs for the current CityJSON specification and schemas. This is clearly distinct from siblings like cityjson_spec_read and cityjson_schema_read, which imply reading actual content rather than an outline and URLs.

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

Usage Guidelines3/5

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

The description implies a quick-reference retrieval use, but there is no explicit when/when-not guidance or mention of alternatives. An agent is not told to choose this over cityjson_spec_read or cityjson_schema_read, though the purpose makes the intended context reasonably inferable.

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

cityjson_spec_readRead CityJSON specificationA

Fetch the canonical CityJSON 2.0.2 living specification and return either the beginning or a context window around a search query.

NameRequiredDescriptionDefault
queryNo
max_charsNo

TDQS

A3.6/5.0
Behavior3/5

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

The description conveys a read-only operation and the conditional behavior based on whether a query is supplied. With no annotations and no output schema, though, it does not explain how max_chars affects the returned text, what format the text takes, or how the context window is determined.

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

Conciseness5/5

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

The description is a single front-loaded sentence with no filler. It efficiently covers the source, version, and two output modes without wasting words.

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

Completeness3/5

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

For a simple read tool this is mostly adequate, but it leaves gaps around max_chars semantics, output format, and how this relates to sibling spec tools. The absence of annotations and an output schema increases the burden on the description, and those gaps remain.

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

Parameters2/5

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

The query parameter gains some meaning from 'context window around a search query' and 'beginning' when absent. However, max_chars is not mentioned at all, and with 0% schema description coverage, the agent must infer its behavior solely from the parameter name and constraints.

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

Purpose5/5

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

The description states a specific action ('Fetch'), a specific resource ('canonical CityJSON 2.0.2 living specification'), and a clear output behavior (beginning or context window around a search query). This distinguishes it from sibling tools like cityjson_spec_outline and cityjson_schema_read, which target other spec artifacts.

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

Usage Guidelines3/5

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

The use case is implied: retrieve spec text, optionally near a search query. However, the description never states when to choose this over cityjson_spec_outline or cityjson_schema_read, and it provides no exclusions or alternative conditions.

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

cityjson_subsetCreate CityJSON subsetC

Create a derived CityJSON subset with cjio using IDs, bbox, radius, random count or CityObject types. Returns a new dataset_id.

NameRequiredDescriptionDefault
idsNo
bboxNo2D bbox [minX, minY, maxX, maxY] in the dataset CRS.
typesNo
radiusNo
randomNo
excludeNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description bears the full responsibility for behavioral disclosure. It says a new dataset_id is returned, which is useful, but it does not explain whether the original dataset is modified, whether subsetting is deterministic, whether method combos are allowed, or what side effects or prerequisites exist. For a transformation tool, this leaves important behavior unknown.

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

Conciseness4/5

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

The description is concise: two sentences with no filler. The main action and output are front-loaded, and the list of subsetting methods is easy to parse. It earns its place, though it sacrifices enough detail to cap the score below 5.

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

Completeness2/5

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

Given seven parameters, no output schema, no annotations, and low schema coverage, the description is too thin to fully enable correct invocation. It does not explain required dataset_id provenance, valid combinations of subsetting criteria, coordinate/reference constraints beyond bbox, or the exact meaning of 'exclude'. An agent would likely need trial and error or additional external knowledge.

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

Parameters2/5

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

Schema description coverage is only 29%, so the description must compensate for undocumented parameters. It does clarify that 'random' means random count and 'types' refers to CityObject types, and it names bbox, radius, and IDs. However, it never addresses the 'exclude' parameter, does not explain how criteria combine, and leaves parameter formatting/units to inference.

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

Purpose4/5

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

The description clearly states the tool creates a derived CityJSON subset and enumerates the selection methods: IDs, bbox, radius, random count, and CityObject types. It goes beyond the title by specifying the tool (cjio) and the output (new dataset_id), but does not explicitly differentiate it from sibling tools like cityjson_filter_lod or cityjson_query, which may also produce subsets.

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

Usage Guidelines3/5

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

The description implies usage for subsetting CityJSON data by several common criteria, giving an agent a reasonable sense of when to invoke it. However, it provides no explicit guidance about when not to use it or which sibling tool might be more appropriate for related tasks such as LOD filtering, querying, or exporting.

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

cityjson_to_citygmlConvert CityJSON to CityGMLA

Convert an opened CityJSON dataset to CityGML using citygml-tools. The installed citygml-tools version controls the default target encoding.

NameRequiredDescriptionDefault
crs_nameNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.
output_directoryNo

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It does add useful behavioral context: the conversion is delegated to 'citygml-tools' and the installed version influences the target encoding. However, it does not disclose whether the source dataset is modified, whether an output file is created, what happens in the output_directory, or what the tool returns.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the core conversion intent, and every sentence adds useful information. The second sentence about citygml-tools version and target encoding is relevant and non-redundant.

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

Completeness2/5

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

The description is not fully complete for an agent: there is no output schema, no annotations, and the description omits how optional parameters affect behavior, what the result of the conversion is, and how output is stored or returned. For a conversion tool with three parameters and no structured output metadata, this leaves significant gaps.

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

Parameters2/5

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

Schema description coverage is low: only dataset_id is described, while crs_name and output_directory have no schema descriptions. The tool description does not compensate by explaining these parameters, leaving their exact semantics ambiguous, especially crs_name.

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

Purpose5/5

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

The description states a specific action ('Convert'), the input ('an opened CityJSON dataset'), the output format ('CityGML'), and the implementation tool ('citygml-tools'). This clearly distinguishes it from the reverse sibling tool 'citygml_to_cityjson' and from import/export variants that do not perform this exact conversion.

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

Usage Guidelines4/5

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

The description clearly establishes the prerequisite that the dataset must already be opened/imported, which tells the agent when the tool is applicable. It does not explicitly mention alternative tools such as 'cityjson_export' or when not to use this tool, so it stops short of full routing guidance.

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

cityjson_translateTranslate CityJSON coordinatesB

Translate CityJSON coordinates with cjio. With minxyz, coordinates are shifted relative to the supplied minimum; without it cjio uses the model minimum.

NameRequiredDescriptionDefault
minxyzNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.1/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It does state that without minxyz jio falls back to the model minimum and with minxyz it shifts relative to the supplied minimum. However, it does not say whether the transformation modifies data in place, returns a new object, or affects the coordinate reference system, which are material for a transform tool.

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

Conciseness4/5

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

The description is two sentences with no filler, front-loading the main operation and then explaining the optional parameter's effect. The first sentence is somewhat redundant with the title, but the whole description remains efficiently sized.

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

Completeness2/5

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

For a transformation tool with no annotations and no output schema, the description leaves significant gaps: it does not state whether the dataset is modified in place or a new handle is returned, how this differs from reprojection/CRS assignment, or what success/errors look like. The algorithm is explained, but the operational context an agent needs is incomplete.

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

Parameters3/5

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

Schema coverage is only 50%; dataset_id is described in the schema, while minxyz is not. The description adds meaning to minxyz by explaining its role and the default when omitted. It does not detail the ordering or units of the three numbers, but the core semantic is conveyed.

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

Purpose4/5

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

The description identifies a concrete operation: translating CityJSON coordinates via cjio, with an explicit explanation of how minxyz affects the shift. Although it does not explicitly contrast with sibling tools like cityjson_reproject or cityjson_assign_crs, the phrase 'shifted relative to the supplied minimum' makes the coordinate-translation intent clear.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool instead of the many sibling transformation tools, nor any mention of alternatives or excluded cases. The description only explains the behavior with and without minxyz, which is parameter guidance rather than tool-selection guidance.

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

cityjson_triangulateTriangulate CityJSONB

Triangulate surfaces with cjio. Use sloppy=true only when the robust triangulator fails.

NameRequiredDescriptionDefault
sloppyNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It reveals that the default is a 'robust triangulator' and sloppy is a fallback, but it does not disclose whether the dataset is modified in place, what is returned, what failure modes exist, or any side effects.

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

Conciseness5/5

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

Two short sentences with no filler. The first states the tool's purpose, and the second gives conditional parameter guidance. Every sentence earns its place.

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

Completeness2/5

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

With no annotations and no output schema, the description is too thin. It does not explain the return value, whether the operation mutates the input dataset, or how the result fits into the broader cityjson workflow, leaving an agent without enough information to predict the outcome of invocation.

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

Parameters4/5

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

Schema description coverage is only 50%, but the description compensates for the undocumented sloppy parameter by explaining that it should only be used when the robust triangulator fails. dataset_id is already well-described in the schema with its valid sources.

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

Purpose4/5

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

The description states a specific verb and resource: 'Triangulate surfaces with cjio.' This clearly differentiates the action from related tools such as cityjson_clean_vertices or cityjson_reproject, but it does not explicitly contrast it with any sibling.

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

Usage Guidelines3/5

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

The description implies use when a CityJSON dataset's surfaces need triangulation and gives explicit guidance about when to set sloppy=true. However, it does not state when not to use the tool, mention alternatives, or describe prerequisites beyond what the schema provides.

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

cityjson_upgradeUpgrade CityJSONB

Upgrade an older supported CityJSON file to the version supported by the installed cjio.

NameRequiredDescriptionDefault
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description bears full responsibility for disclosing behavior. It states the outcome but not whether the input dataset is modified in place, whether a new dataset handle is returned, whether the operation is reversible, or any side effects. This is a significant transparency gap for a transformation tool.

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

Conciseness5/5

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

One concise sentence that states the action, input, and target result with no filler. It is appropriately front-loaded and efficiently sized.

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

Completeness2/5

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

With no output schema and no annotations, the description should clarify the return value or mutation behavior of the upgrade operation. It does not explain what happens after upgrade, how the result is used, or whether the original dataset handle remains usable, leaving an agent uncertain in a processing pipeline.

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

Parameters3/5

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

Schema description coverage is 100% for the single parameter, so the schema already documents dataset_id. The tool description does not add additional parameter-level detail, but none is needed beyond the baseline.

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

Purpose5/5

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

The description uses a specific verb ('Upgrade') and resource ('older supported CityJSON file') and defines the target state ('version supported by the installed cjio'). This clearly distinguishes it from sibling transformation tools like translate or reproject, which do not perform version upgrades.

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

Usage Guidelines3/5

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

The intended use case is implied: use it when a CityJSON file is older than the version cjio supports. However, the description does not explicitly state when not to use it, how to detect whether an upgrade is needed, or mention any alternative approach.

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

cityjson_validateValidate CityJSON completelyA

Run cjval and val3dity and return one combined structural + geometric validation result. geometry.reportSummary contains the complete invalidObjectIds list for reliable follow-up subsets.

NameRequiredDescriptionDefault
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden, and it does so well: it names the two validators run, explains that the result is combined, and directs the agent to geometry.reportSummary for the complete invalidObjectIds list. It stops short of explicitly stating whether the operation is read-only or what other result fields exist, but the core behavior is clearly disclosed.

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

Conciseness5/5

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

Two dense sentences, each earning its place: the first states the action and scope, the second supplies the most useful operational detail (where to find invalidObjectIds). No fluff or repetition.

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

Completeness4/5

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

With no output schema, the description appropriately highlights the key return field, geometry.reportSummary, and explains its reliability for follow-up subsets. It is sufficient for confident invocation, though a bit more detail about the overall result shape would make it fully complete.

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

Parameters3/5

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

There is only one parameter, dataset_id, and the schema already describes it for 100% coverage. The description does not add parameter-specific guidance beyond implying the dataset is the target of validation, so the baseline of 3 applies.

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

Purpose5/5

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

The description states a concrete action: run cjval and val3dity and produce a combined structural plus geometric validation result. This clearly distinguishes it from siblings like cityjson_validate_schema and cityjson_validate_geometry, which cover only one of those aspects.

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

Usage Guidelines4/5

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

The tool is positioned as the holistic validation entry point by advertising both structural and geometric checks in one call. That gives the agent a clear reason to pick it over the split validate_schema/validate_geometry siblings, though it does not explicitly spell out when to prefer those alternatives.

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

cityjson_validate_geometryValidate 3D 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.

NameRequiredDescriptionDefault
verboseNo
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations present, the description carries the full burden of behavioral disclosure. It clearly explains the validation scope and the return behavior: a detailed report plus a compact reportSummary with invalid object IDs and error-code counts. It does not mention side effects, but 'validate' strongly implies read-only analysis and no dataset mutation.

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

Conciseness5/5

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

The description is two sentences with no filler. It front-loads the core purpose and validation method, then summarizes the output contract. Every sentence earns its place.

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

Completeness4/5

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

For a two-parameter tool with no output schema, the description covers most essential context: what gets validated, how, and what the return contents are. The only meaningful gap is the undocumented verbose parameter and the lack of explicit guidance about when not to use this tool in favor of sibling validators.

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

Parameters2/5

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

Schema description coverage is only 50%: dataset_id is documented, but the verbose parameter has no schema description and is not mentioned in the tool description. The agent is left to infer what verbose changes about the report. Since the description does not compensate for this gap, parameter semantics are incomplete.

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

Purpose5/5

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

The description states a specific verb ('Validate'), a concrete resource ('CityJSON 3D primitives'), and the validation approach (val3dity, ISO 19107, CityJSON-specific geometric checks). This clearly differentiates it from sibling validation tools like cityjson_validate_schema, which target schema validation rather than geometry primitives.

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

Usage Guidelines3/5

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

The description implies when the tool is appropriate: when validating 3D geometry primitives rather than the overall schema or general CityJSON file validity. However, it does not explicitly name alternatives such as cityjson_validate_schema or cityjson_validate, nor does it state conditions for choosing one over another.

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

cityjson_validate_schemaValidate CityJSON syntax and schemaA

Validate a dataset with the official cjval validator: JSON syntax, CityJSON schemas, extensions and additional structural consistency checks.

NameRequiredDescriptionDefault
dataset_idYesDataset handle returned by cityjson_import, cityjson_open, cityjson_import_text, or another transformation tool.
extension_schemasNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It disloses the use of the official cjval validator and enumerates the checks performed, which is useful. It does not state whether any state is modified, whether external resources are needed, or what the result/returned information looks like, leaving the behavioral picture partially incomplete.

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

Conciseness5/5

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

A single, dense sentence front-loads the operative verb and resource and structures the validation scope in a colon list. Every clause adds information and nothing is redundant.

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

Completeness3/5

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

The description is adequate for a simple validation tool with two parameters, and the dataset_id schema covers the core input. But without an output schema it does not describe what the caller receives (e.g., pass/fail, list of errors), nor does it clarify how it relates to the cityjson_validate sibling, which an agent would likely need when selecting among the validation-related tools.

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

Parameters3/5

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

The schema already documents dataset_id well as a handle returned by specific tools. The description adds context about extensions but does not clarify the format, source, or use of the extension_schemas array, whose schema description is still missing. At 50% schema coverage the description compensates only partly.

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

Purpose4/5

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

States a specific verb ('Validate'), a concrete resource ('a dataset'), and names the exact validation scope: JSON syntax, CityJSON schemas, extensions, and structural checks. It does not, however, distinguish itself from the sibling tool 'cityjson_validate', so it falls 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.

Usage Guidelines3/5

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

The description clearly implies this is the tool for full cjval-based validation of a CityJSON dataset, but it gives no explicit when-to-use versus alternatives such as cityjson_validate_geometry or cityjson_validate. The intended usage is inferable, not stated.

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.

  1. 37 tool updatesv0.1.0
    • First observedcitygml_to_cityjson
    • First observedcityjson_assign_crs
    • First observedcityjson_attribute_remove
    • First observedcityjson_attribute_rename
    • First observedcityjson_backend_status
    • First observedcityjson_clean_vertices
    • First observedcityjson_db_export
    • First observedcityjson_db_import
    • First observedcityjson_download
    • First observedcityjson_export
    • First observedcityjson_extension_schema
    • First observedcityjson_extensions_registry
    • First observedcityjson_filter_lod
    • First observedcityjson_get_object
    • First observedcityjson_import
    • First observedcityjson_import_text
    • First observedcityjson_info
    • First observedcityjson_list_imports
    • First observedcityjson_list_objects
    • First observedcityjson_merge
    • First observedcityjson_open
    • First observedcityjson_query
    • First observedcityjson_remove_materials
    • First observedcityjson_remove_textures
    • First observedcityjson_reproject
    • First observedcityjson_save
    • First observedcityjson_schema_read
    • First observedcityjson_spec_outline
    • First observedcityjson_spec_read
    • First observedcityjson_subset
    • First observedcityjson_to_citygml
    • First observedcityjson_translate
    • First observedcityjson_triangulate
    • First observedcityjson_upgrade
    • First observedcityjson_validate
    • First observedcityjson_validate_geometry
    • First observedcityjson_validate_schema

TDQS

B3.4/5.0

Scored across 37 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness4/5

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.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Provides MCP tools for CPACS-oriented TiGL workflows, enabling lifecycle management, inspection, export, and parameter manipulation of aircraft geometry models without native geometry runtimes.
    11
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Browser-based geometry processing server that enables AI agents to create geometry, run analysis and operators, inspect results, and take screenshots via MCP.
    31 npm
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents and software to create, edit, inspect, validate, and export CAD geometry through MCP using backend-neutral typed operations, with FreeCAD/OpenCascade as the authoritative B-rep backend and JSCAD preview.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to perform geospatial analysis, spatial data processing, vector and raster operations, coordinate transformations, spatial statistics, mapping, and access to climate, satellite, and other geospatial data through MCP-compatible clients.
    MIT