Skip to main content
Glama
jordanburke

joplin-mcp-server

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

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.

Related MCP server: Jopmcp

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

Variable

Description

Default

JOPLIN_TOKEN

API token (required)

--

JOPLIN_HOST

Connect to existing Joplin at this host (skips sidecar)

--

JOPLIN_PORT

Connect to existing Joplin on this port (skips sidecar)

--

JOPLIN_CLI

Path to joplin CLI binary (overrides auto-detection)

--

JOPLIN_PROFILE

Joplin data directory for sidecar mode

~/.config/joplin-mcp

JOPLIN_SYNC_TARGET

Sync target type

none

JOPLIN_SYNC_PATH

Sync target URL/path

--

JOPLIN_SYNC_USERNAME

Sync username/email

--

JOPLIN_SYNC_PASSWORD

Sync password

--

JOPLIN_SYNC_REGION

S3 region

us-east-1

JOPLIN_SYNC_ENDPOINT

S3 endpoint URL (for non-AWS providers)

AWS S3

JOPLIN_SYNC_FORCE_PATH_STYLE

Use path-style S3 URLs (true/false)

false

LOG_LEVEL

Log level: debug, info, warn, error

info

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

Target

Required 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

Tool

Description

list_notebooks

Retrieve the complete notebook hierarchy

search_notes

Search for notes by query string

read_notebook

Read contents of a specific notebook

read_note

Read full content of a specific note

read_multinote

Read multiple notes at once

create_note

Create a new note

create_folder

Create a new notebook

edit_note

Edit an existing note

edit_folder

Edit an existing notebook

delete_note

Delete a note (requires confirmation)

delete_folder

Delete a notebook (requires confirmation)

sync

Trigger 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

Available Tools

11 tools
create_folderC

Create a new folder/notebook in Joplin

ParametersJSON Schema
NameRequiredDescriptionDefault
parent_idNoID of parent notebook
titleYesNotebook title

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('Create') but doesn't mention permissions required, whether the operation is idempotent, error conditions, or what happens on success (e.g., returns a folder ID). For a mutation tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded with the core action and resource, making it easy to parse quickly, which is ideal for conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a creation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what the tool returns (e.g., the ID of the created folder), error handling, or dependencies like the parent notebook's existence, leaving critical gaps for an AI agent to use it effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with clear descriptions for both parameters ('parent_id' and 'title') in the input schema. The description doesn't add any parameter-specific details beyond what the schema provides, such as format examples or constraints, so it meets the baseline for high schema coverage without extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Create') and resource ('new folder/notebook in Joplin'), making the purpose immediately understandable. It doesn't explicitly differentiate from sibling tools like 'create_note' or 'edit_folder', but the resource specificity (folder/notebook) provides some distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'edit_folder' for modifications or 'create_note' for creating notes instead of folders. The description lacks context about prerequisites, such as needing an existing parent notebook, or exclusions, leaving the agent to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_noteC

Create a new note in Joplin

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoNote content in Markdown
body_htmlNoNote content in HTML
image_data_urlNoBase64 encoded image data URL
is_todoNoWhether this is a todo note
parent_idNoID of parent notebook
titleNoNote title

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Create' which implies a write operation, but doesn't cover permissions, side effects (e.g., if it overwrites existing notes), error handling, or response format. This is inadequate for a mutation tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero wasted words, making it easy to parse. It's front-loaded with the core purpose, though this brevity contributes to gaps in other dimensions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, mutation operation) and lack of annotations and output schema, the description is insufficient. It doesn't explain return values, error cases, or behavioral nuances, leaving significant gaps for an agent to use the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 6 parameters. The description adds no parameter-specific information beyond implying creation, which doesn't enhance understanding of individual parameters. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Create') and resource ('a new note in Joplin'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'edit_note' or 'read_note' beyond the basic verb, missing specific distinctions about when to create versus edit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a parent notebook ID), exclusions, or comparisons to siblings like 'edit_note' for updates or 'search_notes' for finding existing notes, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_folderA

