@nonz250/notepm-mcp-server 0.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/LICENSE +21 -0
- package/README.md +143 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/notepm-client.d.ts +107 -0
- package/dist/notepm-client.d.ts.map +1 -0
- package/dist/notepm-client.js +102 -0
- package/dist/notepm-client.js.map +1 -0
- package/dist/tools/constants.d.ts +21 -0
- package/dist/tools/constants.d.ts.map +1 -0
- package/dist/tools/constants.js +17 -0
- package/dist/tools/constants.js.map +1 -0
- package/dist/tools/definitions.d.ts +6 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +37 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers.d.ts +10 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +110 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/schemas.d.ts +44 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +43 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools.d.ts +51 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +179 -0
- package/dist/tools.js.map +1 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 nonz250
|
|
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,143 @@
|
|
|
1
|
+
# notepm-mcp-server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@nonz250/notepm-mcp-server)
|
|
4
|
+
|
|
5
|
+
An unofficial [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for [NotePM](https://notepm.jp/) - a knowledge management and documentation platform.
|
|
6
|
+
|
|
7
|
+
This server enables AI assistants like Claude to search, read, create, update, and delete pages in your NotePM workspace.
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
- Node.js >= 22
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
### Using npx (Recommended)
|
|
16
|
+
|
|
17
|
+
No installation required. Configure your MCP client to run the server directly with `npx`.
|
|
18
|
+
|
|
19
|
+
### Global Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g @nonz250/notepm-mcp-server
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Configuration
|
|
26
|
+
|
|
27
|
+
### Claude Desktop
|
|
28
|
+
|
|
29
|
+
Add the following to your Claude Desktop configuration file:
|
|
30
|
+
|
|
31
|
+
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
32
|
+
|
|
33
|
+
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"mcpServers": {
|
|
38
|
+
"notepm": {
|
|
39
|
+
"command": "npx",
|
|
40
|
+
"args": ["-y", "@nonz250/notepm-mcp-server"],
|
|
41
|
+
"env": {
|
|
42
|
+
"NOTEPM_TEAM_DOMAIN": "your-team-domain",
|
|
43
|
+
"NOTEPM_ACCESS_TOKEN": "your-access-token"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Claude Code
|
|
51
|
+
|
|
52
|
+
Add the following to your Claude Code settings file (`.claude/settings.json` or `.claude/settings.local.json`):
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"mcpServers": {
|
|
57
|
+
"notepm": {
|
|
58
|
+
"command": "npx",
|
|
59
|
+
"args": ["-y", "@nonz250/notepm-mcp-server"],
|
|
60
|
+
"env": {
|
|
61
|
+
"NOTEPM_TEAM_DOMAIN": "your-team-domain",
|
|
62
|
+
"NOTEPM_ACCESS_TOKEN": "your-access-token"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Using Global Installation
|
|
70
|
+
|
|
71
|
+
If you installed globally, replace `npx` with the direct command:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"mcpServers": {
|
|
76
|
+
"notepm": {
|
|
77
|
+
"command": "notepm-mcp-server",
|
|
78
|
+
"env": {
|
|
79
|
+
"NOTEPM_TEAM_DOMAIN": "your-team-domain",
|
|
80
|
+
"NOTEPM_ACCESS_TOKEN": "your-access-token"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Available Tools
|
|
88
|
+
|
|
89
|
+
| Tool | Description |
|
|
90
|
+
|------|-------------|
|
|
91
|
+
| `search_pages` | Search NotePM pages by keyword, note, or tag |
|
|
92
|
+
| `get_page` | Get a page's full content including title, body, and tags |
|
|
93
|
+
| `create_page` | Create a new page in a specified note |
|
|
94
|
+
| `update_page` | Update an existing page's content |
|
|
95
|
+
| `delete_page` | Delete a page (irreversible) |
|
|
96
|
+
|
|
97
|
+
## Environment Variables
|
|
98
|
+
|
|
99
|
+
| Variable | Required | Description |
|
|
100
|
+
|----------|----------|-------------|
|
|
101
|
+
| `NOTEPM_TEAM_DOMAIN` | Yes | Your NotePM team domain (e.g., `demo` for `demo.notepm.jp`) |
|
|
102
|
+
| `NOTEPM_ACCESS_TOKEN` | Yes | API access token from NotePM |
|
|
103
|
+
|
|
104
|
+
## Getting an Access Token
|
|
105
|
+
|
|
106
|
+
1. Log in to your NotePM workspace
|
|
107
|
+
2. Go to **Personal Settings** > **Access Token**
|
|
108
|
+
3. Generate a new access token
|
|
109
|
+
4. Copy the token and use it in your configuration
|
|
110
|
+
|
|
111
|
+
## Development
|
|
112
|
+
|
|
113
|
+
### Setup
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
git clone https://github.com/nonz250/notepm-mcp-server.git
|
|
117
|
+
cd notepm-mcp-server
|
|
118
|
+
npm install
|
|
119
|
+
npm run build
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Running Locally
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
NOTEPM_TEAM_DOMAIN=your-team NOTEPM_ACCESS_TOKEN=your-token npm run start
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Running Tests
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npm test
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Linting and Formatting
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
npm run lint
|
|
138
|
+
npm run format
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
|
|
143
|
+
MIT
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load configuration from environment variables
|
|
3
|
+
*
|
|
4
|
+
* Required environment variables:
|
|
5
|
+
* - NOTEPM_TEAM_DOMAIN: Team domain (e.g., "demo" → demo.notepm.jp)
|
|
6
|
+
* - NOTEPM_ACCESS_TOKEN: API access token
|
|
7
|
+
*/
|
|
8
|
+
export interface Config {
|
|
9
|
+
teamDomain: string;
|
|
10
|
+
accessToken: string;
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function loadConfig(): Config;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,IAAI,MAAM,CAyBnC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load configuration from environment variables
|
|
3
|
+
*
|
|
4
|
+
* Required environment variables:
|
|
5
|
+
* - NOTEPM_TEAM_DOMAIN: Team domain (e.g., "demo" → demo.notepm.jp)
|
|
6
|
+
* - NOTEPM_ACCESS_TOKEN: API access token
|
|
7
|
+
*/
|
|
8
|
+
export function loadConfig() {
|
|
9
|
+
const teamDomain = process.env.NOTEPM_TEAM_DOMAIN;
|
|
10
|
+
const accessToken = process.env.NOTEPM_ACCESS_TOKEN;
|
|
11
|
+
if (!teamDomain) {
|
|
12
|
+
throw new Error("Environment variable NOTEPM_TEAM_DOMAIN is not set.\n" +
|
|
13
|
+
"Example: export NOTEPM_TEAM_DOMAIN=demo");
|
|
14
|
+
}
|
|
15
|
+
if (!accessToken) {
|
|
16
|
+
throw new Error("Environment variable NOTEPM_ACCESS_TOKEN is not set.\n" +
|
|
17
|
+
"Get it from NotePM: Personal Settings > Access Token");
|
|
18
|
+
}
|
|
19
|
+
const baseUrl = `https://${teamDomain}.notepm.jp/api/v1`;
|
|
20
|
+
return {
|
|
21
|
+
teamDomain,
|
|
22
|
+
accessToken,
|
|
23
|
+
baseUrl,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAEpD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,uDAAuD;YACrD,yCAAyC,CAC5C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,wDAAwD;YACtD,sDAAsD,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,UAAU,mBAAmB,CAAC;IAEzD,OAAO;QACL,UAAU;QACV,WAAW;QACX,OAAO;KACR,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* NotePM MCP Server
|
|
4
|
+
*
|
|
5
|
+
* MCP server for NotePM API integration.
|
|
6
|
+
* Enables Claude Desktop and Claude Code to search, retrieve, and create NotePM pages.
|
|
7
|
+
*
|
|
8
|
+
* Required environment variables:
|
|
9
|
+
* - NOTEPM_TEAM_DOMAIN: Team domain (e.g., "demo")
|
|
10
|
+
* - NOTEPM_ACCESS_TOKEN: API access token
|
|
11
|
+
*/
|
|
12
|
+
import { createRequire } from "node:module";
|
|
13
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
14
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
15
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
16
|
+
import { loadConfig } from "./config.js";
|
|
17
|
+
import { NotePMClient } from "./notepm-client.js";
|
|
18
|
+
import { TOOLS, handleToolCall } from "./tools/index.js";
|
|
19
|
+
// ============================================================
|
|
20
|
+
// Load package info
|
|
21
|
+
// ============================================================
|
|
22
|
+
const require = createRequire(import.meta.url);
|
|
23
|
+
const packageJson = require("../package.json");
|
|
24
|
+
// ============================================================
|
|
25
|
+
// Load configuration and initialize client
|
|
26
|
+
// ============================================================
|
|
27
|
+
const config = loadConfig();
|
|
28
|
+
const client = new NotePMClient(config);
|
|
29
|
+
// ============================================================
|
|
30
|
+
// Create server instance
|
|
31
|
+
// ============================================================
|
|
32
|
+
// TODO: Consider migrating to McpServer high-level API
|
|
33
|
+
// Currently using Server for setRequestHandler which requires low-level API
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
35
|
+
const server = new Server({
|
|
36
|
+
name: packageJson.name,
|
|
37
|
+
version: packageJson.version,
|
|
38
|
+
}, {
|
|
39
|
+
capabilities: {
|
|
40
|
+
tools: {},
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
// ============================================================
|
|
44
|
+
// Set up request handlers
|
|
45
|
+
// ============================================================
|
|
46
|
+
/**
|
|
47
|
+
* Handler for tools/list request
|
|
48
|
+
*/
|
|
49
|
+
server.setRequestHandler(ListToolsRequestSchema, () => {
|
|
50
|
+
return { tools: TOOLS };
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Handler for tools/call request
|
|
54
|
+
*/
|
|
55
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
56
|
+
const { name, arguments: args } = request.params;
|
|
57
|
+
return handleToolCall(client, name, args);
|
|
58
|
+
});
|
|
59
|
+
// ============================================================
|
|
60
|
+
// Start server
|
|
61
|
+
// ============================================================
|
|
62
|
+
async function main() {
|
|
63
|
+
const transport = new StdioServerTransport();
|
|
64
|
+
await server.connect(transport);
|
|
65
|
+
console.error(`NotePM MCP Server started (${config.teamDomain}.notepm.jp)`);
|
|
66
|
+
}
|
|
67
|
+
main().catch((error) => {
|
|
68
|
+
console.error("Server startup error:", error);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzD,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF,+DAA+D;AAC/D,2CAA2C;AAC3C,+DAA+D;AAE/D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAExC,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D,uDAAuD;AACvD,4EAA4E;AAC5E,4DAA4D;AAC5D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8BAA8B,MAAM,CAAC,UAAU,aAAa,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotePM API Client
|
|
3
|
+
*
|
|
4
|
+
* Handles communication with NotePM REST API
|
|
5
|
+
* https://notepm.jp/docs/api
|
|
6
|
+
*/
|
|
7
|
+
import { Config } from "./config.js";
|
|
8
|
+
/** User information */
|
|
9
|
+
export interface User {
|
|
10
|
+
user_code: string;
|
|
11
|
+
name: string;
|
|
12
|
+
}
|
|
13
|
+
/** Tag information */
|
|
14
|
+
export interface Tag {
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
/** Page information */
|
|
18
|
+
export interface Page {
|
|
19
|
+
page_code: string;
|
|
20
|
+
note_code: string;
|
|
21
|
+
folder_id: number | null;
|
|
22
|
+
title: string;
|
|
23
|
+
body: string;
|
|
24
|
+
memo: string;
|
|
25
|
+
created_at: string;
|
|
26
|
+
updated_at: string;
|
|
27
|
+
created_by: User;
|
|
28
|
+
updated_by: User;
|
|
29
|
+
tags: Tag[];
|
|
30
|
+
}
|
|
31
|
+
/** Pagination metadata */
|
|
32
|
+
export interface PaginationMeta {
|
|
33
|
+
previous_page: string | null;
|
|
34
|
+
next_page: string | null;
|
|
35
|
+
page: number;
|
|
36
|
+
per_page: number;
|
|
37
|
+
total: number;
|
|
38
|
+
}
|
|
39
|
+
/** Pages list response */
|
|
40
|
+
export interface PagesResponse {
|
|
41
|
+
pages: Page[];
|
|
42
|
+
meta: PaginationMeta;
|
|
43
|
+
}
|
|
44
|
+
/** Single page response */
|
|
45
|
+
export interface PageResponse {
|
|
46
|
+
page: Page;
|
|
47
|
+
}
|
|
48
|
+
/** Search pages parameters */
|
|
49
|
+
export interface SearchPagesParams {
|
|
50
|
+
q?: string;
|
|
51
|
+
only_title?: boolean;
|
|
52
|
+
include_archived?: boolean;
|
|
53
|
+
note_code?: string;
|
|
54
|
+
tag_name?: string;
|
|
55
|
+
page?: number;
|
|
56
|
+
per_page?: number;
|
|
57
|
+
}
|
|
58
|
+
/** Create page parameters */
|
|
59
|
+
export interface CreatePageParams {
|
|
60
|
+
note_code: string;
|
|
61
|
+
title: string;
|
|
62
|
+
body?: string;
|
|
63
|
+
memo?: string;
|
|
64
|
+
folder_id?: number;
|
|
65
|
+
tags?: string[];
|
|
66
|
+
}
|
|
67
|
+
/** API Error */
|
|
68
|
+
export declare class NotePMAPIError extends Error {
|
|
69
|
+
statusCode: number;
|
|
70
|
+
statusText: string;
|
|
71
|
+
constructor(statusCode: number, statusText: string, message: string);
|
|
72
|
+
}
|
|
73
|
+
export declare class NotePMClient {
|
|
74
|
+
private baseUrl;
|
|
75
|
+
private accessToken;
|
|
76
|
+
constructor(config: Config);
|
|
77
|
+
/**
|
|
78
|
+
* Send API request
|
|
79
|
+
*/
|
|
80
|
+
private request;
|
|
81
|
+
/**
|
|
82
|
+
* Search pages
|
|
83
|
+
* GET /api/v1/pages
|
|
84
|
+
*/
|
|
85
|
+
searchPages(params?: SearchPagesParams): Promise<PagesResponse>;
|
|
86
|
+
/**
|
|
87
|
+
* Get page
|
|
88
|
+
* GET /api/v1/pages/:page_code
|
|
89
|
+
*/
|
|
90
|
+
getPage(pageCode: string): Promise<Page>;
|
|
91
|
+
/**
|
|
92
|
+
* Create page
|
|
93
|
+
* POST /api/v1/pages
|
|
94
|
+
*/
|
|
95
|
+
createPage(params: CreatePageParams): Promise<Page>;
|
|
96
|
+
/**
|
|
97
|
+
* Update page
|
|
98
|
+
* PATCH /api/v1/pages/:page_code
|
|
99
|
+
*/
|
|
100
|
+
updatePage(pageCode: string, params: Partial<Omit<CreatePageParams, "note_code">>): Promise<Page>;
|
|
101
|
+
/**
|
|
102
|
+
* Delete page
|
|
103
|
+
* DELETE /api/v1/pages/:page_code
|
|
104
|
+
*/
|
|
105
|
+
deletePage(pageCode: string): Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=notepm-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notepm-client.d.ts","sourceRoot":"","sources":["../src/notepm-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** API Error */
|
|
2
|
+
export class NotePMAPIError extends Error {
|
|
3
|
+
statusCode;
|
|
4
|
+
statusText;
|
|
5
|
+
constructor(statusCode, statusText, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.statusCode = statusCode;
|
|
8
|
+
this.statusText = statusText;
|
|
9
|
+
this.name = "NotePMAPIError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// ============================================================
|
|
13
|
+
// API Client
|
|
14
|
+
// ============================================================
|
|
15
|
+
export class NotePMClient {
|
|
16
|
+
baseUrl;
|
|
17
|
+
accessToken;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.baseUrl = config.baseUrl;
|
|
20
|
+
this.accessToken = config.accessToken;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Send API request
|
|
24
|
+
*/
|
|
25
|
+
async request(method, path, body) {
|
|
26
|
+
const url = `${this.baseUrl}${path}`;
|
|
27
|
+
const headers = {
|
|
28
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
29
|
+
"Content-Type": "application/json",
|
|
30
|
+
};
|
|
31
|
+
const response = await fetch(url, {
|
|
32
|
+
method,
|
|
33
|
+
headers,
|
|
34
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
const errorText = await response.text();
|
|
38
|
+
throw new NotePMAPIError(response.status, response.statusText, `NotePM API Error: ${String(response.status)} ${response.statusText}\n${errorText}`);
|
|
39
|
+
}
|
|
40
|
+
// Return empty object for 204 No Content
|
|
41
|
+
if (response.status === 204) {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
return response.json();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Search pages
|
|
48
|
+
* GET /api/v1/pages
|
|
49
|
+
*/
|
|
50
|
+
async searchPages(params = {}) {
|
|
51
|
+
const searchParams = new URLSearchParams();
|
|
52
|
+
if (params.q)
|
|
53
|
+
searchParams.set("q", params.q);
|
|
54
|
+
if (params.only_title)
|
|
55
|
+
searchParams.set("only_title", "true");
|
|
56
|
+
if (params.include_archived)
|
|
57
|
+
searchParams.set("include_archived", "true");
|
|
58
|
+
if (params.note_code)
|
|
59
|
+
searchParams.set("note_code", params.note_code);
|
|
60
|
+
if (params.tag_name)
|
|
61
|
+
searchParams.set("tag_name", params.tag_name);
|
|
62
|
+
if (params.page)
|
|
63
|
+
searchParams.set("page", params.page.toString());
|
|
64
|
+
if (params.per_page)
|
|
65
|
+
searchParams.set("per_page", params.per_page.toString());
|
|
66
|
+
const query = searchParams.toString();
|
|
67
|
+
const path = `/pages${query ? `?${query}` : ""}`;
|
|
68
|
+
return this.request("GET", path);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get page
|
|
72
|
+
* GET /api/v1/pages/:page_code
|
|
73
|
+
*/
|
|
74
|
+
async getPage(pageCode) {
|
|
75
|
+
const response = await this.request("GET", `/pages/${pageCode}`);
|
|
76
|
+
return response.page;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create page
|
|
80
|
+
* POST /api/v1/pages
|
|
81
|
+
*/
|
|
82
|
+
async createPage(params) {
|
|
83
|
+
const response = await this.request("POST", "/pages", params);
|
|
84
|
+
return response.page;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Update page
|
|
88
|
+
* PATCH /api/v1/pages/:page_code
|
|
89
|
+
*/
|
|
90
|
+
async updatePage(pageCode, params) {
|
|
91
|
+
const response = await this.request("PATCH", `/pages/${pageCode}`, params);
|
|
92
|
+
return response.page;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Delete page
|
|
96
|
+
* DELETE /api/v1/pages/:page_code
|
|
97
|
+
*/
|
|
98
|
+
async deletePage(pageCode) {
|
|
99
|
+
await this.request("DELETE", `/pages/${pageCode}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=notepm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notepm-client.js","sourceRoot":"","sources":["../src/notepm-client.ts"],"names":[],"mappings":"AA+EA,gBAAgB;AAChB,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE9B;IACA;IAFT,YACS,UAAkB,EAClB,UAAkB,EACzB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,eAAU,GAAV,UAAU,CAAQ;QAClB,eAAU,GAAV,UAAU,CAAQ;QAIzB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D,MAAM,OAAO,YAAY;IACf,OAAO,CAAS;IAChB,WAAW,CAAS;IAE5B,YAAY,MAAc;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACnE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAErC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;YAC3C,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,cAAc,CACtB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,EACnB,qBAAqB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CACpF,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,EAAO,CAAC;QACjB,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,SAA4B,EAAE;QAC9C,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAE3C,IAAI,MAAM,CAAC,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,UAAU;YAAE,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,gBAAgB;YAAE,YAAY,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC1E,IAAI,MAAM,CAAC,SAAS;YAAE,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,QAAQ;YAAE,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,IAAI;YAAE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,QAAQ;YAAE,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE9E,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAEjD,OAAO,IAAI,CAAC,OAAO,CAAgB,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAe,KAAK,EAAE,UAAU,QAAQ,EAAE,CAAC,CAAC;QAC/E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,MAAwB;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAe,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,QAAgB,EAChB,MAAoD;QAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAe,OAAO,EAAE,UAAU,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QACzF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,IAAI,CAAC,OAAO,CAAY,QAAQ,EAAE,UAAU,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Constants
|
|
3
|
+
*
|
|
4
|
+
* Centralized constants for tool names to ensure type safety
|
|
5
|
+
* and prevent string duplication across the codebase.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Tool names used throughout the MCP server
|
|
9
|
+
*/
|
|
10
|
+
export declare const TOOL_NAMES: {
|
|
11
|
+
readonly SEARCH_PAGES: "search_pages";
|
|
12
|
+
readonly GET_PAGE: "get_page";
|
|
13
|
+
readonly CREATE_PAGE: "create_page";
|
|
14
|
+
readonly UPDATE_PAGE: "update_page";
|
|
15
|
+
readonly DELETE_PAGE: "delete_page";
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Type representing valid tool names
|
|
19
|
+
*/
|
|
20
|
+
export type ToolName = (typeof TOOL_NAMES)[keyof typeof TOOL_NAMES];
|
|
21
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/tools/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Constants
|
|
3
|
+
*
|
|
4
|
+
* Centralized constants for tool names to ensure type safety
|
|
5
|
+
* and prevent string duplication across the codebase.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Tool names used throughout the MCP server
|
|
9
|
+
*/
|
|
10
|
+
export const TOOL_NAMES = {
|
|
11
|
+
SEARCH_PAGES: "search_pages",
|
|
12
|
+
GET_PAGE: "get_page",
|
|
13
|
+
CREATE_PAGE: "create_page",
|
|
14
|
+
UPDATE_PAGE: "update_page",
|
|
15
|
+
DELETE_PAGE: "delete_page",
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/tools/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,YAAY,EAAE,cAAc;IAC5B,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,aAAa;CAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAmB/D,eAAO,MAAM,KAAK,EAAE,IAAI,EA0BvB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { TOOL_NAMES } from "./constants.js";
|
|
3
|
+
import { CreatePageInputSchema, DeletePageInputSchema, GetPageInputSchema, SearchPagesInputSchema, UpdatePageInputSchema, } from "./schemas.js";
|
|
4
|
+
/**
|
|
5
|
+
* Convert Zod schema to MCP-compatible JSON Schema
|
|
6
|
+
*/
|
|
7
|
+
function toInputSchema(schema) {
|
|
8
|
+
return z.toJSONSchema(schema, { target: "draft-07" });
|
|
9
|
+
}
|
|
10
|
+
export const TOOLS = [
|
|
11
|
+
{
|
|
12
|
+
name: TOOL_NAMES.SEARCH_PAGES,
|
|
13
|
+
description: "Search NotePM pages. Can filter by keyword, note, or tag.",
|
|
14
|
+
inputSchema: toInputSchema(SearchPagesInputSchema),
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: TOOL_NAMES.GET_PAGE,
|
|
18
|
+
description: "Get a NotePM page. Retrieve title, body, tags and other details by page code.",
|
|
19
|
+
inputSchema: toInputSchema(GetPageInputSchema),
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: TOOL_NAMES.CREATE_PAGE,
|
|
23
|
+
description: "Create a new page in NotePM. Note code and title are required.",
|
|
24
|
+
inputSchema: toInputSchema(CreatePageInputSchema),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: TOOL_NAMES.UPDATE_PAGE,
|
|
28
|
+
description: "Update an existing NotePM page. Page code is required.",
|
|
29
|
+
inputSchema: toInputSchema(UpdatePageInputSchema),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: TOOL_NAMES.DELETE_PAGE,
|
|
33
|
+
description: "Delete a NotePM page. This action cannot be undone.",
|
|
34
|
+
inputSchema: toInputSchema(DeletePageInputSchema),
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
//# sourceMappingURL=definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,SAAS,aAAa,CAAC,MAAiB;IACtC,OAAO,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAwB,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAW;IAC3B;QACE,IAAI,EAAE,UAAU,CAAC,YAAY;QAC7B,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,aAAa,CAAC,sBAAsB,CAAC;KACnD;IACD;QACE,IAAI,EAAE,UAAU,CAAC,QAAQ;QACzB,WAAW,EAAE,+EAA+E;QAC5F,WAAW,EAAE,aAAa,CAAC,kBAAkB,CAAC;KAC/C;IACD;QACE,IAAI,EAAE,UAAU,CAAC,WAAW;QAC5B,WAAW,EAAE,gEAAgE;QAC7E,WAAW,EAAE,aAAa,CAAC,qBAAqB,CAAC;KAClD;IACD;QACE,IAAI,EAAE,UAAU,CAAC,WAAW;QAC5B,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,aAAa,CAAC,qBAAqB,CAAC;KAClD;IACD;QACE,IAAI,EAAE,UAAU,CAAC,WAAW;QAC5B,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE,aAAa,CAAC,qBAAqB,CAAC;KAClD;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Handlers
|
|
3
|
+
*/
|
|
4
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { NotePMClient } from "../notepm-client.js";
|
|
6
|
+
/**
|
|
7
|
+
* Execute tool
|
|
8
|
+
*/
|
|
9
|
+
export declare function handleToolCall(client: NotePMClient, name: string, args: unknown): Promise<CallToolResult>;
|
|
10
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,EAAkB,YAAY,EAAQ,MAAM,qBAAqB,CAAC;AAwEzE;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,cAAc,CAAC,CA2DzB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { NotePMAPIError } from "../notepm-client.js";
|
|
2
|
+
import { TOOL_NAMES } from "./constants.js";
|
|
3
|
+
import { CreatePageInputSchema, DeletePageInputSchema, GetPageInputSchema, SearchPagesInputSchema, UpdatePageInputSchema, } from "./schemas.js";
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Types and Helpers
|
|
6
|
+
// ============================================================
|
|
7
|
+
/**
|
|
8
|
+
* Create a successful tool result
|
|
9
|
+
*/
|
|
10
|
+
function success(text) {
|
|
11
|
+
return { content: [{ type: "text", text }] };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create an error tool result
|
|
15
|
+
*/
|
|
16
|
+
function error(text) {
|
|
17
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Input validation error
|
|
21
|
+
*/
|
|
22
|
+
class InputError extends Error {
|
|
23
|
+
constructor(message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = "InputError";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse and validate input, throw InputError on failure
|
|
30
|
+
*/
|
|
31
|
+
function parseInput(schema, args) {
|
|
32
|
+
const result = schema.safeParse(args);
|
|
33
|
+
if (!result.success) {
|
|
34
|
+
throw new InputError(result.error.message);
|
|
35
|
+
}
|
|
36
|
+
return result.data;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Format page information
|
|
40
|
+
*/
|
|
41
|
+
function formatPage(page) {
|
|
42
|
+
const tags = page.tags.map((t) => t.name).join(", ") || "None";
|
|
43
|
+
return [
|
|
44
|
+
`## ${page.title}`,
|
|
45
|
+
`- Page code: ${page.page_code}`,
|
|
46
|
+
`- Note code: ${page.note_code}`,
|
|
47
|
+
`- Created by: ${page.created_by.name}`,
|
|
48
|
+
`- Created at: ${page.created_at}`,
|
|
49
|
+
`- Updated at: ${page.updated_at}`,
|
|
50
|
+
`- Tags: ${tags}`,
|
|
51
|
+
"",
|
|
52
|
+
"### Body",
|
|
53
|
+
page.body || "(No body)",
|
|
54
|
+
].join("\n");
|
|
55
|
+
}
|
|
56
|
+
// ============================================================
|
|
57
|
+
// Main Handler
|
|
58
|
+
// ============================================================
|
|
59
|
+
/**
|
|
60
|
+
* Execute tool
|
|
61
|
+
*/
|
|
62
|
+
export async function handleToolCall(client, name, args) {
|
|
63
|
+
try {
|
|
64
|
+
switch (name) {
|
|
65
|
+
case TOOL_NAMES.SEARCH_PAGES: {
|
|
66
|
+
const { query, note_code, tag_name, per_page } = parseInput(SearchPagesInputSchema, args);
|
|
67
|
+
const result = await client.searchPages({ q: query, note_code, tag_name, per_page });
|
|
68
|
+
if (result.pages.length === 0) {
|
|
69
|
+
return success("Search results: 0 pages");
|
|
70
|
+
}
|
|
71
|
+
const pageList = result.pages
|
|
72
|
+
.map((p, i) => `${String(i + 1)}. **${p.title}** (code: ${p.page_code})\n - Note: ${p.note_code} | Updated: ${p.updated_at}`)
|
|
73
|
+
.join("\n");
|
|
74
|
+
return success(`Search results: showing ${String(result.pages.length)} of ${String(result.meta.total)} pages\n\n${pageList}`);
|
|
75
|
+
}
|
|
76
|
+
case TOOL_NAMES.GET_PAGE: {
|
|
77
|
+
const { page_code } = parseInput(GetPageInputSchema, args);
|
|
78
|
+
const page = await client.getPage(page_code);
|
|
79
|
+
return success(formatPage(page));
|
|
80
|
+
}
|
|
81
|
+
case TOOL_NAMES.CREATE_PAGE: {
|
|
82
|
+
const { note_code, title, body, memo, tags } = parseInput(CreatePageInputSchema, args);
|
|
83
|
+
const page = await client.createPage({ note_code, title, body, memo, tags });
|
|
84
|
+
return success(`Page created.\n\n${formatPage(page)}`);
|
|
85
|
+
}
|
|
86
|
+
case TOOL_NAMES.UPDATE_PAGE: {
|
|
87
|
+
const { page_code, title, body, memo, tags } = parseInput(UpdatePageInputSchema, args);
|
|
88
|
+
const page = await client.updatePage(page_code, { title, body, memo, tags });
|
|
89
|
+
return success(`Page updated.\n\n${formatPage(page)}`);
|
|
90
|
+
}
|
|
91
|
+
case TOOL_NAMES.DELETE_PAGE: {
|
|
92
|
+
const { page_code } = parseInput(DeletePageInputSchema, args);
|
|
93
|
+
await client.deletePage(page_code);
|
|
94
|
+
return success(`Page deleted: ${page_code}`);
|
|
95
|
+
}
|
|
96
|
+
default:
|
|
97
|
+
return error(`Unknown tool: ${name}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err instanceof InputError) {
|
|
102
|
+
return error(`Input error: ${err.message}`);
|
|
103
|
+
}
|
|
104
|
+
if (err instanceof NotePMAPIError) {
|
|
105
|
+
return error(err.message);
|
|
106
|
+
}
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAsB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAY,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D;;GAEG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAW,SAAQ,KAAK;IAC5B,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,SAAS,UAAU,CAAsB,MAAS,EAAE,IAAa;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,IAAU;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IAC/D,OAAO;QACL,MAAM,IAAI,CAAC,KAAK,EAAE;QAClB,gBAAgB,IAAI,CAAC,SAAS,EAAE;QAChC,gBAAgB,IAAI,CAAC,SAAS,EAAE;QAChC,iBAAiB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACvC,iBAAiB,IAAI,CAAC,UAAU,EAAE;QAClC,iBAAiB,IAAI,CAAC,UAAU,EAAE;QAClC,WAAW,IAAI,EAAE;QACjB,EAAE;QACF,UAAU;QACV,IAAI,CAAC,IAAI,IAAI,WAAW;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAoB,EACpB,IAAY,EACZ,IAAa;IAEb,IAAI,CAAC;QACH,QAAQ,IAAgB,EAAE,CAAC;YACzB,KAAK,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;gBAC1F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAErF,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,OAAO,OAAO,CAAC,yBAAyB,CAAC,CAAC;gBAC5C,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK;qBAC1B,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,SAAS,iBAAiB,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,UAAU,EAAE,CAClH;qBACA,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,OAAO,OAAO,CACZ,2BAA2B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,QAAQ,EAAE,CAC9G,CAAC;YACJ,CAAC;YAED,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACzB,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBAC3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC7C,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC;YAED,KAAK,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;gBACvF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7E,OAAO,OAAO,CAAC,oBAAoB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,KAAK,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;gBACvF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7E,OAAO,OAAO,CAAC,oBAAoB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,KAAK,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;gBAC9D,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACnC,OAAO,OAAO,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;YAC/C,CAAC;YAED;gBACE,OAAO,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Schema Definitions (Zod)
|
|
3
|
+
*
|
|
4
|
+
* These schemas are the single source of truth for input validation.
|
|
5
|
+
* Types are inferred from schemas to avoid duplication.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
export declare const SearchPagesInputSchema: z.ZodObject<{
|
|
9
|
+
query: z.ZodOptional<z.ZodString>;
|
|
10
|
+
note_code: z.ZodOptional<z.ZodString>;
|
|
11
|
+
tag_name: z.ZodOptional<z.ZodString>;
|
|
12
|
+
per_page: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
export declare const GetPageInputSchema: z.ZodObject<{
|
|
15
|
+
page_code: z.ZodString;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export declare const CreatePageInputSchema: z.ZodObject<{
|
|
18
|
+
note_code: z.ZodString;
|
|
19
|
+
title: z.ZodString;
|
|
20
|
+
body: z.ZodOptional<z.ZodString>;
|
|
21
|
+
memo: z.ZodOptional<z.ZodString>;
|
|
22
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export declare const UpdatePageInputSchema: z.ZodObject<{
|
|
25
|
+
page_code: z.ZodString;
|
|
26
|
+
title: z.ZodOptional<z.ZodString>;
|
|
27
|
+
body: z.ZodOptional<z.ZodString>;
|
|
28
|
+
memo: z.ZodOptional<z.ZodString>;
|
|
29
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export declare const DeletePageInputSchema: z.ZodObject<{
|
|
32
|
+
page_code: z.ZodString;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
/** Inferred type for search pages input */
|
|
35
|
+
export type SearchPagesInput = z.infer<typeof SearchPagesInputSchema>;
|
|
36
|
+
/** Inferred type for get page input */
|
|
37
|
+
export type GetPageInput = z.infer<typeof GetPageInputSchema>;
|
|
38
|
+
/** Inferred type for create page input */
|
|
39
|
+
export type CreatePageInput = z.infer<typeof CreatePageInputSchema>;
|
|
40
|
+
/** Inferred type for update page input */
|
|
41
|
+
export type UpdatePageInput = z.infer<typeof UpdatePageInputSchema>;
|
|
42
|
+
/** Inferred type for delete page input */
|
|
43
|
+
export type DeletePageInput = z.infer<typeof DeletePageInputSchema>;
|
|
44
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,sBAAsB;;;;;iBAWjC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAMH,2CAA2C;AAC3C,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,0CAA0C;AAC1C,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,0CAA0C;AAC1C,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,0CAA0C;AAC1C,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Schema Definitions (Zod)
|
|
3
|
+
*
|
|
4
|
+
* These schemas are the single source of truth for input validation.
|
|
5
|
+
* Types are inferred from schemas to avoid duplication.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
// ============================================================
|
|
9
|
+
// Zod Schemas
|
|
10
|
+
// ============================================================
|
|
11
|
+
export const SearchPagesInputSchema = z.object({
|
|
12
|
+
query: z.string().optional().describe("Search keyword"),
|
|
13
|
+
note_code: z.string().optional().describe("Note code (search within specific note)"),
|
|
14
|
+
tag_name: z.string().optional().describe("Filter by tag name"),
|
|
15
|
+
per_page: z
|
|
16
|
+
.number()
|
|
17
|
+
.min(1)
|
|
18
|
+
.max(100)
|
|
19
|
+
.optional()
|
|
20
|
+
.default(20)
|
|
21
|
+
.describe("Number of results (1-100, default: 20)"),
|
|
22
|
+
});
|
|
23
|
+
export const GetPageInputSchema = z.object({
|
|
24
|
+
page_code: z.string().min(1).describe("Page code"),
|
|
25
|
+
});
|
|
26
|
+
export const CreatePageInputSchema = z.object({
|
|
27
|
+
note_code: z.string().min(1).describe("Note code to create page in"),
|
|
28
|
+
title: z.string().min(1).max(100).describe("Page title (1-100 characters)"),
|
|
29
|
+
body: z.string().optional().describe("Page body (Markdown format)"),
|
|
30
|
+
memo: z.string().max(255).optional().describe("Memo (max 255 characters)"),
|
|
31
|
+
tags: z.array(z.string()).optional().describe("Array of tags"),
|
|
32
|
+
});
|
|
33
|
+
export const UpdatePageInputSchema = z.object({
|
|
34
|
+
page_code: z.string().min(1).describe("Page code to update"),
|
|
35
|
+
title: z.string().max(100).optional().describe("Page title (max 100 characters)"),
|
|
36
|
+
body: z.string().optional().describe("Page body (Markdown format)"),
|
|
37
|
+
memo: z.string().max(255).optional().describe("Memo (max 255 characters)"),
|
|
38
|
+
tags: z.array(z.string()).optional().describe("Array of tags"),
|
|
39
|
+
});
|
|
40
|
+
export const DeletePageInputSchema = z.object({
|
|
41
|
+
page_code: z.string().min(1).describe("Page code to delete"),
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,+DAA+D;AAC/D,cAAc;AACd,+DAA+D;AAE/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACvD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IACpF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC9D,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,wCAAwC,CAAC;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACpE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC3E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC1E,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACjF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC1E,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CAC7D,CAAC,CAAC"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Definitions
|
|
3
|
+
*
|
|
4
|
+
* Define MCP tools for NotePM API integration
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { NotePMClient } from "./notepm-client.js";
|
|
8
|
+
export declare const SearchPagesInputSchema: z.ZodObject<{
|
|
9
|
+
query: z.ZodOptional<z.ZodString>;
|
|
10
|
+
note_code: z.ZodOptional<z.ZodString>;
|
|
11
|
+
tag_name: z.ZodOptional<z.ZodString>;
|
|
12
|
+
per_page: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
export declare const GetPageInputSchema: z.ZodObject<{
|
|
15
|
+
page_code: z.ZodString;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export declare const CreatePageInputSchema: z.ZodObject<{
|
|
18
|
+
note_code: z.ZodString;
|
|
19
|
+
title: z.ZodString;
|
|
20
|
+
body: z.ZodOptional<z.ZodString>;
|
|
21
|
+
memo: z.ZodOptional<z.ZodString>;
|
|
22
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export declare const UpdatePageInputSchema: z.ZodObject<{
|
|
25
|
+
page_code: z.ZodString;
|
|
26
|
+
title: z.ZodOptional<z.ZodString>;
|
|
27
|
+
body: z.ZodOptional<z.ZodString>;
|
|
28
|
+
memo: z.ZodOptional<z.ZodString>;
|
|
29
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export declare const DeletePageInputSchema: z.ZodObject<{
|
|
32
|
+
page_code: z.ZodString;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
export declare const TOOLS: {
|
|
35
|
+
name: string;
|
|
36
|
+
description: string;
|
|
37
|
+
inputSchema: z.core.ZodStandardJSONSchemaPayload<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
38
|
+
}[];
|
|
39
|
+
type ToolResult = {
|
|
40
|
+
content: Array<{
|
|
41
|
+
type: "text";
|
|
42
|
+
text: string;
|
|
43
|
+
}>;
|
|
44
|
+
isError?: boolean;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Execute tool
|
|
48
|
+
*/
|
|
49
|
+
export declare function handleToolCall(client: NotePMClient, name: string, args: unknown): Promise<ToolResult>;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AAMxE,eAAO,MAAM,sBAAsB;;;;;iBAWjC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAcH,eAAO,MAAM,KAAK;;;;GA0BjB,CAAC;AAMF,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAwDxF;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,UAAU,CAAC,CAyDrB"}
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Definitions
|
|
3
|
+
*
|
|
4
|
+
* Define MCP tools for NotePM API integration
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { NotePMAPIError } from "./notepm-client.js";
|
|
8
|
+
// ============================================================
|
|
9
|
+
// Input Schema Definitions (Zod)
|
|
10
|
+
// ============================================================
|
|
11
|
+
export const SearchPagesInputSchema = z.object({
|
|
12
|
+
query: z.string().optional().describe("Search keyword"),
|
|
13
|
+
note_code: z.string().optional().describe("Note code (search within specific note)"),
|
|
14
|
+
tag_name: z.string().optional().describe("Filter by tag name"),
|
|
15
|
+
per_page: z
|
|
16
|
+
.number()
|
|
17
|
+
.min(1)
|
|
18
|
+
.max(100)
|
|
19
|
+
.optional()
|
|
20
|
+
.default(20)
|
|
21
|
+
.describe("Number of results (1-100, default: 20)"),
|
|
22
|
+
});
|
|
23
|
+
export const GetPageInputSchema = z.object({
|
|
24
|
+
page_code: z.string().describe("Page code"),
|
|
25
|
+
});
|
|
26
|
+
export const CreatePageInputSchema = z.object({
|
|
27
|
+
note_code: z.string().describe("Note code to create page in"),
|
|
28
|
+
title: z.string().max(100).describe("Page title (max 100 characters)"),
|
|
29
|
+
body: z.string().optional().describe("Page body (Markdown format)"),
|
|
30
|
+
memo: z.string().max(255).optional().describe("Memo (max 255 characters)"),
|
|
31
|
+
tags: z.array(z.string()).optional().describe("Array of tags"),
|
|
32
|
+
});
|
|
33
|
+
export const UpdatePageInputSchema = z.object({
|
|
34
|
+
page_code: z.string().describe("Page code to update"),
|
|
35
|
+
title: z.string().max(100).optional().describe("Page title (max 100 characters)"),
|
|
36
|
+
body: z.string().optional().describe("Page body (Markdown format)"),
|
|
37
|
+
memo: z.string().max(255).optional().describe("Memo (max 255 characters)"),
|
|
38
|
+
tags: z.array(z.string()).optional().describe("Array of tags"),
|
|
39
|
+
});
|
|
40
|
+
export const DeletePageInputSchema = z.object({
|
|
41
|
+
page_code: z.string().describe("Page code to delete"),
|
|
42
|
+
});
|
|
43
|
+
// ============================================================
|
|
44
|
+
// Helper: Convert Zod schema to MCP-compatible JSON Schema
|
|
45
|
+
// ============================================================
|
|
46
|
+
function toInputSchema(schema) {
|
|
47
|
+
return z.toJSONSchema(schema, { target: "draft-07" });
|
|
48
|
+
}
|
|
49
|
+
// ============================================================
|
|
50
|
+
// Tool Definitions (MCP format)
|
|
51
|
+
// ============================================================
|
|
52
|
+
export const TOOLS = [
|
|
53
|
+
{
|
|
54
|
+
name: "search_pages",
|
|
55
|
+
description: "Search NotePM pages. Can filter by keyword, note, or tag.",
|
|
56
|
+
inputSchema: toInputSchema(SearchPagesInputSchema),
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "get_page",
|
|
60
|
+
description: "Get a NotePM page. Retrieve title, body, tags and other details by page code.",
|
|
61
|
+
inputSchema: toInputSchema(GetPageInputSchema),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "create_page",
|
|
65
|
+
description: "Create a new page in NotePM. Note code and title are required.",
|
|
66
|
+
inputSchema: toInputSchema(CreatePageInputSchema),
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "update_page",
|
|
70
|
+
description: "Update an existing NotePM page. Page code is required.",
|
|
71
|
+
inputSchema: toInputSchema(UpdatePageInputSchema),
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "delete_page",
|
|
75
|
+
description: "Delete a NotePM page. This action cannot be undone.",
|
|
76
|
+
inputSchema: toInputSchema(DeletePageInputSchema),
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
/**
|
|
80
|
+
* Create a successful tool result
|
|
81
|
+
*/
|
|
82
|
+
function success(text) {
|
|
83
|
+
return { content: [{ type: "text", text }] };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create an error tool result
|
|
87
|
+
*/
|
|
88
|
+
function error(text) {
|
|
89
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Input validation error
|
|
93
|
+
*/
|
|
94
|
+
class InputError extends Error {
|
|
95
|
+
constructor(message) {
|
|
96
|
+
super(message);
|
|
97
|
+
this.name = "InputError";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Parse and validate input, throw InputError on failure
|
|
102
|
+
*/
|
|
103
|
+
function parseInput(schema, args) {
|
|
104
|
+
const result = schema.safeParse(args);
|
|
105
|
+
if (!result.success) {
|
|
106
|
+
throw new InputError(result.error.message);
|
|
107
|
+
}
|
|
108
|
+
return result.data;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Format page information
|
|
112
|
+
*/
|
|
113
|
+
function formatPage(page) {
|
|
114
|
+
const tags = page.tags.map((t) => t.name).join(", ") || "None";
|
|
115
|
+
return [
|
|
116
|
+
`## ${page.title}`,
|
|
117
|
+
`- Page code: ${page.page_code}`,
|
|
118
|
+
`- Note code: ${page.note_code}`,
|
|
119
|
+
`- Created by: ${page.created_by.name}`,
|
|
120
|
+
`- Created at: ${page.created_at}`,
|
|
121
|
+
`- Updated at: ${page.updated_at}`,
|
|
122
|
+
`- Tags: ${tags}`,
|
|
123
|
+
"",
|
|
124
|
+
"### Body",
|
|
125
|
+
page.body || "(No body)",
|
|
126
|
+
].join("\n");
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Execute tool
|
|
130
|
+
*/
|
|
131
|
+
export async function handleToolCall(client, name, args) {
|
|
132
|
+
try {
|
|
133
|
+
switch (name) {
|
|
134
|
+
case "search_pages": {
|
|
135
|
+
const { query, note_code, tag_name, per_page } = parseInput(SearchPagesInputSchema, args);
|
|
136
|
+
const result = await client.searchPages({ q: query, note_code, tag_name, per_page });
|
|
137
|
+
if (result.pages.length === 0) {
|
|
138
|
+
return success("Search results: 0 pages");
|
|
139
|
+
}
|
|
140
|
+
const pageList = result.pages
|
|
141
|
+
.map((p, i) => `${i + 1}. **${p.title}** (code: ${p.page_code})\n - Note: ${p.note_code} | Updated: ${p.updated_at}`)
|
|
142
|
+
.join("\n");
|
|
143
|
+
return success(`Search results: showing ${result.pages.length} of ${result.meta.total} pages\n\n${pageList}`);
|
|
144
|
+
}
|
|
145
|
+
case "get_page": {
|
|
146
|
+
const { page_code } = parseInput(GetPageInputSchema, args);
|
|
147
|
+
const page = await client.getPage(page_code);
|
|
148
|
+
return success(formatPage(page));
|
|
149
|
+
}
|
|
150
|
+
case "create_page": {
|
|
151
|
+
const { note_code, title, body, memo, tags } = parseInput(CreatePageInputSchema, args);
|
|
152
|
+
const page = await client.createPage({ note_code, title, body, memo, tags });
|
|
153
|
+
return success(`Page created.\n\n${formatPage(page)}`);
|
|
154
|
+
}
|
|
155
|
+
case "update_page": {
|
|
156
|
+
const { page_code, title, body, memo, tags } = parseInput(UpdatePageInputSchema, args);
|
|
157
|
+
const page = await client.updatePage(page_code, { title, body, memo, tags });
|
|
158
|
+
return success(`Page updated.\n\n${formatPage(page)}`);
|
|
159
|
+
}
|
|
160
|
+
case "delete_page": {
|
|
161
|
+
const { page_code } = parseInput(DeletePageInputSchema, args);
|
|
162
|
+
await client.deletePage(page_code);
|
|
163
|
+
return success(`Page deleted: ${page_code}`);
|
|
164
|
+
}
|
|
165
|
+
default:
|
|
166
|
+
return error(`Unknown tool: ${name}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (err instanceof InputError) {
|
|
171
|
+
return error(`Input error: ${err.message}`);
|
|
172
|
+
}
|
|
173
|
+
if (err instanceof NotePMAPIError) {
|
|
174
|
+
return error(err.message);
|
|
175
|
+
}
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nonz250/notepm-mcp-server",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "An unofficial MCP server for NotePM - a knowledge management platform",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"notepm-mcp-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"!dist/__tests__"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsx src/index.ts",
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest",
|
|
20
|
+
"lint": "eslint src/",
|
|
21
|
+
"lint:fix": "eslint src/ --fix",
|
|
22
|
+
"format": "prettier --write src/",
|
|
23
|
+
"format:check": "prettier --check src/",
|
|
24
|
+
"prepublishOnly": "npm run build && npm test && npm run lint"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"notepm",
|
|
29
|
+
"model-context-protocol",
|
|
30
|
+
"claude",
|
|
31
|
+
"ai",
|
|
32
|
+
"knowledge-management"
|
|
33
|
+
],
|
|
34
|
+
"author": "nonz250",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/nonz250/notepm-mcp-server.git"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/nonz250/notepm-mcp-server/issues"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/nonz250/notepm-mcp-server#readme",
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=22"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
49
|
+
"zod": "^4.2.1"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@eslint/js": "^9.39.2",
|
|
53
|
+
"@trivago/prettier-plugin-sort-imports": "^6.0.0",
|
|
54
|
+
"@types/node": "^22.19.3",
|
|
55
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
56
|
+
"eslint": "^9.39.2",
|
|
57
|
+
"eslint-config-prettier": "^10.1.8",
|
|
58
|
+
"prettier": "^3.7.4",
|
|
59
|
+
"tsx": "^4.21.0",
|
|
60
|
+
"typescript": "^5.9.3",
|
|
61
|
+
"typescript-eslint": "^8.50.1",
|
|
62
|
+
"vitest": "^4.0.16"
|
|
63
|
+
}
|
|
64
|
+
}
|