Skip to main content
Glama
Mohemed-Amine-Chalhy

ticket-triage-mcp

AI Ticket Triage Agent — LangGraph + MCP

CI

一个生产形态的支持工作流,用于对杂乱请求进行分类、从 PDF 附件中提取证据、通过 MCP 调用两个内部系统、起草有依据的回复,并将不确定的案例路由给人工处理,而不是猜测。

评估记分卡

阶段

结果

分类准确率

100% (20/20)

字段提取 F1

100%

草稿策略检查

100%

故意无法回答的案例升级

100% (5/5)

案例特定的升级原因

100% (5/5)

误升级率

0% (0/15)

运行时错误率

0%

离线延迟

4.6 ms p50 / 6.7 ms p95

这些是来自已提交的合成语料库的可复现结果,在本地 Windows 开发机上测量。延迟因硬件而异;评估器在 artifacts/scorecard.json 中报告每个案例的结果。五个困难案例涵盖缺失证据、标识符冲突、不可读附件、模糊请求以及内部系统中不存在的记录。该工件还记录了其生成时间、语料库哈希、Python 版本、提交标识符和工具传输方式,以便过时结果可见。

系统架构:电子邮件和 PDF 进入 LangGraph 工作流,两个 MCP 系统提供证据,置信度门控分支到草稿或人工队列。

为什么创建这个项目

大多数智能体演示只展示顺利路径。这个项目将弃权作为一项经过测试的行为。智能体可以返回两种有界结果之一:

  • drafted — 已提取所需标识符,两个只读 MCP 检查均已完成,并且所引用的参考已得到验证。

  • escalated — 置信度或证据未通过策略,因此智能体发出不承诺的暂缓响应、人工队列、缺失证据和可审计的原因。

该决策并非隐藏在提示中。它是 LangGraph 状态机中的显式条件边,也是 CI 中的一项指标。

它的功能

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

这两个 MCP 工具刻意保持狭窄且只读:

  1. lookup_customer_account 执行精确的账户/电子邮件匹配。

  2. lookup_billing_or_incident 检查计费、服务事件或有界的支持上下文。

该图始终使用一个传输中立的 MCP 工具契约。离线评估使用快速的进程内适配器;Docker Compose 针对持久的、真实的 JSON-RPC-over-stdio MCP 服务器运行组合 UI。两种传输方式都经过集成测试,因此编排从不依赖于部署选择。

在本地运行

先决条件:Python 3.11–3.13 和 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

打开 http://127.0.0.1:8000。Web UI 包含所有 20 个带标签的示例、PDF 上传器、图跟踪、提取的字段、MCP 调用证据、最终决策和记分卡。

上述命令使用快速的进程内适配器。要运行 MCP 演示中显示的精确 UI,请改为启动锁定的容器;Compose 默认启用持久的 stdio 服务器:

docker compose up --build

从当前记分卡和实际详细测试运行中重新生成所有四张组合证明图片:

make proof

无需 API 密钥。所有名称、电子邮件、账户、发票、服务和事件均为虚构;电子邮件使用保留的 example.test 域。

CLI 演示

运行一个可回答的夹具:

uv run ticket-triage triage --case billing_duplicate_charge

运行一个失败案例并检查人工交接:

uv run ticket-triage triage --case failure_unreadable_attachment

运行一个真实的 PDF:

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

练习实际的 stdio MCP 边界:

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

复现记分卡

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

评估器独立评分每个阶段:精确类别匹配、微字段级 F1、声明式草稿检查、语义交接原因接地、升级精确率/召回率、误升级、运行时失败以及 p50/p95/max 延迟。参见 评估方法论

独立使用 MCP 服务器

通过 stdio 启动捆绑的官方 SDK 服务器:

uv run ticket-triage-mcp

本地 stdio MCP 主机的示例配置:

{
  "mcpServers": {
    "ticket-triage-tools": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/ai-ticket-triage",
        "run",
        "ticket-triage-mcp"
      ]
    }
  }
}

这是一个传输中立的工具边界:另一个兼容的智能体或桌面主机可以使用相同的两个契约,而无需导入 LangGraph 应用程序。对于远程主机,将服务器放在经过身份验证的 Streamable HTTP 部署后面;组合演示有意只暴露本地 stdio 和进程内传输。

工程选择

关注点

实现

编排

编译的 StateGraph,带有类型化状态和显式条件边

安全

两个策略门;低置信度、冲突、缺失证据、不可读文件、工具失败和未命中均升级

文档

pypdf 提取、严格的 PDF 上传验证、大小限制和提取警告

工具边界

官方 MCP Python SDK,恰好两个只读工具,规范化错误信封,超时

契约

Pydantic 模型,禁止额外字段和 JSON 安全的公共结果

评估

20 个版本化 JSON 标签、每阶段指标、案例诊断、运行时错误捕获

API

FastAPI、生成的 OpenAPI 文档、上传限制、请求 ID、安全错误响应、安全头

运维

锁定依赖、Docker 健康检查、结构化日志、CI 代码检查/类型/测试/覆盖率门

隐私

仅合成夹具;原始 PDF 字节从模型序列化中排除

确定性设计

默认的分类器、提取器和草稿组合器是确定性的。这使得安全回归可复现,保持公共演示无需凭据,并将工作流质量与模型方差分离。托管模型可以在相同的类型化契约后面替换这些节点;在实际部署中,其候选输出仍应通过相同的证据和工具门。本仓库声称 20 个案例的合成基准能预测实时数据质量。

仓库地图

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

质量命令

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

文档

已知限制

  • 仅支持基于文本的 PDF;扫描文档需要 OCR 和恶意软件扫描管道。

  • 合成精确匹配的内部系统,而非实时 CRM 或计费平台。

  • 英文夹具和四类分类法。

  • 此本地演示中没有持久队列、身份验证、速率限制或分布式跟踪。

  • 确定性语言逻辑是可靠性基线,不能替代在具有代表性、经过隐私审查的生产数据集上的评估。

这些遗漏是有意的周末项目边界。接口隔离了每个缺失的生产关注点,以便无需重写图即可添加。

许可证

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