NodeBook
Enables to interact with a issue-native wiki workspace, providing scoped tools to manage issues, search, plan tasks, handle reminders, and attach files, all through the MCP server on /mcp.
README
NodeBook
Issue-native wiki, planning, reminders, attachments, and MCP workspace — built natively on Cloudflare Workers.
Canonical PRD: https://github.com/and1truong/wiki/issues/229
What it is
NodeBook is a single-owner workspace where every issue is a first-class node in a wiki graph:
- Issues — all PRD types (
task,bug,epic,story,decision,finding,incident,learning,wiki,note) with open/closed state, labels, priorities, Markdown bodies, and durable audit history. - Graph — parent/child hierarchy, typed relationships (
related,depends_on,blocks,supersedes,duplicates), and#123references that resolve even when the target is created later. - Wiki — hierarchy tree navigation, breadcrumbs, backlinks, and related-content panels.
- Search — FTS5 full-text search over titles, bodies, comments, labels, and attachment metadata, with type/state/label filters and PRD
search_knowledgesemantics. - Planning — Inbox / Today / Upcoming / Overdue views in the owner's timezone; recurring tasks (RFC 5545 rules) record occurrences and advance planning dates instead of closing.
- Reminders & notifications — absolute, before-due, and recurring reminders delivered to an in-app notification inbox by a one-minute Cron Trigger, with idempotent delivery and expiring claim locks.
- Attachments — private R2 blobs with checksum deduplication, inline previews or forced downloads, range support, soft deletion, and daily garbage collection.
- Theming — light, dark, and system themes (Tailwind CSS v4 + CSS-variable tokens on shadcn/ui components) with a topbar switcher, localStorage persistence, no flash-of-wrong-theme on load, and live following of the OS preference in system mode. The palette is derived from TabTerm's warm parchment/brown/gold theme (light
#f5f0e8/#fffcf6/#7a5c00, dark#1a1200/#251a00/#ffd000), with light-mode text tokens darkened to stay ≥ 4.5:1 (WCAG AA). - MCP — a Streamable HTTP MCP server on
/mcpexposing 18 scoped read/write tools that share the exact same services, validation, and audit trail as the web UI.
Architecture
Browser (React SPA) ── Cloudflare Access ──▶ Worker ──▶ D1 (domain data + FTS5)
│ ├── R2 (private blobs)
MCP clients ── PAT (nbk_…) ──▶ /mcp ──▶ Durable Object (session state)
│
Cron Triggers (1 min / daily) ───────────────▶ scheduled handlers
One TypeScript project, one deployable Worker. No Node.js runtime (nodejs_compat is not required). See docs/architecture.md, docs/deployment.md, and docs/mvp-scope.md.
Quick start
npm ci
cp .dev.vars.example .dev.vars # local identity (owner@nodebook.local)
# Terminal 1 — the Worker (API + MCP + UI on :8787)
npm run db:migrate:local
npm run dev:worker
# Terminal 2 — the Vite dev server with API proxy (optional, hot reload on :5173)
npm run dev:web
# Or run the built SPA directly through the Worker:
npm run build # then just use http://localhost:8787
Quality gates
npm run lint # ESLint (source + tests)
npm run typecheck # TypeScript strict across client, Worker, services, MCP
npm test # unit tests (recurrence, timezones, refs, auth, search utils)
npm run test:integration # integration tests under the Workers runtime (D1/R2/DO)
npm run test:e2e # Playwright acceptance flow against a local Worker
npm run build # production client bundle
npx wrangler d1 migrations apply nodebook --local # migrations prove clean
npx wrangler deploy --dry-run # packaging + bindings check
CI/CD
- CI:
.github/workflows/ci.ymlruns every gate above (plus e2e) on every pull request and every push tomain— one job onubuntu-latest, failing fast on any red step. A red check blocks merge. - CD: production deploys via Cloudflare's Git integration (Workers
Builds): a push to
mainmakes Cloudflare runnpm ci && npm run buildandnpx wrangler deployagainst this repo. CI never deploys. - Manual/staging:
npm run deployruns the same build + deploy from your machine and remains the staging path.
The one-time Cloudflare dashboard setup (connect the repo, D1 database_id,
secrets) is documented in docs/deployment.md §5.
MCP
Create a scoped token in Settings → MCP tokens, then point any MCP client at:
URL: https://<your-worker>/mcp
Auth: Authorization: Bearer nbk_…
Tokens are stored as SHA-256 hashes with display prefixes, support expiration, and revoke immediately. Every tool call is re-checked against the database on each request. get_today/get_upcoming accept an optional timezone argument (IANA).
Production notes
- The web/API hostname must be protected with Cloudflare Access (
ACCESS_TEAM+ACCESS_AUD); only/mcpbypasses Access, and it still rejects every request without a valid scoped token. - Disable
workers.devaccess or keepAUTH_DEV_EMAILunset in production. - Back up D1 before applying migrations (
wrangler d1 export), and deploy migrations to staging first. - See docs/deployment.md for the full runbook.
License
MIT — see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。