@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 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
+ [![npm version](https://badge.fury.io/js/@nonz250/notepm-mcp-server.svg)](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
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
@@ -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,6 @@
1
+ /**
2
+ * MCP Tool Definitions
3
+ */
4
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
5
+ export declare const TOOLS: Tool[];
6
+ //# sourceMappingURL=definitions.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * MCP Tools for NotePM API integration
3
+ */
4
+ export * from "./constants.js";
5
+ export * from "./schemas.js";
6
+ export * from "./definitions.js";
7
+ export * from "./handlers.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * MCP Tools for NotePM API integration
3
+ */
4
+ export * from "./constants.js";
5
+ export * from "./schemas.js";
6
+ export * from "./definitions.js";
7
+ export * from "./handlers.js";
8
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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
+ }