ticket-triage-mcp
Agente de triaje de tickets con IA — LangGraph + MCP
Un flujo de trabajo de soporte con forma de producción que clasifica solicitudes desordenadas, extrae evidencia de archivos PDF adjuntos, llama a dos sistemas internos a través de MCP, redacta una respuesta fundamentada y deriva los casos inciertos a un humano en lugar de adivinar.
Cuadro de resultados de evaluación
Etapa | Resultado |
Precisión de clasificación | 100% (20/20) |
F1 de extracción de campos | 100% |
Comprobaciones de política de borrador | 100% |
Casos deliberadamente irresolubles escalados | 100% (5/5) |
Razones de escalado específicas del caso | 100% (5/5) |
Tasa de falsos escalados | 0% (0/15) |
Tasa de errores en tiempo de ejecución | 0% |
Latencia sin conexión | 4.6 ms p50 / 6.7 ms p95 |
Estos son resultados reproducibles del corpus sintético incluido, medidos en una máquina de desarrollo local con Windows. La latencia varía según el hardware; el evaluador informa de cada resultado por caso en artifacts/scorecard.json. Los cinco casos difíciles cubren evidencia faltante, identificadores en conflicto, un adjunto ilegible, una solicitud ambigua y un registro ausente del sistema interno. El artefacto también registra su tiempo de generación, hash del corpus, versión de Python, identificador de commit y transporte de herramientas para que los resultados obsoletos sean visibles.
Por qué existe este proyecto
La mayoría de las demostraciones de agentes muestran solo el camino feliz. Esta hace que la abstención sea un comportamiento probado. El agente puede devolver uno de dos resultados acotados:
drafted— se extrajeron los identificadores requeridos, se completaron ambas comprobaciones MCP de solo lectura y se verificaron las referencias proporcionadas.escalated— la confianza o la evidencia no cumplieron la política, por lo que el agente emite una respuesta de espera no comprometida, una cola humana, la evidencia faltante y una razón auditable.
Esa decisión no está oculta en un prompt. Es un borde condicional explícito en la máquina de estados de LangGraph y una métrica en CI.
Qué hace
Email + PDF
│
▼
classify ──► extract ──► intake safety gate
│
unsafe ───┴─── safe
│ │
▼ ▼
human queue MCP tool 1: customer account
│
MCP tool 2: billing / incident
│
post-tool safety gate
│ │
unverified verified
│ │
▼ ▼
human queue grounded draftLas dos herramientas MCP son deliberadamente limitadas y de solo lectura:
lookup_customer_accountrealiza una coincidencia exacta de cuenta/correo electrónico.lookup_billing_or_incidentcomprueba facturación, incidencia de servicio o contexto de soporte acotado.
El grafo siempre utiliza un contrato de herramienta MCP neutral al transporte. La evaluación sin conexión utiliza el adaptador rápido en proceso; Docker Compose ejecuta la interfaz de usuario del portafolio contra un servidor MCP persistente y real de JSON-RPC sobre stdio. Ambos transportes se prueban mediante integración, por lo que la orquestación nunca depende de la elección de despliegue.
Ejecútalo localmente
Requisitos previos: Python 3.11–3.13 y uv.
git clone https://github.com/Mohemed-Amine-Chalhy/ai-ticket-triage.git
cd ai-ticket-triage
uv sync --extra dev --locked
uv run uvicorn ai_ticket_triage.web:app --reloadAbre http://127.0.0.1:8000. La interfaz web incluye los 20 ejemplos etiquetados, un cargador de PDF, el rastro del grafo, los campos extraídos, la evidencia de llamadas MCP, la decisión final y el cuadro de resultados.
El comando anterior utiliza el adaptador rápido en proceso. Para ejecutar la interfaz exacta mostrada en la demostración de MCP, inicia el contenedor bloqueado en su lugar; Compose habilita el servidor stdio persistente por defecto:
docker compose up --buildRegenera las cuatro imágenes de prueba del portafolio a partir del cuadro de resultados actual y una ejecución de prueba verbosa real:
make proofNo se requiere clave API. Todos los nombres, correos electrónicos, cuentas, facturas, servicios e incidentes son ficticios; los correos utilizan el dominio reservado example.test.
Demostración CLI
Ejecuta un fixture respondible:
uv run ticket-triage triage --case billing_duplicate_chargeEjecuta un caso de fallo e inspecciona la transferencia humana:
uv run ticket-triage triage --case failure_unreadable_attachmentEjecuta un PDF real:
uv run ticket-triage triage \
--text "I was charged twice; details are attached." \
--pdf data/sample_attachments/duplicate-charge.pdfEjercita el límite real de MCP stdio:
uv run ticket-triage triage \
--case billing_duplicate_charge \
--transport stdioReproduce el cuadro de resultados
uv run ticket-triage-eval \
--output artifacts/scorecard.json \
--markdown-output artifacts/scorecard.md \
--fail-on-runtime-error \
--enforce-portfolio-targetsEl evaluador puntúa cada etapa de forma independiente: coincidencia exacta de categoría, F1 a nivel de campo micro, comprobaciones declarativas de borrador, fundamentación semántica de la razón de transferencia, precisión/recuperación de escalado, falsos escalados, fallos en tiempo de ejecución y latencia p50/p95/máx. Consulta Metodología de evaluación.
Usa el servidor MCP de forma independiente
Inicia el servidor oficial del SDK incluido sobre stdio:
uv run ticket-triage-mcpConfiguración de ejemplo para un host MCP stdio local:
{
"mcpServers": {
"ticket-triage-tools": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/ai-ticket-triage",
"run",
"ticket-triage-mcp"
]
}
}
}Este es un límite de herramienta neutral al transporte: otro agente compatible o host de escritorio puede usar los mismos dos contratos sin importar la aplicación LangGraph. Para hosts remotos, coloca el servidor detrás de un despliegue HTTP Streamable autenticado; la demostración del portafolio expone intencionalmente solo transportes stdio locales y en proceso.
Decisiones de ingeniería
Preocupación | Implementación |
Orquestación |
|
Seguridad | Dos compuertas de política; baja confianza, conflictos, evidencia faltante, archivos ilegibles, fallos de herramientas y omisiones escalan |
Documentos | Extracción con |
Límite de herramientas | SDK oficial de MCP para Python, exactamente dos herramientas de solo lectura, envoltorios de error normalizados, tiempos de espera |
Contratos | Modelos Pydantic con campos extra prohibidos y resultados públicos seguros para JSON |
Evaluación | 20 etiquetas JSON versionadas, métricas por etapa, diagnósticos de caso, captura de errores en tiempo de ejecución |
API | FastAPI, documentación OpenAPI generada, límites de carga, IDs de solicitud, respuestas de error seguras, cabeceras de seguridad |
Operaciones | Dependencias bloqueadas, comprobación de salud de Docker, registros estructurados, compuertas de CI lint/tipo/prueba/cobertura |
Privacidad | Solo fixtures sintéticos; los bytes PDF crudos se excluyen de la serialización del modelo |
Determinista por diseño
El clasificador, extractor y compositor de borradores por defecto son deterministas. Eso hace que las regresiones de seguridad sean reproducibles, mantiene la demostración pública sin credenciales y separa la calidad del flujo de trabajo de la varianza del modelo. Un modelo alojado puede reemplazar esos nodos detrás de los mismos contratos tipados; en un despliegue real, sus salidas candidatas deberían pasar igualmente por las mismas compuertas de evidencia y herramientas. Este repositorio no afirma que un benchmark sintético de 20 casos prediga la calidad de datos en vivo.
Mapa del repositorio
src/ai_ticket_triage/
├── agent.py # LangGraph state machine and tool orchestration
├── classifier.py # deterministic category scoring with evidence
├── extractor.py # PDF/text extraction and conflict detection
├── confidence.py # bounded-failure policy gates
├── drafting.py # grounded replies and safe holding responses
├── mcp_server.py # official MCP server; exactly two tools
├── mcp_client.py # in-process and real stdio MCP gateways
├── internal_api.py # mock read-only service adapters
├── evaluation.py # corpus runner and scorecard metrics
├── web.py # FastAPI application
└── static/ # responsive portfolio UI
data/cases/ # 20 synthetic labelled fixtures
tests/ # unit, API, workflow, evaluator, and MCP integration tests
artifacts/ # committed scorecard and proof outputs
assets/ # portfolio-ready architecture and result images
docs/ # architecture, evaluation, security, runbook, portfolio copyComandos de calidad
uv run ruff check .
uv run ruff format --check .
uv run mypy src
uv run pytest --cov=ai_ticket_triage --cov-report=term-missing
uv run ticket-triage-eval --fail-on-runtime-error --enforce-portfolio-targets
docker compose up --buildDocumentación
Limitaciones conocidas
Solo PDFs basados en texto; los documentos escaneados necesitan OCR y un pipeline de escaneo de malware.
Sistemas internos sintéticos de coincidencia exacta, no un CRM o plataforma de facturación en vivo.
Fixtures en inglés y una taxonomía de cuatro clases.
Sin cola duradera, autenticación, limitación de velocidad ni trazado distribuido en esta demostración local.
La lógica de lenguaje determinista es una línea base de fiabilidad, no un sustituto de la evaluación en un conjunto de datos de producción representativo y revisado en privacidad.
Esas omisiones son límites intencionales de proyecto de fin de semana. Las interfaces aíslan cada preocupación de producción faltante para que pueda añadirse sin reescribir el grafo.
Licencia
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only Frasma MCP: profile, knowledge search, diagnostic handoff. No email.
A paid remote MCP for AI SDK data query MCP, built to return verdicts, receipts, usage logs, and aud
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mohemed-Amine-Chalhy/ai-ticket-triage'
If you have feedback or need assistance with the MCP directory API, please join our Discord server