https://github.com/alondmnt/joplin-mcp

MCP server for the Joplin note taking app

https://github.com/alondmnt/joplin-mcp

Science Score: 26.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (11.9%) to scientific vocabulary

Keywords

mcp mcp-server note-taking
Last synced: 5 months ago · JSON representation

Repository

MCP server for the Joplin note taking app

Basic Info
  • Host: GitHub
  • Owner: alondmnt
  • License: mit
  • Language: Python
  • Default Branch: main
  • Homepage:
  • Size: 526 KB
Statistics
  • Stars: 12
  • Watchers: 2
  • Forks: 2
  • Open Issues: 4
  • Releases: 6
Topics
mcp mcp-server note-taking
Created 8 months ago · Last pushed 6 months ago
Metadata Files
Readme Changelog License

README.md

Joplin MCP Server

A FastMCP-based Model Context Protocol (MCP) server for Joplin note-taking application via its Python API joppy, enabling AI assistants to interact with your Joplin notes, notebooks, and tags through a standardized interface.

Table of Contents

What You Can Do

This MCP server provides 21 optimized tools for comprehensive Joplin integration:

Note Management

  • Find & Search: find_notes, find_notes_with_tag, find_notes_in_notebook, get_all_notes
  • CRUD Operations: get_note, get_links, create_note, update_note, delete_note

Notebook Management

  • Organize: list_notebooks, create_notebook, update_notebook, delete_notebook

Tag Management

  • Categorize: list_tags, create_tag, update_tag, delete_tag, get_tags_by_note
  • Link: tag_note, untag_note

System

  • Health: ping_joplin

Quick Start

1. Configure Joplin

  1. Open Joplin DesktopToolsOptionsWeb Clipper
  2. Enable the Web Clipper service
  3. Copy the Authorization token

2. Choose Your AI Client

Option A: Claude Desktop (Online, Commercial, Automated Setup)

Run the automated installer:

```bash

Install and configure everything automatically

pip install joplin-mcp joplin-mcp-install ```

This script will: - Configure your Joplin API token
- Set tool permissions (Create/Update/Delete) - Set up Claude Desktop automatically - Test the connection

After setup, restart Claude Desktop and you're ready to go!

"List my notebooks" or "Create a note about today's meeting"

Option B: Jan AI (Local AI models)

  1. Install Jan AI from https://jan.ai

  2. Add MCP Server in Jan's interface:

    • Open Jan AI
    • Go to SettingsExtensionsModel Context Protocol
    • Click Add MCP Server
    • Configure:
      • Name: joplin
      • Command: uvx joplin-mcp (requires uv installed)
      • Environment Variables:
      • JOPLIN_TOKEN: your_joplin_api_token_here
    • Enable the server
  3. Start chatting with access to your Joplin notes!

B2: Automated Setup (Alternative)

```bash

Install and configure Jan AI automatically (if Jan is already installed)

pip install joplin-mcp joplin-mcp-install ```

This will detect and configure Jan AI automatically, just like Claude Desktop.

"Show me my recent notes" or "Create a project planning note"

Option C: OllMCP (Local AI Models)

For local Ollama models:

Option C1: Auto-discovery (if you set up Claude Desktop first) ```bash

Install ollmcp

pip install ollmcp

Run with auto-discovery (requires existing Claude Desktop config)

ollmcp --auto-discovery --model qwen3:4b ```

Option C2: Manual setup (works independently) ```bash

Install ollmcp

pip install ollmcp

Set environment variable

export JOPLINTOKEN="yourjoplinapitoken_here"

Run with manual server configuration (requires uv installed)

ollmcp --server "joplin:uvx joplin-mcp" --model qwen3:4b ```

Example Usage

Once configured, you can ask your AI assistant:

  • "List all my notebooks" - See your Joplin organization
  • "Find notes about Python programming" - Search your knowledge base
  • "Create a meeting note for today's standup" - Quick note creation
  • "Tag my recent AI notes as 'important'" - Organize with tags
  • "Show me my todos" - Find task items with find_notes(task=True)

Tool Permissions

The setup script offers 3 security levels:

  • Read (always enabled): Browse and search your notes safely
  • Write (optional): Create new notes, notebooks, and tags
  • Update (optional): Modify existing content
  • Delete (optional): Remove content permanently

Choose the level that matches your comfort and use case.


Advanced Configuration

Alternative Installation Methods

Method 1: Traditional pip install

If you don't have uvx or prefer to customize MCP settings:

```bash

Install the package

pip install joplin-mcp

Run the setup script

joplin-mcp-install ```

This method provides the same functionality as uvx joplin-mcp-install but requires a local Python environment.

Method 2: Development Installation

For developers or users who want the latest features:

macOS/Linux: bash git clone https://github.com/alondmnt/joplin-mcp.git cd joplin-mcp ./install.sh

Windows: batch git clone https://github.com/alondmnt/joplin-mcp.git cd joplin-mcp install.bat

