X to Notebook
Fetches X bookmarks organized by folder and auto-routes them to matching NotebookLM notebooks by name.
Prerequisites
- -
twikit installed: INLINECODE1 - X cookies exported from browser to
~/.openclaw/credentials/x-cookies.json (use Cookie-Editor extension on x.com) - INLINECODE3 installed: INLINECODE4
- Google Chrome installed (for persistent auth)
- NotebookLM authenticated: INLINECODE5
- INLINECODE6 MCP server registered in mcporter: INLINECODE7
Workflow
1. Fetch bookmark folders
CODEBLOCK0
Parse the JSON output. If exit code 1, report the error and stop.
2. Fetch bookmarks per folder
For each folder from step 1, plus unfiled bookmarks (no --folder-id):
CODEBLOCK1
For unfiled bookmarks (no folder):
CODEBLOCK2
Skip folders that return no new bookmarks.
3. List notebooks
CODEBLOCK3
If mcporter error → "NotebookLM MCP server not available. Register it with: mcporter config add notebooklm --command \"notebooklm-mcp\"" and stop.
If auth expired → "NotebookLM session expired. Run: nlm login" and stop.
4. Auto-match folders to notebooks
Match each folder name to a notebook title (case-insensitive, emojis and -notebook/-bookmarks suffix stripped). For example, folder "🦞 openclaw-notebook" matches notebook "OpenClaw". Display the matching plan:
CODEBLOCK4
5. Handle unmatched folders
For each folder (including "Unfiled") with no matching notebook, ask:
CODEBLOCK5
If user picks "create new", ask for a title:
CODEBLOCK6
If user picks "skip", skip those bookmarks entirely.
6. Push bookmarks
For each folder with a resolved notebook, push each bookmark as a text source (X URLs can't be scraped by NotebookLM):
CODEBLOCK7
Report progress per folder. If a push fails, report which tweet failed and continue.
7. Mark as pushed
After successful pushes, mark bookmark IDs:
CODEBLOCK8
Only mark IDs that were successfully pushed.
8. Confirm
Report per-folder summary:
CODEBLOCK9
9. Error handling
- -
fetch_bookmarks.py auth error → "X session expired. Re-export cookies from your browser to ~/.openclaw/credentials/x-cookies.json" - NotebookLM MCP not registered → "NotebookLM MCP server not available. Register it with:
mcporter config add notebooklm --command \"notebooklm-mcp\"" - NotebookLM auth expired → "NotebookLM session expired. Run
nlm login in your terminal" - INLINECODE17 fails → report the URL and error, continue with remaining bookmarks
- No bookmarks in any folder → "No new bookmarks to push."
Examples
| User says | Expected behavior |
|---|
| "push my bookmarks" | Fetch folders + bookmarks, auto-match to notebooks, ask for unmatched, push |
| "send my X bookmarks to NotebookLM" |
Same flow |
| "sync bookmarks to notebook" | Same flow |
X 到笔记本
按文件夹获取X书签,并根据名称自动路由到匹配的NotebookLM笔记本。
前置条件
- - 安装twikit:cd ~/.openclaw && uv add twikit
- 从浏览器导出X cookies到~/.openclaw/credentials/x-cookies.json(在x.com上使用Cookie-Editor扩展)
- 安装notebooklm-mcp-cli:uv tool install notebooklm-mcp-cli
- 安装Google Chrome(用于持久认证)
- NotebookLM已认证:nlm login
- 在mcporter中注册notebooklm MCP服务器:mcporter config add notebooklm --command notebooklm-mcp
工作流程
1. 获取书签文件夹
json
{
tool: exec,
command: uv run --project ~/.openclaw {baseDir}/scripts/list_folders.py
}
解析JSON输出。如果退出码为1,报告错误并停止。
2. 按文件夹获取书签
对于步骤1中的每个文件夹,以及未归档的书签(不使用--folder-id):
json
{
tool: exec,
command: uv run --project ~/.openclaw {baseDir}/scripts/fetchbookmarks.py --folder-id id>
}
对于未归档的书签(无文件夹):
json
{
tool: exec,
command: uv run --project ~/.openclaw {baseDir}/scripts/fetch_bookmarks.py
}
跳过没有返回新书签的文件夹。
3. 列出笔记本
json
{
tool: exec,
command: mcporter call notebooklm.notebook_list
}
如果mcporter报错 → NotebookLM MCP服务器不可用。请使用以下命令注册:mcporter config add notebooklm --command \notebooklm-mcp\ 并停止。
如果认证过期 → NotebookLM会话已过期。请运行:nlm login 并停止。
4. 自动匹配文件夹到笔记本
将每个文件夹名称匹配到笔记本标题(不区分大小写,去除表情符号和-notebook/-bookmarks后缀)。例如,文件夹🦞 openclaw-notebook匹配笔记本OpenClaw。显示匹配计划:
文件夹路由:
- - AI研究 → 笔记本 AI研究(3个新书签)
- Claude代码 → 笔记本 claude code(2个新书签)
- 随机 → 无匹配笔记本
- 未归档 → 无匹配笔记本
5. 处理未匹配的文件夹
对于每个没有匹配笔记本的文件夹(包括未归档),询问:
没有笔记本匹配文件夹随机(4个书签)。请选择:
- 1. 笔记本标题A
- 笔记本标题B
+ 创建新笔记本
s. 跳过此文件夹
如果用户选择创建新,询问标题:
json
{
tool: exec,
command: mcporter call notebooklm.notebook_create title=\<标题>\
}
如果用户选择跳过,完全跳过这些书签。
6. 推送书签
对于每个已解析笔记本的文件夹,将每个书签作为文本源推送(NotebookLM无法抓取X URL):
json
{
tool: exec,
command: mcporter call notebooklm.sourceadd notebookid=\<笔记本ID>\ source_type=text text=\@作者: 推文内容\n\n来源: https://x.com/作者/status/ID\
}
按文件夹报告进度。如果推送失败,报告失败的推文并继续。
7. 标记为已推送
成功推送后,标记书签ID:
json
{
tool: exec,
command: uv run --project ~/.openclaw {baseDir}/scripts/mark_pushed.py ...
}
仅标记成功推送的ID。
8. 确认
按文件夹报告摘要:
书签同步完成:
- - AI研究 — 已推送3个
- Claude代码 — 已推送2个
已跳过:随机(用户跳过)
9. 错误处理
- - fetchbookmarks.py认证错误 → X会话已过期。请从浏览器重新导出cookies到~/.openclaw/credentials/x-cookies.json
- NotebookLM MCP未注册 → NotebookLM MCP服务器不可用。请使用以下命令注册:mcporter config add notebooklm --command \notebooklm-mcp\
- NotebookLM认证过期 → NotebookLM会话已过期。请在终端中运行nlm login
- sourceadd失败 → 报告URL和错误,继续处理剩余书签
- 所有文件夹均无书签 → 没有新的书签需要推送。
示例
| 用户说 | 预期行为 |
|---|
| 推送我的书签 | 获取文件夹+书签,自动匹配到笔记本,询问未匹配的,推送 |
| 把我的X书签发送到NotebookLM |
相同流程 |
| 同步书签到笔记本 | 相同流程 |