ticket-triage-mcp
KI-Ticket-Triage-Agent — LangGraph + MCP
Ein produktionsreifer Support-Workflow, der unstrukturierte Anfragen klassifiziert, Belege aus PDF-Anhängen extrahiert, über MCP zwei interne Systeme aufruft, eine fundierte Antwort entwirft und unsichere Fälle an einen Menschen weiterleitet, statt zu raten.
Bewertungsübersicht
Stufe | Ergebnis |
Klassifizierungsgenauigkeit | 100 % (20/20) |
Feldextraktion F1 | 100 % |
Entwurfs-Policy-Prüfungen | 100 % |
Bewusst unbeantwortbare Fälle eskaliert | 100 % (5/5) |
Fallspezifische Eskalationsgründe | 100 % (5/5) |
Fehleskalationsrate | 0 % (0/15) |
Laufzeitfehlerrate | 0 % |
Offline-Latenz | 4,6 ms p50 / 6,7 ms p95 |
Dies sind reproduzierbare Ergebnisse aus dem fest eingecheckten synthetischen Korpus, gemessen auf
einem lokalen Windows-Entwicklungsrechner. Die Latenz variiert je nach Hardware; der Evaluator
meldet jedes Einzelfallergebnis in artifacts/scorecard.json. Die fünf
schwierigen Fälle umfassen fehlende Belege, widersprüchliche Kennungen, einen unlesbaren Anhang,
eine mehrdeutige Anfrage und einen Datensatz, der im internen System nicht vorhanden ist. Das
Artefakt erfasst außerdem seinen Erstellungszeitpunkt, den Korpus-Hash, die Python-Version, den
Commit-Bezeichner und den Tool-Transport, sodass veraltete Ergebnisse sichtbar sind.
Warum dieses Projekt existiert
Die meisten Agenten-Demos zeigen nur den Happy Path. Diese hier macht die Enthaltung zu einem getesteten Verhalten. Der Agent kann eines von zwei begrenzten Ergebnissen zurückgeben:
drafted— die erforderlichen Kennungen wurden extrahiert, beide schreibgeschützten MCP-Prüfungen wurden abgeschlossen und die angegebenen Referenzen wurden verifiziert.escalated— Konfidenz oder Belege verfehlen die Policy, daher gibt der Agent eine unverbindliche Zwischenantwort, eine menschliche Warteschlange, die fehlenden Belege und einen prüfbaren Grund aus.
Diese Entscheidung ist nicht in einem Prompt versteckt. Sie ist eine explizite bedingte Kante in der LangGraph-Zustandsmaschine und eine Kennzahl in CI.
Was es tut
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 draftDie beiden MCP-Tools sind bewusst eng begrenzt und schreibgeschützt:
lookup_customer_accountführt einen exakten Konto-/E-Mail-Abgleich durch.lookup_billing_or_incidentprüft Abrechnung, Servicevorfälle oder begrenzten Support-Kontext.
Der Graph verwendet immer einen transportneutralen MCP-Tool-Vertrag. Die Offline-Bewertung nutzt den schnellen In-Process-Adapter; Docker Compose führt die Portfolio-UI gegen einen persistenten, echten JSON-RPC-über-stdio-MCP-Server aus. Beide Transporte sind integrationstestet, sodass die Orchestrierung nie von der Bereitstellungswahl abhängt.
Lokal ausführen
Voraussetzungen: Python 3.11–3.13 und 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Öffnen Sie http://127.0.0.1:8000. Die Web-UI enthält alle 20 beschrifteten Beispiele, einen PDF-Uploader, die Graph-Trace, extrahierte Felder, MCP-Aufrufbelege, die endgültige Entscheidung und die Bewertungsübersicht.
Der obige Befehl verwendet den schnellen In-Process-Adapter. Um genau die UI aus der MCP-Demo auszuführen, starten Sie stattdessen den gesperrten Container; Compose aktiviert den persistenten stdio-Server standardmäßig:
docker compose up --buildAlle vier Portfolio-Nachweisbilder aus der aktuellen Bewertungsübersicht und einem tatsächlichen ausführlichen Testlauf neu generieren:
make proofEs ist kein API-Schlüssel erforderlich. Alle Namen, E-Mail-Adressen, Konten, Rechnungen, Dienste
und Vorfälle sind erfunden; E-Mails verwenden die reservierte example.test-Domäne.
CLI-Demo
Ein beantwortbares Fixture ausführen:
uv run ticket-triage triage --case billing_duplicate_chargeEinen Fehlerfall ausführen und die menschliche Übergabe prüfen:
uv run ticket-triage triage --case failure_unreadable_attachmentEine echte PDF ausführen:
uv run ticket-triage triage \
--text "I was charged twice; details are attached." \
--pdf data/sample_attachments/duplicate-charge.pdfDie tatsächliche stdio-MCP-Grenze testen:
uv run ticket-triage triage \
--case billing_duplicate_charge \
--transport stdioBewertungsübersicht reproduzieren
uv run ticket-triage-eval \
--output artifacts/scorecard.json \
--markdown-output artifacts/scorecard.md \
--fail-on-runtime-error \
--enforce-portfolio-targetsDer Evaluator bewertet jede Stufe unabhängig: exakte Kategorieübereinstimmung, Mikro-F1 auf Feldebene, deklarative Entwurfsprüfungen, semantische Fundierung des Übergabegrunds, Eskalationspräzision/-Recall, Fehleskalationen, Laufzeitfehler und p50/p95/max-Latenz. Siehe Bewertungsmethodik.
Den MCP-Server unabhängig verwenden
Den gebündelten offiziellen SDK-Server über stdio starten:
uv run ticket-triage-mcpBeispielkonfiguration für einen lokalen stdio-MCP-Host:
{
"mcpServers": {
"ticket-triage-tools": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/ai-ticket-triage",
"run",
"ticket-triage-mcp"
]
}
}
}Dies ist eine transportneutrale Tool-Grenze: Ein anderer kompatibler Agent oder Desktop-Host kann dieselben beiden Verträge verwenden, ohne die LangGraph-Anwendung zu importieren. Für entfernte Hosts platzieren Sie den Server hinter einer authentifizierten Streamable-HTTP-Bereitstellung; die Portfolio-Demo setzt absichtlich nur lokale stdio- und In-Process-Transporte ein.
Technische Entscheidungen
Belang | Implementierung |
Orchestrierung | Kompilierter |
Sicherheit | Zwei Policy-Gates; niedrige Konfidenz, Konflikte, fehlende Belege, unlesbare Dateien, Tool-Fehler und Fehltreffer eskalieren |
Dokumente |
|
Tool-Grenze | Offizielles MCP-Python-SDK, genau zwei schreibgeschützte Tools, normalisierte Fehlerhüllen, Timeouts |
Verträge | Pydantic-Modelle mit verbotenen Zusatzfeldern und JSON-sicheren öffentlichen Ergebnissen |
Bewertung | 20 versionierte JSON-Labels, Metriken pro Stufe, Falldiagnosen, Laufzeitfehler-Erfassung |
API | FastAPI, generierte OpenAPI-Dokumentation, Upload-Grenzen, Anforderungs-IDs, sichere Fehlerantworten, Sicherheitsheader |
Betrieb | Gesperrte Abhängigkeiten, Docker-Healthcheck, strukturierte Logs, CI-Lint-/Typ-/Test-/Coverage-Gates |
Datenschutz | Nur synthetische Fixtures; rohe PDF-Bytes sind von der Modellserialisierung ausgeschlossen |
Deterministisch by design
Der Standard-Klassifikator, -Extraktor und -Entwurfskomponist sind deterministisch. Das macht Sicherheitsregressionen reproduzierbar, hält die öffentliche Demo ohne Anmeldedaten und trennt Workflow-Qualität von Modellvarianz. Ein gehostetes Modell kann diese Knoten hinter denselben typisierten Verträgen ersetzen; in einem echten Rollout sollten seine Kandidatenausgaben weiterhin dieselben Beleg- und Tool-Gates durchlaufen. Dieses Repository behauptet nicht, dass ein synthetischer 20-Fälle-Benchmark die Qualität mit echten Daten vorhersagt.
Repository-Übersicht
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 copyQualitätsbefehle
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 --buildDokumentation
Bekannte Grenzen
Nur textbasierte PDFs; gescannte Dokumente benötigen OCR und eine Malware-Scan-Pipeline.
Synthetische Exaktabgleich-Internalsysteme, kein echtes CRM oder Abrechnungssystem.
Englische Fixtures und eine Taxonomie mit vier Klassen.
Keine dauerhafte Warteschlange, Authentifizierung, Ratenbegrenzung oder verteilte Ablaufverfolgung in dieser lokalen Demo.
Deterministische Sprachlogik ist eine Zuverlässigkeitsbasis, kein Ersatz für die Bewertung an einem repräsentativen, datenschutzgeprüften Produktionsdatensatz.
Diese Auslassungen sind bewusste Wochenendprojekt-Grenzen. Die Schnittstellen isolieren jedes fehlende Produktionsanliegen, sodass es ohne Umschreiben des Graphen hinzugefügt werden kann.
Lizenz
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