Skip to main content
Glama
Mohemed-Amine-Chalhy

ticket-triage-mcp

Agente de triaje de tickets con IA — LangGraph + MCP

CI

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.

Arquitectura del sistema: el correo electrónico y el PDF entran en un flujo de trabajo LangGraph, dos sistemas MCP proporcionan evidencia y una compuerta de confianza se ramifica hacia un borrador o una cola humana.

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 draft

Las dos herramientas MCP son deliberadamente limitadas y de solo lectura:

  1. lookup_customer_account realiza una coincidencia exacta de cuenta/correo electrónico.

  2. lookup_billing_or_incident comprueba 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 --reload

Abre 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 --build

Regenera las cuatro imágenes de prueba del portafolio a partir del cuadro de resultados actual y una ejecución de prueba verbosa real:

make proof

No 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_charge

Ejecuta un caso de fallo e inspecciona la transferencia humana:

uv run ticket-triage triage --case failure_unreadable_attachment

Ejecuta un PDF real:

uv run ticket-triage triage \
  --text "I was charged twice; details are attached." \
  --pdf data/sample_attachments/duplicate-charge.pdf

Ejercita el límite real de MCP stdio:

uv run ticket-triage triage \
  --case billing_duplicate_charge \
  --transport stdio

Reproduce el cuadro de resultados

uv run ticket-triage-eval \
  --output artifacts/scorecard.json \
  --markdown-output artifacts/scorecard.md \
  --fail-on-runtime-error \
  --enforce-portfolio-targets

El 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-mcp

Configuració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

StateGraph compilado con estado tipado y bordes condicionales explícitos

Seguridad

Dos compuertas de política; baja confianza, conflictos, evidencia faltante, archivos ilegibles, fallos de herramientas y omisiones escalan

Documentos

Extracción con pypdf, validación estricta de carga de PDF, límites de tamaño y advertencias de extracción

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 copy

Comandos 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 --build

Documentació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

MIT

-
license - not tested
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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