Theme / v0.9.56

Graphify

Codebase 知識圖譜

實戰範例

實戰範例 008:用 graphify diagnose multigraph 診斷 same-endpoint 風險

多個 graphify MCP server 或多份圖譜指向同一個 endpoint 時的偵錯:找出重複註冊、版本錯配、token 互踩的根因

背景

進階團隊把 graphify 用得很深之後,會出現「多圖譜共存」的場景:

  • 同一台機器跑了兩個 python -m graphify.serve(一個本地實驗、一個 team 共用)
  • 同一份 codebase 有多份 graph.json(main branch 的、feature branch 的、merge-graphs 合出來的)
  • Claude Code 跟 Cursor 同時裝了 graphify,MCP 設定各自指向不同圖譜

這時常見的詭異症狀:

  • 助理回答「我知道這個 function」但拿的是過時圖譜
  • 兩個助理對同一個問題給出不一致的答案
  • MCP server 莫名其妙 401 或 timeout
  • query 結果跟程式碼對不上,卻找不到原因

這些多半是「same-endpoint 衝突」:多個 graphify 實例搶同一個資源(同一個 port、同一個 graph.json、同一個 API key),互相踩腳。graphify diagnose multigraph 是專門抓這類問題的診斷指令。

⚠️ 注意:是 graphify diagnose multigraph,子指令不可省。graphify diagnose(沒接子指令)不會做事。


適用情境

  • 同機器跑多個 graphify MCP server(local + team 共用)
  • 多平台整合(Claude Code + Cursor + Codex CLI 都裝了 graphify)
  • 升級 graphify 版本後行為異常,懷疑舊實例殘留
  • 多人共用開發機,懷疑別人的 graphify 干擾自己
  • merge-graphs 後查詢結果異常(子圖譜與合併圖同時被助理存取)

完整流程

步驟 1:症狀確認

先確認問題真的是 multigraph 衝突,而不是其他原因。常見症狀:

  • graphify query 在 CLI 正確,但在助理內錯
  • 兩個助理(例如 Claude Code 跟 Cursor)對同一問題答案不一致
  • graphify hook status 顯示 hook 跑過,但圖譜還是過時
  • MCP server 連線間歇性失敗

如果只在一個地方出錯,先排除該處本身的問題(hook 沒裝、圖譜過時、API key 失效)。多處同時詭異、症狀跳來跳去,才比較可能是 multigraph 衝突。

步驟 2:跑 diagnose multigraph

確認懷疑之後,直接跑診斷:

cd ~/my-project

graphify diagnose multigraph

graphify 掃描系統現況,列出所有正在運行或已註冊的 graphify 實例:

Scanning for multigraph conflicts...

== Running MCP servers ==
[1] PID 4521  python -m graphify.serve
    graph: /home/alice/my-project/graphify-out/graph.json (modified 2h ago)
    transport: http://0.0.0.0:8080
    api-key: set (starts with "sk-team-...")

[2] PID 28432  python -m graphify.serve
    graph: /home/alice/my-project/graphify-out/merged.json (modified 5min ago)
    transport: http://0.0.0.0:8080
    api-key: set (starts with "sk-alice-personal-...")

⚠️  CONFLICT: Two servers binding same port 8080
    → Assistant may hit either server nondeterministically
    → Two different api-keys registered: queries from one client may 401 on the other

== Registered AI assistants ==
[1] Claude Code (.config/claude/mcp.json)
    graphify endpoint: http://localhost:8080/mcp
    → points to conflicting port

[2] Cursor (.cursor/mcp.json)
    graphify endpoint: http://localhost:8080/mcp
    → same endpoint as Claude Code, but different graph behind it

== On-disk graph files ==
[1] graphify-out/graph.json        (current branch: main)
[2] graphify-out/merged.json       (from merge-graphs)
[3] graphify-out/feature-x.json    (stale, 3 days old)

⚠️  STALE: graphify-out/feature-x.json last modified 3 days ago
    → Likely abandoned; consider removing to avoid confusion

這份報告就是你需要的根因地圖。

步驟 3:解讀報告,定位根因

報告分三區:

  • Running MCP servers:現在正在跑的 python -m graphify.serve 實例,含 PID、port、graph 路徑、API key
  • Registered AI assistants:各助理平台的 MCP 設定,看 endpoint 指到哪
  • On-disk graph files:硬碟上所有 graph.json 相關檔案,標出 stale(過時)的

重點看 ⚠️ 標記:

  • Port 衝突:兩個 server 搶同一個 port,助理隨機打到任一個
  • API key 不一致:不同 server 用不同 key,client 偶爾 401
  • Stale 檔案:廢棄的 graph.json 還躺在那、可能被誤用
  • Endpoint 指向不一致:兩個助理 endpoint 看似相同,背後其實是不同 graph

步驟 4:清理衝突

依報告動手清理。範例情境的修復:

# 1. 殺掉搶 port 的舊 server(PID 28432 是本地實驗殘留)
kill 28432

# 2. 移除 stale 的 feature-x.json
rm graphify-out/feature-x.json

# 3. 統一兩個助理的 endpoint 設定,指向 team 共用 server
# 確認 Claude Code 的 .config/claude/mcp.json 跟 Cursor 的 .cursor/mcp.json
# 都指向同一個 URL(http://localhost:8080/mcp)

