joplin-mcp-server 1.3.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -398
- package/dist/bin.js +5 -3
- package/dist/bin.js.map +1 -1
- package/dist/index.js +596 -316
- package/dist/index.js.map +1 -1
- package/package.json +23 -10
package/README.md
CHANGED
|
@@ -1,520 +1,278 @@
|
|
|
1
1
|
# Joplin MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/joplin-mcp-server)
|
|
4
|
+
[](https://github.com/jordanburke/joplin-mcp-server/actions/workflows/ci.yml)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
A self-contained MCP (Model Context Protocol) server for [Joplin](https://joplinapp.org/). Bundles the Joplin Terminal CLI as a dependency — no desktop app, no global installs, no external processes to manage.
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
## Quick Start
|
|
8
10
|
|
|
9
11
|
```bash
|
|
10
|
-
npx joplin-mcp-server --
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Configuration
|
|
14
|
-
|
|
15
|
-
Create a `.env` file with the following variables:
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
JOPLIN_HOST=127.0.0.1
|
|
19
|
-
JOPLIN_PORT=41184
|
|
20
|
-
JOPLIN_TOKEN=your_joplin_token
|
|
12
|
+
npx joplin-mcp-server --token your_joplin_token
|
|
21
13
|
```
|
|
22
14
|
|
|
23
|
-
|
|
24
|
-
Tools > Options > Web Clipper
|
|
25
|
-
|
|
26
|
-
### WSL (Windows Subsystem for Linux) Setup
|
|
27
|
-
|
|
28
|
-
If you're running the MCP server in WSL and Joplin on Windows, you'll need to set up port forwarding because Joplin binds to 127.0.0.1 (localhost only) by default.
|
|
29
|
-
|
|
30
|
-
#### Option 1: Windows Port Forwarding (Recommended)
|
|
31
|
-
|
|
32
|
-
This is the simplest solution that requires no Joplin configuration changes and persists across reboots.
|
|
33
|
-
|
|
34
|
-
**On Windows (PowerShell as Administrator)**:
|
|
35
|
-
|
|
36
|
-
```powershell
|
|
37
|
-
# Forward port 41184 to allow WSL access to Joplin
|
|
38
|
-
netsh interface portproxy add v4tov4 listenport=41184 listenaddress=0.0.0.0 connectport=41184 connectaddress=127.0.0.1
|
|
39
|
-
|
|
40
|
-
# Verify the port forward is active
|
|
41
|
-
netsh interface portproxy show all
|
|
42
|
-
```
|
|
15
|
+
That's it. The server spawns its own Joplin Terminal instance (sidecar mode), syncs to your configured backend, and exposes your notes via MCP.
|
|
43
16
|
|
|
44
|
-
|
|
17
|
+
## Architecture
|
|
45
18
|
|
|
46
|
-
|
|
47
|
-
# Use your Windows machine's LAN IP address
|
|
48
|
-
JOPLIN_HOST=192.168.0.40 # Replace with your actual Windows IP
|
|
49
|
-
JOPLIN_PORT=41184
|
|
50
|
-
JOPLIN_TOKEN=your_joplin_token
|
|
51
|
-
```
|
|
19
|
+
### Sidecar Mode (Default)
|
|
52
20
|
|
|
53
|
-
|
|
21
|
+
The server bundles `joplin` as an npm dependency and manages its own Joplin Terminal process. No Joplin desktop app needed — the sidecar handles everything: data storage, sync, and the REST API.
|
|
54
22
|
|
|
55
23
|
```bash
|
|
56
|
-
#
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
24
|
+
# Basic usage — sidecar starts automatically
|
|
25
|
+
npx joplin-mcp-server --token your_token
|
|
26
|
+
|
|
27
|
+
# With cloud sync
|
|
28
|
+
npx joplin-mcp-server --token your_token \
|
|
29
|
+
--sync-target joplin-cloud \
|
|
30
|
+
--sync-username user@example.com --sync-password pass
|
|
31
|
+
|
|
32
|
+
# With filesystem sync (e.g. OneDrive folder)
|
|
33
|
+
npx joplin-mcp-server --token your_token \
|
|
34
|
+
--sync-target filesystem \
|
|
35
|
+
--sync-path /mnt/c/Users/you/OneDrive/Joplin
|
|
68
36
|
```
|
|
69
37
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
#### Option 2: Configure Joplin to Listen on All Interfaces (Alternative)
|
|
73
|
-
|
|
74
|
-
If you prefer to configure Joplin directly instead of using port forwarding:
|
|
75
|
-
|
|
76
|
-
1. **Find your Joplin configuration file**:
|
|
77
|
-
- Windows: `C:\Users\YourUsername\.config\joplin-desktop\settings.json`
|
|
38
|
+
The Joplin CLI is resolved in this order: `JOPLIN_CLI` env var > `node_modules/.bin/joplin` (bundled) > global install > `npx` fallback.
|
|
78
39
|
|
|
79
|
-
|
|
40
|
+
Data is stored in `~/.config/joplin-mcp` by default (separate from any desktop Joplin install).
|
|
80
41
|
|
|
81
|
-
|
|
82
|
-
{
|
|
83
|
-
"clipperServer.host": "0.0.0.0"
|
|
84
|
-
}
|
|
85
|
-
```
|
|
42
|
+
### External Mode
|
|
86
43
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
4. **Set your .env file in WSL**:
|
|
90
|
-
```
|
|
91
|
-
JOPLIN_HOST=10.255.255.254 # WSL bridge IP from /etc/resolv.conf
|
|
92
|
-
JOPLIN_PORT=41184
|
|
93
|
-
JOPLIN_TOKEN=your_joplin_token
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**Security Note**: This makes Joplin accessible on your entire local network. The API token is still required for all operations.
|
|
97
|
-
|
|
98
|
-
#### Troubleshooting WSL Connectivity
|
|
99
|
-
|
|
100
|
-
**Test connectivity from WSL**:
|
|
44
|
+
Connects to an existing Joplin instance instead of spawning a sidecar. Activated by setting `JOPLIN_HOST` or `JOPLIN_PORT`.
|
|
101
45
|
|
|
102
46
|
```bash
|
|
103
|
-
#
|
|
104
|
-
|
|
105
|
-
# Should return: JoplinClipperServer
|
|
106
|
-
|
|
107
|
-
# If using WSL bridge IP:
|
|
108
|
-
curl http://10.255.255.254:41184/ping
|
|
47
|
+
# Connect to Joplin desktop on another machine or Windows host
|
|
48
|
+
JOPLIN_HOST=192.168.0.40 JOPLIN_PORT=41184 npx joplin-mcp-server --token your_token
|
|
109
49
|
```
|
|
110
50
|
|
|
111
|
-
|
|
51
|
+
## Configuration
|
|
52
|
+
|
|
53
|
+
### Environment Variables
|
|
112
54
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
55
|
+
| Variable | Description | Default |
|
|
56
|
+
| ---------------------- | ------------------------------------------------------- | ---------------------- |
|
|
57
|
+
| `JOPLIN_TOKEN` | API token (required) | -- |
|
|
58
|
+
| `JOPLIN_HOST` | Connect to existing Joplin at this host (skips sidecar) | -- |
|
|
59
|
+
| `JOPLIN_PORT` | Connect to existing Joplin on this port (skips sidecar) | -- |
|
|
60
|
+
| `JOPLIN_CLI` | Path to joplin CLI binary (overrides auto-detection) | -- |
|
|
61
|
+
| `JOPLIN_PROFILE` | Joplin data directory for sidecar mode | `~/.config/joplin-mcp` |
|
|
62
|
+
| `JOPLIN_SYNC_TARGET` | Sync target type | `none` |
|
|
63
|
+
| `JOPLIN_SYNC_PATH` | Sync target URL/path | -- |
|
|
64
|
+
| `JOPLIN_SYNC_USERNAME` | Sync username/email | -- |
|
|
65
|
+
| `JOPLIN_SYNC_PASSWORD` | Sync password | -- |
|
|
66
|
+
| `LOG_LEVEL` | Log level: debug, info, warn, error | `info` |
|
|
121
67
|
|
|
122
|
-
|
|
68
|
+
### Command Line Options
|
|
123
69
|
|
|
124
70
|
```
|
|
125
71
|
OPTIONS:
|
|
126
|
-
--env-file <file>
|
|
127
|
-
--
|
|
128
|
-
--
|
|
129
|
-
--
|
|
130
|
-
--
|
|
131
|
-
--
|
|
132
|
-
|
|
72
|
+
--env-file <file> Load environment variables from file
|
|
73
|
+
--token <token> Joplin API token
|
|
74
|
+
--transport <type> Transport type: stdio (default) or http
|
|
75
|
+
--http-port <port> HTTP server port (default: 3000, only with --transport http)
|
|
76
|
+
--profile <dir> Joplin data directory (default: ~/.config/joplin-mcp)
|
|
77
|
+
--sync-target <type> Sync target: none, filesystem, webdav, nextcloud,
|
|
78
|
+
joplin-cloud, joplin-server, s3, dropbox, onedrive
|
|
79
|
+
--sync-path <url> URL or path for sync target
|
|
80
|
+
--sync-username <user> Username/email for sync
|
|
81
|
+
--sync-password <pass> Password for sync
|
|
82
|
+
--help, -h Show help message
|
|
133
83
|
```
|
|
134
84
|
|
|
135
|
-
###
|
|
85
|
+
### Path Expansion
|
|
136
86
|
|
|
137
|
-
|
|
138
|
-
# Using command line arguments
|
|
139
|
-
npx joplin-mcp-server --token your_joplin_token
|
|
87
|
+
The `--sync-path` and `--profile` options support `~` and environment variable expansion for cross-platform compatibility:
|
|
140
88
|
|
|
141
|
-
|
|
142
|
-
|
|
89
|
+
```bash
|
|
90
|
+
# Tilde expands to home directory (Linux, macOS, Windows)
|
|
91
|
+
--sync-path ~/OneDrive/Apps/Joplin
|
|
143
92
|
|
|
144
|
-
#
|
|
145
|
-
|
|
93
|
+
# Environment variables (both forms supported)
|
|
94
|
+
--sync-path ${HOME}/OneDrive/Apps/Joplin
|
|
95
|
+
--sync-path $HOME/OneDrive/Apps/Joplin
|
|
146
96
|
|
|
147
|
-
#
|
|
148
|
-
|
|
97
|
+
# Windows example using USERPROFILE
|
|
98
|
+
--sync-path ${USERPROFILE}/OneDrive/Apps/Joplin
|
|
149
99
|
```
|
|
150
100
|
|
|
151
|
-
|
|
101
|
+
This works in MCP client configs (`.mcp.json`, Claude Desktop) where shell expansion isn't available.
|
|
102
|
+
|
|
103
|
+
### Sync Targets
|
|
152
104
|
|
|
153
|
-
|
|
105
|
+
| Target | Required Options |
|
|
106
|
+
| --------------- | ------------------------------------------------------------------------------------ |
|
|
107
|
+
| `none` | (default, no sync) |
|
|
108
|
+
| `filesystem` | `--sync-path /path/to/dir` |
|
|
109
|
+
| `webdav` | `--sync-path <url>` `--sync-username` `--sync-password` |
|
|
110
|
+
| `nextcloud` | `--sync-path <url>` `--sync-username` `--sync-password` |
|
|
111
|
+
| `joplin-cloud` | `--sync-username` `--sync-password` |
|
|
112
|
+
| `joplin-server` | `--sync-path <url>` `--sync-username` `--sync-password` |
|
|
113
|
+
| `s3` | `--sync-path <bucket>` `--sync-username <access-key>` `--sync-password <secret-key>` |
|
|
114
|
+
| `dropbox` | (OAuth flow) |
|
|
115
|
+
| `onedrive` | (OAuth flow) |
|
|
154
116
|
|
|
155
|
-
|
|
117
|
+
## MCP Client Configuration
|
|
156
118
|
|
|
157
|
-
|
|
119
|
+
### Claude Code
|
|
158
120
|
|
|
159
|
-
|
|
121
|
+
The repository includes a `.mcp.json` that works with Claude Code's env var expansion:
|
|
160
122
|
|
|
161
123
|
```json
|
|
162
124
|
{
|
|
163
125
|
"mcpServers": {
|
|
164
126
|
"joplin": {
|
|
165
|
-
"command": "
|
|
166
|
-
"args": ["
|
|
127
|
+
"command": "node",
|
|
128
|
+
"args": ["dist/bin.js"],
|
|
167
129
|
"env": {
|
|
168
|
-
"JOPLIN_TOKEN": "
|
|
169
|
-
"JOPLIN_PORT": "41184",
|
|
170
|
-
"JOPLIN_HOST": "127.0.0.1"
|
|
130
|
+
"JOPLIN_TOKEN": "${JOPLIN_TOKEN}"
|
|
171
131
|
}
|
|
172
132
|
}
|
|
173
133
|
}
|
|
174
134
|
}
|
|
175
135
|
```
|
|
176
136
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
```json
|
|
180
|
-
{
|
|
181
|
-
"mcpServers": {
|
|
182
|
-
"joplin": {
|
|
183
|
-
"command": "npx",
|
|
184
|
-
"args": ["joplin-mcp-server", "--token", "your_actual_token_here", "--port", "41184", "--host", "127.0.0.1"]
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
Restart Claude Desktop after updating the configuration.
|
|
191
|
-
|
|
192
|
-
#### Claude Code Configuration
|
|
193
|
-
|
|
194
|
-
Claude Code supports environment variable expansion in `.mcp.json`.
|
|
195
|
-
|
|
196
|
-
**1. Set environment variables in your shell** (add to `~/.bashrc` or `~/.zshrc`):
|
|
137
|
+
Set `JOPLIN_TOKEN` in your shell (add to `~/.bashrc` or `~/.zshrc`):
|
|
197
138
|
|
|
198
139
|
```bash
|
|
199
140
|
export JOPLIN_TOKEN="your_actual_token_here"
|
|
200
|
-
export JOPLIN_PORT="41184" # Optional, defaults to 41184
|
|
201
|
-
export JOPLIN_HOST="127.0.0.1" # Optional, defaults to 127.0.0.1
|
|
202
141
|
```
|
|
203
142
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
The repository includes a working `.mcp.json` file that uses environment variable expansion:
|
|
207
|
-
|
|
208
|
-
```json
|
|
209
|
-
{
|
|
210
|
-
"mcpServers": {
|
|
211
|
-
"joplin": {
|
|
212
|
-
"command": "npx",
|
|
213
|
-
"args": ["joplin-mcp-server"],
|
|
214
|
-
"env": {
|
|
215
|
-
"JOPLIN_TOKEN": "${JOPLIN_TOKEN}"
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
The server will automatically use `JOPLIN_PORT` and `JOPLIN_HOST` from your shell environment, or use the defaults (127.0.0.1:41184).
|
|
223
|
-
|
|
224
|
-
#### Other MCP Clients (Cursor, etc.)
|
|
225
|
-
|
|
226
|
-
Most MCP clients support environment variable expansion (`${VAR}` syntax).
|
|
143
|
+
### Claude Desktop
|
|
227
144
|
|
|
228
|
-
**
|
|
145
|
+
Claude Desktop does **not** support `${VAR}` expansion. Provide values directly:
|
|
229
146
|
|
|
230
147
|
```json
|
|
231
148
|
{
|
|
232
149
|
"mcpServers": {
|
|
233
150
|
"joplin": {
|
|
234
151
|
"command": "npx",
|
|
235
|
-
"args": ["joplin-mcp-server"]
|
|
236
|
-
"env": {
|
|
237
|
-
"JOPLIN_TOKEN": "${JOPLIN_TOKEN}",
|
|
238
|
-
"JOPLIN_PORT": "${JOPLIN_PORT}",
|
|
239
|
-
"JOPLIN_HOST": "${JOPLIN_HOST}"
|
|
240
|
-
}
|
|
152
|
+
"args": ["joplin-mcp-server", "--token", "your_actual_token_here"]
|
|
241
153
|
}
|
|
242
154
|
}
|
|
243
155
|
}
|
|
244
156
|
```
|
|
245
157
|
|
|
246
|
-
|
|
158
|
+
### With Sync (Claude Desktop)
|
|
247
159
|
|
|
248
160
|
```json
|
|
249
161
|
{
|
|
250
162
|
"mcpServers": {
|
|
251
163
|
"joplin": {
|
|
252
164
|
"command": "npx",
|
|
253
|
-
"args": [
|
|
165
|
+
"args": [
|
|
166
|
+
"joplin-mcp-server",
|
|
167
|
+
"--token",
|
|
168
|
+
"your_token",
|
|
169
|
+
"--sync-target",
|
|
170
|
+
"filesystem",
|
|
171
|
+
"--sync-path",
|
|
172
|
+
"/path/to/sync/dir"
|
|
173
|
+
]
|
|
254
174
|
}
|
|
255
175
|
}
|
|
256
176
|
}
|
|
257
177
|
```
|
|
258
178
|
|
|
259
|
-
|
|
179
|
+
### External Mode
|
|
260
180
|
|
|
261
181
|
```json
|
|
262
182
|
{
|
|
263
183
|
"mcpServers": {
|
|
264
184
|
"joplin": {
|
|
265
185
|
"command": "npx",
|
|
266
|
-
"args": ["joplin-mcp-server",
|
|
186
|
+
"args": ["joplin-mcp-server"],
|
|
187
|
+
"env": {
|
|
188
|
+
"JOPLIN_TOKEN": "your_actual_token_here",
|
|
189
|
+
"JOPLIN_HOST": "192.168.0.40",
|
|
190
|
+
"JOPLIN_PORT": "41184"
|
|
191
|
+
}
|
|
267
192
|
}
|
|
268
193
|
}
|
|
269
194
|
}
|
|
270
195
|
```
|
|
271
196
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
The server logs all incoming commands and outgoing responses. Logs are stored in two places:
|
|
275
|
-
|
|
276
|
-
1. **Console output**: Basic information is displayed in the console
|
|
277
|
-
2. **Log files**: Detailed logs are saved in the `logs` directory with timestamps
|
|
278
|
-
|
|
279
|
-
You can adjust the log level by setting the `LOG_LEVEL` environment variable:
|
|
197
|
+
### Docker
|
|
280
198
|
|
|
281
199
|
```bash
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
Available log levels (from most to least verbose):
|
|
286
|
-
|
|
287
|
-
- `debug`: All messages including detailed command and response data
|
|
288
|
-
- `info`: Standard operational messages (default)
|
|
289
|
-
- `warn`: Warnings and errors only
|
|
290
|
-
- `error`: Only error messages
|
|
291
|
-
|
|
292
|
-
## Available Tools
|
|
293
|
-
|
|
294
|
-
### list_notebooks
|
|
295
|
-
|
|
296
|
-
Retrieves the complete notebook hierarchy from Joplin.
|
|
297
|
-
|
|
298
|
-
```
|
|
299
|
-
# Example output:
|
|
300
|
-
Notebook 1 (id: "abc123")
|
|
301
|
-
Subnotebook 1.1 (id: "def456")
|
|
302
|
-
Subnotebook 1.2 (id: "ghi789")
|
|
303
|
-
Notebook 2 (id: "jkl012")
|
|
200
|
+
docker build -t joplin-mcp .
|
|
201
|
+
docker run -e JOPLIN_TOKEN=your_token -p 3000:3000 joplin-mcp
|
|
304
202
|
```
|
|
305
203
|
|
|
306
|
-
|
|
204
|
+
## WSL Setup
|
|
307
205
|
|
|
308
|
-
|
|
206
|
+
Running in WSL? The sidecar architecture makes this straightforward — no Windows port forwarding needed.
|
|
309
207
|
|
|
310
|
-
|
|
208
|
+
### Filesystem Sync via OneDrive (Recommended)
|
|
311
209
|
|
|
312
|
-
|
|
210
|
+
Both your Windows Joplin desktop and the WSL sidecar sync to the same OneDrive folder. They see the same notes without needing to talk to each other directly.
|
|
313
211
|
|
|
212
|
+
```bash
|
|
213
|
+
# Point the sidecar at your OneDrive Joplin sync folder
|
|
214
|
+
npx joplin-mcp-server --token your_token \
|
|
215
|
+
--sync-target filesystem \
|
|
216
|
+
--sync-path /mnt/c/Users/YourName/OneDrive/Joplin
|
|
314
217
|
```
|
|
315
|
-
# Example usage:
|
|
316
|
-
search_notes query="project meeting"
|
|
317
|
-
|
|
318
|
-
# Example output:
|
|
319
|
-
Found 2 notes matching query: "project meeting"
|
|
320
|
-
NOTE: To read a notebook, use the notebook ID (not the note title)
|
|
321
|
-
|
|
322
|
-
- Note: "Weekly Project Meeting" (note_id: "abc123")
|
|
323
|
-
Notebook: "Work" (notebook_id: "58a0a29f68bc4141b49c99f5d367638a")
|
|
324
|
-
Updated: 3/15/2025, 10:30:45 AM
|
|
325
|
-
Snippet: Notes from our weekly project meeting. Topics discussed: timeline, resources, next steps...
|
|
326
|
-
To read this notebook: read_notebook notebook_id="58a0a29f68bc4141b49c99f5d367638a"
|
|
327
|
-
|
|
328
|
-
- Note: "Project Kickoff Meeting" (note_id: "def456")
|
|
329
|
-
Notebook: "Projects" (notebook_id: "72b1c45d89ef3212a67b98f4e5d23a1b")
|
|
330
|
-
Updated: 3/10/2025, 2:15:30 PM
|
|
331
|
-
Snippet: Initial project meeting with stakeholders. Key decisions: project scope, team members...
|
|
332
|
-
To read this notebook: read_notebook notebook_id="72b1c45d89ef3212a67b98f4e5d23a1b"
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
> **Important**: Note the difference between note titles and IDs. When using the `read_notebook` command, you must use the notebook ID (a long alphanumeric string), not the notebook title.
|
|
336
|
-
|
|
337
|
-
### read_notebook
|
|
338
|
-
|
|
339
|
-
Reads the contents of a specific notebook.
|
|
340
|
-
|
|
341
|
-
**Parameters:**
|
|
342
|
-
|
|
343
|
-
- `notebook_id`: The ID of the notebook to read
|
|
344
|
-
|
|
345
|
-
```
|
|
346
|
-
# Example usage:
|
|
347
|
-
read_notebook notebook_id="58a0a29f68bc4141b49c99f5d367638a"
|
|
348
|
-
|
|
349
|
-
# Example output:
|
|
350
|
-
# Notebook: "Work" (notebook_id: "58a0a29f68bc4141b49c99f5d367638a")
|
|
351
|
-
Contains 3 notes:
|
|
352
|
-
NOTE: This is showing the contents of notebook "Work", not a specific note.
|
|
353
|
-
|
|
354
|
-
- Note: "Weekly Project Meeting" (note_id: "def456")
|
|
355
|
-
Updated: 3/15/2025, 10:30:45 AM
|
|
356
|
-
|
|
357
|
-
- ✅ Note: "Call client" (note_id: "ghi789")
|
|
358
|
-
Updated: 3/14/2025, 3:45:12 PM
|
|
359
|
-
|
|
360
|
-
- ☐ Note: "Prepare presentation" (note_id: "jkl012")
|
|
361
|
-
Updated: 3/13/2025, 9:20:33 AM
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
> **Common Error**: If you try to use a note title (like "todo") instead of a notebook ID, you'll get an error. Always use the notebook ID (the long alphanumeric string) shown in the search results or notebook list.
|
|
365
218
|
|
|
366
|
-
|
|
219
|
+
In your Joplin desktop app, configure sync to the same OneDrive folder: **Tools > Options > Synchronisation > File system > /Users/YourName/OneDrive/Joplin**
|
|
367
220
|
|
|
368
|
-
|
|
221
|
+
### Cloud Sync
|
|
369
222
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
- `note_id`: The ID of the note to read
|
|
223
|
+
Alternatively, both instances can sync to Joplin Cloud or any other cloud backend:
|
|
373
224
|
|
|
225
|
+
```bash
|
|
226
|
+
npx joplin-mcp-server --token your_token \
|
|
227
|
+
--sync-target joplin-cloud \
|
|
228
|
+
--sync-username user@example.com --sync-password pass
|
|
374
229
|
```
|
|
375
|
-
# Example usage:
|
|
376
|
-
read_note note_id="def456"
|
|
377
|
-
|
|
378
|
-
# Example output:
|
|
379
|
-
# Note: "Weekly Project Meeting"
|
|
380
|
-
Note ID: def456
|
|
381
|
-
Notebook: "Work" (notebook_id: "58a0a29f68bc4141b49c99f5d367638a")
|
|
382
|
-
Created: 3/15/2025, 10:00:12 AM
|
|
383
|
-
Updated: 3/15/2025, 10:30:45 AM
|
|
384
|
-
|
|
385
|
-
---
|
|
386
230
|
|
|
387
|
-
|
|
231
|
+
### External Mode (Port Forwarding)
|
|
388
232
|
|
|
389
|
-
|
|
390
|
-
1. Project status update
|
|
391
|
-
2. Timeline review
|
|
392
|
-
3. Resource allocation
|
|
393
|
-
4. Next steps
|
|
233
|
+
If you prefer to connect directly to Windows Joplin instead of running a sidecar:
|
|
394
234
|
|
|
395
|
-
|
|
396
|
-
- Project is on track for Q2 delivery
|
|
397
|
-
- Need to allocate additional resources to the UI team
|
|
398
|
-
- Next meeting scheduled for next Friday
|
|
235
|
+
**On Windows (PowerShell as Administrator):**
|
|
399
236
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
Related commands:
|
|
403
|
-
- To view the notebook containing this note: read_notebook notebook_id="58a0a29f68bc4141b49c99f5d367638a"
|
|
404
|
-
- To search for more notes: search_notes query="your search term"
|
|
237
|
+
```powershell
|
|
238
|
+
netsh interface portproxy add v4tov4 listenport=41184 listenaddress=0.0.0.0 connectport=41184 connectaddress=127.0.0.1
|
|
405
239
|
```
|
|
406
240
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
### read_multinote
|
|
410
|
-
|
|
411
|
-
Reads the full content of multiple notes at once.
|
|
412
|
-
|
|
413
|
-
**Parameters:**
|
|
414
|
-
|
|
415
|
-
- `note_ids`: An array of note IDs to read
|
|
241
|
+
**In WSL:**
|
|
416
242
|
|
|
243
|
+
```bash
|
|
244
|
+
JOPLIN_HOST=192.168.0.40 JOPLIN_PORT=41184 npx joplin-mcp-server --token your_token
|
|
417
245
|
```
|
|
418
|
-
# Example usage:
|
|
419
|
-
read_multinote note_ids=["def456", "ghi789", "jkl012"]
|
|
420
|
-
|
|
421
|
-
# Example output:
|
|
422
|
-
# Reading 3 notes
|
|
423
|
-
|
|
424
|
-
## Note 1 of 3 (ID: def456)
|
|
425
|
-
|
|
426
|
-
### Note: "Weekly Project Meeting"
|
|
427
|
-
Notebook: "Work" (notebook_id: "58a0a29f68bc4141b49c99f5d367638a")
|
|
428
|
-
Created: 3/15/2025, 10:00:12 AM
|
|
429
|
-
Updated: 3/15/2025, 10:30:45 AM
|
|
430
|
-
|
|
431
|
-
---
|
|
432
|
-
|
|
433
|
-
# Weekly Project Meeting
|
|
434
|
-
|
|
435
|
-
## Agenda
|
|
436
|
-
1. Project status update
|
|
437
|
-
2. Timeline review
|
|
438
|
-
|
|
439
|
-
---
|
|
440
|
-
|
|
441
|
-
## Note 2 of 3 (ID: ghi789)
|
|
442
|
-
|
|
443
|
-
### Note: "Call client"
|
|
444
|
-
Notebook: "Work" (notebook_id: "58a0a29f68bc4141b49c99f5d367638a")
|
|
445
|
-
Status: Completed
|
|
446
|
-
Created: 3/14/2025, 3:00:00 PM
|
|
447
|
-
Updated: 3/14/2025, 3:45:12 PM
|
|
448
|
-
|
|
449
|
-
---
|
|
450
|
-
|
|
451
|
-
Discussed project timeline and next steps.
|
|
452
|
-
Client is happy with progress.
|
|
453
246
|
|
|
454
|
-
|
|
247
|
+
Find your Windows IP with `ipconfig` on Windows or `cat /etc/resolv.conf | grep nameserver` from WSL.
|
|
455
248
|
|
|
456
|
-
##
|
|
457
|
-
|
|
458
|
-
### Note: "Prepare presentation"
|
|
459
|
-
Notebook: "Work" (notebook_id: "58a0a29f68bc4141b49c99f5d367638a")
|
|
460
|
-
Status: Not completed
|
|
461
|
-
Due: 3/20/2025, 9:00:00 AM
|
|
462
|
-
Created: 3/13/2025, 9:00:00 AM
|
|
463
|
-
Updated: 3/13/2025, 9:20:33 AM
|
|
464
|
-
|
|
465
|
-
---
|
|
466
|
-
|
|
467
|
-
# Presentation Outline
|
|
468
|
-
- Introduction
|
|
469
|
-
- Project overview
|
|
470
|
-
- Timeline
|
|
471
|
-
- Budget
|
|
472
|
-
- Next steps
|
|
473
|
-
|
|
474
|
-
---
|
|
475
|
-
|
|
476
|
-
# Summary
|
|
477
|
-
Total notes requested: 3
|
|
478
|
-
Successfully retrieved: 3
|
|
479
|
-
```
|
|
249
|
+
## Available Tools
|
|
480
250
|
|
|
481
|
-
|
|
251
|
+
| Tool | Description |
|
|
252
|
+
| ---------------- | ----------------------------------------------------- |
|
|
253
|
+
| `list_notebooks` | Retrieve the complete notebook hierarchy |
|
|
254
|
+
| `search_notes` | Search for notes by query string |
|
|
255
|
+
| `read_notebook` | Read contents of a specific notebook |
|
|
256
|
+
| `read_note` | Read full content of a specific note |
|
|
257
|
+
| `read_multinote` | Read multiple notes at once |
|
|
258
|
+
| `create_note` | Create a new note |
|
|
259
|
+
| `create_folder` | Create a new notebook |
|
|
260
|
+
| `edit_note` | Edit an existing note |
|
|
261
|
+
| `edit_folder` | Edit an existing notebook |
|
|
262
|
+
| `delete_note` | Delete a note (requires confirmation) |
|
|
263
|
+
| `delete_folder` | Delete a notebook (requires confirmation) |
|
|
264
|
+
| `sync` | Trigger a Joplin sync with the configured sync target |
|
|
482
265
|
|
|
483
266
|
## Development
|
|
484
267
|
|
|
485
|
-
### Local Development Setup
|
|
486
|
-
|
|
487
268
|
```bash
|
|
488
|
-
# Install dependencies
|
|
489
|
-
pnpm
|
|
490
|
-
|
|
491
|
-
#
|
|
492
|
-
pnpm
|
|
493
|
-
|
|
494
|
-
#
|
|
495
|
-
pnpm test
|
|
496
|
-
|
|
497
|
-
# Format code
|
|
498
|
-
pnpm format
|
|
499
|
-
|
|
500
|
-
# Run linter
|
|
501
|
-
pnpm lint
|
|
502
|
-
|
|
503
|
-
# Run validation (format + lint + test + build)
|
|
504
|
-
pnpm validate
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
### Testing Local Changes
|
|
508
|
-
|
|
509
|
-
```bash
|
|
510
|
-
# Link for local development
|
|
511
|
-
npm link
|
|
512
|
-
|
|
513
|
-
# Test the CLI
|
|
514
|
-
npx joplin-mcp-server --help
|
|
515
|
-
|
|
516
|
-
# Unlink when done
|
|
517
|
-
npm unlink -g joplin-mcp-server
|
|
269
|
+
pnpm install # Install dependencies
|
|
270
|
+
pnpm build # Build to dist/
|
|
271
|
+
pnpm test # Run tests
|
|
272
|
+
pnpm validate # Format + lint + typecheck + test + build
|
|
273
|
+
pnpm serve:dev # Dev mode with hot reload (stdio)
|
|
274
|
+
pnpm serve:dev:http # Dev mode with hot reload (HTTP)
|
|
275
|
+
pnpm inspect # Build and open MCP Inspector
|
|
518
276
|
```
|
|
519
277
|
|
|
520
278
|
## License
|