Skip to main content
Glama
alondmnt

Joplin MCP Server

by alondmnt

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

Related MCP server: Joplin MCP Server

What You Can Do

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

Note Management

  • Find & Search: find_notes (supports trash=True for trashed notes), find_notes_with_tag, find_notes_in_notebook, get_all_notes

  • CRUD Operations: get_note, get_note_resources (read OCR text from attached images/PDFs), get_links, create_note, update_note, edit_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

Trash Management

  • Recover: restore_from_trash - Restore soft-deleted notes or notebooks

Import

  • File Import: import_from_file - Import Markdown, HTML, CSV, TXT, JEX files and directories

System

  • Health: ping_joplin

Quick Start

  1. Open Joplin DesktopToolsOptionsWeb Clipper

  2. Enable the Web Clipper service

  3. Copy the Authorization token

  4. Set up your preferred client below

Supported Clients

Any MCP-compatible client should work. Below are the ones with documented setup instructions.

Claude Desktop

Run the automated installer:

# Install and configure everything automatically (pip)
pip install joplin-mcp
joplin-mcp-install

# Or use zero-install with uvx (recommended if you have uv)
uvx --from joplin-mcp joplin-mcp-install

# Optional: pin a specific version/range for stability
uvx --from joplin-mcp==0.4.1 joplin-mcp-install
uvx --from 'joplin-mcp>=0.4,<0.5' 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!

Claude Code

Install the orchestration plugin for smarter tool usage (edit vs update, long-note reading, bulk tagging):

/plugin marketplace add alondmnt/joplin-mcp
/plugin install joplin-mcp

You'll be prompted for your Joplin API token on first use. The skill is invoked automatically when working with Joplin tools, or manually with /joplin.

Jan AI

  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 --from joplin-mcp joplin-mcp-server (requires uv installed)

      • Environment Variables:

        • JOPLIN_TOKEN: your_joplin_api_token_here

    • Enable the server

  3. Start chatting with access to your Joplin notes!

Automated Setup (Alternative)

# 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.

OllMCP (Local Ollama Models)

Auto-discovery (if you set up Claude Desktop first)

# Install ollmcp
pip install ollmcp

# Run with auto-discovery (requires existing Claude Desktop config)
ollmcp --auto-discovery --model qwen3:4b

Manual setup (works independently)

# Install ollmcp
pip install ollmcp

# Set environment variable
export JOPLIN_TOKEN="your_joplin_api_token_here"

# Run with uvx (requires uv installed)
ollmcp --server "joplin:uvx --from joplin-mcp joplin-mcp-server" --model qwen3:4b

# Or with an installed package (pip install joplin-mcp)
ollmcp --server "joplin:joplin-mcp-server" --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 4 permission 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.

Notebook Allowlist

Restrict AI access to specific notebooks using pattern-based access control. When configured, only matching notebooks (and their contents) are visible — all other notebooks are hidden.

Quick Setup

JSON config (joplin-mcp.json):

{
  "token": "your_token",
  "notebook_allowlist": ["Work", "Projects/Public"]
}

Environment variable:

export JOPLIN_NOTEBOOK_ALLOWLIST="Work,Projects/Public"

Pattern Syntax

Patterns use gitignore/gitwildmatch semantics:

Pattern

Matches

Example

Work

Exact notebook name (and all children)

Work, Work/Tasks, Work/Notes

