Skip to main content

Joplin for ChatGPT and MCP

joplin-md-sync gives AI assistants controlled access to your own Joplin knowledge base. Search, read, create, update, move, tag, and trash notes from a private Custom GPT or any local stdio or Streamable HTTP MCP client without moving your notes into another hosted note service.

Run it beside Joplin Desktop, or deploy a complete headless Joplin Terminal and agent API stack on your own Linux host. A separate Markdown sync workflow is available when a coding agent needs reviewable files, three-way diffs, and Git history.

Website · Connect ChatGPT · MCP: local stdio & HTTP · Deploy headless

What you get

  • Joplin inside ChatGPT. A generated OpenAPI contract exposes authenticated Actions for current notes, notebooks, tags, and search to a private Custom GPT.
  • Typed MCP tools. Local stdio and Streamable HTTP transports give compatible clients structured note operations plus attachment upload, download, replacement, and relationship traversal.
  • A headless Joplin service. The rootless Linux installer deploys Joplin Terminal, recurrent sync, and the combined MCP/Actions adapter as coordinated systemd user services. Joplin Desktop does not need to remain running.
  • Your storage and encryption choices. Use filesystem, Nextcloud, WebDAV, Dropbox, OneDrive, S3, Joplin Server, or Joplin Cloud, with existing Joplin end-to-end encryption where the selected topology supports it.
  • Reviewable Markdown when you need it. Pull notebooks to ordinary files, let an agent work with repository context, inspect a three-way diff and dry-run, then push the verified result back to Joplin.

Joplin remains the source of truth. The adapter uses its documented local Data API and never edits the Joplin database, profile, or sync target directly.

Fast path: headless Joplin for ChatGPT

This topology keeps Joplin and the adapter on your own Linux host. Only the authenticated Actions routes need to reach ChatGPT over HTTPS; the Joplin Data API stays on loopback.

1. Install Joplin and the agent service

The host needs Linux with systemd user services, Python 3.13.5 or newer, and Node.js/npm. This interactive example connects the new headless profile to an existing Nextcloud Joplin sync target:

set -o pipefail
curl --proto '=https' --tlsv1.2 --fail --silent --show-error --location \
  'https://raw.githubusercontent.com/kogeler/joplin-md-sync/main/scripts/joplin_terminal_service/install_joplin_terminal.py' \
  | python3 - \
      --sync-target nextcloud \
      --sync-location 'https://cloud.example.com/remote.php/dav/files/user/Joplin' \
      --sync-username 'user'

The installer asks for secrets through hidden prompts, handles existing Joplin E2EE keys, verifies release checksums, and creates:

joplin-terminal.service    Joplin profile, Data API, and recurrent sync
joplin-md-sync.service     MCP and ChatGPT Actions on one guarded adapter

It also generates separate protected credentials for Joplin, MCP, and Actions. The full guide covers every sync target, a reviewed-download flow, dry-run, upgrade, rollback, and removal: Joplin API Service.

2. Publish the narrow HTTPS route