Manual Configuration

If you prefer manual setup or the script doesn't work:

Note: uvx runs Python applications without permanent installation (requires uv: pip install uv). For setup/configuration, use traditional pip install as uvx's isolation prevents modifying AI client configs.

1. Create Configuration File

Create joplin-mcp.json in your project directory:

json { "token": "your_api_token_here", "host": "localhost", "port": 41184, "timeout": 30, "verify_ssl": false }

2. Claude Desktop Configuration

Add to your claude_desktop_config.json:

Option A: Using uvx (Zero-install) json { "mcpServers": { "joplin": { "command": "uvx", "args": ["joplin-mcp"], "env": { "JOPLIN_TOKEN": "your_token_here" } } } } Requires uv installed: pip install uv

Option B: Using installed package json { "mcpServers": { "joplin": { "command": "joplin-mcp-server", "env": { "JOPLIN_TOKEN": "your_token_here" } } } }

3. OllMCP Manual Configuration

Option A: Using uvx (Zero-install) ```bash

Set environment variable

export JOPLINTOKEN="yourtoken_here"

Run with manual server configuration

ollmcp --server "joplin:uvx joplin-mcp" --model qwen3:4b `` *Requiresuvinstalled:pip install uv`*

Option B: Using installed package ```bash

Set environment variable

export JOPLINTOKEN="yourtoken_here"

Run with manual server configuration

ollmcp --server "joplin:joplin-mcp-server" --model qwen3:4b ```

4. More Client Configuration Examples

For additional client configurations including different transport options (HTTP, SSE, Streamable HTTP), see client-config.json.example.

This file includes configurations for: - STDIO transport (default, most compatible) - HTTP transport (basic HTTP server mode) - SSE transport (recommended for gemini-cli and OpenAI clients) - Streamable HTTP transport (advanced web clients)

Tool Permission Configuration

Fine-tune which operations the AI can perform by editing your config:

json { "tools": { "create_note": true, "update_note": true, "delete_note": false, "create_notebook": true, "delete_notebook": false, "create_tag": true, "update_tag": false, "delete_tag": false } }

Environment Variables

Alternative to JSON configuration:

bash export JOPLIN_TOKEN="your_api_token_here" export JOPLIN_HOST="localhost" export JOPLIN_PORT="41184" export JOPLIN_TIMEOUT="30"

HTTP Transport Support

The server supports both STDIO and HTTP transports:

```bash

STDIO (default)

joplin-mcp-server

HTTP transport

python runfastmcpserver.py --transport http --port 8000 ```

Claude Desktop HTTP config

json { "mcpServers": { "joplin": { "transport": "http", "url": "http://localhost:8000/mcp" } } }

Configuration Reference

Basic Settings

| Option | Default | Description | |--------|---------|-------------| | token | required | Joplin API authentication token | | host | localhost | Joplin server hostname | | port | 41184 | Joplin Web Clipper port | | timeout | 30 | Request timeout in seconds | | verify_ssl | false | SSL certificate verification |

Tool Permissions

| Option | Default | Description | |--------|---------|-------------| | tools.create_note | true | Allow creating new notes | | tools.update_note | true | Allow modifying existing notes | | tools.delete_note | true | Allow deleting notes | | tools.create_notebook | true | Allow creating new notebooks | | tools.update_notebook | false | Allow modifying notebook titles | | tools.delete_notebook | true | Allow deleting notebooks | | tools.create_tag | true | Allow creating new tags | | tools.update_tag | false | Allow modifying tag titles | | tools.delete_tag | true | Allow deleting tags | | tools.tag_note | true | Allow adding tags to notes | | tools.untag_note | true | Allow removing tags from notes | | tools.find_notes | true | Allow text search across notes (with task filtering) | | tools.find_notes_with_tag | true | Allow finding notes by tag (with task filtering) | | tools.find_notes_in_notebook | true | Allow finding notes by notebook (with task filtering) | | tools.get_all_notes | false | Allow getting all notes (disabled by default - can fill context window) | | tools.get_note | true | Allow getting specific notes | | tools.list_notebooks | true | Allow listing all notebooks | | tools.list_tags | true | Allow listing all tags | | tools.get_tags_by_note | true | Allow getting tags for specific notes | | tools.ping_joplin | true | Allow testing server connectivity |

Content Exposure (Privacy Settings)

| Option | Default | Description | |--------|---------|-------------| | content_exposure.search_results | "preview" | Content visibility in search results: "none", "preview", "full" | | content_exposure.individual_notes | "full" | Content visibility for individual notes: "none", "preview", "full" | | content_exposure.listings | "none" | Content visibility in note listings: "none", "preview", "full" | | content_exposure.max_preview_length | 300 | Maximum length of content previews (characters) |