Projects/*

Direct children of Projects

Projects/Alpha, Projects/Beta

Projects/**

All descendants recursively

Projects/Alpha/Tasks/Q1

!Projects/Secret

Exclude (negate) a specific path

Everything in Projects except Secret

Negation patterns always win over positive patterns (any negation match on a path or ancestor denies access).

How It Works

  • Hierarchical access: Allowing a parent notebook grants access to all its children. Allowing Projects means notes in Projects/Work/Tasks are also accessible.

  • Read protection: get_note, get_note_resources, find_notes, get_links — notes in blocked notebooks are filtered out or rejected.

  • Write protection: create_note, update_note, edit_note, delete_note — operations on notes in blocked notebooks are rejected.

  • Notebook operations: list_notebooks only shows accessible notebooks. create_notebook is rejected both under a blocked parent and at the top level (no parent_name) when an allowlist is set, and update_notebook rejects moves to top-level (parent_name="/") under the same policy — both would let the agent silently move a notebook out of allowlist-enforced scope. To grow the allowlist, create or relocate the notebook in the Joplin UI, then add it to notebook_allowlist and restart the server.

  • Search filtering: find_notes results are filtered to only include notes in accessible notebooks.

  • Tag operations: tag_note, untag_note, get_tags_by_note enforce access on the note's notebook.

  • Error privacy: Blocked access raises a generic "Notebook not accessible" error without revealing notebook names or IDs.

Configuration Examples

Single project focus (notebook name containing a space):

{ "notebook_allowlist": ["Work Projects"] }

Multiple notebooks with exclusion:

{ "notebook_allowlist": ["Projects", "!Projects/Secret", "AI", "Reference"] }

Glob patterns:

{ "notebook_allowlist": ["Projects/*", "!Projects/Private"] }

No allowlist (default) — all notebooks accessible:

{ "notebook_allowlist": null }

Startup Behavior

At server startup, the allowlist is validated and logged:

  • Each entry is resolved against existing notebooks

  • Unresolvable patterns trigger warnings (but never block startup)

  • If the allowlist resolves to zero accessible notebooks, a warning is logged


Advanced Configuration

Development Installation

For developers or users who want the latest features:

git clone https://github.com/alondmnt/joplin-mcp.git
cd joplin-mcp
python bootstrap.py

bootstrap.py is cross-platform: it offers to create a ./venv, runs pip install -e ., then launches the interactive installer. Pass --no-venv to install into whichever Python is already active.

Manual Configuration

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

Note on uvx: uvx runs Python applications without permanently installing them (requires uv: pip install uv). It can read and write user configuration files (e.g., Claude/Jan configs), so uvx --from joplin-mcp joplin-mcp-install works for setup just like a pip install.

Version pinning (optional): For long‑lived client configs or CI, you can pin or range-constrain the version for reproducibility, e.g. uvx --from joplin-mcp==0.4.1 joplin-mcp-install or uvx --from 'joplin-mcp>=0.4,<0.5' joplin-mcp-install.

1. Create Configuration File

Create joplin-mcp.json in your project directory:

{
  "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)

{
  "mcpServers": {
    "joplin": {
      "command": "uvx",
      "args": ["--from", "joplin-mcp", "joplin-mcp-server"],
      "env": {
        "JOPLIN_TOKEN": "your_token_here"
      }
    }
  }
}

Requires uv installed: pip install uv

Option B: Using installed package

{
  "mcpServers": {
    "joplin": {
      "command": "joplin-mcp-server",
      "env": {
        "JOPLIN_TOKEN": "your_token_here"
      }
    }
  }
}

3. 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)

  • HTTP-compat transport (bridges modern /mcp JSON-RPC with legacy /sse//messages clients)

Tool Permission Configuration

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

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

Environment Variables

Usable instead of a JSON config file, or alongside one:

# Connection settings
export JOPLIN_TOKEN="your_api_token_here"
export JOPLIN_HOST="localhost"
export JOPLIN_PORT="41184"
export JOPLIN_TIMEOUT="30"

Environment variables override the config file key by key, so the env block in your MCP client's configuration wins over whatever file the server discovers. A variable only takes part when it is actually set, so setting one leaves the rest of your file alone. Full order: direct parameters > environment > config file > defaults.

Per-Tool Env Vars

Every tool can be toggled individually via JOPLIN_TOOL_<NAME>=true|false. These take precedence over config file settings.

Env var

Default

JOPLIN_TOOL_FIND_NOTES

true

JOPLIN_TOOL_FIND_NOTES_WITH_TAG

true

JOPLIN_TOOL_FIND_NOTES_IN_NOTEBOOK

true

JOPLIN_TOOL_FIND_IN_NOTE

true

JOPLIN_TOOL_GET_ALL_NOTES

false

JOPLIN_TOOL_GET_NOTE

true

JOPLIN_TOOL_GET_LINKS

true

JOPLIN_TOOL_CREATE_NOTE

true

JOPLIN_TOOL_UPDATE_NOTE

true

JOPLIN_TOOL_EDIT_NOTE

true

JOPLIN_TOOL_DELETE_NOTE

false

JOPLIN_TOOL_LIST_NOTEBOOKS

true

JOPLIN_TOOL_CREATE_NOTEBOOK

true

JOPLIN_TOOL_UPDATE_NOTEBOOK

false

JOPLIN_TOOL_DELETE_NOTEBOOK

false

JOPLIN_TOOL_LIST_TAGS

true

JOPLIN_TOOL_CREATE_TAG

true

JOPLIN_TOOL_UPDATE_TAG

false

JOPLIN_TOOL_DELETE_TAG

false

JOPLIN_TOOL_GET_TAGS_BY_NOTE

true

JOPLIN_TOOL_TAG_NOTE

true

JOPLIN_TOOL_UNTAG_NOTE

true

JOPLIN_TOOL_PING_JOPLIN

true

JOPLIN_TOOL_RESTORE_FROM_TRASH

true

JOPLIN_TOOL_IMPORT_FROM_FILE

false

Notebook Allowlist Env Var

Env var

Default

Description

JOPLIN_NOTEBOOK_ALLOWLIST

(not set)

Comma-separated list of notebook patterns (e.g., Work,Projects/*,!Projects/Secret). Not set means no restriction; set but empty denies every notebook

HTTP Transport Support

The server supports both STDIO and HTTP transports:

# STDIO (default)
joplin-mcp-server --config ~/.joplin-mcp.json

# HTTP transport (development, from repo)
PYTHONPATH=src python -m joplin_mcp.server --transport http --port 8000 --config ./joplin-mcp.json

# Opt-in HTTP compatibility bundle (modern + legacy SSE endpoints)
PYTHONPATH=src python -m joplin_mcp.server --transport http-compat --port 8000 --config ./joplin-mcp.json
# or keep --transport http and export MCP_HTTP_COMPAT=1/true to toggle the same behavior.

HTTP client config

Note: Claude Desktop currently uses STDIO transport and does not consume HTTP/SSE configs directly. The following example applies to clients that support network transports.

{
  "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.edit_note

true

Allow precision edits (find/replace, append, prepend)

tools.delete_note

false

Allow deleting notes (disabled by default — destructive)

tools.create_notebook

true

Allow creating new notebooks

tools.update_notebook

false

Allow modifying notebook titles and emoji icons

tools.delete_notebook

false

Allow deleting notebooks (disabled by default — destructive)

tools.create_tag

true

Allow creating new tags

tools.update_tag

false

Allow modifying tag titles

tools.delete_tag

false

Allow deleting tags (disabled by default — destructive)

tools.tag_note

true

Allow adding tags to notes

tools.untag_note

true

Allow removing tags from notes

tools.restore_from_trash

true

Allow restoring soft-deleted notes or notebooks

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.find_in_note

true

Allow regex search within a single note

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.get_note_resources

true

Allow reading a note's resources and their OCR text

tools.get_links

true

Allow extracting links to other 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

tools.import_from_file

false

Allow importing files/directories (MD, HTML, CSV, TXT, JEX)

Notebook Allowlist

Option

Default

Description

notebook_allowlist

null

List of notebook patterns to allow access to. null = no restriction. Supports gitignore-style patterns: exact names, * wildcards, ** recursive, ! negation

Content Exposure (Privacy Settings)

Option

Default

Description

content_exposure.search_results

"preview"

Content visibility in all search and listing results: "none", "preview", "full"

content_exposure.individual_notes

"full"

Content visibility for individual notes: "none", "preview", "full"

content_exposure.max_preview_length

300

Maximum length of content previews (characters)

content_exposure.smart_toc_threshold

2000

Notes longer than this show a table of contents instead of the full body

content_exposure.enable_smart_toc

true

Turn the table-of-contents fallback off to always return full note bodies

content_exposure.output_hints

false

Emit worked follow-up calls (NEXT_STEPS, NEXT_PAGE) alongside results. Useful for smaller models, repetition for capable ones

Lowering max_preview_length and smart_toc_threshold, or setting search_results to "none", is the main way to cut how many tokens a session spends. list_notebooks and list_tags return only the fields an agent acts on; pass verbose=True for icons, parent ids and timestamps. See docs/content-privacy.md.

Docker

Run the MCP server in a container. Default transport is HTTP for broad compatibility; switch via environment variables.

Build

docker build -t joplin-mcp .

Run (HTTP default)

docker run --rm \
  -p 8000:8000 \
  -e JOPLIN_TOKEN=your_api_token \
  joplin-mcp

With mounted config

docker run --rm \
  -p 8000:8000 \
  -v $PWD/joplin-mcp.json:/config/joplin-mcp.json:ro \
  joplin-mcp

Choose transport

  • SSE (streaming): -e MCP_TRANSPORT=sse

  • Streamable HTTP: -e MCP_TRANSPORT=streamable-http

  • STDIO (no port): -e MCP_TRANSPORT=stdio

Example (SSE):

docker run --rm \
  -p 8000:8000 \
  -e JOPLIN_TOKEN=your_api_token \
  -e MCP_TRANSPORT=sse \
  joplin-mcp

The container listens on 0.0.0.0:8000 by default. If exposing publicly, place behind a reverse proxy and terminate TLS there. For SSE, ensure proxy keep-alives and buffering are configured appropriately.

Project Structure

  • src/joplin_mcp/ - Main package directory

    • fastmcp_server.py - Server implementation with 26 tools and Pydantic validation types

    • config.py - Configuration management (including notebook allowlist)

    • notebook_utils.py - Notebook path resolution, allowlist matching, and caching

    • server.py - Server entrypoint (module and CLI)

    • tools/ - Tool implementations (notes, notebooks, tags)

    • ui_integration.py - UI integration utilities

  • docs/ - Documentation (troubleshooting, privacy controls, enhancement proposals)

  • tests/ - Unit test suite

  • tests/e2e/ - End-to-end tests against a real Joplin Desktop (3.x) via the Web Clipper API; see "Running Tests"

Testing

Test your connection:

# For pip install
joplin-mcp-server --config ~/.joplin-mcp.json

# For development (from repo)
PYTHONPATH=src python -m joplin_mcp.server --config ./joplin-mcp.json

You should see:

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

Running Tests

# Unit tests (no Joplin instance required)
pytest tests/ --ignore=tests/e2e

# E2E tests (requires a running Joplin instance)
JOPLIN_TOKEN=your_api_token \
JOPLIN_HOST=localhost \
JOPLIN_PORT=41184 \
pytest tests/e2e/ -v -m e2e --override-ini="addopts="

The E2E suite talks to a real Joplin Desktop via the Web Clipper API and exercises every tool including notebook allowlist enforcement. If JOPLIN_HOST:JOPLIN_PORT is unreachable the suite skips itself, so it's safe to run alongside the unit tests. Requires Joplin 3.x (the trash schema introduced in 3.0 — earlier versions fail with no such column: deleted_time).

Complete Tool Reference

Tool

Permission

Description

Finding Notes

find_notes

Read

Full-text search across all notes (supports task filtering; trash=True with query="*" lists trashed notes)

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

find_in_note

Read

Regex search within a single note (paginated matches & context, multiline anchors on by default)

get_links

Read

Extract links to other notes from a note

get_note_resources

Read

List a note's resources (images, PDFs, attachments) and read their OCR text

Managing Notes

create_note

Write

Create new notes

update_note

Update

Modify existing notes (incl. moving between notebooks)

edit_note

Update

Precision edit note content (find/replace, append, prepend)

delete_note

Delete

Remove notes

Managing Notebooks

list_notebooks

Read

Browse all notebooks

create_notebook

Write

Create new notebooks under an optional parent (by name or path), optionally with an emoji icon

update_notebook

Update

Rename, change emoji icon, or move a notebook under another parent (or to top-level with parent_name="/")

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 one or more tags to one or more notes (accepts lists)

untag_note

Update

Remove one or more tags from one or more notes (accepts lists)

Trash Management

restore_from_trash

Update

Restore a soft-deleted note or notebook (pass item_type='note' or 'notebook')

Import Tools

import_from_file

Write

Import files/directories (MD, HTML, CSV, TXT, JEX)

System Tools

ping_joplin

Read

Test connectivity

Available Tools

19 tools
create_noteA

Create a new note in a specified notebook in Joplin.

Creates a new note with the specified title, content, and properties. Uses notebook name
for easier identification instead of requiring notebook IDs.

Notebook can be specified by name or path:
- "Work" - matches notebook named "Work" (must be unique)
- "Projects/Work" - matches "Work" notebook inside "Projects"

Returns:
    str: Success message with the created note's title and unique ID.

Examples:
    - create_note("Shopping List", "Personal Notes", "- Milk
  • Eggs", True, False) - Create uncompleted todo - create_note("Meeting Notes", "Work Projects", "# Meeting with Client") - Create regular note - create_note("Task", "Work", "", True, False, "2024-12-31T17:00:00") - Create todo with due date - create_note("Task", "Project A/tasks", "body") - Create note in "tasks" sub-notebook under "Project A"

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesNote title
notebook_nameYesNotebook name or path (e.g., 'Work' or 'Projects/Work/Tasks')
bodyNoNote content
is_todoNoCreate as todo (default: False)
todo_completedNoMark todo as completed (default: False)
todo_dueNoDue date: Unix timestamp (ms) or ISO 8601 string (e.g., '2024-12-31T17:00:00'). Only for todos.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description effectively communicates the tool's behavior: it creates a note, uses notebook name/path resolution, and returns a success message with ID. It does not disclose potential errors, idempotency, or permissions, but the core behavior is clear.

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

Conciseness4/5

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

The description is structured with sections, bullet points, and examples. While it is somewhat lengthy, every sentence adds value. It could be slightly more concise, but the clarity benefits from the detailed examples.

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

Completeness5/5

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

The description is complete for a creation tool with an output schema (returns str). It covers parameters, behavior, examples, and return value. Given the tool's complexity (6 parameters, 2 required), the description provides sufficient context for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds significant value by explaining notebook path syntax, default values, and providing examples that show correct parameter combinations (e.g., is_todo with body, todo_due). This goes beyond the schema's minimal descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Create a new note in a specified notebook in Joplin.' It specifies the action (create), resource (note), and context (notebook). The examples further illustrate usage, and it distinguishes from siblings like edit_note and update_note by focusing on creation.

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

Usage Guidelines4/5

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

The description provides guidance on notebook specification (name or path) and includes multiple examples showing different use cases (regular note, todo, todo with due date, sub-notebook). However, it does not explicitly state when not to use this tool or mention alternatives for other operations.

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) in Joplin to organize your notes.

Creates a new notebook that can be used to organize and contain notes. You can create top-level notebooks or sub-notebooks within existing notebooks, optionally with an emoji icon shown in Joplin's sidebar.

Notebook can be specified by name or path:

  • "Work" - matches notebook named "Work" (must be unique)

  • "Projects/Work" - matches "Work" notebook inside "Projects"

Returns: str: Success message containing the created notebook's title and unique ID.

Examples: - create_notebook("Work Projects") - Create a top-level notebook - create_notebook("2024 Projects", "Work") - Create a sub-notebook under "Work" - create_notebook("Tasks", "Projects/Work") - Create a sub-notebook by path - create_notebook("Tasks", emoji="🎯") - Create a notebook with an emoji icon

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesNotebook title
parent_nameNoParent notebook name or path (e.g., 'Work' or 'Projects/Work'). Omit for a top-level notebook.
emojiNoSingle emoji glyph to use as the notebook's icon (optional)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Since no annotations are provided, the description fully covers behavioral traits: it creates notebooks, supports sub-notebooks via name or path, accepts an optional emoji, and returns a success message with title and ID.

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

Conciseness4/5

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

The description is well-structured with clear sections and examples, but the 'Specification' section somewhat duplicates the examples. It is informative and front-loaded.

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

Completeness5/5

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

Given the output schema exists and parameters are fully documented, the description covers all necessary context: creation behavior, naming conventions, optional features, and return value.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds significant value by explaining parent_name usage with paths, providing examples, and clarifying optional emoji beyond the schema's basic descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Create a new notebook (folder) in Joplin to organize your notes.' It uses a specific verb-resource pair and distinguishes from sibling tools like create_note.

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

Usage Guidelines4/5

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

The description explains when to use the tool, including creating top-level and sub-notebooks. It provides examples and context but does not explicitly 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.

create_tagA

Create a new tag.

Creates a new tag that can be applied to notes for categorization and organization.

Returns: str: Success message with the created tag's title and unique ID.

Examples: - create_tag("work") - Create a new tag named "work" - create_tag("important") - Create a new tag named "important"

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTag title

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description covers the main behavior: creating a tag and returning a success message with title and ID. It adds context about applicability to notes, though it does not mention idempotency or conflict handling.

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

Conciseness5/5

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

The description is concise with two sentences plus returns and examples, front-loaded with the main action. Every sentence adds value without redundancy.

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

Completeness4/5

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

For a simple creation tool, the description covers purpose, examples, and return type. It could mention uniqueness constraints, but overall it is complete given the tool's simplicity.

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

Parameters4/5

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

Schema description coverage is 100% for the single parameter 'title' which is described as 'Tag title'. The description adds value with examples and return type details (str with success message).

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

Purpose5/5

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

The description clearly states the action ('Create a new tag') and the resource (tag), and further explains its use for categorization and organization, distinguishing it from siblings like list_tags or tag_note.

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

Usage Guidelines3/5

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

The description indicates when to use the tool (to create a tag), but lacks explicit guidance on when not to use it or alternatives (e.g., if tag already exists, maybe use tag_note). No exclusionary context is provided.

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

edit_noteA

Precision-edit a note's body without reading or replacing the full content.

Preferred over update_note for targeted text changes — no get_note round-trip needed. Use update_note instead when changing metadata (title, todo status, due date) or replacing the entire body.

Modes:

  • Replace: provide old_string and new_string to replace text in the note body.

  • Delete: provide old_string and set new_string to '' to remove text.

  • Append: set position='end' (old_string must be None) to append new_string.

  • Prepend: set position='beginning' (old_string must be None) to prepend new_string.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID to edit
new_stringYesReplacement text (use '' to delete)
old_stringNoText to find and replace (None for positional insert)
replace_allNoReplace all occurrences (default: False)
positionNoInsert position: 'beginning' or 'end' (only when old_string is None)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Describes operational modes and parameter behaviors (e.g., new_string='' for delete, position only when old_string=None) but omits edge cases like behavior when old_string not found or concurrency effects. Given no annotations, this is a solid disclosure.

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

Conciseness5/5

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

Concise, well-structured: one-line summary, usage guidance, bulleted modes. Every sentence earns its place without redundancy.

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

Completeness5/5

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

Covers all modes, parameter constraints, and usage guidelines. Output schema exists, so return values are not needed. No gaps in essential context for an AI agent to correctly invoke the tool.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. Description adds value beyond schema by explaining mode interactions (e.g., position constraints, delete via empty string) and practical usage semantics, raising the score to 4.

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

Purpose5/5

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

Description clearly states 'precision-edit a note's body without reading or replacing the full content,' identifying the tool's purpose and distinguishing it from update_note for metadata or full body replacement. Lists modes (Replace, Delete, Append, Prepend) for specificity.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool over update_note: 'Preferred over update_note for targeted text changes — no get_note round-trip needed. Use update_note instead when changing metadata or replacing entire body.' Also provides mode-specific usage instructions.

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

find_in_noteA

Search for a regex pattern inside a specific note and return paginated matches.

Multiline mode is enabled by default so anchors like ^/$ operate per line, matching the common expectations for checklist-style searches.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID to search within
patternYesRegular expression to search for
limitNoMax matches per page (1-100, default: 20)
offsetNoSkip count for pagination (default: 0)
case_sensitiveNoUse case-sensitive matching (default: False)
multilineNoEnable multiline flag (affects ^ and $, default: True)
dotallNoDot matches newlines (re.DOTALL, default: False)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Without annotations, the description discloses pagination, default multiline mode, and its effect on anchors, which adds valuable behavioral context beyond the schema.

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

Conciseness5/5

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

Two sentences convey purpose and key behavioral detail without redundancy, earning every word.

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

Completeness4/5

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

Given 7 parameters and an output schema, the description adequately covers purpose, regex details, pagination, and multiline behavior, leaving little gap for agent confusion.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description adds marginal context about multiline and pagination but does not elaborate on other parameters beyond their schema definitions.

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

Purpose5/5

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

The description specifies a clear verb+resource: 'Search for a regex pattern inside a specific note'. It differentiates from sibling tools like find_notes by focusing on a single note.

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

Usage Guidelines3/5

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

The description implies usage for regex search within a note but does not explicitly state when not to use or mention alternatives, though sibling tools provide context.

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

find_notesA

Find notes by searching titles and content. Use "*" to list all notes.

Query syntax: "exact phrase", title:word, body:word, -exclude, word1 OR word2

Examples: - find_notes("") - List all notes - find_notes("meeting") - Find notes containing "meeting" - find_notes("", task=True) - List all tasks - find_notes("", trash=True) - List trashed (soft-deleted) notes - find_notes("", limit=20, offset=20) - Page 2

TIP: Use find_notes_with_tag() or find_notes_in_notebook() for filtered searches. TIP: Trashed notes can be restored with restore_from_trash().

IMPORTANT: trash=True only works with query="*" and no task/completed filters. Joplin's search API does not index trashed notes and ignores include_deleted for filter queries.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch text or '*' for all notes
limitNoMax results (1-100, default: 20)
offsetNoSkip count for pagination (default: 0)
taskNoFilter by task type (default: None)
completedNoFilter by completion status (default: None)
trashNoShow trashed (soft-deleted) notes instead of active notes (default: None/False)
order_byNoSort field: "title", "created_time", "updated_time" (default: updated_time for *, relevance for text)
order_dirNoSort direction: "asc", "desc" (default: asc for title, desc for time fields)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

No annotations provided, but the description fully covers behavior: query syntax, search scope, pagination, task/trash filtering, sorting defaults, and the important limitation that trashed notes are not indexed and ignore include_deleted for filter queries.

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

Conciseness5/5

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

Exceptionally well-structured: starts with purpose, then query syntax, then examples, then tips and important notes. Every sentence is informative and earns its place, with no redundancy.

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

Completeness5/5

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

Given 8 parameters, no annotations, and presence of output schema, the description covers all essential aspects: search, list, filter, sort, pagination, and constraints. References sibling tools and restoration tool, making it contextually complete for AI agent use.

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

Parameters5/5

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

Schema coverage is 100%, but description adds significant value beyond schema: explains query syntax with examples, illustrates parameter combinations in examples, and clarifies default behaviors for order_by and order_dir, as well as the trash constraint.

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

Purpose5/5

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

Clearly states 'Find notes by searching titles and content.' Differentiates from siblings by explicitly mentioning find_notes_with_tag() and find_notes_in_notebook() for filtered searches. Provides exhaustive query syntax and examples.

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

Usage Guidelines5/5

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

Provides explicit when to use (e.g., list all notes, search, tasks, trash, pagination) and when not (e.g., for filtered searches, use sibling tools). Includes critical constraint that trash=True only works with query='*'.

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

find_notes_in_notebookA

Find all notes in a specific notebook, with pagination support.

MAIN FUNCTION FOR NOTEBOOK SEARCHES!

Use this when you want to find all notes in a specific notebook.

Notebook can be specified by name or path:

  • "Work" - matches notebook named "Work" (must be unique)

  • "Projects/Work" - matches "Work" notebook inside "Projects"

Returns: str: List of all notes in the specified notebook, with pagination information.

Examples: - find_notes_in_notebook("Work Projects") - Find all notes in "Work Projects" - find_notes_in_notebook("Personal Notes", limit=10, offset=10) - Find notes in "Personal Notes" (page 2) - find_notes_in_notebook("Personal Notes", task=True) - Find only tasks in "Personal Notes" - find_notes_in_notebook("Projects", task=True, completed=False) - Find only uncompleted tasks in "Projects" - find_notes_in_notebook("Project A/tasks") - Find notes in "tasks" sub-notebook under "Project A"

ParametersJSON Schema
NameRequiredDescriptionDefault
notebook_nameYesNotebook name or path (e.g., 'Work' or 'Projects/Work/Tasks')
limitNoMax results (1-100, default: 20)
offsetNoSkip count for pagination (default: 0)
taskNoFilter by task type (default: None)
completedNoFilter by completion status (default: None)
order_byNoSort field: "title", "created_time", "updated_time" (default: updated_time)
order_dirNoSort direction: "asc", "desc" (default: asc for title, desc for time fields)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries full burden. It covers pagination behavior, notebook specification by name/path, and filter parameters. It mentions return type ('str: List of all notes with pagination info') but doesn't detail the exact structure. Overall, it provides adequate behavioral context.

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

Conciseness3/5

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

The description is somewhat verbose with emphasized text and multiple examples. While well-structured into sections, it could be more concise. Every sentence adds value, but some redundancy exists (e.g., repeated 'MAIN FUNCTION').

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

Completeness4/5

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

Given 7 parameters, many optional, and an output schema present, the description covers the key aspects: how to specify notebooks, pagination, filtering by task/completed, and sorting. It doesn't mention error handling or edge cases, but is sufficiently complete for a search tool.

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

Parameters4/5

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

Schema coverage is 100%, so the description adds value beyond the schema by explaining notebook path syntax ('Work' vs 'Projects/Work'), showing examples with task and completed filters, and illustrating pagination. This goes beyond the baseline.

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

Purpose5/5

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

The description clearly states it finds all notes in a specific notebook with pagination. The phrase 'MAIN FUNCTION FOR NOTEBOOK SEARCHES!' and examples differentiate it from siblings like 'find_notes' (which likely searches all notebooks) and 'find_notes_with_tag'.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this when you want to find all notes in a specific notebook.' It provides notebook path syntax and examples, making the usage context clear. However, it does not explicitly state when not to use or list alternative tools.

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

find_notes_with_tagA

Find all notes that have a specific tag, with pagination support.

MAIN FUNCTION FOR TAG SEARCHES!

Use this when you want to find all notes tagged with a specific tag name.

Returns: str: List of all notes with the specified tag, with pagination information.

Examples: - find_notes_with_tag("time-slip") - Find all notes tagged with "time-slip" - find_notes_with_tag("work", limit=10, offset=10) - Find notes tagged with "work" (page 2) - find_notes_with_tag("work", task=True) - Find only tasks tagged with "work" - find_notes_with_tag("important", task=True, completed=False) - Find only uncompleted tasks tagged with "important"

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_nameYesTag name to search for
limitNoMax results (1-100, default: 20)
offsetNoSkip count for pagination (default: 0)
taskNoFilter by task type (default: None)
completedNoFilter by completion status (default: None)
order_byNoSort field: "title", "created_time", "updated_time" (default: updated_time)
order_dirNoSort direction: "asc", "desc" (default: asc for title, desc for time fields)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. Discloses pagination support and filtering capabilities (task, completed, ordering). Adequately describes read-only nature for a search tool.

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

Conciseness4/5

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

Description is clear with examples, but slightly verbose with emphasis and returns line. Still efficient and front-loaded with purpose.

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

Completeness4/5

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

Given sibling tools, this description covers core functionality for tag searches. Doesn't mention output structure details, but output schema exists to fill gaps. Adequately complete.

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

Parameters3/5

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

Schema coverage is 100%, baseline 3. Examples add usage patterns but no extra meaning to individual parameters beyond schema descriptions.

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

Purpose5/5

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

The description clearly states 'Find all notes that have a specific tag, with pagination support' and emphasizes 'MAIN FUNCTION FOR TAG SEARCHES!', distinguishing it from sibling tools like find_notes and find_notes_in_notebook.

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

Usage Guidelines4/5

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

Provides explicit usage context: 'Use this when you want to find all notes tagged with a specific tag name.' Includes examples with parameters. However, lacks when-not guidance or comparison to alternatives.

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

get_noteA

Retrieve a note with smart content display and sequential reading support.

Smart behavior: Short notes show full content, long notes show TOC only. Sequential reading: Extract specific line ranges for progressive consumption.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID to retrieve
sectionNoExtract specific section (heading text, slug, or number)
start_lineNoStart line for sequential reading (1-based)
line_countNoNumber of lines to extract from start_line (default: 50)
toc_onlyNoShow only table of contents (default: False)
force_fullNoForce full content even for long notes (default: False)
metadata_onlyNoShow only metadata without content (default: False)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, but the description covers key behaviors: smart truncation for long notes and sequential reading by line ranges. This adds behavioral context beyond the schema, though it lacks detail on authentication or rate limits.

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

Conciseness5/5

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

The description is concise with two main sentences and bullet points. Every sentence adds value, front-loading the primary purpose and key behaviors without redundancy.

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

Completeness5/5

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

Given the 7 parameters and the presence of an output schema, the description adequately covers the main behaviors (smart display, sequential reading) and parameter usage. It is complete enough for an agent to understand the tool's functionality.

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

Parameters4/5

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

The schema covers all parameters (100% coverage). The description adds value by explaining the 'smart display' logic behind toc_only/force_full and the 'sequential reading' feature related to start_line/line_count, enhancing understanding beyond the schema.

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

Purpose5/5

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

The description clearly states the tool retrieves a note with smart content display and sequential reading support, distinguishing it from sibling tools like find_notes or create_note. The verb 'retrieve' and the specific resource 'note' are explicit.

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

Usage Guidelines3/5

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

The description explains smart behavior and sequential reading, providing context for when to use parameters like toc_only or start_line. However, it does not explicitly state when to use this tool over alternatives (e.g., find_notes for search) or include exclusions.

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

get_note_resourcesA

List resources attached to a note, including OCR text for images and PDFs.

Joplin runs OCR on attached images and PDFs and stores the result on each resource. This tool exposes that text so an agent reading a note can also see what's inside its images. Resources without OCR text (audio, plain files, or images not yet OCRed) are still listed unless ocr_only=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID whose resources to list
ocr_onlyNoReturn only resources with non-empty OCR text (default: False)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behavioral traits: it explains that OCR text is stored per resource, the tool exposes that text, and resources without OCR are still listed unless `ocr_only=True`. This transparently covers the tool's read-only nature and filtering behavior.

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

Conciseness5/5

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

The description is three sentences, front-loading the purpose and then providing essential context and behavioral details. Every sentence adds value without redundancy or unnecessary information.

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

Completeness5/5

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

Given the tool has an output schema (not shown but noted) and two well-documented parameters, the description is complete. It covers purpose, usage context, and filtering behavior, meeting all needs for an agent to correctly select and invoke the tool.

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

Parameters4/5

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

The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds value by explaining the behavior for `ocr_only` (non-OCR resources still listed unless true) and providing real-world context for `note_id`, raising the score to 4.

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

Purpose5/5

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

The description clearly states the tool lists resources attached to a note, including OCR text for images and PDFs. This is a specific verb-resource pair that distinguishes it from siblings like get_note or find_notes.

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

Usage Guidelines4/5

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

The description provides context on when to use the tool (to access OCR text within note resources) and explains the `ocr_only` parameter's effect. However, it does not explicitly mention when not to use it or suggest alternative tools, making it slightly incomplete for optimal guidance.

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

get_tags_by_noteA

Get all tags for a specific note.

Retrieves all tags that are currently applied to a specific note.

Returns: str: Formatted list of tags applied to the note with title, ID, and creation date.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID to get tags from

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations provided; description says it returns a formatted list but does not disclose safety (though read-only is implied), permission needs, error handling, or what happens if note does not exist.

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

Conciseness4/5

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

Two short paragraphs with no superfluous information, but the phrase 'tags for a specific note' is repeated, making it slightly less efficient.

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

Completeness4/5

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

For a simple 1-param read tool, description covers purpose and return format (with output schema present), but lacks context on when to use over alternatives and error scenarios.

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

Parameters3/5

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

Schema coverage is 100% for the single parameter, which is well-described in schema; description adds no extra semantic value beyond what schema provides, so baseline 3 applies.

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

Purpose5/5

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

Clearly states it retrieves all tags for a specific note, using specific verb and resource. Differentiates from siblings like list_tags (all tags) and tag_note (modification).

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

Usage Guidelines3/5

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

Implies usage when needing tags for a note, but provides no explicit when-to-use or when-not-to-use guidance, nor mentions alternatives despite having many sibling tools.

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 notebooks/folders in your Joplin instance.

Retrieves and displays all notebooks (folders) in your Joplin application.

Returns: str: Formatted list of all notebooks including title, unique ID, parent notebook (if sub-notebook), and creation date.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

The description states it 'retrieves and displays' notebooks and specifies the return format as a formatted string. However, with no annotations provided, it fails to disclose any behavioral traits such as authentication needs, rate limits, or that it is a read-only operation (which is implied but not explicit).

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

Conciseness4/5

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

The description is concise with two sentences and a return type specification. It is front-loaded with the main purpose, but the return type could be integrated more smoothly. Overall, it is efficient and clear.

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

Completeness4/5

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

Given no parameters and a simple string output, the description adequately covers the tool's functionality. However, it lacks any mention of limitations, edge cases, or pagination, which would be expected for a 'list all' operation.

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

Parameters4/5

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

The tool has no parameters, and the schema coverage is 100% (vacuously). Per guidelines, a baseline of 4 is appropriate since no additional parameter information is needed.

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

Purpose5/5

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

The description clearly states the action ('list') and the resource ('all notebooks/folders'). It is distinct from sibling tools like 'create_notebook' or 'find_notes_in_notebook', which serve different purposes.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention any prerequisites, contexts, or exclusions, leaving the agent to infer usage from the tool name alone.

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

list_tagsA

List all tags in your Joplin instance with note counts.

Retrieves and displays all tags that exist in your Joplin application. Tags are labels that can be applied to notes for categorization and organization.

Returns: str: Formatted list of all tags including title, unique ID, number of notes tagged with it, and creation date.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It describes return format but does not disclose safety (read-only), idempotency, or potential side effects. For a simple read operation, it's acceptable but not detailed.

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

Conciseness5/5

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

The description is brief, well-structured with a clear purpose sentence and a returns section. Every sentence adds value, no fluff.

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

Completeness5/5

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

Given no parameters and a described return format (str: formatted list with details), the description is complete for a simple list-all tool. It covers what the tool does and what the output looks like.

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

Parameters4/5

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

No parameters exist, and schema coverage is 100%. The description does not need to add param info, and the baseline for 0 parameters is 4. The description adds no param details but that's fine.

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

Purpose5/5

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

The description clearly states 'List all tags in your Joplin instance with note counts', specifying the verb (list), resource (tags), scope (all in Joplin), and additional data (note counts). It distinguishes from sibling tools like create_tag or get_tags_by_note.

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

Usage Guidelines4/5

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

The description implicitly tells when to use the tool (when you need a full list of tags) but lacks explicit exclusions or comparisons to alternatives like find_notes_with_tag. Adequate but could be improved with 'use this when you need all tags, not notes for a specific tag'.

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

ping_joplinA

Test connection to Joplin server.

Verifies connectivity to the Joplin application. Use to troubleshoot connection issues.

Returns: str: Connection status information.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, but description states returns connection status string (output schema exists). Lacks details on auth, side effects, but a ping is simple.

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

Conciseness5/5

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

Extremely concise: three sentences each serving a distinct purpose (purpose, use case, return info). No waste.

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

Completeness4/5

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

Given trivial complexity (no params, output schema exists), description is sufficient. Could detail return string format, but not essential.

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

Parameters4/5

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

No parameters; baseline 4. Description correctly has no param info. Schema covers 100% of zero params.

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

Purpose5/5

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

Clearly states it tests connection to Joplin server (specific verb+resource). Distinct from siblings which involve note/notebook/tag operations.

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

Usage Guidelines4/5

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

Explicitly says 'Use to troubleshoot connection issues', providing clear usage context. No mention of when not to use, but the simplicity reduces need.

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

restore_from_trashA

Restore a note or notebook from Joplin's trash.

Restores a previously deleted item by setting its deleted_time back to 0. The item reappears in its original notebook.

Scope of restore (important):

  • Only the single item identified by item_id is restored. When restoring a notebook, its sub-notebooks and the notes inside stay trashed and must each be restored individually. Joplin sets deleted_time on every descendant when a notebook is trashed, and this tool clears it on one item per call.

  • If the original parent notebook is also trashed, restore the parent first or the restored item may not be visible.

To find descendants to restore after restoring a notebook, use find_notes(query="*", trash=True) and filter to the relevant subtree.

Returns: str: Success message confirming the item was restored.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesNote or notebook ID to restore
item_typeNoItem type: 'note' or 'notebook'. Restoring a notebook does not restore the items inside it.note

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are provided, so the description carries full burden. It clearly explains the behavior: sets deleted_time to 0, does not restore sub-items of a notebook, and requires parent restoration first. This is thorough for a mutation tool.

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

Conciseness5/5

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

The description is well-structured: a clear first sentence, followed by essential details in bullet-like paragraphs, and ends with the return type. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the tool's complexity and the presence of an output schema (str), the description covers purpose, usage guidelines, behavioral details, and parameter context. It is complete for an agent to use the tool correctly.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description does not add new parameter semantics beyond the schema; it mostly repeats the item_type description. The behavioral context about restoration scope is useful but does not enhance parameter understanding.

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

Purpose5/5

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

The description explicitly states 'Restore a note or notebook from Joplin's trash' with a specific verb and resource. It is clearly distinct from sibling tools which involve creation, editing, searching, etc.

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

Usage Guidelines5/5

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

The description provides comprehensive guidance: when to use (restore trashed items), key limitations (only single item restored, parent must not be trashed), and an alternative (use find_notes to find descendants). It explicitly states what not to expect, aiding correct tool selection.

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

tag_noteA

Add one or more tags to one or more notes.

Both args accept a single string or a list. When either is a list, the cartesian product is applied (every tag on every note) in one call — preferred over looping.

Output: aggregated TAG_NOTE report with TOTAL_OPS / SUCCEEDED / FAILED, one row per (note, tag) pair (so the scalar case is a one-row report).

Tags must exist beforehand — use create_tag to add new ones. Missing tags are reported up front and nothing is applied. Per-op failures (e.g. invalid note ID or allowlist denial) are captured in the report; other ops still run.

Examples: - tag_note("abc...", "Work") - Tag one note with one tag - tag_note(["abc...", "def..."], "Work") - Tag two notes with one tag - tag_note("abc...", ["Work", "Urgent"]) - Add two tags to one note - tag_note(["abc...", "def..."], ["Work", "Urgent"]) - 2x2 = 4 ops

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID, or list of note IDs
tag_nameYesTag name, or list of tag names

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. Discloses batch behavior (cartesian product), output format (aggregated report), error handling (missing tags reported upfront, per-op failures). Lacks info on idempotency or rate limits, but adds sufficient transparency for a mutation tool.

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

Conciseness4/5

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

Description is well-structured with bullet points and examples. Front-loaded with main purpose. Each sentence is informative, but could be slightly more concise.

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

Completeness5/5

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

Given output schema exists (mentioned in context signals), description does not need to explain return values in detail but still covers output format. With 2 params fully described and rich usage examples, it is complete.

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

Parameters4/5

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

Schema coverage is 100% with descriptions in schema. Description adds value by explaining batch semantics, input format (single or list), and provides examples. Enhances understanding beyond schema.

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

Purpose5/5

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

Description starts with 'Add one or more tags to one or more notes.' Clearly states verb and resources. Differentiates from siblings like untag_note (removal) and create_tag (creating a tag).

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

Usage Guidelines5/5

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

Explicitly says tags must exist beforehand, recommends using create_tag for new tags. Indicates batch operation is preferred over looping. Provides clear when-to-use and contextual alternative.

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

untag_noteA

Remove one or more tags from one or more notes.

Both args accept a single string or a list. When either is a list, the cartesian product is applied (remove every tag from every note) in one call.

Output: aggregated UNTAG_NOTE report with TOTAL_OPS / SUCCEEDED / FAILED, one row per (note, tag) pair (so the scalar case is a one-row report).

Tags must exist (by name). Missing tags are reported up front and nothing is removed. Per-op failures (including allowlist denials) are captured in the report; other ops still run.

Examples: - untag_note("abc...", "Work") - Remove one tag from one note - untag_note(["abc...", "def..."], "Work") - Remove one tag from two notes - untag_note("abc...", ["Work", "Urgent"]) - Remove two tags from one note - untag_note(["abc...", "def..."], ["Work", "Urgent"]) - 2x2 = 4 ops

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID, or list of note IDs
tag_nameYesTag name, or list of tag names

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description thoroughly explains the cartesian product, output report format, error handling for missing tags and per-op failures, and atomicity per pair. No annotations are provided, so the description fully carries the behavioral disclosure burden.

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

Conciseness5/5

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

The description is well-structured with a clear summary, behavioral explanation, examples, and output description. It is concise with no unnecessary information; every sentence serves a purpose.

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

Completeness5/5

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

Given the tool's complexity (2 params, list handling, failure modes), the description covers all necessary aspects: input, output, error cases, and usage examples. It is complete for an agent to use correctly.

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

Parameters4/5

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

The input schema already describes each parameter with 100% coverage. The description adds significant value by explaining the list behavior and cartesian product, going beyond the schema's baseline.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Remove one or more tags from one or more notes.' It specifically describes the cartesian product behavior, distinguishing it from the sibling tool 'tag_note' by being its inverse operation.

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

Usage Guidelines4/5

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

The description provides clear guidance on when to use single vs list arguments, includes examples for various combinations, and notes prerequisites (tags must exist) and failure behavior. However, it does not explicitly contrast with 'tag_note' or other tools.

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

update_noteA

Update note properties (title, body, todo status, due date) or move a note to another notebook. Replaces the entire body.

Use this for metadata changes, moving a note between notebooks, or full body replacement. For targeted text edits (fix a word, append a line) use edit_note instead — it doesn't require reading first.

Notebook can be specified by name or path:

  • "Work" - matches notebook named "Work" (must be unique)

  • "Projects/Work" - matches "Work" notebook inside "Projects"

Returns: str: Success message confirming the note was updated.

Examples: - update_note("note123", title="New Title") - Update only the title - update_note("note123", body="New content", is_todo=True) - Update content and convert to todo - update_note("note123", notebook_name="Archive") - Move note to the "Archive" notebook - update_note("note123", notebook_name="Projects/Work/Tasks") - Move to a sub-notebook by path - update_note("note123", todo_due="2024-12-31T17:00:00") - Set due date - update_note("note123", todo_due=0) - Clear due date

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesNote ID to update
titleNoNew title (optional)
bodyNoNew content (optional)
notebook_nameNoMove note to this notebook by name or path (e.g., 'Work' or 'Projects/Work/Tasks')
is_todoNoConvert to/from todo (optional)
todo_completedNoMark todo completed (optional)
todo_dueNoDue date: Unix timestamp (ms), ISO 8601 string, or 0 to clear. Only for todos.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Discloses that body is replaced entirely, notebook name/path behavior, and return value. No contradictions with missing annotations. Missing auth/rate limits but acceptable for this tool.

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

Conciseness5/5

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

Concise summary at top, then usage guidance, parameter details, return type, and examples. Every sentence adds value. Well-organized.

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

Completeness5/5

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

Covers all aspects: purpose, usage, parameters, return value, examples. Output schema exists, reducing need for return description. Complete for complexity level.

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

Parameters4/5

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

Adds meaning beyond schema: explains notebook_name path resolution, todo_due formats (timestamp, ISO, 0 to clear). Schema covers other params well.

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

Purpose5/5

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

The description states the tool updates note properties or moves a note, with specific examples like title, body, todo status. It clearly distinguishes from edit_note for targeted edits.

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

Usage Guidelines5/5

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

Explicitly states when to use (metadata changes, moving, full body replacement) and when not to (targeted edits: use edit_note).

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

Tool Schema Changelog

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

  1. 19 tool updatesv0.8.0
    • First observedcreate_note
    • First observedcreate_notebook
    • First observedcreate_tag
    • First observededit_note
    • First observedfind_in_note
    • First observedfind_notes
    • First observedfind_notes_in_notebook
    • First observedfind_notes_with_tag
    • First observedget_links
    • First observedget_note
    • First observedget_note_resources
    • First observedget_tags_by_note
    • First observedlist_notebooks
    • First observedlist_tags
    • First observedping_joplin
    • First observedrestore_from_trash
    • First observedtag_note
    • First observeduntag_note
    • First observedupdate_note

TDQS

A4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap. For example, edit_note and update_note are explicitly differentiated for targeted text changes vs. metadata/full body replacement. All find, get, and list tools target specific resources or filters.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using underscores (e.g., create_note, find_notes_in_notebook, list_tags). Verbs are present tense and descriptors are clear, making the naming convention predictable and easy to navigate.

Tool Count4/5

With 18 tools, the server is slightly above the typical well-scoped range (3-15) but still reasonable for a note-taking application. Each tool serves a specific function, and no obvious bloat exists, though a few utilities like delete are missing.

Completeness2/5

The tool set lacks explicit delete operations for notes, notebooks, and tags, which is a significant gap for a CRUD-based system. Notebook and tag updates are also missing, leaving agents unable to perform basic lifecycle management without workarounds.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI clients to interact with Joplin notes through the Web Clipper API. Supports searching, reading, creating, deleting, and organizing notes and notebooks, plus scanning for uncompleted todo items.
    1
    MIT
  • A
    license
    A
    quality
    Not graded
    maintenance
    Enables AI assistants to interact with Joplin notes through full-text search, reading, creating, updating, and deleting notes, as well as importing markdown files directly into Joplin notebooks.
    6
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that provides standardized tools for querying and retrieving notes from Joplin personal knowledge manager through its API, enabling AI assistants to access and reference personal notes contextually.
    9
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/alondmnt/joplin-mcp'

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