joplin-mcp
Provides tools for browsing, searching, creating, updating, and deleting notes and notebooks in Joplin, as well as downloading attachments and extracting OCR text from images/PDFs.
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-mcpSearch my notes for meeting notes"
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 Model Context Protocol server that turns your Joplin notebook into a tool an LLM can actually use — read, search, write, and organize notes, and pull OCR'd text straight out of your screenshots.
What is this?
Joplin ships a local Web Clipper / Data API (http://127.0.0.1:41184) that can drive the whole app — notes, notebooks, tags, attachments — over plain HTTP.
This project wraps that API as an MCP server, so any MCP-compatible client (Claude Code, Claude Desktop, or your own agent) can:
Browse your notebook tree and list notes inside any notebook
Read a note's full Markdown body
Full-text search across your entire Joplin database
Create, rename, move, and delete both notes and notebooks
Download an embedded attachment (screenshot, PDF, PoC file, ...) to disk so it can be viewed
Pull OCR-extracted text out of an image/PDF attachment — read what's inside a screenshot without ever opening it
No plugin needs to be installed inside Joplin itself — everything runs through the Data API that's already built in.
Related MCP server: Joplin MCP Server
Features
Tool | What it does |
| List every notebook (folder), with |
| Create a new notebook, optionally nested under a parent |
| Rename and/or move a notebook to a different parent |
| Delete a notebook, including everything inside it (moves it to Joplin's trash) |
| List notes, optionally scoped to one notebook, paginated |
| Full-text search using Joplin's native search syntax ( |
| Fetch a note's full Markdown body + metadata |
| Create a new note (title, Markdown body, target notebook, to-do flag) |
| Rename, edit, and/or move a note (also edits body / to-do status) |
| Delete a note (moves it to Joplin's trash) |
| Get metadata (mime type, extension, size) for an attached file |
| Download an attachment's raw bytes to a local path so it can be opened/viewed |
| Read back the text Joplin's built-in OCR engine recognized inside an image/PDF attachment |
Requirements
Joplin desktop, running, with the Web Clipper service enabled
A Joplin Web Clipper authorization token
Python 3.12+
uv (recommended) — or plain
pip
Installation
git clone https://github.com/<your-username>/joplin-mcp.git
cd joplin-mcp
# with uv (recommended, uses the committed uv.lock for reproducible installs)
uv sync
# — or with plain pip —
pip install "httpx>=0.28.1" "mcp[cli]>=1.28.1"1. Enable the Web Clipper service in Joplin
Joplin → Tools → Options → Web Clipper → turn it on. Note the port shown (default 41184).
2. Grab your access token
Same screen → "Advanced options" → "Copy token". Keep this secret — anyone with it has full read/write access to your entire notebook.
3. (Optional) Enable OCR, if you want get_resource_ocr_text to return anything
Joplin → Tools → Options → General → enable "Enable document text extraction (OCR)". Joplin needs some time to process existing attachments after you turn this on — check the ocr_status field returned by the tool (0/1 = queued, 2 = processing, 3 = done, 4 = error, see ocr_error).
Configuration
The server reads two environment variables:
Variable | Required | Default | Description |
| ✅ yes | — | Your Web Clipper authorization token |
| no |
| Base URL of the Joplin Web Clipper API |
Usage with an MCP client
Add this to your client's MCP config (e.g. .mcp.json for Claude Code, or the Claude Desktop config file):
{
"mcpServers": {
"joplin": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/joplin-mcp", "python", "server.py"],
"env": {
"JOPLIN_TOKEN": "<your-joplin-web-clipper-token>",
"JOPLIN_BASE_URL": "http://127.0.0.1:41184"
}
}
}
}Running without
uv? Swapcommand/argsfor"command": "python", "args": ["/absolute/path/to/joplin-mcp/server.py"]instead.
Restart/reconnect your MCP client and the joplin tools should show up.
Example prompts once connected
"List my Joplin notebooks."
"Search my notes for 'react devtools'."
"Pull up the note titled X and summarize it."
"Download the screenshot attached to this note so I can look at it."
"What text was OCR'd out of that PDF I scanned last week?"
Security notes
The Web Clipper token grants full read/write access to your entire Joplin database — treat it like a password. Never commit it to a repo.
The server only talks to
127.0.0.1by default (your local Joplin instance) — it's not designed to be exposed over a network.delete_notemoves notes to Joplin's trash (recoverable), unless you've disabled the trash in Joplin's settings.
Known limitations / roadmap
This covers the day-to-day note/notebook/attachment workflow, but doesn't (yet) wrap every corner of Joplin's Data API:
❌ Tags — no list/create/assign tag support
⚠️ Resources — no upload/delete of attachments (only read + OCR text)
❌ Note revision history
PRs welcome if you need one of these.
Project structure
joplin-mcp/
├── server.py # the MCP server — all tools live here
├── pyproject.toml # project metadata + dependencies
├── uv.lock # locked dependency versions (uv)
├── .python-version # pinned Python version for uv
├── .gitignore
├── LICENSE
└── README.mdLicense
MIT — see LICENSE.
Available Tools
13 toolscreate_noteA
Create a new note.
Args:
title: Note title.
body: Note body in Markdown.
notebook_id: Target notebook (folder) id. If omitted, Joplin uses the
currently selected notebook in the app.
is_todo: If true, create the note as a to-do item.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| title | Yes | ||
| is_todo | No | ||
| notebook_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 discloses the notebook_id default ('currently selected notebook in the app') and the is_todo behavior, but it does not mention side effects, return values, permissions, or error behavior. For a mutation tool, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the one-line purpose and then lists arguments in a clean, scannable format. Every sentence serves a purpose, with no extraneous wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create operation with an output schema, the description adequately explains parameter semantics and defaults. It lacks usage guidance and behavioral details, but these are separate dimensions. Overall, it is sufficiently complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It explains body as 'Markdown', notebook_id's default behavior, and is_todo's effect. However, title is described only as 'Note title,' which adds little beyond the schema's property name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a new note,' a specific verb+resource statement that clearly distinguishes this tool from siblings like create_notebook and update_note. It unambiguously states the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'Create' and the note-related context, but the description does not explicitly state when to use this tool versus alternatives like update_note or provide any exclusions. No alternative tools are referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_notebookA
Create a new notebook (folder). Use parent_id to nest it under an existing notebook, e.g. a client/project notebook.
Args:
title: Notebook title.
parent_id: Parent notebook (folder) id to nest under, if any.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| parent_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It describes the action but does not disclose permissions, side effects, or behavior on invalid parent_id. It is minimal beyond the basic create operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-loaded with the action, followed by an Args list. The Args list is somewhat repetitive with the schema but adds minimal value; still concise overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-param create operation with output schema, the description adequately covers purpose and parameters, but lacks explicit guidance on when to use alternatives or error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description explains the purpose of each parameter beyond the schema: 'title: Notebook title' and 'parent_id: Parent notebook (folder) id to nest under, if any.' The example clarifies the nesting behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new notebook (folder)' with a specific verb and resource, and adds the nesting use case ('Use parent_id to nest it under an existing notebook, e.g. a client/project notebook'). This distinguishes it from sibling tools like create_note and update_notebook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to nest under an existing notebook with parent_id and gives an example. However, it doesn't explicitly contrast with alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_noteA
Delete a note by id. In Joplin this moves the note to the trash (or permanently deletes it if the trash is disabled in the app's settings).
Args:
note_id: The Joplin note id to delete.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing side effects. It explicitly states that the note is moved to trash or permanently deleted depending on the app's settings, which is a key behavioral nuance beyond simply 'deletes'. This is valuable transparency, though it does not cover error handling or irreversibility in all cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two sentences and a minimal Args block. It front-loads the action, then adds the behavioral caveat, and uses no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete tool, the description covers the action, the side effect (trash/permanent), and the parameter. It does not mention error behavior if the note does not exist, but given the output schema exists and the tool is simple, the description is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides no description for note_id (0% coverage). The description compensates by explaining that note_id is 'The Joplin note id to delete', adding semantic meaning beyond the bare string type. It could include more format details, but for a single parameter this is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete a note by id') and the resource (note). It distinguishes from sibling tools like delete_notebook by specifying 'note' rather than 'notebook', and from update_note by clearly indicating deletion rather than modification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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, such as when to prefer update_note or delete_notebook. It does not mention prerequisites or exclusions, leaving the usage context entirely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_notebookA
Delete a notebook by id, including all notes and sub-notebooks inside it. In Joplin this moves the notebook to the trash (or permanently deletes it if the trash is disabled in the app's settings).
Args:
notebook_id: The Joplin notebook (folder) id to delete.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so admirably. It discloses that the notebook moves to trash unless trash is disabled, and it clarifies that all contents are deleted, including sub-notebooks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences plus a brief Args entry. No filler, and the key information is front-loaded. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single parameter and an output schema present, the description adequately covers the tool's behavior and side effects. It explains the deletion cascade and trash behavior, which is sufficient for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema provides no parameter description, the description's Args section fully explains notebook_id as 'The Joplin notebook (folder) id to delete.' This adds crucial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Delete' with resource 'notebook by id' and clarifies the scope by noting it includes all notes and sub-notebooks. This clearly distinguishes it from delete_note and other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool by stating it deletes the notebook along with all contained notes and sub-notebooks, contrasting implicitly with delete_note. However, it does not explicitly name alternatives or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_noteA
Fetch a single note's full content (including body) by id.
Args:
note_id: The Joplin note id.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Fetch' implies a read operation, and specifying 'full content (including body)' adds useful context, but error behavior, authentication needs, and potential side effects are not disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action ('Fetch a single note's full content'), and contains no redundant or extraneous wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an output schema present, the description covers the core purpose and parameter meaning. However, it lacks usage guidance and behavioral edge cases like error handling, so it's not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description explicitly defines note_id as 'The Joplin note id,' adding domain context beyond the schema's type/title. For a single parameter, this is sufficient and adds meaningful semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches a single note's full content including body, using a specific verb and resource. It distinguishes from siblings like list_notes and search_notes by focusing on one note retrieved by ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It doesn't mention that list_notes or search_notes serve different use cases, leaving usage only implied by the phrase 'single note'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resource_fileA
Download a Joplin resource's raw file (e.g. a screenshot embedded in a note) and save it to a local path, so it can then be viewed with a file-reading tool. Call get_resource_info first if you need the mime type to choose the save_path's extension.
Args:
resource_id: The Joplin resource id (from a note body link like ':/<id>').
save_path: Absolute local file path to save the downloaded file to.
| Name | Required | Description | Default |
|---|---|---|---|
| save_path | Yes | ||
| resource_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden. It accurately conveys the download-and-save action and mentions the need for a local path. However, it does not disclose potential side effects (e.g., overwriting existing files, network access, or whether the operation is read-only with respect to the Joplin data). The description is not misleading but is sparse on behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a brief purpose statement followed by a clear parameter list. Every sentence adds value, and the format is easy to scan. The mention of resource_id format is especially helpful without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (two required parameters, no nested objects) and the presence of an output schema (though not shown), the description covers the essentials: what it does, how to get the resource_id, and what save_path should be. It also provides context for integration with file-reading tools. Minor gap: no mention of return behavior, but that may be covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only lists parameter names with no descriptions (0% schema coverage). The description compensates fully by explaining resource_id as the Joplin resource id from a note body link like ':/<id>' and save_path as an absolute local file path. This adds critical meaning and usage examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Download a Joplin resource's raw file... and save it to a local path.' It specifies the resource type and the action (download/save), and distinguishes it from sibling tools like get_resource_info (metadata) and get_resource_ocr_text (text extraction).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: after downloading, the file can be viewed with a file-reading tool. It also suggests calling get_resource_info first when the mime type is needed to choose an extension. It does not explicitly list exclusions or alternatives beyond that prerequisite, but the guidance is practical and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resource_infoA
Fetch metadata for a Joplin resource (an attachment/image embedded in a note body, referenced there as ':/'), including its mime type and file extension. Use this before get_resource_file to pick a sensible file extension for the saved file.
Args:
resource_id: The Joplin resource id.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it clearly conveys that this is a read-only metadata fetch ('Fetch metadata') without side effects. It adds context about the resource referencing format (':/<resource_id>') and what metadata is included (mime type, file extension), providing useful behavioral context beyond a bare 'get information'. It does not explicitly state non-mutation, but the verb 'fetch' strongly implies a safe read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and well-structured, with a purpose sentence, a usage sentence, and a small Args block. The Args section is somewhat redundant with the schema but still adds a one-line definition. Every sentence contributes to understanding the tool's role, though the Args block could be trimmed given the schema already lists the parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: a single required parameter, an output schema (which need not be described), and clear guidance on when to use it. The description provides the essential context (what a resource is, what metadata is returned, and how to use it with get_resource_file), making it complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no description for the single parameter, so the description's mention of 'resource_id: The Joplin resource id' adds a basic definition. More valuably, the description's explanation of the ':/<resource_id>' reference format gives the agent practical guidance on how to find or interpret the resource_id, compensating for the schema's lack of detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch metadata') and a clear resource type ('Joplin resource'), and it distinguishes the tool from siblings by explicitly mentioning that it retrieves metadata like mime type and file extension. The parenthetical about attachment/image with ':/<resource_id>' reference further clarifies the resource concept, setting it apart from get_resource_file and get_resource_ocr_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this before get_resource_file to pick a sensible file extension for the saved file', which clearly states when to use this tool and names the alternative get_resource_file. This gives the agent a concrete scenario and workflow, making the usage guidance highly actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resource_ocr_textA
Fetch the OCR-extracted text for a Joplin resource (e.g. text recognized inside a screenshot or scanned PDF/image attachment), without downloading the file itself. Requires Joplin's built-in OCR feature to be enabled (Options > General > "Enable document text extraction") and to have finished processing the resource.
The returned `ocr_status` is one of: 0=not queued yet, 1=queued/todo,
2=processing, 3=done, 4=error (see `ocr_error` if it failed). If OCR
hasn't finished yet, retry after a short delay.
Note: Joplin also automatically indexes ocr_text for full-text search,
so search_notes may already surface hits found only inside an image via
OCR without needing this tool.
Args:
resource_id: The Joplin resource id (from a note body link like ':/<id>').
| Name | Required | Description | Default |
|---|---|---|---|
| resource_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it excels: it discloses the prerequisite OCR setting, defines all possible ocr_status values (0-4), explains the retry behavior for incomplete processing, and mentions the ocr_error field. It even notes that search_notes may already index OCR text. This goes well beyond a basic read hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is more than a few sentences but each segment earns its place: purpose, prerequisite, status semantics, and search alternative. It is front-loaded with the core purpose and avoids fluff. Slightly long but well-structured with paragraph breaks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description doesn't need to list return fields, yet it still explains the ocr_status codes and ocr_error. It covers prerequisites, retry logic, parameter format, and alternatives, making it complete for an agent to use safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema only says resource_id is a string. The description adds meaningful format guidance: 'from a note body link like ':/<id>''. This helps the agent construct the correct value. While not exhaustive, it compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource: 'Fetch the OCR-extracted text for a Joplin resource' and highlights that it does so 'without downloading the file itself,' distinguishing it from sibling tools like get_resource_file. It also specifies the use case for screenshots/scanned PDFs, leaving no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use context: requires Joplin's OCR feature enabled and processing finished. It also names an alternative, search_notes, and explains when this tool is unnecessary. This is exactly the kind of guidance needed for an agent to choose among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notebooksA
List all Joplin notebooks (folders), with id, title and parent_id.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the Full burden. It transparently states the action (list all) and the exact output fields, making the behavior clear for a simple read-only operation. There are no side effects or hidden behaviors implied, though it does not explicitly state that it is non-mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the verb and resource, with zero wasted words. Every element adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool with a low complexity, the description fully covers what the tool does and the data it returns. The presence of an output schema handles detailed return structure, so no further information is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4 as per the guidelines. The description adds semantic meaning by specifying the return fields (id, title, parent_id), which is sensible for a parameterless list operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'all Joplin notebooks (folders)' and explicitly mentions the fields returned (id, title, parent_id). This clearly distinguishes it from sibling tools like create_notebook, delete_notebook, and list_notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context that this tool returns all notebooks in the system, which implicitly indicates it is the correct choice for reading the full notebook list. It does not explicitly name alternatives or exclusions, but the purpose is unambiguous given the sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesA
List notes, optionally filtered to a single notebook.
Args:
notebook_id: If set, only return notes inside this notebook (folder id).
limit: Max notes per page (Joplin caps this at 100).
page: Page number, starting at 1.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| notebook_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description adds behavioral context by noting the Joplin limit cap on limit and that pages start at 1. It also clarifies notebook_id as a folder id. However, it does not explicitly state read-only status or other effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear summary followed by a three-line Args bullet list, with no extraneous content. The information is front-loaded and each line adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values are covered externally. The description covers main functionality and parameter constraints, though it could benefit from an explicit read-only note given lack of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The Args section explains notebook_id as a folder id filter, limit with Joplin's 100 cap, and page starting at 1, adding semantics beyond the raw schema types. Given 0% schema coverage, this fully compensates for all three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' with resource 'notes' and clarifies optional notebook filtering. This clearly distinguishes it from siblings like get_note (single note) and search_notes (text search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing notes, but does not explicitly discuss alternatives or exclusions. The optional notebook filter provides context, but there is no guidance on when to prefer search_notes or get_note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesA
Full-text search notes using Joplin's search syntax (e.g. 'title:foo', 'tag:bar').
Args:
query: Search query string.
limit: Max results per page (Joplin caps this at 100).
page: Page number, starting at 1.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden of behavioral disclosure. It adds useful information about Joplin's pagination cap ('caps this at 100') and page numbering, but it does not explicitly state that this is a read-only operation or mention authentication/rate limits. Being a 'search' implies non-destructive behavior, but the description misses an explicit safety statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose followed by a bulleted list of parameters with clear definitions. Every sentence adds value—no fluff or redundancy. The key information is front-loaded, making it easy to scan quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 params, pagination, query syntax), the description covers the essential elements: what is searched, syntax examples, pagination behavior, and parameter defaults. An output schema exists, so return types need not be described. It lacks details about error handling or auth requirements, but those are not critical for a search tool. Overall, it is sufficiently complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides minimal semantics beyond types and defaults, while the description's Args section adds meaningful meaning: 'query: Search query string', 'limit: Max results per page (Joplin caps this at 100)', 'page: Page number, starting at 1'. It also gives examples of valid query syntax, which significantly enhances parameter understanding beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Full-text search notes using Joplin's search syntax' with concrete examples ('title:foo', 'tag:bar'). This distinguishes it from sibling tools like list_notes (no full-text search) and get_note (retrieves a single note). The verb 'search' plus the resource 'notes' is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the Joplin search syntax examples, but it does not explicitly state when to use this tool over alternatives like list_notes. There are no exclusionary guidelines or mention of scenarios where one should prefer another tool. The examples provide context but not direct 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteA
Edit an existing note. Only the fields provided are changed.
Args:
note_id: The Joplin note id to edit.
title: New title, if changing it.
body: New Markdown body, if changing it (replaces the whole body).
notebook_id: Move the note to this notebook id, if changing it.
is_todo: Convert to/from a to-do item, if changing it.
todo_completed: Mark a to-do complete/incomplete, if changing it.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| title | No | ||
| is_todo | No | ||
| note_id | Yes | ||
| notebook_id | No | ||
| todo_completed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses key behaviors: partial update semantics, body replacement ('replaces the whole body'), notebook moving, and to-do conversion. It does not address permissions, error handling, or reversibility, but the provided behaviors are genuinely informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact docstring with a clear lead sentence followed by an ordered parameter list. Each line is purposeful and adds information without redundancy; it is appropriately sized and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with six parameters, no annotations, but an output schema, the description thoroughly covers parameter meanings and the key partial-update behavior. It omits explicit error/precondition details, but the presence of an output schema reduces the need to describe return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description compensates excellently by defining each optional parameter's meaning and side effects: 'New title, if changing it,' 'replaces the whole body,' 'Move the note to this notebook id,' 'Convert to/from a to-do item,' and 'Mark a to-do complete/incomplete.' This adds crucial semantics beyond the minimal schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Edit an existing note' and emphasizes 'Only the fields provided are changed,' which distinguishes it from create/delete/get operations. However, it does not explicitly name sibling tools or exclusion contexts, so it falls just short of a perfect clarity score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (edit existing note by ID) and provides guidance on partial updates ('Only the fields provided are changed'), but it lacks explicit when-to-use versus alternatives or any exclusion criteria. No sibling tool comparisons are mentioned, so it is minimally sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_notebookA
Rename and/or move a notebook. Only the fields provided are changed.
Args:
notebook_id: The Joplin notebook (folder) id to edit.
title: New title, if renaming it.
parent_id: New parent notebook id, if moving it. Pass an empty string
to move it to the top level (no parent).
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| parent_id | No | ||
| notebook_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It does add useful context: partial updates and the top-level move behavior via empty string. However, it does not disclose any potential side effects, permission requirements, or reversibility, which would be important for an update operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, starting with a clear one-sentence summary followed by a compact Args section. Every sentence provides necessary information, with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a simple update tool: it covers the parameters, partial-update behavior, and the special parent_id case. An output schema exists, so return values are already. It doesn't explicitly state that notebook_id is required, but that is evident from the schema. It is slightly lacking in not mentioning error conditions, but this is acceptable given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. It explains each parameter's purpose (notebook_id, title, parent_id) and adds critical semantics like using an empty string for parent_id to move to top level. This goes far beyond the bare schema which only lists types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb and resource: 'Rename and/or move a notebook.' This distinguishes it from sibling tools like create_notebook, list_notebooks, and delete_notebook, which have obviously different functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for usage by explaining the partial-update behavior ('Only the fields provided are changed') and the special empty-string case for parent_id. It implicitly indicates this is for editing existing notebooks, but it does not explicitly state when not to use it or point to alternatives.
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.
13 tool updates
v0.1.0- First observed
create_note - First observed
create_notebook - First observed
delete_note - First observed
delete_notebook - First observed
get_note - First observed
get_resource_file - First observed
get_resource_info - First observed
get_resource_ocr_text - First observed
list_notebooks - First observed
list_notes - First observed
search_notes - First observed
update_note - First observed
update_notebook
TDQS
Scored across 13 tools
Each tool targets a distinct resource and action: notebooks (create/list/update/delete), notes (create/get/list/update/delete/search), and resources (info/file/OCR). There is no overlap in purpose, and descriptions clearly distinguish similar operations like get_note vs list_notes.
All tool names follow the same verb_noun pattern in snake_case (e.g., create_notebook, list_notes, get_resource_file). Pluralization is consistent for list operations, and verbs are uniform across resource types.
With 13 tools, the surface is well-scoped for a note-taking domain: full CRUD for notebooks and notes, plus search and resource handling. Each tool serves a clear purpose without unnecessary bloat.
The set covers all core note and notebook operations (create, read, update, delete, list, search), and resource retrieval is handled. Minor gaps exist: no single-notebook getter and no resource listing/deletion, but these are non-critical and agents can work around them.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Hosted knowledge base for ChatGPT and Claude. Your AI searches, reads, writes, and organizes your Markdown notes over MCP: folders with per-folder AI instructions, tags, wiki-links, file attachments, revision history with per-client attribution, and shared team spaces. Remote server with OAuth, so no API keys or local setup. Full MCP access on the free plan.
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
- TaprootOAuthcom.taproothq
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Related MCP Servers
- AlicenseAqualityDmaintenanceA server that enables AI assistants to access and manipulate Joplin notes through the Model Context Protocol, allowing search, reading, editing, and management of notes using natural language.690MIT
- AlicenseNot gradedqualityDmaintenanceMCP 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.9MIT
- AlicenseAqualityAmaintenanceModel Context Protocol (MCP) server for Joplin note-taking app, enabling AI to read, search, and modify notes via sandboxed scripts.2462 npm26Apache 2.0
- FlicenseNot gradedqualityFmaintenanceA Model Context Protocol (MCP) server that gives Claude a persistent personal notebook. Notes are stored on disk as JSON, so they survive restarts and are shared across every tool and resource.-