Normativa Colombia MCP
Normativa Colombia MCP is a stdio Model Context Protocol server that lets any MCP-capable AI assistant search, retrieve, and cross-reference Colombian legislation, jurisprudence, and sectoral regulation from official sources — returning documents, citation resolution, and vigencia status with explicit caveats.
Resolve exact citations (
resolver_cita): turns citations like "Ley 909 de 2004", "C-337/11", or "art. 191 del Código de Comercio" into the actual document with link and vigencia; accepts batches (citas) and multiple articles of one norm (articulos), and can validate a citation/link (validar: true), classifying it as validated, partially validated, or unverifiable.Search norms in the Gestor Normativo (
buscar_normas,buscar_por_tema,explicar_relacion_tema,listar_catalogos): thematic and catalog-driven search of laws, decrees, resolutions, and concepts, with an explanation of why each norm applies to a subtopic.Search jurisprudence from the three high courts: Corte Constitucional (
buscar_jurisprudencia,linea_jurisprudencial), Corte Suprema by sala (buscar_jurisprudencia_suprema, returns cited norms), and Consejo de Estado (buscar_jurisprudencia_consejo_estado, with problema jurídico and answer).Query vigencia:
consultar_vigenciareturns SUIN's literal state ("Vigente", "Derogado", "Vigencia en Estudio") with a confidence level; never asserts a yes/no.Track reforms and changes:
historial_norma(chain of modifications, additions, derogations by article),cambios_desde(changes since a given year for listed norms), andcomparar_articulos(diff two articles, classify differences by pattern, optionally against the last annotated reform).Analyze hierarchy and conflicts:
consultar_por_jerarquia(constitution, law, decree, resolution, concept, jurisprudence) andanalizar_conflicto(gathers evidence of a potential conflict between two norms — evidence, not a conclusion).Search across multiple sources at once:
buscar_unificadoqueries Gestor, Corte Constitucional, SUIN, and DIAN in parallel (plus INVIMA/Supersalud withperfil: saludor ANM withperfil: mineria).Sector-specific sources: DIAN (
buscar_normativa_tributaria), CREG (buscar_resoluciones_creg), ANH (buscar_normativa_anh), UPME (buscar_normativa_upme), ANLA (listar_normativa_ambiental_anla), and 13 more regulators viabuscar_normativa_sectorial.SUIN-Juriscol search (
buscar_en_suin): 56.832 documents from 1844 onward, including norms the Gestor lacks.Diario Oficial lookup (
buscar_diario_oficial): find which Diario Oficial published a given norm, or which diarios appeared in a date range.Retrieve document text (
obtener_documento): fetch chunked text from seven sources (gestor, corte, suprema, consejo, dian, creg, sectorial), with options to search within text, extract a section or article, get a norm's reform history, or write the full document to disk.Sectoral profiles (
consultar_perfil): run a query preconfigured for laboral, tributario, ambiental, contratacion_estatal, or energia.Research expedientes (
expediente, opt-in viaEXPEDIENTES=1): create, add to, read, or export a research file grouping queries, citations, and observations.Describe scope (
describir_fuentes): check what each source covers and what it does not, plus index generation dates, without hitting the network.
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., "@Normativa Colombia MCP¿Qué dice el Decreto 1083 sobre encargos?"
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.
Normativa Colombia — servidor MCP
Consulta la normativa y la jurisprudencia colombiana desde cualquier asistente de IA que hable Model Context Protocol, sin abrir el navegador ni pelear con formularios.
Conecta seis fuentes oficiales:
Gestor Normativo del Departamento Administrativo de la Función Pública — leyes, decretos, resoluciones, circulares y conceptos del sector público, con la consulta temática y los restrictores que explican por qué cada norma aplica a un tema.
Relatoría de la Corte Constitucional — 44.839 providencias según su propio índice, con fallos recientes publicados el mismo año.
SUIN-Juriscol del Ministerio de Justicia — el estado de vigencia, que ninguna otra fuente del país publica, y 11.599 leyes de 1844 a 2026, muchas de las cuales el Gestor no tiene.
Corte Suprema de Justicia — providencias de las salas de Tutelas, Civil, Laboral y Penal, cada una con las normas que cita.
Consejo de Estado — providencias tituladas de lo contencioso administrativo, con el problema jurídico que la Sala se planteó, su respuesta y el texto completo. Con esta se completan las tres altas cortes, y las tres entregan texto.
Normograma de la DIAN — normativa tributaria, aduanera y cambiaria.
Es un servidor MCP estándar que se comunica por stdio, así que sirve en Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, Zed, Continue, LM Studio, agentes propios hechos con los SDK de MCP y cualquier cliente que aparezca después.
Instalación
Opción A — Claude Desktop, con un clic
La más sencilla si usas Claude Desktop: no requiere Node ni tocar archivos de configuración.
Descarga
normativa-colombia.mcpbdesde Releases.Abre Claude Desktop → Configuración → Extensiones.
Arrastra el archivo a esa ventana y confirma.
(Opcional: instalar sin ciertas fuentes) En Claude Desktop, abre la configuración de la extensión Normativa Colombia. En el campo Fuentes puedes indicar qué fuentes desactivar (p. ej.
-creg,-anh,-upme,-anla,-sectorialpara instalar sin fuentes sectoriales y ahorrar contexto) o cuáles conservar (corte,suin). Si lo dejas vacío, incluye todas.
Claude Desktop trae su propio Node, así que no hace falta instalar nada más.
Opción B — cualquier otro cliente MCP, desde npm (recomendada)
La forma más sencilla y la que evita errores de rutas: no hay que clonar nada ni apuntar a archivos locales. Requiere Node 18 o superior.
# sin instalar nada, la forma habitual en clientes MCP
npx -y normativa-colombia-mcp
# o instalado en el proyecto
npm install normativa-colombia-mcp
# o disponible en todo el sistema
npm install -g normativa-colombia-mcpCasi todos los clientes comparten este formato:
{
"mcpServers": {
"normativa-colombia": {
"command": "npx",
"args": ["-y", "normativa-colombia-mcp"]
}
}
}Para instalar sin ciertas fuentes (por ejemplo, sin los reguladores sectoriales para reducir consumo de contexto), añade la variable FUENTES en env:
{
"mcpServers": {
"normativa-colombia": {
"command": "npx",
"args": ["-y", "normativa-colombia-mcp"],
"env": {
"FUENTES": "-creg,-anh,-upme,-anla,-sectorial"
}
}
}
}Cliente | Dónde va esa configuración |
Claude Desktop (manual) |
|
Cursor |
|
Windsurf |
|
Continue | El bloque |
LM Studio | Program → Install → Edit mcp.json |
Agente propio | Como |
Claude Code no usa archivo; se registra por línea de comandos:
# con todas las fuentes
claude mcp add normativa-colombia -- npx -y normativa-colombia-mcp
# o sin fuentes sectoriales
claude mcp add normativa-colombia -e FUENTES="-creg,-anh,-upme,-anla,-sectorial" -- npx -y normativa-colombia-mcpVS Code usa la clave servers en vez de mcpServers, en .mcp.json del proyecto o en la configuración de usuario:
{
"servers": {
"normativa-colombia": {
"type": "stdio",
"command": "npx",
"args": ["-y", "normativa-colombia-mcp"],
"env": {
"FUENTES": "-creg,-anh,-upme,-anla,-sectorial"
}
}
}
}Si lo instalaste con npm install -g, el comando es normativa-colombia-mcp a secas, sin argumentos.
Si tu cliente no está en la lista, busca dónde declara servidores MCP por stdio: el comando y los argumentos son siempre los mismos.
Comprobar que quedó bien
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"prueba","version":"1"}}}' \
| npx -y normativa-colombia-mcpDebe responder un JSON con "name":"normativa-colombia" y un campo instructions.
Opción C — desde el código
Para desarrollar o para fijar una versión propia. Requiere Node 22 o superior:
git clone https://github.com/Angelthebestone/Normativa-colombiana-MCP.git
cd Normativa-colombiana-MCP
npm install
npm run generar-indice # índice temático, ~20 MB de descarga, una sola vez
npm run build # genera server/: el lanzador index.js, el bundle servidor.js y el trozo de unpdf que se carga al leer un PDFDespués se apunta el cliente a node /ruta/absoluta/a/Normativa-colombiana-MCP/server/index.js, con el mismo formato de arriba. Funciona desde cualquier directorio de trabajo.
Carpeta sin espacios: si la ruta local contiene espacios (p. ej.
C:\Users\…\normativa mcp\server\index.js), algunos clientes lanzan el comando sin comillas y Node solo ve la primera parte (C:\Users\…\normativa) y sale con código 1. Para instalación local, clona en una carpeta sin espacios o usa la Opción B (npx), que no tiene este problema.
Opción D — con Bun (alternativa opcional)
Node sigue siendo el runtime de referencia: es el de las pruebas (npm run check) y el del .mcpb. El servidor construido en la Opción C también arranca con Bun, y se ha probado a mano con Bun 1.4.2: mismo tools/list, mismas respuestas y TLS íntegro (Bun respeta la cadena de certificados propia del servidor). Arranca unos 40 ms antes y ocupa unos 19 MB menos de memoria; la latencia de cada consulta es la misma, porque la marca el portal. No se prueba en cada versión: si algo falla solo con Bun, reprodúcelo antes con Node.
El cliente se apunta a bun /ruta/absoluta/a/Normativa-colombiana-MCP/server/index.js (misma nota de la carpeta sin espacios). Construir sigue requiriendo Node.
Qué recibe el cliente
Al conectarse, el servidor entrega 28 herramientas, 5 prompts y sus propias instrucciones de uso: a qué tipo de pregunta corresponde cada herramienta, que debe citarse siempre la fuente y que nunca debe afirmarse por cuenta propia que una norma está vigente. Los clientes que respetan el campo instructions del protocolo lo aprovechan sin configurar nada.
Fuente | Herramientas |
Cualquiera (punto de entrada) |
|
Gestor Normativo |
|
Corte Constitucional |
|
Corte Suprema |
|
Consejo de Estado |
|
SUIN-Juriscol |
|
Secretaría del Senado | el Código Civil, artículo por artículo, vía |
Diario Oficial |
|
DIAN |
|
CREG |
|
ANH / UPME / ANLA |
|
14 reguladores sectoriales |
|
V2 — jerarquía y conflictos |
|
V2 — perfiles y expedientes |
|
Alcance |
|
Elegir las fuentes al instalar
Cada herramienta se paga en contexto en cada conversación, se use o no. Si no necesitas algunas fuentes, apágalas con la variable de entorno FUENTES (en Claude Desktop, el campo Fuentes de la extensión): sus herramientas desaparecen de la lista y su valor sale de los parámetros de las herramientas compartidas (obtener_documento.fuente, buscar_unificado.fuentes, consultar_perfil.perfil, el nivel jurisprudencia de consultar_por_jerarquia), así que la llamada a una fuente apagada no se puede ni escribir.
| Efecto | Herramientas |
|
vacía (por defecto) | todas | 28 | 41.862 B |
| todas menos la regulación sectorial | 23 | 34.493 B |
| Gestor Normativo y Corte Constitucional | 18 | 26.590 B |
Dos formas, sin mezclar: la lista de las que quieres (corte,suin) o la de las que quitas (-creg,-anh). Claves: corte, suprema, consejo, dian, suin, senado, diario, creg, anh, upme, anla, sectorial. El Gestor Normativo va siempre: es el corpus de resolver_cita y de las herramientas V2. Una clave mal escrita impide arrancar con el motivo en el log, en vez de dejarte sin una fuente sin avisar. Las respuestas declaran lo apagado aparte de lo no consultado (Desactivadas en esta instalación, no consultadas: CREG, ANH…), y describir_fuentes sigue describiendo las fuentes apagadas, marcadas como tales.
Related MCP server: Swedish Law MCP
Qué puedes preguntar
«¿Qué dice la Ley 1221 de 2008 sobre el auxilio de conectividad?»
«¿Qué normas regulan el teletrabajo en el sector público y por qué aplican?»
«¿Qué dice el Decreto 1083 sobre encargos?»
«Búscame jurisprudencia reciente de la Corte Constitucional sobre estabilidad laboral reforzada.»
«¿La Ley 909 de 2004 sigue vigente?»
«¿Qué dice la DIAN sobre la retención en la fuente por servicios?»
«Búscame tutelas de la Corte Suprema sobre teletrabajo y dime qué normas citan.»
«¿Existe la Ley 74 de 1923 y sigue vigente?» — está derogada, y ni el Gestor la tiene.
«¿Qué leyes hay sobre teletrabajo?» —
consultar_por_jerarquiacon nivel "ley".«Compara el art. 2 de la Ley 909 con el art. 2.2.5.3.1 del Decreto 1083.» —
comparar_articulos.«¿Hay conflicto entre la Ley 909 de 2004 y el Decreto 1083 de 2015 en materia de encargos?» —
analizar_conflicto(reúne evidencia, no concluye).«¿Qué cambió la Ley 909 de 2004 desde 2020?» —
cambios_desde.«Normativa laboral sobre teletrabajo» —
consultar_perfilcon perfil "laboral".
El servidor incluye además cinco prompts listos, que los clientes que los soportan muestran como comandos: ¿Qué normas aplican sobre un tema?, ¿Esta norma sigue vigente?, Explícame esta norma en lenguaje sencillo, Compara dos normas y Aclarar una consulta ambigua.
Herramientas V2
Sobre la capa común de metadatos, evidencia y normalización:
consultar_por_jerarquiafiltra por nivel (constitución, ley, decreto, resolución, concepto, jurisprudencia) y explica el carácter de cada uno. El Gestor no cataloga la Constitución como tipo: para ese nivel se orienta.resolver_citaconvalidar: truecomprueba que una cita y su enlace son de verdad: número/año contra el título, dominio del enlace, id de la norma y existencia del artículo. Clasifica en "validada", "parcialmente validada" o "no fue posible validar"; nunca afirma vigencia.analizar_conflictoreúne EVIDENCIA de un posible conflicto entre dos normas (identificación, vigencia según SUIN si consta, jerarquía, reformas anotadas, pasajes sobre un tema). No detecta contradicciones semánticas y el resultado es un conflicto POTENCIAL, no una conclusión jurídica.cambios_desderesume los cambios (modificación, derogación, adición) que el Gestor anota sobre las normas que se le listan, filtrados por el año de la norma modificadora. No rastrea novedades por su cuenta.comparar_articuloscompara el texto de un artículo entre dos normas, marca lo añadido/eliminado, clasifica cada diferencia por patrones (plazo, sanción, excepción, sujeto obligado) y agrupa los cambios editoriales por similitud léxica (Dice sobre bigramas ≥0,92): «una línea» → «una sola línea» sale como cambio menor, no como añadido+eliminado. Lo no clasificado se marca "revisar manualmente". Sin modelo semántico.consultar_perfilejecuta una consulta con las fuentes y filtros preconfigurados de un perfil:laboral,tributario,ambiental,contratacion_estatal,energia. Cada perfil declara su advertencia en la respuesta.expedienteconaccion="crear|agregar|leer|exportar"agrupa consultas, citas y observaciones de una investigación. Desactivado por defecto: se activa con la variable de entornoEXPEDIENTES=1; la persistencia en disco, conEXPEDIENTES_DIR.
Una regla de oro de las V2: si una cita viene sin año y el número es ambiguo ("Decreto 1072" son cuatro), la herramienta no elige por ti: lista los candidatos y pide el año.
Lo que debes saber antes de confiar en una respuesta
Esto no es asesoría jurídica. Es un buscador que le da a un asistente de IA acceso a fuentes oficiales. Verifica siempre en el enlace que acompaña cada respuesta.
La vigencia viene de SUIN, y solo de SUIN. Ni el Gestor ni la relatoría tienen un campo que diga «esta norma está derogada»: las derogatorias van escritas dentro del texto, y el servidor se limita a avisar cuando detecta marcas de «Derogado» o «Modificado por» (el Decreto 1083 de 2015 contiene 155 notas de modificación). SUIN-Juriscol, del Ministerio de Justicia, sí publica el estado como dato, y es la única fuente del país que lo hace: cuando la norma está en el índice empaquetado, resolver_cita devuelve ese estado con su enlace.
Tres advertencias sobre ese dato, todas comprobadas:
Se entrega literal, nunca traducido a un sí o un no. SUIN distingue «Vigente», «DEROGADO», «Vigencia en Estudio», «Compilado», «Declarado Inexequible» y «Norma no vigente porque agotó su objeto». «Vigencia en Estudio» no significa vigente.
El estado se lee del registro del documento, no de su prosa. Donde aparecen los dos se contradicen: la Ley 1541 de 2012 muestra «Vigente» en pantalla y «Vigencia en Estudio» en su campo.
El buscador de SUIN no sirve para esto.
buscar_en_suindevuelve un campo de vigencia que viene de su índice de búsqueda y contradice la ficha —la Ley 74 de 1923 figura allí como «Vigencia en Estudio» y su ficha dice DEROGADO—, así que se marca como no fiable en cada respuesta.
Y la regla de fondo no cambia: verifica en el enlace antes de actuar.
El buscador del Gestor no busca en el texto completo, solo en los resúmenes temáticos, y une los términos con OR. Su índice de palabras además es muy pobre: «teletrabajo» casa con 3 documentos en todo el portal, y con ninguno de los 43 conceptos que sí están clasificados bajo ese subtema. El servidor compensa de tres formas: quita las palabras vacías antes de consultar, reintenta por el subtema oficial cuando la búsqueda por palabras rinde poco, y busca dentro del articulado en tu computador cuando pides una norma concreta. Además, cada resultado de buscar_normas marca qué términos menciona su extracto y cuáles no, para que un resultado parcial no se lea como totalmente pertinente.
Los códigos se citan por su nombre. resolver_cita entiende "art. 191 del Código de Comercio" además de "art. 191 del Decreto 410 de 1971", y dice contra qué norma resolvió: Comercio (Decreto 410 de 1971), Sustantivo del Trabajo (Decreto 2663 de 1950), Procesal del Trabajo (Decreto 2158 de 1948), Penal (Ley 599 de 2000), Procedimiento Penal (Ley 906 de 2004), General del Proceso (Ley 1564 de 2012), CPACA (Ley 1437 de 2011), Infancia y Adolescencia (Ley 1098 de 2006) y Estatuto Tributario (Decreto 624 de 1989) salen del Gestor.
El Código Civil (Ley 84 de 1873) sale de la Secretaría del Senado, con tres salvedades. El Gestor no lo publica y SUIN no sirve su texto, así que resolver_cita con "art. 946 del Código Civil" lee el artículo de la página de la Secretaría del Senado (medido el 2026-09-28: 48 de 50 artículos de una muestra leídos bien; los otros dos, un «socket hang up» del portal, se declaran como «no respondió», nunca como «no existe»). (1) Solo sirve HTTP sin cifrar —su puerto 443 no abre—: el texto no se puede autenticar en tránsito, y cada respuesta lo dice; quien no lo quiera la apaga con FUENTES=-senado. (2) Los apartes tachados que el portal marca como inexequibles o derogados salen entre ~~ ~~ y la respuesta avisa: no se citan como vigentes. (3) No se reproducen las notas de vigencia, concordancias ni jurisprudencia de cada artículo: son del editor del portal (Avance Jurídico Casa Editorial), que reserva su copia; la respuesta remite al enlace, donde están, y hay que mirarlas antes de citar. El portal es lento e intermitente (una parte tardó 40 s en responder).
Las leyes modificatorias traen el artículo que sustituyen. Cuando una ley está redactada como "El artículo 217 del Código Civil quedará así:", el texto nuevo va debajo con su propia numeración; el extractor lo devuelve junto al artículo pedido en lugar de cortar en los dos puntos. El cuerpo del código modificado es otro documento, y se pide con su propia cita ("art. 217 del Código Civil").
El texto que publica el Gestor es el consolidado. Al comparar un artículo con su reforma (comparar_articulos con con_reforma: true) el «antes» no existe en esas páginas: se contrasta lo que dispuso la reforma con lo que el portal publica hoy, y la respuesta lo declara. Si la ley modificadora solo transcribe una parte, o el extractor no aísla su artículo, el modo lo dice y no calcula un diff que sería engañoso. El portal tampoco anota todas las reformas (medido: la Ley 2466 de 2025 modifica el art. 23 del Código Sustantivo del Trabajo y esa reforma no aparece anotada).
La cita judicial sale compuesta, y lo que no consta se dice. resolver_cita (sentencias de la Corte Constitucional) y obtener_documento (normas del Gestor) traen una línea «Cita oficial: …» armada solo con campos de la fuente. En la relatoría de la Corte, prov_magistrados es el ponente (238 de 240 aciertos medidos traen un solo nombre y el texto de la providencia lo declara). En SAMAI la fecha es la del proceso, no la del fallo, y la Corte Suprema publica la fecha de carga: por eso esas fechas no entran en la cita y se listan como «no consta». Tampoco se inventa la entidad expedidora de una norma: el Gestor no la publica de forma fiable.
Vigencia diferida. Cuando una norma no rige de inmediato —«regirá seis meses después de su promulgación», o por tramos, como la Ley 2277 de 2022—, la cabecera de obtener_documento lo dice a partir de su propio artículo de vigencia (medido sobre 20 normas reales). Solo calcula la fecha cuando el texto lo permite; si falta la fecha de publicación o hay varios tramos, lo declara en vez de suponer.
Un radicado de 23 dígitos (11001-03-28-000-2022-00132-00) se descompone en resolver_cita y se busca en las providencias tituladas del Consejo de Estado (SAMAI). Los dígitos identifican la corporación solo para el Consejo de Estado (03xx) y la Sala Civil de la Corte Suprema (0203); los de un juzgado o un tribunal (31xx, 23xx…) no son de una alta corte y no se rotulan como tales. SAMAI solo titula una parte de sus providencias: no encontrar un radicado no dice nada sobre el proceso, y el estado procesal no está en este servidor. La Corte Suprema no permite buscar por radicado.
El Diario Oficial (buscar_diario_oficial) dice en qué diario salió una norma (tipo + número) o qué diarios salieron en unas fechas. No da el texto: el PDF del diario es de sesión (sin la cookie responde 404) y pesa hasta 15 MB. No sabe qué normas trae cada diario ni filtra por entidad.
Línea jurisprudencial. linea_jurisprudencial lista las providencias que, según la relatoría de la Corte Constitucional, citan una sentencia (su bloque «citaciones»; la premisa de que la relatoría publica «sentencias que reiteran» era falsa: sí publica quién cita a quién). Que una sentencia cite a otra no es que la reitere ni que la respete, la lista puede estar incompleta (medido: T-233/24 menciona la C-337/11 y no consta) y topa en 100. Que una SU posterior la haya superado no se deduce: hay que leer la providencia.
Ritmo de consulta. El servidor hace como máximo una petición por segundo sostenida a cada portal, con ráfagas de hasta cinco, y nunca dos a la vez al mismo sitio. Si un portal responde que está limitando las consultas, espera lo que él indique en vez de insistir. Son servicios públicos y conviene que un asistente automático les pese menos que una persona navegando.
Caché en disco (opcional). Con la variable de entorno CACHE_DIR apuntando a un directorio, las copias de documentos sobreviven a los reinicios del cliente: una providencia de 3,4 MB pasó de 2.278 ms a 26 ms en un proceso nuevo (medido el 2026-09-28) y, cuando la copia vence, se revalida con If-Modified-Since (304, cero bytes). Solo se guardan documentos, nunca buscadores ni APIs; el directorio se poda a 500 ficheros o 256 MB, lo más antiguo primero. Sin la variable no se toca el disco.
Privacidad. Cada consulta viaja a servidores del Estado colombiano, que registran las peticiones y tu dirección IP, igual que si navegaras el sitio. No se envía nada a ningún otro servidor, no hay analítica y no se recoge información tuya. Tenlo en cuenta si vas a consultar sobre un asunto propio.
Datos empaquetados. Se incluyen dos índices, cada uno con su fecha de generación:
El temático (12.063 pares tema/subtema, 56.458 asociaciones norma–subtema, 2026-08-01) responde al instante y sigue sirviendo si el portal se cae. Si supera los tres meses, el servidor te lo advierte.
El de SUIN (11.613 leyes, 2026-09-24) traduce una cita escrita como texto a su documento sin salir a la red. La vigencia no depende de él: se pide en vivo a la ficha de SUIN por tipo, número y año, para leyes y decretos.
SUIN-Juriscol cambió de portal (septiembre de 2026). La ficha con el estado de vigencia sale ahora del índice público de su buscador nuevo, que trae leyes y decretos y llega hasta 2020: de una norma posterior no hay ficha, y la respuesta lo dice en vez de callarlo. El texto de los documentos ya no se puede leer desde fuera: el visor del portal lo pide a una dirección privada del Ministerio y se queda en blanco (medido con un navegador el 2026-09-24). Se entrega la ficha, el estado y el enlace clásico viewDocument.asp?id=. Comprobado de nuevo el 2026-09-28, cuando el portal anunció su vuelta: el buscador nuevo (lexis.minjusticia.gov.co/buscador/Detallado/1, /2 y /3) consulta el mismo índice, que sigue llegando a 2020, y su visor sigue apuntando a direcciones privadas; la página suin-juriscol.gov.co/suin/normativahistorica es una página del gestor de contenidos del Ministerio y su API responde 404 para ese identificador, así que no hay datos que leer.
Cobertura de la búsqueda tributaria. La primera consulta de cada término a la DIAN tarda unos 20 segundos: su portal devuelve el resultado completo y no admite límite. Las páginas siguientes del mismo término son instantáneas, así que conviene paginar en lugar de repetir búsquedas.
El enlace del Consejo de Estado caduca; el radicado no. buscar_jurisprudencia_consejo_estado entrega, junto a cada providencia, un token firmado que emite el propio buscador y con el que obtener_documento con fuente consejo saca el texto del PDF. Ese token vive una hora: sirve para leer, no para citar. Para citar se usa el radicado. Si caducó, se repite la búsqueda y sale uno nuevo.
El texto de la Corte Suprema se pide con su ruta y su sala. buscar_jurisprudencia_suprema devuelve la referencia, el ponente, la fecha y las normas citadas; obtener_documento con fuente suprema devuelve el texto completo, pero exige la MISMA sala con la que apareció la providencia: el backend la busca dentro de esa sala y desde otra no la encuentra.
La relatoría no indexa frases largas. buscar_jurisprudencia con varias palabras («mora querella policiva») hace que el buscador de la Corte responda con un aviso de «búsquedas flexibles» y 0 resultados. El servidor lo detecta, reintenta con la palabra más distintiva del término («querella») y lo anuncia en la respuesta: «La relatoría no indexa la frase completa; se buscó con el núcleo «X»». Verifica la pertinencia del resultado contra lo que buscabas.
Para desarrolladores
npm install
npm run check # typecheck + lint + pruebas de biblioteca + de extremo a extremo
npm run medir # métricas: bundle, arranque, índices y una fila por herramienta (p50/p95/peticiones/bytes)
npm run generar-indice # regenera datos/indice-tematico.json (~20 MB de descarga)
npm run generar-indice-suin # regenera datos/indice-suin.json (unos segundos: pagina el índice del portal de SUIN)
npm run pack # produce normativa-colombia.mcpb
npm run salud # healthcheck interno: sondea en paralelo los portales que consulta el servidor (OK / LENTO / CAÍDO, con latencia)datos/ sí está versionado: sin él un clon limpio no pasa las pruebas. Regenéralo solo cuando quieras actualizarlo.
Las pruebas consultan los portales oficiales. SIN_RED=1 npm test corre solo la lógica pura, útil para iterar rápido o sin conexión.
No hay integración continua: npm run check se corre a mano antes de publicar. Conviene ejecutarlo cada tanto aunque no se haya tocado el código, porque es lo que detecta que un portal cambió su HTML.
El fichero glama.json de la raíz declara los metadatos del servidor en el registro de Glama (schema oficial con maintainers); se empaqueta en el .mcpb y viaja en el paquete npm. El checklist de calidad y el diagnóstico de las descripciones de las herramientas viven en CALIDAD_HERRAMIENTAS_GLAMA.md (nota de trabajo, no se publica en npm).
Estructura:
Archivo | Responsabilidad |
| Herramientas y prompts MCP |
| Núcleo compartido: |
| Handlers de herramientas MCP: |
| Gestor Normativo (HTML raspado, con canarios) |
| SUIN-Juriscol: ficha, vigencia e índice empaquetado |
| Normograma de la DIAN (JSON) |
| Tres tribunales: |
| Reguladores sectoriales (CREG, ANH, UPME, ANLA y 11 más vía |
| Banco de métricas, para que optimizar no sea a ojo |
|
|
|
|
| Pruebas de biblioteca contra las fuentes reales |
| Arranca el servidor y le habla por stdio, como cualquier cliente MCP |
| Red de regresión: casos por dominio leyendo |
Las instrucciones de uso que recibe el modelo están en INSTRUCCIONES, en src/index.ts: son el único mecanismo que orienta qué herramienta se elige, cosa que ninguna prueba puede verificar.
Dos notas para quien vaya a tocar esto:
Cuatro portales envían la cadena TLS incompleta.
funcionpublica.gov.copresenta un certificado de «Sectigo RSA Organization Validation» pero manda el intermedio de Domain Validation;suin-juriscol.gov.co,sic.gov.coywww.corteconstitucional.gov.co(intermedio «Go Daddy Secure Certificate Authority - G2») omiten directamente el suyo.curllo tolera porque su bundle ya los trae; Node no.src/nucleo/ca.tsincluye los cuatro intermedios para completar la cadena sin desactivar la verificación: las raíces que los firman sí vienen con Node. No lo cambies porrejectUnauthorized: false.Los códigos HTTP mienten en dos fuentes. El backend de la Corte Suprema responde 200 con una página de mantenimiento ante rutas inventadas, y la relatoría de la Constitucional devuelve el armazón de su SPA en vez de un 404. Por eso los canarios validan la forma de la respuesta y nunca el código de estado.
El canario. Si el HTML del portal cambia, los parsers lanzan
CanarioErroren vez de devolver listas vacías. Es deliberado: una lista vacía silenciosa se lee como «no existe esa norma», y en materia legal esa confusión es el peor fallo posible.Un fallo de red nunca se presenta como un vacío.
buscar_unificadodistingue "respondió sin nada" de "no se pudo consultar: " por fuente; una fuente caída no autoriza a concluir que no hay resultados ahí.La SIC vive en la sede electrónica. El repositorio viejo (
www.sic.gov.co/repositorio-de-normatividad) responde 301 asedeelectronica.sic.gov.co/transparencia/normativa/busqueda-de-normas/entidad; el adaptador apunta directo a la sede porquepedirno sigue redirecciones.
Contribuir
Las guías están en CONTRIBUTING.md, y hay cuatro reglas que no se negocian: el canario nunca devuelve vacío en silencio, no se desactiva la verificación TLS, no se sube el ritmo de peticiones a los portales y ninguna respuesta afirma vigencia.
Si el servidor te dio una respuesta incorrecta, ese es el reporte más valioso: hay una plantilla de issue para eso.
Para reportar una vulnerabilidad, mira SECURITY.md; no abras un issue público.
Licencia
Código bajo licencia MIT (ver LICENSE). Sobre los contenidos normativos y el acceso automatizado a los portales, mira NOTICE.md.
Available Tools
28 toolsanalizar_conflictoAnalizar un posible conflicto entre dos normasARead-onlyIdempotent
Reúne para dos normas la EVIDENCIA de un posible conflicto. Por cada una: identificación en el Gestor, vigencia según SUIN cuando consta, nivel en la jerarquía y su carácter, y notas de reforma de cualquier artículo. Con sobre añade los pasajes de ambas que mencionan ese tema. NO detecta contradicciones semánticas: el resultado es un conflicto POTENCIAL, no una conclusión jurídica; verifica en los enlaces antes de actuar. Para confrontar el texto de dos artículos concretos usa comparar_articulos. Con formato="json" devuelve un objeto con fecha_consulta, alcance, sobre (si se pidió), evidencias (una por norma, con los mismos campos del texto) y avisos.
| Name | Required | Description | Default |
|---|---|---|---|
| sobre | No | Tema opcional para buscar artículos de ambas que lo mencionen | |
| formato | No | Salida: "markdown" (texto legible, por defecto) o "json" (un objeto con fecha_consulta, alcance, evidencias y avisos, sin cabecera ni pie) | markdown |
| norma_a | Yes | Cita de la primera norma, ej. "Ley 909 de 2004" | |
| norma_b | Yes | Cita de la segunda norma |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial context beyond them: the exact evidence fields gathered, the SUIN-vigencia lookup, the limitation on semantic detection, and the caution that the output is not a legal conclusion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then evidence fields, then caveats and the alternative tool. Dense but nearly every clause earns its place; the single long paragraph could be slightly tightened but is well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the json return structure and the markdown default, covers all four parameters' roles, and states the tool's limits. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning: it explains that 'sobre' pulls passages from both norms mentioning that theme and details the shape of the json output (fecha_consulta, alcance, sobre, evidencias, avisos) beyond the schema's terse enum note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it gathers EVIDENCE of a possible conflict between two norms, and enumerates exactly what evidence per norm (identification in Gestor, vigencia per SUIN, hierarchy level and character, reform notes). It explicitly differentiates itself from comparar_articulos, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when/when-not guidance: it declares it does NOT detect semantic contradictions, that the result is a POTENTIAL conflict and not a legal conclusion, that links must be verified before acting, and that comparar_articulos is the tool for confronting the text of two concrete articles.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_diario_oficialBuscar en el Diario Oficial (Imprenta Nacional)ARead-onlyIdempotent
Diarios Oficiales publicados: número, tipo de edición (Ordinaria, Extraordinaria, Especial, Oficio o Tributario) y fecha de publicación. Sirve para saber qué salió publicado y cuándo, incluso el mismo día, antes de que el Gestor Normativo lo catalogue. Filtra por número de diario, por rango de fechas y por el tipo y el número de una norma (encuentra el diario que la publicó: tipo="LEY" y numero_norma="2466" devuelve el 53.160). NO dice qué normas contiene cada diario ni trae su texto, y el PDF del diario no tiene enlace estable: para el texto de una norma usa resolver_cita; para buscarla por materia, buscar_normas.
| Name | Required | Description | Default |
|---|---|---|---|
| tipo | No | Tipo de norma: los diarios que la contienen; solo filtra junto con numero_norma | |
| desde | No | Fecha de publicación inicial, "2026-09-01" o "01/09/2026" | |
| hasta | No | Fecha de publicación final, "2026-09-30" o "30/09/2026" | |
| limite | No | Cuántos diarios mostrar (hasta 50); el portal los sirve de 10 en 10 | |
| numero | No | Número del diario, ej. "53.640"; identifica uno solo | |
| numero_norma | No | Número de la norma, sin el año (ej. "2466"); exige tipo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld safety, and the description adds substantive behavior beyond them: it does NOT list the norms each diario contains, does not return text, and the diario PDF has no stable link. It also notes the freshness advantage (same-day visibility). No auth or rate-limit detail, but the added context is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it returns, then purpose, then filter mechanics, then exclusions/alternatives. Dense but every sentence carries information; slightly long but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with no output schema, the description covers return fields, filter combinations, non-returned data, unstable links, and sibling routing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 cross-parameter semantics the schema can't: tipo and numero_norma must be used together to find the diario that published a norm, with a worked example (LEY + 2466 → 53.160). This genuinely clarifies how to combine filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (published Diarios Oficiales) and the exact fields it exposes (número, tipo de edición, fecha de publicación). It explicitly distinguishes itself from resolver_cita and buscar_normas, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use context (knowing what was published and when, even same-day, before the Gestor Normativo catalogues it) and explicit when-not-to-use with named alternatives: resolver_cita for a norm's text, buscar_normas for subject searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_en_suinBuscar en SUIN-JuriscolARead-onlyIdempotent
Busca en los 56.832 documentos de SUIN-Juriscol (MinJusticia) por título, epígrafe, materia o entidad emisora: leyes, decretos y resoluciones desde 1844, incluidos documentos que el Gestor Normativo no tiene. Devuelve título, epígrafe, enlace y la vigencia del BUSCADOR, que NO es fiable (contradice la ficha). NO busca dentro del articulado ni sirve para citas exactas ("LEY 909 DE 2004" no devuelve nada): para una cita, y para el estado real de vigencia, usa resolver_cita. vigencia y sector acotan la búsqueda de texto, no la sustituyen; para el tramo siguiente repite la misma llamada con desde = desde + limite. SU ÍNDICE TIENE HUECOS: "Teletrabajo" devuelve cero pese a estar en el título de la Ley 1221 de 2008, y una frase larga empareja por palabras comunes. Ante un vacío, NO concluyas que no existe: prueba buscar_por_tema.
| Name | Required | Description | Default |
|---|---|---|---|
| desde | No | Cuántos saltarse antes de empezar | |
| texto | Yes | Palabras del título, epígrafe o materia. Ej.: "servicio militar", "Buenaventura" | |
| limite | No | ||
| sector | No | Sector administrativo, ej. "Hacienda y Crédito Público" | |
| vigencia | No | Filtra por el estado que declara el BUSCADOR, que no siempre coincide con la ficha |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint, idempotentHint, openWorldHint), so the description is not obliged to restate safety. It nonetheless adds high-value behavioral caveats: the returned vigencia comes from the searcher and is unreliable, the index has gaps ('Teletrabajo' returns zero), and long phrases match on common words. This goes well beyond what annotations declare.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, size and searchable fields before the caveats, and every sentence carries operational weight (unreliable vigencia, index gaps, pagination loop, empty-result fallback). It is dense and runs long, but there is little pure filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (título, epígrafe, enlace, vigencia) and warns that the vigencia value is not trustworthy. Combined with the coverage gap and empty-result guidance, an agent has everything needed to call this correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% (baseline 3), and the description adds meaning on top: it clarifies that vigencia and sector narrow the text search rather than replacing it, and demonstrates the desde/limite pagination arithmetic. It does not add format detail for the free-text query beyond the schema example, so it is strong but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Busca en los 56.832 documentos de SUIN-Juriscol... por título, epígrafe, materia o entidad emisora') and explicitly scopes out what it is not ('NO busca dentro del articulado'), routing to resolver_cita. An agent can distinguish it from buscar_por_tema, buscar_normas and the many sibling search tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not conditions and named alternatives: use resolver_cita for exact citations and real vigencia, use buscar_por_tema when a search returns empty. It also explains the pagination loop ('repite la misma llamada con desde = desde + limite'), which is actionable invocation guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_jurisprudenciaBuscar jurisprudencia de la Corte ConstitucionalARead-onlyIdempotent
Sentencias y autos de la relatoría de la Corte Constitucional (44.839 providencias, con fallos de 2026 publicados el mismo año). Es la vía para jurisprudencia constitucional: el Gestor tiene muy poca. Devuelve sentencia, tipo, fecha, síntesis y la ruta para obtener_documento con fuente="corte". La relatoría no indexa frases largas: con varias palabras se reintenta con la más distintiva y la respuesta lo anuncia ("se buscó con el núcleo «X»"). Es la CORTE CONSTITUCIONAL: para la Suprema usa buscar_jurisprudencia_suprema; para el Consejo de Estado, buscar_jurisprudencia_consejo_estado.
| Name | Required | Description | Default |
|---|---|---|---|
| desde | No | Fecha inicial AAAA-MM-DD (por defecto 1992-01-01) | |
| hasta | No | Fecha final AAAA-MM-DD | |
| tipos | No | Tipos a incluir; por defecto C, T y SU (doctrina). Los autos (A) son mayoría por volumen y suelen ser trámite: pídelos explícitamente. Se aceptan sus nombres: "tutela", "constitucionalidad", "unificacion", "auto". | |
| limite | No | Cuántas providencias mostrar (hasta 100) | |
| termino | Yes | Obligatorio. Términos a buscar en la relatoría, ej. "teletrabajo" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, it discloses corpus size and recency, the exact return fields (sentencia, tipo, fecha, síntesis, ruta para obtener_documento con fuente="corte"), and a non-obvious engine behavior: the relatoría does not index long phrases, so a retry occurs with the most distinctive word and the response announces it ('se buscó con el núcleo «X»'). That is substantive behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: identity and corpus first, then return shape, then the query-retry caveat, then sibling disambiguation. Every sentence carries information an agent needs to call the tool correctly; nothing is redundant boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with no output schema, the description supplies the return fields and the handoff to obtener_documento (fuente="corte"), covers all sibling alternatives, and warns about the long-phrase limitation. Nothing needed to invoke or interpret a call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning the schema does not: how 'termino' behaves against the relatoría's indexing (long phrases fail, most distinctive word is used), plus a warning that autos are numerous and mostly procedural so they must be requested explicitly. The remaining parameters (desde, hasta, limite) are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Sentencias y autos de la relatoría de la Corte Constitucional') and quantifies the corpus (44.839 providencias, fallos de 2026). It explicitly distinguishes itself from the sibling jurisprudencia tools (Suprema, Consejo de Estado), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it ('Es la vía para jurisprudencia constitucional: el Gestor tiene muy poca') and names both alternatives with the condition that selects them: 'para la Suprema usa buscar_jurisprudencia_suprema; para el Consejo de Estado, buscar_jurisprudencia_consejo_estado'. It also tells the agent how to retry when a long phrase fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_jurisprudencia_consejo_estadoBuscar jurisprudencia del Consejo de EstadoARead-onlyIdempotent
Providencias tituladas del Consejo de Estado, el supremo de lo contencioso administrativo (nulidad y restablecimiento, contratación estatal, nulidad electoral, reparación directa, conceptos de la Sala de Consulta). Para la Corte Constitucional usa buscar_jurisprudencia; para la Suprema, buscar_jurisprudencia_suprema; con un radicado concreto, resolver_cita. Cada resultado trae el problema jurídico y su respuesta, el enlace a la ficha en SAMAI y el token con el que obtener_documento (fuente="consejo") devuelve el texto. CÓMO BUSCA: con exacto=true (activado) busca la FRASE EXACTA y, si no aparece, se amplía solo a OR avisándolo; en modo OR el número de páginas mide el corpus, no la pertinencia. Avanza con pagina; limite recorta DENTRO de la página y lo que deja fuera no sale en la siguiente.
| Name | Required | Description | Default |
|---|---|---|---|
| texto | Yes | Términos a buscar, ej. "nulidad electoral", "liquidación del contrato" | |
| exacto | No | Frase exacta en SAMAI (activado); si no aparece, se amplía solo a OR con aviso. Ponlo en false para ampliar a propósito. | |
| limite | No | Cuántas mostrar de la página (hasta 10) | |
| pagina | No | Página de resultados, desde 1. SAMAI pagina en bloques de ~10 y no admite un desplazamiento libre, por eso aquí se pide la página y no el "desde" del resto de herramientas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world behavior, and the description adds substantial non-obvious mechanics on top: exact-phrase search with automatic silent widening to OR plus a warning, OR-mode page counts measuring corpus rather than relevance, limite truncating within a page with dropped results not reappearing, and pagination being page-based because SAMAI doesn't allow free offset. It also discloses what each result contains (problema jurídico + respuesta, SAMAI ficha link, token for obtener_documento).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and routing before the mechanics block, and every sentence carries information (routing, result contents, search behavior, pagination caveat). It is dense and long, but not padded; a slight cost in scannability is the only knock.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the result payload (problema jurídico and its answer, SAMAI link, download token) and how to fetch full text via obtener_documento with fuente="consejo". Combined with the pagination and exact/OR semantics, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real semantics the schema only gestures at: the auto-widening behavior of exacto, the fact that limite cuts inside the current page and the excess is lost rather than deferred, and why pagina is used instead of an offset. These are non-obvious operational consequences that materially change how an agent sets the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Providencias tituladas del Consejo de Estado') and immediately scopes it to the contencioso administrativo domain with concrete subject matter. It explicitly names the sibling tools for the other high courts (buscar_jurisprudencia, buscar_jurisprudencia_suprema) and the radicado-based alternative (resolver_cita), so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use-this vs when-to-use-sibling routing rules: this tool for Consejo de Estado, buscar_jurisprudencia for Corte Constitucional, buscar_jurisprudencia_suprema for Suprema, and resolver_cita when a specific radicado exists. That is exactly the alternative-selection guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_jurisprudencia_supremaBuscar jurisprudencia de la Corte Suprema de JusticiaARead-onlyIdempotent
Providencias de la Corte Suprema por sala (Tutelas, Civil, Laboral o Penal), desde 1991. NO es la Corte CONSTITUCIONAL (usa buscar_jurisprudencia) ni el Consejo de Estado (buscar_jurisprudencia_consejo_estado). Cada resultado trae las NORMAS QUE CITA (resolubles con resolver_cita) y una RUTA con la que obtener_documento con fuente="suprema" devuelve el texto. Cada llamada mira UNA sala y, si no la indicas, solo Tutelas: una pregunta civil, laboral o penal tiene que nombrar su sala; anio y magistrado acotan dentro de ella. Si la frase exacta no da nada, se repite sola con OR y la respuesta lo avisa: no pases exacto=false para eso. Busca en el texto completo sin descartar palabras comunes: usa términos distintivos.
| Name | Required | Description | Default |
|---|---|---|---|
| anio | No | Año de cuatro dígitos | |
| sala | No | Sala de la Corte. Obligatoria: sin ella el buscador no responde. | Tutelas |
| desde | No | Cuántas saltarse antes de empezar | |
| texto | Yes | Términos a buscar, ej. "despido sin justa causa" | |
| exacto | No | Frase exacta (activado). Con false el buscador une con OR: "despido sin justa causa" pasa de 20.233 a 176.012 providencias y en la sala Penal es inservible. Ponlo en false solo para ampliar a propósito. | |
| limite | No | Cuántas mostrar. El buscador entrega páginas de 10 como máximo; para ver más, usa desde. | |
| magistrado | No | Nombre del magistrado ponente |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, it discloses that each result carries cited norms resolvable with resolver_cita and a ruta usable with obtener_documento(fuente="suprema"), that the search auto-retries with OR and flags it in the response, and that common words are not dropped. These are actionable behaviors not derivable from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense, front-loaded and every sentence carries routing or behavioral information, with scope and exclusions stated first. It is heavy on stacked parentheticals, which slightly hurts scanability, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing what a result contains (cited norms, ruta) and how pagination works (limite max 10, use desde for more). For a 7-parameter search tool this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: sala is effectively mandatory per call and defaults to Tutelas, anio/magistrado scope within a sala, and exacto=false should not be used to work around empty results. The exacto widening cost is already in the schema description, so it is partly redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (buscar) and resource (providencias de la Corte Suprema por sala), gives the covered date range and the four salas, and explicitly excludes the two nearest siblings (Corte Constitucional via buscar_jurisprudencia and Consejo de Estado via buscar_jurisprudencia_consejo_estado). An agent can route to it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it, the hard constraint that each call covers ONE sala and defaults to Tutelas only, that civil/laboral/penal questions must name their sala, that anio and magistrado narrow within it, and how to widen a failed exact search. Alternatives are named with their conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_normasBuscar normas en el Gestor NormativoARead-onlyIdempotent
Busca leyes, decretos, resoluciones, conceptos y sentencias del sector público colombiano. IMPORTANTE: el buscador del portal indexa solo los resúmenes temáticos, NO el articulado completo, y une los términos con OR. Usa pocas palabras y muy distintivas. Para buscar dentro del texto de una norma concreta, usa obtener_documento con fuente="gestor" y buscar_en_texto. Para una cita exacta, usa resolver_cita.
| Name | Required | Description | Default |
|---|---|---|---|
| anio | No | Año de cuatro dígitos, como texto. Ej.: "2004" | |
| tema | No | Nombre del tema, o su id de listar_catalogos con prefijo: "tema-24457" | |
| limite | No | ||
| numero | No | Número de la norma, como texto. Ej.: "909" | |
| entidad | No | Nombre o id: "Corte Constitucional", "Congreso de la República" | |
| subtema | No | id de listar_catalogos con catalogo="subtemas" y prefijo ("sub-38968"), o su nombre si además indicas tema. El "ts-" de buscar_por_tema no vale aquí. | |
| palabras | No | Términos distintivos; evita frases largas | |
| tipo_documento | No | Nombre o id del catálogo de tipos del Gestor: "Ley", "Decreto", "Resolución", "Concepto". Uno que no esté se rechaza con la lista, sin buscar |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent profile, and the description adds genuinely non-obvious retrieval behavior: the portal indexes only thematic summaries rather than the full articulado, and terms are combined with OR. That directly changes how an agent should formulate a query, which is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then flags the critical indexing caveat with IMPORTANTE, then gives the two routing alternatives. Dense but every sentence earns its place; slightly crowded by the two consecutive alternative sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter search tool with no output schema and no required parameters, the description covers the essential trap (summary-only index, OR semantics) and the routing to obtener_documento/resolver_cita. It does not describe result shape or ordering, but annotations and the rich schema cover most of the remaining ground.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so the schema documents almost every parameter (anio pattern, tema/subtema id prefixes, tipo_documento rejection behavior). The description only adds the OR/few-distinctive-words guidance for palabras, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (busca) plus the exact resources (leyes, decretos, resoluciones, conceptos, sentencias) and scopes them to the Colombian public sector, which cleanly separates it from the jurisprudence- and sector-specific siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives by condition: obtener_documento with fuente="gestor" y buscar_en_texto for full-text search inside a norm, and resolver_cita for exact citations. It also tells the agent how to query (pocas palabras y muy distintivas), which is actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_normativa_anhBuscar normativa de la ANH (hidrocarburos)ARead-onlyIdempotent
Resoluciones, acuerdos y circulares de la Agencia Nacional de Hidrocarburos (785 documentos): contratos de exploración y producción, regalías, fiscalización y reservas. ÚSALA para hidrocarburos y regalías; NO devuelve el texto (publica en PDF), solo el epígrafe, el PDF y la ficha. Para leyes o decretos nacionales de cualquier sector usa resolver_cita. Por defecto OCULTA los actos de personal, que son dos de cada tres; pídelos con incluir_administrativos=true si de verdad los buscas.
| Name | Required | Description | Default |
|---|---|---|---|
| tipo | No | ||
| desde | No | Fecha inicial AAAA-MM-DD | |
| hasta | No | Fecha final AAAA-MM-DD | |
| texto | No | Palabra clave, ej. "regalías", "fiscalización" | |
| numero | No | Número del acto, como texto | |
| pagina | No | Página de 20; hay 40 en total sin filtros | |
| incluir_administrativos | No | Incluir nombramientos, encargos y demás actos de personal. Por defecto se ocultan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, openWorld), but the description adds real behavioral context: it returns no full text, only epígrafe/PDF/ficha, and by default hides personnel acts (two of every three) with a documented override. This is exactly the hidden-default behavior an agent could otherwise miss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: identity, scope, output limitation, alternative tool, default-hiding behavior with override. Every clause carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains what comes back (epígrafe, PDF, ficha, not text), and pagination is handled in the schema. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so most parameters are self-documenting. The description still adds meaning beyond the schema by explaining why incluir_administrativos defaults to false and how consequential that default is. Other params (tipo, texto, pagina) add nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (resoluciones, acuerdos y circulares de la ANH) plus document count and topical scope (contratos, regalías, fiscalización, reservas). It also distinguishes itself from the sibling resolver_cita by sector. An agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'ÚSALA para hidrocarburos y regalías' and 'Para leyes o decretos nacionales de cualquier sector usa resolver_cita'. It also instructs when to toggle incluir_administrativos. Both the when and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_normativa_sectorialBuscar normativa de un regulador sectorialARead-onlyIdempotent
Actos administrativos —resoluciones, circulares, acuerdos— de los reguladores y ministerios sectoriales que el Gestor Normativo NO cataloga; elige cuál en entidad. CUÁNDO NO USARLA: para leyes y decretos nacionales de cualquier sector usa resolver_cita o buscar_por_tema, que dan texto completo y vigencia; el Decreto Único Reglamentario de cada sector (1071, 1072, 1074, 1076, 1079…) ya está en el Gestor.
Casi todas entregan PDF sin texto extraíble, y la mayoría no publica estado de vigencia; donde aparece (ANM, Supersociedades) es la fila del propio portal, no una verificación: para el estado real de una ley o un decreto, resolver_cita.
LOS FILTROS NO SE COMPORTAN IGUAL EN TODAS: el Invima exige texto o año; la Superfinanciera y la Supertransporte se quedan en el año en curso si no indicas otro; la ANM no aplica el año a las circulares. Cada respuesta dice qué hizo, pero no lo adivines: indica el año si lo esperabas.
| Name | Required | Description | Default |
|---|---|---|---|
| anio | No | Año de cuatro dígitos | |
| texto | No | Filtra por número, año o epígrafe | |
| limite | No | ||
| pagina | No | ||
| entidad | Yes | Regulador a consultar. Usa describir_fuentes para ver qué sector cubre cada uno. | |
| categoria | No | Tipo de acto o categoría (cada fuente declara cuáles soporta; solo Unidad de Víctimas lo filtra hoy) | |
| solo_entidad | No | Solo INVIMA/Supersalud: excluye la compilación sectorial del normograma (leyes, decretos y sentencias) y deja solo los actos que la entidad expide (Resolución, Circular…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely new context beyond that: most results are PDFs without extractable text, validity status is usually absent and where shown is the portal row rather than verification, and each response self-reports what it did.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then the exclusion clause, then caveats — a logical progression. It is dense and parenthetical-heavy, but nearly every sentence carries non-obvious operational information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-output-schema tool spanning heterogeneous sources, the description covers the source scope, the routing alternatives, the per-entity filter quirks, and the return-format limitations directly in the text. Nothing an agent needs to call it without guessing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 71% schema coverage the baseline is ~3, and the description exceeds it: it explains that `entidad` selects the regulator and discloses that filters behave differently per entity (Invima requires text or year; Superfinanciera/Supertransporte default to the current year; ANM ignores year for circulares). Coverage of `limite`/`pagina` is left to the schema, keeping this short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (actos administrativos: resoluciones, circulares, acuerdos) from a specific source class (reguladores y ministerios sectoriales), and explicitly delimits the scope with 'que el Gestor Normativo NO cataloga'. An agent can distinguish it from the national-law siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'CUÁNDO NO USARLA' clause that names the alternatives (resolver_cita, buscar_por_tema) and the condition selecting them (leyes y decretos nacionales). It also notes that the Decreto Único Reglamentario per sector is already in the Gestor, steering the agent away from a redundant call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_normativa_tributariaBuscar normativa tributaria, aduanera y cambiaria (DIAN)ARead-onlyIdempotent
Normograma de la DIAN: decretos, resoluciones, conceptos y circulares en materia tributaria, aduanera y cambiaria, que ninguna otra herramienta cubre. Devuelve el extracto y el enlace; para leer el documento usa obtener_documento con fuente="dian". Para una ley o un decreto que ya tienes citado, también el Estatuto Tributario y sus artículos, usa resolver_cita; buscar_normas no mira este normograma. AVISO: la primera búsqueda de cada término tarda ~20 s (el portal devuelve el resultado completo y no admite tope), pero las páginas siguientes del MISMO término son instantáneas: pagina con desde en vez de lanzar búsquedas nuevas.
| Name | Required | Description | Default |
|---|---|---|---|
| desde | No | Cuántos saltarse antes de empezar | |
| texto | Yes | Términos a buscar, ej. "retención en la fuente", "declaración de importación" | |
| limite | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, openWorld and non-destructive, but the description adds behavior they cannot convey: ~20 s for the first search of a term because the portal returns the full uncapped result, and that subsequent pages of the same term are instant. This latency and pagination cost model is exactly the extra context the bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource, then alternatives, then the performance warning. Every clause carries information (domain, routing, latency), but it is dense and the final warning sentence is long; slightly tighter phrasing would help. No wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with no output schema it states the return shape (extracto y enlace), routes to obtener_documento for the full text, warns about latency, and prescribes a pagination strategy. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: 'texto' and 'desde' are documented, 'limite' is not. The description adds real meaning beyond the schema by explaining that 'desde' should be used to paginate the same term rather than firing new searches, and by hinting at the uncapped result ('no admite tope') relevant to 'limite'. It still never explains 'limite' semantics, so a 4 rather than a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: the DIAN normogram of decretos, resoluciones, conceptos and circulares in tax, customs and exchange matters, explicitly claiming domain that no other tool covers. It names the sibling (buscar_normas) that does NOT serve this normogram, so an agent can differentiate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use obtener_documento with fuente="dian" to read the full document, use resolver_cita for an already-cited law/decree or the Estatuto Tributario, and a warning that buscar_normas does not cover this normogram. When/when-not and the alternative are stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_normativa_upmeBuscar circulares y resoluciones de la UPMEARead-onlyIdempotent
Circulares y resoluciones de la Unidad de Planeación Minero Energética: convocatorias de transmisión y de gas, planes de expansión y actos administrativos. Devuelve título, resumen, fecha de publicación y enlace al PDF; NO el texto. Para la CREG usa buscar_resoluciones_creg; para leyes y decretos, resolver_cita. pagina cuenta en bloques de limite: no cambies limite mientras paginas. Los actos de personal se quitan DESPUÉS de traer la página, así que una página puede mostrar menos de limite sin ser la última. OJO CON LAS FECHAS: la fecha que publica su portal es la de PUBLICACIÓN EN LA WEB, no la de la norma — la "Resolución 1163 de 2024" figura publicada en 2025. El número y el año reales están en el título.
| Name | Required | Description | Default |
|---|---|---|---|
| texto | No | Términos a buscar, ej. "transmisión", "plan de expansión" | |
| limite | No | ||
| pagina | No | ||
| incluir_administrativos | No | Incluir nombramientos y demás actos de personal. Por defecto se ocultan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the description's added value is substantial: it specifies the exact return fields (título, resumen, fecha, enlace PDF) and explicitly that full text is NOT returned, plus two non-obvious behaviors (post-filtering of personal acts affecting page size, and portal dates being web-publication dates rather than norm dates).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and routing, then accumulates operational caveats. Every sentence carries actionable information and none are filler, though the density makes it longer than a typical description; it borders on over-packed but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully compensates by describing the return shape and its limitations, and it covers sibling routing, pagination mechanics, hidden-result filtering, and date semantics. An agent has everything needed to call and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 50% schema coverage, the description compensates well: it explains how pagina interacts with limite (block counting, fixed limite during paging) and clarifies the effect of incluir_administrativos via the post-filtering behavior. It does not, however, add much to the texto parameter beyond the schema's own examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (buscar circulares y resoluciones de la UPME), enumerates the content types covered (convocatorias de transmisión y gas, planes de expansión, actos administrativos), and immediately distinguishes itself from siblings buscar_resoluciones_creg and resolver_cita. An agent can identify the correct source without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: CREG queries go to buscar_resoluciones_creg and laws/decrees go to resolver_cita. It also states operating constraints (don't change limite while paginating) and explains when a short page is not the last one, which prevents misuse of pagination.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_por_temaBuscar por tema y subtemaARead-onlyIdempotent
Consulta temática oficial: devuelve tema, subtema y las normas, sentencias y conceptos asociados (hasta 8 por fila). Responde desde un índice empaquetado, instantáneo y sin red; solo si el índice no tiene el término consulta el portal del Gestor. limite cuenta filas de tema/subtema, no documentos. Cada fila trae temsubid ("ts-38872") y normid: pásalos juntos, de la MISMA fila, a explicar_relacion_tema. El prefijo "ts-" es parte del id: pégalo tal cual y no lo cruces con el "sub-" ni el "tema-" de listar_catalogos, que son otras dos taxonomías del portal con los mismos números. Para una norma concreta usa resolver_cita; para buscar palabras en los resúmenes, buscar_normas.
| Name | Required | Description | Default |
|---|---|---|---|
| texto | Yes | Tema a buscar, ej. "teletrabajo", "encargo", "prima de servicios" | |
| limite | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, but the description adds substantial operational context beyond them: it answers from a packaged index instantly and without network, falls back to the Gestor portal only when a term is missing, and clarifies that 'limite' counts theme/subtheme rows rather than documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every sentence carries distinct operational value (return shape, fallback behavior, id format, cross-tool routing). It is dense and slightly long, but there is little genuine waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden: it describes the returned fields, the per-row cap of 8, the temsubid/normid identifiers with their 'ts-' prefix, and how to feed those ids to explicar_relacion_tema from the same row.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%; 'texto' is documented in the schema, but the description rescues 'limite' by explaining it counts theme/subtheme rows, not documents. It does not add syntax detail for 'texto', so it is strong but not exhaustive given the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Consulta temática oficial') and enumerates exactly what it returns: tema, subtema, and the associated normas, sentencias and conceptos. It also distinguishes itself from siblings by naming resolver_cita for a single norm and buscar_normas for keyword searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use this for thematic consultation, resolver_cita for a specific norm, and buscar_normas for word-level searching across summaries. It also states the runtime behavior of when it hits the network versus the local index.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_resoluciones_cregBuscar resoluciones de la CREG (energía y gas)ARead-onlyIdempotent
Resoluciones de la Comisión de Regulación de Energía y Gas: tarifas, conexión, comercialización, plantas solares y gas natural. Devuelve número, año, epígrafe, el estado según la compilación y la ruta para leer el texto con obtener_documento (fuente="creg"): es la ÚNICA fuente sectorial con texto legible aquí. Cada consulta recorre UNA compilación de UN año: texto filtra dentro de ese año (por número, año o epígrafe, nunca por el contenido), así que para una resolución antigua pasa anio aunque ya pongas su número en texto; "todas" junta vigentes y derogadas de ese mismo año. La señal de vigencia se traslada literal, no la conviertas en un sí o un no. Para la UPME usa buscar_normativa_upme; para leyes o decretos nacionales, resolver_cita.
| Name | Required | Description | Default |
|---|---|---|---|
| anio | No | Año de cuatro dígitos, desde 1994. SIN ÉL solo se mira el año en curso, que trae muy pocas. | |
| texto | No | Filtra por número, año o epígrafe. Ej.: "solar", "gas natural", "101-104" | |
| limite | No | Cuántas resoluciones mostrar (hasta 50) | |
| compilacion | No | "vigentes" = las que la CREG lista como no derogadas expresamente ni anuladas | vigentes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which already declare safe read-only/idempotent behavior), the description discloses substantive traits: each query traverses ONE compilation of ONE year, texto never filters by content, no anio means only the current year, the vigencia flag is transferred literally and must not be collapsed to yes/no, and full text requires obtener_documento(fuente="creg").
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries operational value, but the body is one dense semicolon-chained block that is harder to scan than it needs to be. Slightly more structural separation would improve it without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape (número, año, epígrafe, estado, ruta de lectura) and explains the cross-parameter interaction that governs results. For a filter/list tool with an openWorld hint, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 semantics the schema does not: the absence of anio silently scopes to the current year, texto filters only by número/año/epígrafe and never by content, and compilacion="todas" spans the same year. limite receives no extra explanation, keeping this at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Resoluciones de la Comisión de Regulación de Energía y Gas') and enumerates the substantive domains (tarifas, conexión, comercialización, plantas solares, gas natural). It also names the sibling tools it is NOT (buscar_normativa_upme for UPME, resolver_cita for laws/decrees), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions and alternatives: pass anio even when the number appears in texto; use "todas" to merge vigentes+derogadas of a year; use buscar_normativa_upme for UPME and resolver_cita for national laws/decrees. This is a near-complete routing rubric.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buscar_unificadoBuscar en varias fuentes a la vezARead-onlyIdempotent
Busca en paralelo en Gestor Normativo, Corte Constitucional, SUIN-Juriscol y DIAN, y agrega los resultados con su fuente y su enlace. Úsala cuando la consulta es abierta o por materia y no hay herramienta obvia; para una cita exacta sigue siendo mejor resolver_cita y para un tribunal concreto, su buscador propio. perfil elige las fuentes ("salud" añade INVIMA y Supersalud; "mineria", la ANM) y el orden; si pasas fuentes, esa lista manda y el perfil solo ordena. limite es POR fuente, así que el total puede multiplicarse. La vigencia de SUIN se rotula SEGÚN EL BUSCADOR y no es la ficha oficial. Cuando la fuente sirve su texto, cada resultado trae "Para leer", la llamada lista a obtener_documento. Una fuente caída se declara como fallo, no como vacío.
| Name | Required | Description | Default |
|---|---|---|---|
| texto | Yes | Términos a buscar, ej. "teletrabajo" | |
| limite | No | Cuántos resultados por fuente (máximo 30) | |
| perfil | No | Perfil sectorial: prioriza la fuente que mejor responde a ese sector (tributario → DIAN; salud → INVIMA y Supersalud; mineria → ANM) | |
| formato | No | Salida: "markdown" (texto legible, por defecto) o "json" (un objeto con fecha_consulta, alcance, texto, resultados, sin_resultados, fallidas y avisos, sin cabecera ni pie) | markdown |
| fuentes | No | Fuentes a consultar; sin él se usan todas menos DIAN (que va con perfil=tributario) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, non-destructive, openWorld), and the description layers on non-obvious behavior: limite is per-source so totals multiply, a failed source is reported as a failure rather than an empty result, SUIN vigencia is engine-labeled and not the official record, and results carry a ready 'Para leer' call to obtener_documento. This is real operational context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and routing come first, then parameter precedence, then output/caveats, which is well front-loaded. It is dense and runs long, but each clause carries a distinct constraint (per-source limit, override rule, vigencia caveat, failure semantics), so there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists and the description compensates by describing the result payload (source, link, 'Para leer' call) and the failure behavior. For an open-world aggregator with five parameters and no output schema, nothing an agent needs to call or interpret it appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), but the description adds precedence semantics the schema does not: passing fuentes overrides the profile source set and perfil then only orders, and perfil's sector-to-source additions (salud → INVIMA/Supersalud, mineria → ANM) are spelled out. It stops short of documenting formato json field contents beyond what the schema already lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and a concrete resource set: parallel search across four named sources, aggregating results with source and link. It also positively distinguishes itself from siblings (resolver_cita for exact citations, court-specific search engines for a single tribunal), so an agent can separate it from the ~25 search siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rules: use when the query is open/subject-based and no obvious tool exists; use resolver_cita for exact citations and the court-specific searcher for a concrete tribunal. This gives both when-to-use and when-not-to-use with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cambios_desdeCambios registrados sobre normas desde una fechaARead-onlyIdempotent
Resume los cambios (modificación, derogación, adición) que el Gestor anota sobre LAS NORMAS QUE SE LISTAN: por norma, la acción, la norma modificadora, el artículo y la nota literal. De desde solo cuenta el año, así que "2019-12-31" incluye todo 2019, y las notas sin año se descartan. Cada cita necesita su año y se resuelve por separado: una que falla se anota y no frena a las demás. NO rastrea novedades ni descubre normas nuevas: para lo recién publicado usa buscar_diario_oficial; para la historia completa de una sola norma, incluidas las notas sin año, historial_norma.
| Name | Required | Description | Default |
|---|---|---|---|
| desde | Yes | Fecha AAAA-MM-DD; se filtra por el AÑO de la norma modificadora | |
| normas | Yes | Citas de normas a revisar, ej. ["Ley 909 de 2004"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, open-world profile, but the description adds real behavioral context: only the year of `desde` is honored, undated notes are discarded, each citation resolves independently, and a failed citation is recorded rather than aborting the batch. It also sketches the returned content (acción, norma modificadora, artículo, nota). It stops short of stating limits or output format, so a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then filtering semantics, then exclusions/alternatives. Every sentence carries information, though it is dense and runs long; a small trim of the redundant 'una que falla se anota' clause would tighten it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema tool, the description covers purpose, return fields, date-filtering behavior, partial-failure semantics, and the two alternative tools. With annotations handling safety, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning beyond it: it explains that '2019-12-31' effectively means all of 2019, that undated notes are dropped, and that every cita must carry its own year and resolves separately. That materially clarifies both parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and result ('resume los cambios: modificación, derogación, adición') scoped to 'LAS NORMAS QUE SE LISTAN', and enumerates the returned fields per norm. It explicitly names the two sibling tools it is not (buscar_diario_oficial, historial_norma), so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not guidance ('NO rastrea novedades ni descubre normas nuevas') and names the exact alternative for each excluded case: buscar_diario_oficial for newly published material and historial_norma for the full history of a single norm including undated notes. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comparar_articulosComparar dos artículos de normas distintasARead-onlyIdempotent
Compara el texto de un artículo entre dos normas y marca lo añadido y lo eliminado. Clasifica cada diferencia por patrones de texto (plazo, sanción, excepción, sujeto obligado, prohibición u obligación) y detecta cambios editoriales por similitud léxica (Dice bigramas, ≥0,92); lo que no encaja se marca «revisar manualmente». Sin modelo semántico. Con con_reforma=true no hace falta la segunda norma: busca la última reforma que el portal anota al artículo, extrae el artículo de la norma modificadora y lo contrasta con el texto vigente, porque la página consolida y no publica la redacción anterior. Para ver todas las reformas de la norma usa historial_norma; para reunir evidencia de un conflicto entre dos normas enteras, analizar_conflicto.
| Name | Required | Description | Default |
|---|---|---|---|
| norma_a | Yes | Cita de la norma base, ej. "Ley 909 de 2004" | |
| norma_b | No | Cita de la segunda norma, ej. "Decreto 1083 de 2015"; no se usa con con_reforma=true | |
| articulo_a | Yes | Número del artículo de la norma base, ej. "31" | |
| articulo_b | No | Número de artículo de la segunda norma; no se usa con con_reforma=true | |
| con_reforma | No | true: compara el artículo contra la última reforma que el portal le anota (no pidas norma_b) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read-only, idempotent operation, but the description adds substantial behavior beyond them: the classification method (text patterns for plazo/sanción/excepción/etc.), the Dice-bigram threshold of ≥0.92, the 'revisar manualmente' fallback, the absence of a semantic model, and the non-obvious portal behavior behind con_reforma. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core comparison action, then the method, then the con_reforma caveat, then sibling routing; every sentence carries information. It is dense and slightly run-on, but no sentence is filler given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a comparison tool with no output schema and full schema description coverage, the description supplies the missing return semantics (added/removed marking, difference categories, manual-review bucket) and both operating modes. Nothing essential for correct invocation is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes beyond it by clarifying the interaction semantics of con_reforma — that norma_b (and articulo_b) need not be supplied, and why the tool can infer the counterpart article from the portal's annotated reform. That adds real meaning over the schema's per-field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resource: comparing article text between two norms, marking additions/deletions, classifying differences by patterns, and detecting editorial changes by lexical similarity. It explicitly names what it is not for ('Sin modelo semántico') and names siblings (historial_norma, analizar_conflicto), so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional usage: use con_reforma=true when you don't have the second norm, and explains why (the portal consolidates and doesn't publish prior wording). It then routes to alternatives with conditions: historial_norma for all reforms of a norm, analizar_conflicto for whole-norm conflicts. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_perfilConsultar un perfil sectorial preconfiguradoARead-onlyIdempotent
Ejecuta la consulta en la ÚNICA fuente que fija cada perfil sectorial: laboral → Gestor Normativo, tributario → DIAN, ambiental → ANLA, contratación estatal → Consejo de Estado, energía → CREG (solo el año en curso). Devuelve una línea por resultado, con el sector y la advertencia del perfil, que declara sus límites. El perfil no admite año, página ni otros filtros: para eso usa la herramienta propia de la fuente (p. ej. buscar_resoluciones_creg con anio). Solo consulta, no guarda nada. NO uses un perfil para lo que no cubre: si la materia es otra, usa buscar_normas o resolver_cita.
| Name | Required | Description | Default |
|---|---|---|---|
| texto | Yes | Consulta dentro del perfil, ej. "teletrabajo" | |
| limite | No | Cuántos resultados devolver (máximo 20; por defecto 10) | |
| perfil | Yes | Id del perfil, de describir_fuentes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low, but the description adds real context: no year/page/filter support, one line per result including sector and the profile's self-declared limits, and 'no guarda nada'. It stops short of describing pagination or result-size behavior beyond the limit param.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries load: source routing, return shape, filter exclusion, and the negative routing rule. Front-loaded with the core action and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description describes the return format (one line per result with sector and warning). Combined with the source map and exclusion rules, an agent has everything needed to call this correctly versus its siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds meaning beyond it: it explains what each enum value routes to and where perfil ids come from (describir_fuentes), plus explicitly rules out filter parameters the agent might expect. That mapping is genuine semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (ejecuta la consulta) and resource (perfil sectorial preconfigurado), and pins each perfil value to its authoritative source (laboral→Gestor Normativo, tributario→DIAN, etc.). An agent can distinguish this from the many buscar_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not guidance: 'NO uses un perfil para lo que no cubre', with named fallbacks (buscar_normas, resolver_cita) and a named alternative for filtering (buscar_resoluciones_creg con anio). The constraint that the profile accepts no year/page/other filters is stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_por_jerarquiaConsultar normativa por nivel de autoridadARead-onlyIdempotent
Busca normativa colombiana de UN nivel de autoridad y explica su carácter: vinculante, orientador o informativo. Devuelve los documentos de ese nivel con título y enlace, y el carácter del nivel. nivel decide la fuente: "jurisprudencia" busca solo en la relatoría de la Corte Constitucional (para la Suprema usa buscar_jurisprudencia_suprema; para el Consejo de Estado, buscar_jurisprudencia_consejo_estado); los demás, en el Gestor filtrado por tipo, donde texto se busca en los resúmenes, no en el articulado. ÚSALA cuando la pregunta pida un nivel concreto (p. ej. "¿qué leyes hay sobre X?"); para buscar sin nivel usa buscar_normas o buscar_por_tema, y para el texto de un artículo de la Constitución, resolver_cita. No es asesoría jurídica: verifica en el enlace.
| Name | Required | Description | Default |
|---|---|---|---|
| nivel | Yes | Nivel de autoridad: constitución, ley, decreto, resolución, concepto o jurisprudencia | |
| texto | Yes | Términos a buscar dentro del nivel, ej. "teletrabajo" | |
| limite | No | Cuántos documentos devolver (máximo 20; por defecto 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/open-world safety, yet the description adds real behavioral context beyond them: nivel determines the backend source (relatoría de la Corte Constitucional vs. Gestor filtrado por tipo), texto matches resúmenes and NOT articulado, and the output shape is disclosed (documentos con título y enlace + carácter del nivel). It even carries a scope disclaimer ('No es asesoría jurídica: verifica en el enlace').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then source routing, then usage, then the disclaimer — a sensible order with no filler sentences. It is dense and a few clauses run long, but every sentence carries routing or scope information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating what is returned (documentos con título y enlace y el carácter del nivel). Source routing, search-field limitation, and sibling alternatives are all covered, so an agent has everything required to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuinely adds semantics the schema does not: the value 'jurisprudencia' redirects to a different source and each remaining value is searched in the Gestor filtered by tipo. It also clarifies that texto is matched against resúmenes rather than articulado, which changes how an agent should phrase queries. limite is left to the schema, hence not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Busca normativa colombiana de UN nivel de autoridad') plus an extra effect ('explica su carácter'), and explicitly separates itself from siblings by naming buscar_jurisprudencia_suprema, buscar_jurisprudencia_consejo_estado, buscar_normas, buscar_por_tema and resolver_cita. An agent can route correctly without opening any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('ÚSALA cuando la pregunta pida un nivel concreto') with a concrete example, states the when-not condition (búsquedas sin nivel van a buscar_normas o buscar_por_tema), and points to resolver_cita for article text. Alternatives and selection criteria are fully enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_vigenciaConsultar la vigencia de una normaARead-onlyIdempotent
Devuelve el estado de vigencia de una ley o un decreto tal como lo publica la ficha de SUIN: "Vigente", "Derogado", "Vigencia en Estudio", "Compilado" u otro. Añade un nivel de confianza. Alta: la ficha respondió. Baja: no consta, o la fuente no respondió. Nunca inventa el estado. Una sentencia como "C-337/11" no tiene vigencia: se comprueba en la relatoría de la Corte Constitucional si existe. El estado es el de la norma entera, aunque la cita nombre un artículo. Para las reformas de un artículo usa historial_norma; para su texto, resolver_cita. Si la cita no trae año y hay varias candidatas, las lista en vez de elegir. La respuesta empieza con la línea de alcance: qué fuente se consultó y cuál no.
| Name | Required | Description | Default |
|---|---|---|---|
| cita | Yes | Cita de la norma, ej. "Ley 909 de 2004" o "Decreto 1072 de 2015" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses the confidence-level output, that the tool never invents the status, that the status applies to the whole norm even when the citation names an article, and that responses open with a scope line naming which sources were consulted. It also explains fallback behavior when the source does not respond (low confidence). These are substantial behavioral details not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then proceeds through confidence, exceptions, alternatives, and response format. Every sentence carries operational information, but the length is notable for a single-parameter tool; minor condensation (e.g., the confidence-level sentences) could tighten it without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains what is returned: the SUIN status strings, a confidence level, and a leading scope line. It also covers edge cases (sentencias, missing year, article-specific citations) and the fallback when the source is unresponsive, so an agent has enough context to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the single 'cita' string with examples. The description adds interpretation rules beyond the schema: a citation without a year yields multiple candidates instead of a choice, the status is for the entire norm even if an article is cited, and sentencia citations are out of scope. This adds meaningful semantic guidance, though it does not cover citation syntax exhaustively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: it returns the validity status of a law or decree as published on the SUIN ficha, including the enumerated states. It also distinguishes the tool from siblings by noting that sentencias have no vigencia and must be checked in the Corte Constitucional relatoría, so an agent can tell it apart from resolver_cita or historial_norma.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and when to use them: 'Para las reformas de un artículo usa historial_norma; para su texto, resolver_cita.' It also gives an exclusion for sentencias like 'C-337/11' and explains that ambiguous citations without a year are listed rather than selected. This is clear when/when-not guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describir_fuentesQué cubre este MCP, y qué noARead-onlyIdempotent
Declara el alcance real: qué fuente responde cada pregunta, qué NO está cubierto y con qué fecha se generaron los índices que viajan empaquetados. Úsala ANTES de concluir que algo "no existe" a partir de una búsqueda vacía, y para saber si el índice de vigencia sigue fresco. No consulta la red. Con el parámetro fuente devuelve SOLO el alcance de esa fuente, que es lo que suele hacer falta; sin él, el cuadro completo, que es largo.
| Name | Required | Description | Default |
|---|---|---|---|
| fuente | No | Clave de una sola fuente ("creg", "suin", "sic"…). Sin ella se devuelven todas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond the annotations: it does not query the network (corroborating openWorldHint=false) and discloses that the underlying indexes are bundled and carry a generation date that may go stale. It does not elaborate on output shape beyond relative length, but with readOnly/idempotent already declared the bar is lower.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool declares, then the usage rule, then the parameter behavior. Every sentence earns its place, though the single dense paragraph packs several distinct points together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so adequately: it explains that output is per-source scope plus index dates, and that size depends on `fuente`. An agent has enough to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum already documents each source key, but the description adds behavioral meaning: passing `fuente` narrows the response to one source (the common case) while omitting it returns the full, long table. That default-behavior framing goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it declares the real scope, which source answers each question, what is NOT covered, and the generation date of the bundled indexes. This is clearly distinguishable from the sibling search tools (buscar_*, consultar_*) which retrieve content rather than describe coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it BEFORE concluding something 'doesn't exist' after an empty search, and to check whether the vigencia index is still fresh. It also states when to pass `fuente` (usually what's needed) versus omitting it (the long full table).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expedienteExpediente temporal de investigaciónA
Crea, agrega, lee o exporta un expediente para agrupar consultas, citas y observaciones de una investigación. No consulta ninguna fuente: guarda lo que le pasas. Se activa con EXPEDIENTES=1 (DESACTIVADO por defecto). En memoria es TEMPORAL (expira según EXPEDIENTES_TTL_MS; por defecto no expira); con EXPEDIENTES_DIR persiste en disco y sobrevive a reinicios. El flujo empieza siempre en "crear", SIN id: devuelve el id que piden las demás; "agregar" exige campo y texto juntos; "leer" lo devuelve agrupado por sección. "exportar" escribe markdown: si ruta es un directorio crea .md dentro, el directorio padre tiene que existir, y un archivo que ya existe no se sobrescribe: se escribe al lado con sufijo numérico y la respuesta da la ruta final. Para guardar el texto de una norma usa obtener_documento.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Id del expediente (obligatorio para agregar, leer y exportar) | |
| ruta | No | Dónde escribir la exportación: un archivo o un directorio (solo accion="exportar") | |
| campo | No | Sección donde guardar la entrada (solo accion="agregar") | |
| texto | No | Contenido de la entrada a guardar (solo accion="agregar") | |
| accion | Yes | Qué hacer: crear un expediente, agregar una entrada, leer su contenido o exportarlo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: gating by env var, in-memory records expiring per EXPEDIENTES_TTL_MS, disk persistence via EXPEDIENTES_DIR surviving restarts, and non-destructive export semantics (existing file is never overwritten, a numeric-suffixed sibling is written and the final path returned). This is exactly the operational context annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the key 'no consulta fuentes' qualifier, and every clause carries information. Some sentences are long and dense (the exportar sentence chains four conditions), which costs a point but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the activation gate, storage lifetime, persistence, per-action parameter coupling, and export edge cases including the returned final path, while pointing to obtener_documento for a neighboring use case. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents each field, so the baseline is 3. The description adds genuine cross-parameter meaning on top: id is required specifically for agregar/leer/exportar, campo and texto must be supplied together, and ruta may be a file or a directory with different write behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (un expediente para agrupar consultas, citas y observaciones) and enumerates the four operations (crear, agregar, leer, exportar). Crucially it distinguishes itself from the many buscar_* siblings with 'No consulta ninguna fuente: guarda lo que le pasas', so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit entry conditions (se activa con EXPEDIENTES=1, desactivado por defecto), prescribes the flow ('El flujo empieza siempre en crear, SIN id'), states the per-action prerequisites ('agregar exige campo y texto juntos'), and names an alternative for a related job ('Para guardar el texto de una norma usa obtener_documento').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explicar_relacion_temaExplicar por qué una norma aplica a un subtemaARead-onlyIdempotent
Devuelve el "restrictor": el extracto que explica por qué esa norma es pertinente para ESE subtema en concreto. Ambos identificadores deben salir de la MISMA fila de buscar_por_tema, y el temsubid va con su prefijo ("ts-38872"): un id de listar_catalogos (catalogo="subtemas") o de otros catálogos se rechaza aquí. Para ver todos los restrictores de una norma de una vez, usa obtener_documento con fuente="gestor" y mira su bloque "Temas asociados".
| Name | Required | Description | Default |
|---|---|---|---|
| normid | Yes | normid de la misma fila de buscar_por_tema | |
| temsubid | Yes | temsubid de buscar_por_tema, con su prefijo: "ts-38872" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds real context: it describes what is returned (the restrictor excerpt) and discloses validation behavior (ids not sourced from buscar_por_tema are rejected).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return value, then constraints, then the alternative — a logical order. Dense but every sentence carries information; minor overlap between the prefix constraint and the schema description keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the return value (the restrictor extract) and the sourcing/validation constraints. Nothing an agent needs in order to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by tying both ids to the same source row and stressing the required 'ts-' prefix, plus the consequence of passing a catalog id. This reinforces and extends the schema rather than merely repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it returns the 'restrictor' excerpt explaining why a given norm applies to a specific subtopic. It distinguishes itself from siblings by name (buscar_por_tema, listar_catalogos, obtener_documento), so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite (both ids must come from the SAME row of buscar_por_tema), the when-not (an id from listar_catalogos or other catalogs is rejected here), and a clear alternative for a different need (obtener_documento with fuente='gestor' to see all restrictors at once).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
historial_normaHistorial de reformas de una normaARead-onlyIdempotent
Devuelve la cadena de reformas que el Gestor anota sobre una norma: qué norma la modificó, adicionó, derogó, sustituyó... y qué artículo afectó cada cambio, con la nota literal citable. Las ordena por el año de la norma que introduce cada cambio (las notas sin año van al final, sin ordenar) y señala la última reforma ANOTADA, que no es necesariamente la que rige: el portal no siempre anota todas. articulo filtra primero; desde y limite recortan después esa lista ya ordenada, y la última reforma se calcula sobre todo lo filtrado, no sobre el tramo mostrado. Para la vigencia usa resolver_cita; para los cambios de varias normas a partir de un año, cambios_desde; para comparar el texto antes y después, comparar_articulos. Con formato="json" el objeto trae titulo, url, total, cambios, ultima_reforma y avisos.
| Name | Required | Description | Default |
|---|---|---|---|
| cita | Yes | Cita de la norma, ej. "Ley 100 de 1993" | |
| desde | No | Cuántos cambios saltarse antes de empezar (los demás no caben en la respuesta) | |
| limite | No | Cuántos cambios mostrar (hasta 100) | |
| formato | No | Salida: "markdown" (texto legible, por defecto) o "json" (solo el objeto de datos, sin cabecera ni pie) | markdown |
| articulo | No | Filtra a las notas de reforma de ese artículo de la norma (ej. "6"); sin él se devuelven todas |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly/idempotent/non-destructive), but the description adds the traits that actually matter here: ordering by introducing-norm year, undated notes placed last and unordered, the caveat that the ANNOTATED last reform may not be the one in force because the portal doesn't annotate everything, and how articulo/desde/limite interact with the ordering. This is genuine behavioral disclosure beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, but front-loaded with purpose, then behavior, then sibling routing, then output shape. Nearly every clause earns its place; it is information-heavy rather than padded, though the density borders on hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the JSON fields (titulo, url, total, cambios, ultima_reforma, avisos), and it covers pagination semantics, ordering guarantees, the annotation-completeness caveat, and alternatives. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already documented (baseline 3). The description goes further by defining the operation order — articulo filters first, desde/limite trim the already-ordered list afterwards, and ultima_reforma is computed over the full filtered set rather than the shown slice — which the schema does not express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Devuelve la cadena de reformas... sobre una norma") and enumerates what the chain contains (modificó, adicionó, derogó, sustituyó, artículo afectado, nota literal citable). It is unmistakably distinct from siblings like buscar_normas or consultar_vigencia.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to three alternatives with their selecting conditions: resolver_cita for vigencia, cambios_desde for multi-norm changes from a year, comparar_articulos for before/after text comparison. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linea_jurisprudencialLínea jurisprudencial: quién cita una sentenciaARead-onlyIdempotent
Devuelve las providencias que la relatoría registra como CITANTES de una sentencia de la Corte Constitucional (el bloque "citaciones" de su ficha oficial), con tipo, fecha, tema, la ruta para obtener_documento y el enlace. Son citas, no una línea verificada: mencionar no es reiterar y la relación puede estar incompleta. Se ordenan con las SU y las C en cabeza ANTES de aplicar limite, así que un limite bajo deja fuera primero las T y los autos; el portal no registra más de 100 y no hay paginación. Úsala cuando ya tienes la sentencia y quieres saber quién la cita. Para encontrar sentencias sobre un tema usa buscar_jurisprudencia; para leer o verificar la propia sentencia citada, resolver_cita. Solo cubre la Corte Constitucional.
| Name | Required | Description | Default |
|---|---|---|---|
| limite | No | Cuántas providencias citantes mostrar (hasta 100) | |
| sentencia | Yes | Cita de la sentencia, ej. "C-337/11", "T-099/24" o "SU-371/21" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, it discloses crucial behavioral caveats: these are registrations not a verified line ('mencionar no es reiterar y la relación puede estar incompleta'), the ordering rule (SU and C before limite is applied), and the portal cap of 100 with no pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then caveats and routing in a dense but waste-free flow. It is somewhat long and packs ordering, cap, and disclaimers into running prose, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema needed, the description still covers scope ('Solo cubre la Corte Constitucional'), reliability caveats, ordering semantics, the hard cap, and routing — everything required to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning the schema lacks: it explains how 'limite' interacts with ordering, noting a low limit drops T and autos first, and reinforces the 100 hard cap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Devuelve las providencias que ... CITANTES de una sentencia de la Corte Constitucional') and pinpoints the exact source block ('citaciones' de su ficha oficial), listing the returned fields. It is immediately distinguishable from tema-search and cita-resolution siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Úsala cuando ya tienes la sentencia y quieres saber quién la cita' gives the trigger condition, and it names two alternatives with their selection rules: buscar_jurisprudencia for topic search and resolver_cita to read/verify the cited sentence itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listar_catalogosListar catálogos de búsquedaARead-onlyIdempotent
Valores válidos para los filtros de buscar_normas: tipos de documento, años, entidades y temas, más los subtemas de un tema (subtemas con tema_id), los conceptos de Función Pública (conceptos_fp con numero/anio) y el listado curado del DAFP (normas_fp). En temas el filtro es obligatorio por volumen, y sus ids llevan prefijo ("tema-24457") porque el portal tiene tres taxonomías que reutilizan los mismos números. OJO CON EL ALCANCE: estos catálogos son SOLO del Gestor Normativo de Función Pública y solo sirven en buscar_normas; no cubren la DIAN (su normograma está en buscar_normativa_tributaria), ni SUIN-Juriscol, ni las tres altas cortes. Que "DIAN" no aparezca entre las entidades no significa que no haya normativa suya: significa que el Gestor no la cataloga como entidad emisora.
| Name | Required | Description | Default |
|---|---|---|---|
| anio | No | Año del concepto (solo catalogo="conceptos_fp") | |
| desde | No | ||
| filtro | No | Texto para filtrar; obligatorio en "temas" | |
| limite | No | ||
| numero | No | Número del concepto (solo catalogo="conceptos_fp") | |
| tema_id | No | Id del tema (solo catalogo="subtemas"), con prefijo "tema-…" | |
| catalogo | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds substantial behavioral context beyond them: the temas filter is mandatory due to volume, the id prefix exists because three taxonomies reuse numbers, and the negative-evidence caveat about DIAN entities. It omits pagination behavior (desde/limite), keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded before the scope warnings, and each sentence carries information (what the catalogs hold, the mandatory-filter rule, the prefix rationale, the scope limits). It is dense and long, but virtually nothing is filler, so it stays on the useful side of verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 7 parameters over a 7-value enum, the description supplies the catalog semantics, param-to-catalog mappings, and cross-source scope that an agent needs. The only gap is that it does not describe the desde/limite pagination of the listing itself.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 57%, and the description compensates: it ties tema_id to subtemas (with prefix), numero/anio to conceptos_fp, and notes filtro is mandatory for temas. It clarifies the relationship between the catalogo enum and which params apply, adding meaning the schema's terse descriptions do not fully provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource (listar_catalogos returns the valid filter values for buscar_normas) and enumerates what the catalogs contain (tipos, años, entidades, temas, subtemas, conceptos_fp, normas_fp). It explicitly distinguishes itself from buscar_normativa_tributaria and names the sources it does not cover, so an agent can tell it apart from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not: the catalogs are ONLY for the Gestor Normativo de Función Pública and only work in buscar_normas, with named alternatives (buscar_normativa_tributaria for DIAN, and the exclusion of SUIN-Juriscol and the high courts). The 'OJO CON EL ALCANCE' note prevents misuse of the entity list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listar_normativa_ambiental_anlaNormativa ambiental clasificada por la ANLAARead-onlyIdempotent
La ANLA mantiene en su sistema "Eureka" una CURADURÍA de la normativa nacional que aplica al licenciamiento ambiental, agrupada por tema. Lo que aporta es la CLASIFICACIÓN, no documentos nuevos: casi todo lo que lista son leyes y decretos que resolver_cita ya resuelve mejor, con texto completo y con vigencia. Devuelve título, resumen y enlace de cada entrada, y avisa cuando el número del título no cuadra con el resumen. seccion elige el tema (por defecto, "leyes"); texto filtra SOLO la página que trae desde, no la sección entera, así que un vacío no es definitivo: repite sin texto para ver la página y el desde siguiente. Úsala para descubrir QUÉ normas aplican a un tema ambiental y resuelve cada una con resolver_cita; para filtrar de una vez la primera página de todas las secciones, consultar_perfil con perfil="ambiental".
| Name | Required | Description | Default |
|---|---|---|---|
| desde | No | Eureka pagina sola y con distinto tamaño según la sección: no lo calcules, usa el que dice la respuesta | |
| texto | No | Filtra las entradas de esa sección por título o resumen | |
| seccion | No | leyes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), but the description adds substantial context beyond them: it warns that almost everything listed is better resolved elsewhere, describes the return payload (título, resumen, enlace), notes it flags when a title's número doesn't match the resumen, and explains that texto filters only the fetched page so an empty result isn't definitive. Pagination size varies by section and must be read from the response, which is valuable operational detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but dense and front-loaded: purpose, then the value/limitation, then return shape, then parameter behavior, then usage routing. Nearly every sentence carries a distinct fact, with only mild repetition between the 'classification not new documents' framing and the resolver_cita comparison.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains what comes back (título, resumen, enlace, mismatch warnings) and how pagination behaves per section. Combined with the explicit alternative-tool routing, an agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the seccion enum has no inline description, so the description does real work: it names seccion as the theme selector with default 'leyes', and clarifies that texto filters only the page brought back rather than the whole section. It adds behavior the schema does not encode, though it doesn't enumerate or add syntax for cada sección value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a curated classification of national environmental normativity maintained by ANLA in Eureka, grouped by theme. It explicitly frames what it contributes (the CLASSIFICATION, not new documents) and contrasts that against resolver_cita, which resolves the same laws and decrees with full text and vigencia.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not: 'Úsala para descubrir QUÉ normas aplican a un tema ambiental y resuelve cada una con resolver_cita', plus the alternative consultar_perfil with perfil="ambiental" for filtering all sections at once. Alternatives and selection conditions are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obtener_documentoObtener el texto de un documento por fuenteA
Devuelve el texto (troceado, nunca entero) de una de las siete fuentes con texto. CADA FUENTE EXIGE LO SUYO y los parámetros de otra no valen con ella: gestor necesita id; corte, ruta; suprema, ruta y sala; consejo, token; dian, link; creg, ruta; sectorial, entidad y url. Una combinación que no encaje se rechaza antes de salir a la red, diciendo qué falta y el ejemplo mínimo que funciona. Qué parte sale: historial (gestor) da los cambios anotados en vez del texto, del artículo si va con articulo; articulo (gestor) o seccion (cortes) acotan y entonces buscar_en_texto no se aplica; desde solo avanza el troceo, no los pasajes de buscar_en_texto. Informa total/mostrado/omitido y el "desde" del trozo siguiente. ESCRIBE EN DISCO solo con entero o ruta_destino, que se imponen a todo lo anterior: dian y sectorial guardan el archivo original; las demás, texto-.txt (sin ruta_destino, en una carpeta temporal); consejo no lo admite. Nunca sobrescribe: un nombre repetido lleva sufijo. Para encontrar el documento usa antes resolver_cita o el buscador de su fuente.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Solo gestor: id numérico de la norma | |
| url | No | Solo sectorial: enlace del acto a leer, tal como lo devuelve buscar_normativa_sectorial | |
| link | No | Solo dian: nombre del archivo, ej. "decreto_1625_2016.htm" | |
| ruta | No | corte/suprema/creg: ruta del documento | |
| sala | No | Solo suprema: la MISMA sala con la que se encontró | |
| desde | No | ||
| token | No | Solo consejo: token que devuelve buscar_jurisprudencia_consejo_estado | |
| entero | No | En vez de trocear, escribe el documento a disco y devuelve la ruta con un trozo del texto | |
| fuente | Yes | De qué fuente sale el documento | |
| entidad | No | Solo sectorial: id del regulador (los lista buscar_normativa_sectorial) | |
| seccion | No | Solo corte, suprema y consejo: devuelve solo esa parte de la providencia. "consideraciones" es la motivación de la MAYORÍA; "salvamentos" y "aclaraciones" son los votos particulares, que NO son doctrina de la Sala. | |
| articulo | No | Solo gestor: número de artículo | |
| historial | No | Solo gestor: en vez del texto, devuelve los cambios anotados sobre la norma | |
| sin_temas | No | Solo gestor: omite el bloque de temas asociados (ahorra contexto cuando solo se quiere el articulado) | |
| max_pasajes | No | Máximo de pasajes con buscar_en_texto (por defecto 10) | |
| ruta_destino | No | Carpeta donde guardar el archivo (con entero o para descargar el PDF/Word sin devolver texto) | |
| buscar_en_texto | No | Devuelve solo los fragmentos que mencionan este término | |
| limite_caracteres | No | Tope del TEXTO devuelto; se ajusta al rango 200–40.000 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false / destructiveHint=false / idempotentHint=false; the description supplies the substance: disk writes happen only with entero or ruta_destino (which override other params), dian/sectorial keep the original file while others write texto-<fuente>.txt to a temp folder, consejo cannot write, and repeated names never overwrite (suffix appended), which aligns with and enriches the idempotent/destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Nearly every clause carries information and the core purpose is front-loaded, but the middle section is a dense run-on spanning source matrices, output-part rules, and write behavior without clear breaks. Scannability suffers slightly though nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter, 7-source tool with no output schema, the description is remarkably complete: it covers input requirements, rejection behavior, output shape (total/mostrado/omitido plus next 'desde'), and side effects. An agent has enough to call it correctly for any source.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 94%, so the per-parameter descriptions already carry most weight, but the description adds cross-parameter semantics the schema cannot express: the source→required-parameter matrix, the precedence of entero/ruta_destino over everything else, and interaction rules (historial replaces text; articulo/seccion suppress buscar_en_texto; desde only advances chunking). This is real value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Devuelve el texto ... de una de las siete fuentes') plus the hard scope constraint that it is always chunked, never whole. It distinguishes itself from the sibling search tools by pointing to resolver_cita and the per-source search engines for discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps each of the seven sources to its required parameters (gestor→id; corte/suprema/creg→ruta; consejo→token; dian→link; sectorial→entidad+url), states that mismatched combinations are rejected before any network call, and routes discovery to resolver_cita first. This is prescriptive when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolver_citaResolver una cita normativaARead-onlyIdempotent
Ruta rápida y exacta para citas de leyes, decretos, sentencias, artículos y códigos citados por su nombre ("art. 191 del Código de Comercio"). Úsala SIEMPRE que la pregunta mencione una norma concreta: buscar_normas y buscar_por_tema son para cuando no la hay. Devuelve la identificación oficial con su enlace, la vigencia y el texto pedido, y dice contra qué norma resolvió. Solo consulta, no guarda nada. Tres modos: cita sola; citas, un lote que manda sobre cita y se agrupa por norma; o articulos con cita apuntando a UNA norma, que se descarga una vez (con citas, articulos se ignora). validar=true cambia la respuesta a un VEREDICTO sobre la cita (validada, parcialmente validada o no validable), sin texto ni vigencia; url y formato solo valen con validar. Para las reformas de una norma usa historial_norma; para quién cita una sentencia, linea_jurisprudencial.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Enlace a comprobar (solo con validar=true) | |
| cita | No | Ej.: "Ley 909 de 2004", "C-337/11", "art. 6 de la Ley 1221 de 2008", "art. 191 del Código de Comercio" | |
| citas | No | Varias citas a la vez, ej. ["Ley 909 de 2004", "C-337/11"]: cada una se resuelve y se devuelve con su enlace | |
| formato | No | Solo con validar=true: "json" devuelve el resultado como objeto (fecha_consulta, y por cita: resultado, comprobaciones, titulo, url, nota), sin cabecera ni pie, para encadenarlo sin releer texto. | |
| validar | No | En vez de la resolución, comprueba que la cita (y el enlace, si se da con url) coincide con lo que devuelve el Gestor: número/año, dominio y artículo. Clasifica en "cita validada", "parcialmente validada" o "no fue posible validar". NUNCA afirma vigencia. | |
| contexto | No | Por defecto true. Con false se omite el extracto de tema asociado y queda solo la identificación, la vigencia y el texto pedido. | |
| articulos | No | Varios artículos de la MISMA norma en una sola llamada, ej. ["705", "707", "710"]. Se usa con cita apuntando a la norma ("Decreto Ley 624 de 1989"); la norma se descarga una vez y se extrae cada artículo. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/idempotent/openWorld), the description discloses mode precedence (citas sobre cita; con citas se ignora articulos), the conditional applicability of url/formato only under validar, and that validar switches the whole response to a verdict without vigencia. It also states what is returned (identificación, enlace, vigencia, texto) and which norm was resolved against.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by usage and sibling routing, then behavior and modes — a sound ordering. It is dense with little padding, though the one-line "Solo consulta, no guarda nada" mildly duplicates the readOnlyHint annotation and the final sentence bundles two different sibling alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains the normal return payload (identificación oficial con enlace, vigencia, texto pedido, norma contra la que resolvió) and the alternate validar return (veredicto). Together with the mode rules and alternatives, an agent has everything needed to call it correctly across all seven optional parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already documented; the description nevertheless adds genuinely non-schema information about how parameters interact (citas overrides cita, articulos requires cita pointing to a single norm and is ignored when citas is present, url/formato only valid with validar=true). Some clauses restate what the schema already says (contexto, formato), keeping it just below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (resolver citas de leyes, decretos, sentencias, artículos y códigos citados por su nombre) with a concrete example, and explicitly contrasts itself with buscar_normas and buscar_por_tema. An agent can identify this tool's niche without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Úsala SIEMPRE que la pregunta mencione una norma concreta: buscar_normas y buscar_por_tema son para cuando no la hay" gives an explicit when-to-use plus the named alternatives and the condition that selects them. It also routes adjacent needs (historial_norma for reformas, linea_jurisprudencial for citas de sentencias).
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.
10 tool updates
v1.15.1- Changed
analizar_conflicto1 field changed- added
Input schema / properties / formatoAdded value: +{ + "default": "markdown", + "description": "Salida: \"markdown\" (texto legible, por defecto) o \"json\" (un objeto con fecha_consulta, alcance, evidencias y avisos, sin cabecera ni pie)", + "enum": [ + "markdown", + "json" + ], + "type": "string" +}
- Added
buscar_diario_oficial - Changed
buscar_jurisprudencia1 field changed- changed
Input schema / properties / tipos / descriptionPrevious value: -"Tipos a incluir; por defecto C, T y SU (doctrina). Los autos (A) son mayoría por volumen y suelen ser trámite: pídelos explícitamente."New value: +"Tipos a incluir; por defecto C, T y SU (doctrina). Los autos (A) son mayoría por volumen y suelen ser trámite: pídelos explícitamente. Se aceptan sus nombres: \"tutela\", \"constitucionalidad\", \"unificacion\", \"auto\"."
- Changed
buscar_unificado1 field changed- added
Input schema / properties / formatoAdded value: +{ + "default": "markdown", + "description": "Salida: \"markdown\" (texto legible, por defecto) o \"json\" (un objeto con fecha_consulta, alcance, texto, resultados, sin_resultados, fallidas y avisos, sin cabecera ni pie)", + "enum": [ + "markdown", + "json" + ], + "type": "string" +}
- Changed
comparar_articulos6 fields changed- changed
Input schema / properties / articulo_a / descriptionPrevious value: -"Número de artículo de la primera norma, ej. \"12\""New value: +"Número del artículo de la norma base, ej. \"31\"" - changed
Input schema / properties / articulo_b / descriptionPrevious value: -"Número de artículo de la segunda norma, ej. \"12\""New value: +"Número de artículo de la segunda norma; no se usa con con_reforma=true" - added
Input schema / properties / con_reformaAdded value: +{ + "default": false, + "description": "true: compara el artículo contra la última reforma que el portal le anota (no pidas norma_b)", + "type": "boolean" +} - changed
Input schema / properties / norma_a / descriptionPrevious value: -"Cita de la primera norma, ej. \"Ley 909 de 2004\""New value: +"Cita de la norma base, ej. \"Ley 909 de 2004\"" - changed
Input schema / properties / norma_b / descriptionPrevious value: -"Cita de la segunda norma, ej. \"Decreto 1083 de 2015\""New value: +"Cita de la segunda norma, ej. \"Decreto 1083 de 2015\"; no se usa con con_reforma=true" - changed
Input schema / requiredPrevious value: -[ - "norma_a", - "articulo_a", - "norma_b", - "articulo_b" -]New value: +[ + "norma_a", + "articulo_a" +]
- Changed
describir_fuentes1 field changed- changed
Input schema / properties / fuente / enumPrevious value: -[ - "gestor", - "corte-constitucional", - "corte-suprema", - "consejo-de-estado", - "dian", - "suin", - "creg", - "anh", - "upme", - "anla", - "minagricultura", - "ica", - "anm", - "ant", - "supersociedades", - "sic", - "invima", - "superfinanciera", - "supersalud", - "mintrabajo", - "supertransporte", - "unidadvictimas", - "parques", - "corte", - "suprema", - "consejo" -]New value: +[ + "gestor", + "corte-constitucional", + "corte-suprema", + "consejo-de-estado", + "dian", + "suin", + "senado", + "diario", + "creg", + "anh", + "upme", + "anla", + "minagricultura", + "ica", + "anm", + "ant", + "supersociedades", + "sic", + "invima", + "superfinanciera", + "supersalud", + "mintrabajo", + "supertransporte", + "unidadvictimas", + "parques", + "corte", + "suprema", + "consejo" +]
- Changed
explicar_relacion_tema1 field changed- changed
Input schema / requiredPrevious value: -[ - "normid" -]New value: +[ + "temsubid", + "normid" +]
- Changed
historial_norma2 fields changed- changed
Input schema / properties / articulo / descriptionPrevious value: -"Filtra a los cambios que afectaron ese artículo (ej. \"6\"); sin él se devuelven todos"New value: +"Filtra a las notas de reforma de ese artículo de la norma (ej. \"6\"); sin él se devuelven todas" - added
Input schema / properties / formatoAdded value: +{ + "default": "markdown", + "description": "Salida: \"markdown\" (texto legible, por defecto) o \"json\" (solo el objeto de datos, sin cabecera ni pie)", + "enum": [ + "markdown", + "json" + ], + "type": "string" +}
- Added
linea_jurisprudencial - Changed
resolver_cita1 field changed- added
Input schema / properties / formatoAdded value: +{ + "description": "Solo con validar=true: \"json\" devuelve el resultado como objeto (fecha_consulta, y por cita: resultado, comprobaciones, titulo, url, nota), sin cabecera ni pie, para encadenarlo sin releer texto.", + "enum": [ + "markdown", + "json" + ], + "type": "string" +}
9 tool updates
v1.14.0- Changed
buscar_jurisprudencia1 field changed- changed
Input schema / properties / tipos / descriptionPrevious value: -"Tipos a incluir. Por defecto C, T y SU (doctrina). Los autos (A) son mayoría por volumen y suelen ser trámite, así que hay que pedirlos explícitamente: [\"A\"] o [\"C\",\"T\",\"SU\",\"A\"]."New value: +"Tipos a incluir; por defecto C, T y SU (doctrina). Los autos (A) son mayoría por volumen y suelen ser trámite: pídelos explícitamente."
- Changed
buscar_jurisprudencia_consejo_estado1 field changed- changed
Input schema / properties / exacto / descriptionPrevious value: -"Buscar la frase exacta (entre comillas en el buscador SAMAI). Viene activado; si la frase no aparece en la página, se amplía solo a OR con un aviso. Ponlo en false para ampliar a propósito."New value: +"Frase exacta en SAMAI (activado); si no aparece, se amplía solo a OR con aviso. Ponlo en false para ampliar a propósito."
- Changed
buscar_jurisprudencia_suprema1 field changed- changed
Input schema / properties / exacto / descriptionPrevious value: -"Buscar la frase exacta; viene activado. Con exacto=false el buscador une las palabras con OR y \"despido sin justa causa\" devuelve 176.012 providencias contra 20.233 con la frase: en la sala Penal ese modo llega a 33.607 resultados y es inservible. Ponlo en false solo para ampliar a propósito una búsqueda que quedó corta."New value: +"Frase exacta (activado). Con false el buscador une con OR: \"despido sin justa causa\" pasa de 20.233 a 176.012 providencias y en la sala Penal es inservible. Ponlo en false solo para ampliar a propósito."
- Changed
buscar_normas1 field changed- changed
Input schema / properties / tipo_documento / descriptionPrevious value: -"Nombre o id: \"Ley\", \"Decreto\", \"Sentencia\", \"Concepto\""New value: +"Nombre o id del catálogo de tipos del Gestor: \"Ley\", \"Decreto\", \"Resolución\", \"Concepto\". Uno que no esté se rechaza con la lista, sin buscar"
- Changed
buscar_normativa_sectorial1 field changed- changed
Input schema / properties / solo_entidad / descriptionPrevious value: -"Solo INVIMA/Supersalud: limita a los actos de los tipos que la propia entidad expide (Resolución, Circular...), excluyendo la compilación sectorial del normograma (leyes, decretos del Ministerio, sentencias)."New value: +"Solo INVIMA/Supersalud: excluye la compilación sectorial del normograma (leyes, decretos y sentencias) y deja solo los actos que la entidad expide (Resolución, Circular…)."
- Changed
consultar_perfil2 fields changed- changed
Input schema / properties / perfil / descriptionPrevious value: -"Id del perfil: laboral, tributario, ambiental, contratacion_estatal, energia"New value: +"Id del perfil, de describir_fuentes" - added
Input schema / properties / perfil / enumAdded value: +[ + "laboral", + "tributario", + "ambiental", + "contratacion_estatal", + "energia" +]
- Changed
describir_fuentes1 field changed- added
Input schema / properties / fuente / enumAdded value: +[ + "gestor", + "corte-constitucional", + "corte-suprema", + "consejo-de-estado", + "dian", + "suin", + "creg", + "anh", + "upme", + "anla", + "minagricultura", + "ica", + "anm", + "ant", + "supersociedades", + "sic", + "invima", + "superfinanciera", + "supersalud", + "mintrabajo", + "supertransporte", + "unidadvictimas", + "parques", + "corte", + "suprema", + "consejo" +]
- Changed
obtener_documento2 fields changed- changed
Input schema / properties / seccion / descriptionPrevious value: -"Solo corte: devuelve solo esa parte de la providencia"New value: +"Solo corte, suprema y consejo: devuelve solo esa parte de la providencia. \"consideraciones\" es la motivación de la MAYORÍA; \"salvamentos\" y \"aclaraciones\" son los votos particulares, que NO son doctrina de la Sala." - changed
Input schema / properties / seccion / enumPrevious value: -[ - "antecedentes", - "consideraciones", - "decision" -]New value: +[ + "encabezado", + "antecedentes", + "consideraciones", + "decision", + "salvamentos", + "aclaraciones", + "notas" +]
- Changed
resolver_cita1 field changed- changed
Input schema / properties / contexto / descriptionPrevious value: -"Por defecto true. Con false se omite el extracto de tema asociado y se devuelve solo la identificación, la vigencia y el texto pedido. Útil cuando ya se conoce la norma y solo se quiere el articulado."New value: +"Por defecto true. Con false se omite el extracto de tema asociado y queda solo la identificación, la vigencia y el texto pedido."
7 tool updates
v1.13.0- Changed
buscar_jurisprudencia_consejo_estado1 field changed- added
Input schema / properties / exactoAdded value: +{ + "default": true, + "description": "Buscar la frase exacta (entre comillas en el buscador SAMAI). Viene activado; si la frase no aparece en la página, se amplía solo a OR con un aviso. Ponlo en false para ampliar a propósito.", + "type": "boolean" +}
- Changed
buscar_normativa_sectorial1 field changed- added
Input schema / properties / solo_entidadAdded value: +{ + "description": "Solo INVIMA/Supersalud: limita a los actos de los tipos que la propia entidad expide (Resolución, Circular...), excluyendo la compilación sectorial del normograma (leyes, decretos del Ministerio, sentencias).", + "type": "boolean" +}
- Changed
buscar_unificado3 fields changed- changed
Input schema / properties / fuentes / items / enumPrevious value: -[ - "gestor", - "corte", - "suin", - "dian" -]New value: +[ + "gestor", + "corte", + "suin", + "dian", + "invima", + "supersalud", + "anm" +] - changed
Input schema / properties / perfil / descriptionPrevious value: -"Perfil sectorial: prioriza la fuente que mejor responde a ese sector (tributario → DIAN)"New value: +"Perfil sectorial: prioriza la fuente que mejor responde a ese sector (tributario → DIAN; salud → INVIMA y Supersalud; mineria → ANM)" - changed
Input schema / properties / perfil / enumPrevious value: -[ - "laboral", - "tributario", - "ambiental", - "contratacion", - "energia" -]New value: +[ + "laboral", + "tributario", + "ambiental", + "contratacion", + "energia", + "salud", + "mineria" +]
- Added
consultar_vigencia - Added
historial_norma - Changed
obtener_documento1 field changed- added
Input schema / properties / sin_temasAdded value: +{ + "description": "Solo gestor: omite el bloque de temas asociados (ahorra contexto cuando solo se quiere el articulado)", + "type": "boolean" +}
- Changed
resolver_cita3 fields changed- added
Input schema / properties / articulosAdded value: +{ + "description": "Varios artículos de la MISMA norma en una sola llamada, ej. [\"705\", \"707\", \"710\"]. Se usa con cita apuntando a la norma (\"Decreto Ley 624 de 1989\"); la norma se descarga una vez y se extrae cada artículo.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / cita / descriptionPrevious value: -"Ej.: \"Ley 909 de 2004\", \"C-337/11\", \"art. 6 de la Ley 1221 de 2008\""New value: +"Ej.: \"Ley 909 de 2004\", \"C-337/11\", \"art. 6 de la Ley 1221 de 2008\", \"art. 191 del Código de Comercio\"" - added
Input schema / properties / contextoAdded value: +{ + "description": "Por defecto true. Con false se omite el extracto de tema asociado y se devuelve solo la identificación, la vigencia y el texto pedido. Útil cuando ya se conoce la norma y solo se quiere el articulado.", + "type": "boolean" +}
20 tool updates
v1.11.2- Removed
buscar_conceptos_fp - Changed
buscar_normas1 field changed- changed
Input schema / properties / subtema / descriptionPrevious value: -"id de listar_subtemas con prefijo (\"sub-38968\"), o su nombre si además indicas tema. El \"ts-\" de buscar_por_tema no vale aquí."New value: +"id de listar_catalogos con catalogo=\"subtemas\" y prefijo (\"sub-38968\"), o su nombre si además indicas tema. El \"ts-\" de buscar_por_tema no vale aquí."
- Changed
buscar_normativa_sectorial2 fields changed- added
Input schema / properties / categoriaAdded value: +{ + "description": "Tipo de acto o categoría (cada fuente declara cuáles soporta; solo Unidad de Víctimas lo filtra hoy)", + "type": "string" +} - changed
Input schema / properties / entidad / enumPrevious value: -[ - "minagricultura", - "ica", - "anm", - "supersociedades", - "sic", - "invima", - "superfinanciera", - "mintrabajo", - "supertransporte", - "parques" -]New value: +[ + "minagricultura", + "ica", + "anm", + "ant", + "supersociedades", + "sic", + "invima", + "superfinanciera", + "supersalud", + "mintrabajo", + "supertransporte", + "unidadvictimas", + "parques" +]
- Added
buscar_unificado - Added
expediente - Removed
expediente_agregar - Removed
expediente_crear - Removed
expediente_leer - Changed
listar_catalogos5 fields changed- added
Input schema / properties / anioAdded value: +{ + "description": "Año del concepto (solo catalogo=\"conceptos_fp\")", + "type": "string" +} - changed
Input schema / properties / catalogo / enumPrevious value: -[ - "tipos", - "anios", - "entidades", - "temas" -]New value: +[ + "tipos", + "anios", + "entidades", + "temas", + "subtemas", + "conceptos_fp", + "normas_fp" +] - added
Input schema / properties / desdeAdded value: +{ + "default": 0, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / numeroAdded value: +{ + "description": "Número del concepto (solo catalogo=\"conceptos_fp\")", + "type": "string" +} - added
Input schema / properties / tema_idAdded value: +{ + "description": "Id del tema (solo catalogo=\"subtemas\"), con prefijo \"tema-…\"", + "type": "string" +}
- Removed
listar_normas_fp - Removed
listar_subtemas - Added
obtener_documento - Removed
obtener_documento_dian - Removed
obtener_norma - Removed
obtener_providencia_consejo_estado - Removed
obtener_providencia_suprema - Removed
obtener_resolucion_creg - Removed
obtener_sentencia - Changed
resolver_cita4 fields changed- added
Input schema / properties / citasAdded value: +{ + "description": "Varias citas a la vez, ej. [\"Ley 909 de 2004\", \"C-337/11\"]: cada una se resuelve y se devuelve con su enlace", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / urlAdded value: +{ + "description": "Enlace a comprobar (solo con validar=true)", + "type": "string" +} - added
Input schema / properties / validarAdded value: +{ + "description": "En vez de la resolución, comprueba que la cita (y el enlace, si se da con url) coincide con lo que devuelve el Gestor: número/año, dominio y artículo. Clasifica en \"cita validada\", \"parcialmente validada\" o \"no fue posible validar\". NUNCA afirma vigencia.", + "type": "boolean" +} - removed
Input schema / requiredRemoved value: -[ - "cita" -]
- Removed
validar_cita
11 tool updates
v1.10.2- Changed
buscar_conceptos_fp1 field changed- added
Input schema / properties / limite / descriptionAdded value: +"Cuántos conceptos mostrar (hasta 100; por defecto 20)"
- Changed
buscar_jurisprudencia1 field changed- added
Input schema / properties / limite / descriptionAdded value: +"Cuántas providencias mostrar (hasta 100)"
- Changed
buscar_resoluciones_creg1 field changed- added
Input schema / properties / limite / descriptionAdded value: +"Cuántas resoluciones mostrar (hasta 50)"
- Changed
consultar_perfil1 field changed- added
Input schema / properties / limite / descriptionAdded value: +"Cuántos resultados devolver (máximo 20; por defecto 10)"
- Changed
consultar_por_jerarquia1 field changed- added
Input schema / properties / limite / descriptionAdded value: +"Cuántos documentos devolver (máximo 20; por defecto 10)"
- Changed
expediente_agregar3 fields changed- added
Input schema / properties / campo / descriptionAdded value: +"Sección del expediente donde se guarda la entrada" - changed
Input schema / properties / id / descriptionPrevious value: -"Id devuelto por expediente_crear"New value: +"Id que devuelve expediente_crear; debe existir y no haber expirado" - added
Input schema / properties / texto / descriptionAdded value: +"Contenido de la entrada a guardar, tal cual"
- Changed
expediente_leer1 field changed- added
Input schema / properties / id / descriptionAdded value: +"Id que devuelve expediente_crear; debe existir y no haber expirado"
- Changed
obtener_documento_dian1 field changed- added
Input schema / properties / max_pasajes / descriptionAdded value: +"Máximo de pasajes con buscar_en_texto (por defecto 10)"
- Changed
obtener_providencia_consejo_estado1 field changed- added
Input schema / properties / max_pasajes / descriptionAdded value: +"Máximo de pasajes con buscar_en_texto (por defecto 10)"
- Changed
obtener_providencia_suprema1 field changed- added
Input schema / properties / max_pasajes / descriptionAdded value: +"Máximo de pasajes con buscar_en_texto (por defecto 10)"
- Changed
obtener_resolucion_creg1 field changed- added
Input schema / properties / max_pasajes / descriptionAdded value: +"Máximo de pasajes con buscar_en_texto (por defecto 10)"
9 tool updates
v1.10.1- Added
analizar_conflicto - Added
cambios_desde - Added
comparar_articulos - Added
consultar_perfil - Added
consultar_por_jerarquia - Added
expediente_agregar - Added
expediente_crear - Added
expediente_leer - Added
validar_cita
15 tool updates
v1.9.0- Changed
buscar_jurisprudencia_consejo_estado3 fields changed- changed
Input schema / properties / limite / descriptionPrevious value: -"El buscador entrega páginas de 9 como máximo"New value: +"Cuántas mostrar de la página (hasta 10)" - changed
Input schema / properties / limite / maximumPrevious value: -9New value: +10 - added
Input schema / properties / paginaAdded value: +{ + "default": 1, + "description": "Página de resultados, desde 1. SAMAI pagina en bloques de ~10 y no admite un desplazamiento libre, por eso aquí se pide la página y no el \"desde\" del resto de herramientas.", + "minimum": 1, + "type": "integer" +}
- Changed
buscar_jurisprudencia_suprema2 fields changed- changed
Input schema / properties / exacto / defaultPrevious value: -falseNew value: +true - changed
Input schema / properties / exacto / descriptionPrevious value: -"Buscar la frase exacta. MUY recomendable con frases: sin esto el buscador une las palabras con OR y \"despido sin justa causa\" devuelve 176.012 providencias contra 20.233 con exacto=true."New value: +"Buscar la frase exacta; viene activado. Con exacto=false el buscador une las palabras con OR y \"despido sin justa causa\" devuelve 176.012 providencias contra 20.233 con la frase: en la sala Penal ese modo llega a 33.607 resultados y es inservible. Ponlo en false solo para ampliar a propósito una búsqueda que quedó corta."
- Changed
buscar_normas2 fields changed- changed
Input schema / properties / subtema / descriptionPrevious value: -"subtemaid de listar_subtemas, o su nombre si además indicas tema. NO sirve el temsubid de buscar_por_tema."New value: +"id de listar_subtemas con prefijo (\"sub-38968\"), o su nombre si además indicas tema. El \"ts-\" de buscar_por_tema no vale aquí." - changed
Input schema / properties / tema / descriptionPrevious value: -"Nombre o id de tema del catálogo"New value: +"Nombre del tema, o su id de listar_catalogos con prefijo: \"tema-24457\""
- Added
buscar_normativa_anh - Added
buscar_normativa_sectorial - Added
buscar_normativa_upme - Added
buscar_resoluciones_creg - Added
describir_fuentes - Changed
explicar_relacion_tema3 fields changed- changed
Input schema / properties / temsubid / descriptionPrevious value: -"temsubid de buscar_por_tema (no vale el id de listar_subtemas)"New value: +"temsubid de buscar_por_tema, con su prefijo: \"ts-38872\"" - removed
Input schema / properties / temsubid / patternRemoved value: -"^\\d+$" - changed
Input schema / requiredPrevious value: -[ - "temsubid", - "normid" -]New value: +[ + "normid" +]
- Added
listar_normativa_ambiental_anla - Changed
listar_subtemas3 fields changed- changed
Input schema / properties / tema_id / descriptionPrevious value: -"id de tema del catálogo, como texto"New value: +"id de tema de listar_catalogos, con su prefijo: \"tema-24457\"" - removed
Input schema / properties / tema_id / patternRemoved value: -"^\\d+$" - removed
Input schema / requiredRemoved value: -[ - "tema_id" -]
- Added
obtener_providencia_consejo_estado - Added
obtener_providencia_suprema - Added
obtener_resolucion_creg - Changed
obtener_sentencia1 field changed- changed
Input schema / properties / seccion / descriptionPrevious value: -"Devuelve solo esa parte. \"decision\" trae el RESUELVE, que es lo que casi siempre se busca: en la T-099/24 son 39.906 caracteres en vez de 140.162."New value: +"Devuelve solo esa parte. \"decision\" trae el RESUELVE, que es lo que casi siempre se busca y suele ser una fracción del texto; la respuesta dice cuántos caracteres son de cuántos."
16 tool updates
v1.6.0- First observed
buscar_conceptos_fp - First observed
buscar_en_suin - First observed
buscar_jurisprudencia - First observed
buscar_jurisprudencia_consejo_estado - First observed
buscar_jurisprudencia_suprema - First observed
buscar_normas - First observed
buscar_normativa_tributaria - First observed
buscar_por_tema - First observed
explicar_relacion_tema - First observed
listar_catalogos - First observed
listar_normas_fp - First observed
listar_subtemas - First observed
obtener_documento_dian - First observed
obtener_norma - First observed
obtener_sentencia - First observed
resolver_cita
TDQS
Scored across 28 tools
Most tools have clearly distinct source-specific purposes, and the descriptions explicitly cross-reference alternatives ('para eso usa X'). However, several general search tools (buscar_normas, buscar_por_tema, buscar_unificado, consultar_por_jerarquia) overlap enough that an agent could misselect without careful reading.
The set is mostly consistent snake_case with verb_noun or verb_prep_noun patterns (buscar_, consultar_, listar_, resolver_, obtener_, etc.). A few noun-based names (historial_norma, linea_jurisprudencial, cambios_desde, expediente) break the verb convention but remain readable.
At 28 tools, the set is heavy for the apparent scope, exceeding the typical 3-15 range. Although many tools map to distinct sources, several search and retrieval tools could be consolidated via parameters, making the overall count feel overgrown.
The surface covers the full legal-research lifecycle across major Colombian sources: search, retrieval, citation resolution, vigencia, history, article comparison, conflict analysis, Diario Oficial, and expediente. No obvious functional gaps are evident for the stated domain.
Maintenance
Related MCP Connectors
- CromaOAuthcom.usecroma
Colombian, Peruvian, and Mexican public data: judicial cases, registries, legislation, web search.
Acervo jurídico brasileiro: busca, Markdown, grafo de normas e precedentes, citação verificável.
JusPronto is case-management software for Brazilian law firms. Its remote MCP server (OAuth 2.1 with PKCE, per-permission scopes, audit log) lets Claude and ChatGPT read the firm's own cases, deadlines, agenda, recent court movements and case files with the page cited. Write actions require the lawyer's approval. Requires a JusPronto account.
Busca e verifica jurisprudência brasileira real (+400 mil julgados) — anti-alucinação para IA.
Related MCP Servers
- FlicenseBqualityDmaintenanceProvides comprehensive information about Colombia including departments, regions, cities, tourist attractions, and general country data through the API Colombia service. Enables users to query Colombian geographical and administrative information through natural language.4-
- AlicenseAqualityFmaintenanceEnables querying Swedish statutes, provisions, case law, preparatory works, and EU law cross-references from any MCP-compatible client.1950 npm1Apache 2.0
- AlicenseAqualityAmaintenanceEnables searching and verifying citations of Colombian Constitutional Court decisions using datos.gov.co open data, returning metadata such as magistrate, date, and relatoria URL.387 PyPIApache 2.0
- AlicenseBqualityFmaintenanceConnects AI assistants to Chilean legal sources, enabling citation of official legal texts, search of doctrine, jurisprudence, and rulings.18MIT