Skip to main content
Glama
shogo-hs

guidepost-mcp

by shogo-hs

guidepost-mcp

안내 트리 다이어그램을 MCP 경유로 탐색시키는 서버. 에이전트가 응답의 라벨을 던지면, 다음에 무엇을 확인·안내해야 하는지가 규칙 기반으로 돌아온다. 끝까지 탐색하면 안내 완료.

자기 루프형 에이전트는 유연한 대신, 같은 문의라도 매번 다른 경로를 밟는다. 환불·본인 확인처럼 놓칠 수 없는 대응에서는 이것이 감사에도 에스컬레이션 판단에도 견디지 못한다. 판단이 필요한 곳을 트리 다이어그램으로 외부에 고정하고, 말로 만드는 곳만 에이전트에게 맡긴다.

CS 전용이 아니다. 트리 다이어그램의 어휘를 도메인에 의존시키지 않았으므로, 절차를 순서대로 진행하는 업무 일반에 쓸 수 있다.

  顧客の発話                      guidepost-mcp (MCP · 8127)
      │                    ┌──────────────────────────┐
  ┌───▼────────┐  values   │ flows/*.yaml ← 起動時に   │
  │  エージェント  ├──────────▶│   メモリ常駐(読むだけ)  │
  │             │◀──────────┤ engine = 純関数で遷移     │
  └────────────┘  next     │ SQLite = runs / steps    │
      │  発話をラベルに        └──────────┬───────────────┘
      │  落とすのはこちら側                │ 読み取り専用
      ▼                              ┌───▼──────────┐
   顧客へ返す                          │ Web UI (SSR)  │ いま樹形図のどこにいるか
                                     └───────────────┘

자연문 → 라벨 해석은 에이전트 쪽이 지고 있다. 서버는 받은 라벨을 보고 전이할 뿐이라 LLM 호출이 늘어나지 않는다. 실측(Raspberry Pi 5)은 전이 계산이 p95 0.006ms, SQLite 포함 p95 0.76ms, HTTP MCP를 통한 엔드투엔드로 p95 9.1ms. 음성 응대 1턴의 합계는 약 2.5초므로, HTTP를 포함해도 0.4%에 해당한다. 내역과 그 예산을 어떻게 잡았는지는 docs/research/voice-agent-latency-budget.md.

트리 다이어그램 작성법

flows/<flow_id>.yaml이 하나의 트리 다이어그램. 노드는 4종류뿐.

kind

역할

분기

ask

확인 항목 1개 묻고, 응답 라벨로 분기한다

한다

tell

안내 1개를 전한다

안 함

collect

독립된 여러 항목을 순서 없이 모은다

안 함

end

끝. outcome을 가진다

안 함

id: payment_failed
title: 支払いが失敗した
entry: n_error_code
max_unmatched: 3          # 聞き直しの上限
max_branch_fanout: 3      # これより枝が多いと畳まない
branch_depth: 2           # 枝を辿って結末を探す深さ
on_unknown: broaden       # 分からないと言われたとき。broaden / escalate
on_stuck: 原因が絞れないため、決済窓口の担当者に引き継ぐ

nodes:
  - id: n_error_code
    kind: ask
    say: 決済画面に出ているエラーコードを確認する     # 逐語原稿ではなく「何を伝えるか」
    accepts:                                      # ラベル → そのラベルに落とす条件
      E01: カードが拒否された
      E02: 残高不足・限度額超過
    next:
      E01: n_card_age
      E02: n_balance
      __other__: n_symptom        # 想定外のラベルの逃がし先(任意)
      __unknown__: n_generic      # 分からないときの逃がし先(任意)

  - id: n_identity
    kind: collect
    say: 本人確認に必要な情報を集める
    on_unknown: escalate          # 重要な手続きなので畳ませない
    slots:
      order_id:
        ask: 注文番号を聞く
        required: true            # 埋まらないと進めない
      phone: 登録の電話番号を聞く   # 短い書き方(任意扱い)
    next: n_verify

  - id: n_resolved
    kind: end
    outcome: resolved
    say: 解消したことを確認し、対応を締める

say는 구두 원고가 아니라「무엇을 전달해야 하는가」의 소재. 말투는 에이전트가 상황에 맞춘다. 1노드 = 확인 항목 1개 또는 안내 1개로 유지한다.

글이면 검증한다. 도달 불능 노드나 행선지가 없는 라벨은 쓴 시점에는 동작하므로 실행 시까지 알아차릴 수 없다.

uv run guidepost-mcp lint flows/          # CI でも回している
uv run guidepost-mcp show payment_failed --flows flows   # 樹形図を木で表示

MCP 도구

도구

역할

guide_flows()

사용 가능한 플로우 목록

guide_start(flow_id, subject, agent)

run을 시작한다. run_id + 첫 번째 노드 + 색인

guide_answer(run_id, choice, values, utterance)

응답을 던진다. 아래 5 상태 중 하나가 돌아온다

guide_state(run_id)

현재 위치·경로·수집된 값. 복구와 인계용

guide_revise(run_id, to_node, clear)

돌아간다. 수정된 값을 떨어뜨린다

guide_close(run_id, outcome, reason)

끝까지 가지 않고 정리된다

응답은 쌓이고 채워진 만큼 자동으로 전진한다

고객이 "E01이 나와 있고, 카드는 3년 전 것이다"라고 한 번에 말하는 등 답을 가진 채 한 개씩 다시 묻는 것은 피하고 싶다. values에 아는 값을 전부 넘겨 진행하고, 채워지지 않은 첫 번째 노드에서 멈춘다.

  収集済み: {n_error_code: E01, n_card_age: over_1y}

  n_error_code ──E01──▶ n_card_age ──over_1y──▶ n_expiry_check ──?──▶ …
   ✓ 聞かずに通過        ✓ 聞かずに通過           ▲ ここで止まる

건너뜬 노드는 skipped로 돌아온다. 이후 노드의 id를 에이전트도 알 수 있도록, guide_start색인(각 노드/슬롯이 무엇을 묻는 것인지의 1줄)을 1번만 전달한다.

collect의 순서 없음도 같은 구조다. 어떤 순서로 채워도 모두 모인 시점에 통과한다.

"모르겠다"고 멈추지 않는다

문의해 온 사람이 답을 갖고 있지 않는 경우는 흔하다. 끈질기게 되묻는다 해도 나오지 않는다.

   guide_answer
        ├─ ラベルが accepts にある ──────────▶ advanced / completed
        ├─ accepts に無い ──────────────────▶ unmatched(聞き直す)
        │                                       │ max_unmatched 回で下へ
        └─ choice="__unknown__" ──────────┐   │
                                          ▼   ▼
                               next.__unknown__ があるか
                                  ├─ ある ─▶ advanced(逃がし先へ)
                                  └─ 無い ─▶ on_unknown は
                                              ├─ escalate ─▶ stalled(有人へ)
                                              └─ broaden ──▶ 枝を畳めるか
                                                   ├─ できる ─▶ branched
                                                   └─ 無理 ───▶ stalled

branched가지를 확정하지 않고 각 가지의 결과를 늘 그리고 안내하는 상태다. "E01이라면 카드사로, E02라면 잔액을 확인해 주십시오" 같은 문장을 만들 재료가 돌아온다. 모든 가지가 합류하는 노드라면 common에 들어가 있으므로 "어느 경우든 마지막에 ○○"라고 묶을 수 있다.

환불·본인 확인처럼 애매한 채로 안내하면 해가 되는 절차는 on_unknown: escalate를 써서 접히지 않게 한다. 접히지 않는 노드에 대해서는 lint가 명시한다. 그러면 그곳만 대처하면 된다.

시작

uv sync
uv run uvicorn guidepost_mcp.web:app --host 127.0.0.1 --port 8127
uv run python scripts/mcp_smoke.py            # 実プロトコルで 1 周辿る
uv run python scripts/mcp_smoke.py --parallel # 2 本の run を交互に進める

Web UI는 http://127.0.0.1:8127/. 진행 중인 run은 목록으로 표시되고, /r/<run_id>에서 트리 다이어그램 위에 현재 위치·지나온 경로·선행 skip한 노드·가지enty 접이 접힌 노드를 색칠할 수 있다.

에이전트 측에서는 HTTP의 MCP로 연결한다.

버전

from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient(
    {
        "guidepost-mcp": {"url": "http://127.0.0.1:8127/mcp/", "transport": "streamable_http"},
    }
)
tools = await client.get_tools()

버전의 본성이 되는 것은 pyproject.tomlversion 하나이고, SemVer를 따른다(0.x 이후에는 minor에서 파괴적 변경이 들어올 수 있다). 변경 이력은 CHANGELOG.md.

무엇을 바꾸면 파괴적 변경인지는 docs/adr/0009-versioning.md에서 정의했다. 요점은 트리 다이어그램의 YAML 스키마와 MCP 도구의 계약(도구명·인수· 반환값의 키·status의 5상태)이지, next의 안내 문장은 포함하지 않는다.

flows/*.yamlversion응대 절차의 버전이며 이 라이브러리의 버전과는 무관하다.

설계 배경

왜 라벨 해석을 에이전트 쪽에 두는지, 왜 "모르겠다"가 가지를 접히는지, 왜 Web UI를 읽기 전용으로 꾸몄는지는 docs/adr/에 이유와 함께 기록했다 (목록은 docs/adr/README.md). 판단 재료가 된 조사 자료는 docs/research/에 있다.

-
license - not tested
Not graded
quality - not tested
B
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

  • Deterministic reasoning stack for AI agents: simulate, decide & compute, plus cross-domain tools.

  • Human-in-the-loop for AI agents. Submit choices, get a human decision.

  • Deterministic compliance and vertical knowledge bases for autonomous agents. Free 24hr trial.

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/shogo-hs/guidepost-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server