Planora MCP Server
Click on "Deploy 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., "@Planora MCP Servercreate a note called Grocery List with milk, eggs, and bread"
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.
planora-mcp
The official Model Context Protocol (MCP) server for Planora — connect your AI assistant (Claude Desktop, Cursor, Windsurf, etc.) directly to your notes and files.
Once installed, your AI can read, create, edit, delete, and export your Planora files without you leaving the conversation.
Table of Contents
Related MCP server: Reflect MCP Connector
Requirements
Node.js 18 or higher
A Planora account with Google Authenticator (2FA) enabled
2FA can be enabled in Planora → Settings → Security → Two-Factor Authentication
An MCP-compatible AI client (Claude Desktop, Cursor, Windsurf, etc.)
Installation
Install the package globally so the CLI commands are available system-wide:
# macOS / Linux (may require sudo)
sudo npm install -g planora-mcp
# Windows (run as Administrator)
npm install -g planora-mcpVerify the installation:
planora --helpUpdating
To update to the latest version:
sudo npm uninstall -g planora-mcp
sudo npm install -g planora-mcp@latestUninstalling
sudo npm uninstall -g planora-mcpThis removes the CLI commands. Your local session file at ~/.planora/mcp.env is not deleted — remove it manually if needed:
rm ~/.planora/mcp.envAuthentication
The MCP server authenticates using your Google Authenticator TOTP code — no password required. This means you must have 2FA enabled on your Planora account before using the MCP server.
Your session token is stored locally at ~/.planora/mcp.env with 600 permissions (readable only by you).
Login
Run this once to connect a device to your Planora account:
planoraYou will be prompted for:
Connecting to Planora...
Email: you@example.com
Authenticator code (TOTP): 482910
Device name [MacBook-Pro.local]: MacBook WorkEmail — your Planora account email
Authenticator code — the 6-digit code from Google Authenticator (standard 30-second rotating code)
Device name — a human-readable label for this device (defaults to your machine's hostname). Used to identify sessions when managing devices. Duplicates are allowed.
On success:
Connected as you@example.com on "MacBook Work".
Token valid for 30 days. Run 'planora --refresh' before it expires.Your session token is saved to ~/.planora/mcp.env. The MCP server reads it automatically on every request.
Refresh Token
Sessions expire after 30 days. Refresh before expiry to avoid interruption:
planora --refreshThis rotates your token server-side (old token is immediately invalidated) and saves a new 30-day token. No TOTP code needed — your existing valid session authorizes the refresh.
Refreshing session token...
Session refreshed. New token valid for 30 days.Tip: The MCP server will warn you on your first tool call of the day if your token expires within 3 days, giving you time to refresh before it breaks.
Logout
To disconnect this device from your Planora account:
planora --logoutThis revokes your session on the server and deletes ~/.planora/mcp.env locally.
Logging out...
Logged out. Local session cleared.Connecting to an AI Client
After logging in, register the MCP server with your AI client. The server communicates over stdio (standard input/output) — it runs as a subprocess spawned by the client.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"planora": {
"command": "planora-mcp"
}
}
}If you used npx instead of a global install, use:
{
"mcpServers": {
"planora": {
"command": "npx",
"args": ["planora-mcp"]
}
}
}Restart Claude Desktop. A "planora" server entry will appear in the MCP tools panel.
Cursor
Open Cursor Settings → MCP → Add new server:
{
"planora": {
"command": "planora-mcp"
}
}Or via .cursor/mcp.json in your project root:
{
"mcpServers": {
"planora": {
"command": "planora-mcp"
}
}
}Windsurf
Edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"planora": {
"command": "planora-mcp"
}
}
}Available Tools
Once connected, the following tools are available to your AI assistant. You can ask the AI naturally — it will choose the right tool automatically.
list_files
Lists your files and folders. Without a filter, returns root-level items. Pass a folder ID to list its contents.
Input schema:
Field | Type | Required | Description |
| string | No | Folder UUID to list children of. Omit for root-level items. |
Example prompts:
"Show me all my files"
"List everything inside my Projects folder"
"What's in my root directory?"
Example response:
Found 4 items:
[folder] Projects — path: /Projects (id: 019...)
[folder] Journal — path: /Journal (id: 01a...)
[file] todo.md — path: /todo.md (id: 01b...)
[file] ideas.md — path: /ideas.md (id: 01c...)create_file
Creates a new markdown file or folder.
Input schema:
Field | Type | Required | Description |
|
| Yes | Whether to create a file or a folder |
| string | Yes | Name of the file (e.g. |
| string | No | Parent folder UUID. Defaults to root |
| string | No | Initial markdown content (only for files) |
Example prompts:
"Create a new file called roadmap.md in my Projects folder with a brief outline"
"Make a folder called Q4-Planning inside Projects"
"Create a daily journal entry for today with some template sections"
Example — creating a file with content:
The AI calls create_file with:
{
"type": "file",
"fileName": "roadmap.md",
"folderPath": "019abc...",
"content": "# Product Roadmap\n\n## Q1\n- Launch v2\n\n## Q2\n- Mobile app"
}Response:
Created file 'roadmap.md' at /Projects/roadmap.md (id: 019def...)read_file
Returns the full markdown content of a file. If the ID belongs to a folder, lists its contents instead.
Input schema:
Field | Type | Required | Description |
| string | Yes | The unique ID of the file or folder |
Example prompts:
"Read my roadmap file"
"Show me what's in my Projects folder"
"What does my meeting-notes.md say?"
Example — reading a file:
# Product Roadmap
## Q1
- Launch v2
## Q2
- Mobile appExample — reading a folder:
This is a folder: "Projects"
Path: /Projects
Contents (3 items):
- [folder] Archive (id: 019...)
- [file] roadmap.md (id: 01a...)
- [file] sprint-1.md (id: 01b...)edit_file
Updates a file's content. Supports two modes:
replace— overwrites the entire file with new contentpatch— finds a specific piece of text and replaces only that part
The AI will ask you whether you want to replace the whole file or patch specific changes before calling this tool.
Input schema:
Field | Type | Required | Description |
| string | Yes | The unique ID of the file |
|
| Yes | Edit strategy |
| string | If | Full new markdown content |
| string | If | Exact text to find in the file |
| string | If | Text to substitute in |
Example prompts:
"Add a Q3 section to my roadmap"
"Update the status of the 'Launch v2' item to done"
"Rewrite my todo.md completely with these new tasks"
Example — patch mode:
The AI calls edit_file with:
{
"fileId": "019def...",
"mode": "patch",
"searchContent": "- Launch v2",
"replaceContent": "- ~~Launch v2~~ (done)"
}Response:
File updated successfully.Example — replace mode:
{
"fileId": "019def...",
"mode": "replace",
"newContent": "# Product Roadmap\n\n## Q1\n- ~~Launch v2~~ (done)\n\n## Q2\n- Mobile app\n\n## Q3\n- Analytics dashboard"
}delete_file
Permanently deletes a file. This action is irreversible. The AI will confirm with you before calling this tool.
Input schema:
Field | Type | Required | Description |
| string | Yes | The unique ID of the file to delete |
Example prompts:
"Delete my old draft.md file"
"Remove the sprint-1.md file from Projects"
Example response:
File permanently deleted.generate_pdf_download_link
Exports a file as a PDF and returns a secure download link valid for 1 hour.
The PDF is rendered with proper formatting — headings, bullet points, checkboxes, code blocks, dividers, and quotes are all styled correctly.
Input schema:
Field | Type | Required | Description |
| string | Yes | The unique ID of the file to export |
Example prompts:
"Export my roadmap as a PDF"
"Give me a download link for the meeting notes as PDF"
"I want to share my project plan as a PDF"
Example response:
PDF ready. Download link (expires in 1 hour):
https://r2.planora.app/pdf-exports/019.../roadmap.pdf?X-Amz-Expires=3600&...get_active_sessions
Lists all active MCP sessions across your devices, including the device name, last used time, and expiry date. Useful for auditing which devices are connected.
Input schema: None
Example prompts:
"Show me all my connected devices"
"Which machines are logged into my Planora MCP?"
"List my active sessions"
Example response:
Active sessions (3):
- MacBook Work (id: 019aaa...)
Last used: 9/28/2026, 10:14 AM | Expires: 10/28/2026
- Home iMac (id: 019bbb...)
Last used: 9/25/2026, 8:02 PM | Expires: 10/22/2026
- Work Cursor (id: 019ccc...)
Last used: Never | Expires: 10/01/2026revoke_session
Revokes any MCP session by its ID, immediately logging out that device. You can revoke any session — including the current one.
Input schema:
Field | Type | Required | Description |
| string | Yes | Session ID from |
Example prompts:
"Log out my Home iMac session"
"Revoke the session that hasn't been used recently"
"Remove all sessions except this one" (call
get_active_sessionsfirst, then revoke each)
Example response:
Session 019bbb... revoked. That device has been logged out.Multi-Device Usage
You can log in from multiple devices simultaneously — each device gets its own independent 30-day session token.
Setup on a second device:
npm install -g planora-mcp
planoraEmail: you@example.com
Authenticator code (TOTP): 719284
Device name [office-macbook.local]: Work LaptopBoth devices share the same Planora data. Tokens are independent — refreshing or revoking one device does not affect others.
Recommended workflow for team machines or shared computers:
Log in with a descriptive device name (e.g.
"Office Desktop","Home MacBook")Periodically audit sessions via
get_active_sessionsRevoke sessions for devices you no longer use
Session Lifecycle
planora → 30-day token saved to ~/.planora/mcp.env
(mode 0600 — owner read/write only)
Day 27 → MCP server warns on first tool call:
"Your session expires in 3 days. Run planora --refresh"
planora --refresh → Old token invalidated, new 30-day token saved
(no TOTP code needed)
Day 30 (expired) → All tool calls return:
"Your session token has expired. Run 'planora --refresh'"
planora --logout → Session revoked server-side, ~/.planora/mcp.env deletedSecurity Model
Concern | How it's handled |
Token storage |
|
Token in transit | HTTPS only — token sent as |
Token in database | Only the SHA-256 hash is stored — the raw token is never persisted server-side |
Authentication | TOTP-only (Google Authenticator) — requires 2FA to be enabled on your account |
Session scope | Every API request is scoped strictly to your user ID — no access to other users' data |
Token expiry | 30-day TTL enforced server-side — expired tokens are rejected at the DB query level |
Token rotation |
|
Remote revocation | Any session can be revoked from any other authenticated device via |
Troubleshooting
Error: No session found. Run 'planora' to authenticate.
You haven't logged in yet, or ~/.planora/mcp.env was deleted. Run:
planoraYour session token has expired. Run 'planora --refresh' to renew.
Your 30-day token has expired. Run:
planora --refreshIf this also fails with a 401, the session was revoked remotely. Run a full login instead:
planoraTwo-factor authentication is not enabled on this account.
The MCP server requires Google Authenticator 2FA to be active. Enable it in Planora: Settings → Security → Two-Factor Authentication → Enable
Invalid TOTP code
Make sure your device clock is accurate (TOTP codes are time-sensitive)
The code changes every 30 seconds — try again with the freshly generated code
Ensure you're using the correct Planora entry in Google Authenticator
The MCP server doesn't appear in Claude Desktop / Cursor
Confirm
planora-mcpis in your PATH:which planora-mcpIf installed globally via npm, check:
npm list -g planora-mcpRestart your AI client after editing the config file
Check the client's MCP logs for startup errors
planora-mcp: command not found
The global npm bin directory may not be in your PATH. Find it with:
npm config get prefixAdd <prefix>/bin to your PATH in ~/.zshrc or ~/.bashrc:
export PATH="$(npm config get prefix)/bin:$PATH"Tool calls succeed but show stale data
The MCP server reads live from the Planora API on every call — there is no local cache. If data appears stale, it reflects what's currently in your Planora account. Check the app directly to confirm.
This server cannot be deployed
Related MCP Connectors
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Notes, files, GitHub, and Drive through one MCP connection.
Notes, files, GitHub, and Drive through one MCP connection.
Notes, files, GitHub, and Drive through one MCP connection.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Claude Code and Claude Desktop to interact with Obsidian vaults through MCP protocol. Supports file operations, workspace context access, and dual transport (WebSocket and HTTP/SSE) for AI-powered assistance with your notes.356BSD Zero Clause
- AlicenseNot gradedqualityNot gradedmaintenanceEnables users to connect their Reflect account to MCP-compatible clients to manage notes, graphs, and links. It provides tools for creating or appending to daily notes, listing books, and managing content via the Reflect API.-
- AlicenseNot gradedqualityCmaintenanceMCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.3 npm2MIT
- AlicenseAqualityAmaintenanceMCP server that gives Claude Code and other MCP clients persistent memory using plain Markdown notes stored on your disk and optionally synced to cloud storage (iCloud, OneDrive, Google Drive, Dropbox).361MIT