Joplin MCP Server
Enables full note management in Joplin including searching, creating, reading, updating, and deleting notes, as well as importing markdown files and organizing notes in folders.
Click on "Install 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 MCP Serversearch for notes about meeting minutes from last week"
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 (MCP) Server for Joplin that enables note access through the Model Context Protocol. Perfect for integration with AI assistants like Claude.
β¨ Features
π Search Notes: Full-text search across all notes
π Read Notes: Retrieve individual notes
βοΈ Edit Notes: Create new notes and update existing ones
ποΈ Delete Notes: Move notes to trash or delete permanently
π₯ Markdown Import: Import markdown files as notes
π€ AI Integration: Seamless integration with Claude and other MCP-capable AI assistants
π Installation
Prerequisites
Python 3.10 or higher
Joplin Desktop with Web Clipper Service enabled
uv (Python package manager)
# Clone repository
git clone https://github.com/dweigend/joplin-mcp.git
cd joplin-mcp
# Create and activate virtual environment
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
```bash
uv pip install -e .βοΈ Configuration
Joplin API Token
Open Joplin Desktop
Go to Tools -> Options -> Web Clipper
Enable the Web Clipper Service
Copy the API Token
Create a .env file in the project directory:
JOPLIN_TOKEN=your_api_token_hereClaude Desktop Setup
Install Claude Desktop
Download Claude Desktop
Ensure you have the latest version (Menu: Claude -> Check for Updates...)
Configure MCP Server
{ "mcpServers": { "joplin": { "command": "/PATH/TO/UV/uv", "args": [ "--directory", "/PATH/TO/YOUR/PROJECT/joplin_mcp", "run", "src/mcp/joplin_mcp.py" ] } } }Replace
/PATH/TO/UV/uvwith the absolute path to your uv installationFind the path with:
which uvExample macOS:
/Users/username/.local/bin/uvExample Windows:
C:\Users\username\AppData\Local\Microsoft\WindowsApps\uv.exe
Replace
/PATH/TO/YOUR/PROJECT/joplin_mcpwith the absolute path to your project
Important: Claude Desktop needs the full path to
uvas it cannot access shell environment variables.
π οΈ Available Tools
search_notes
Search for notes in Joplin.
Parameters:
query(string): Search querylimit(int, optional): Maximum number of results (default: 100)
get_note
Retrieve a specific note by its ID.
Parameters:
note_id(string): ID of the note
create_note
Create a new note.
Parameters:
title(string): Note titlebody(string, optional): Note content in Markdownparent_id(string, optional): ID of parent folderis_todo(boolean, optional): Whether this is a todo item
update_note
Update an existing note.
Parameters:
note_id(string): ID of note to updatetitle(string, optional): New titlebody(string, optional): New contentparent_id(string, optional): New parent folder IDis_todo(boolean, optional): New todo status
delete_note
Delete a note.
Parameters:
note_id(string): ID of note to deletepermanent(boolean, optional): If true, permanently delete the note
import_markdown
Import a markdown file as a new note.
Parameters:
file_path(string): Path to the markdown file
π§ͺ Development
Debug Mode
To start the server in debug mode:
MCP_LOG_LEVEL=debug mcp dev src/mcp/joplin_mcp.pyThis starts the MCP Inspector at http://localhost:5173 where you can test the tools.
π License
MIT License - Copyright (c) 2025 David Weigend
π€ Author
David Weigend
Website: weigend.studio
GitHub: @dweigend
π€ Contributing
Contributions, issues and feature requests are welcome! Visit the issues page.
Available Tools
6 toolscreate_noteB
Create a new note in Joplin.
Args:
args: Note creation parameters
title: Note title
body: Note content in Markdown (optional)
parent_id: ID of parent folder (optional)
is_todo: Whether this is a todo item (optional)
Returns:
Dictionary containing the created note data
| Name | Required | Description | Default |
|---|---|---|---|
| args | 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 behavioral disclosure. It states the tool creates a note but does not mention permissions required, whether the operation is idempotent, error handling, or rate limits. For a mutation tool, this lack of behavioral context is a significant gap, though it doesn't contradict annotations.
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 appropriately sized and front-loaded, starting with the core purpose. The structured 'Args' and 'Returns' sections are efficient, though 'args: Note creation parameters' is slightly redundant. Every sentence adds value, making it concise with minimal waste.
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 complexity (a mutation with 1 parameter but nested properties), no annotations, and no output schema, the description is moderately complete. It covers parameter semantics well but lacks behavioral details and return value specifics. For a creation tool, it should ideally mention what 'created note data' includes or error cases, leaving room for improvement.
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 description adds substantial meaning beyond the input schema, which has 0% schema description coverage. It explains each parameter's purpose (e.g., 'Note title', 'Note content in Markdown'), clarifies optionality, and provides context like 'ID of parent folder'. This compensates well for the schema's lack of descriptions, though it could detail format constraints (e.g., Markdown specifics).
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 specific action ('Create a new note') and resource ('in Joplin'), distinguishing it from sibling tools like delete_note, get_note, update_note, search_notes, and import_markdown. It precisely identifies the tool's function without being vague or tautological.
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 like update_note or import_markdown. It lacks context about prerequisites, such as whether a parent folder must exist, or exclusions, such as when not to create a note. This absence leaves the agent without usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_noteC
Delete a note from Joplin.
Args:
note_id: ID of note to delete
permanent: If True, permanently delete the note
Returns:
Dictionary containing the operation status
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | ||
| permanent | No |
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 behavioral disclosure. It mentions the 'permanent' parameter and return format, but lacks critical details: it doesn't specify if deletion is reversible, what permissions are required, whether it affects linked resources, or error conditions. For a destructive operation, this leaves significant gaps.
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 well-structured with clear sections for Args and Returns, and each sentence is purposeful. It could be slightly more concise by integrating the purpose into the Args section, but overall it avoids redundancy and is easy to parse.
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 complexity of a deletion tool with no annotations and no output schema, the description is insufficient. It doesn't cover behavioral aspects like side effects, error handling, or return value specifics, which are crucial for safe invocation. The tool's destructive nature demands more comprehensive guidance.
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. It explains both parameters ('note_id' and 'permanent'), adding meaning beyond the bare schema. However, it doesn't detail format constraints for 'note_id' or clarify the implications of 'permanent' beyond the basic boolean choice, leaving room for improvement.
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 verb ('Delete') and resource ('a note from Joplin'), making the purpose unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'update_note' or 'create_note' beyond the obvious action difference, 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.
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. For example, it doesn't mention if this should be used instead of 'update_note' for removal scenarios, or if there are prerequisites like checking note existence first. The description only states what it does, not when to apply it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_noteC
Get a specific note by ID.
Args:
note_id: ID of the note to retrieve
Returns:
Dictionary containing the note data
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | 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 behavioral disclosure. It states the tool retrieves a note, implying a read-only operation, but doesn't mention permissions, error handling (e.g., if ID is invalid), or performance aspects. It adds minimal context beyond the basic action, leaving gaps in understanding how it behaves.
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 appropriately sized and front-loaded, with the main purpose stated first. The 'Args' and 'Returns' sections add structure but are concise. Every sentence contributes, though the 'Returns' section could be more informative, keeping it efficient 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?
Given the tool's low complexity (1 parameter, no output schema, no annotations), the description is minimally complete. It covers the basic operation and parameter, but lacks details on usage, behavior, and output specifics. It's adequate for a simple retrieval tool but has clear gaps in providing full context.
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 description coverage is 0%, so the description must compensate. It adds meaning by explaining that 'note_id' is the 'ID of the note to retrieve', which clarifies the parameter's purpose. However, it doesn't provide details like format, constraints, or examples, only basic semantics, resulting in a baseline score.
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 ('Get') and resource ('note'), specifying it retrieves a note by ID. It distinguishes from siblings like 'create_note' or 'search_notes' by focusing on retrieval of a specific item, though it doesn't explicitly contrast with 'update_note' or 'delete_note' in terms of operation type.
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. It mentions retrieving by ID but doesn't specify contexts like needing a known ID, or when to prefer 'search_notes' for unknown IDs. No exclusions or prerequisites are stated, leaving usage unclear relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_markdownC
Import a markdown file as a new note.
Args:
args: Import parameters
file_path: Path to the markdown file
Returns:
Dictionary containing the created note data
| Name | Required | Description | Default |
|---|---|---|---|
| args | 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 behavioral disclosure. It states the tool creates a new note, implying a write operation, but doesn't cover critical aspects like permissions required, whether it overwrites existing notes, error handling for invalid files, or rate limits. This leaves significant 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, followed by structured sections for args and returns. It avoids unnecessary fluff, but the 'Args' and 'Returns' sections could be more integrated into the flow rather than bullet-like, and some redundancy exists (e.g., 'args: Import parameters' is somewhat tautological).
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 complexity (a write operation with no annotations and no output schema), the description is insufficient. It lacks details on the return value (only mentions 'Dictionary containing the created note data' without structure), error cases, and how it interacts with sibling tools. For a mutation tool, this leaves the agent under-informed.
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. It adds value by explaining that 'file_path' is the 'Path to the markdown file', which clarifies the parameter's purpose beyond the schema's bare 'string' type. However, it doesn't detail format constraints (e.g., absolute vs. relative paths, file extensions), so it only partially addresses the coverage gap.
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 ('Import a markdown file') and the outcome ('as a new note'), which is specific and unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'create_note' or 'update_note', which might also create or modify notes, so it doesn't reach the highest 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 provides no guidance on when to use this tool versus alternatives like 'create_note' or 'update_note'. It mentions the action but doesn't specify prerequisites (e.g., file must exist), exclusions, or contextual usage, leaving the agent with minimal direction.
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.
Args:
args: Search parameters
query: Search query string
limit: Maximum number of results (default: 100)
Returns:
Dictionary containing search results
| Name | Required | Description | Default |
|---|---|---|---|
| args | Yes |
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 of behavioral disclosure. While it mentions the tool returns a 'Dictionary containing search results', it doesn't specify what that dictionary contains (e.g., note IDs, titles, content snippets), whether results are paginated, or any performance considerations like rate limits. For a search tool with zero annotation coverage, this leaves critical behavioral traits unclear.
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 appropriately sized and front-loaded, starting with the core purpose. The Args and Returns sections are structured clearly, though the 'args' parameter could be more directly explained. There's minimal waste, but the nested parameter explanation could be slightly more concise.
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 complexity (search functionality with parameters), lack of annotations, and no output schema, the description is incomplete. It doesn't explain the return value structure, error handling, or how results are ordered/filtered. For a tool that likely returns multiple results, this leaves too much ambiguity for effective use.
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 description adds some parameter semantics beyond the input schema, which has 0% description coverage. It explains that 'args' contains 'Search parameters' and details 'query' as a 'Search query string' and 'limit' with a default of 100. However, it doesn't clarify the query syntax (e.g., wildcards, operators) or what 'limit' applies to (e.g., per page, total results), leaving gaps in understanding.
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: 'Search for notes in Joplin.' This specifies the verb ('Search') and resource ('notes in Joplin'), making it immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_note' or 'import_markdown', 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.
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 scenarios where search is preferable over 'get_note' for retrieving specific notes or how it complements other tools like 'create_note' or 'update_note'. This lack of contextual usage advice is a significant gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteB
Update an existing note in Joplin.
Args:
args: Note update parameters
note_id: ID of note to update
title: New title (optional)
body: New content (optional)
parent_id: New parent folder ID (optional)
is_todo: New todo status (optional)
Returns:
Dictionary containing the updated note data
| Name | Required | Description | Default |
|---|---|---|---|
| args | 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 behavioral disclosure. It states the tool updates a note and returns updated data, but lacks critical details: it doesn't mention authentication needs, rate limits, whether updates are partial or full (optional params suggest partial), error handling (e.g., invalid note_id), or side effects (e.g., timestamp changes). The description covers basic intent but misses operational context essential for safe use.
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 well-structured and appropriately sized. It front-loads the purpose in the first sentence, followed by organized sections for Args and Returns. Each sentence earns its place by providing essential information without redundancy. Minor improvements could include integrating parameter details more seamlessly, but overall it's efficient and clear.
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 complexity (mutation with 5 parameters), lack of annotations, and no output schema, the description is moderately complete. It covers the basic operation and parameters but lacks behavioral context (e.g., permissions, errors) and output details (only mentions 'dictionary containing the updated note data' without structure). For a mutation tool, this leaves gaps that could hinder effective use by an agent.
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. It adds significant value by listing all parameters (note_id, title, body, parent_id, is_todo) with brief semantics (e.g., 'ID of note to update,' 'New title (optional)'), clarifying their roles beyond schema titles. However, it doesn't explain parameter interactions (e.g., if parent_id changes folder location) or constraints (e.g., format of note_id), leaving some gaps.
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: 'Update an existing note in Joplin.' It specifies the verb ('Update') and resource ('note'), and distinguishes it from siblings like create_note, delete_note, and get_note by focusing on modification rather than creation, deletion, or retrieval. However, it doesn't explicitly differentiate from other update-like operations (if any exist beyond these siblings).
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. It doesn't mention prerequisites (e.g., needing an existing note_id), compare it to create_note for new notes or get_note for viewing, or specify scenarios where updating is appropriate (e.g., editing content vs. moving folders). Usage is implied by the action 'update,' but no explicit context or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose with no overlap: create_note, get_note, update_note, delete_note cover the full CRUD lifecycle, while import_markdown handles file import and search_notes handles searching. The descriptions reinforce these distinct roles, making tool selection unambiguous.
All tools follow a consistent verb_noun naming pattern (e.g., create_note, delete_note, get_note, import_markdown, search_notes, update_note). The pattern is uniform throughout, using snake_case and clear action verbs aligned with each tool's function.
With 6 tools, this server is well-scoped for note management in Joplin. It provides essential operations (CRUD, search, import) without being overly complex or sparse. Each tool earns its place, covering core workflows efficiently.
The tool set offers complete coverage for note management: create, read, update, delete, search, and import functionalities. There are no obvious gapsβagents can perform all typical note-related operations without dead ends or workarounds.
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Create, search, and update notes in an xNotepad AI notebook, with semantic search and AI Q&A.
AI access to your aNotepad online notes: read, search, write, and organize via 22 tools.
Read and write your Fresh Jots notes from Claude, Cursor, and any MCP client.
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/MCP-Mirror/dweigend_joplin-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server