io.github.jordanburke/joplin-mcp-server

Registre officiel Recherche et web

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

Installation

Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).

NPM package joplin-mcp-server
Claude Code
claude mcp add joplin-mcp-server -e 'JOPLIN_TOKEN=<your joplin_token>' -e 'JOPLIN_HOST=<JOPLIN_HOST>' -e 'JOPLIN_PORT=<JOPLIN_PORT>' -e 'JOPLIN_PROFILE=<JOPLIN_PROFILE>' -e 'JOPLIN_CLI=<JOPLIN_CLI>' -e 'JOPLIN_SYNC_TARGET=<JOPLIN_SYNC_TARGET>' -e 'JOPLIN_SYNC_PATH=<JOPLIN_SYNC_PATH>' -e 'JOPLIN_SYNC_USERNAME=<JOPLIN_SYNC_USERNAME>' -e 'JOPLIN_SYNC_PASSWORD=<your joplin_sync_password>' -e 'JOPLIN_SYNC_REGION=<JOPLIN_SYNC_REGION>' -e 'JOPLIN_SYNC_ENDPOINT=<JOPLIN_SYNC_ENDPOINT>' -e 'JOPLIN_SYNC_FORCE_PATH_STYLE=<JOPLIN_SYNC_FORCE_PATH_STYLE>' -e 'LOG_LEVEL=<LOG_LEVEL>' -- npx -y joplin-mcp-server@2.3.3
Configuration JSON (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "joplin-mcp-server": {
            "command": "npx",
            "args": [
                "-y",
                "joplin-mcp-server@2.3.3"
            ],
            "env": {
                "JOPLIN_TOKEN": "<your joplin_token>",
                "JOPLIN_HOST": "<JOPLIN_HOST>",
                "JOPLIN_PORT": "<JOPLIN_PORT>",
                "JOPLIN_PROFILE": "<JOPLIN_PROFILE>",
                "JOPLIN_CLI": "<JOPLIN_CLI>",
                "JOPLIN_SYNC_TARGET": "<JOPLIN_SYNC_TARGET>",
                "JOPLIN_SYNC_PATH": "<JOPLIN_SYNC_PATH>",
                "JOPLIN_SYNC_USERNAME": "<JOPLIN_SYNC_USERNAME>",
                "JOPLIN_SYNC_PASSWORD": "<your joplin_sync_password>",
                "JOPLIN_SYNC_REGION": "<JOPLIN_SYNC_REGION>",
                "JOPLIN_SYNC_ENDPOINT": "<JOPLIN_SYNC_ENDPOINT>",
                "JOPLIN_SYNC_FORCE_PATH_STYLE": "<JOPLIN_SYNC_FORCE_PATH_STYLE>",
                "LOG_LEVEL": "<LOG_LEVEL>"
            }
        }
    }
}