Delete a folder/notebook from Joplin (requires confirmation)

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoConfirmation flag
folder_idYesID of the folder to delete
forceNoForce delete even if folder has contents

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It adds useful context about the confirmation requirement, but it doesn't cover other critical aspects like whether deletion is permanent, what happens to nested content, or error conditions. This leaves gaps in understanding the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that is front-loaded with the core action and key constraint ('requires confirmation'). There is no wasted text, making it highly concise and well-structured for quick understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a destructive operation with no annotations and no output schema, the description is incomplete. It mentions confirmation but lacks details on outcomes, error handling, or dependencies. For a deletion tool, this leaves significant gaps in contextual understanding that could hinder effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters (confirm, folder_id, force). The description doesn't add any additional meaning or syntax details beyond what the schema provides, such as how confirmation works or force implications. Baseline 3 is appropriate when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete') and the resource ('a folder/notebook from Joplin'), making the purpose specific and unambiguous. It distinguishes from siblings like 'delete_note' by specifying folder-level deletion, though it doesn't explicitly mention sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by stating 'requires confirmation,' but it doesn't provide explicit guidance on when to use this tool versus alternatives like 'delete_note' or 'edit_folder.' No exclusions or prerequisites are mentioned, leaving usage somewhat vague.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_noteB

Delete a note from Joplin (requires confirmation)

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoConfirmation flag
note_idYesID of the note to delete

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'requires confirmation,' which hints at a safety mechanism, but doesn't clarify if the deletion is permanent, reversible, or has side effects (e.g., impact on related data). For a destructive operation, this leaves significant gaps in understanding the tool's behavior and risks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core action ('Delete a note from Joplin') and adds a crucial behavioral note ('requires confirmation') without any wasted words. It's appropriately sized for the tool's complexity and gets straight to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's destructive nature, no annotations, and no output schema, the description is incomplete. It lacks details on permissions, error handling, return values, or irreversible consequences. While concise, it doesn't provide enough context for safe and effective use, especially compared to siblings that may have similar operations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters ('note_id' and 'confirm') clearly. The description adds minimal value by implying the 'confirm' parameter's purpose ('requires confirmation'), but doesn't provide additional semantics beyond what the schema states. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete') and resource ('a note from Joplin'), making the purpose immediately understandable. It distinguishes from siblings like 'delete_folder' by specifying the note resource, though it doesn't explicitly contrast with other deletion tools. The description goes beyond a tautology of the tool name by adding context about Joplin.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the phrase 'requires confirmation,' suggesting this tool should be used when deletion is intended and confirmed. However, it doesn't provide explicit guidance on when to use this versus alternatives like 'delete_folder' or other note-related tools, nor does it mention prerequisites or exclusions. The guidance is functional but lacks comparative context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_folderC