Project Structure

  • run_fastmcp_server.py - FastMCP server launcher
  • src/joplin_mcp/ - Main package directory
    • fastmcp_server.py - Server implementation with 21 tools and Pydantic validation types
    • config.py - Configuration management
    • server.py - Legacy server implementation
    • ui_integration.py - UI integration utilities
  • docs/ - Documentation (troubleshooting, privacy controls, enhancement proposals)
  • tests/ - Test suite

Testing

Test your connection:

```bash

For pip install

joplin-mcp-server

For development

python runfastmcpserver.py ```

You should see: Starting Joplin FastMCP Server... Successfully connected to Joplin! Found X notebooks, Y notes, Z tags FastMCP server starting... Available tools: 21 tools ready

Complete Tool Reference

| Tool | Permission | Description | |------|------------|-------------| | Finding Notes | | | | find_notes | Read | Full-text search across all notes (supports task filtering) | | find_notes_with_tag | Read | Find notes with specific tag (supports task filtering) | | find_notes_in_notebook | Read | Find notes in specific notebook (supports task filtering) | | get_all_notes | Read | Get all notes, most recent first (disabled by default) | | get_note | Read | Get specific note by ID | | get_links | Read | Extract links to other notes from a note | | Managing Notes | | | | create_note | Write | Create new notes | | update_note | Update | Modify existing notes | | delete_note | Delete | Remove notes | | Managing Notebooks | | | | list_notebooks | Read | Browse all notebooks | | create_notebook | Write | Create new notebooks | | update_notebook | Update | Modify notebook titles | | delete_notebook | Delete | Remove notebooks | | Managing Tags | | | | list_tags | Read | View all available tags | | create_tag | Write | Create new tags | | update_tag | Update | Modify tag titles | | delete_tag | Delete | Remove tags | | get_tags_by_note | Read | List tags on specific note | | Tag-Note Relationships | | | | tag_note | Update | Add tags to notes | | untag_note | Update | Remove tags from notes | | System Tools | | | | ping_joplin | Read | Test connectivity |

Owner

  • Name: Alon Diament Carmel
  • Login: alondmnt
  • Kind: user
  • Company: @PhenoAI

computational biologist & data scientist, PhD

GitHub Events

Total
  • Create event: 6
  • Issues event: 4
  • Release event: 5
  • Watch event: 8
  • Issue comment event: 5
  • Push event: 24
  • Pull request event: 1
Last Year
  • Create event: 6
  • Issues event: 4
  • Release event: 5
  • Watch event: 8
  • Issue comment event: 5
  • Push event: 24
  • Pull request event: 1

Issues and Pull Requests

Last synced: 5 months ago

All Time
  • Total issues: 3
  • Total pull requests: 2
  • Average time to close issues: about 18 hours
  • Average time to close pull requests: N/A
  • Total issue authors: 1
  • Total pull request authors: 1
  • Average comments per issue: 0.0
  • Average comments per pull request: 0.5
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 3
  • Pull requests: 2
  • Average time to close issues: about 18 hours
  • Average time to close pull requests: N/A
  • Issue authors: 1
  • Pull request authors: 1
  • Average comments per issue: 0.0
  • Average comments per pull request: 0.5
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • alondmnt (3)
Pull Request Authors
  • casistack (2)
Top Labels
Issue Labels
enhancement (3)
Pull Request Labels

Packages

  • Total packages: 1
  • Total downloads:
    • pypi 145 last-month
  • Total dependent packages: 0
  • Total dependent repositories: 0
  • Total versions: 6
  • Total maintainers: 1
pypi.org: joplin-mcp

Model Context Protocol (MCP) server for Joplin note-taking application

  • Homepage: https://github.com/alondmnt/joplin-mcp
  • Documentation: https://github.com/alondmnt/joplin-mcp/blob/main/README.md
  • License: MIT License Copyright (c) 2025 Alon Diament Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  • Latest release: 0.3.1
    published 7 months ago
  • Versions: 6
  • Dependent Packages: 0
  • Dependent Repositories: 0
  • Downloads: 145 Last month
Rankings
Dependent packages count: 8.9%
Average: 29.4%
Dependent repos count: 50.0%
Maintainers (1)
Last synced: 6 months ago

Dependencies

pyproject.toml pypi
  • fastmcp >=2.0.0
  • httpx >=0.24.0
  • joppy >=1.0.0
  • mcp >=1.0.0
  • pydantic >=2.0.0
  • typing-extensions >=4.0.0
requirements.txt pypi
  • PyYAML >=6.0.0
  • black >=23.0.0
  • coverage >=7.0.0
  • fastmcp >=2.0.0
  • httpx >=0.24.0
  • joppy >=1.0.0
  • mcp >=1.0.0
  • mypy >=1.0.0
  • pre-commit >=3.0.0
  • pydantic >=2.0.0
  • pytest >=7.0.0
  • pytest-asyncio >=0.21.0
  • pytest-mock >=3.10.0
  • ruff >=0.1.0
  • typing-extensions >=4.0.0