Variables d'environnement

  • JOPLIN_TOKEN secret Joplin API token, for external mode only (see JOPLIN_HOST). Sidecar mode manages its own token and ignores this.
  • JOPLIN_HOST Connect to an existing Joplin instance at this host instead of running a sidecar
  • JOPLIN_PORT Port of the existing Joplin instance (default: 41184)
  • JOPLIN_PROFILE Joplin data directory for sidecar mode (default: ~/.config/joplin-mcp)
  • JOPLIN_CLI Path to the joplin CLI binary, overriding auto-detection
  • JOPLIN_SYNC_TARGET Sync target: none, filesystem, webdav, nextcloud, joplin-cloud, joplin-server, s3, dropbox, onedrive (default: none)
  • JOPLIN_SYNC_PATH Sync target URL or path; the bucket name for the s3 target
  • JOPLIN_SYNC_USERNAME Sync username or email; the access key for the s3 target
  • JOPLIN_SYNC_PASSWORD secret Sync password; the secret key for the s3 target
  • JOPLIN_SYNC_REGION S3 region (default: us-east-1)
  • JOPLIN_SYNC_ENDPOINT S3 endpoint URL for non-AWS providers such as Backblaze B2, MinIO, R2 or Wasabi (default: https://s3.amazonaws.com/)
  • JOPLIN_SYNC_FORCE_PATH_STYLE Use path-style S3 URLs, which self-hosted providers such as MinIO usually require: true or false (default: false)
  • LOG_LEVEL Log verbosity: debug, info, warn or error (default: info)

Documentation

Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.

Sommaire
  1. Joplin MCP Server
  2. Quick Start
  3. Architecture
  4. Configuration
  5. MCP Client Configuration
  6. WSL Setup
  7. Available Tools
  8. Development
  9. License

Joplin MCP Server

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

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.

# Basic usage — sidecar starts automatically
npx joplin-mcp-server --token your_token

# With cloud sync
npx joplin-mcp-server --token your_token \
  --sync-target joplin-cloud \
  --sync-username user@example.com --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.

# Connect to Joplin desktop on another machine or Windows host
JOPLIN_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:

# 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:

# Backblaze B2
joplin-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 required
joplin-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:

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

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

export JOPLIN_TOKEN="your_actual_token_here"
Claude Desktop

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

{
  "mcpServers": {
    "joplin": {
      "command": "npx",
      "args": ["joplin-mcp-server", "--token", "your_actual_token_here"]
    }
  }
}
With Sync (Claude Desktop)
{
  "mcpServers": {
    "joplin": {
      "command": "npx",
      "args": [
        "joplin-mcp-server",
        "--token",
        "your_token",
        "--sync-target",
        "filesystem",
        "--sync-path",
        "/path/to/sync/dir"
      ]
    }
  }
}
External Mode
{
  "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
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.

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.

# Uses ~/OneDrive — automatically resolves to /mnt/c/Users/YourName/OneDrive on WSL
npx joplin-mcp-server --token your_token \
  --sync-target filesystem \
  --sync-path ~/OneDrive/Apps/Joplin

# Or specify the Windows path explicitly
npx 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:

npx joplin-mcp-server --token your_token \
  --sync-target joplin-cloud \
  --sync-username user@example.com --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):

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

In WSL:

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

pnpm install          # Install dependencies
pnpm build            # Build to dist/
pnpm test             # Run tests
pnpm validate         # Format + lint + typecheck + test + build
pnpm 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

Questions fréquentes

Qu'est-ce que io.github.jordanburke/joplin-mcp-server ?

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

Comment installer io.github.jordanburke/joplin-mcp-server ?

Il s'exécute sur votre machine. Dans Claude Code : claude mcp add joplin-mcp-server -e 'JOPLIN_TOKEN=<your joplin_token>' -e 'JOPLIN_HOST=<JOPLIN_HOST>' -e 'JOPLIN_PORT=<JOPLIN_PORT>' -e 'JOPLIN_PROFILE=<JOPLIN_PROFILE>' -e 'JOPLIN_CLI=<JOPLIN_CLI>' -e 'JOPLIN_SYNC_TARGET=<JOPLIN_SYNC_TARGET>' -e 'JOPLIN_SYNC_PATH=<JOPLIN_SYNC_PATH>' -e 'JOPLIN_SYNC_USERNAME=<JOPLIN_SYNC_USERNAME>' -e 'JOPLIN_SYNC_PASSWORD=<your joplin_sync_password>' -e 'JOPLIN_SYNC_REGION=<JOPLIN_SYNC_REGION>' -e 'JOPLIN_SYNC_ENDPOINT=<JOPLIN_SYNC_ENDPOINT>' -e 'JOPLIN_SYNC_FORCE_PATH_STYLE=<JOPLIN_SYNC_FORCE_PATH_STYLE>' -e 'LOG_LEVEL=<LOG_LEVEL>' -- npx -y joplin-mcp-server@2.3.3. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.

Faut-il une clé API pour io.github.jordanburke/joplin-mcp-server ?

Oui. Il attend JOPLIN_TOKEN, JOPLIN_SYNC_PASSWORD, à renseigner dans sa configuration.

io.github.jordanburke/joplin-mcp-server est-il open source ?

Oui. Son code est sur GitHub sous licence MIT.

Qui maintient io.github.jordanburke/joplin-mcp-server ?

Il est publié par jordanburke. AI.tn le référence sans le maintenir ni le recommander.

Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.