transmilenio
Click on "Deploy 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., "@transmilenio ¿Qué buses llegan a Calle 72 en los próximos 5 minutos?"
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.
transmilenio-mcp
Desde el 4 de noviembre de 2026 TransMilenio publica la posición de sus buses como datos abiertos (GTFS Realtime). Este proyecto los conecta a Claude por MCP y trae un mapa para verlos en el navegador. Corre en tu computador y no pide API key ni registro.

Un minuto con sonido, grabado en vivo el martes 10 de noviembre a las 7:18 p. m.: la flota completa, una estación, un bus, lo programado contra lo real, los viajes cancelados y dos preguntas a Claude.
https://github.com/user-attachments/assets/7a694c14-81cf-42f5-8b0b-6c298049341b
Tú: ¿Qué buses llegan a Calle 72 en los próximos 5 minutos?
Claude: H75 hacia Portal Usme, llegando (vagón B-2). A60, llegando.
L18 hacia Portal 20 de Julio, en 1 min. D24 hacia Portal 80, en 2 min (va 8 min tarde).Cubre troncales, duales, alimentadores, SITP zonal y TransMiCable. El 5 de noviembre a las 7 p. m. el feed tenía 7.730 buses en 665 rutas.
Instalar
Hace falta uv (pip install uv).
Claude Code
claude mcp add transmilenio -- uvx transmilenio-mcpClaude Desktop, en claude_desktop_config.json:
{
"mcpServers": {
"transmilenio": {
"command": "uvx",
"args": ["transmilenio-mcp"]
}
}
}La primera vez descarga el GTFS del día (~180 MB) y arma un índice de 0,4 MB. Tarda unos 30 segundos y luego queda en caché.
Opcional: copia skills/transmilenio/ a tus skills de Claude. Le explica cómo leer los
datos (ultima_parada es la última que el bus pasó, los tiempos son estimados, qué
hacer si el feed está detenido o si faltan buses sin sentido conocido).
Related MCP server: Transporter CC MCP Server
Ver el mapa
uvx --from transmilenio-mcp transmilenio-webAbre http://127.0.0.1:8765. Puedes buscar una ruta (C25) o una estación (Calle 72),
tocar un bus para ver sus próximas paradas y usar tu ubicación para saber cuándo pasa por
tu paradero. Tiene modo noche (automático de 6 p. m. a 6 a. m.) y la tecla R activa un
modo para grabar video.

Una ruta y sus buses | Las próximas paradas de un bus |
|
|
Qué viene a una estación | De noche |
|
|
Las capturas se regeneran con python docs/capturas.py y el video con los pasos de docs/video.
Veedor: lo programado contra lo que sale a la calle
El horario oficial dice cuántos viajes debe hacer cada ruta y cuántos buses deberían estar andando a cada hora. El feed dice cuántos hay de verdad. Juntos permiten preguntar cosas como "¿qué zonales tienen menos buses de los programados en la hora pico?" o "¿cómo le fue al C25 esta semana?".
Para eso hay que guardar el feed mientras pasa el día:
uvx --from transmilenio-mcp transmilenio-veedorLee el feed una vez por minuto y lo guarda en un SQLite local (entre 5 y 10 MB por día). También
puedes agregar --veedor al mapa o al MCP para que guarde mientras estén abiertos. Si el
feed se cae, lo anota como caída y no lo cuenta como buses; salud_feed dice cuánto tiempo
estuvo caído.
Un ejemplo con la foto del jueves 5 de noviembre a las 7:11 p. m.:
Sistema | En vía | Programados | |
Zonal | 5.533 | 6.455 | 86 % |
Troncal | 1.439 | 1.286 | 112 % |
Alimentador | 474 | 499 | 95 % |
Dual | 268 | 225 | 119 % |
Total | 7.730 | 8.624 | 90 % |
Algunas zonales tenían menos de la mitad de sus buses (K904, L810, A516, D122). Con un solo momento no se puede sacar mucho; para medir hay que dejar el recolector prendido varios días.
Los viajes cancelados no necesitan recolector para el día en curso: el feed de viajes trae todos los del día con su estado (programado, cancelado o añadido). El martes 10 de noviembre a la 1 p. m. el horario tenía 81.378 viajes y TransMilenio había marcado 5.866 como cancelados (7,2 %): 11,1 % en el zonal, 2,8 % en alimentadores y 0,5 % en la troncal. Para comparar días hay que guardarlos; el recolector lo hace cada 10 minutos.
Qué se le puede preguntar
Herramienta | Ejemplo |
| ¿Cuándo pasa el B10 por Calle 72? |
| ¿Dónde van los C25? ¿En qué sentido? Estoy en (lat, lon), ¿cuándo pasa por mi paradero? |
| ¿Por dónde va el bus Z70-4428? |
| ¿Qué paraderos tengo cerca? |
| ¿Qué buses hay a 300 m de este punto? |
| ¿Hay desvíos en la Caracas? |
| ¿Cómo se llama la estación de la 80 con 68? |
| ¿Cuántos buses hay en la calle ahora? |
| ¿Cuántos viajes tiene programados el C25 hoy? ¿A qué hora hay más B10? |
| ¿Qué troncal tuvo menos buses de los programados entre 6 y 9 a. m.? ¿Cuál va más atrasada? |
| ¿Cómo le fue al H75 esta semana frente a su horario? |
| ¿Qué rutas cancelaron más viajes hoy? ¿Qué salidas del C25 se cayeron? |
| ¿El feed de TransMilenio está al día? ¿Cuánto tiempo estuvo caído? |
Cómo calcula las llegadas
El feed de TransMilenio dice dónde está cada bus y de qué ruta es. No dice a qué hora llegará a las siguientes paradas, y desde el 10 de noviembre de 2026 tampoco trae una parada que corresponda a la posición del bus. Así que el bus se ubica por geometría: el tramo de su ruta que tiene más cerca. La ida y la vuelta suelen ir por la misma vía; las separa hacia dónde se ha movido el bus entre una lectura y otra. TransMilenio regenera el feed más o menos cada minuto, así que en la primera pregunta algunos buses aún no tienen sentido y la respuesta dice cuántos; en uno o dos minutos salen casi todos.
Con el bus ubicado, la estimación toma qué parte del tramo actual ya recorrió y le suma el
tiempo de los tramos que le faltan. Ese tiempo sale del horario oficial, corregido por el
tráfico del momento: Bogotá no publica velocidades en vivo, pero cada bus del feed sirve de
sensor. Cuando un bus avanza por su recorrido se compara lo que tardó con lo que le daba el
horario, y ese factor queda para el tramo (y para las otras rutas que pasan por ahí) durante
20 minutos. Con 35 minutos del feed de un martes al mediodía, el error medio de las llegadas
bajó de 2,1 a 1,7 minutos (de 3,6 a 2,8 en las que estaban a 10-20 minutos). buses_ruta
dice además si una variante va más lenta o más rápida que su horario.
Si el feed deja de actualizarse (pasa de noche), cada respuesta trae un aviso y los
tiempos se calculan contra el último dato, no contra la hora actual. Un bus que lleva más
de 5 minutos sin reportar no se usa para estimar llegadas.
Más detalle en docs/arquitectura.md.
Datos y créditos
Los datos son de TransMilenio S.A. y este es un proyecto personal, sin relación con la empresa.
Dato | Desde | Dónde |
GTFS estático (rutas, paradas, horarios) | 24-feb-2022 en el portal de Datos Abiertos de Bogotá; hay archivo desde feb-2021 | |
GTFS Realtime (posiciones, viajes, alertas) | Anuncio oficial del 4-nov-2026 |
Los datos tienen licencia CC BY-SA 4.0; el índice que arma este proyecto es una obra derivada y lleva la misma licencia (ver NOTICE). El código es MIT. Dudas sobre los datos: radicacion@transmilenio.gov.co.
transmi-live documentó con datos reales cómo se comporta el feed, y eso ahorró varias horas.
Desarrollo
python -m venv .venv
.venv/Scripts/pip install -e ".[dev]" # Linux/macOS: .venv/bin/pip
pytest # sin internet: usa feeds reales guardados en tests/fixtures
ruff check . && ruff format --check .
python docs/capturas.py # capturas y demo del README (con el mapa abierto)
transmilenio-web --no-abrir # mapa local
transmilenio-mcp --http --port 8000 # MCP por HTTP en /mcpVariables opcionales: TRANSMI_CACHE (carpeta del índice), TRANSMI_INDICE_URL (índice ya
armado, para no descargar el GTFS), TRANSMI_RT_BASE (otra base para los feeds),
TRANSMI_HISTORIAL (archivo SQLite del veedor).
Available Tools
13 toolsalertasARead-only
Alertas vigentes: desvíos, cierres, planes de manejo de tránsito.
Filtra por texto (buscar: "Caracas", "calle 26") o por código de ruta.
Inputs: ruta, buscar, limite.
buscar_paradaARead-only
Estaciones de TransMilenio y paraderos del SITP por nombre, sin importar tildes.
Devuelve id, nombre, tipo (estación, vagón o paradero), coordenadas y rutas que paran ahí. Ejemplos: "Calle 72", "Portal Norte", "Ricaurte", "cl 80 kr 30".
Inputs: nombre (required), limite.
buses_cercaBRead-only
Buses en vía alrededor de un punto (radio de 50 a 5000 m), del más cercano al más lejano.
Inputs: lat (required), lon (required), limite, radio_m.
buses_rutaARead-only
Variantes de una ruta y dónde van ahora sus buses.
ruta: el código del bus o la estación ("B10", "C25", "H710", "16-8"). Un código puede tener
varias variantes (C25 troncal y C25 zonal, ida y regreso): cada una trae origen, destino,
sentido ("Sur-Norte", "Circular"), número de paradas, duración típica y sus buses.
Con lat/lon del usuario, cada variante trae tu_parada: su paradero más cercano y en
cuántos minutos pasan los próximos buses por ahí.
Inputs: ruta (required), lat, lon, limite.
estado_sistemaARead-only
Cuántos buses hay en vía, por sistema, y qué tan fresco está el feed.
Inputs: no named parameters.
historial_rutaARead-only
Cómo le ha ido a una ruta en los últimos días: buses promedio y máximo, viajes vistos
contra programados, retraso promedio y el perfil por hora. fecha es el último día.
Inputs: ruta (required), dias, fecha.
llegadasARead-only
Próximos buses que llegan a una estación o paradero, del más cercano al más lejano.
parada: nombre ("Calle 72") o id de buscar_parada. En una estación incluye sus vagones.
minutos: ventana de búsqueda, máximo 90. ruta: deja solo esa ruta ("¿cuándo pasa el
B10 por Calle 72?"). Cada llegada trae ruta, destino, sentido, minutos y hora estimados,
paradas que le faltan, vagón, número del bus, placa y retraso en segundos (positivo = tarde).
Inputs: parada (required), ruta, limite, minutos.
paraderos_cercaBRead-only
Estaciones y paraderos con servicio más cercanos a un punto, con distancia y rutas.
Inputs: lat (required), lon (required), limite, radio_m.
programacion_rutaARead-only
Lo que el horario oficial programa para una ruta un día: viajes por hora y buses en vía.
fecha: "hoy" (por defecto), "ayer" o "2026-11-06". Distingue hábil, sábado y festivo.
No necesita historial. Sirve para "¿cuántos viajes tiene el C25 hoy?" o "¿a qué hora
hay más buses del B10?".
Inputs: ruta (required), fecha.
proximas_paradasARead-only
Por dónde va un bus y sus próximas paradas con hora estimada.
bus: el número pintado en el bus ("E0001", "Z70-4428") o la placa. llegadas y
buses_ruta devuelven ese número.
Inputs: bus (required).
ranking_rutasARead-only
Rutas ordenadas para comparar: cuál tiene más o menos buses, cuál cumple menos su horario.
criterio: "buses" (promedio en vía frente a lo programado), "cumplimiento" (viajes vistos
sobre programados), "retraso" (minutos promedio frente al horario) o "programados" (viajes
del horario, sin historial). orden: "mas" o "menos". desde_hora/hasta_hora: franja,
p. ej. 6 y 9 para la hora pico de la mañana. sistema: "troncal", "zonal", "alimentador",
"dual" o "transmicable".
Inputs: fecha, orden, limite, sistema, +3 more.
salud_feedBRead-only
Si el feed de TransMilenio está al día y cuándo ha estado caído (disponibilidad y caídas).
Inputs: dias.
viajes_canceladosARead-only
Viajes que TransMilenio marca como cancelados o añadidos frente a su horario.
Sin ruta: total del día, por sistema y las rutas con más (o menos, orden="menos")
porcentaje de viajes cancelados. Con ruta: detalle por hora y, si es hoy, las horas de
salida canceladas. fecha: "hoy" (sale del feed en vivo, sin historial), "ayer" o
"2026-11-10" (de lo guardado). desde_hora/hasta_hora: franja por hora de salida.
Sirve para "¿qué rutas cancelaron más viajes hoy?" o "¿cuántos viajes del C25 se cayeron?".
Inputs: ruta, fecha, orden, limite, +3 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Most tools target a clearly distinct input: a point (buses_cerca vs paraderos_cerca), a stop (llegadas), a route (buses_ruta, programacion_ruta, historial_ruta), or a bus (proximas_paradas). The two soft spots are salud_feed vs estado_sistema, which both expose feed freshness, and the four route-analytics tools (programacion, historial, ranking, cancelados), though the latter are differentiated by time window and aggregation.
All names are snake_case Spanish and mostly follow a noun+qualifier pattern (buses_cerca, paraderos_cerca, proximas_paradas, programacion_ruta, ranking_rutas, historial_ruta). Minor deviations: the verb-first buscar_parada and the bare plural nouns alertas and llegadas break the pattern slightly.
13 tools sit in the sweet spot for a rich real-time transit domain, and each covers a distinct query shape (feed health, live positions, arrivals, schedules, history, rankings, cancellations, stop lookup). Nothing looks padded or redundant.
Coverage is broad: feed status, live fleet, per-bus and per-route positions, arrivals, stop search and proximity, alerts, schedule, history, ranking and cancellations. Gaps are minor — there is no way to search for a route by name/description (you must already know the code) and no origin-to-destination trip planner.
Maintenance
Related MCP Connectors
tri-train is a training platform for triathletes that syncs activities from Strava and Garmin and exposes them to Claude through a remote MCP server. Ask Claude how your last block went, why your run pace dropped, or whether you are fresh enough for Sunday's race, and it answers from your real data: activities with laps and grade-adjusted pace, weekly load and the performance management chart (CTL/ATL/TSB), sleep, HRV and resting heart rate, and your race calendar with predictions. Claude can also act: create and adjust planned workouts with structured intervals, push them to your Garmin watch, add races and write notes. Every change is journaled and can be undone. Read and write access are separate OAuth scopes, and the server enforces them on every call. Built and hosted in Switzerland by a triathlete; data stays on our own servers (Swiss revDSG / GDPR).
Atendio is a WhatsApp AI assistant for businesses in Latin America, on the official WhatsApp Business Platform. This MCP server lets Claude (or any MCP client) list and read WhatsApp conversations, view analytics and assistant settings, and create, edit or delete the rules your AI assistant follows. Remote, OAuth 2.1; the business always reviews and publishes rule changes.
Claude connector and ChatGPT connector for trend data: Google, TikTok, YouTube, Reddit, Amazon
Search award flights and cash fares, optimize points, and predict fares inside ChatGPT and Claude.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables natural language queries for Porto Alegre's public transport system, including route planning, stop search, and route information via Claude Desktop or any MCP-compatible client.MIT
- FlicenseBqualityDmaintenanceEnables searching for TransMilenio and SITP bus routes in Bogotá with live GPS tracking, nearby stops, and estimated arrivals.810-
- AlicenseAqualityBmaintenanceEnables Claude and other MCP clients to answer live questions about Toronto's transit network, including next arrivals, routes, connections, detours, accessibility and service advisories. It fetches TTC timetables and real-time feeds on demand, reporting data freshness and attaching relevant disruptions to each answer.19MIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to query live public transport status, alerts, line maps and vehicle positions across worldwide networks through tools such as search, network_status, line_status, disruptions, airport and vehicles_near.MIT



