Skip to main content
Glama
dweigend

Joplin MCP Server

by dweigend
README.md
# ๐Ÿ“ Joplin MCP Server

A Model Context Protocol (MCP) Server for [Joplin](https://joplinapp.org/) that enables note access through the [Model Context Protocol](https://modelcontextprotocol.io). Perfect for integration with AI assistants like Claude.

## โœจ Features

- ๐Ÿ” **Search Notes**: Full-text search across all notes
- ๐Ÿ“š **List Notebooks**: Browse available notebooks and sub-notebooks
- ๐Ÿ—‚๏ธ **Create Notebooks**: Create notebooks and nested sub-notebooks
- ๐Ÿ“– **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](https://joplinapp.org/) with Web Clipper Service enabled
- [uv](https://github.com/astral-sh/uv) (Python package manager)

```bash
# 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

1. Open Joplin Desktop
2. Go to Tools -> Options -> Web Clipper
3. Enable the Web Clipper Service
4. Copy the API Token

Create a `.env` file in the project directory:
```bash
JOPLIN_TOKEN=your_api_token_here
```

### Claude Desktop Setup

1. **Install Claude Desktop**
   - Download [Claude Desktop](https://claude.ai/download)
   - Ensure you have the latest version (Menu: Claude -> Check for Updates...)

2. **Configure MCP Server**
   ```json
   {
     "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/uv` with the absolute path to your uv installation
     - Find the path with: `which uv`
     - Example macOS: `/Users/username/.local/bin/uv`
     - Example Windows: `C:\Users\username\AppData\Local\Microsoft\WindowsApps\uv.exe`
   - Replace `/PATH/TO/YOUR/PROJECT/joplin_mcp` with the absolute path to your project

   **Important**: Claude Desktop needs the full path to `uv` as it cannot access shell environment variables.

## ๐Ÿ› ๏ธ Available Tools

### search_notes
Search for notes in Joplin.

**Parameters:**
- `query` (string): Search query
- `limit` (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

### list_notebooks
List all available notebooks as a tree.

**Parameters:**
- None

### create_notebook
Create a new notebook.

**Parameters:**
- `title` (string): Notebook title
- `parent_id` (string, optional): Parent notebook ID
- `parent_notebook_name` (string, optional): Parent notebook title or full path

### create_note
Create a new note.

**Parameters:**
- `title` (string): Note title
- `body` (string, optional): Note content in Markdown
- `parent_id` (string, optional): ID of parent folder
- `notebook_name` (string, optional): Notebook title or full path such as `Work/Projects`
- `is_todo` (boolean, optional): Whether this is a todo item

### update_note
Update an existing note.

**Parameters:**
- `note_id` (string): ID of note to update
- `title` (string, optional): New title
- `body` (string, optional): New content
- `parent_id` (string, optional): New parent folder ID
- `notebook_name` (string, optional): New notebook title or full path such as `Work/Projects`
- `is_todo` (boolean, optional): New todo status

### delete_note
Delete a note.

**Parameters:**
- `note_id` (string): ID of note to delete
- `permanent` (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
- `parent_id` (string, optional): ID of parent folder
- `notebook_name` (string, optional): Notebook title or full path such as `Work/Projects`

## ๐Ÿงช Development

### Debug Mode

To start the server in debug mode:

```bash
MCP_LOG_LEVEL=debug mcp dev src/mcp/joplin_mcp.py
```

This starts the MCP Inspector at http://localhost:5173 where you can test the tools.

## ๐Ÿ“„ License

[MIT License](LICENSE) - Copyright (c) 2025 David Weigend

## ๐Ÿ‘ค Author

**David Weigend**

* Website: [weigend.studio](https://weigend.studio)
* GitHub: [@dweigend](https://github.com/dweigend)

## ๐Ÿค Contributing

Contributions, issues and feature requests are welcome!
Visit the [issues page](https://github.com/dweigend/joplin-mcp/issues).

TDQS

A3.6/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap: create_note, delete_note, get_note, update_note, search_notes, and import_markdown all target specific operations on notes. An agent can easily distinguish between creation, retrieval, modification, deletion, searching, and importing functions without confusion.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case naming: create_note, delete_note, get_note, update_note, search_notes, and import_markdown. The pattern is predictable throughout, making the tool set easy to navigate and understand.

Tool Count5/5

With 6 tools, the server is well-scoped for note management in Joplin. Each tool earns its place by covering essential CRUD operations (create, read, update, delete), plus useful extras like search and import, without being overly sparse or bloated.

Completeness5/5

The tool set provides complete CRUD and lifecycle coverage for notes in Joplin, including create, read, update, delete, search, and import functionalities. There are no obvious gaps, and agents can perform all core note-related workflows without dead ends.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive