# Reported issues for Joplin MCP Server by alondmnt

Pod holds 22 of 36 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [Joplin MCP Server by alondmnt](/mcp/joplin-mcp-server-by-alondmnt).

## Most discussed

### Feature proposal: notebook allowlist for restricting MCP server access

### Problem

When an AI agent connects to Joplin via MCP, it currently has access to all notebooks. For users with personal, work, or sensitive notebooks alongside ones they want an agent to operate on, there is no way to limit the scope of access. A misconfigured prompt or unexpected tool call could read or modify notes the user never intended to expose.

### Proposed solution

A pattern-based allowlist that controls which notebooks the MCP server can access. The configuration would use gitigno

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/13) · 2026-03-09 · closed · outside contributor · 10 comments

### [codex] Joplin MCP exposes only server_info endpoint; no notes resource available

## Steps to reproduce
  1. Call `list_mcp_resources` against the `joplin` MCP server.

• Called joplin.list_mcp_resources({"server":"joplin"})
  └ {"server": "joplin", "resources": [{"server": "joplin", "uri": "joplin://server_info", "name": "get_server_info", "description": "Get Joplin server         
        information.", "mimeType": "text/plain", "_meta": {"_fastmcp": {"tags": []}}}]}     

  3. Observe the sole resource `joplin://server_info`.
  4. Call `read_mcp_resource` on `joplin://note

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/12) · 2026-02-10 · closed · external user · 6 comments

### No valid session ID provided

Hello, I hope you are well.

I really really tried to get your MCP working (I think it has more tools than the other Joplin MCPs out there, and it's written in Python), but I keep getting this error:

```
Error POSTing to endpoint (HTTP 400): Bad Request: No valid session ID provided                                                                                                                                                                                                  
```

I managed to get

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/1) · 2025-07-17 · closed · external user · 6 comments

### Race condition: update_note API call returns 200 OK but confirmation message is missing or unreliable for immediate followup reads

## Bug: `update_note` API Call Returns HTTP 200 but Response is Missing from Frontend (Race Condition)

### Problem Statement

When using `update_note` (or `tool_replace_note_content`) through the Joplin MCP server via Open WebUI/MCPO, the tool **executes successfully on the backend** but the **confirmation message is missing from the user-facing output**, even though:

1. **HTTP 200 OK is returned** by the server
2. **The note IS actually updated in Joplin** (verified in subsequent reads)
3. **

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/24) · 2026-04-11 · closed · external user · 5 comments

### Unable to use with Codex.  Seems to force HTTPS when using env-vars

in `.codex/config.toml`

```toml
[mcp_servers.joplin]
enabled = false
command = "uvx"
args = ["--from", "joplin-mcp", "joplin-mcp-server"]

[mcp_servers.joplin.env]
JOPLIN_TOKEN = "xyz"
JOPLIN_HOST = "localhost"
JOPLIN_PORT = "41184"
```

Result
```
› can you access joplin now?

• Called joplin.ping_joplin({})
  └ OPERATION: PING_JOPLIN
    STATUS: FAILED
    CONNECTION: FAILED
    ERROR: HTTPSConnectionPool(host='localhost', port=41184): Max retries exceeded with url: /ping?
        token=xxx 

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/11) · 2026-02-07 · closed · external user · 5 comments

### Docker image wouldn't build (modifications suggested)

Thanks a lot this works great. However I could not build the docker container without making a few modifications:

I switched another base imageand use apk instead of apt:
```Dockerfile
FROM python:3.11-alpine
RUN apk add --no-cache ca-certificates curl
# I changed the useradd command to
RUN adduser -D -s /bin/sh appuser \
    && chown -R appuser:appuser /app
```

Moverover to be able to run it on Windows I had to change

```Dockerfile
COPY docker/entrypoint.sh /entrypoint.sh
RUN sed -i 's/\r//'

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/50) · 2026-05-16 · closed · external user · 4 comments

### Feature request: Icon update

I am using Emojis in Joplin for my folders. I noticed that the MCP cannot update that, it instead starts the title with a emoji.

<img width="190" height="93" alt="Image" src="https://github.com/user-attachments/assets/ec7ccd98-01f9-4cf0-9fca-ddfafcdb8b51" />

What MCP makes of it (wrong):
<img width="521" height="274" alt="Image" src="https://github.com/user-attachments/assets/c1169229-29f4-447f-9a16-96287ce4bcb5" />

What I make of it manually in the Joplin app (correct):
<img width="518" heig

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/51) · 2026-05-17 · closed · external user · 3 comments

### Feature Proposal: Headless server deployment via joplin-terminal-data-api (no Joplin Desktop required)

# Problem

The current Docker setup requires JOPLIN_TOKEN to be provided as an environment variable. This token is only obtainable from a running Joplin Desktop instance via the Web Clipper settings, which makes fully server-side / headless deployments (VPS, NAS, CI environments) impossible with the current setup.

# Proposed solution
[joplin-terminal-data-api](https://github.com/RickoNoNo3/joplin-terminal-data-api) runs a headless Joplin CLI internally and auto-injects the token, eliminating th

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/14) · 2026-03-09 · open · external user · 3 comments

## Most recent

### Reduce agent-directed output verbosity: drop instructional/decorative additions from tool responses

Related: #59 

## Summary

Several tool outputs include content optimised for a human reading a transcript rather than for an agent consuming the result. These additions cost tokens on every call without changing agent behaviour. This issue covers only the wasteful additions — the navigational structure (matching-line previews, TOC mode, `content_size`, `notebook_path`) is genuinely valuable and should stay.

## Problems

### 1. `NEXT_STEPS` blocks with example calls

`get_note` in TOC mode (and

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/66) · 2026-08-19 · closed · 0 comments

### Question: project direction now that Joplin ships native AI features

I use joplin-mcp daily (via Claude Code) to drive my notes and to-dos, and it has become a core part of my workflow — thank you for building it.

When Joplin's native AI features appeared, I compared the two and stayed with joplin-mcp — it is currently the more mature way to work with notes from an assistant. But the direction is clear: Joplin itself is investing in AI. I am curious how you see this playing out for joplin-mcp: do you expect the native features and an external MCP server to serve

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/65) · 2026-08-15 · closed · external user · 2 comments

### fix: environment variables are ignored when a config file exists

the server loads a config file **or** the environment, never both. `_auto_discover_with_logging()` calls `from_file()` as soon as it finds a config file on a discovered path (`JOPLIN_MCP_CONFIG`, `~/.config/joplin-mcp/*`, or `./joplin-mcp.json`), and only falls back to `from_environment()` when no file exists. so every `JOPLIN_*` variable is inert for anyone who has a config file - which is everyone who ran the installer.

that matters because MCP clients configure servers through an `env` block

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/60) · 2026-08-05 · closed · 0 comments

### Heavy Token Use

Thank you for creating the mcp. Is there a way to create queries that limit the token use.  Querying a single notebook page for information can consume of 5K tokens.

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/59) · 2026-08-02 · closed · external user · 1 comment

### update_note/update_notebook/update_tag success messages omit item title/name

## Summary

`format_update_success()` in `formatting.py` only includes `ITEM_ID` in its response, never the item's title/name — unlike `format_creation_success()`, which includes both. This makes it hard for an LLM client (and any human reading the tool call log) to tell which note/notebook/tag was just touched, without cross-referencing the ID against an earlier call.

```python
def format_update_success(item_type: ItemType, item_id: str) -> str:
    return f"""OPERATION: UPDATE_{item_type.valu

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/58) · 2026-07-25 · closed · outside contributor · 0 comments

### MCP Joplin 0.9.0 not working with Claude Desktop

I upgraded my 0.7.1 to the latest version (0.9.0) via pip and now the MCP server doesn't work with Claude Desktop. Latest macOS, latest Claude Desktop app, latest Joplin app. Reinstalled via pip and went through the configuration again, but still the same error. When I hit the webclipper page directly in a browser (http://localhost:41184/), I get the following error message:

`{"error":"Not Found: \n\nError: Not Found\n    at Api.route (file:///Applications/Joplin.app/Contents/Resources/lib/serv

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/55) · 2026-06-12 · closed · external user · 1 comment

### import engine bypasses note_view cache invalidation

tool-side mutations now flow through `note_view.modify_note` / `note_view.delete_note`, which wrap the joppy client and clear the single-note cache in one step (commit 5b6bfa4). the import engine still calls `self.client.modify_note(...)` directly at two sites:

- `src/joplin_mcp/imports/engine.py:572` — link rewriting during import
- `src/joplin_mcp/imports/engine.py:801` — fixing `created_time` / `updated_time` on imported notes

neither site invalidates the cache. a user who imports a file an

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/54) · 2026-05-21 · open · 0 comments

### Feature request: Moving Notebooks to a different parent

I am using MCP to help me restructure some of the categories and hierarchy I have in my notebooks. However, it cannot move a notebook to another parent it seems. That would be a nice feature.

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/53) · 2026-05-17 · closed · external user · 1 comment

### Feature request: Pass the OCRed content from Joplin over MCP

Joplin has an OCR function which it uses automatically. Right click a pasted image in Joplin and click "View OCR text". I am not sure how this is implemented exactly but it would be great if MCP can also access the OCRed text. Which would make search more comprehensive.

For example:

<img width="958" height="455" alt="Image" src="https://github.com/user-attachments/assets/7d509143-2507-4321-b937-dc391c96c13f" />

<img width="561" height="349" alt="Image" src="https://github.com/user-attachments

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/52) · 2026-05-17 · closed · external user · 2 comments

### bug: error messages leak filesystem paths and stack traces from upstream joppy errors

## Bug

When an MCP tool surfaces an upstream error from joppy (the Joplin HTTP client), the error string includes the joppy/Joplin internal stack trace and absolute filesystem paths from the Joplin desktop install. Only the URL token is redacted; the rest flows through unchanged.

Caught by a broad smoke-test run. Calling \`get_note\` with an all-zeros note ID returned an error message containing:

- \`http://localhost:41184/notes/...&token=***\` — token correctly redacted ✓
- Absolute paths un

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/49) · 2026-05-16 · closed · 0 comments

### refactor: move interactive config construction out of JoplinMCPConfig

## Problem

`JoplinMCPConfig.create_interactively` (at `src/joplin_mcp/config.py:1274`) and `JoplinMCPConfig.save_interactively` (at `src/joplin_mcp/config.py:1329`) are classmethods on the data class that reach UP into the installer UI:

\`\`\`python
@classmethod
def create_interactively(cls, ...):
    from .ui_integration import (
        get_content_privacy_settings,
        get_permission_settings,
        get_token_interactively,
    )
    ...
\`\`\`

That's a layering inversion: a value cl

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/48) · 2026-05-15 · closed · 0 comments

### bug: empty-list allowlist leaks notebook names through resolution suggestions

## Bug

When \`notebook_allowlist=[]\` (deny-all), notebook name resolution leaks the full notebook map through error suggestions.

\`NotebookResolver.get_accessible_map\` at \`src/joplin_mcp/notebook_utils.py:351-364\` short-circuits to return the full map when \`allowlist_entries\` is empty:

\`\`\`python
def get_accessible_map(self, allowlist_entries=None, force_refresh=False):
    nb_map = self.get_map(force_refresh=force_refresh)
    if not allowlist_entries:
        return nb_map
    ...
\

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/47) · 2026-05-15 · closed · 0 comments

### test: cover empty-list (deny-all) notebook_allowlist semantics

## Discovery

`notebook_allowlist=[]` on a real `JoplinMCPConfig` means **deny all notebooks** — `has_notebook_allowlist` returns `True` (since `[] != ALLOW_ALL`), and every tool's allowlist gate filters everything out.

This state is unique on a real config; `notebook_allowlist=None` (or omitted) is the "no allowlist configured" state (allowlist becomes `ALLOW_ALL`).

The earlier test `test_list_notebooks_empty_allowlist` in `tests/test_tools_notebooks_allowlist.py` modelled `notebook_allowlist

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/46) · 2026-05-15 · closed · 0 comments

### fix: JoplinMCPConfig.copy() drops notebook_allowlist

## Bug

`JoplinMCPConfig.copy(**overrides)` at `src/joplin_mcp/config.py:1161` builds its `current_values` dict from 7 fields (`host`, `port`, `token`, `timeout`, `verify_ssl`, `tools`, `content_exposure`) and silently omits `notebook_allowlist`. The new instance therefore falls back to the `__init__` default (`ALLOW_ALL = ("**",)`), losing whatever allowlist the source config carried.

```python
cfg = JoplinMCPConfig(notebook_allowlist=["AI", "Projects/*"])
cfg.copy().notebook_allowlist  # → AL

[Read the thread](https://github.com/alondmnt/joplin-mcp/issues/45) · 2026-05-15 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/alondmnt/joplin-mcp/issues).
