Apariencia
Herramientas del servidor MCP
Catálogo de las herramientas que puedes invocar con tools/call (ver Conexión). El catálogo que tú ves con tools/list depende de tu identidad: solo aparecen las que tu usuario puede usar.
- Las herramientas de consulta son de solo lectura y devuelven únicamente lo que el usuario ya puede ver en Panteum.
- Las dos de escritura (
radicar_mesa_ayuda,comentar_solicitud) funcionan en dos pasos con confirmación y tienen un límite de 6 operaciones confirmadas por minuto. - Si el usuario no tiene permiso, la llamada responde HTTP 200 con
isError: trueystructuredContent.codigo = "SIN_PERMISO".
Cómo leer los ejemplos
Todos los ejemplos usan estas funciones auxiliares (definidas en Conexión); en curl se muestra la petición completa.
js
// JavaScript: función auxiliar sobre mcp("tools/call", …)
const llamar = (name, args) => mcp("tools/call", { name, arguments: args });python
# Python: función auxiliar sobre mcp("tools/call", …)
def llamar(name, args):
return mcp("tools/call", {"name": name, "arguments": args})Los datos de los ejemplos son ficticios.
Índice
| Herramienta | Tipo | Requiere permiso |
|---|---|---|
buscar_ayuda | lectura | solo estar identificado |
buscar_documento | lectura | no |
buscar_solicitudes | lectura | sí (solicitudes.bandeja.ver o solicitudes.radicar o solicitudes.ver_todas) |
busqueda_global | lectura | solo estar identificado |
comentar_solicitud | escritura con confirmación | sí (solicitudes.bandeja.ver o solicitudes.radicar o solicitudes.ver_todas) |
estado_cdp | lectura | sí (presupuesto.planeacion.consultar) |
estado_presupuesto | lectura | sí (presupuesto.reportes.consultar) |
estado_rp | lectura | sí (presupuesto.planeacion.consultar) |
estado_solicitud | lectura | no |
mis_accesos | lectura | solo estar identificado |
mis_tareas | lectura | sí (solicitudes.bandeja.ver) |
radicar_mesa_ayuda | escritura con confirmación | sí (solicitudes.radicar) |
reporte_preparar | lectura | sí (presupuesto.reportes.personalizados) |
resumen_ejecutivo | lectura | sí (presupuesto.reportes.consultar o presupuesto.planeacion.consultar) |
resumen_solicitud | lectura | solo estar identificado |
Existen además dos herramientas de administración técnica que no se documentan aquí: solo aparecen para usuarios con permisos de administración.
buscar_ayuda
Buscar en los manuales y guías de uso de Panteum.
Busca en los manuales y guías de uso de Panteum («¿cómo radico una solicitud?», «¿dónde veo mis tareas?») y devuelve los fragmentos más relevantes con su cita (manual y sección). No consulta datos de la entidad y no usa modelos de IA.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno): — (cualquier usuario identificado)
- Tipo: solo lectura
- Devuelve: Fragmentos de manual con su cita y una indicación de si lo encontrado es suficiente para responder.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
consulta | string | sí | La duda de uso con palabras clave (ej. "radicar una solicitud", "publicar documento de calidad"). (mín. 3 car., máx. 200 car.) |
max | integer | no | Cuántos fragmentos devolver (1 a 5). (mín. 1, máx. 5, por defecto: 4) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"buscar_ayuda","arguments":{"consulta":"radicar una solicitud","max":3}}}'JavaScript (fetch)
js
const r = await llamar("buscar_ayuda", {
"consulta": "radicar una solicitud",
"max": 3
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("buscar_ayuda", {
"consulta": "radicar una solicitud",
"max": 3
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.
buscar_documento
Buscar documento de calidad (publicado).
Busca documentos vigentes (publicados) del Sistema de Gestión de Calidad por texto libre en título, código o tema. Nunca devuelve borradores ni descarga el contenido.
- Acceso: Pública: usable solo con la API Key de integración (si tu entidad la habilita).
- Permisos del usuario (alguno): — (cualquier usuario identificado)
- Tipo: solo lectura
- Devuelve: Lista de documentos con código, título, versión, tipo, proceso y fecha de publicación.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
texto | string | sí | Texto a buscar en titulo, codigo o tema del documento (ej. "manual de calidad"). (mín. 2 car., máx. 120 car.) |
limite | integer | no | Maximo de resultados a devolver (1 a 50). (mín. 1, máx. 50, por defecto: 10) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"buscar_documento","arguments":{"texto":"manual de calidad","limite":5}}}'JavaScript (fetch)
js
const r = await llamar("buscar_documento", {
"texto": "manual de calidad",
"limite": 5
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("buscar_documento", {
"texto": "manual de calidad",
"limite": 5
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
result.structuredContent (datos ficticios; la herramienta puede agregar campos nuevos, lee solo los que necesites):
json
{
"texto": "manual de calidad",
"total": 2,
"documentos": [
{
"id": 12,
"uid": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"codigo_publicado": "MAN-GC-01",
"codigos_anteriores": [],
"titulo": "Manual de calidad",
"version": "3",
"tipo": "Manual",
"proceso": "Gestión de calidad",
"estado": "publicado",
"fecha_publicacion": "2026-09-15"
}
]
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados.
buscar_solicitudes
Buscar solicitudes (radicados).
Busca solicitudes (radicados) con filtros cuando no tienes el número exacto: texto, estado, tipo, rango de fechas. alcance="mias" (por defecto) busca entre las que el usuario radicó; "todas" solo funciona si su rol puede ver todas.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
solicitudes.bandeja.ver,solicitudes.radicar,solicitudes.ver_todas - Tipo: solo lectura
- Devuelve: Lista corta con número de radicado, tipo, estado, etapa actual, resumen, fechas y un enlace a la pantalla del radicado.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
texto | string | no | Texto a buscar en el número de radicado o en el resumen (ej. "aseo", "CDP-2026"). (máx. 120 car.) |
estado | enum: borrador · radicado · en_tramite · aprobado · rechazado · devuelto · anulado · requiere_atencion | no | Filtra por estado de la solicitud. |
tipo | string | no | Código o nombre (parcial) del tipo de solicitud (ej. "CDP", "PAA", "mesa de ayuda"). (máx. 80 car.) |
desde | string (date) | no | Fecha de radicación mínima (YYYY-MM-DD). |
hasta | string (date) | no | Fecha de radicación máxima (YYYY-MM-DD). |
alcance | enum: mias · todas | no | "mias" (defecto) o "todas" (requiere permiso de ver todas). (por defecto: "mias") |
limite | integer | no | Máximo de resultados (1 a 30). (mín. 1, máx. 30, por defecto: 10) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"buscar_solicitudes","arguments":{"texto":"aseo","estado":"en_tramite","alcance":"mias","limite":5}}}'JavaScript (fetch)
js
const r = await llamar("buscar_solicitudes", {
"texto": "aseo",
"estado": "en_tramite",
"alcance": "mias",
"limite": 5
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("buscar_solicitudes", {
"texto": "aseo",
"estado": "en_tramite",
"alcance": "mias",
"limite": 5
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
result.structuredContent (datos ficticios; la herramienta puede agregar campos nuevos, lee solo los que necesites):
json
{
"alcance": "mias",
"total": 1,
"mostradas": 1,
"solicitudes": [
{
"numero_radicado": "AYUDA-2026-000004",
"id_solicitud": 57,
"enlace": "/m/solicitudes/57",
"tipo": "Mesa de ayuda",
"estado": "en_tramite",
"etapa_actual": "Atención",
"resumen": "No carga el tablero de presupuesto",
"fecha_radicacion": "2026-10-03 10:12",
"fecha_actualizacion": "2026-10-03 10:12"
}
]
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno desolicitudes.bandeja.ver,solicitudes.radicar,solicitudes.ver_todas.
busqueda_global
Búsqueda global (solicitudes, documentos de calidad, CDP y RP).
Búsqueda abierta por tema en las solicitudes del usuario, los documentos vigentes de calidad y los CDP/RP que su usuario puede ver, con resultados agrupados y enlaces a las pantallas.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno): — (cualquier usuario identificado)
- Tipo: solo lectura
- Devuelve: Resultados agrupados por ámbito (
solicitudes,documentos,presupuesto).
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
texto | string | sí | Tema o palabras clave (ej. "talento humano", "infraestructura", "vacaciones"). (mín. 2 car., máx. 120 car.) |
ambitos | array de string (solicitudes · documentos · presupuesto) | no | Dónde buscar: solicitudes | documentos | presupuesto (CDP y RP). Por defecto, todos. |
tipo | string | no | Solo solicitudes: código o nombre parcial del tipo (ej. "CDP", "PAA", "AYUDA"). (máx. 60 car.) |
estado | enum: borrador · radicado · en_tramite · aprobado · rechazado · devuelto · anulado · requiere_atencion | no | Solo solicitudes. |
desde | string | no | Solo solicitudes: fecha inicial YYYY-MM-DD. |
hasta | string | no | Solo solicitudes: fecha final YYYY-MM-DD. |
alcance | enum: mias · todas | no | Solo solicitudes: "todas" exige permiso de auditoría. (por defecto: "mias") |
limite | integer | no | Máximo de resultados por ámbito (1 a 10). (mín. 1, máx. 10, por defecto: 5) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"busqueda_global","arguments":{"texto":"talento humano","ambitos":["solicitudes","documentos"],"limite":3}}}'JavaScript (fetch)
js
const r = await llamar("busqueda_global", {
"texto": "talento humano",
"ambitos": [
"solicitudes",
"documentos"
],
"limite": 3
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("busqueda_global", {
"texto": "talento humano",
"ambitos": [
"solicitudes",
"documentos"
],
"limite": 3
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.
comentar_solicitud
Comentar una solicitud (escritura con confirmación).
Escritura con confirmación. Publica un comentario en el chat de un radicado, a nombre del usuario y visible para los participantes del trámite. Solo agrega un mensaje: no aprueba, rechaza ni modifica la solicitud. Requiere acceso al radicado.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
solicitudes.bandeja.ver,solicitudes.radicar,solicitudes.ver_todas - Tipo: escritura con confirmación (dos pasos)
- Devuelve: Paso 1 (sin
confirmar): vista previa (radicado, estado y texto) y untoken_confirmacion. Paso 2 (confirmar: true+ token): publica el comentario.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
numero_radicado | string | sí | Número de radicado exacto. (mín. 3 car., máx. 60 car.) |
comentario | string | sí | Texto del comentario. (mín. 3 car., máx. 2000 car.) |
confirmar | boolean | no | true SOLO después de que el usuario aprobó la vista previa. (por defecto: false) |
token_confirmacion | string | no | Token recibido en la vista previa (obligatorio con confirmar=true). (máx. 600 car.) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"comentar_solicitud","arguments":{"numero_radicado":"PAA-2026-000029","comentario":"Ya corregí el anexo solicitado."}}}'JavaScript (fetch)
js
const r = await llamar("comentar_solicitud", {
"numero_radicado": "PAA-2026-000029",
"comentario": "Ya corregí el anexo solicitado."
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("comentar_solicitud", {
"numero_radicado": "PAA-2026-000029",
"comentario": "Ya corregí el anexo solicitado."
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Segundo paso (confirmar): repite la llamada con los mismos datos más confirmar y el token_confirmacion recibido en la vista previa (válido unos minutos y de un solo uso). Solo hazlo si la persona aprobó la vista previa.
json
{
"name": "comentar_solicitud",
"arguments": {
"numero_radicado": "PAA-2026-000029",
"comentario": "Ya corregí el anexo solicitado.",
"confirmar": true,
"token_confirmacion": "<token_confirmacion_de_la_vista_previa>"
}
}Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno desolicitudes.bandeja.ver,solicitudes.radicar,solicitudes.ver_todas.ESCRITURA_DESHABILITADA: las escrituras están apagadas en tu entidad.RATE_LIMIT: más de 6 operaciones confirmadas por minuto.
estado_cdp
Estado de un CDP (Certificado de Disponibilidad Presupuestal).
Estado de un CDP (Certificado de Disponibilidad Presupuestal) por su número o número externo. Solo ve los CDP de las áreas que el usuario puede ver.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
presupuesto.planeacion.consultar - Tipo: solo lectura
- Devuelve: Número del CDP, estado visible y descripción, valor inicial y actual, comprometido por RP, saldo, área, objeto, fecha de expedición y radicado del trámite.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
numero | string | sí | Número del CDP (ej. "CDP-2026-000010") o número externo/SIIF. (mín. 2 car., máx. 60 car.) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"estado_cdp","arguments":{"numero":"CDP-2026-000010"}}}'JavaScript (fetch)
js
const r = await llamar("estado_cdp", {
"numero": "CDP-2026-000010"
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("estado_cdp", {
"numero": "CDP-2026-000010"
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
result.structuredContent (datos ficticios; la herramienta puede agregar campos nuevos, lee solo los que necesites):
json
{
"numero_cdp": "CDP-2026-000010",
"numero_externo": null,
"numero_radicado": "CDP-2026-000010",
"estado": "expedido",
"estado_visible": "Expedido",
"estado_descripcion": "El CDP fue expedido.",
"estado_expedicion": null,
"area": "Planeación",
"dependencia": null,
"objeto": "Adquisición de equipos de cómputo",
"valor_inicial": 12000000,
"valor_actual": 12000000,
"comprometido": 4000000,
"saldo": 8000000,
"fecha_expedicion": "2026-09-30",
"movimientos": 0,
"motivo_devolucion": null,
"motivo_rechazo": null,
"encontrado": true
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno depresupuesto.planeacion.consultar.encontrado: false(isError): no existe ese número entre los que el usuario puede ver.
estado_presupuesto
Estado del presupuesto (tablero gerencial y disponibilidad).
Resume el tablero gerencial de presupuesto de la vigencia activa: techo, asignado, programado y disponible, avance, líneas del PAA por estado, y disponibilidad por proyecto y por área (con semáforo), solo de lo que el usuario puede ver. Admite filtros por proyecto o área.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
presupuesto.reportes.consultar - Tipo: solo lectura
- Devuelve: Totales, avance y disponibilidad por proyecto/área; con
detalle=truey un proyecto único, también sus actividades y su distribución por área.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
proyecto | string | no | Id, código o nombre (parcial) de un proyecto (ej. "QA-PRY-A", "inversión"). (máx. 100 car.) |
area | string | no | Id, sigla o nombre (parcial) de un área/dependencia/grupo. (máx. 100 car.) |
detalle | boolean | no | true = si el proyecto filtrado es único, incluye sus actividades y distribución por área. (por defecto: false) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"estado_presupuesto","arguments":{"area":"Planeación","detalle":false}}}'JavaScript (fetch)
js
const r = await llamar("estado_presupuesto", {
"area": "Planeación",
"detalle": false
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("estado_presupuesto", {
"area": "Planeación",
"detalle": False
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno depresupuesto.reportes.consultar.
estado_rp
Estado de un RP (Registro Presupuestal).
Estado de un RP (Registro Presupuestal) por su número o número externo. Solo ve los RP de las áreas que el usuario puede ver.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
presupuesto.planeacion.consultar - Tipo: solo lectura
- Devuelve: Número del RP, estado visible, CDP de origen, beneficiario, objeto, valores (inicial, actual, obligado) y fechas.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
numero | string | sí | Número del RP (ej. "RP-2026-000005") o número externo. (mín. 2 car., máx. 60 car.) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"estado_rp","arguments":{"numero":"RP-2026-000005"}}}'JavaScript (fetch)
js
const r = await llamar("estado_rp", {
"numero": "RP-2026-000005"
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("estado_rp", {
"numero": "RP-2026-000005"
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
result.structuredContent (datos ficticios; la herramienta puede agregar campos nuevos, lee solo los que necesites):
json
{
"numero_rp": "RP-2026-000005",
"numero_externo": null,
"numero_radicado": "RP-2026-000005",
"estado": "expedido",
"estado_visible": "Expedido",
"estado_descripcion": "El RP fue expedido.",
"estado_expedicion": null,
"cdp": "CDP-2026-000010",
"beneficiario": "Proveedor Ejemplo S.A.S.",
"objeto": "Compra de equipos de cómputo",
"valor_inicial": 4000000,
"valor_actual": 4000000,
"obligado": 0,
"fecha_expedicion": "2026-10-02",
"fecha_inicio": "2026-10-05",
"fecha_fin": "2026-12-31",
"motivo_devolucion": null,
"motivo_rechazo": null,
"encontrado": true
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno depresupuesto.planeacion.consultar.encontrado: false(isError): no existe ese número entre los que el usuario puede ver.
estado_solicitud
Estado de una solicitud (radicado).
Estado actual de una solicitud o trámite por su número de radicado exacto. Con usuario conectado solo ve radicados a los que ese usuario tiene acceso; sin usuario exige correo_solicitante (el correo de quien radicó) como verificación y devuelve un subconjunto mínimo. Si no existe o no hay acceso, el mensaje es el mismo.
- Acceso: Verificada: usable sin usuario si envías un dato de verificación (
correo_solicitante). - Permisos del usuario (alguno): — (cualquier usuario identificado)
- Tipo: solo lectura
- Devuelve: Número, estado, tipo, etapa actual y fechas. Con usuario, además: enlace a la pantalla, rol responsable, resumen y vínculos padre/hijos.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
numero_radicado | string | sí | Número de radicado exacto (ej. "SOL-2026-000123", "CDP-2026-000010"). (mín. 3 car., máx. 60 car.) |
correo_solicitante | string | no | SOLO si no hay usuario conectado: correo electrónico de quien radicó la solicitud (dato de verificación). (máx. 150 car.) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"estado_solicitud","arguments":{"numero_radicado":"PAA-2026-000029","correo_solicitante":"CORREO_DEL_SOLICITANTE"}}}'JavaScript (fetch)
js
const r = await llamar("estado_solicitud", {
"numero_radicado": "PAA-2026-000029",
"correo_solicitante": "CORREO_DEL_SOLICITANTE"
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("estado_solicitud", {
"numero_radicado": "PAA-2026-000029",
"correo_solicitante": "CORREO_DEL_SOLICITANTE"
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
result.structuredContent (datos ficticios; la herramienta puede agregar campos nuevos, lee solo los que necesites):
json
{
"numero_radicado": "PAA-2026-000029",
"id_solicitud": 41,
"enlace": "/m/solicitudes/41",
"estado": "en_tramite",
"tipo": "Aprobación de línea PAA",
"etapa_actual": "Revisión del subdirector",
"rol_responsable": "Subdirector",
"resumen": "Adquisición de equipos de cómputo…",
"fecha_radicacion": "2026-09-28 09:14",
"fecha_actualizacion": "2026-09-29 15:02",
"fecha_cierre": null,
"radicado_padre": null,
"radicados_hijos": []
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. FALTA_VERIFICACION(isError): sin usuario debes enviarcorreo_solicitante. Si el radicado no existe o el correo no coincide,encontrado: false(mismo mensaje en ambos casos).DEMASIADOS_INTENTOS: demasiadas verificaciones fallidas.
mis_accesos
Mis accesos (qué puedo hacer en PANTEUM).
Qué puede hacer el usuario conectado: sus roles, los módulos que ve, sus permisos agrupados por módulo y las herramientas de este asistente que tiene disponibles. Solo habla del propio usuario.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno): — (cualquier usuario identificado)
- Tipo: solo lectura
- Devuelve: Roles, módulos, permisos (opcional) y herramientas disponibles.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
incluir_permisos | boolean | no | true (defecto) = lista también las claves de permiso agrupadas por módulo; false = solo roles, módulos y herramientas. (por defecto: true) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"mis_accesos","arguments":{"incluir_permisos":false}}}'JavaScript (fetch)
js
const r = await llamar("mis_accesos", {
"incluir_permisos": false
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("mis_accesos", {
"incluir_permisos": False
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.
mis_tareas
Mis tareas pendientes (bandeja).
Tareas pendientes del usuario (su bandeja): solicitudes que debe revisar, aprobar, firmar o corregir, con antigüedad y vencimiento (marca las vencidas y las que vencen en 48 h). alcance="rol" incluye la bandeja común de sus roles; "mias" solo lo asignado directamente a él.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
solicitudes.bandeja.ver - Tipo: solo lectura
- Devuelve: Conteos (
total_bandeja,mostradas,vencidas,por_vencer) y la lista de tareas.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
alcance | enum: rol · mias | no | "rol" (defecto): asignadas a mí + bandeja común de mis roles de flujo. "mias": solo asignadas directamente a mí. (por defecto: "rol") |
solo_vencidas | boolean | no | true = solo las tareas cuyo vencimiento ya pasó. (por defecto: false) |
limite | integer | no | Máximo de tareas a devolver (1 a 50). (mín. 1, máx. 50, por defecto: 20) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"mis_tareas","arguments":{"alcance":"rol","solo_vencidas":false,"limite":10}}}'JavaScript (fetch)
js
const r = await llamar("mis_tareas", {
"alcance": "rol",
"solo_vencidas": false,
"limite": 10
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("mis_tareas", {
"alcance": "rol",
"solo_vencidas": False,
"limite": 10
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
result.structuredContent (datos ficticios; la herramienta puede agregar campos nuevos, lee solo los que necesites):
json
{
"alcance": "rol",
"total_bandeja": 1,
"mostradas": 1,
"vencidas": 0,
"por_vencer": 1,
"tareas": [
{
"numero_radicado": "PAA-2026-000029",
"id_solicitud": 41,
"enlace": "/m/solicitudes/41",
"tipo": "Aprobación de línea PAA",
"resumen": "Adquisición de equipos de cómputo…",
"estado_solicitud": "en_tramite",
"etapa": "Revisión del subdirector",
"rol_flujo": "Subdirector",
"requiere_firma": true,
"asignada_a_mi": false,
"es_correccion_mia": false,
"recibida": "2026-09-29 15:02",
"dias_pendiente": 6,
"vence_en": "2026-10-06 15:02",
"vencida": false,
"por_vencer": true
}
]
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno desolicitudes.bandeja.ver.
radicar_mesa_ayuda
Radicar ticket en la mesa de ayuda (escritura con confirmación).
Escritura con confirmación. Crea un ticket en la mesa de ayuda de Panteum a nombre del usuario (reportar un error, una mejora o una sugerencia). Solo se usa cuando la persona lo pide de forma explícita.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
solicitudes.radicar - Tipo: escritura con confirmación (dos pasos)
- Devuelve: Paso 1 (sin
confirmar): vista previa ytoken_confirmacion. Paso 2 (confirmar: true+ token): radica el ticket y devuelve su número.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
asunto | string | sí | Asunto corto del ticket. (mín. 5 car., máx. 150 car.) |
descripcion | string | sí | Qué pasó, qué esperaba el usuario y pasos para reproducirlo. (mín. 10 car., máx. 4000 car.) |
severidad | enum: sugerencia · error · mejora_grave · bloqueante | no | sugerencia | error | mejora_grave | bloqueante. (por defecto: "error") |
modulo | string | no | Módulo o pantalla afectada (opcional). (máx. 120 car.) |
confirmar | boolean | no | true SOLO después de que el usuario aprobó la vista previa. (por defecto: false) |
token_confirmacion | string | no | Token recibido en la vista previa (obligatorio con confirmar=true). (máx. 600 car.) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"radicar_mesa_ayuda","arguments":{"asunto":"No carga el tablero de presupuesto","descripcion":"Al abrir el tablero gerencial queda cargando y no muestra datos.","severidad":"error","modulo":"Presupuesto"}}}'JavaScript (fetch)
js
const r = await llamar("radicar_mesa_ayuda", {
"asunto": "No carga el tablero de presupuesto",
"descripcion": "Al abrir el tablero gerencial queda cargando y no muestra datos.",
"severidad": "error",
"modulo": "Presupuesto"
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("radicar_mesa_ayuda", {
"asunto": "No carga el tablero de presupuesto",
"descripcion": "Al abrir el tablero gerencial queda cargando y no muestra datos.",
"severidad": "error",
"modulo": "Presupuesto"
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Segundo paso (confirmar): repite la llamada con los mismos datos más confirmar y el token_confirmacion recibido en la vista previa (válido unos minutos y de un solo uso). Solo hazlo si la persona aprobó la vista previa.
json
{
"name": "radicar_mesa_ayuda",
"arguments": {
"asunto": "No carga el tablero de presupuesto",
"descripcion": "Al abrir el tablero gerencial queda cargando y no muestra datos.",
"severidad": "error",
"modulo": "Presupuesto",
"confirmar": true,
"token_confirmacion": "<token_confirmacion_de_la_vista_previa>"
}
}Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno desolicitudes.radicar.ESCRITURA_DESHABILITADA: las escrituras están apagadas en tu entidad.RATE_LIMIT: más de 6 operaciones confirmadas por minuto.
reporte_preparar
Preparar un reporte (prellenar el constructor).
Prepara un reporte personalizado de presupuesto (Excel o CSV) sin generarlo: valida la ficha con el sistema y devuelve el total de filas, una muestra mínima y un enlace al constructor ya prellenado para que la persona lo revise y lo genere.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
presupuesto.reportes.personalizados - Tipo: solo lectura
- Devuelve: Total de filas, muestra y enlace al constructor de reportes.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
peticion | string | no | Lo que pidió la persona, en una frase. |
ficha | objeto | sí |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"reporte_preparar","arguments":{"peticion":"CDP expedidos de 2026 por área","ficha":{"fuente":"cdp","titulo":"CDP expedidos 2026","filtros":[{"campo":"estado","op":"igual","valor":"expedido"}],"formato":"xlsx"}}}}'JavaScript (fetch)
js
const r = await llamar("reporte_preparar", {
"peticion": "CDP expedidos de 2026 por área",
"ficha": {
"fuente": "cdp",
"titulo": "CDP expedidos 2026",
"filtros": [
{
"campo": "estado",
"op": "igual",
"valor": "expedido"
}
],
"formato": "xlsx"
}
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("reporte_preparar", {
"peticion": "CDP expedidos de 2026 por área",
"ficha": {
"fuente": "cdp",
"titulo": "CDP expedidos 2026",
"filtros": [
{
"campo": "estado",
"op": "igual",
"valor": "expedido"
}
],
"formato": "xlsx"
}
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno depresupuesto.reportes.personalizados.
resumen_ejecutivo
Resumen ejecutivo de un área o del PAA de un mes (cifras agregadas).
Cifras agregadas para redactar un resumen ejecutivo: ambito="area" (situación presupuestal de un área y sus líneas del PAA por estado) o ambito="paa_mes" (líneas del PAA con inicio estimado en un mes: cantidad, valor total, por estado y por área, y las de mayor valor). Solo trae lo que el usuario puede ver.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno):
presupuesto.reportes.consultar,presupuesto.planeacion.consultar - Tipo: solo lectura
- Devuelve: Cifras agregadas por ámbito, listas para redactar el texto.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
ambito | enum: area · paa_mes | sí | "area" = situación del área; "paa_mes" = PAA del mes. |
area | string | no | Id, sigla o nombre (parcial) del área. Con ambito="area" es obligatoria; con "paa_mes" filtra por esa área (opcional). (máx. 100 car.) |
mes | string | no | Mes en formato AAAA-MM (por defecto, el mes actual). Solo ambito="paa_mes". |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"resumen_ejecutivo","arguments":{"ambito":"paa_mes","mes":"2026-10"}}}'JavaScript (fetch)
js
const r = await llamar("resumen_ejecutivo", {
"ambito": "paa_mes",
"mes": "2026-10"
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("resumen_ejecutivo", {
"ambito": "paa_mes",
"mes": "2026-10"
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.SIN_PERMISO(isError): el usuario no tiene ninguno depresupuesto.reportes.consultar,presupuesto.planeacion.consultar.
resumen_solicitud
Resumen de una solicitud (estado, historial y siguiente responsable).
Resumen completo de una solicitud por su número de radicado: estado, etapa y progreso, siguiente responsable (a quién le toca y desde cuándo) e historial resumido (quién hizo qué y cuándo). Opcionalmente incluye los últimos comentarios del chat y los campos de texto del formulario.
- Acceso: Requiere usuario (token personal).
- Permisos del usuario (alguno): — (cualquier usuario identificado)
- Tipo: solo lectura
- Devuelve: Estado, etapa y progreso, siguiente responsable e historial reciente.
Argumentos
| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
numero_radicado | string | sí | Número de radicado exacto (ej. "PAA-2026-000029"). (mín. 3 car., máx. 60 car.) |
incluir_comentarios | boolean | no | true = agrega los últimos mensajes del chat del radicado (autor, fecha, texto recortado). Úsalo para resumir o redactar una respuesta. (por defecto: false) |
incluir_contenido | boolean | no | true = agrega los campos de texto del formulario radicado (asunto, descripción, etc.; sin documentos de identidad ni contactos). (por defecto: false) |
max_eventos | integer | no | Cuántos eventos recientes del historial devolver (1 a 30). (mín. 1, máx. 30, por defecto: 10) |
Ejemplo
curl
bash
curl -s https://mcp.tu-entidad.example/api/mcp \
-H "Authorization: Bearer $PANTEUM_API_KEY" \
-H "X-MCP-User-Token: $PANTEUM_TOKEN_PERSONAL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"resumen_solicitud","arguments":{"numero_radicado":"PAA-2026-000029","max_eventos":5}}}'JavaScript (fetch)
js
const r = await llamar("resumen_solicitud", {
"numero_radicado": "PAA-2026-000029",
"max_eventos": 5
});
if (r.isError) console.warn(r.content[0].text);
else console.log(r.structuredContent);Python (requests)
python
r = llamar("resumen_solicitud", {
"numero_radicado": "PAA-2026-000029",
"max_eventos": 5
})
print(r["content"][0]["text"] if r["isError"] else r["structuredContent"])Respuesta de ejemplo
Estructura general (el contenido de structuredContent varía por herramienta y puede ampliarse; lee solo los campos que necesites):
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "<resumen legible en español>"
},
{
"type": "text",
"text": "<el mismo dato como JSON en texto>"
}
],
"isError": false,
"structuredContent": {
"…": "datos de la herramienta"
}
}
}Errores
- Los comunes del protocolo (ver Conexión): 401 por credenciales, 429 por límite,
-32602por argumentos mal formados. SIN_IDENTIDAD(isError): enviaste solo la API Key; esta herramienta necesita el token personal.