obsidian-native-mcp 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.github/workflows/ci.yml +69 -0
  2. package/.husky/pre-commit +1 -0
  3. package/.prettierignore +3 -0
  4. package/.prettierrc +7 -0
  5. package/.releaserc.json +24 -0
  6. package/DEVELOPER.md +158 -0
  7. package/LICENSE +21 -0
  8. package/README.md +179 -0
  9. package/dist/cli/index.js +22 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/handlers/prompts.js +127 -0
  12. package/dist/handlers/prompts.js.map +1 -0
  13. package/dist/handlers/tools.js +113 -0
  14. package/dist/handlers/tools.js.map +1 -0
  15. package/dist/mcp/http-transport.js +124 -0
  16. package/dist/mcp/http-transport.js.map +1 -0
  17. package/dist/mcp/protocol.js +38 -0
  18. package/dist/mcp/protocol.js.map +1 -0
  19. package/dist/mcp/server.js +257 -0
  20. package/dist/mcp/server.js.map +1 -0
  21. package/dist/mcp/stdio-transport.js +41 -0
  22. package/dist/mcp/stdio-transport.js.map +1 -0
  23. package/dist/mcp/transport.js +3 -0
  24. package/dist/mcp/transport.js.map +1 -0
  25. package/dist/plugin/main.js +1201 -0
  26. package/dist/plugin/main.js.map +1 -0
  27. package/dist/plugin/manifest.json +10 -0
  28. package/dist/plugin/settings.js +63 -0
  29. package/dist/plugin/settings.js.map +1 -0
  30. package/dist/utils/fs-utils.js +268 -0
  31. package/dist/utils/fs-utils.js.map +1 -0
  32. package/dist/utils/search.js +62 -0
  33. package/dist/utils/search.js.map +1 -0
  34. package/dist/utils/vaults.js +165 -0
  35. package/dist/utils/vaults.js.map +1 -0
  36. package/eslint.config.mjs +16 -0
  37. package/manifest.json +10 -0
  38. package/package.json +48 -0
  39. package/scripts/build-plugin.mjs +35 -0
  40. package/scripts/sync-version.cjs +12 -0
  41. package/src/cli/index.ts +25 -0
  42. package/src/handlers/prompts.ts +148 -0
  43. package/src/handlers/tools.ts +146 -0
  44. package/src/mcp/http-transport.ts +138 -0
  45. package/src/mcp/protocol.ts +69 -0
  46. package/src/mcp/server.ts +272 -0
  47. package/src/mcp/stdio-transport.ts +43 -0
  48. package/src/mcp/transport.ts +8 -0
  49. package/src/plugin/main.ts +91 -0
  50. package/src/plugin/settings.ts +69 -0
  51. package/src/utils/fs-utils.ts +358 -0
  52. package/src/utils/search.ts +84 -0
  53. package/src/utils/vaults.ts +175 -0
  54. package/tsconfig.json +20 -0
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VaultFileHandler = void 0;
4
+ const fs_utils_1 = require("../utils/fs-utils");
5
+ const search_1 = require("../utils/search");
6
+ class VaultFileHandler {
7
+ registry;
8
+ constructor(registry) {
9
+ this.registry = registry;
10
+ }
11
+ getHandlers() {
12
+ return {
13
+ list_vaults: this.handleListVaults.bind(this),
14
+ get_vault_info: this.handleVaultInfo.bind(this),
15
+ list_files: this.handleListFiles.bind(this),
16
+ get_file: this.handleGetFile.bind(this),
17
+ create_file: this.handleCreateFile.bind(this),
18
+ append_to_file: this.handleAppendFile.bind(this),
19
+ patch_file: this.handlePatchFile.bind(this),
20
+ delete_file: this.handleDeleteFile.bind(this),
21
+ search: this.handleSearch.bind(this),
22
+ };
23
+ }
24
+ resolveVault(args) {
25
+ return this.registry.resolve(args.vault);
26
+ }
27
+ async handleListVaults(_args) {
28
+ return {
29
+ content: [
30
+ {
31
+ type: "text",
32
+ text: JSON.stringify(this.registry.list(), null, 2),
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ async handleVaultInfo(args) {
38
+ const info = this.registry.info(args.vault);
39
+ return {
40
+ content: [{ type: "text", text: JSON.stringify(info, null, 2) }],
41
+ };
42
+ }
43
+ async handleListFiles(args) {
44
+ const vaultPath = this.resolveVault(args);
45
+ const entries = (0, fs_utils_1.listFiles)(vaultPath, args.directory);
46
+ return {
47
+ content: [{ type: "text", text: JSON.stringify(entries, null, 2) }],
48
+ };
49
+ }
50
+ async handleGetFile(args) {
51
+ const vaultPath = this.resolveVault(args);
52
+ const result = await (0, fs_utils_1.readFileHandler)(vaultPath, args.filename);
53
+ if (args.format === "json") {
54
+ return {
55
+ content: [
56
+ {
57
+ type: "text",
58
+ text: JSON.stringify({
59
+ filename: args.filename,
60
+ frontmatter: result.frontmatter,
61
+ content: result.content,
62
+ }, null, 2),
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ return { content: [{ type: "text", text: result.content }] };
68
+ }
69
+ async handleCreateFile(args) {
70
+ const vaultPath = this.resolveVault(args);
71
+ await (0, fs_utils_1.createFile)(vaultPath, args.filename, args.content);
72
+ return {
73
+ content: [{ type: "text", text: "File created successfully" }],
74
+ };
75
+ }
76
+ async handleAppendFile(args) {
77
+ const vaultPath = this.resolveVault(args);
78
+ await (0, fs_utils_1.appendFile)(vaultPath, args.filename, args.content);
79
+ return {
80
+ content: [{ type: "text", text: "Content appended successfully" }],
81
+ };
82
+ }
83
+ async handlePatchFile(args) {
84
+ const vaultPath = this.resolveVault(args);
85
+ const result = await (0, fs_utils_1.patchFile)(vaultPath, args.filename, args.operation, args.targetType, args.target, args.content, {
86
+ contentType: args.contentType,
87
+ targetDelimiter: args.targetDelimiter,
88
+ trimTargetWhitespace: args.trimTargetWhitespace,
89
+ });
90
+ return {
91
+ content: [
92
+ { type: "text", text: "File patched successfully" },
93
+ { type: "text", text: result },
94
+ ],
95
+ };
96
+ }
97
+ async handleDeleteFile(args) {
98
+ const vaultPath = this.resolveVault(args);
99
+ (0, fs_utils_1.deleteFileHandler)(vaultPath, args.filename);
100
+ return {
101
+ content: [{ type: "text", text: "File deleted successfully" }],
102
+ };
103
+ }
104
+ async handleSearch(args) {
105
+ const vaultPath = this.resolveVault(args);
106
+ const matches = await (0, search_1.searchInVault)(vaultPath, args.query, args.directory, args.contextLength);
107
+ return {
108
+ content: [{ type: "text", text: JSON.stringify(matches, null, 2) }],
109
+ };
110
+ }
111
+ }
112
+ exports.VaultFileHandler = VaultFileHandler;
113
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/handlers/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HttpTransport = void 0;
7
+ const http_1 = __importDefault(require("http"));
8
+ class HttpTransport {
9
+ requestHandler = null;
10
+ server = null;
11
+ sessions = new Map();
12
+ port = 0;
13
+ get url() {
14
+ return `http://127.0.0.1:${this.port}/sse`;
15
+ }
16
+ get actualPort() {
17
+ return this.port;
18
+ }
19
+ onRequest(handler) {
20
+ this.requestHandler = handler;
21
+ }
22
+ sendMessage(_message) {
23
+ // Messages sent back via SSE response, not directly
24
+ }
25
+ start() {
26
+ return new Promise((resolve) => {
27
+ this.server = http_1.default.createServer((req, res) => {
28
+ this.handleRequest(req, res);
29
+ });
30
+ this.server.listen(0, "127.0.0.1", () => {
31
+ const addr = this.server.address();
32
+ if (addr && typeof addr === "object") {
33
+ this.port = addr.port;
34
+ }
35
+ console.error(`MCP HTTP server listening on http://127.0.0.1:${this.port}`);
36
+ resolve();
37
+ });
38
+ });
39
+ }
40
+ close() {
41
+ for (const res of this.sessions.values()) {
42
+ res.end();
43
+ }
44
+ this.sessions.clear();
45
+ this.server?.close();
46
+ }
47
+ handleRequest(req, res) {
48
+ // CORS headers for Claude Desktop
49
+ res.setHeader("Access-Control-Allow-Origin", "*");
50
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
51
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
52
+ if (req.method === "OPTIONS") {
53
+ res.writeHead(204);
54
+ res.end();
55
+ return;
56
+ }
57
+ const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
58
+ if (req.method === "GET" && url.pathname === "/sse") {
59
+ this.handleSSE(req, res);
60
+ }
61
+ else if (req.method === "POST" && url.pathname === "/message") {
62
+ this.handleMessage(req, res);
63
+ }
64
+ else {
65
+ res.writeHead(404);
66
+ res.end("Not found");
67
+ }
68
+ }
69
+ handleSSE(req, res) {
70
+ const sessionId = generateId();
71
+ res.writeHead(200, {
72
+ "Content-Type": "text/event-stream",
73
+ "Cache-Control": "no-cache",
74
+ Connection: "keep-alive",
75
+ });
76
+ const messageUrl = `/message?session_id=${sessionId}`;
77
+ res.write(`event: endpoint\ndata: ${messageUrl}\n\n`);
78
+ this.sessions.set(sessionId, res);
79
+ req.on("close", () => {
80
+ this.sessions.delete(sessionId);
81
+ });
82
+ }
83
+ handleMessage(req, res) {
84
+ const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
85
+ const sessionId = url.searchParams.get("session_id");
86
+ if (!sessionId || !this.sessions.has(sessionId)) {
87
+ res.writeHead(400);
88
+ res.end("Invalid or missing session_id");
89
+ return;
90
+ }
91
+ let body = "";
92
+ req.on("data", (chunk) => {
93
+ body += chunk.toString();
94
+ });
95
+ req.on("end", async () => {
96
+ try {
97
+ const msg = JSON.parse(body);
98
+ if (msg.jsonrpc !== "2.0" || !("method" in msg) || !("id" in msg)) {
99
+ res.writeHead(400);
100
+ res.end("Invalid JSON-RPC message");
101
+ return;
102
+ }
103
+ const response = await this.requestHandler?.(msg);
104
+ if (response) {
105
+ const sseRes = this.sessions.get(sessionId);
106
+ if (sseRes) {
107
+ sseRes.write(`event: message\ndata: ${JSON.stringify(response)}\n\n`);
108
+ }
109
+ }
110
+ res.writeHead(202);
111
+ res.end();
112
+ }
113
+ catch {
114
+ res.writeHead(400);
115
+ res.end("Invalid JSON");
116
+ }
117
+ });
118
+ }
119
+ }
120
+ exports.HttpTransport = HttpTransport;
121
+ function generateId() {
122
+ return crypto.randomUUID();
123
+ }
124
+ //# sourceMappingURL=http-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../src/mcp/http-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeMessage = encodeMessage;
4
+ exports.sendMessage = sendMessage;
5
+ exports.parseMessages = parseMessages;
6
+ function encodeMessage(message) {
7
+ const json = JSON.stringify(message);
8
+ const header = `Content-Length: ${json.length}\r\n\r\n`;
9
+ const encoder = new TextEncoder();
10
+ const headerBytes = encoder.encode(header);
11
+ const bodyBytes = encoder.encode(json);
12
+ const combined = new Uint8Array(headerBytes.length + bodyBytes.length);
13
+ combined.set(headerBytes);
14
+ combined.set(bodyBytes, headerBytes.length);
15
+ return combined;
16
+ }
17
+ function sendMessage(message) {
18
+ process.stdout.write(encodeMessage(message));
19
+ }
20
+ function parseMessages(buffer) {
21
+ const messages = [];
22
+ let remaining = buffer;
23
+ while (true) {
24
+ const headerMatch = remaining.match(/^Content-Length: (\d+)\r\n\r\n/);
25
+ if (!headerMatch)
26
+ break;
27
+ const contentLength = parseInt(headerMatch[1], 10);
28
+ const headerEnd = headerMatch[0].length;
29
+ const totalLength = headerEnd + contentLength;
30
+ if (remaining.length < totalLength)
31
+ break;
32
+ const jsonStr = remaining.slice(headerEnd, totalLength);
33
+ remaining = remaining.slice(totalLength);
34
+ messages.push(jsonStr);
35
+ }
36
+ return { messages, remaining };
37
+ }
38
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/mcp/protocol.ts"],"names":[],"mappings":";;AAmCA,sCAUC;AAED,kCAEC;AAED,sCAiBC;AAjCD,SAAgB,aAAa,CAAC,OAAY;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,mBAAmB,IAAI,CAAC,MAAM,UAAU,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACvE,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,WAAW,CAAC,OAAY;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,MAAM,CAAC;IAEvB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW;YAAE,MAAM;QACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACxC,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;QAC9C,IAAI,SAAS,CAAC,MAAM,GAAG,WAAW;YAAE,MAAM;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACxD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createServer = createServer;
4
+ const tools_1 = require("../handlers/tools");
5
+ const prompts_1 = require("../handlers/prompts");
6
+ const vaultParam = {
7
+ vault: {
8
+ type: "string",
9
+ description: "Vault name (derived from the directory name). Required when multiple vaults are configured.",
10
+ },
11
+ };
12
+ function createServer(registry) {
13
+ const vaultList = registry.list();
14
+ const vaultNames = vaultList.map((v) => v.name);
15
+ vaultParam.vault.description = `Vault name. Available: ${vaultNames.join(", ")}`;
16
+ const fileHandler = new tools_1.VaultFileHandler(registry);
17
+ const promptHandler = new prompts_1.PromptHandler(registry);
18
+ const toolHandlers = fileHandler.getHandlers();
19
+ const toolDefinitions = [
20
+ {
21
+ name: "list_vaults",
22
+ description: "List all configured vaults with their paths.",
23
+ inputSchema: { type: "object", properties: {} },
24
+ },
25
+ {
26
+ name: "get_vault_info",
27
+ description: "Get stats for a vault (file count, path, name).",
28
+ inputSchema: {
29
+ type: "object",
30
+ properties: {
31
+ vault: {
32
+ type: "string",
33
+ description: `Vault name. Available: ${vaultNames.join(", ")}`,
34
+ },
35
+ },
36
+ },
37
+ },
38
+ {
39
+ name: "list_files",
40
+ description: "List files in the root directory or a specified subdirectory of your vault.",
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {
44
+ ...vaultParam,
45
+ directory: {
46
+ type: "string",
47
+ description: "Optional subdirectory path relative to vault root",
48
+ },
49
+ },
50
+ },
51
+ },
52
+ {
53
+ name: "get_file",
54
+ description: "Get the content of a file from your vault.",
55
+ inputSchema: {
56
+ type: "object",
57
+ properties: {
58
+ ...vaultParam,
59
+ filename: {
60
+ type: "string",
61
+ description: "Path to the file relative to vault root",
62
+ },
63
+ format: {
64
+ type: "string",
65
+ enum: ["markdown", "json"],
66
+ description: "Return format (json includes frontmatter)",
67
+ },
68
+ },
69
+ required: ["filename"],
70
+ },
71
+ },
72
+ {
73
+ name: "create_file",
74
+ description: "Create a new file in your vault or update an existing one.",
75
+ inputSchema: {
76
+ type: "object",
77
+ properties: {
78
+ ...vaultParam,
79
+ filename: {
80
+ type: "string",
81
+ description: "Path to the file relative to vault root",
82
+ },
83
+ content: { type: "string", description: "File content" },
84
+ },
85
+ required: ["filename", "content"],
86
+ },
87
+ },
88
+ {
89
+ name: "append_to_file",
90
+ description: "Append content to a new or existing file.",
91
+ inputSchema: {
92
+ type: "object",
93
+ properties: {
94
+ ...vaultParam,
95
+ filename: {
96
+ type: "string",
97
+ description: "Path to the file relative to vault root",
98
+ },
99
+ content: {
100
+ type: "string",
101
+ description: "Content to append",
102
+ },
103
+ },
104
+ required: ["filename", "content"],
105
+ },
106
+ },
107
+ {
108
+ name: "patch_file",
109
+ description: "Insert or modify content in a file relative to a heading, block reference, or frontmatter field.",
110
+ inputSchema: {
111
+ type: "object",
112
+ properties: {
113
+ ...vaultParam,
114
+ filename: { type: "string" },
115
+ operation: {
116
+ type: "string",
117
+ enum: ["append", "prepend", "replace"],
118
+ },
119
+ targetType: {
120
+ type: "string",
121
+ enum: ["heading", "block", "frontmatter"],
122
+ },
123
+ target: { type: "string" },
124
+ content: { type: "string" },
125
+ contentType: {
126
+ type: "string",
127
+ enum: ["text/markdown", "application/json"],
128
+ },
129
+ targetDelimiter: { type: "string", default: "::" },
130
+ trimTargetWhitespace: { type: "boolean", default: true },
131
+ },
132
+ required: ["filename", "operation", "targetType", "target", "content"],
133
+ },
134
+ },
135
+ {
136
+ name: "delete_file",
137
+ description: "Delete a file from your vault.",
138
+ inputSchema: {
139
+ type: "object",
140
+ properties: {
141
+ ...vaultParam,
142
+ filename: {
143
+ type: "string",
144
+ description: "Path to the file relative to vault root",
145
+ },
146
+ },
147
+ required: ["filename"],
148
+ },
149
+ },
150
+ {
151
+ name: "search",
152
+ description: "Search for documents matching a text query in your vault.",
153
+ inputSchema: {
154
+ type: "object",
155
+ properties: {
156
+ ...vaultParam,
157
+ query: { type: "string", description: "Text to search for" },
158
+ directory: {
159
+ type: "string",
160
+ description: "Optional directory to scope the search",
161
+ },
162
+ contextLength: {
163
+ type: "number",
164
+ description: "Characters of context around each match",
165
+ },
166
+ },
167
+ required: ["query"],
168
+ },
169
+ },
170
+ ];
171
+ async function handleRequest(msg) {
172
+ const { method, params, id } = msg;
173
+ switch (method) {
174
+ case "initialize": {
175
+ const clientProtocol = params?.protocolVersion;
176
+ return {
177
+ jsonrpc: "2.0",
178
+ id,
179
+ result: {
180
+ protocolVersion: clientProtocol || "2024-11-05",
181
+ capabilities: { tools: {}, prompts: {} },
182
+ serverInfo: { name: "obsidian-native-mcp", version: "0.2.0" },
183
+ },
184
+ };
185
+ }
186
+ case "tools/list":
187
+ return {
188
+ jsonrpc: "2.0",
189
+ id,
190
+ result: { tools: toolDefinitions },
191
+ };
192
+ case "tools/call": {
193
+ const toolName = params?.name;
194
+ const args = params?.arguments || {};
195
+ const handler = toolHandlers[toolName];
196
+ if (!handler) {
197
+ return {
198
+ jsonrpc: "2.0",
199
+ id,
200
+ error: { code: -32601, message: `Unknown tool: ${toolName}` },
201
+ };
202
+ }
203
+ try {
204
+ const result = await handler(args);
205
+ return { jsonrpc: "2.0", id, result };
206
+ }
207
+ catch (err) {
208
+ return {
209
+ jsonrpc: "2.0",
210
+ id,
211
+ error: { code: -32603, message: err.message || String(err) },
212
+ };
213
+ }
214
+ }
215
+ case "prompts/list": {
216
+ try {
217
+ const promptVault = params?.arguments?.vault;
218
+ const promptList = await promptHandler.list(promptVault);
219
+ return { jsonrpc: "2.0", id, result: { prompts: promptList } };
220
+ }
221
+ catch (err) {
222
+ return {
223
+ jsonrpc: "2.0",
224
+ id,
225
+ error: { code: -32603, message: err.message || String(err) },
226
+ };
227
+ }
228
+ }
229
+ case "prompts/get": {
230
+ try {
231
+ const promptVault = params?.arguments?.vault;
232
+ const result = await promptHandler.get(params?.name, promptVault);
233
+ return { jsonrpc: "2.0", id, result };
234
+ }
235
+ catch (err) {
236
+ return {
237
+ jsonrpc: "2.0",
238
+ id,
239
+ error: { code: -32603, message: err.message || String(err) },
240
+ };
241
+ }
242
+ }
243
+ case "notifications/initialized":
244
+ case "notifications/cancelled":
245
+ case "notifications/roots/list_changed":
246
+ return null;
247
+ default:
248
+ return {
249
+ jsonrpc: "2.0",
250
+ id,
251
+ error: { code: -32601, message: `Method not found: ${method}` },
252
+ };
253
+ }
254
+ }
255
+ return { toolDefinitions, handleRequest };
256
+ }
257
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StdioTransport = void 0;
4
+ const protocol_1 = require("./protocol");
5
+ class StdioTransport {
6
+ requestHandler = null;
7
+ stdinBuffer = { buffer: "" };
8
+ onRequest(handler) {
9
+ this.requestHandler = handler;
10
+ }
11
+ sendMessage(message) {
12
+ (0, protocol_1.sendMessage)(message);
13
+ }
14
+ start() {
15
+ process.stdin.on("data", async (chunk) => {
16
+ this.stdinBuffer.buffer += chunk.toString();
17
+ const { messages, remaining } = (0, protocol_1.parseMessages)(this.stdinBuffer.buffer);
18
+ this.stdinBuffer.buffer = remaining;
19
+ for (const jsonStr of messages) {
20
+ try {
21
+ const msg = JSON.parse(jsonStr);
22
+ if (msg.jsonrpc !== "2.0")
23
+ continue;
24
+ if ("method" in msg && "id" in msg) {
25
+ const response = await this.requestHandler?.(msg);
26
+ if (response)
27
+ this.sendMessage(response);
28
+ }
29
+ }
30
+ catch (err) {
31
+ console.error("Error processing message:", err.message);
32
+ }
33
+ }
34
+ });
35
+ }
36
+ close() {
37
+ process.stdin.removeAllListeners("data");
38
+ }
39
+ }
40
+ exports.StdioTransport = StdioTransport;
41
+ //# sourceMappingURL=stdio-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-transport.js","sourceRoot":"","sources":["../../src/mcp/stdio-transport.ts"],"names":[],"mappings":";;;AACA,yCAAwD;AAExD,MAAa,cAAc;IACjB,cAAc,GACpB,IAAI,CAAC;IACC,WAAW,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAErC,SAAS,CAAC,OAAqE;QAC7E,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,OAAwB;QAClC,IAAA,sBAAW,EAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;YAC/C,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAE5C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;YAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAChC,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;wBAAE,SAAS;oBAEpC,IAAI,QAAQ,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;wBACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,GAAqB,CAAC,CAAC;wBACpE,IAAI,QAAQ;4BAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF;AAvCD,wCAuCC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/mcp/transport.ts"],"names":[],"mappings":""}