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 recorrido de 50 segundos: la flota completa, una estación, un bus, lo programado contra lo real y dos preguntas a Claude.
https://github.com/user-attachments/assets/f2b6dca3-eee6-486f-959b-6c7155d7b6c1
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.
Estado del feed. El feed oficial de posiciones no se actualiza desde el jueves 5 de noviembre a las 7:11 p. m. Las capturas y el video son de ese último dato, y mientras siga así cada respuesta lo avisa.
Instalar
Hace falta uv (pip install uv).
Claude Code
claude mcp add transmilenio -- uvx transmilenio-mcp
Claude 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 (la parada reportada es la última que el bus pasó, los tiempos son estimados, qué
hacer si el feed está detenido).
Ver el mapa
uvx --from transmilenio-mcp transmilenio-web
Abre 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.
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-veedor
Lee 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.
Qué se le puede preguntar
| Herramienta | Ejemplo |
|---|---|
llegadas |
¿Cuándo pasa el B10 por Calle 72? |
buses_ruta |
¿Dónde van los C25? ¿En qué sentido? Estoy en (lat, lon), ¿cuándo pasa por mi paradero? |
proximas_paradas |
¿Por dónde va el bus Z70-4428? |
paraderos_cerca |
¿Qué paraderos tengo cerca? |
buses_cerca |
¿Qué buses hay a 300 m de este punto? |
alertas |
¿Hay desvíos en la Caracas? |
buscar_parada |
¿Cómo se llama la estación de la 80 con 68? |
estado_sistema |
¿Cuántos buses hay en la calle ahora? |
programacion_ruta |
¿Cuántos viajes tiene programados el C25 hoy? ¿A qué hora hay más B10? |
ranking_rutas |
¿Qué troncal tuvo menos buses de los programados entre 6 y 9 a. m.? ¿Cuál va más atrasada? |
historial_ruta |
¿Cómo le fue al H75 esta semana frente a su horario? |
salud_feed |
¿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 cuál fue la última parada que pasó. No dice a qué hora llegará a las siguientes. La estimación toma qué parte del tramo actual ya recorrió el bus y le suma los tiempos que el horario oficial da para los tramos que le faltan. No tiene en cuenta el tráfico del momento; eso está en la lista de pendientes.
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 | datosabiertos.bogota.gov.co, portal de TransMilenio |
| GTFS Realtime (posiciones, viajes, alertas) | Anuncio oficial del 4-nov-2026 | gtfs.transmilenio.gov.co, nota de la Alcaldía |
Los datos tienen licencia CC BY-SA 4.0; el índice que arma este proyecto es una obra derivada y lleva la misma licencia. 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 /mcp
Variables 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).
Metadata
Release files for transmilenio-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| transmilenio_mcp-0.1.1.tar.gz | 101.2 kB | With provenance | Details for transmilenio_mcp-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| transmilenio_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for transmilenio_mcp-0.1.1-py3-none-any.whl |
Total release size: 161.4 kB
Release files / transmilenio_mcp-0.1.1.tar.gz
| Download URL | transmilenio_mcp-0.1.1.tar.gz |
|---|---|
| Size | 101.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8a73ded462435b24a2b1b153c31983732a7088dade65864437bbdc15fa3245a8
|
|
BLAKE2b-256 checksum How to use checksums |
427d3c0aafc83ded6e6e202e609d6f0d8e46a066363398e4358a10971e346fad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logRelease files / transmilenio_mcp-0.1.1-py3-none-any.whl
| Download URL | transmilenio_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 60.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9dceab8c88a8912f39aeec701948dda69dfdd3771747cd2f25457808ccf7cd0f
|
|
BLAKE2b-256 checksum How to use checksums |
43365cf915da55656ac3854131afedb3f2169acea28299e5a7001e30661aa2e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logSecurity for transmilenio-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for transmilenio_mcp-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.