notez-mcp 1.8.0
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/LICENSE +21 -0
- package/README.md +97 -0
- package/build/client.d.ts +33 -0
- package/build/client.js +92 -0
- package/build/client.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +25 -0
- package/build/index.js.map +1 -0
- package/build/server.d.ts +6 -0
- package/build/server.js +240 -0
- package/build/server.js.map +1 -0
- package/build/types.d.ts +65 -0
- package/build/types.js +3 -0
- package/build/types.js.map +1 -0
- package/package.json +44 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2026 SpasticPalate
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# notez-mcp
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for [Notez](https://github.com/SpasticPalate/notez) — a self-hosted note-taking app. Allows Claude Code and other MCP-compatible clients to read and manage your notes and tasks.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- A running Notez instance (v1.6.0+)
|
|
8
|
+
- An API token (create one in **Settings > API Tokens**, or via `curl`)
|
|
9
|
+
|
|
10
|
+
## Quick Start
|
|
11
|
+
|
|
12
|
+
### With npx (no install required)
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx notez-mcp
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Global install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g notez-mcp
|
|
22
|
+
notez-mcp
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Claude Code Configuration
|
|
26
|
+
|
|
27
|
+
Add the following to your Claude Code MCP settings:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"notez": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "notez-mcp"],
|
|
35
|
+
"env": {
|
|
36
|
+
"NOTEZ_URL": "https://your-notez-instance.com",
|
|
37
|
+
"NOTEZ_API_TOKEN": "ntez_your_token_here"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Environment Variables
|
|
45
|
+
|
|
46
|
+
| Variable | Required | Description |
|
|
47
|
+
|----------|----------|-------------|
|
|
48
|
+
| `NOTEZ_URL` | Yes | URL of your Notez instance (e.g., `https://notez.example.com`) |
|
|
49
|
+
| `NOTEZ_API_TOKEN` | Yes | API token with appropriate scopes |
|
|
50
|
+
|
|
51
|
+
## Available Tools
|
|
52
|
+
|
|
53
|
+
| Tool | Scope | Description |
|
|
54
|
+
|------|-------|-------------|
|
|
55
|
+
| `notez_search_notes` | read | Search notes by keyword |
|
|
56
|
+
| `notez_get_note` | read | Get a note by ID |
|
|
57
|
+
| `notez_get_note_by_title` | read | Get a note by exact title |
|
|
58
|
+
| `notez_list_recent` | read | List recently updated notes |
|
|
59
|
+
| `notez_create_note` | write | Create a new note |
|
|
60
|
+
| `notez_append_to_note` | write | Append content to an existing note |
|
|
61
|
+
| `notez_list_tasks` | read | List tasks with optional filters |
|
|
62
|
+
| `notez_get_task` | read | Get a task by ID |
|
|
63
|
+
| `notez_create_task` | write | Create a new task |
|
|
64
|
+
| `notez_update_task_status` | write | Update a task's status |
|
|
65
|
+
| `notez_list_folders` | read | List all folders |
|
|
66
|
+
|
|
67
|
+
## Creating an API Token
|
|
68
|
+
|
|
69
|
+
### Via the Settings UI (recommended)
|
|
70
|
+
|
|
71
|
+
1. Log in to your Notez instance
|
|
72
|
+
2. Go to **Settings > API Tokens**
|
|
73
|
+
3. Click **New Token**
|
|
74
|
+
4. Give it a name (e.g., "Claude Code - Laptop")
|
|
75
|
+
5. Select permissions: **Read** and **Write**
|
|
76
|
+
6. Choose an expiration period
|
|
77
|
+
7. Click **Create Token** and copy the token immediately — it won't be shown again
|
|
78
|
+
|
|
79
|
+
### Via curl
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Log in to get a JWT
|
|
83
|
+
TOKEN=$(curl -s -X POST https://your-notez-instance.com/api/auth/login \
|
|
84
|
+
-H "Content-Type: application/json" \
|
|
85
|
+
-d '{"usernameOrEmail":"your-username","password":"your-password"}' \
|
|
86
|
+
| jq -r '.accessToken')
|
|
87
|
+
|
|
88
|
+
# Create an API token
|
|
89
|
+
curl -s -X POST https://your-notez-instance.com/api/tokens \
|
|
90
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
91
|
+
-H "Content-Type: application/json" \
|
|
92
|
+
-d '{"name":"Claude Code","scopes":["read","write"],"expiresIn":"90d"}'
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## License
|
|
96
|
+
|
|
97
|
+
MIT
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { NotezNote, NotezTask, NotezFolder, SearchResponse, TaskListResponse, NoteListResponse } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP client for the Notez /api/mcp/* endpoints
|
|
4
|
+
*/
|
|
5
|
+
export declare class NotezClient {
|
|
6
|
+
private baseUrl;
|
|
7
|
+
private token;
|
|
8
|
+
constructor(baseUrl: string, token: string);
|
|
9
|
+
private request;
|
|
10
|
+
searchNotes(query: string, limit?: number): Promise<SearchResponse>;
|
|
11
|
+
getNote(id: string): Promise<NotezNote>;
|
|
12
|
+
getNoteByTitle(title: string): Promise<NotezNote>;
|
|
13
|
+
listRecentNotes(limit?: number): Promise<NoteListResponse>;
|
|
14
|
+
createNote(data: {
|
|
15
|
+
title: string;
|
|
16
|
+
content?: string;
|
|
17
|
+
folderId?: string;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
}): Promise<NotezNote>;
|
|
20
|
+
appendToNote(id: string, content: string): Promise<NotezNote>;
|
|
21
|
+
listTasks(status?: string, limit?: number): Promise<TaskListResponse>;
|
|
22
|
+
getTask(id: string): Promise<NotezTask>;
|
|
23
|
+
createTask(data: {
|
|
24
|
+
title: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
priority?: string;
|
|
27
|
+
dueDate?: string;
|
|
28
|
+
folderId?: string;
|
|
29
|
+
tags?: string[];
|
|
30
|
+
}): Promise<NotezTask>;
|
|
31
|
+
updateTaskStatus(id: string, status: string): Promise<NotezTask>;
|
|
32
|
+
listFolders(): Promise<NotezFolder[]>;
|
|
33
|
+
}
|
package/build/client.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the Notez /api/mcp/* endpoints
|
|
3
|
+
*/
|
|
4
|
+
export class NotezClient {
|
|
5
|
+
baseUrl;
|
|
6
|
+
token;
|
|
7
|
+
constructor(baseUrl, token) {
|
|
8
|
+
// Strip trailing slash
|
|
9
|
+
this.baseUrl = baseUrl.replace(/\/+$/, '');
|
|
10
|
+
this.token = token;
|
|
11
|
+
}
|
|
12
|
+
async request(path, options = {}) {
|
|
13
|
+
const url = `${this.baseUrl}/api/mcp${path}`;
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
...options,
|
|
16
|
+
signal: AbortSignal.timeout(15_000), // 15 second timeout
|
|
17
|
+
headers: {
|
|
18
|
+
'Authorization': `Bearer ${this.token}`,
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
...options.headers,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const body = await response.text();
|
|
25
|
+
let message;
|
|
26
|
+
try {
|
|
27
|
+
const json = JSON.parse(body);
|
|
28
|
+
message = json.message || json.error || body;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
message = body;
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Notez API error (${response.status}): ${message}`);
|
|
34
|
+
}
|
|
35
|
+
return response.json();
|
|
36
|
+
}
|
|
37
|
+
// ─── Notes ──────────────────────────────────────────────────────────
|
|
38
|
+
async searchNotes(query, limit = 20) {
|
|
39
|
+
const params = new URLSearchParams({ q: query, limit: String(limit) });
|
|
40
|
+
return this.request(`/notes/search?${params}`);
|
|
41
|
+
}
|
|
42
|
+
async getNote(id) {
|
|
43
|
+
return this.request(`/notes/${id}`);
|
|
44
|
+
}
|
|
45
|
+
async getNoteByTitle(title) {
|
|
46
|
+
const params = new URLSearchParams({ title });
|
|
47
|
+
return this.request(`/notes/by-title?${params}`);
|
|
48
|
+
}
|
|
49
|
+
async listRecentNotes(limit = 20) {
|
|
50
|
+
const params = new URLSearchParams({ limit: String(limit) });
|
|
51
|
+
return this.request(`/notes/recent?${params}`);
|
|
52
|
+
}
|
|
53
|
+
async createNote(data) {
|
|
54
|
+
return this.request('/notes', {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
body: JSON.stringify(data),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async appendToNote(id, content) {
|
|
60
|
+
return this.request(`/notes/${id}/append`, {
|
|
61
|
+
method: 'PATCH',
|
|
62
|
+
body: JSON.stringify({ content }),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// ─── Tasks ──────────────────────────────────────────────────────────
|
|
66
|
+
async listTasks(status, limit = 20) {
|
|
67
|
+
const params = new URLSearchParams({ limit: String(limit) });
|
|
68
|
+
if (status)
|
|
69
|
+
params.set('status', status);
|
|
70
|
+
return this.request(`/tasks?${params}`);
|
|
71
|
+
}
|
|
72
|
+
async getTask(id) {
|
|
73
|
+
return this.request(`/tasks/${id}`);
|
|
74
|
+
}
|
|
75
|
+
async createTask(data) {
|
|
76
|
+
return this.request('/tasks', {
|
|
77
|
+
method: 'POST',
|
|
78
|
+
body: JSON.stringify(data),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async updateTaskStatus(id, status) {
|
|
82
|
+
return this.request(`/tasks/${id}/status`, {
|
|
83
|
+
method: 'PATCH',
|
|
84
|
+
body: JSON.stringify({ status }),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// ─── Folders ────────────────────────────────────────────────────────
|
|
88
|
+
async listFolders() {
|
|
89
|
+
return this.request('/folders');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { NotezClient } from './client.js';
|
|
4
|
+
import { createNotezServer } from './server.js';
|
|
5
|
+
// Read configuration from environment
|
|
6
|
+
const NOTEZ_URL = process.env.NOTEZ_URL;
|
|
7
|
+
const NOTEZ_API_TOKEN = process.env.NOTEZ_API_TOKEN;
|
|
8
|
+
if (!NOTEZ_URL) {
|
|
9
|
+
console.error('Error: NOTEZ_URL environment variable is required');
|
|
10
|
+
console.error('Example: NOTEZ_URL=https://notez.example.com');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
if (!NOTEZ_API_TOKEN) {
|
|
14
|
+
console.error('Error: NOTEZ_API_TOKEN environment variable is required');
|
|
15
|
+
console.error('Create a token via: curl -X POST $NOTEZ_URL/api/tokens -H "Authorization: Bearer <jwt>"');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
// Create client and server
|
|
19
|
+
const client = new NotezClient(NOTEZ_URL, NOTEZ_API_TOKEN);
|
|
20
|
+
const server = createNotezServer(client);
|
|
21
|
+
// Connect via stdio transport
|
|
22
|
+
const transport = new StdioServerTransport();
|
|
23
|
+
await server.connect(transport);
|
|
24
|
+
console.error('Notez MCP server running on stdio');
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,sCAAsC;AACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AACxC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACnE,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,eAAe,EAAE,CAAC;IACrB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACzE,OAAO,CAAC,KAAK,CAAC,yFAAyF,CAAC,CAAC;IACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,2BAA2B;AAC3B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAC3D,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC"}
|
package/build/server.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import * as z from 'zod/v4';
|
|
3
|
+
/**
|
|
4
|
+
* Create and configure the Notez MCP server with all tools
|
|
5
|
+
*/
|
|
6
|
+
export function createNotezServer(client) {
|
|
7
|
+
const server = new McpServer({
|
|
8
|
+
name: 'notez',
|
|
9
|
+
version: '1.6.0',
|
|
10
|
+
});
|
|
11
|
+
// ─── Notes (read) ───────────────────────────────────────────────────
|
|
12
|
+
server.registerTool('notez_search_notes', {
|
|
13
|
+
description: 'Search notes by keyword or phrase. Returns matching notes with snippets.',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
query: z.string().describe('Search query (keywords or phrase)'),
|
|
16
|
+
limit: z.number().min(1).max(50).default(20).describe('Max results to return'),
|
|
17
|
+
},
|
|
18
|
+
}, async ({ query, limit }) => {
|
|
19
|
+
try {
|
|
20
|
+
const result = await client.searchNotes(query, limit);
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return {
|
|
27
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
28
|
+
isError: true,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
server.registerTool('notez_get_note', {
|
|
33
|
+
description: 'Get a note by its ID. Returns full content including plain text version.',
|
|
34
|
+
inputSchema: {
|
|
35
|
+
id: z.string().uuid().describe('Note UUID'),
|
|
36
|
+
},
|
|
37
|
+
}, async ({ id }) => {
|
|
38
|
+
try {
|
|
39
|
+
const note = await client.getNote(id);
|
|
40
|
+
return {
|
|
41
|
+
content: [{ type: 'text', text: JSON.stringify(note, null, 2) }],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
47
|
+
isError: true,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
server.registerTool('notez_get_note_by_title', {
|
|
52
|
+
description: 'Find a note by its exact title (case-insensitive match).',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
title: z.string().describe('Exact note title to search for'),
|
|
55
|
+
},
|
|
56
|
+
}, async ({ title }) => {
|
|
57
|
+
try {
|
|
58
|
+
const note = await client.getNoteByTitle(title);
|
|
59
|
+
return {
|
|
60
|
+
content: [{ type: 'text', text: JSON.stringify(note, null, 2) }],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
server.registerTool('notez_list_recent', {
|
|
71
|
+
description: 'List recently modified notes, sorted by last update time.',
|
|
72
|
+
inputSchema: {
|
|
73
|
+
limit: z.number().min(1).max(50).default(20).describe('Max notes to return'),
|
|
74
|
+
},
|
|
75
|
+
}, async ({ limit }) => {
|
|
76
|
+
try {
|
|
77
|
+
const result = await client.listRecentNotes(limit);
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return {
|
|
84
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
85
|
+
isError: true,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
// ─── Notes (write) ──────────────────────────────────────────────────
|
|
90
|
+
server.registerTool('notez_create_note', {
|
|
91
|
+
description: 'Create a new note. Content should be HTML format.',
|
|
92
|
+
inputSchema: {
|
|
93
|
+
title: z.string().describe('Note title'),
|
|
94
|
+
content: z.string().optional().describe('Note content (HTML)'),
|
|
95
|
+
folderId: z.string().uuid().optional().describe('Folder UUID to place note in'),
|
|
96
|
+
tags: z.array(z.string()).optional().describe('Tag names to attach'),
|
|
97
|
+
},
|
|
98
|
+
}, async ({ title, content, folderId, tags }) => {
|
|
99
|
+
try {
|
|
100
|
+
const note = await client.createNote({ title, content, folderId, tags });
|
|
101
|
+
return {
|
|
102
|
+
content: [{ type: 'text', text: JSON.stringify(note, null, 2) }],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return {
|
|
107
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
108
|
+
isError: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
server.registerTool('notez_append_to_note', {
|
|
113
|
+
description: 'Append content to an existing note. Content is added to the end.',
|
|
114
|
+
inputSchema: {
|
|
115
|
+
id: z.string().uuid().describe('Note UUID'),
|
|
116
|
+
content: z.string().describe('Content to append (HTML)'),
|
|
117
|
+
},
|
|
118
|
+
}, async ({ id, content }) => {
|
|
119
|
+
try {
|
|
120
|
+
const note = await client.appendToNote(id, content);
|
|
121
|
+
return {
|
|
122
|
+
content: [{ type: 'text', text: JSON.stringify(note, null, 2) }],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
return {
|
|
127
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
128
|
+
isError: true,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// ─── Tasks (read) ──────────────────────────────────────────────────
|
|
133
|
+
server.registerTool('notez_list_tasks', {
|
|
134
|
+
description: 'List tasks, optionally filtered by status. Returns tasks sorted by priority.',
|
|
135
|
+
inputSchema: {
|
|
136
|
+
status: z.enum(['PENDING', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED']).optional()
|
|
137
|
+
.describe('Filter by task status'),
|
|
138
|
+
limit: z.number().min(1).max(50).default(20).describe('Max tasks to return'),
|
|
139
|
+
},
|
|
140
|
+
}, async ({ status, limit }) => {
|
|
141
|
+
try {
|
|
142
|
+
const result = await client.listTasks(status, limit);
|
|
143
|
+
return {
|
|
144
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return {
|
|
149
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
150
|
+
isError: true,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
server.registerTool('notez_get_task', {
|
|
155
|
+
description: 'Get a task by its ID. Returns full task details including links and tags.',
|
|
156
|
+
inputSchema: {
|
|
157
|
+
id: z.string().uuid().describe('Task UUID'),
|
|
158
|
+
},
|
|
159
|
+
}, async ({ id }) => {
|
|
160
|
+
try {
|
|
161
|
+
const task = await client.getTask(id);
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: 'text', text: JSON.stringify(task, null, 2) }],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return {
|
|
168
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
169
|
+
isError: true,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// ─── Tasks (write) ─────────────────────────────────────────────────
|
|
174
|
+
server.registerTool('notez_create_task', {
|
|
175
|
+
description: 'Create a new task with optional priority, due date, and tags.',
|
|
176
|
+
inputSchema: {
|
|
177
|
+
title: z.string().describe('Task title'),
|
|
178
|
+
description: z.string().optional().describe('Task description'),
|
|
179
|
+
priority: z.enum(['LOW', 'MEDIUM', 'HIGH', 'URGENT']).optional()
|
|
180
|
+
.describe('Task priority (default: MEDIUM)'),
|
|
181
|
+
dueDate: z.string().optional().describe('Due date (ISO 8601 datetime)'),
|
|
182
|
+
folderId: z.string().uuid().optional().describe('Folder UUID'),
|
|
183
|
+
tags: z.array(z.string()).optional().describe('Tag names to attach'),
|
|
184
|
+
},
|
|
185
|
+
}, async ({ title, description, priority, dueDate, folderId, tags }) => {
|
|
186
|
+
try {
|
|
187
|
+
const task = await client.createTask({ title, description, priority, dueDate, folderId, tags });
|
|
188
|
+
return {
|
|
189
|
+
content: [{ type: 'text', text: JSON.stringify(task, null, 2) }],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
return {
|
|
194
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
195
|
+
isError: true,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
server.registerTool('notez_update_task_status', {
|
|
200
|
+
description: 'Update the status of an existing task.',
|
|
201
|
+
inputSchema: {
|
|
202
|
+
id: z.string().uuid().describe('Task UUID'),
|
|
203
|
+
status: z.enum(['PENDING', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'])
|
|
204
|
+
.describe('New task status'),
|
|
205
|
+
},
|
|
206
|
+
}, async ({ id, status }) => {
|
|
207
|
+
try {
|
|
208
|
+
const task = await client.updateTaskStatus(id, status);
|
|
209
|
+
return {
|
|
210
|
+
content: [{ type: 'text', text: JSON.stringify(task, null, 2) }],
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
return {
|
|
215
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
216
|
+
isError: true,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
// ─── Folders ────────────────────────────────────────────────────────
|
|
221
|
+
server.registerTool('notez_list_folders', {
|
|
222
|
+
description: 'List all folders with their note counts.',
|
|
223
|
+
inputSchema: {},
|
|
224
|
+
}, async () => {
|
|
225
|
+
try {
|
|
226
|
+
const folders = await client.listFolders();
|
|
227
|
+
return {
|
|
228
|
+
content: [{ type: 'text', text: JSON.stringify(folders, null, 2) }],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
return {
|
|
233
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
234
|
+
isError: true,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
return server;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Shared types for the Notez MCP server */
|
|
2
|
+
export interface NotezNote {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
content: string | null;
|
|
6
|
+
plainText?: string | null;
|
|
7
|
+
folderId: string | null;
|
|
8
|
+
createdAt: string;
|
|
9
|
+
updatedAt: string;
|
|
10
|
+
folder?: {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
} | null;
|
|
14
|
+
tags: {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
}[];
|
|
18
|
+
}
|
|
19
|
+
export interface NotezTask {
|
|
20
|
+
id: string;
|
|
21
|
+
title: string;
|
|
22
|
+
description: string | null;
|
|
23
|
+
status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | 'CANCELLED';
|
|
24
|
+
priority: 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT';
|
|
25
|
+
dueDate: string | null;
|
|
26
|
+
noteId: string | null;
|
|
27
|
+
noteTitle: string | null;
|
|
28
|
+
folderId: string | null;
|
|
29
|
+
createdAt: string;
|
|
30
|
+
updatedAt: string;
|
|
31
|
+
completedAt: string | null;
|
|
32
|
+
folder?: {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
} | null;
|
|
36
|
+
note?: {
|
|
37
|
+
id: string;
|
|
38
|
+
title: string;
|
|
39
|
+
} | null;
|
|
40
|
+
tags: {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
}[];
|
|
44
|
+
}
|
|
45
|
+
export interface NotezFolder {
|
|
46
|
+
id: string;
|
|
47
|
+
name: string;
|
|
48
|
+
icon: string;
|
|
49
|
+
noteCount: number;
|
|
50
|
+
}
|
|
51
|
+
export interface SearchResponse {
|
|
52
|
+
results: NotezNote[];
|
|
53
|
+
total: number;
|
|
54
|
+
hasMore: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface TaskListResponse {
|
|
57
|
+
tasks: NotezTask[];
|
|
58
|
+
total: number;
|
|
59
|
+
limit: number;
|
|
60
|
+
offset: number;
|
|
61
|
+
}
|
|
62
|
+
export interface NoteListResponse {
|
|
63
|
+
notes: NotezNote[];
|
|
64
|
+
total: number;
|
|
65
|
+
}
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4CAA4C"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "notez-mcp",
|
|
3
|
+
"version": "1.8.0",
|
|
4
|
+
"description": "MCP server for Notez — allows Claude Code to read and manage notes and tasks",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "build/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"notez-mcp": "build/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"build/",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/SpasticPalate/notez.git",
|
|
22
|
+
"directory": "notez-mcp"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"mcp",
|
|
26
|
+
"notez",
|
|
27
|
+
"notes",
|
|
28
|
+
"claude",
|
|
29
|
+
"ai"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"start": "node build/index.js",
|
|
34
|
+
"prepublishOnly": "npm run build"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
38
|
+
"zod": "^3.23.8"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^20.14.0",
|
|
42
|
+
"typescript": "^5.9.3"
|
|
43
|
+
}
|
|
44
|
+
}
|