NodeBook
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@NodeBookCreate an epic for the new onboarding flow"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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, durable audit history, and a paginated list with selectable 20/50/100-row pages (ISSUES_DEFAULT_LIMIT, default 20).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 / Calendar / Overdue views in the owner's timezone; recurring tasks (RFC 5545 rules) record occurrences and advance planning dates instead of closing. The Calendar workspace (
/calendar, day/week/month views) opens in a deployment-configurable default view (CALENDAR_DEFAULT_VIEW, default week) and shows due dates and scheduled instants in the viewer's timezone via a bounded range API; entries are created from a date/time popup by clicking month/week dates or day timeline slots, rescheduled by dragging between dates, and the day timeline sets scheduled times in 15-minute increments (with Move date… shortcuts for Today, Tomorrow, Next week, and Next month plus a custom picker as a fallback). The week start is deployment-configurable too (WEEK_START_DAY, default sunday): it rotates Calendar views, the date pickers, the inbox Plan shortcuts, and the day-view Move date… shortcuts — Next week schedules for the first day of the following week and Next month for the first day of the following month./upcomingredirects to/calendarfor compatibility.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 19 scoped read/write tools that share the exact same services, validation, and audit trail as the web UI.
Related MCP server: mcp-jira
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 handlersOne 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 + a fresh UI build on :8787)
npm run db:migrate:local
npm run dev:worker
# Terminal 2 — the Vite dev server with API proxy (recommended for client
# development and hot reload; open http://localhost:5173)
npm run dev:webQuality 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 checkCI/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
NodeBook speaks Streamable HTTP MCP at /mcp with two credential types:
OAuth 2.1 (recommended for ChatGPT and other OAuth-capable clients). NodeBook is its own authorization server — no tunnel or third-party identity provider needed:
URL: https://<your-worker>/mcp
Auth: OAuth (authorization-code flow with PKCE) — select OAuth in the clientClients discover the authorization server from the WWW-Authenticate: Bearer resource_metadata=… challenge (or /.well-known/oauth-authorization-server), register dynamically, and redirect you to the Cloudflare Access login + NodeBook consent page. Access tokens are short-lived (10 min); refresh tokens rotate on every use; scopes never expand beyond what you approved. Manage connections under Settings → MCP tokens → OAuth connections.
Personal access tokens (any MCP client). Create a scoped token in Settings → MCP tokens, then point the 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); get_upcoming is retained unchanged for compatibility with the retired Upcoming browser page.
Issue edits use optimistic locking across the browser and MCP. Read the current issue first, then pass its version as expected_version to update_issue. A -32009 conflict means another editor changed the issue; refetch and deliberately reapply the intended changes rather than retrying the stale payload.
API/MCP migration notes
Optimistic locking is a breaking contract change:
PATCH /api/issues/:refand MCPupdate_issuerequireexpected_versionand at least one field to change. Existing MCP clients must reconnect or refresh their cached tool schema, then read an issue before updating it. Missing arguments fail with HTTP400or MCP-32602; stale versions fail with HTTP409or MCP-32009.GET /api/issuespreserves its historical default limit of 100 for compatibility. The web UI sends its deployment-configuredISSUES_DEFAULT_LIMITexplicitly; API consumers can paginate withlimit,offset, and the response'stotal.
Production notes
The web/API hostname must be protected with Cloudflare Access (
ACCESS_TEAM+ACCESS_AUD);/mcp, the OAuth discovery/registration/token endpoints bypass Access, and/oauth/authorize(the consent page) stays behind it. Every request without valid credentials is still rejected.Set
OAUTH_ISSUERto the stable custom domain (e.g.https://nodebook.example.com) — neverworkers.dev.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 and ChatGPT setup.
License
MIT — see LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
BridgeApp workspace over MCP: tasks, chats, threads, pages, and projects.
Read and write Mission Control state via MCP — projects, tasks, subtasks, templates, status updates.
Shared project wiki for AI agents: read and write pages, next actions, and activity logs over MCP.
Read and write your team's shared, AI-readable wiki from any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceProvides MCP tools for interacting with Redmine, including issues, projects, wiki pages, time entries, and more.241MIT
- AlicenseNot gradedqualityCmaintenanceProvides JIRA issue search, retrieval, and update functionalities via MCP.92MIT
- FlicenseAqualityDmaintenanceEnables to interact with Redmine issues through the MCP protocol, allowing operations like get, list, create, and update tickets.419
- FlicenseNot gradedqualityBmaintenanceEnables to interact with JIRA issues and sprints through MCP tools, including fetching tickets, adding comments, linking issues, and more.3471
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/and1truong/nodebook'
If you have feedback or need assistance with the MCP directory API, please join our Discord server