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 CHANGED
@@ -1,520 +1,278 @@
1
1
  # Joplin MCP Server
2
2
 
3
- This is a Node.js implementation of an MCP (Model Context Protocol) server for Joplin.
3
+ [![npm version](https://img.shields.io/npm/v/joplin-mcp-server)](https://www.npmjs.com/package/joplin-mcp-server)
4
+ [![CI](https://github.com/jordanburke/joplin-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/jordanburke/joplin-mcp-server/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
6
 
5
- ## Quick Start
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
- Install via npx (no installation required):
9
+ ## Quick Start
8
10
 
9
11
  ```bash
10
- npx joplin-mcp-server --help
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
- You can find your Joplin token in the Joplin desktop app under:
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
- **Configure your .env file in WSL**:
17
+ ## Architecture
45
18
 
46
- ```bash
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
- **To find your Windows IP address**:
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
- # From WSL
57
- cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
58
- # This gives the WSL bridge IP (e.g., 10.255.255.254)
59
-
60
- # Or use your Windows LAN IP (usually 192.168.x.x)
61
- # Check in Windows: ipconfig (look for IPv4 Address)
62
- ```
63
-
64
- **To remove the port forward later** (if needed):
65
-
66
- ```powershell
67
- netsh interface portproxy delete v4tov4 listenport=41184 listenaddress=0.0.0.0
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
- **Note**: This port forwarding rule persists across reboots - you only need to set it up once!
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
- 2. **Add this configuration to settings.json**:
40
+ Data is stored in `~/.config/joplin-mcp` by default (separate from any desktop Joplin install).
80
41
 
81
- ```json
82
- {
83
- "clipperServer.host": "0.0.0.0"
84
- }
85
- ```
42
+ ### External Mode
86
43
 
87
- 3. **Restart Joplin** for the changes to take effect
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
- # Test if Joplin is reachable from WSL
104
- curl http://192.168.0.40:41184/ping
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
- **Common issues**:
51
+ ## Configuration
52
+
53
+ ### Environment Variables
112
54
 
113
- - **Connection refused**: Port forwarding not set up or Joplin not running
114
- - Verify port forward: `netsh interface portproxy show all` (on Windows)
115
- - Verify Joplin is running with Web Clipper enabled
116
- - **Connection timeout**: Windows Firewall is blocking the port
117
- - Open Windows Defender Firewall
118
- - Add Inbound Rule for TCP port 41184
119
- - **Wrong IP**: Make sure you're using your actual Windows IP address
120
- - Check with `ipconfig` on Windows (look for IPv4 Address on your active network adapter)
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
- ## Command Line Options
68
+ ### Command Line Options
123
69
 
124
70
  ```
125
71
  OPTIONS:
126
- --env-file <file> Load environment variables from file
127
- --host <hostname> Joplin hostname or IP (default: 127.0.0.1)
128
- --port <port> Joplin port (default: 41184)
129
- --token <token> Joplin API token
130
- --transport <type> Transport type: stdio (default) or http
131
- --http-port <port> HTTP server port (default: 3000, only used with --transport http)
132
- --help, -h Show help message
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
- ### Command Line Usage Examples
85
+ ### Path Expansion
136
86
 
137
- ```bash
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
- # Using environment file
142
- npx joplin-mcp-server --env-file /path/to/your/.env
89
+ ```bash
90
+ # Tilde expands to home directory (Linux, macOS, Windows)
91
+ --sync-path ~/OneDrive/Apps/Joplin
143
92
 
144
- # WSL: Connect to Windows host
145
- npx joplin-mcp-server --host 192.168.0.40 --token your_token
93
+ # Environment variables (both forms supported)
94
+ --sync-path ${HOME}/OneDrive/Apps/Joplin
95
+ --sync-path $HOME/OneDrive/Apps/Joplin
146
96
 
147
- # HTTP mode (for testing with MCP Inspector)
148
- npx joplin-mcp-server --transport http --token your_token
97
+ # Windows example using USERPROFILE
98
+ --sync-path ${USERPROFILE}/OneDrive/Apps/Joplin
149
99
  ```
150
100
 
151
- ### MCP Client Configuration
101
+ This works in MCP client configs (`.mcp.json`, Claude Desktop) where shell expansion isn't available.
102
+
103
+ ### Sync Targets
152
104
 
153
- #### Claude Desktop Configuration
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
- **Important**: Claude Desktop does NOT support environment variable expansion (`${VAR}` syntax). You must provide values directly.
117
+ ## MCP Client Configuration
156
118
 
157
- **Option 1: Using env Section (Recommended)**
119
+ ### Claude Code
158
120
 
159
- Add to your `claude_desktop_config.json`:
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": "npx",
166
- "args": ["joplin-mcp-server"],
127
+ "command": "node",
128
+ "args": ["dist/bin.js"],
167
129
  "env": {
168
- "JOPLIN_TOKEN": "your_actual_token_here",
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
- **Option 2: Using Command-Line Arguments**
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
- **2. Use the included `.mcp.json` configuration**:
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
- **With environment variables:**
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
- **With direct values:**
158
+ ### With Sync (Claude Desktop)
247
159
 
248
160
  ```json
249
161
  {
250
162
  "mcpServers": {
251
163
  "joplin": {
252
164
  "command": "npx",
253
- "args": ["joplin-mcp-server", "--token", "your_joplin_token", "--port", "41184", "--host", "127.0.0.1"]
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
- **Using environment file:**
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", "--env-file", "/path/to/your/.env"]
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
- ## Logging
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
- LOG_LEVEL=debug npm start
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
- ### search_notes
204
+ ## WSL Setup
307
205
 
308
- Searches for notes in Joplin and returns matching notebooks.
206
+ Running in WSL? The sidecar architecture makes this straightforward — no Windows port forwarding needed.
309
207
 
310
- **Parameters:**
208
+ ### Filesystem Sync via OneDrive (Recommended)
311
209
 
312
- - `query`: The search query string
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
- ### read_note
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
- Reads the full content of a specific note.
221
+ ### Cloud Sync
369
222
 
370
- **Parameters:**
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
- # Weekly Project Meeting
231
+ ### External Mode (Port Forwarding)
388
232
 
389
- ## Agenda
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
- ## Notes
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
- > **Note**: The `read_note` command shows the full content of a specific note, while the `read_notebook` command shows a list of notes in a notebook. Use `search_notes` to find notes and get their IDs.
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
- ## Note 3 of 3 (ID: jkl012)
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
- > **Tip**: When you search for notes or view a notebook, you'll see a suggestion for using `read_multinote` with the exact IDs of the notes found. This makes it easy to read multiple related notes at once.
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 install
490
-
491
- # Build the project
492
- pnpm build
493
-
494
- # Run tests
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