Edit/update an existing folder/notebook in Joplin

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idYesID of the folder to edit
parent_idNoNew parent folder ID
titleNoNew folder title

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. While 'Edit/update' implies mutation, it doesn't specify whether this operation requires specific permissions, if changes are reversible, what happens to child items when parent_id is changed, or any rate limits. This leaves significant gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that gets straight to the point with zero wasted words. It's appropriately sized and front-loaded with the core action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what the tool returns, error conditions, or important behavioral aspects like whether all parameters are optional (only folder_id is required). Given the complexity, more context is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters thoroughly. The description adds no additional parameter information beyond what's in the schema, meeting the baseline expectation but not providing extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Edit/update') and resource ('an existing folder/notebook in Joplin'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'edit_note' or 'create_folder', which would be needed for a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'create_folder' for new folders or 'edit_note' for notes. There's no mention of prerequisites, such as needing an existing folder ID, or context about when editing is appropriate versus deletion or creation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_noteC

Edit/update an existing note in Joplin

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoNew note content in Markdown
body_htmlNoNew note content in HTML
is_todoNoWhether this is a todo note
note_idYesID of the note to edit
parent_idNoNew parent notebook ID
titleNoNew note title
todo_completedNoWhether todo is completed
todo_dueNoTodo due date (Unix timestamp)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Edit/update' implies a mutation, but the description doesn't specify whether this requires specific permissions, what happens to unchanged fields (partial vs. full updates), error conditions (e.g., invalid note_id), or response format. For a mutation tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose ('Edit/update an existing note in Joplin') with zero wasted words. It's appropriately sized for a straightforward tool, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of an 8-parameter mutation tool with no annotations and no output schema, the description is incomplete. It lacks details on behavioral aspects (e.g., update semantics, error handling), usage context, and return values, leaving the agent with insufficient information to use the tool effectively beyond basic purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no parameter-specific information beyond what's in the input schema, which has 100% coverage with detailed descriptions for all 8 parameters (e.g., 'body' as 'New note content in Markdown'). Since schema coverage is high, the baseline score is 3, as the description doesn't compensate but also doesn't detract from the schema's documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Edit/update') and resource ('an existing note in Joplin'), making the purpose immediately understandable. It distinguishes from siblings like 'create_note' (creation vs. editing) and 'delete_note' (editing vs. deletion), though it doesn't explicitly contrast with 'edit_folder' which has a similar verb but different resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a note ID from 'read_note' or 'search_notes'), exclusions (e.g., not for creating new notes), or comparisons with siblings like 'edit_folder' for folder updates. Usage is implied but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_notebooksB

Retrieve the complete notebook hierarchy from Joplin

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It states the tool retrieves data, implying a read-only operation, but doesn't cover aspects like permissions, rate limits, response format, or whether it's paginated. This is a significant gap for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the key information ('Retrieve the complete notebook hierarchy') without any waste. It's appropriately sized for a simple tool with no parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what the retrieved hierarchy looks like (e.g., structure, fields), behavioral traits, or how it differs from sibling tools. For a tool with no structured data support, this leaves significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, and the schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, but it does mention the scope ('complete notebook hierarchy'), which provides context beyond the empty schema. Baseline for 0 params is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Retrieve') and resource ('complete notebook hierarchy from Joplin'), making the tool's purpose understandable. It doesn't explicitly differentiate from siblings like 'read_notebook' or 'search_notes', but the scope ('complete notebook hierarchy') provides some distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as 'read_notebook' or 'search_notes'. The description implies it retrieves a hierarchy, but it doesn't specify use cases, prerequisites, or exclusions, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_multinoteC

Read the full content of multiple notes at once

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idsYesArray of note IDs to read

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool reads content but doesn't specify permissions needed, rate limits, error handling, or what happens if some note IDs are invalid. This leaves significant gaps for a tool that interacts with multiple resources.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It is front-loaded with the core action and resource, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is insufficient for a tool that reads multiple notes. It doesn't explain the return format, how results are structured, or error scenarios, leaving the agent with incomplete operational context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the parameter 'note_ids' fully documented in the schema. The description adds no additional semantic context beyond implying multiple notes, which is already covered. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('read the full content') and resource ('multiple notes at once'), making the purpose immediately understandable. It distinguishes from the sibling 'read_note' by specifying multiple notes, though it doesn't explicitly contrast with other tools like 'search_notes' or 'list_notebooks'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites, when to choose this over 'read_note' for single notes, or how it relates to 'search_notes' for finding notes. Usage is implied by the name but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_noteC

Read the full content of a specific note

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesID of the note to read

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states this is a read operation, but doesn't mention authentication requirements, rate limits, error conditions, or what 'full content' includes (e.g., metadata, formatting). This leaves significant gaps for a tool that presumably accesses user data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that gets straight to the point with zero wasted words. It's appropriately sized for a simple read operation and front-loads the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a data access tool with no annotations and no output schema, the description is insufficient. It doesn't explain what format the content returns in, whether it includes metadata, or what happens with invalid IDs. Given the context of sibling tools that handle multiple notes and notebooks, more guidance is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the single parameter 'note_id' clearly documented in the schema. The description adds no additional parameter information beyond what the schema already provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Read the full content') and resource ('a specific note'), making the tool's purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'read_multinote' or 'read_notebook', which prevents a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'read_multinote' or 'read_notebook'. It doesn't mention prerequisites, constraints, or typical use cases, leaving the agent to infer usage from context alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_notebookC

