Joplin MCP Server
Provides tools for interacting with Joplin's API (joppy/Web Clipper), enabling AI agents to search, read, create, update, edit, and delete notes; manage notebooks and tags; restore items from trash; read OCR text from attached resources; inspect note links; and import Markdown, HTML, CSV, TXT, and JEX files, with configurable tool permissions and notebook allowlists for scoped access.
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., "@Joplin MCP Serverfind my notes about Python programming"
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 Server
A FastMCP-based Model Context Protocol (MCP) server for Joplin note-taking application via its Python API joppy, enabling AI assistants to interact with your Joplin notes, notebooks, and tags through a standardized interface.
Table of Contents
Related MCP server: Joplin MCP Server
What You Can Do
This MCP server provides 26 optimized tools for comprehensive Joplin integration:
Note Management
Find & Search:
find_notes(supportstrash=Truefor trashed notes),find_notes_with_tag,find_notes_in_notebook,get_all_notesCRUD Operations:
get_note,get_note_resources(read OCR text from attached images/PDFs),get_links,create_note,update_note,edit_note,delete_note
Notebook Management
Organize:
list_notebooks,create_notebook,update_notebook,delete_notebook
Tag Management
Categorize:
list_tags,create_tag,update_tag,delete_tag,get_tags_by_noteLink:
tag_note,untag_note
Trash Management
Recover:
restore_from_trash- Restore soft-deleted notes or notebooks
Import
File Import:
import_from_file- Import Markdown, HTML, CSV, TXT, JEX files and directories
System
Health:
ping_joplin
Quick Start
Open Joplin Desktop → Tools → Options → Web Clipper
Enable the Web Clipper service
Copy the Authorization token
Set up your preferred client below
Supported Clients
Any MCP-compatible client should work. Below are the ones with documented setup instructions.
Claude Desktop
Run the automated installer:
# Install and configure everything automatically (pip)
pip install joplin-mcp
joplin-mcp-install
# Or use zero-install with uvx (recommended if you have uv)
uvx --from joplin-mcp joplin-mcp-install
# Optional: pin a specific version/range for stability
uvx --from joplin-mcp==0.4.1 joplin-mcp-install
uvx --from 'joplin-mcp>=0.4,<0.5' joplin-mcp-installThis script will:
Configure your Joplin API token
Set tool permissions (Create/Update/Delete)
Set up Claude Desktop automatically
Test the connection
After setup, restart Claude Desktop and you're ready to go!
Claude Code
Install the orchestration plugin for smarter tool usage (edit vs update, long-note reading, bulk tagging):
/plugin marketplace add alondmnt/joplin-mcp
/plugin install joplin-mcpYou'll be prompted for your Joplin API token on first use. The skill is invoked automatically when working with Joplin tools, or manually with /joplin.
Jan AI
Install Jan AI from https://jan.ai
Add MCP Server in Jan's interface:
Open Jan AI
Go to Settings → Extensions → Model Context Protocol
Click Add MCP Server
Configure:
Name:
joplinCommand:
uvx --from joplin-mcp joplin-mcp-server(requiresuvinstalled)Environment Variables:
JOPLIN_TOKEN:your_joplin_api_token_here
Enable the server
Start chatting with access to your Joplin notes!
Automated Setup (Alternative)
# Install and configure Jan AI automatically (if Jan is already installed)
pip install joplin-mcp
joplin-mcp-installThis will detect and configure Jan AI automatically, just like Claude Desktop.
OllMCP (Local Ollama Models)
Auto-discovery (if you set up Claude Desktop first)
# Install ollmcp
pip install ollmcp
# Run with auto-discovery (requires existing Claude Desktop config)
ollmcp --auto-discovery --model qwen3:4bManual setup (works independently)
# Install ollmcp
pip install ollmcp
# Set environment variable
export JOPLIN_TOKEN="your_joplin_api_token_here"
# Run with uvx (requires uv installed)
ollmcp --server "joplin:uvx --from joplin-mcp joplin-mcp-server" --model qwen3:4b
# Or with an installed package (pip install joplin-mcp)
ollmcp --server "joplin:joplin-mcp-server" --model qwen3:4bExample Usage
Once configured, you can ask your AI assistant:
"List all my notebooks" - See your Joplin organization
"Find notes about Python programming" - Search your knowledge base
"Create a meeting note for today's standup" - Quick note creation
"Tag my recent AI notes as 'important'" - Organize with tags
"Show me my todos" - Find task items with
find_notes(task=True)
Tool Permissions
The setup script offers 4 permission levels:
Read (always enabled): Browse and search your notes safely
Write (optional): Create new notes, notebooks, and tags
Update (optional): Modify existing content
Delete (optional): Remove content permanently
Choose the level that matches your comfort and use case.
Notebook Allowlist
Restrict AI access to specific notebooks using pattern-based access control. When configured, only matching notebooks (and their contents) are visible — all other notebooks are hidden.
Quick Setup
JSON config (joplin-mcp.json):
{
"token": "your_token",
"notebook_allowlist": ["Work", "Projects/Public"]
}Environment variable:
export JOPLIN_NOTEBOOK_ALLOWLIST="Work,Projects/Public"Pattern Syntax
Patterns use gitignore/gitwildmatch semantics:
Pattern | Matches | Example |
| Exact notebook name (and all children) |
|
| Direct children of Projects |
|
| All descendants recursively |
|
| Exclude (negate) a specific path | Everything in Projects except Secret |
Negation patterns always win over positive patterns (any negation match on a path or ancestor denies access).
How It Works
Hierarchical access: Allowing a parent notebook grants access to all its children. Allowing
Projectsmeans notes inProjects/Work/Tasksare also accessible.Read protection:
get_note,get_note_resources,find_notes,get_links— notes in blocked notebooks are filtered out or rejected.Write protection:
create_note,update_note,edit_note,delete_note— operations on notes in blocked notebooks are rejected.Notebook operations:
list_notebooksonly shows accessible notebooks.create_notebookis rejected both under a blocked parent and at the top level (noparent_name) when an allowlist is set, andupdate_notebookrejects moves to top-level (parent_name="/") under the same policy — both would let the agent silently move a notebook out of allowlist-enforced scope. To grow the allowlist, create or relocate the notebook in the Joplin UI, then add it tonotebook_allowlistand restart the server.Search filtering:
find_notesresults are filtered to only include notes in accessible notebooks.Tag operations:
tag_note,untag_note,get_tags_by_noteenforce access on the note's notebook.Error privacy: Blocked access raises a generic "Notebook not accessible" error without revealing notebook names or IDs.
Configuration Examples
Single project focus (notebook name containing a space):
{ "notebook_allowlist": ["Work Projects"] }Multiple notebooks with exclusion:
{ "notebook_allowlist": ["Projects", "!Projects/Secret", "AI", "Reference"] }Glob patterns:
{ "notebook_allowlist": ["Projects/*", "!Projects/Private"] }No allowlist (default) — all notebooks accessible:
{ "notebook_allowlist": null }Startup Behavior
At server startup, the allowlist is validated and logged:
Each entry is resolved against existing notebooks
Unresolvable patterns trigger warnings (but never block startup)
If the allowlist resolves to zero accessible notebooks, a warning is logged
Advanced Configuration
Development Installation
For developers or users who want the latest features:
git clone https://github.com/alondmnt/joplin-mcp.git
cd joplin-mcp
python bootstrap.pybootstrap.py is cross-platform: it offers to create a ./venv, runs pip install -e ., then launches the interactive installer. Pass --no-venv to install into whichever Python is already active.
Manual Configuration
If you prefer manual setup or the script doesn't work:
Note on
uvx:uvxruns Python applications without permanently installing them (requiresuv:pip install uv). It can read and write user configuration files (e.g., Claude/Jan configs), souvx --from joplin-mcp joplin-mcp-installworks for setup just like a pip install.
Version pinning (optional): For long‑lived client configs or CI, you can pin or range-constrain the version for reproducibility, e.g.
uvx --from joplin-mcp==0.4.1 joplin-mcp-installoruvx --from 'joplin-mcp>=0.4,<0.5' joplin-mcp-install.
1. Create Configuration File
Create joplin-mcp.json in your project directory:
{
"token": "your_api_token_here",
"host": "localhost",
"port": 41184,
"timeout": 30,
"verify_ssl": false
}2. Claude Desktop Configuration
Add to your claude_desktop_config.json:
Option A: Using uvx (Zero-install)
{
"mcpServers": {
"joplin": {
"command": "uvx",
"args": ["--from", "joplin-mcp", "joplin-mcp-server"],
"env": {
"JOPLIN_TOKEN": "your_token_here"
}
}
}
}Requires uv installed: pip install uv
Option B: Using installed package
{
"mcpServers": {
"joplin": {
"command": "joplin-mcp-server",
"env": {
"JOPLIN_TOKEN": "your_token_here"
}
}
}
}3. More Client Configuration Examples
For additional client configurations including different transport options (HTTP, SSE, Streamable HTTP), see client-config.json.example.
This file includes configurations for:
STDIO transport (default, most compatible)
HTTP transport (basic HTTP server mode)
SSE transport (recommended for gemini-cli and OpenAI clients)
Streamable HTTP transport (advanced web clients)
HTTP-compat transport (bridges modern
/mcpJSON-RPC with legacy/sse//messagesclients)
Tool Permission Configuration
Fine-tune which operations the AI can perform by editing your config:
{
"tools": {
"create_note": true,
"update_note": true,
"delete_note": false,
"create_notebook": true,
"update_notebook": false,
"delete_notebook": false,
"create_tag": true,
"update_tag": false,
"delete_tag": false,
"get_all_notes": false,
"import_from_file": true
}
}Environment Variables
Usable instead of a JSON config file, or alongside one:
# Connection settings
export JOPLIN_TOKEN="your_api_token_here"
export JOPLIN_HOST="localhost"
export JOPLIN_PORT="41184"
export JOPLIN_TIMEOUT="30"Environment variables override the config file key by key, so the env
block in your MCP client's configuration wins over whatever file the
server discovers. A variable only takes part when it is actually set, so
setting one leaves the rest of your file alone. Full order: direct
parameters > environment > config file > defaults.
Per-Tool Env Vars
Every tool can be toggled individually via JOPLIN_TOOL_<NAME>=true|false. These take precedence over config file settings.
Env var | Default |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Notebook Allowlist Env Var
Env var | Default | Description |
| (not set) | Comma-separated list of notebook patterns (e.g., |
HTTP Transport Support
The server supports both STDIO and HTTP transports:
# STDIO (default)
joplin-mcp-server --config ~/.joplin-mcp.json
# HTTP transport (development, from repo)
PYTHONPATH=src python -m joplin_mcp.server --transport http --port 8000 --config ./joplin-mcp.json
# Opt-in HTTP compatibility bundle (modern + legacy SSE endpoints)
PYTHONPATH=src python -m joplin_mcp.server --transport http-compat --port 8000 --config ./joplin-mcp.json
# or keep --transport http and export MCP_HTTP_COMPAT=1/true to toggle the same behavior.HTTP client config
Note: Claude Desktop currently uses STDIO transport and does not consume HTTP/SSE configs directly. The following example applies to clients that support network transports.
{
"mcpServers": {
"joplin": {
"transport": "http",
"url": "http://localhost:8000/mcp"
}
}
}Configuration Reference
Basic Settings
Option | Default | Description |
| required | Joplin API authentication token |
|
| Joplin server hostname |
|
| Joplin Web Clipper port |
|
| Request timeout in seconds |
|
| SSL certificate verification |
Tool Permissions
Option | Default | Description |
|
| Allow creating new notes |
|
| Allow modifying existing notes |
|
| Allow precision edits (find/replace, append, prepend) |
|
| Allow deleting notes (disabled by default — destructive) |
|
| Allow creating new notebooks |
|
| Allow modifying notebook titles and emoji icons |
|
| Allow deleting notebooks (disabled by default — destructive) |
|
| Allow creating new tags |
|
| Allow modifying tag titles |
|
| Allow deleting tags (disabled by default — destructive) |
|
| Allow adding tags to notes |
|
| Allow removing tags from notes |
|
| Allow restoring soft-deleted notes or notebooks |
|
| Allow text search across notes (with task filtering) |
|
| Allow finding notes by tag (with task filtering) |
|
| Allow finding notes by notebook (with task filtering) |
|
| Allow regex search within a single note |
|
| Allow getting all notes (disabled by default - can fill context window) |
|
| Allow getting specific notes |
|
| Allow reading a note's resources and their OCR text |
|
| Allow extracting links to other notes |
|
| Allow listing all notebooks |
|
| Allow listing all tags |
|
| Allow getting tags for specific notes |
|
| Allow testing server connectivity |
|
| Allow importing files/directories (MD, HTML, CSV, TXT, JEX) |
Notebook Allowlist
Option | Default | Description |
|
| List of notebook patterns to allow access to. |
Content Exposure (Privacy Settings)
Option | Default | Description |
|
| Content visibility in all search and listing results: |
|
| Content visibility for individual notes: |
|
| Maximum length of content previews (characters) |
|
| Notes longer than this show a table of contents instead of the full body |
|
| Turn the table-of-contents fallback off to always return full note bodies |
|
| Emit worked follow-up calls ( |
Lowering max_preview_length and smart_toc_threshold, or setting
search_results to "none", is the main way to cut how many tokens a
session spends. list_notebooks and list_tags return only the fields
an agent acts on; pass verbose=True for icons, parent ids and
timestamps. See docs/content-privacy.md.
Docker
Run the MCP server in a container. Default transport is HTTP for broad compatibility; switch via environment variables.
Build
docker build -t joplin-mcp .Run (HTTP default)
docker run --rm \
-p 8000:8000 \
-e JOPLIN_TOKEN=your_api_token \
joplin-mcpWith mounted config
docker run --rm \
-p 8000:8000 \
-v $PWD/joplin-mcp.json:/config/joplin-mcp.json:ro \
joplin-mcpChoose transport
SSE (streaming):
-e MCP_TRANSPORT=sseStreamable HTTP:
-e MCP_TRANSPORT=streamable-httpSTDIO (no port):
-e MCP_TRANSPORT=stdio
Example (SSE):
docker run --rm \
-p 8000:8000 \
-e JOPLIN_TOKEN=your_api_token \
-e MCP_TRANSPORT=sse \
joplin-mcpThe container listens on 0.0.0.0:8000 by default. If exposing publicly, place behind a reverse proxy and terminate TLS there. For SSE, ensure proxy keep-alives and buffering are configured appropriately.
Project Structure
src/joplin_mcp/- Main package directoryfastmcp_server.py- Server implementation with 26 tools and Pydantic validation typesconfig.py- Configuration management (including notebook allowlist)notebook_utils.py- Notebook path resolution, allowlist matching, and cachingserver.py- Server entrypoint (module and CLI)tools/- Tool implementations (notes, notebooks, tags)ui_integration.py- UI integration utilities
docs/- Documentation (troubleshooting, privacy controls, enhancement proposals)tests/- Unit test suitetests/e2e/- End-to-end tests against a real Joplin Desk
This server cannot be deployed
Related MCP Connectors
Create, search, and update notes in an xNotepad AI notebook, with semantic search and AI Q&A.
Notes and actions in one app. Let Claude or ChatGPT read and update them.
- aNotepadOAuthcom.anotepad
AI access to your aNotepad online notes: read, search, write, and organize via 22 tools.
- KnowtisOAuthapp.knowtis
Create, search and manage Knowtis collaborative notes from AI assistants.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to interact with Joplin notes through the Web Clipper API. Supports searching, reading, creating, deleting, and organizing notes and notebooks, plus scanning for uncompleted todo items.1MIT
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to manage Joplin Notes through the Web Clipper API, supporting note creation, updates, search, notebook organization, and tag management.-
- AlicenseAqualityNot gradedmaintenanceEnables AI assistants to interact with Joplin notes through full-text search, reading, creating, updating, and deleting notes, as well as importing markdown files directly into Joplin notebooks.6MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with Joplin notes, notebooks, and tags through a standardized MCP interface, supporting CRUD operations, search, and organization.19183 PyPI173MIT