KudaGo + Nominatim MCP Server
Integrates with OpenStreetMap Nominatim for geocoding natural place names into coordinates, enabling location-aware queries for events, venues, and more.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@KudaGo + Nominatim MCP ServerFind events near Red Square in Moscow"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
KudaGo Nominatim: FastAPI + FastMCP сервис
Асинхронный сервис для поиска событий, мест, фильмов, киносеансов, городских новостей и подборок KudaGo, разрешения географических названий через Nominatim и построения маршрутов через Transitous и OpenRouteService.
Одна прикладная логика опубликована через два интерфейса:
REST API под
/api/v1;фасад FastMCP v2 для агентов через Streamable HTTP
/mcpи stdio.
Для REST-команд через очередь и всех MCP-инструментов нужен запущенный arq worker. API или MCP transport без worker смогут принять запрос, но не выполнят application-команду.
Маршрутизация поддерживается не во всех регионах. Каждый завершённый ответ
маршрутного MCP-инструмента содержит предупреждениеregional_coverage_varies. no_route
относится только к указанным точкам, времени и ограничениям и не доказывает,
что физического маршрута или транспорта вообще не существует.
Содержание
Related MCP server: google-maps-transit
Возможности
Область | Возможности | Источник |
События и места | Поиск по городу, свободному названию или координатам; фильтры по датам и категориям | KudaGo + Nominatim |
Кино | Фильмы и реальные киносеансы | KudaGo |
Городской контент | Новости и редакционные подборки | KudaGo |
Геокодирование | Кандидаты координат для города, района, адреса или объекта | Nominatim |
Общественный транспорт | Маршруты, пересадки, остановки и расписание при наличии данных | Transitous / MOTIS 2 |
Пешком, велосипед, автомобиль | Независимые маршруты по дорожной сети | OpenRouteService |
Диагностика | Jobs, события выполнения, полные результаты и журнал upstream-вызовов | PostgreSQL |
Ключевые свойства:
FastAPI с OpenAPI, Swagger UI и ReDoc;
фасад FastMCP 3.x версии 2 с описанными JSON Schema;
MCP-транспорты Streamable HTTP и stdio;
единый
CommandExecutorдля REST и MCP;PostgreSQL, асинхронный SQLAlchemy, Redis и arq;
geo cache для повторного использования результатов Nominatim;
сохранение
job_events,command_resultsиupstream_calls;компактные agent-facing ответы с явными семантическими флагами;
отдельные модульные, интеграционные, сценарные и запускаемые вручную проверки реальных провайдеров.
Архитектура
REST-команды через очередь и MCP-инструменты используют один жизненный цикл:
REST-клиент ─┐
├→ JobDispatchService → фиксация PostgreSQL → Redis → arq worker
MCP-клиент ──┘ │
▼
CommandExecutor
│
▼
сервис → внешний провайдер
│
▼
результат + события + upstream-диагностика
REST → сразу возвращает ответ с job_id поставленной в очередь задачи
MCP → ждёт worker → читает сохранённый CommandOutput → сериализует ответЗадача фиксируется в PostgreSQL до постановки в Redis. Обработчик arq получает
только job_id, загружает авторитетные команду и входные данные из базы,
выполняет handler и сохраняет итог. Ошибка постановки в очередь не оставляет
задачу навечно в queued: она переводится в failed.
Справочники и детальные REST GET-запросы выполняются напрямую и не создают
задач. MCP get_details, напротив, проходит через общий цикл с очередью.
Подробнее: docs/architecture.md.
MCP-инструменты
Полностью настроенный сервер публикует 10 инструментов только для чтения. Восемь доступны всегда, два маршрутных инструмента — только при наличии конфигурации провайдера.
MCP-инструмент | Назначение | Команда приложения | Публикация |
| Разрешить свободное название в кандидаты координат |
| Всегда |
| Найти события в календарном окне |
| Всегда |
| Найти места и достопримечательности |
| Всегда |
| Найти фильмы |
| Всегда |
| Найти реальные киносеансы |
| Всегда |
| Найти городские новости |
| Всегда |
| Найти редакционные подборки |
| Всегда |
| Получить полную карточку найденного объекта |
| Всегда |
| Построить маршрут общественного транспорта |
| При непустом |
| Построить пеший, велосипедный или автомобильный маршрут |
| При непустом |
Старые имена MCP v1 (events, places, object, transit_route,
street_route и другие) не являются псевдонимами.
Все инструменты объявлены как доступные только для чтения, неразрушающие и
идемпотентные. Публичные схемы содержат описания, перечисления (enum),
числовые ограничения и межполевую валидацию. Ошибки аргументов возвращаются до
создания job.
В результатах для агента:
schedule_verified=trueозначает подтверждённое расписание событий или киносеансов;showing_times_verified=falseу фильма напоминает, что для времени сеанса нуженfind_movie_showings;route_verified=trueвыставляется только приresult_status=okи наличии полного маршрута в MCP-ответе;данные поиска и подборок ограничены 64 KiB;
детальные данные и маршруты ограничены 128 KiB;
при усечении удаляются целые items или варианты маршрута, а полный результат остаётся в истории job.
Полный контракт: docs/mcp.md.
Маршрутизация и покрытие
Инструменты маршрутизации принимают координаты и не геокодируют текст самостоятельно:
resolve_location → выбрать один candidate → передать его latitude и longitudeplan_public_transport и plan_street_route независимы:
Transitous отвечает только за общественный транспорт;
OpenRouteService отвечает только за walking/cycling/driving;
инструменты не вызывают друг друга;
автоматического резервного переключения между провайдерами нет.
Условная публикация относится только к MCP-каталогу. REST-маршруты и команды приложения остаются зарегистрированными, но без настройки провайдера их выполнение завершится ошибкой конфигурации.
plan_public_transport требует ровно одно значение с часовым поясом:
departure_time или arrival_time. Пеший доступ до и после участка
общественного транспорта ограничен 900 секундами с каждой стороны.
Каждый завершённый результат маршрутизации в MCP содержит:
{
"type": "coverage_notice",
"code": "regional_coverage_varies",
"message": "Routing is not supported in every region. Availability depends on the provider and its underlying routing data."
}На live-тестах июля 2026 года Transitous не показал наблюдаемого покрытия Москвы и Московской области: для проверенных точек отсутствовали stops, stoptimes и itineraries, тогда как контрольный Берлин работал. Geoapify и Google Routes также не удовлетворили требованиям российского маршрутизации на общественном транспорте по России. Это снимок состояния провайдеров на дату теста, а не вечная гарантия.
Подробности:
Требования
Python 3.11 или новее;
PostgreSQL 16;
Redis 7;
Docker Engine / Docker Desktop с Compose — для готовой локальной инфраструктуры;
PowerShell — для готового
scripts/smoke_test.ps1;API key OpenRouteService — только если нужен
plan_street_route;корректный Transitous User-Agent с именем приложения, версией и контактом — если нужен
plan_public_transport.
Быстрый старт
Команды ниже выполняются из корня репозитория.
1. Подготовить окружение
Copy-Item .env.example .envПеред запуском измените в .env как минимум:
POSTGRES_PASSWORD;NOMINATIM_USER_AGENT, чтобы он идентифицировал ваше приложение;контакт в
TRANSITOUS_USER_AGENT;OPENROUTESERVICE_API_KEY, если нужна маршрутизация OpenRouteService.
Не коммитьте .env с реальными паролями и API keys.
2. Запустить весь стек
docker compose up --build -d
docker compose ps --allОдна команда собирает приложение, применяет Alembic-миграции и запускает:
PostgreSQL;
Redis с AOF persistence;
FastAPI + FastMCP (
app.main:app);обработчик arq;
Nginx gateway на единственном публичном HTTP-порту.
PostgreSQL и Redis по умолчанию доступны только сервисам во внутренней Compose-сети, поэтому не конфликтуют с локальными экземплярами.
Стандартный запуск автоматически использует docker-compose.override.yml:
исходники подключены как bind mount, Uvicorn перезапускается при изменениях
в app/, а arq следит за тем же каталогом. Устанавливать Python локально для
запуска стека не нужно.
После запуска доступны:
Назначение | URL |
REST API |
|
Swagger UI |
|
ReDoc |
|
FastMCP Streamable HTTP |
|
3. Проверить сервис
Invoke-RestMethod http://127.0.0.1:8011/api/v1/health
Invoke-RestMethod http://127.0.0.1:8011/api/v1/health/db
Invoke-RestMethod http://127.0.0.1:8011/api/v1/health/readyProduction-like запуск без bind mounts и autoreload:
docker compose -f docker-compose.yml up --build -dМасштабирование API и worker не меняет внешний URL:
docker compose up -d --scale app=3 --scale worker=4Подробности об обновлениях кода, зависимостей, переменных окружения и миграций см. в руководстве по Docker.
Подключение MCP-клиента
Streamable HTTP
При запущенных API и worker укажите клиенту:
http://127.0.0.1:8011/mcpStdio
Отдельный stdio-транспорт запускается так:
python -m app.mcpЭквивалентный совместимый entrypoint:
python mcp_server.pyОбобщённый пример конфигурации MCP-клиента:
{
"mcpServers": {
"kudago-nominatim": {
"command": "python",
"args": ["-m", "app.mcp"],
"cwd": "C:\\absolute\\path\\to\\kudago-nominatim-integrate-mcp"
}
}
}Формат конфигурации зависит от конкретного клиента. Stdio-сервер сам подключается к Redis, но application-команды по-прежнему выполняет отдельный arq worker.
Конфигурация
Настройки загружаются из переменных окружения и локального .env.
Приложение и инфраструктура
Переменная | Назначение | Значение в |
| Имя FastAPI-приложения |
|
| Debug-режим |
|
| Журналирование SQL-запросов; для stdio принудительно отключается |
|
| Host-интерфейс HTTP gateway |
|
| Порт HTTP gateway на host |
|
| Uvicorn-процессы в одном production-like контейнере |
|
| Asyncpg URL PostgreSQL | PostgreSQL на |
| Redis для arq и MCP |
|
| Внутренний бюджет application-команды |
|
| Жёсткий лимит arq; минимум на 5 секунд больше лимита команды |
|
| Максимум одновременно выполняемых задач на один worker-контейнер |
|
| Максимальное ожидание worker внутри MCP-вызова |
|
| Пользователь PostgreSQL в Compose |
|
| Пароль PostgreSQL в Compose |
|
| База PostgreSQL в Compose |
|
| Порт PostgreSQL при подключении opt-in host-конфигурации |
|
| Порт Redis при подключении opt-in host-конфигурации |
|
Внешние провайдеры
Переменная | Назначение |
| Базовый URL KudaGo API v1.4 |
| Язык KudaGo-запросов |
| User-Agent клиента KudaGo |
| Обязательный идентифицирующий User-Agent Nominatim |
| Минимальный интервал между Nominatim-запросами |
| Ограничение геокодирования по странам; по умолчанию |
| Радиус geo search по умолчанию, метры |
| Базовый URL Transitous / MOTIS 2 |
| Имя приложения, версия и контакт; управляет публикацией transit MCP tool |
| Тайм-аут Transitous |
| Базовый URL OpenRouteService |
| API key; управляет публикацией street-route MCP tool |
| User-Agent OpenRouteService |
| Тайм-аут OpenRouteService |
Точные defaults находятся в .env.example и app/core/config.py.
REST API и жизненный цикл задач
Команды через очередь
Все основные POST-команды создают job и возвращают job_id и
queue_job_id.
Метод | Endpoint | Назначение |
|
| Геокодирование |
|
| События |
|
| Места |
|
| Фильмы |
|
| Киносеансы |
|
| Новости |
|
| Подборки |
|
| Общественный транспорт |
|
| Пешком, велосипед или автомобиль |
Маршрутные endpoints принимают только координаты. Адрес или название сначала
разрешите через /geo/resolve или MCP resolve_location.
Прямые GET-запросы
Метод | Endpoint | Назначение |
|
| Состояние API |
|
| Проверка PostgreSQL |
|
| Категории событий |
|
| Категории мест |
|
| Города KudaGo |
|
| Карточка города |
|
| Детальная карточка объекта |
Задачи и диагностика
Состояния задачи: queued, running, succeeded, failed.
GET /api/v1/jobs/{job_id}
GET /api/v1/jobs/{job_id}?include_result=true
GET /api/v1/jobs/{job_id}/events
GET /api/v1/jobs/{job_id}/results
GET /api/v1/jobs/{job_id}/upstream-callsОбычный GET /jobs/{job_id} скрывает большие items и routes. Полные данные
доступны через /results или include_result=true.
Успешно выполненная задача может содержать доменный результат geo_ambiguous,
geo_not_found, geo_unsupported или no_route. Это не ошибка транспорта.
Точные схемы запросов и ответов: docs/api.md и Swagger UI
/docs.
Тестирование
Установить dev dependencies:
python -m pip install -e ".[dev]"Модульные и интеграционные тесты
python -m pytest -qТесты проверяют обработчики приложения, клиенты провайдеров, жизненный цикл очереди, MCP-каталог и схемы, межполевую валидацию, сериализаторы, ограничения размера ответа, условную публикацию маршрутных инструментов и зафиксированный снимок справочников.
Проверка REST-сценариев
После запуска PostgreSQL, Redis, API и worker:
powershell -ExecutionPolicy Bypass -File scripts/smoke_test.ps1Другой API URL:
powershell -ExecutionPolicy Bypass -File scripts/smoke_test.ps1 `
-BaseUrl "http://127.0.0.1:8011/api/v1"Проверки MCP
При запущенных PostgreSQL, Redis и worker:
python scripts/test_mcp_inmemory.py
python scripts/test_mcp_stdio.py
python scripts/test_mcp_http.py
python scripts/dump_mcp_schemas.pyHTTP-проверка дополнительно требует запущенный Uvicorn.
Проверка маршрутизации с реальными провайдерами
python scripts/test_routing_live.pyЭтот тест обращается к реальным провайдерам, требует корректный
TRANSITOUS_USER_AGENT и использует OPENROUTESERVICE_API_KEY, если он задан.
Он не входит в обычный pytest.
Отдельные provider-диагностики и необходимые переменные окружения описаны в отчёте о live-тестах.
Разработка
После добавления новой ревизии применить миграции в уже запущенном Compose:
docker compose run --rm migrateИзменения Python-кода подхватываются dev-контейнерами автоматически. После
изменения pyproject.toml пересоберите Python-сервисы:
docker compose up --build -d app workerДля локальной разработки вне Docker установите пакет с dev-зависимостями. Создать ревизию миграции можно локально:
python -m pip install -e ".[dev]"
python -m alembic revision --autogenerate -m "описание изменения"Обновить зафиксированный в git снимок справочников MCP:
python scripts/update_mcp_reference_data.pyПроверить и сохранить реальные MCP schemas:
python scripts/dump_mcp_schemas.pyСтруктура проекта
app/
api/ FastAPI routers и зависимости
application/ общие контракты команд, executor и обработчики
core/ settings, PostgreSQL и Redis
integrations/ HTTP-клиенты внешних провайдеров
mcp/ схемы, преобразователи, сериализаторы, server и tools
models/ модели SQLAlchemy
repositories/ операции с PostgreSQL
schemas/ контракты Pydantic для REST и прикладного слоя
services/ бизнес-правила и оркестрация провайдеров
workers/ задачи arq и WorkerSettings
alembic/ миграции PostgreSQL
docs/ подробная документация
scripts/ сценарные проверки, выгрузка схем и live-диагностика
tests/ модульные и интеграционные тесты
docker/ конфигурация HTTP gateway
Dockerfile образ FastAPI/FastMCP, worker и миграций
docker-compose.yml production-like описание полного стека
docker-compose.override.yml autoreload для локальной разработки
docker-compose.host.yml opt-in публикация PostgreSQL и Redis на hostДокументация
Документ | Содержание |
Компоненты, цикл очереди, хранение данных и модель ошибок | |
REST endpoints и примеры данных | |
MCP-фасад v2, каталог, схемы и envelopes | |
Compose-стек, обновления и масштабирование | |
Контракты маршрутов общественного транспорта и дорожной сети | |
Модульные, интеграционные, MCP- и live-проверки | |
Принципы схем для агентов | |
Источники перечислений и справочных данных | |
Сравнение покрытия Transitous, Geoapify и Google Routes |
Ограничения и подготовка к промышленному развертыванию
Входящие REST, MCP и диагностические endpoints не имеют аутентификации на уровне приложения. Не публикуйте сервис в интернет без внешнего слоя аутентификации.
/api/v1/jobs/{job_id}/upstream-callsвозвращает сохранённые request/response payloads провайдеров. Ограничьте к нему доступ или отключите его в публичном окружении.Полнота и доступность данных зависят от KudaGo, Nominatim, Transitous и OpenRouteService.
Transitous и OpenRouteService не гарантируют покрытие каждого региона.
no_routeне является доказательством отсутствия физического маршрута.MCP timeout не отменяет queued job: она может завершиться позднее и остаться доступной через REST job endpoints.
Кэшированный geo result закономерно не создаёт новый upstream-call.
Docker Compose не контейнеризирует API и обработчик arq; он запускает только PostgreSQL и Redis.
Храните
.env, реквизиты базы данных и API keys провайдеров вне git.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP Server for the Mapbox API.Last updated512MIT
- Flicense-qualityDmaintenanceA Model Context Protocol (MCP) server for Google Maps — routing, place discovery, and commute comparison over stdio.Last updated1
- AlicenseAqualityCmaintenanceMCP server for geocoding and place discovery using OpenStreetMap data via Nominatim. Supports forward/reverse geocoding, bounding boxes, nearby places, batch geocoding, route waypoints, and administrative boundaries.Last updated10Apache 2.0
- Alicense-qualityDmaintenanceAn MCP server for forward geocoding via the Nominatim API (OpenStreetMap) with no API key required.Last updated8MIT
Related MCP Connectors
Geo-based flight search MCP server. Find more flights between any two places on earth
MCP server for Google search results via SERP API
MCP server for URL shortening and management
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/RawsTourix/kudago-nominatim-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server