漫游研究MCP+CLI
](https://badge.fury.io/js/roam-research-mcp)   ](https://github.com/2b3pro/roam-research-mcp/blob/main/LICENSE)
介绍
我创建这个项目是为了解决一个个人问题:我想直接从以下位置管理我的漫游研究图 克劳德代码 (及其他法学硕士)。当我建造 模型上下文协议(MCP) 服务器允许AI代理访问我的笔记,我意识到底层工具足够强大,可以独立运行。
最初作为人工智能代理的后端发展成为功能齐全的 独立CLI现在,您可以直接从终端将内容放入Roam、搜索图形和管理任务中使用同样强大的API功能,而不需要LLM。
无论你是想让Claude在你的知识库上拥有超能力,还是只是想为你自己的脚本提供一个强大的CLI,这个项目都能满足你的需求。
独立CLI: roam
这 roam CLI允许您直接从终端与图形交互。支持 标准输入(stdin)管道 适用于所有内容创建和检索命令,使其非常适合自动化工作流程。
快速示例
# Save a quick thought to your daily page
roam save "Idea: A CLI for Roam would be cool"
# Pipe content from a file to a new page
cat meeting_notes.md | roam save --title "Meeting: Project Alpha"
# Create a TODO item on today's daily page
echo "Buy milk" | roam save --todo
# Prepend to top of page (newest-first ordering)
roam save -p "Changelog" --order first "v2.18.0 release"
# Search your graph and pipe results to another tool
roam search "important" --json | jq .
# Search for pages by namespace prefix
roam search --namespace "Convention" # Finds all Convention/* pages
# Fetch a page by title
roam get "Roam Research"
# Fetch daily pages using any date format (auto-normalized)
roam get today # Today's daily page
roam get 2026-03-21 # ISO date → "March 21st, 2026"
roam get "03/21/2026" # US date → "March 21st, 2026"
roam get "March 21" # Named (assumes current year)
# Fetch a block with ancestors (parent chain to page root)
roam get abc123def -a # Block + children + ancestors
roam get abc123def -a -d 0 # Ancestors only, no children
# Fetch page by UID or Roam URL
roam get page abc123def
roam get page "https://roamresearch.com/#/app/my-graph/page/abc123def"
# Sort and group results
roam get --tag Project --sort created --group-by tag
# Find references (backlinks) to a page
roam refs "Project Alpha"
# Update a block (e.g., toggle TODO status)
roam update ((block-uid)) --todo
# Multi-graph: read from a specific graph
roam get "Page Title" -g work
# Multi-graph: write to a protected graph
roam save "Note" -g work --write-key "$ROAM_SYSTEM_WRITE_KEY"可用命令: get, search, save, refs, update, batch, rename, status. 跑 roam --help 有关任何命令的详细信息。
安装
npm install -g roam-research-mcp
# The 'roam' command is now available globally______________________________________________________________________
MCP服务器工具
MCP服务器将这些工具暴露给AI助手(如Claude),使他们能够智能地读取、写入和组织您的漫游图。
多图支持: 所有工具均接受可选graph和write_key参数。使用graph从您的ROAM_GRAPHS配置,以及write_key用于在受保护的图上进行写操作。
| 工具名称 | 描述 |
|---|---|
roam_fetch_page_by_title | 按标题获取页面内容。 |
roam_fetch_page_full_view | 获取页面内容以及所有带有面包屑上下文和子项的链接引用。 |
roam_fetch_block | 通过UID获取具有可选子级(深度)和/或祖先(最多到页面根)的块。 |
roam_create_page | 创建新页面,可选择混合文本和表格内容。 |
roam_update_page_markdown | 使用智能diff更新页面(保留块UID)。 |
roam_get_subpages | 使用可选标记过滤器在命名空间前缀(例如“Project/”)下列出子页面。 |
roam_search_by_text | 在图表或特定页面内进行全文搜索。支持页面标题的命名空间前缀搜索。 |
roam_search_block_refs | 查找引用页面、标记或块UID的块。 |
roam_search_by_status | 查找待办事项或已完成事项。 |
roam_search_for_tag | 查找包含特定标记的块(支持排除)。 |
roam_search_by_date | 按创建或修改日期查找块/页。 |
roam_find_pages_modified_today | 自午夜以来修改的列表页面。 |
roam_add_todo | 将TODO项目添加到今天的每日页面。 |
roam_create_table | 创建格式正确的漫游表。 |
roam_create_outline | 创建分层轮廓。 |
roam_process_batch_actions | 一次性执行多个低级操作(创建、移动、更新、删除)。 |
roam_move_block | 将块移动到新的父级或位置。 |
roam_remember / roam_recall | Roam中用于AI内存管理的专用工具。 |
roam_datomic_query | 执行原始数据日志查询以进行高级筛选 |
roam_markdown_cheatsheet | 检索Roam风味的降价参考。 |
______________________________________________________________________
配置
环境变量
单图模式
对于单个漫游图,请在您的环境或 .env 文件:
ROAM_API_TOKEN=your-api-token
ROAM_GRAPH_NAME=your-graph-name多图模式(v2.0+)
从单个服务器实例连接到多个漫游图:
ROAM_GRAPHS='{
"personal": {"token": "token-1", "graph": "personal-db", "memoriesTag": "#[[Personal Memories]]"},
"work": {"token": "token-2", "graph": "work-db", "protected": true, "memoriesTag": "#[[Work Memories]]"},
"research": {"token": "token-3", "graph": "research-db"}
}'
ROAM_DEFAULT_GRAPH=personal
ROAM_SYSTEM_WRITE_KEY=your-secret-key图形配置选项:
| 属性 | 必填 | 描述 |
|---|---|---|
token | 是 | 此图形的Roam API令牌 |
graph | 是 | 图形名称/数据库标识符 |
protected | 否 | 如果 true,写要求 ROAM_SYSTEM_WRITE_KEY 确认书 |
memoriesTag | 否 | 标签 roam_remember/roam_recall (覆盖全局默认值) |
写保护: 受保护的图形需要 write_key 参数匹配 ROAM_SYSTEM_WRITE_KEY 对于任何写入操作。这可以防止意外写入敏感图形。
*可选:*
ROAM_MEMORIES_TAG:默认标记roam_remember/roam_recall(根据图表回退memoriesTag未设置)。HTTP_STREAM_PORT:启用HTTP流(默认为8088)。
运行服务器
1.标准模式(默认) 最适合本地集成(例如,Claude Desktop、IDE扩展)。
npx roam-research-mcp注意:Stdio模式不使用任何网络端口。
2.HTTP流模式 最适合远程访问或web客户端。
HTTP_STREAM_PORT=8088 npx roam-research-mcp3.Docker
docker run -p 8088:8088 --env-file .env roam-research-mcp在LLM中配置
克劳德桌面/克莱恩:
添加到您的MCP设置文件(例如。, ~/Library/Application Support/Claude/claude_desktop_config.json):
*单幅图:*
{
"mcpServers": {
"roam-research": {
"command": "npx",
"args": ["-y", "roam-research-mcp"],
"env": {
"ROAM_API_TOKEN": "your-token",
"ROAM_GRAPH_NAME": "your-graph"
}
}
}
}*多图:*
{
"mcpServers": {
"roam-research": {
"command": "npx",
"args": ["-y", "roam-research-mcp"],
"env": {
"ROAM_GRAPHS": "{\"personal\":{\"token\":\"token-1\",\"graph\":\"personal-db\",\"memoriesTag\":\"#[[Memories]]\"},\"work\":{\"token\":\"token-2\",\"graph\":\"work-db\",\"protected\":true}}",
"ROAM_DEFAULT_GRAPH": "personal",
"ROAM_SYSTEM_WRITE_KEY": "your-secret-key"
}
}
}
}查询块解析器(v2.11.0+)
一个用于以编程方式解析和执行Roam查询块的实用程序。转换 {{[[query]]: ...}} 将语法转换为数据日志查询。
支持的条款
| 条款 | 语法 | 描述 |
|---|---|---|
| 页面参考 | [[page]] | 引用页面的块 |
| 块参考 | ((uid)) | 参照块的块 |
and | {and: [[a]] [[b]]} | 所有条件必须匹配 |
or | {or: [[a]] [[b]]} | 任何条件都匹配 |
not | {not: [[tag]]} | 排除匹配项 |
between | {between: [[date1]] [[date2]]} | 日期范围筛选器 |
search | {search: text} | 全文搜索 |
daily notes | {daily notes: } | 仅限每日笔记页面 |
by | {by: [[User]]} | 由用户创建或编辑 |
created by | {created by: [[User]]} | 由用户创建 |
edited by | {edited by: User} | 由用户编辑 |
相对日期
这 between 子句支持相对日期: today, yesterday, last week, last month, this year, 7 days ago, 2 months ago等等。
用法
import { QueryExecutor } from 'roam-research-mcp/query';
const executor = new QueryExecutor(graph);
// Execute a query
const results = await executor.execute(
'{{[[query]]: "My Query" {and: [[Project]] {between: [[last month]] [[today]]}}}}'
);
// Parse without executing (for debugging)
const { name, query } = QueryParser.parseWithName(queryBlock);工具函数
import { isQueryBlock, extractQueryBlocks } from 'roam-research-mcp/query';
// Detect if text is a query block
isQueryBlock('{{[[query]]: [[tag]]}}'); // true
// Extract all query blocks from a string
extractQueryBlocks(pageContent); // ['{{[[query]]: ...}}', ...]______________________________________________________________________
支持
如果这个项目能帮助你管理你的知识库或建立很酷的代理,考虑给我买杯咖啡!它有助于保持更新。
______________________________________________________________________
许可证
MIT许可证-创建者 沈.