Read the contents of a specific notebook

ParametersJSON Schema
NameRequiredDescriptionDefault
notebook_idYesID of the notebook to read

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It only states the basic action without mentioning permissions needed, whether this is a read-only operation, potential rate limits, or what format/content is returned. For a tool with zero annotation coverage, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence that efficiently communicates the core function without any wasted words. It's appropriately sized for a simple tool and gets straight to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema, the description is too minimal. It doesn't explain what 'contents' means, what format is returned, or any behavioral aspects. Given the lack of structured information elsewhere, the description should provide more context about the operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents the single 'notebook_id' parameter. The description adds no additional parameter information beyond what's in the schema, which is acceptable given the high schema coverage but doesn't provide extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Read' and the resource 'contents of a specific notebook', making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling tools like 'read_note' or 'read_multinote', leaving some ambiguity about scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives like 'read_note' or 'read_multinote'. The description simply states what it does without any context about appropriate use cases or distinctions from similar tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_notesC

Search for notes in Joplin and return matching notebooks

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions searching and returning results but fails to disclose key behavioral traits such as search scope (e.g., full-text, metadata), result format, pagination, or error handling. For a search tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the main action ('Search for notes in Joplin'), making it efficient. However, the ambiguity in the second part ('return matching notebooks') slightly reduces its clarity, but it remains concise without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is incomplete. It does not explain what the return values are (e.g., list of notes, notebooks, or both), how results are structured, or any limitations. For a search tool with no structured output information, this leaves critical gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, with the 'query' parameter documented as 'Search query'. The description does not add any meaning beyond this, such as query syntax examples or searchable fields. With high schema coverage, the baseline score of 3 is appropriate as the schema handles the parameter documentation adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool 'Search for notes in Joplin' which is a clear verb+resource combination, but it adds 'and return matching notebooks' which creates ambiguity about whether it searches notes or notebooks. This vagueness reduces clarity, especially when sibling tools like 'list_notebooks' and 'read_note' exist for specific purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'list_notebooks' for listing notebooks or 'read_note' for reading specific notes. There is no mention of use cases, prerequisites, or exclusions, leaving the agent without contextual direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 11 tool updatesv1.0.0
    • First observedcreate_folder
    • First observedcreate_note
    • First observeddelete_folder
    • First observeddelete_note
    • First observededit_folder
    • First observededit_note
    • First observedlist_notebooks
    • First observedread_multinote
    • First observedread_note
    • First observedread_notebook
    • First observedsearch_notes

TDQS

A3.5/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose with no ambiguity. Tools are organized around specific resources (folders/notebooks, notes) and actions (create, delete, edit, list, read, search), making it easy for an agent to select the right tool for any task.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern throughout (e.g., create_folder, delete_note, edit_note, list_notebooks). All tools use snake_case and clear, descriptive verbs that match their actions precisely.

Tool Count5/5

With 11 tools, this server is well-scoped for managing Joplin notes and notebooks. Each tool earns its place by covering essential CRUD operations and additional utilities like search and multi-note reading, without being overwhelming or too sparse.

Completeness5/5

The toolset provides complete CRUD/lifecycle coverage for both folders/notebooks and notes, including create, read, edit, delete, list, and search operations. There are no obvious gaps, ensuring agents can handle all core workflows without dead ends.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A MCP server for Joplin note-taking application that enables interaction with Joplin notes through the web clipper API, supporting notebook hierarchy and running in Docker.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP 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.
    9
    MIT

Latest Blog Posts

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/jordanburke/joplin-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server