Joplin Mcp Server

io.github.jordanburkePublished by GitHub account jordanburkev2.3.3Updated Oct 24, 2026

Search, read, create, edit and sync Joplin notes and notebooks via a headless Joplin sidecar.

Overview

AI-generated overview

Lets an assistant search, read, create, edit, delete and sync Joplin notes and notebooks through a bundled headless Joplin sidecar.

What you can do
Runs a self-contained Joplin Terminal instance (sidecar mode) and exposes it over MCP, so no Joplin desktop app is required. Tools cover listing notebooks, searching notes, reading one or several notes, creating and editing notes and notebooks, deleting notes or notebooks with confirmation, and triggering sync. It can also connect to an existing Joplin instance in external mode, and it negotiates a free port when Joplin Desktop is already running.
When to use it
Useful when you keep notes in Joplin and want an assistant to search, read, draft, update or organize them without opening the desktop app. Also fits setups where a headless instance syncs to the same backend as Joplin Desktop, including WSL and OneDrive filesystem sync.
Requirements
Local Node.js runtime; installed via npm package joplin-mcp-server over stdio. Needs a Joplin API token (JOPLIN_TOKEN) for external mode; sidecar mode manages its own token. Optional sync configuration uses JOPLIN_SYNC_TARGET plus target-specific values such as JOPLIN_SYNC_PATH, JOPLIN_SYNC_USERNAME and JOPLIN_SYNC_PASSWORD, and for S3 JOPLIN_SYNC_REGION, JOPLIN_SYNC_ENDPOINT and JOPLIN_SYNC_FORCE_PATH_STYLE. Data is stored under JOPLIN_PROFILE by default.
Before you install
The server can create, edit and delete notes and notebooks, and delete operations are described as requiring confirmation. It handles secrets: JOPLIN_TOKEN, JOPLIN_SYNC_PASSWORD and sync credentials such as S3 access keys, which may be passed on the command line or in environment variables. Sync sends note data to the configured backend (filesystem, WebDAV, Nextcloud, Joplin Cloud, S3, Dropbox or OneDrive). Sidecar and desktop instances keep separate databases and only stay in sync when…

Installation

In SourceWeft

  1. Open Joplin Mcp Server in the dashboard and add it to a workspace.
  2. 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

[npm version] [CI] [License: MIT]

A self-contained MCP (Model Context Protocol) server for Joplin. Bundles the Joplin Terminal CLI as a dependency — no desktop app, no global installs, no external processes to manage. Coexists with Joplin Desktop via automatic port negotiation.

Quick Start

bash
npx joplin-mcp-server --token your_joplin_token

That's it. The server spawns its own Joplin Terminal instance (sidecar mode), syncs to your configured backend, and exposes your notes via MCP.

Architecture

Sidecar Mode (Default)

The server bundles joplin as an npm dependency and manages its own Joplin Terminal process. No Joplin desktop app needed — the sidecar handles everything: data storage, sync, and the REST API.

If Joplin Desktop is already running, the sidecar automatically finds a free port (scanning 41184-41193) and runs alongside it. Both instances stay in sync if configured with the same sync target.

bash
# Basic usage — sidecar starts automaticallynpx joplin-mcp-server --token your_token
# With cloud syncnpx joplin-mcp-server --token your_token \  --sync-target joplin-cloud \  --sync-username [email protected] --sync-password pass
# With filesystem sync (e.g. OneDrive folder)npx joplin-mcp-server --token your_token \  --sync-target filesystem \  --sync-path /mnt/c/Users/you/OneDrive/Joplin

The Joplin CLI is resolved in this order: JOPLIN_CLI env var > node_modules/.bin/joplin (bundled) > global install > npx fallback.

Data is stored in ~/.config/joplin-mcp by default (separate from any desktop Joplin install).

External Mode

Connects to an existing Joplin instance instead of spawning a sidecar. Activated by setting JOPLIN_HOST or JOPLIN_PORT.

bash
# Connect to Joplin desktop on another machine or Windows hostJOPLIN_HOST=192.168.0.40 JOPLIN_PORT=41184 npx joplin-mcp-server --token your_token

Configuration

Environment Variables

