Skip to main content
Glama
Mohemed-Amine-Chalhy

ticket-triage-mcp

AI 티켓 트라이지 에이전트 — 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 시스템이 증거를 제공하며, 신뢰도 게이트가 초안 또는 인간 큐로 분기합니다.

이 프로젝트가 존재하는 이유

대부분의 에이전트 데모는 해피 패스만 보여줍니다. 이 프로젝트는 기권(abstention)을 테스트된 동작으로 만듭니다. 에이전트는 두 가지 경계가 있는 결과 중 하나를 반환할 수 있습니다:

  • 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을 엽니다. 웹 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 서버를 독립적으로 사용하기

공식 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 애플리케이션을 가져오지 않고도 동일한 두 계약을 사용할 수 있습니다. 원격 호스트의 경우 서버를 인증된 Streamable HTTP 배포 뒤에 두세요. 포트폴리오 데모는 의도적으로 로컬 stdio 및 인프로세스 전송만 노출합니다.

엔지니어링 선택

관심사

구현

오케스트레이션

타입이 지정된 상태와 명시적 조건부 엣지를 갖춘 컴파일된 StateGraph

안전성

두 정책 게이트; 낮은 신뢰도, 충돌, 증거 누락, 읽을 수 없는 파일, 도구 실패, 미스는 모두 에스컬레이션

문서

pypdf 추출, 엄격한 PDF 업로드 검증, 크기 제한, 추출 경고

도구 경계

공식 MCP Python SDK, 정확히 두 개의 읽기 전용 도구, 정규화된 오류 봉투, 타임아웃

계약

금지된 추가 필드와 JSON 안전 공개 결과를 갖춘 Pydantic 모델

평가

20개의 버전이 지정된 JSON 레이블, 단계별 메트릭, 사례 진단, 런타임 오류 캡처

API

FastAPI, 생성된 OpenAPI 문서, 업로드 제한, 요청 ID, 안전한 오류 응답, 보안 헤더

운영

잠긴 의존성, Docker 헬스 체크, 구조화된 로그, CI 린트/타입/테스트/커버리지 게이트

프라이버시

합성 픽스처만 사용; 원시 PDF 바이트는 모델 직렬화에서 제외

설계상 결정적(Deterministic)

기본 분류기, 추출기, 초안 작성기는 결정적입니다. 이는 안전성 회귀를 재현 가능하게 만들고, 공개 데모를 자격 증명 없이 유지하며, 워크플로 품질을 모델 변동성과 분리합니다. 호스팅 모델은 동일한 타입 계약 뒤에서 해당 노드를 대체할 수 있습니다. 실제 배포에서는 후보 출력이 여전히 동일한 증거 및 도구 게이트를 통과해야 합니다. 이 저장소는 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