Joplin Server MCP
Allows interaction with Joplin Server, providing tools for managing notebooks, notes, tags, and attachments via the Joplin Server REST API.
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 Server MCPlist my notes in the 'Work' notebook"
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 Server MCP
Model Context Protocol server for Joplin Server. Gives LLMs full access to your notes, notebooks, tags, and attachments via the Joplin Server REST API.
What is Joplin Server?
Joplin is an open-source note-taking app with Markdown support, end-to-end encryption, and sync across devices. Joplin Server is the sync backend that stores and syncs your data. You can run it yourself using the official Docker image or use the managed Joplin Cloud service.
Note: This MCP server connects to Joplin Server REST API, not the Joplin Desktop Web Clipper.
Joplin Cloud: Use
JOPLIN_SERVER_URL=https://api.joplincloud.com.
Related MCP server: joplin-mcp
Tools
Tool | Description |
| Check server connectivity |
| List all notebooks |
| Get notebook details with notes and sub-notebooks |
| Create a new notebook |
| Resolve a |
| Rename or move a notebook (with circular reference check) |
| Delete a notebook (with optional force for non-empty) |
| List notes, optionally filtered by notebook, tag, and/or to-do state |
| Get all notes with pagination, sorting (incl. |
| Search notes (multi-term AND) with scope and notebook/tag filters |
| Get note text (resource references replaced with names, or |
| Read multiple notes at once (up to 50, parallel) |
| Get note with all resources embedded as base64 |
| Create a new note (optionally as a to-do with a due date) |
| Export note as markdown with resources as named base64 blocks |
| Update note title, body, or move to another notebook |
| Map a note's headings with line numbers and section sizes |
| Add text inside a note or section, or as a sibling before/after a section |
| Replace an exact string inside a note body |
| Replace everything under a heading |
| Set/clear a note's to-do state, completion, and due date |
| Delete a note |
| List all tags |
| Create a new tag |
| Delete a tag |
| List tags assigned to a note |
| Add a tag to a note |
| Remove a tag from a note |
| List resources attached to a note |
| Get resource metadata |
| Download a resource as base64 |
Partial edits
update_note takes the complete new body, which makes it a poor fit for large
notes: adding two lines to a 70 KB note means an LLM has to reproduce all 70 KB
verbatim. That is expensive, and a single silent typo corrupts the note.
append_to_note, replace_in_note and replace_section resolve the edit on
the server instead. The client sends only the fragment it wants added or
changed, so untouched text — including :/<resource-id> links, which the read
tools render as human-readable names — is preserved byte for byte.
append_to_note(note_id, "| docker-2 | .43 |", section="Hosts", separator="\n")
append_to_note(note_id, "## 2026-08-26\n\nDeployed.", section="## 2026-08-25", position="before")
replace_in_note(note_id, "status: draft", "status: final")
replace_section(note_id, "## Current state", "Rewritten from scratch.")Every write reports what it did — character and line deltas, heading count before and after, and the numbered lines around the change — so the result can be verified without re-reading the note:
Appended to: **01 · Work Log** (ID: `3e8ab15d2f8b40cd9c2e754a7b2db13f`)
Inserted 745 chars at the start of section '# 01 · Work Log' (line 1)
Chars 76141 -> 76887 (+746), lines 1858 -> 1885 (+27), headings 117 -> 118Guard rails:
Sections are addressed by heading, either bare (
"Hosts") or with its level ("## Hosts"), and a section ends at the next heading of the same or higher level. Headings inside fenced code blocks are ignored. An ambiguous or missing heading is refused, never guessed.get_note_outlinelists what is available without reading the body.positionpicks inside or beside."start"/"end"write inside the note or section, joining the existing content withseparator."before"/"after"place the text beside a named section instead — above its heading, or past its whole span with subsections included. Those two requiresection, ignoreseparator, and are strictly additive: no existing byte is rewritten and blank lines appear only where the join needs them. Reach for"before"to put a new entry at the top of a newest-first log whose first heading is preceded by a preamble —"start"would land above the preamble.replace_in_notedemands a unique match. A missing anchor or an unexpected second match is an error, with the mismatching lines reported. Useget_note(raw=True)to copy an anchor verbatim, orreplace_all=Truewhen you do mean every occurrence.dry_run=Truereports the change and its context without writing.if_absent="marker"skips the append when the marker is already in the note, which makes a re-run a no-op.
Setup
Prerequisites
A running Joplin Server instance or Joplin Cloud account
User credentials (email + password)
Environment variables
Variable | Required | Default | Description |
| Yes | — | Joplin Server URL |
| Yes | — | User email |
| Yes | — | User password |
| No |
| Transport: |
| No |
| SSE listen host |
| No |
| SSE listen port |
Run with Docker
docker run -d \
-e JOPLIN_SERVER_URL=https://your-joplin-server.example.com \
-e JOPLIN_EMAIL=your@email.com \
-e JOPLIN_PASSWORD=your_password \
-p 8081:8081 \
alexfail2/joplin-mcpThe container defaults to SSE transport. The endpoint will be available at http://localhost:8081/sse.
Run locally (stdio)
pip install mcp httpx
python app/server.pyBuild from source
docker build -t joplin-mcp .MCP client configuration
SSE (Docker)
{
"mcpServers": {
"joplin": {
"url": "http://localhost:8081/sse"
}
}
}stdio (local)
{
"mcpServers": {
"joplin": {
"command": "python",
"args": ["/path/to/app/server.py"],
"env": {
"JOPLIN_SERVER_URL": "https://your-joplin-server.example.com",
"JOPLIN_EMAIL": "your@email.com",
"JOPLIN_PASSWORD": "your_password"
}
}
}
}How it works
The server authenticates with Joplin Server via email/password sessions and builds an in-memory index of all items (notes, notebooks, tags) with a 2-minute TTL cache. Incremental sync compares server-side updated_time with cached etags, fetching only changed items (typical refresh: ~5s vs ~35s full rebuild). The index is persisted to disk so container restarts are instant. Resource metadata is loaded lazily on first access. Background refresh keeps the index up to date without blocking requests. All IDs are validated (32-char hex) before API calls.
Joplin's internal serialization format (title + markdown body + metadata block) is parsed and presented as clean structured output.
Development
The pure helpers (markdown section resolution, splicing, edit reports, to-do state) are covered by a dependency-free test suite:
python tests/test_helpers.pyContributors
@paoloviviani — to-do state: completion and due dates surfaced and settable,
set_todo,create_noteflags,todofilters and ordering (#7)@LasseLegarth —
share_idinherited from the parent notebook, so notes stay visible to a shared notebook's participants (#5)
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 Servers
- AlicenseNot gradedqualityDmaintenanceMCP server that provides standardized tools for querying and retrieving notes from Joplin personal knowledge manager through its API, enabling AI assistants to access and reference personal notes contextually.9MIT
- AlicenseAqualityBmaintenanceModel Context Protocol (MCP) server for Joplin note-taking app, enabling AI to read, search, and modify notes via sandboxed scripts.25424Apache 2.0
- AlicenseAqualityAmaintenanceA minimal MCP server that enables interaction with Joplin notes and notebooks through the local Web Clipper REST API, providing tools for search, create, update, and note management.11MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server that wraps Joplin's Data API, giving agents full CRUD over notes, notebooks, tags, and resources, plus search and revision history.MIT
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
MCP server for Argo RPG Platform — connects AI assistants to campaign data via OAuth2
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
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/Alexander-Zhukov/joplin-server-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server