VariableDescriptionDefault
JOPLIN_TOKENAPI token (required)--
JOPLIN_HOSTConnect to existing Joplin at this host (skips sidecar)--
JOPLIN_PORTConnect to existing Joplin on this port (skips sidecar)--
JOPLIN_CLIPath to joplin CLI binary (overrides auto-detection)--
JOPLIN_PROFILEJoplin data directory for sidecar mode~/.config/joplin-mcp
JOPLIN_SYNC_TARGETSync target typenone
JOPLIN_SYNC_PATHSync target URL/path--
JOPLIN_SYNC_USERNAMESync username/email--
JOPLIN_SYNC_PASSWORDSync password--
JOPLIN_SYNC_REGIONS3 regionus-east-1
JOPLIN_SYNC_ENDPOINTS3 endpoint URL (for non-AWS providers)AWS S3
JOPLIN_SYNC_FORCE_PATH_STYLEUse path-style S3 URLs (true/false)false
LOG_LEVELLog level: debug, info, warn, errorinfo

Command Line Options

OPTIONS:  --env-file <file>          Load environment variables from file  --token <token>            Joplin API token  --transport <type>         Transport type: stdio (default) or http  --http-port <port>         HTTP server port (default: 3000, only with --transport http)  --profile <dir>            Joplin data directory (default: ~/.config/joplin-mcp)  --sync-target <type>       Sync target: none, filesystem, webdav, nextcloud,                             joplin-cloud, joplin-server, s3, dropbox, onedrive  --sync-path <url>          URL or path for sync target  --sync-username <user>     Username/email for sync  --sync-password <pass>     Password for sync  --help, -h                 Show help message

Path Expansion

The --profile option and the --sync-path of a filesystem sync target support ~ and environment variable expansion for cross-platform compatibility. Other targets take a URL or bucket name in --sync-path, so it is passed through untouched:

bash
# Tilde expands to home directory (Linux, macOS, Windows)--sync-path ~/OneDrive/Apps/Joplin
# Environment variables (both forms supported)--sync-path ${HOME}/OneDrive/Apps/Joplin--sync-path $HOME/OneDrive/Apps/Joplin
# Windows example using USERPROFILE--sync-path ${USERPROFILE}/OneDrive/Apps/Joplin

This works in MCP client configs (.mcp.json, Claude Desktop) where shell expansion isn't available.

WSL auto-detection: On WSL, if a ~/ path is empty or missing, the server automatically checks the corresponding Windows path at /mnt/c/Users/<user>/.... This means --sync-path ~/OneDrive/Apps/Joplin just works on WSL without needing the full /mnt/c/... path.

Sync Targets

TargetRequired Options
none(default, no sync)
filesystem--sync-path /path/to/dir
webdav--sync-path <url> --sync-username --sync-password
nextcloud--sync-path <url> --sync-username --sync-password
joplin-cloud--sync-username --sync-password
joplin-server--sync-path <url> --sync-username --sync-password
s3--sync-path <bucket> --sync-username <access-key> --sync-password <secret-key>
dropbox(OAuth flow)
onedrive(OAuth flow)
S3-compatible providers

The s3 target defaults to AWS (https://s3.amazonaws.com/, region us-east-1). Point it at any S3-compatible provider with --sync-region and --sync-endpoint:

bash
# Backblaze B2joplin-mcp-server --token my_token \  --sync-target s3 --sync-path my-bucket \  --sync-region us-west-004 \  --sync-endpoint https://s3.us-west-004.backblazeb2.com \  --sync-username <access-key> --sync-password <secret-key>
# MinIO / self-hosted: path-style URLs are usually requiredjoplin-mcp-server --token my_token \  --sync-target s3 --sync-path my-bucket \  --sync-endpoint https://minio.example.com \  --sync-force-path-style true \  --sync-username <access-key> --sync-password <secret-key>

Cloudflare R2 and Wasabi work the same way — set --sync-endpoint to the provider's S3 endpoint.

MCP Client Configuration

Claude Code

The repository includes a .mcp.json that works with Claude Code's env var expansion:

json
{  "mcpServers": {    "joplin": {      "command": "node",      "args": ["dist/bin.js"],      "env": {        "JOPLIN_TOKEN": "${JOPLIN_TOKEN}"      }    }  }}

Set JOPLIN_TOKEN in your shell (add to ~/.bashrc or ~/.zshrc):

bash
export JOPLIN_TOKEN="your_actual_token_here"

Claude Desktop

Claude Desktop does not support ${VAR} expansion. Provide values directly:

json
{  "mcpServers": {    "joplin": {      "command": "npx",      "args": ["joplin-mcp-server", "--token", "your_actual_token_here"]    }  }}

With Sync (Claude Desktop)

json
{  "mcpServers": {    "joplin": {      "command": "npx",      "args": [        "joplin-mcp-server",        "--token",        "your_token",        "--sync-target",        "filesystem",        "--sync-path",        "/path/to/sync/dir"      ]    }  }}

External Mode

json
{  "mcpServers": {    "joplin": {      "command": "npx",      "args": ["joplin-mcp-server"],      "env": {        "JOPLIN_TOKEN": "your_actual_token_here",        "JOPLIN_HOST": "192.168.0.40",        "JOPLIN_PORT": "41184"      }    }  }}

Docker

bash
docker build -t joplin-mcp .docker run -e JOPLIN_TOKEN=your_token -p 3000:3000 joplin-mcp

WSL Setup

Running in WSL? The sidecar architecture makes this straightforward — no Windows port forwarding needed. The server auto-detects WSL and handles path resolution between Linux and Windows filesystems.

Filesystem Sync via OneDrive (Recommended)

Both your Windows Joplin desktop and the WSL sidecar sync to the same OneDrive folder. They see the same notes without needing to talk to each other directly.

bash
# Uses ~/OneDrive — automatically resolves to /mnt/c/Users/YourName/OneDrive on WSLnpx joplin-mcp-server --token your_token \  --sync-target filesystem \  --sync-path ~/OneDrive/Apps/Joplin
# Or specify the Windows path explicitlynpx joplin-mcp-server --token your_token \  --sync-target filesystem \  --sync-path /mnt/c/Users/YourName/OneDrive/Apps/Joplin

In your Joplin desktop app, configure sync to the same OneDrive folder: Tools > Options > Synchronisation > File system > /Users/YourName/OneDrive/Apps/Joplin

Joplin Desktop coexistence: If Desktop is running on port 41184, the sidecar automatically uses the next available port. A warning is logged at startup reminding you that both instances use separate databases and need the same sync target to stay in sync.

Cloud Sync

Alternatively, both instances can sync to Joplin Cloud or any other cloud backend:

bash
npx joplin-mcp-server --token your_token \  --sync-target joplin-cloud \  --sync-username [email protected] --sync-password pass

External Mode (Port Forwarding)

If you prefer to connect directly to Windows Joplin instead of running a sidecar:

On Windows (PowerShell as Administrator):

powershell
netsh interface portproxy add v4tov4 listenport=41184 listenaddress=0.0.0.0 connectport=41184 connectaddress=127.0.0.1

In WSL:

bash
JOPLIN_HOST=192.168.0.40 JOPLIN_PORT=41184 npx joplin-mcp-server --token your_token

Find your Windows IP with ipconfig on Windows or cat /etc/resolv.conf | grep nameserver from WSL.

Available Tools

ToolDescription
list_notebooksRetrieve the complete notebook hierarchy
search_notesSearch for notes by query string
read_notebookRead contents of a specific notebook
read_noteRead full content of a specific note
read_multinoteRead multiple notes at once
create_noteCreate a new note
create_folderCreate a new notebook
edit_noteEdit an existing note
edit_folderEdit an existing notebook
delete_noteDelete a note (requires confirmation)
delete_folderDelete a notebook (requires confirmation)
syncTrigger sync (auto-syncs every 5 min by default)

Development

bash
pnpm install          # Install dependenciespnpm build            # Build to dist/pnpm test             # Run testspnpm validate         # Format + lint + typecheck + test + buildpnpm serve:dev        # Dev mode with hot reload (stdio)pnpm serve:dev:http   # Dev mode with hot reload (HTTP)pnpm inspect          # Build and open MCP Inspector

License

MIT

Source: README.md at commit b3f3d82

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v2.3.3LatestSep 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