mcp-for-memos 1.0.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 (58) hide show
  1. package/README.md +334 -0
  2. package/dist/client.d.ts +15 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +155 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/config.d.ts +18 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +27 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/http.d.ts +4 -0
  11. package/dist/http.d.ts.map +1 -0
  12. package/dist/http.js +342 -0
  13. package/dist/http.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +79 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/prompts/index.d.ts +3 -0
  19. package/dist/prompts/index.d.ts.map +1 -0
  20. package/dist/prompts/index.js +68 -0
  21. package/dist/prompts/index.js.map +1 -0
  22. package/dist/resources/index.d.ts +4 -0
  23. package/dist/resources/index.d.ts.map +1 -0
  24. package/dist/resources/index.js +52 -0
  25. package/dist/resources/index.js.map +1 -0
  26. package/dist/server.d.ts +9 -0
  27. package/dist/server.d.ts.map +1 -0
  28. package/dist/server.js +40 -0
  29. package/dist/server.js.map +1 -0
  30. package/dist/tools/memos.d.ts +9 -0
  31. package/dist/tools/memos.d.ts.map +1 -0
  32. package/dist/tools/memos.js +137 -0
  33. package/dist/tools/memos.js.map +1 -0
  34. package/dist/tools/relations.d.ts +4 -0
  35. package/dist/tools/relations.d.ts.map +1 -0
  36. package/dist/tools/relations.js +108 -0
  37. package/dist/tools/relations.js.map +1 -0
  38. package/dist/tools/resources.d.ts +4 -0
  39. package/dist/tools/resources.d.ts.map +1 -0
  40. package/dist/tools/resources.js +90 -0
  41. package/dist/tools/resources.js.map +1 -0
  42. package/dist/tools/review.d.ts +4 -0
  43. package/dist/tools/review.d.ts.map +1 -0
  44. package/dist/tools/review.js +208 -0
  45. package/dist/tools/review.js.map +1 -0
  46. package/dist/tools/tags.d.ts +4 -0
  47. package/dist/tools/tags.d.ts.map +1 -0
  48. package/dist/tools/tags.js +164 -0
  49. package/dist/tools/tags.js.map +1 -0
  50. package/dist/tools/utils.d.ts +6 -0
  51. package/dist/tools/utils.d.ts.map +1 -0
  52. package/dist/tools/utils.js +68 -0
  53. package/dist/tools/utils.js.map +1 -0
  54. package/dist/types.d.ts +36 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +49 -0
