Joplin MCP
Provides tools for interacting with a Joplin instance, enabling semantic search, note and notebook management (create, read, update, delete), and listing notebooks and notes.
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., "@Joplin MCPsearch my notes for 'cloudflare workers deployment'"
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.
Joplin MCP
An MCP server that exposes a Joplin note collection as a tool set, running as a stateful agent on Cloudflare Workers. Point an MCP client (Claude, etc.) at the deployed endpoint and it can browse notebooks and notes, and create/update/delete notes and notebooks directly against your own Joplin instance.
How it works
Every tool call goes straight to the Joplin Data API on your live instance — there's no index or cache in between. The Joplin Data API itself is never exposed to the public internet: the Worker reaches it privately through a Workers VPC Service binding over a Cloudflare Tunnel.
MCP client ──HTTP/SSE──► Worker (/mcp) ──► JoplinMCP (Durable Object)
│
JoplinClient ──► JOPLIN_VPC (Workers VPC Service)
│
Cloudflare Tunnel ──► Joplin Data API (LAN-only)JoplinMCP is a McpAgent hosted on a Durable Object.
Related MCP server: Capacities MCP Worker
Tools
Every tool that takes a note or notebook accepts a name as readily as a 32-hex ID, so a calling agent doesn't have to spend a round trip looking an ID up. Names are fuzzy-matched (case, accents, punctuation and word order are all forgiven); when a name is genuinely ambiguous the tool returns the candidates with their IDs instead of guessing.
Tool | Description |
| Read a note by title (fuzzy) or ID |
| Full-text search across all notes, with snippets |
| Most recently updated notes across every notebook |
| List notebooks as full paths with IDs |
| List notes in a notebook — the default notebook if none is named |
| Create a note, in the default notebook unless told otherwise |
| Replace the body, or |
| Move a note to trash ( |
| Create a notebook, optionally nested |
| Rename or move a notebook |
| Move a notebook (and its notes) to trash |
Trashed notes and notebooks are excluded from every result — listings, search, and direct reads alike.
Fewer round trips
The tool surface is shaped so an agent can reach the note it wants in as few calls as possible. Reading a note by name is one call instead of three:
list_notebooks → list_notes → get_note ⟶ get_note { note: "grocery list" }and adding a line to it is one call instead of two, because append does the
read-modify-write server-side:
get_note → update_note { body: <whole note> } ⟶ update_note { note: "grocery list", append: "- milk" }Name resolution goes through Joplin's own search index, so it normally costs a single API call; a local title index is built only when search comes up empty (typos, or titles the full-text index tokenises oddly). The notebook list is cached in the Durable Object, so resolving a notebook name is usually free.
Setup
npm installBefore deploying, your Joplin Data API needs to be reachable from a Cloudflare Tunnel, registered as a Workers VPC Service:
npx wrangler vpc service create joplin-data-api \
--type http \
--tunnel-id <YOUR_TUNNEL_ID> \
--hostname <JOPLIN_HOST_ON_YOUR_LAN> \
--http-port <JOPLIN_PORT>Then bind the resulting service ID in wrangler.jsonc:
"vpc_services": [
{ "binding": "JOPLIN_VPC", "service_id": "<service-id-from-above>", "remote": true }
]JOPLIN_API_TOKEN (a Joplin Data API token) is read from Cloudflare's
Secrets Store, not a plain Wrangler secret.
Create it once per account and it's reusable across Workers:
wrangler secrets-store secret create <store-id> \
--name joplin-token --scopes workers --remotewrangler.jsonc then binds it via secrets_store_secrets:
"secrets_store_secrets": [
{ "binding": "JOPLIN_API_TOKEN", "store_id": "<store-id>", "secret_name": "joplin-token" }
]For local dev, create a local-only secret with the same name (omit --remote) so wrangler dev
has something to read.
Default notebook
Tools that take a notebook fall back to the one named by the JOPLIN_DEFAULT_NOTEBOOK var in
wrangler.jsonc ("Default" out of the box). Point it at whichever notebook new notes should
land in; if no notebook by that name exists, the tools say so rather than picking one.
See CLAUDE.md for the full architecture and binding reference.
Development
npm run dev # wrangler dev — local development with hot reload
npm run test # vitest run
npm run typecheck # tsc --noEmitDeploy
npm run deployOr connect this repository to a Cloudflare Worker for git-based deploys. Either way, the
joplin-token secret must exist in the account's Secrets Store — it is never stored in the repo.
Stack
Cloudflare Workers + Durable Objects (SQLite-backed)
Cloudflare Agents SDK (
agents/mcp)
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceSelf-hosted semantic memory layer for Claude and MCP-compatible AI clients. Store notes, search by meaning not keywords, and recall relevant context automatically across sessions. Runs free on Cloudflare Workers, D1, Vectorize, and Workers AI2738MIT
- AlicenseNot gradedqualityDmaintenanceA Cloudflare Worker that wraps the Capacities API as a remote MCP server, enabling Claude on any device to interact with your Capacities knowledge base.MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with Joplin notes, notebooks, and tags through a standardized MCP interface, supporting CRUD operations, search, and organization.19165MIT
- AlicenseNot gradedqualityCmaintenanceUnofficial MCP server that enables interaction with NotebookLM through a Cloudflare Worker, supporting tools for notebooks, sources, chat, notes, and more. It uses OAuth authentication and stateless encrypted credential envelopes.1MIT
Related MCP Connectors
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Read and write your Fresh Jots notes from Claude, Cursor, and any MCP client.
Hosted remote MCP server for YNAB on Cloudflare Workers with OAuth
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/crunchypancake1/joplin-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server