Skip to main content
Glama
shogo-hs

guidepost-mcp

by shogo-hs

guidepost-mcp

通过 MCP 沿引导树形图行进的服务器。智能体抛出回答的标签后,会基于规则返回下一步应该确认、引导什么。一路走到末端,引导就算完成。

自循环型智能体虽然灵活,但代价是同一咨询每次都会走出不同的路径。对于退款、本人确认这样不能出错的应对,这样的做法既经不起审计,也无法支撑是否升级(escalation)的判断。把需要判断的地方外部化为树形图,只把“如何措辞”的部分交给智能体

并非 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 行)。

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> 中,当前位置、经过的路径、预读跳过的节点、以及折叠了分支的节点,都会在树形图上用颜色标出。

智能体侧可从 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.toml 中的 version 一处,遵循 SemVer(在 0.x 阶段,minor 可能会引入破坏性变更)。变更记录见 CHANGELOG.md

什么样的变英雄算破坏性变更,在 docs/adr/0009-versioning.md 中定义。重点是树形图的 YAML schema 与 MCP 工具契约(工具名、参数、返回值的键、status 的 5 个状态),不包含 next 指令的措辞。

flows/*.yaml 中的 version应对流程的版本,与这一库的版本无关。

设计背景

为什么把标签解读放在智能体侧、为什么“听不懂”时要把顶部的“为什么 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