package/dist/http.js ADDED
@@ -0,0 +1,342 @@
1
+ import express from "express";
2
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
3
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
4
+ import { createServerWithClient } from "./server.js";
5
+ import { MemosClient } from "./client.js";
6
+ import { getCorsOrigins } from "./config.js";
7
+ // Logger simple
8
+ function log(level, message, meta) {
9
+ const timestamp = new Date().toISOString();
10
+ const metaStr = meta ? ` ${JSON.stringify(meta)}` : "";
11
+ console.log(`[${timestamp}] [${level.toUpperCase()}] ${message}${metaStr}`);
12
+ }
13
+ // Extraer Bearer token del header Authorization
14
+ function extractBearerToken(req) {
15
+ const authHeader = req.headers.authorization;
16
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
17
+ return null;
18
+ }
19
+ return authHeader.slice(7);
20
+ }
21
+ // Rate limiting configuration
22
+ const RATE_LIMIT_WINDOW_MS = 60_000; // 1 minute
23
+ const RATE_LIMIT_MAX_REQUESTS = 100; // 100 requests per minute per IP
24
+ const rateLimitMap = new Map();
25
+ // Sweep de rate limit cada 30 segundos
26
+ setInterval(() => {
27
+ const now = Date.now();
28
+ for (const [key, entry] of rateLimitMap) {
29
+ if (now - entry.timestamp > RATE_LIMIT_WINDOW_MS) {
30
+ rateLimitMap.delete(key);
31
+ }
32
+ }
33
+ }, 30_000);
34
+ // Rate limiting middleware
35
+ function rateLimit(req, res, next) {
36
+ const ip = req.ip || req.socket.remoteAddress || "unknown";
37
+ const now = Date.now();
38
+ const entry = rateLimitMap.get(ip);
39
+ if (!entry || now - entry.timestamp > RATE_LIMIT_WINDOW_MS) {
40
+ rateLimitMap.set(ip, { count: 1, timestamp: now });
41
+ next();
42
+ return;
43
+ }
44
+ if (entry.count >= RATE_LIMIT_MAX_REQUESTS) {
45
+ res.status(429).json({ error: "Too many requests. Try again later." });
46
+ return;
47
+ }
48
+ entry.count++;
49
+ next();
50
+ }
51
+ // Configuración de SSE sessions
52
+ const SSE_IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutos
53
+ const SSE_MAX_SESSIONS = 100;
54
+ // Map para mantener sesiones SSE activas
55
+ const sseSessions = new Map();
56
+ // Sweep de sesiones SSE idle
57
+ function sweepIdleSessions() {
58
+ const now = Date.now();
59
+ for (const [id, session] of sseSessions) {
60
+ if (now - session.lastActivity > SSE_IDLE_TIMEOUT_MS) {
61
+ log("info", "Closing idle SSE session", { sessionId: id });
62
+ session.transport.close();
63
+ sseSessions.delete(id);
64
+ }
65
+ }
66
+ }
67
+ // Sweep cada 30 segundos
68
+ setInterval(sweepIdleSessions, 30_000);
69
+ // Crear aplicación Express
70
+ export function createHttpApp(config) {
71
+ const app = express();
72
+ // Middleware
73
+ app.use(express.json({ limit: "10mb" }));
74
+ // Request ID middleware
75
+ app.use((req, _res, next) => {
76
+ req.requestId = Math.random().toString(36).slice(2, 11);
77
+ next();
78
+ });
79
+ // Logging middleware
80
+ app.use((req, res, next) => {
81
+ const requestId = req.requestId;
82
+ log("info", `${req.method} ${req.path}`, { requestId, ip: req.ip });
83
+ next();
84
+ });
85
+ // CORS
86
+ const corsOrigins = getCorsOrigins(config);
87
+ app.use((req, res, next) => {
88
+ const origin = req.headers.origin;
89
+ if (origin && (corsOrigins.includes("*") || corsOrigins.includes(origin))) {
90
+ res.setHeader("Access-Control-Allow-Origin", origin);
91
+ }
92
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
93
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, MCT-PROXY-VERSION");
94
+ if (req.method === "OPTIONS") {
95
+ res.sendStatus(200);
96
+ return;
97
+ }
98
+ next();
99
+ });
100
+ // Rate limiting
101
+ app.use(rateLimit);
102
+ // Health check endpoint
103
+ app.get("/health", (_req, res) => {
104
+ const uptime = process.uptime();
105
+ const memUsage = process.memoryUsage();
106
+ res.json({
107
+ status: "ok",
108
+ timestamp: new Date().toISOString(),
109
+ version: "3.0.0",
110
+ activeSessions: sseSessions.size,
111
+ uptime: Math.floor(uptime),
112
+ memory: {
113
+ rss: Math.floor(memUsage.rss / 1024 / 1024),
114
+ heapUsed: Math.floor(memUsage.heapUsed / 1024 / 1024),
115
+ heapTotal: Math.floor(memUsage.heapTotal / 1024 / 1024),
116
+ },
117
+ });
118
+ });
119
+ // HEAD request for MCP discovery (no auth required for protocol discovery)
120
+ app.head("/mcp", (_req, res) => {
121
+ res.setHeader("Content-Type", "application/json");
122
+ res.status(200).end();
123
+ });
124
+ // Streamable HTTP endpoint (moderno) - POST
125
+ app.post("/mcp", async (req, res) => {
126
+ const requestId = req.requestId;
127
+ const token = extractBearerToken(req);
128
+ if (!token) {
129
+ log("warn", "Missing or invalid Authorization header", { requestId });
130
+ res.status(401).json({ error: "Missing or invalid Authorization header. Use: Authorization: Bearer <token>" });
131
+ return;
132
+ }
133
+ if (!config.MEMOS_URL) {
134
+ log("error", "MEMOS_URL not configured");
135
+ res.status(500).json({ error: "Server configuration error: MEMOS_URL not set" });
136
+ return;
137
+ }
138
+ const transport = new StreamableHTTPServerTransport({
139
+ sessionIdGenerator: undefined, // Stateless
140
+ });
141
+ const client = new MemosClient(config.MEMOS_URL, token);
142
+ const server = createServerWithClient(client);
143
+ let cleanedUp = false;
144
+ const cleanup = () => {
145
+ if (cleanedUp)
146
+ return;
147
+ cleanedUp = true;
148
+ try {
149
+ transport.close();
150
+ }
151
+ catch { }
152
+ try {
153
+ server.close();
154
+ }
155
+ catch { }
156
+ };
157
+ try {
158
+ await server.connect(transport);
159
+ await transport.handleRequest(req, res, req.body);
160
+ res.on("close", cleanup);
161
+ }
162
+ catch (error) {
163
+ log("error", "Error handling MCP request", { requestId, error: String(error) });
164
+ cleanup();
165
+ if (!res.headersSent) {
166
+ res.status(500).json({ error: "Internal server error" });
167
+ }
168
+ }
169
+ });
170
+ // Streamable HTTP endpoint - GET
171
+ app.get("/mcp", async (req, res) => {
172
+ const requestId = req.requestId;
173
+ const token = extractBearerToken(req);
174
+ if (!token) {
175
+ res.status(401).json({ error: "Missing or invalid Authorization header" });
176
+ return;
177
+ }
178
+ if (!config.MEMOS_URL) {
179
+ res.status(500).json({ error: "Server configuration error: MEMOS_URL not set" });
180
+ return;
181
+ }
182
+ const transport = new StreamableHTTPServerTransport({
183
+ sessionIdGenerator: undefined,
184
+ });
185
+ const client = new MemosClient(config.MEMOS_URL, token);
186
+ const server = createServerWithClient(client);
187
+ let cleanedUp = false;
188
+ const cleanup = () => {
189
+ if (cleanedUp)
190
+ return;
191
+ cleanedUp = true;
192
+ try {
193
+ transport.close();
194
+ }
195
+ catch { }
196
+ try {
197
+ server.close();
198
+ }
199
+ catch { }
200
+ };
201
+ try {
202
+ await server.connect(transport);
203
+ await transport.handleRequest(req, res);
204
+ res.on("close", cleanup);
205
+ }
206
+ catch (error) {
207
+ log("error", "Error in MCP GET", { requestId, error: String(error) });
208
+ cleanup();
209
+ if (!res.headersSent) {
210
+ res.status(500).json({ error: "Internal server error" });
211
+ }
212
+ }
213
+ });
214
+ // SSE endpoint - GET para iniciar stream
215
+ app.get("/sse", async (req, res) => {
216
+ const requestId = req.requestId;
217
+ const token = extractBearerToken(req);
218
+ if (!token) {
219
+ res.status(401).json({ error: "Missing or invalid Authorization header" });
220
+ return;
221
+ }
222
+ if (!config.MEMOS_URL) {
223
+ res.status(500).json({ error: "Server configuration error: MEMOS_URL not set" });
224
+ return;
225
+ }
226
+ // Verificar límite de sesiones
227
+ if (sseSessions.size >= SSE_MAX_SESSIONS) {
228
+ log("warn", "SSE session limit reached", { currentSessions: sseSessions.size, requestId });
229
+ res.status(429).json({ error: "Too many SSE sessions. Try again later." });
230
+ return;
231
+ }
232
+ const transport = new SSEServerTransport("/sse/messages", res);
233
+ const client = new MemosClient(config.MEMOS_URL, token);
234
+ const server = createServerWithClient(client);
235
+ // Guardar sesión
236
+ sseSessions.set(transport.sessionId, {
237
+ transport,
238
+ lastActivity: Date.now(),
239
+ });
240
+ // Cleanup cuando se cierra la conexión
241
+ res.on("close", () => {
242
+ sseSessions.delete(transport.sessionId);
243
+ try {
244
+ transport.close();
245
+ }
246
+ catch { }
247
+ try {
248
+ server.close();
249
+ }
250
+ catch { }
251
+ });
252
+ try {
253
+ await server.connect(transport);
254
+ transport.start();
255
+ log("info", "SSE session started", { sessionId: transport.sessionId, requestId });
256
+ }
257
+ catch (error) {
258
+ log("error", "Error starting SSE", { requestId, error: String(error) });
259
+ sseSessions.delete(transport.sessionId);
260
+ try {
261
+ transport.close();
262
+ }
263
+ catch { }
264
+ try {
265
+ server.close();
266
+ }
267
+ catch { }
268
+ }
269
+ });
270
+ // SSE endpoint - POST para recibir mensajes
271
+ app.post("/sse/messages", async (req, res) => {
272
+ const sessionId = req.query.sessionId;
273
+ if (!sessionId) {
274
+ res.status(400).json({ error: "Missing sessionId query parameter" });
275
+ return;
276
+ }
277
+ const session = sseSessions.get(sessionId);
278
+ if (!session) {
279
+ res.status(404).json({ error: "Session not found or expired" });
280
+ return;
281
+ }
282
+ // Actualizar actividad
283
+ session.lastActivity = Date.now();
284
+ try {
285
+ await session.transport.handlePostMessage(req, res, req.body);
286
+ }
287
+ catch (error) {
288
+ log("error", "Error handling SSE message", { sessionId, error: String(error) });
289
+ if (!res.headersSent) {
290
+ res.status(500).json({ error: "Internal server error" });
291
+ }
292
+ }
293
+ });
294
+ // Error handler
295
+ app.use((err, _req, res, _next) => {
296
+ log("error", "Unhandled error", { error: err.message, stack: err.stack });
297
+ if (!res.headersSent) {
298
+ res.status(500).json({ error: "Internal server error" });
299
+ }
300
+ });
301
+ return app;
302
+ }
303
+ // Iniciar servidor HTTP
304
+ export function startHttpServer(config) {
305
+ const app = createHttpApp(config);
306
+ const { HTTP_PORT, HTTP_HOST } = config;
307
+ const server = app.listen(HTTP_PORT, HTTP_HOST, () => {
308
+ log("info", `HTTP server started`, {
309
+ host: HTTP_HOST,
310
+ port: HTTP_PORT,
311
+ url: `http://${HTTP_HOST}:${HTTP_PORT}`,
312
+ });
313
+ log("info", `Endpoints:`, {
314
+ health: `GET http://${HTTP_HOST}:${HTTP_PORT}/health`,
315
+ mcp: `POST http://${HTTP_HOST}:${HTTP_PORT}/mcp`,
316
+ sse: `GET http://${HTTP_HOST}:${HTTP_PORT}/sse`,
317
+ });
318
+ });
319
+ // Graceful shutdown - cerrar todo limpiamente
320
+ const shutdown = () => {
321
+ log("info", "Shutting down HTTP server...");
322
+ // Cerrar todas las sesiones SSE
323
+ for (const [id, session] of sseSessions) {
324
+ session.transport.close();
325
+ sseSessions.delete(id);
326
+ }
327
+ // Cerrar el servidor Express
328
+ server.close(() => {
329
+ log("info", "HTTP server stopped");
330
+ process.exit(0);
331
+ });
332
+ // Forzar salida después de 5 segundos
333
+ setTimeout(() => {
334
+ log("warn", "Force shutdown after timeout");
335
+ process.exit(1);
336
+ }, 5_000);
337
+ };
338
+ process.on("SIGINT", shutdown);
339
+ process.on("SIGTERM", shutdown);
340
+ return server;
341
+ }
342
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -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,79 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server.js";
4
+ import { startHttpServer } from "./http.js";
5
+ import { loadConfig } from "./config.js";
6
+ // Detectar modo de ejecución
7
+ const args = process.argv.slice(2);
8
+ const isHttpMode = args.includes("--http") || args.includes("-h");
9
+ const showHelp = args.includes("--help") || args.includes("-?");
10
+ // Parse port argument
11
+ let customPort;
12
+ const portIndex = args.indexOf("--port");
13
+ if (portIndex !== -1 && args[portIndex + 1]) {
14
+ customPort = parseInt(args[portIndex + 1], 10);
15
+ if (isNaN(customPort) || customPort < 1 || customPort > 65535) {
16
+ console.error("Invalid port. Use --port with a number between 1 and 65535.");
17
+ process.exit(1);
18
+ }
19
+ }
20
+ // Mostrar ayuda
21
+ if (showHelp) {
22
+ console.log(`
23
+ memos-mcp - Model Context Protocol server for Memos
24
+
25
+ Usage:
26
+ memos-mcp Start in stdio mode (for Claude Desktop/Code)
27
+ memos-mcp --http Start in HTTP/SSE mode (for OpenCode/LibreChat)
28
+
29
+ Environment variables:
30
+ MEMOS_URL Memos instance URL (required)
31
+
32
+ HTTP mode:
33
+ No token needed in .env. Each client sends its own token via
34
+ Authorization: Bearer <token> header. The server uses that token
35
+ to access Memos as that specific user.
36
+
37
+ HTTP_PORT HTTP server port (default: 3000)
38
+ HTTP_HOST HTTP server host (default: 127.0.0.1)
39
+ CORS_ORIGIN Allowed CORS origins (default: *)
40
+ LOG_LEVEL Log level: debug, info, warn, error (default: info)
41
+
42
+ Stdio mode:
43
+ MEMOS_TOKEN Memos access token (required for stdio only)
44
+
45
+ Examples:
46
+ # Claude Desktop/Code (stdio) - token in env
47
+ MEMOS_URL=https://memos.example.com MEMOS_TOKEN=xxx npx memos-mcp
48
+
49
+ # OpenCode/LibreChat (HTTP) - token in client config
50
+ MEMOS_URL=https://memos.example.com npx memos-mcp --http
51
+ `);
52
+ process.exit(0);
53
+ }
54
+ // Modo HTTP
55
+ if (isHttpMode) {
56
+ // Override port if specified via CLI
57
+ if (customPort) {
58
+ process.env.HTTP_PORT = String(customPort);
59
+ }
60
+ const config = loadConfig();
61
+ console.log(`Starting memos-mcp in HTTP mode...`);
62
+ console.log(`Server will accept requests at:`);
63
+ console.log(` - http://${config.HTTP_HOST}:${config.HTTP_PORT}/mcp (Streamable HTTP)`);
64
+ console.log(` - http://${config.HTTP_HOST}:${config.HTTP_PORT}/sse (SSE)`);
65
+ console.log(` - http://${config.HTTP_HOST}:${config.HTTP_PORT}/health (Health check)`);
66
+ console.log(``);
67
+ console.log(`Each request must include: Authorization: Bearer <token>`);
68
+ startHttpServer(config);
69
+ }
70
+ // Modo stdio (default)
71
+ else {
72
+ const server = createServer();
73
+ const transport = new StdioServerTransport();
74
+ server.connect(transport).catch((err) => {
75
+ console.error("Failed to connect transport:", err);
76
+ process.exit(1);
77
+ });
78
+ }
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,6BAA6B;AAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEhE,sBAAsB;AACtB,IAAI,UAA8B,CAAC;AACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACzC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IAC5C,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,IAAI,QAAQ,EAAE,CAAC;IACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Bb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,YAAY;AACZ,IAAI,UAAU,EAAE,CAAC;IACf,qCAAqC;IACrC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,wBAAwB,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,YAAY,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,wBAAwB,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AACD,uBAAuB;KAClB,CAAC;IACJ,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare const registerPrompts: (server: McpServer) => void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,eAAO,MAAM,eAAe,GAAI,QAAQ,SAAS,SAqFhD,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ export const registerPrompts = (server) => {
3
+ // capture — save a thought
4
+ server.registerPrompt("capture", {
5
+ description: "Quick-save a thought, note, task, or idea",
6
+ argsSchema: {
7
+ content: z.string().describe("The thought or note to save"),
8
+ tags: z.string().optional().describe("Comma-separated tags (e.g. 'idea,project')"),
9
+ visibility: z.enum(["PRIVATE", "PROTECTED", "PUBLIC"]).default("PRIVATE"),
10
+ },
11
+ }, ({ content, tags, visibility }) => {
12
+ let memoContent = content;
13
+ if (tags) {
14
+ memoContent = `${memoContent}\n\n${tags.split(",").map((t) => `#${t.trim()}`).join(" ")}`;
15
+ }
16
+ return {
17
+ messages: [{
18
+ role: "user",
19
+ content: { type: "text", text: `Create a memo using the create tool. Visibility: ${visibility}.\n\nContent:\n${memoContent}` },
20
+ }],
21
+ };
22
+ });
23
+ // review — review memos from a period
24
+ server.registerPrompt("review", {
25
+ description: "Review memos from a time period",
26
+ argsSchema: {
27
+ period: z.enum(["today", "week", "month", "year"]).default("week"),
28
+ },
29
+ }, ({ period }) => {
30
+ const map = {
31
+ today: { date: "today" },
32
+ week: { date: "this_week", week: true },
33
+ month: { date: "this_month" },
34
+ year: { date: "2024-01-01", endDate: "2024-12-31" },
35
+ };
36
+ const { date, week, endDate } = map[period];
37
+ const weekArg = week ? ", week=true" : "";
38
+ const endDateArg = endDate ? `, endDate="${endDate}"` : "";
39
+ return {
40
+ messages: [{
41
+ role: "user",
42
+ content: { type: "text", text: `Review your memos from ${period}.\n\n1. search(date="${date}"${weekArg}${endDateArg})\n2. get(id="<id>") for each memo, one at a time\n3. Wait for user confirmation between each\n4. Summarize when done` },
43
+ }],
44
+ };
45
+ });
46
+ // on_day — check a specific date
47
+ server.registerPrompt("on_day", {
48
+ description: "Check what happened or is planned for a specific date",
49
+ argsSchema: {
50
+ date: z.string().describe("Date to check (ISO 8601, 'today', 'yesterday', 'next_monday', etc.)"),
51
+ },
52
+ }, ({ date }) => ({
53
+ messages: [{
54
+ role: "user",
55
+ content: { type: "text", text: `Check what happened or is planned for ${date}.\n\nUse: search(date="${date}")\nPresent the memos found.` },
56
+ }],
57
+ }));
58
+ // tag_overview — analyze tags
59
+ server.registerPrompt("tag_overview", {
60
+ description: "Analyze your tag system and suggest improvements",
61
+ }, () => ({
62
+ messages: [{
63
+ role: "user",
64
+ content: { type: "text", text: `Analyze my tag organization.\n\n1. tags() for top-level tags\n2. tags(parent="<tag>") for children\n3. Present: hierarchy, usage, cleanup suggestions` },
65
+ }],
66
+ }));
67
+ };
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MemosClient } from "../client.js";
3
+ export declare const registerResources: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI3C,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SA8DvE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { getPromptDefinitions } from "../prompts/index.js";
2
+ export const registerResources = (server, client) => {
3
+ server.registerResource("memo", "memo://memos/{uid}", { description: "A memo by its UID", mimeType: "text/markdown" }, async (uri) => {
4
+ const uid = uri.pathname.split("/").pop();
5
+ if (!uid) {
6
+ throw new Error("Invalid memo URI: missing UID");
7
+ }
8
+ const memo = await client.get(`/api/v1/memos:by-uid/${uid}`);
9
+ const id = memo.name?.match(/^memos\/(\d+)$/)?.[1];
10
+ const frontmatter = [
11
+ "---",
12
+ id ? `id: ${id}` : null,
13
+ `uid: ${memo.uid}`,
14
+ `visibility: ${memo.visibility}`,
15
+ memo.pinned ? `pinned: true` : null,
16
+ `created: ${memo.createTime}`,
17
+ `updated: ${memo.updateTime}`,
18
+ memo.tags?.length ? `tags: [${memo.tags.join(", ")}]` : null,
19
+ "---",
20
+ ]
21
+ .filter(Boolean)
22
+ .join("\n");
23
+ return {
24
+ contents: [
25
+ {
26
+ uri: uri.href,
27
+ mimeType: "text/markdown",
28
+ text: `${frontmatter}\n\n${memo.content}`,
29
+ },
30
+ ],
31
+ };
32
+ });
33
+ // Expose prompts as readable resources so the assistant can access them
34
+ // programmatically (e.g. from channel conversations where slash commands
35
+ // are not available).
36
+ const prompts = getPromptDefinitions();
37
+ for (const [name, prompt] of Object.entries(prompts)) {
38
+ server.registerResource(`prompt-${name}`, `memo://prompts/${name}`, {
39
+ description: `Prompt: ${prompt.description}`,
40
+ mimeType: "text/markdown",
41
+ }, async (uri) => ({
42
+ contents: [
43
+ {
44
+ uri: uri.href,
45
+ mimeType: "text/markdown",
46
+ text: prompt.text,
47
+ },
48
+ ],
49
+ }));
50
+ }
51
+ };
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAiB,EAAE,MAAmB,EAAE,EAAE;IAC1E,MAAM,CAAC,gBAAgB,CACrB,MAAM,EACN,oBAAoB,EACpB,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE,EAC/D,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAO,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAEnE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;YACvB,QAAQ,IAAI,CAAC,GAAG,EAAE;YAClB,eAAe,IAAI,CAAC,UAAU,EAAE;YAChC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI;YACnC,YAAY,IAAI,CAAC,UAAU,EAAE;YAC7B,YAAY,IAAI,CAAC,UAAU,EAAE;YAC7B,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;YAC5D,KAAK;SACN;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,GAAG,WAAW,OAAO,IAAI,CAAC,OAAO,EAAE;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,wEAAwE;IACxE,yEAAyE;IACzE,sBAAsB;IACtB,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,gBAAgB,CACrB,UAAU,IAAI,EAAE,EAChB,kBAAkB,IAAI,EAAE,EACxB;YACE,WAAW,EAAE,WAAW,MAAM,CAAC,WAAW,EAAE;YAC5C,QAAQ,EAAE,eAAe;SAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACd,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB;aACF;SACF,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MemosClient } from "./client.js";
3
+ import { type Visibility } from "./types.js";
4
+ export interface ServerOptions {
5
+ defaultVisibility?: Visibility;
6
+ }
7
+ export declare const createServerWithClient: (client: MemosClient, options?: ServerOptions) => McpServer;
8
+ export declare const createServer: () => McpServer;
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAChC;AAGD,eAAO,MAAM,sBAAsB,GACjC,QAAQ,WAAW,EACnB,UAAS,aAAkB,cAe5B,CAAC;AAGF,eAAO,MAAM,YAAY,iBAqBxB,CAAC"}