Skip to main content
Glama
Mohemed-Amine-Chalhy

ticket-triage-mcp

AIチケットトリアージエージェント — LangGraph + MCP

CI

本番向けのサポートワークフローで、乱雑なリクエストを分類し、PDF添付ファイルから証拠を抽出し、MCPを通じて2つの内部システムを呼び出し、根拠のある返信を下書きし、不確実なケースは推測せずに人間にルーティングします。

評価スコアカード

ステージ

結果

分類精度

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に報告します。5つの難しいケースには、証拠の欠落、識別子の競合、読み取れない添付ファイル、曖昧なリクエスト、内部システムに存在しないレコードが含まれます。アーティファクトには、生成時刻、コーパスハッシュ、Pythonバージョン、コミット識別子、ツールトランスポートも記録されるため、古い結果がわかります。

システムアーキテクチャ:メールとPDFがLangGraphワークフローに入り、2つのMCPシステムが証拠を提供し、信頼度ゲートがドラフトまたは人間のキューに分岐します。

このプロジェクトが存在する理由

ほとんどのエージェントデモはハッピーパスのみを示します。これは、棄権をテストされた動作にしています。エージェントは2つの限定された結果のいずれかを返すことができます:

  • 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

2つの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

現在のスコアカードと実際の詳細なテスト実行から、4つのポートフォリオ証明画像すべてを再生成します:

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サーバーを単独で使用する

バンドルされた公式SDKサーバーをstdioで起動します:

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アプリケーションをインポートせずに同じ2つの契約を使用できます。リモートホストの場合は、認証されたStreamable HTTPデプロイメントの背後にサーバーを配置します。ポートフォリオデモは意図的にローカルstdioとインプロセストランスポートのみを公開します。

エンジニアリングの選択

関心事

実装

オーケストレーション

型付き状態と明示的な条件付きエッジを持つコンパイル済みStateGraph

安全性

2つのポリシーゲート。低信頼度、競合、証拠の欠落、読み取れないファイル、ツール障害、ミスはすべてエスカレーションされます

ドキュメント

pypdf抽出、厳格なPDFアップロード検証、サイズ制限、抽出警告

ツール境界

公式MCP Python SDK、正確に2つの読み取り専用ツール、正規化されたエラーエンベロープ、タイムアウト

契約

余分なフィールドを禁止する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や請求プラットフォームではありません。

  • 英語のフィクスチャと4クラスの分類法。

  • このローカルデモには、永続キュー、認証、レート制限、分散トレーシングはありません。

  • 決定論的な言語ロジックは信頼性のベースラインであり、代表的なプライバシー審査済みの本番データセットでの評価の代わりにはなりません。

これらの省略は意図的な週末プロジェクトの境界です。インターフェースは、欠落している各本番関心事を分離しているため、グラフを書き直さずに追加できます。

ライセンス

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