# 4. 統一 API key
export TEAM_GRAPHIFY_KEY=sk-team-...
# 兩個助理的 headers 都用這個 key

清完再跑一次診斷確認:

graphify diagnose multigraph

這次應該乾淨:

Scanning for multigraph conflicts...

== Running MCP servers ==
[1] PID 4521  python -m graphify.serve
    graph: /home/alice/my-project/graphify-out/graph.json
    transport: http://0.0.0.0:8080
    api-key: set (starts with "sk-team-...")

== Registered AI assistants ==
[1] Claude Code → http://localhost:8080/mcp  ✓
[2] Cursor      → http://localhost:8080/mcp  ✓

== On-disk graph files ==
[1] graphify-out/graph.json        (current branch: main)
[2] graphify-out/merged.json       (from merge-graphs)

✓ No conflicts detected.

步驟 5:把診斷自動化進 CI / 開機腳本

多人共用開發機、或自己常開多個 server,把 diagnose 加進日常腳本:

# ~/.local/bin/graphify-health.sh
#!/usr/bin/env bash
set -e

echo "==> graphify multigraph health check"
graphify diagnose multigraph

echo "==> hook status"
graphify hook status

每天早上或開機跑一次,問題一出現就抓到,不會累積到「助理行為詭異」才回頭找。

步驟 6:升級前後的例行診斷

升級 graphify 版本(例如 v0.9.31 → v0.9.32)前後都跑一次 diagnose:

# 升級前:記錄現況
graphify diagnose multigraph > /tmp/before-upgrade.txt

uv tool install graphifyy --upgrade
graphify install

# 升級後:比對
graphify diagnose multigraph > /tmp/after-upgrade.txt
diff /tmp/before-upgrade.txt /tmp/after-upgrade.txt

升級偶爾會留下舊版的 server、hook、或 MCP 註冊,diagnose 抓得出來。


真實輸出範例

$ graphify diagnose multigraph
Scanning for multigraph conflicts...

== Running MCP servers ==
[1] PID 4521  python -m graphify.serve
    graph: /home/alice/my-project/graphify-out/graph.json (modified 2h ago)
    transport: http://0.0.0.0:8080
    api-key: set (starts with "sk-team-...")

[2] PID 28432  python -m graphify.serve
    graph: /home/alice/my-project/graphify-out/merged.json (modified 5min ago)
    transport: http://0.0.0.0:8080
    api-key: set (starts with "sk-alice-personal-...")

⚠️  CONFLICT: Two servers binding same port 8080
    → Assistant may hit either server nondeterministically

== Registered AI assistants ==
[1] Claude Code → http://localhost:8080/mcp
[2] Cursor      → http://localhost:8080/mcp
    (both point to the conflicting port)

== On-disk graph files ==
[1] graphify-out/graph.json        (current, main)
[2] graphify-out/merged.json       (from merge-graphs)
[3] graphify-out/feature-x.json    ⚠️ stale (3 days old)

== Summary ==
2 conflicts found. See steps above to resolve.

對比傳統排查

任務 傳統(手動檢查) graphify diagnose multigraph
找搶 port 的 server lsof -i :8080ps aux | grep serve 一行指令列出全部
找過時 graph.json 自己 findstat 報告直接標 stale
確認助理 endpoint 一致 各自打開 mcp.json 比對 集中列出所有註冊
API key 不一致 看 server log 抓 401 報告標出 key 前綴差異
升級後殘留 等出錯才發現 升級前後 diff 一眼看出

diagnose multigraph 的價值在「整合視角」:把 server、助理、檔案三個面向一次呈現,不用切換工具。


失敗處理

情境 排查
graphify diagnose 沒輸出 漏了子指令。正確形式是 graphify diagnose multigraph,子指令不可省
報告顯示 server 但 kill 後還在 PID 重生了。可能 server 被 systemd / launchd / supervisor 接管,從那層停
兩個助理 endpoint 看起來一樣、行為卻不同 endpoint 同 URL,背後 graph 路徑不同。看 server 區段的 graph: 行確認
diagnose 報「no MCP servers running」但助理明顯有圖譜 助理用的是 fork 模式(每次啟動新 process)、不是常駐 server。這種不是 multigraph 衝突,看 hook 跟 install 設定
API key 顯示「not set」但助理會用 key 在環境變數、不在 server 啟動參數。diagnose 看的是 server process 的環境
報告裡的 stale 檔案其實是故意保留的 .graphifyignore 或搬到非 graphify-out 目錄,避免被誤判

內部連結


下一步

  1. 合併多個子專案圖譜(合併圖譜是 multigraph 衝突的常見來源)
  2. PR 審查 + 團隊共享 graphify-out(共用 MCP server 的正確設定)

關鍵學習點

  • 指令是 graphify diagnose multigraph,子指令不可省。graphify diagnose 單獨跑不做事。
  • 同機器多個 graphify 實例的根因通常是:port 衝突、API key 不一致、stale 檔案、endpoint 指向不一致。diagnose 一份報告抓全部。
  • 症狀若是「多處同時詭異、症狀跳來跳去」,優先懷疑 multigraph 衝突,而不是單一環節壞掉。
  • 升級前後跑 diagnose 並 diff,是抓升級殘留(舊版 server / hook / 註冊)的最快方法。
  • 把 diagnose 加進開機腳本或日常 health check,問題一出現就抓到,不會累積到「助理行為詭異」才回頭找根因。