⚠️ 概念验证 -这是一个原型实现,用于探索如何通过模型上下文协议(MCP)将话语图与人工智能助手集成。它仅用于原型制作和实验目的。
话语图MCP服务器
通往漫游研究图的人工智能桥梁。通过与Claude的自然对话,询问有关话语图的问题,探索研究节点之间的关系,分析试点用户反馈,读/写页面和块,包括用于漫游侧目标可见性的缓冲附加建议。
我该怎么办?
- “给我看看支持这一说法的所有证据”
- “这个星期球队做了什么?”
- “搜索与CRISPR相关的任何内容”
- “哪些飞行员提到了Canvas?”(实时搜索,立即生效)
- “根据我们的飞行员,我们接下来应该建造什么?”(需要 知识索引 先建)
- 对漫游页面和块的完全读/写访问权限
- 具有Roam本地批准的多批写入提案——虚拟块在目标父级内联呈现(
propose_write/propose_write_batch) - 原始数据日志查询、类型化话语关系、查询构建器执行、K-hop图遍历
无需代码。你和克劳德谈谈;克劳德对着你的图表说话。
______________________________________________________________________
设置
先决条件
- 漫游桌面 在启用本地API的情况下运行
- Node.js 18+
1.连接到您的漫游图(一次性)
npx @roam-research/roam-mcp connect按照提示进行身份验证。您的令牌已保存到 ~/.roam-tools.json.
2.克隆并安装
git clone
cd discourse-graph-mcp
npm install3.添加MCP服务器
克劳德代码:
claude mcp add -s user discourse-graph -- /path/to/discourse-graph-mcp/node_modules/.bin/tsx /path/to/discourse-graph-mcp/src/index.ts为什么是绝对路径? 使用npx tsx对cwd敏感——当在没有cwd的项目中打开Claude Code时,它会失败tsx本地安装。
克劳德桌面版 --添加到您的MCP配置中:
Config file locations
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 窗户:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
Codex CLI:
使用内置版本进行最可靠的设置:
npm run build
codex mcp add discourse-graph -- node /path/to/discourse-graph-mcp/dist/index.js如果您正在积极开发服务器,也可以直接从源代码运行它:
codex mcp add discourse-graph -- /path/to/discourse-graph-mcp/node_modules/.bin/tsx /path/to/discourse-graph-mcp/src/index.ts更新现有安装
如果您已经从本地签出配置了MCP服务器:
git pull
npm install
npm run build然后重新启动使用 discourse-graph MCP服务器。如果 过时的MCP进程仍在占用漫游写可见性网桥端口,停止 MCP子进程,并让新的会话重新启动它:
ss -ltnp 'sport = :3597'
kill
当前网桥报告所有者/客户端诊断:
curl -s http://127.0.0.1:3597/write-visibility/health{
"ok": true,
"role": "owner",
"service": "dg-team-mcp-write-visibility",
"pid": 12345,
"cwd": "/path/to/project",
"pendingCount": 0,
"port": 3597
}验证是否已添加:
codex mcp list{
"mcpServers": {
"discourse-graph": {
"command": "npx",
"args": ["tsx", "/path/to/discourse-graph-mcp/src/index.ts"]
}
}
}4.设置权限(克劳德代码)
服务器在深度搜索和索引等操作期间进行许多API调用。为了避免逐一审批,请提前允许MCP工具。
在您的克劳德代码设置中(~/.claude/settings.json),添加:
{
"permissions": {
"allow": [
"mcp__discourse-graph__*"
]
}
}这允许所有话语图工具在没有每次调用批准的情况下运行。为了获得更多控制,只允许读取操作:
{
"permissions": {
"allow": [
"mcp__discourse-graph__search_*",
"mcp__discourse-graph__get_*",
"mcp__discourse-graph__query_*",
"mcp__discourse-graph__deep_*",
"mcp__discourse-graph__check_*",
"mcp__discourse-graph__index_*",
"mcp__discourse-graph__catch_*",
"mcp__discourse-graph__run_*",
"mcp__discourse-graph__save_*"
]
}
}这仍然会提示写入(create_*, update_*, delete_*).
5.验证其是否正常工作
打开一个新的Claude会话并尝试:
"What discourse node types are in my graph?"注: 此服务器包括所有标准的Roam MCP工具。你做 不 需要 @roam-research/roam-mcp 单独安装——如果有的话,请将其删除,以避免重复使用工具。______________________________________________________________________
工作流
理解你的图形
| 你说。.. | 发生了什么 |
|---|---|
| “我的图中有哪些类型的节点?” | 返回所有节点类型定义(声明、证据、问题等)以及它们之间的关系 |
| “查找本月创建的所有索赔” | 搜索按日期筛选的话语节点实例 |
| “搜索有关线粒体的任何内容” | 在所有节点标题中进行关键字搜索 |
| “显示节点abc123” | 特定节点的完整内容树、创建者和日期 |
探索联系
| 你说。.. | 发生了什么 |
|---|---|
| “有什么证据支持这一说法?” | 遵循类型化的话语关系(支持、反对、告知) |
| “此节点有哪些链接?” | 所有传出引用和传入反向链接 |
| “探索此节点的2个跳” | 图遍历——节点周围的邻域 |
| “在xyz789块上运行查询” | 执行某人在漫游中构建的查询生成器查询 |
研究活动
| 你说。.. | 发生了什么 |
|---|---|
| “\[用户名\]本周做了什么?” | 创建/编辑的节点、每日日志条目、触摸的页面 |
| “谁是最大的贡献者?” | 按节点数排名的作者 |
| “显示此索赔的摘要部分” | 一个没有整棵树的模板部分 |
阅读与写作
| 你说。.. | 发生了什么 |
|---|---|
| “阅读关于我们实验的页面” | 获取页面内容树 |
| “创建新声明:X导致Y” | 在图表中创建新页面 |
| “在此节点下添加块” | 创建子块 |
| “在此节点下提出这些块” | 通过缓存批处理 propose_write_batch虚拟块在目标父级的漫游中内联显示。您在漫游中批准或拒绝。 |
| “向三个不同的父级添加块” | 多个批次共存。每个渲染在漫游中的父级上都有自己的批准/拒绝按钮。 |
| “将此块移动到该父项下” | 重构内容 |
对于在创建任何内容之前希望在漫游中查看和批准目标的写入,请使用 propose_write_batch (或 propose_write 对于单个分支)。这 写可见性插件 使用批准/拒绝控件在每个父级渲染虚拟块。直接的 create_block 保持可用并立即执行。
试点用户——实时搜索
立即工作,无需设置。实时扫描试点页面。
| 你说。.. | 发生了什么 |
|---|---|
| “列出我们所有的试点用户” | 返回每个带有UID的试点页面 |
| “哪些飞行员提到Canvas?” | 实时分层搜索——维基链接、文本匹配、情感信号 |
试点用户——带知识指数
需要先构建索引(请参见 下一节).一旦建立,查询就是即时的。
| 你说。.. | 发生了什么 |
|---|---|
| “接下来我们应该建立什么?” | 跨试点汇总排名 |
| “\[飞行员姓名\]的痛点是什么?” | 单人飞行员的机密话题 |
| “所有飞行员的首要功能要求?” | 汇总排名 |
| “深入搜索左侧边栏反馈” | 在一次通话中搜索索引和实时数据 |
| “我的飞行员索引是最新的吗?” | 将索引时间戳与实时编辑时间进行比较 |
______________________________________________________________________
飞行员知识指数
知识索引是试点用户页面的结构化摘要,包括反馈、功能请求、痛点、工作流程等。一旦构建完成,对它的查询就是即时的。
它住在哪里
~/.discourse-graph-mcp/pilot-index.json --本地到您的机器。 从未承诺回购,从未分享。 它包含图形的数据。如果你失去了它,重建它。
运作原理
MCP服务器从导频页面中提取原始数据。Claude阅读内容,将其分类为主题,并保存结果。不需要单独的API密钥。
"Index all pilot pages"
|
index_pilot_pages --> extracts batch of 5 pilots
|
Claude reads and classifies into topics
|
save_pilot_index --> writes to disk
|
index_pilot_pages (next batch) --> repeats
|
... until all pilots are done ...
|
Claude generates cross-pilot rollups
|
save_pilot_index --> writes rollups
|
Done. Future queries are instant.构建指数
说:
“索引我的所有试点页面”
Claude处理其余部分——发现所有飞行员,分批处理,将每个飞行员的内容分类为特征请求、疼痛点、工作流程、反馈、挑战等主题。类别不是固定的——克劳德会根据发现的内容进行调整。
在处理完所有飞行员后,Claude会生成跨飞行员汇总:排名功能请求、常见痛点以及下一步要构建什么。
保持新鲜
“检查飞行员指数是否最新”
将索引与实时图表进行比较。如果飞行员自上次索引以来发生了变化:
“重新索引过时的飞行员”
只有更改的页面才会被重新处理。
______________________________________________________________________
写可见性插件
Roam扩展将建议的写入内联到您的图中,这样您就可以在不离开Roam的情况下批准或拒绝它们。
它做什么
当代理人来电时 propose_write_batch,插件会接受该提议,并在目标父级的位置呈现虚拟DOM块。每批显示:
- 带有绿色左边框的虚拟块,预览将要创建的内容
- 批准 和 拒绝 每批按钮
- 一个固定的任务栏(右下角),显示批次计数和总区块计数,批次之间有箭头导航,批量批准/拒绝所有操作
同时向不同父母提出多项建议。该插件会自动将新批次滚动到视图中,并在适当的位置展开折叠的祖先链(从不放大到单个块)。
安装
- 从repo根目录构建:
npx tsx apps/roam/scripts/build.ts- 在Roam中,打开 开发者工具 (Ctrl+Shift+I或Cmd+Opt+I)
- 负载
apps/roam/dist/extension.js作为自定义扩展
插件民意调查 http://127.0.0.1:3597/write-visibility/current 每1.2秒。如果MCP服务器正在运行,则不需要配置。
调试
window.dgMcpWriteLocator.getState() // current plugin state
window.dgMcpWriteLocator.refresh() // force an immediate poll______________________________________________________________________
工具参考
48个工具:23个漫游库+21个话语图+4个缓冲写入可见性。
Graph Management — connect and inspect your Roam graph
| 工具 | 说明 |
|---|---|
list_graphs | 列出所有连接的漫游图 |
setup_new_graph | 连接到新的漫游图 |
get_graph_guidelines | 获取图形的自定义准则/约定 |
Pages — create, read, update, and delete pages
| 工具 | 说明 |
|---|---|
create_page | 创建一个带有标题的新页面 |
get_page | 按标题或UID获取页面的内容树 |
update_page | 更新页面标题 |
delete_page | 删除页面 |
Blocks — create, read, update, delete, and move blocks
| 工具 | 说明 |
|---|---|
create_block | 在父级下创建新块 |
get_block | 获取块的内容和路径 |
update_block | 更新块的文本 |
delete_block | 删除块 |
move_block | 将块移动到新的父/位置 |
get_backlinks | 获取引用给定页面的所有页面/块 |
Search & Query — find content across the graph
| 工具 | 说明 |
|---|---|
search | 跨页面和块的全文搜索 |
search_templates | 搜索漫游模板 |
roam_query | 执行原始数据日志查询 |
Files — manage file attachments
| 工具 | 说明 |
|---|---|
file_get | 从图表中下载文件 |
file_upload | 将文件上传到图形 |
file_delete | 从图表中删除文件 |
UI Control — interact with the Roam Desktop window
| 工具 | 说明 |
|---|---|
get_open_windows | 在主窗口和侧边栏中列出打开的页面 |
get_selection | 获取当前选定的块 |
open_main_window | 在主窗口中打开一个页面 |
open_sidebar | 在右侧边栏中打开一个页面 |
Discourse Node Types — understand the graph's schema
| 工具 | 说明 |
|---|---|
get_discourse_node_types | 所有节点类型和关系定义 |
get_users | 列出所有图形贡献者 |
Discourse Node Discovery — find and inspect nodes
| 工具 | 说明 |
|---|---|
get_all_discourse_nodes | 查找节点类型的所有实例,可选择按日期筛选 |
search_nodes | 跨话语节点标题的关键字搜索 |
get_node | 完整节点详细信息:标题、内容树、创建者、日期 |
Discourse Graph Exploration — traverse relationships
| 工具 | 说明 |
|---|---|
get_linked_nodes | 传出引用+传入反向链接 |
get_relationships | 类型化话语关系(支持、反对、告知等) |
get_node_neighborhood | 节点周围的K-hop BFS遍历 |
get_node_images | 从节点内容中提取图像URL |
Discourse Content & Analysis — sections, contributions, activity
| 工具 | 说明 |
|---|---|
get_node_section | 提取特定模板部分(摘要、证据等) |
get_researcher_contributions | 按作者或贡献者统计的节点 |
catch_me_up | 用户最近的活动:节点、每日日志、触摸的页面 |
Discourse Query Builder — run structured queries
| 工具 | 说明 |
|---|---|
run_discourse_query | 按块UID执行查询生成器查询,具有可选输入和显式报告不支持的选择 |
Pilot Analysis — understand pilot user feedback
| 工具 | 说明 |
|---|---|
get_pilot_users | 列出所有带有姓名和UID的飞行员用户页面 |
search_pilots_live | 跨试点页面实时分层搜索功能 |
index_pilot_pages | 构建/更新知识索引(自动分页) |
query_pilot_insights | 按飞行员、主题或两者查询索引(即时) |
check_index_freshness | 将索引与实时数据进行比较,找出过时的飞行员 |
deep_pilot_search | 在一次通话中组合索引+实时搜索 |
Indexing Pipeline (internal) — used by Claude during indexing, not called directly
| 工具 | 说明 |
|---|---|
extract_pilot_data | 获取按部分分块的特定试点页面 |
save_pilot_index | 将分类数据和汇总写入索引文件 |
这些是索引工作流程的一部分。当你说“索引所有试点页面”时,克劳德会自动编排这些页面。你不需要直接给他们打电话。
Buffered Write Visibility — multi-batch Roam-native write approval
| 工具 | 说明 |
|---|---|
propose_write_batch | 缓冲同一父追加批。不同父母的多个批次共存。 |
propose_write | 便利包装器:建议将单个分支作为单分支批处理。 |
get_pending_write_batch | 按ID轮询批次。返回 pending 等待时,或 resolved 和 approved/rejected 在用户在漫游中操作之后。 |
clear_pending_write_batch | 手动清除批处理(Roam插件正常处理此操作)。 |
代理人应在投票表决决议之前提出所有书面建议。求婚后,致电 get_pending_write_batch(batchId) 检查结果。
______________________________________________________________________
建筑
Claude (any MCP client)
|
| stdio (JSON-RPC 2.0)
v
discourse-graph-mcp
|-- 23 Roam base tools (from @roam-research/roam-tools-core)
|-- 21 Discourse Graph tools
|-- 4 Buffered write-visibility tools
|-- Write-visibility bridge (127.0.0.1:3597)
|
| HTTP to localhost
v
Roam Desktop (Local API) Roam Plugin (apps/roam/)
v |
Your Roam Graph polls bridge, renders virtual blocks,
approve/reject per batch
Local data:
~/.discourse-graph-mcp/pilot-index.json (knowledge index, never shared)- 话语图工具是 只读写入操作使用Roam基础工具。
- Auth重用
~/.roam-tools.json从roam-mcp connect。无需单独设置。 - 知识索引是您机器的本地索引。这是一个缓存——随时重建。
- 写可见性桥和漫游插件允许对拟议的写进行图内批准。
______________________________________________________________________
已知限制
- 漫游桌面必须正在运行。 连接到本地主机上的本地API。
- 对于大页面,抓取树很慢。 每个块的每个树级别一个API调用。知识索引的存在是为了完成这项工作。当页面达到遍历上限时,基于树的工具现在会显示深度元数据。
- 某些数据日志功能无法通过本地API工作。
pull,:keys,和几个clojure.string功能不安全或无声地失败。服务器通过元组查询、基于正则表达式的匹配和JS侧过滤来解决这个问题。 - 查询生成器不是完全浏览器奇偶校验。 日期条件和上下文相关目标(
{current},{this page},{current user})仍然不受支持。 - 某些查询构建器的选择是故意不完整的。 不支持的选择会在工具输出中报告,而不是自动删除。
______________________________________________________________________
发展
npm install
# Type check
npx tsc --noEmit --skipLibCheck
# Verify tools register
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}\n{"jsonrpc":"2.0","method":"notifications/initialized"}\n{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}\n' | timeout 5 npx tsx src/index.ts 2>/dev/null许可证
麻省理工学院