Route /api/gpt/v1/* from a trusted HTTPS hostname to the adapter on 127.0.0.1:8765. Do not expose the upstream Joplin Data API. Keep /mcp private unless a remote MCP client needs it; public MCP requires its own bearer token and TLS.

The supported boundaries and deployment choices are documented in Self-hosted deployment.

3. Connect a private Custom GPT

From a checkout matching the deployed release, run the setup assistant:

git clone --depth 1 --branch v1.7.0 \
  https://github.com/kogeler/joplin-md-sync.git
cd joplin-md-sync
python3 scripts/prepare_chatgpt_action.py

Enter the public hostname and the generated Actions token when prompted. The assistant validates TLS, authentication, and live read operations, then writes the OpenAPI file for the Custom GPT editor. Continue with the exact GPT instructions and acceptance test in ChatGPT Actions setup.

Use Joplin from an MCP client

For a local Joplin Desktop instance, enable Tools > Options > Web Clipper and point an MCP-capable editor at the downloaded native executable:

{
  "mcpServers": {
    "joplin": {
      "command": "/absolute/path/to/joplin-md-sync-linux-amd64",
      "args": ["mcp", "stdio", "--token-file", "/home/USER/.config/joplin-md-sync/token"]
    }
  }
}

Store the token once in a private file outside synchronized folders. The directory is 0700, the file 0600, and the token is read without echo or shell history:

install -d -m 0700 ~/.config/joplin-md-sync
(umask 077; read -rs -p 'Joplin token: ' token &&
  printf '%s\n' "$token" > ~/.config/joplin-md-sync/token)

A launcher that exports environment variables can set JOPLIN_TOKEN instead and pass neither token option. Use exactly one source: a command-line option together with a non-empty JOPLIN_TOKEN is rejected. The older "--token", "<token>" arguments still work for existing configurations, but they place the token in the IDE configuration, in the process list, and in any agent command line that forwards the MCP configuration.

The local stdio process connects to Joplin on port 41184 by default; add "--port", "PORT" to the arguments when Joplin uses another local port. For a long-running or remote adapter, install the package and start Streamable HTTP instead. Stdio opens no MCP or Actions port and therefore needs no bearer token for those interfaces; its Joplin token authenticates only to Joplin:

pipx install "joplin-md-sync==1.7.0"
export JOPLIN_TOKEN=...
joplin-md-sync mcp serve

Connect the HTTP client to http://127.0.0.1:8765/mcp with transport type streamable-http.

The service can start while Joplin is offline and recovers on later calls. Create operations reject an existing notebook, note, tag, or resource identity instead of creating accidental duplicates. Remote MCP deployment requires a separate protected bearer token and TLS. See the complete MCP API reference.

Use Joplin notes as reviewable files

Choose the Markdown workflow when an agent needs repository context, broad transformations, an exact diff before writes, or selected notebooks in Git:

export JOPLIN_TOKEN=...
joplin-md-sync init --root ./notes --mode remote-first
joplin-md-sync pull --root ./notes --json

# Let an agent edit the managed Markdown files, then review the result.
joplin-md-sync diff --root ./notes --three-way --unified
joplin-md-sync push --root ./notes --dry-run --json
joplin-md-sync push --root ./notes --json

Managed note files carry a one-line Joplin identity header. Base snapshots, conflicts, journals, backups, and downloaded resources stay under the ignored .joplin-sync/ directory. Start with the copyable agent notes repository template or the Markdown quick start.

Control and failure behavior

  • The Joplin Data API remains private on loopback in the headless topology.
  • Joplin, MCP, and Actions credentials are distinct and read from protected files or the environment. Local mcp stdio takes its Joplin token from a protected --token-file or JOPLIN_TOKEN; the compatibility --token argument exposes it in the process list.
  • Direct API writes are sent once. An ambiguous timeout is reported instead of being replayed and possibly duplicated.
  • Creating an occupied notebook, note, tag, or resource identity returns an explicit *_ALREADY_EXISTS error with the existing ID and recommended update tool.
  • Note and notebook deletion uses Joplin trash. Resource and tag deletion is explicitly marked destructive because Joplin has no trash endpoint for them.
  • Divergent file edits produce a conflict bundle instead of a silent overwrite.
  • File deletion propagation is off by default; interrupted mutations are journaled and recoverable; diff never mutates state.

The exact test-backed guarantees live in the contract catalog. Agents operating a Markdown workspace should also follow AGENTS.md.

Installation options

Python installations require CPython 3.13 or 3.14 on Windows or Linux:

python -m pip install "joplin-md-sync==1.7.0"
# or: pipx install "joplin-md-sync==1.7.0"

GitHub Releases also provide a standalone zipapp and native executables that include Python:

Platform Asset
Linux AMD64 joplin-md-sync-linux-amd64
Linux ARM64 joplin-md-sync-linux-arm64
Windows AMD64 joplin-md-sync-windows-amd64.exe
Python zipapp joplin-md-sync.pyz

Download them with SHA256SUMS.txt from the latest release.

Interface guide

Goal Interface
Work with current Joplin notes in ChatGPT Authenticated ChatGPT Actions
Give an editor or assistant typed note tools MCP
Run without a desktop session Headless Joplin Terminal plus MCP/Actions
Review every broad agent edit before applying it Markdown workspace
Keep selected notebooks in Git Markdown workspace

Compare consistency models and deployment choices in Choose an agent interface.

Development

make venv
make venv-dev
make check
make ci
make test-live
make package
make docs-audit
make docs-screenshots
make help

Runtime dependencies are empty by design. Development, test, package, and docs tools use purpose-specific hash-verified locks. See Development and Dependency maintenance. On Linux AMD64, make test-live provisions a checksum-pinned Joplin Desktop 3.6.15 binary and isolated temporary profile; it never uses the user's Joplin process or token.

Releases and license

Git tags use vX.Y.Z. Release assets include wheel, sdist, zipapp, native executables, and checksums; the same wheel and sdist are published to PyPI through Trusted Publishing. See the changelog.

MIT licensed. This is an independent project and is not affiliated with or endorsed by the Joplin project.

Release files for joplin-md-sync 1.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for joplin-md-sync 1.7.0
File Size Uploaded
joplin_md_sync-1.7.0.tar.gz 214.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for joplin-md-sync 1.7.0
File Interpreter ABI Platform
joplin_md_sync-1.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 320.0 kB

Release files / joplin_md_sync-1.7.0.tar.gz

Download URL joplin_md_sync-1.7.0.tar.gz
Size 214.7 kB
Tags Source
SHA-256 checksum
How to use checksums
b495f93fa37cc69b3099d28fa77a1aa7d8f0b40db74da4c3690fc44e28ed6de4
BLAKE2b-256 checksum
How to use checksums
32cbffa6eca493e9f98ae5ae6fcf595dc477aa7f6eb682d5bf6affaf1bb3307b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release files / joplin_md_sync-1.7.0-py3-none-any.whl

Download URL joplin_md_sync-1.7.0-py3-none-any.whl
Size 105.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d6ea05ae02c827f10f41352baf7b3ab8405c31a3aabbe7109e0c30b3d395573b
BLAKE2b-256 checksum
How to use checksums
e1b128918b94dfd6eccd1999a5b9edd7df7e7eb4376e69c7549231a54b0d27c5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.7.0 This release

2 release files

1.6.0

2 release files

1.5.6

2 release files

1.5.5

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page