
Joplin MCP Server
io.github.alondmntPublished by GitHub account alondmntv0.10.0Updated Oct 24, 2026
FastMCP server exposing Joplin notes, notebooks, tags, and imports.
Overview
A local MCP server that connects an AI assistant to Joplin notes, notebooks and tags through the Joplin Web Clipper API.
- What you can do
- Search and read notes, including full-text search, tag and notebook filters, regex search inside a note, links and OCR text from attachments. Create, update, precision-edit and delete notes, and move them between notebooks. List, create, rename, move and delete notebooks. List, create, update and delete tags, and add or remove tags on notes in bulk. Restore soft-deleted notes or notebooks from the trash. Import Markdown, HTML, CSV, TXT and JEX files or directories, and check connectivity to Joplin.
- When to use it
- Useful when you keep your knowledge base, meeting notes or task lists in Joplin and want an assistant to search, summarize, draft or reorganize them. Also fits bulk tagging, importing existing files, and recovering items from the trash.
- Requirements
- Runs locally as a Python package (pip or uvx) and needs a running Joplin Desktop 3.x with the Web Clipper service enabled. Requires the Web Clipper authorization token in JOPLIN_TOKEN; JOPLIN_URL optionally overrides the default localhost:41184 endpoint.
Installation
In SourceWeft
- Open Joplin MCP Server in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
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
- What You Can Do
- Quick Start
- Supported Clients
- Example Usage
- Tool Permissions
- Notebook Allowlist
- Advanced Configuration
- Docker
- Project Structure
- Testing
- Complete Tool Reference
- Changelog
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_notes - CRUD 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_note - Link:
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:
This 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):
You'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:
joplin - Command:
uvx --from joplin-mcp joplin-mcp-server(requiresuvinstalled) - Environment Variables:
JOPLIN_TOKEN:your_joplin_api_token_here
- Name:
- Enable the server
-
Start chatting with access to your Joplin notes!
Automated Setup (Alternative)
This will detect and configure Jan AI automatically, just like Claude Desktop.
OllMCP (Local Ollama Models)
Auto-discovery (if you set up Claude Desktop first)
Manual setup (works independently)
Example 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):
Environment variable:
Pattern Syntax
Patterns use gitignore/gitwildmatch semantics:
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):
Multiple notebooks with exclusion:
Glob patterns:
No allowlist (default) — all notebooks accessible:
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:
bootstrap.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:
2. Claude Desktop Configuration
Add to your claude_desktop_config.json:
Option A: Using uvx (Zero-install)
Requires uv installed: pip install uv
Option B: Using installed package
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:
Environment Variables
Usable instead of a JSON config file, or alongside one:
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.
Notebook Allowlist Env Var
HTTP Transport Support
The server supports both STDIO and HTTP transports:
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.
Configuration Reference
Basic Settings
Tool Permissions
Notebook Allowlist
Content Exposure (Privacy Settings)
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
Run (HTTP default)
With mounted config
Choose transport
- SSE (streaming):
-e MCP_TRANSPORT=sse - Streamable HTTP:
-e MCP_TRANSPORT=streamable-http - STDIO (no port):
-e MCP_TRANSPORT=stdio
Example (SSE):
The 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 Desktop (3.x) via the Web Clipper API; see "Running Tests"
Testing
Test your connection:
You should see:
Running Tests
The E2E suite talks to a real Joplin Desktop via the Web Clipper API and exercises every tool including notebook allowlist enforcement. If JOPLIN_HOST:JOPLIN_PORT is unreachable the suite skips itself, so it's safe to run alongside the unit tests. Requires Joplin 3.x (the trash schema introduced in 3.0 — earlier versions fail with no such column: deleted_time).
Complete Tool Reference
Source: README.md at commit b84c313
Tools
0Version history
1- v0.10.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts