@chriscurrycc/memos-mcp 0.1.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/README.md +160 -0
  2. package/dist/client.d.ts +11 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +74 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +7 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/prompts/index.d.ts +3 -0
  11. package/dist/prompts/index.d.ts.map +1 -0
  12. package/dist/prompts/index.js +70 -0
  13. package/dist/prompts/index.js.map +1 -0
  14. package/dist/resources/index.d.ts +4 -0
  15. package/dist/resources/index.d.ts.map +1 -0
  16. package/dist/resources/index.js +34 -0
  17. package/dist/resources/index.js.map +1 -0
  18. package/dist/server.d.ts +3 -0
  19. package/dist/server.d.ts.map +1 -0
  20. package/dist/server.js +42 -0
  21. package/dist/server.js.map +1 -0
  22. package/dist/tools/comments.d.ts +4 -0
  23. package/dist/tools/comments.d.ts.map +1 -0
  24. package/dist/tools/comments.js +21 -0
  25. package/dist/tools/comments.js.map +1 -0
  26. package/dist/tools/memos.d.ts +4 -0
  27. package/dist/tools/memos.d.ts.map +1 -0
  28. package/dist/tools/memos.js +83 -0
  29. package/dist/tools/memos.js.map +1 -0
  30. package/dist/tools/reactions.d.ts +4 -0
  31. package/dist/tools/reactions.d.ts.map +1 -0
  32. package/dist/tools/reactions.js +25 -0
  33. package/dist/tools/reactions.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 +40 -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 +28 -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 +72 -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 +32 -0
  49. package/dist/tools/tags.js.map +1 -0
  50. package/dist/types.d.ts +81 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +37 -0
package/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # memos-mcp
2
+
3
+ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for [Memos](https://github.com/chriscurrycc/memos) — a self-hosted note-taking service.
4
+
5
+ [中文文档](README_zh.md)
6
+
7
+ Enables AI assistants (Claude Code, Claude Desktop, Cursor, etc.) to read and write your memos through a standardized interface.
8
+
9
+ ## Setup
10
+
11
+ ### Prerequisites
12
+
13
+ - Node.js >= 18
14
+ - A running Memos instance
15
+ - A Memos access token (Settings → Access Tokens)
16
+
17
+ ### Claude Code
18
+
19
+ ```bash
20
+ claude mcp add memos -- npx @chriscurrycc/memos-mcp
21
+ ```
22
+
23
+ Then set environment variables:
24
+
25
+ ```bash
26
+ export MEMOS_URL=https://your-memos-instance.com
27
+ export MEMOS_TOKEN=your-access-token
28
+ ```
29
+
30
+ ### Claude Desktop
31
+
32
+ Add to your `claude_desktop_config.json`:
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "memos": {
38
+ "command": "npx",
39
+ "args": ["-y", "memos-mcp"],
40
+ "env": {
41
+ "MEMOS_URL": "https://your-memos-instance.com",
42
+ "MEMOS_TOKEN": "your-access-token"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ ### With 1Password (recommended)
50
+
51
+ Use `op run` to inject the token securely — no plaintext secrets on disk:
52
+
53
+ ```json
54
+ {
55
+ "mcpServers": {
56
+ "memos": {
57
+ "command": "op",
58
+ "args": ["run", "--", "npx", "-y", "memos-mcp"],
59
+ "env": {
60
+ "MEMOS_URL": "https://your-memos-instance.com",
61
+ "MEMOS_TOKEN": "op://Personal/memos-api/token"
62
+ }
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ ## Tools
69
+
70
+ ### Memos
71
+
72
+ | Tool | Description |
73
+ |------|-------------|
74
+ | `list_memos` | List memos with filtering and pagination |
75
+ | `get_memo` | Get a single memo by ID |
76
+ | `search_memos` | Search memos by keyword |
77
+ | `create_memo` | Create a new memo |
78
+ | `update_memo` | Update content, visibility, pin, or archive state |
79
+ | `delete_memo` | Permanently delete a memo |
80
+
81
+ ### Comments
82
+
83
+ | Tool | Description |
84
+ |------|-------------|
85
+ | `list_memo_comments` | List comments on a memo |
86
+ | `create_memo_comment` | Add a comment to a memo |
87
+
88
+ ### Tags
89
+
90
+ | Tool | Description |
91
+ |------|-------------|
92
+ | `list_pinned_tags` | List all pinned tags |
93
+ | `list_tags_with_emoji` | List tags with their emojis |
94
+ | `update_tag` | Update a tag's emoji or pinned status |
95
+
96
+ ### Resources
97
+
98
+ | Tool | Description |
99
+ |------|-------------|
100
+ | `list_resources` | List all resources (attachments) |
101
+ | `get_resource` | Get a resource by ID |
102
+ | `delete_resource` | Delete a resource |
103
+ | `link_resource_to_memo` | Link resources to a memo |
104
+
105
+ ### Relations
106
+
107
+ | Tool | Description |
108
+ |------|-------------|
109
+ | `list_memo_relations` | List memo relations |
110
+ | `set_memo_relations` | Set relations (replaces all) |
111
+ | `delete_memo_relation` | Remove a specific relation |
112
+
113
+ ### Reactions
114
+
115
+ | Tool | Description |
116
+ |------|-------------|
117
+ | `list_reactions` | List reactions on a memo |
118
+ | `upsert_reaction` | Add a reaction emoji |
119
+ | `delete_reaction` | Remove a reaction |
120
+
121
+ ### Review (Spaced Repetition)
122
+
123
+ | Tool | Description |
124
+ |------|-------------|
125
+ | `list_review_memos` | Get memos due for review |
126
+ | `get_random_memo` | Get a random memo |
127
+ | `list_on_this_day_memos` | Memos created on this day in past years |
128
+ | `get_time_travel_memos` | Memos from a random time period |
129
+ | `record_review` | Record that memos have been reviewed |
130
+ | `get_review_stats` | Get review statistics |
131
+
132
+ ## Prompts
133
+
134
+ | Prompt | Description |
135
+ |--------|-------------|
136
+ | `capture` | Quick-save a thought as a memo |
137
+ | `review` | Start a guided review session |
138
+ | `daily_digest` | Summarize recent memo activity |
139
+
140
+ ## Resources
141
+
142
+ | URI Template | Description |
143
+ |-------------|-------------|
144
+ | `memo://memos/{uid}` | Get a memo by UID as markdown |
145
+
146
+ ## Development
147
+
148
+ ```bash
149
+ git clone https://github.com/chriscurrycc/memos-mcp.git
150
+ cd memos-mcp
151
+ pnpm install
152
+ pnpm build
153
+
154
+ # Run in dev mode
155
+ MEMOS_URL=http://localhost:5230 MEMOS_TOKEN=your-token pnpm dev
156
+ ```
157
+
158
+ ## License
159
+
160
+ MIT
@@ -0,0 +1,11 @@
1
+ export declare class MemosClient {
2
+ private baseUrl;
3
+ private token;
4
+ constructor(baseUrl: string, token: string);
5
+ private headers;
6
+ get<T>(path: string, params?: Record<string, string>): Promise<T>;
7
+ post<T>(path: string, body?: unknown): Promise<T>;
8
+ patch<T>(path: string, body?: unknown, params?: Record<string, string>): Promise<T>;
9
+ delete<T = unknown>(path: string): Promise<T>;
10
+ }
11
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK1C,OAAO,CAAC,OAAO;IAOT,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBjE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAajD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqBnF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAWpD"}
package/dist/client.js ADDED
@@ -0,0 +1,74 @@
1
+ export class MemosClient {
2
+ baseUrl;
3
+ token;
4
+ constructor(baseUrl, token) {
5
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
6
+ this.token = token;
7
+ }
8
+ headers() {
9
+ return {
10
+ Authorization: `Bearer ${this.token}`,
11
+ "Content-Type": "application/json",
12
+ };
13
+ }
14
+ async get(path, params) {
15
+ const url = new URL(`${this.baseUrl}${path}`);
16
+ if (params) {
17
+ for (const [key, value] of Object.entries(params)) {
18
+ if (value !== undefined && value !== "") {
19
+ url.searchParams.set(key, value);
20
+ }
21
+ }
22
+ }
23
+ const res = await fetch(url.toString(), { headers: this.headers() });
24
+ if (!res.ok) {
25
+ const body = await res.text();
26
+ throw new Error(`GET ${path} failed (${res.status}): ${body}`);
27
+ }
28
+ return res.json();
29
+ }
30
+ async post(path, body) {
31
+ const res = await fetch(`${this.baseUrl}${path}`, {
32
+ method: "POST",
33
+ headers: this.headers(),
34
+ body: body ? JSON.stringify(body) : undefined,
35
+ });
36
+ if (!res.ok) {
37
+ const text = await res.text();
38
+ throw new Error(`POST ${path} failed (${res.status}): ${text}`);
39
+ }
40
+ return res.json();
41
+ }
42
+ async patch(path, body, params) {
43
+ const url = new URL(`${this.baseUrl}${path}`);
44
+ if (params) {
45
+ for (const [key, value] of Object.entries(params)) {
46
+ if (value !== undefined && value !== "") {
47
+ url.searchParams.set(key, value);
48
+ }
49
+ }
50
+ }
51
+ const res = await fetch(url.toString(), {
52
+ method: "PATCH",
53
+ headers: this.headers(),
54
+ body: body ? JSON.stringify(body) : undefined,
55
+ });
56
+ if (!res.ok) {
57
+ const text = await res.text();
58
+ throw new Error(`PATCH ${path} failed (${res.status}): ${text}`);
59
+ }
60
+ return res.json();
61
+ }
62
+ async delete(path) {
63
+ const res = await fetch(`${this.baseUrl}${path}`, {
64
+ method: "DELETE",
65
+ headers: this.headers(),
66
+ });
67
+ if (!res.ok) {
68
+ const text = await res.text();
69
+ throw new Error(`DELETE ${path} failed (${res.status}): ${text}`);
70
+ }
71
+ return res.json();
72
+ }
73
+ }
74
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.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,7 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server.js";
4
+ const server = createServer();
5
+ const transport = new StdioServerTransport();
6
+ await server.connect(transport);
7
+ //# 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;AAE3C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,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,SAoFhD,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { z } from "zod";
2
+ export const registerPrompts = (server) => {
3
+ server.prompt("capture", "Quick-save a thought as a memo", {
4
+ content: z.string().describe("The thought or note to capture"),
5
+ tags: z.string().optional().describe("Comma-separated tags to add, e.g. 'idea,project'"),
6
+ visibility: z.enum(["PRIVATE", "PROTECTED", "PUBLIC"]).default("PRIVATE").describe("Memo visibility"),
7
+ }, ({ content, tags, visibility }) => {
8
+ let memoContent = content;
9
+ if (tags) {
10
+ const tagList = tags
11
+ .split(",")
12
+ .map((t) => `#${t.trim()}`)
13
+ .join(" ");
14
+ memoContent = `${memoContent}\n\n${tagList}`;
15
+ }
16
+ return {
17
+ messages: [
18
+ {
19
+ role: "user",
20
+ content: {
21
+ type: "text",
22
+ text: `Create a memo with the following content using the create_memo tool. Visibility: ${visibility}.\n\nContent:\n${memoContent}`,
23
+ },
24
+ },
25
+ ],
26
+ };
27
+ });
28
+ server.prompt("review", "Start a guided memo review session", {}, () => {
29
+ return {
30
+ messages: [
31
+ {
32
+ role: "user",
33
+ content: {
34
+ type: "text",
35
+ text: `Start a memo review session:
36
+ 1. Call list_review_memos to get memos due for review
37
+ 2. If the session is already completed, let me know
38
+ 3. Otherwise, present each memo one by one with its content
39
+ 4. After presenting all memos, ask if I want to record the review
40
+ 5. If yes, call record_review with the memo IDs and source REVIEW_SOURCE_REVIEW
41
+ 6. Finally, show the updated review stats using get_review_stats`,
42
+ },
43
+ },
44
+ ],
45
+ };
46
+ });
47
+ server.prompt("daily_digest", "Summarize recent memo activity", {}, () => {
48
+ return {
49
+ messages: [
50
+ {
51
+ role: "user",
52
+ content: {
53
+ type: "text",
54
+ text: `Create a daily digest of my memos:
55
+ 1. Call list_memos with pageSize 50 to get recent memos
56
+ 2. Call list_pinned_tags to see my important tags
57
+ 3. Summarize:
58
+ - How many memos were created/updated recently
59
+ - Key themes and topics based on tags
60
+ - Any pinned memos that might need attention
61
+ - Any memos with incomplete tasks (if visible in properties)
62
+ 4. Check list_on_this_day_memos for any "on this day" memories
63
+ 5. Present everything in a concise daily briefing format`,
64
+ },
65
+ },
66
+ ],
67
+ };
68
+ });
69
+ };
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAiB,EAAE,EAAE;IACnD,MAAM,CAAC,MAAM,CACX,SAAS,EACT,gCAAgC,EAChC;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACxF,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KACtG,EACD,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;QAChC,IAAI,WAAW,GAAG,OAAO,CAAC;QAC1B,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,IAAI;iBACjB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;iBAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,WAAW,GAAG,GAAG,WAAW,OAAO,OAAO,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oFAAoF,UAAU,kBAAkB,WAAW,EAAE;qBACpI;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,QAAQ,EACR,oCAAoC,EACpC,EAAE,EACF,GAAG,EAAE;QACH,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;;;;;;iEAM6C;qBACpD;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,cAAc,EACd,gCAAgC,EAChC,EAAE,EACF,GAAG,EAAE;QACH,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;;;;;;;;;yDASqC;qBAC5C;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -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;AAG3C,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SAuCvE,CAAC"}
@@ -0,0 +1,34 @@
1
+ export const registerResources = (server, client) => {
2
+ server.resource("memo", "memo://memos/{uid}", { description: "A memo by its UID", mimeType: "text/markdown" }, async (uri) => {
3
+ const uid = uri.pathname.split("/").pop();
4
+ if (!uid) {
5
+ throw new Error("Invalid memo URI: missing UID");
6
+ }
7
+ const memo = await client.get(`/api/v1/memos:by-uid/${uid}`);
8
+ // Format as markdown with YAML frontmatter
9
+ const frontmatter = [
10
+ "---",
11
+ `uid: ${memo.uid}`,
12
+ `name: ${memo.name}`,
13
+ `creator: ${memo.creator}`,
14
+ `visibility: ${memo.visibility}`,
15
+ `pinned: ${memo.pinned}`,
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
+ };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAiB,EAAE,MAAmB,EAAE,EAAE;IAC1E,MAAM,CAAC,QAAQ,CACb,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,2CAA2C;QAC3C,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,QAAQ,IAAI,CAAC,GAAG,EAAE;YAClB,SAAS,IAAI,CAAC,IAAI,EAAE;YACpB,YAAY,IAAI,CAAC,OAAO,EAAE;YAC1B,eAAe,IAAI,CAAC,UAAU,EAAE;YAChC,WAAW,IAAI,CAAC,MAAM,EAAE;YACxB,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;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare const createServer: () => McpServer;
3
+ //# 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;AAYpE,eAAO,MAAM,YAAY,iBAoCxB,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1,42 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MemosClient } from "./client.js";
3
+ import { registerMemoTools } from "./tools/memos.js";
4
+ import { registerCommentTools } from "./tools/comments.js";
5
+ import { registerTagTools } from "./tools/tags.js";
6
+ import { registerResourceTools } from "./tools/resources.js";
7
+ import { registerRelationTools } from "./tools/relations.js";
8
+ import { registerReactionTools } from "./tools/reactions.js";
9
+ import { registerReviewTools } from "./tools/review.js";
10
+ import { registerPrompts } from "./prompts/index.js";
11
+ import { registerResources } from "./resources/index.js";
12
+ export const createServer = () => {
13
+ const memosUrl = process.env.MEMOS_URL;
14
+ const memosToken = process.env.MEMOS_TOKEN;
15
+ if (!memosUrl) {
16
+ console.error("Error: MEMOS_URL environment variable is required");
17
+ process.exit(1);
18
+ }
19
+ if (!memosToken) {
20
+ console.error("Error: MEMOS_TOKEN environment variable is required");
21
+ process.exit(1);
22
+ }
23
+ const client = new MemosClient(memosUrl, memosToken);
24
+ const server = new McpServer({
25
+ name: "memos-mcp",
26
+ version: "0.1.0",
27
+ });
28
+ // Register all tools
29
+ registerMemoTools(server, client);
30
+ registerCommentTools(server, client);
31
+ registerTagTools(server, client);
32
+ registerResourceTools(server, client);
33
+ registerRelationTools(server, client);
34
+ registerReactionTools(server, client);
35
+ registerReviewTools(server, client);
36
+ // Register prompts
37
+ registerPrompts(server);
38
+ // Register resources
39
+ registerResources(server, client);
40
+ return server;
41
+ };
42
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,qBAAqB;IACrB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,mBAAmB;IACnB,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,qBAAqB;IACrB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MemosClient } from "../client.js";
3
+ export declare const registerCommentTools: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,oBAAoB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SA6B1E,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ export const registerCommentTools = (server, client) => {
3
+ server.tool("list_memo_comments", "List comments on a memo", {
4
+ id: z.number().int().describe("Memo ID"),
5
+ }, async ({ id }) => {
6
+ const result = await client.get(`/api/v1/memos/${id}/comments`);
7
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
8
+ });
9
+ server.tool("create_memo_comment", "Add a comment to a memo", {
10
+ id: z.number().int().describe("Memo ID to comment on"),
11
+ content: z.string().min(1).describe("Comment content"),
12
+ visibility: z.enum(["PRIVATE", "PROTECTED", "PUBLIC"]).default("PRIVATE").describe("Comment visibility"),
13
+ }, async ({ id, content, visibility }) => {
14
+ const comment = await client.post(`/api/v1/memos/${id}/comments`, {
15
+ content,
16
+ visibility,
17
+ });
18
+ return { content: [{ type: "text", text: JSON.stringify(comment, null, 2) }] };
19
+ });
20
+ };
21
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAiB,EAAE,MAAmB,EAAE,EAAE;IAC7E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,yBAAyB,EACzB;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;KACzC,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAoB,iBAAiB,EAAE,WAAW,CAAC,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,yBAAyB,EACzB;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACtD,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACzG,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAO,iBAAiB,EAAE,WAAW,EAAE;YACtE,OAAO;YACP,UAAU;SACX,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1F,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MemosClient } from "../client.js";
3
+ export declare const registerMemoTools: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=memos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memos.d.ts","sourceRoot":"","sources":["../../src/tools/memos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SAmHvE,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ export const registerMemoTools = (server, client) => {
3
+ server.tool("list_memos", "List memos with optional filtering and pagination", {
4
+ pageSize: z.number().int().min(1).max(100).default(20).describe("Number of memos per page"),
5
+ pageToken: z.string().optional().describe("Page token for pagination"),
6
+ filter: z.string().optional().describe("CEL filter expression, e.g. \"visibilities == ['PUBLIC']\""),
7
+ state: z.enum(["NORMAL", "ARCHIVED"]).optional().describe("Filter by memo state"),
8
+ }, async ({ pageSize, pageToken, filter, state }) => {
9
+ const params = { pageSize: String(pageSize) };
10
+ if (pageToken)
11
+ params.pageToken = pageToken;
12
+ if (state) {
13
+ const stateFilter = `row_status == "${state === "ARCHIVED" ? "ARCHIVED" : "ACTIVE"}"`;
14
+ params.filter = filter ? `${filter} && ${stateFilter}` : stateFilter;
15
+ }
16
+ else if (filter) {
17
+ params.filter = filter;
18
+ }
19
+ const result = await client.get("/api/v1/memos", params);
20
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
21
+ });
22
+ server.tool("get_memo", "Get a single memo by ID", {
23
+ id: z.number().int().describe("Memo ID"),
24
+ }, async ({ id }) => {
25
+ const memo = await client.get(`/api/v1/memos/${id}`);
26
+ return { content: [{ type: "text", text: JSON.stringify(memo, null, 2) }] };
27
+ });
28
+ server.tool("search_memos", "Search memos by keyword in content", {
29
+ query: z.string().min(1).describe("Search keyword"),
30
+ pageSize: z.number().int().min(1).max(100).default(20).describe("Number of results"),
31
+ }, async ({ query, pageSize }) => {
32
+ const filter = `content.contains("${query.replace(/"/g, '\\"')}")`;
33
+ const result = await client.get("/api/v1/memos", {
34
+ pageSize: String(pageSize),
35
+ filter,
36
+ });
37
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
38
+ });
39
+ server.tool("create_memo", "Create a new memo", {
40
+ content: z.string().min(1).describe("Memo content in markdown"),
41
+ visibility: z.enum(["PRIVATE", "PROTECTED", "PUBLIC"]).default("PRIVATE").describe("Memo visibility"),
42
+ }, async ({ content, visibility }) => {
43
+ const memo = await client.post("/api/v1/memos", { content, visibility });
44
+ return { content: [{ type: "text", text: JSON.stringify(memo, null, 2) }] };
45
+ });
46
+ server.tool("update_memo", "Update an existing memo", {
47
+ id: z.number().int().describe("Memo ID"),
48
+ content: z.string().optional().describe("New content"),
49
+ visibility: z.enum(["PRIVATE", "PROTECTED", "PUBLIC"]).optional().describe("New visibility"),
50
+ pinned: z.boolean().optional().describe("Pin or unpin the memo"),
51
+ state: z.enum(["NORMAL", "ARCHIVED"]).optional().describe("Archive or restore the memo"),
52
+ }, async ({ id, content, visibility, pinned, state }) => {
53
+ const body = {};
54
+ const updateMaskPaths = [];
55
+ if (content !== undefined) {
56
+ body.content = content;
57
+ updateMaskPaths.push("content");
58
+ }
59
+ if (visibility !== undefined) {
60
+ body.visibility = visibility;
61
+ updateMaskPaths.push("visibility");
62
+ }
63
+ if (pinned !== undefined) {
64
+ body.pinned = pinned;
65
+ updateMaskPaths.push("pinned");
66
+ }
67
+ if (state !== undefined) {
68
+ body.rowStatus = state === "ARCHIVED" ? "ARCHIVED" : "ACTIVE";
69
+ updateMaskPaths.push("row_status");
70
+ }
71
+ const memo = await client.patch(`/api/v1/memos/${id}`, body, {
72
+ updateMask: updateMaskPaths.join(","),
73
+ });
74
+ return { content: [{ type: "text", text: JSON.stringify(memo, null, 2) }] };
75
+ });
76
+ server.tool("delete_memo", "Permanently delete a memo", {
77
+ id: z.number().int().describe("Memo ID to delete"),
78
+ }, async ({ id }) => {
79
+ await client.delete(`/api/v1/memos/${id}`);
80
+ return { content: [{ type: "text", text: `Memo ${id} deleted.` }] };
81
+ });
82
+ };
83
+ //# sourceMappingURL=memos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memos.js","sourceRoot":"","sources":["../../src/tools/memos.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 registerReactionTools: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=reactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.d.ts","sourceRoot":"","sources":["../../src/tools/reactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SAuC3E,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ export const registerReactionTools = (server, client) => {
3
+ server.tool("list_reactions", "List reactions on a memo", {
4
+ id: z.number().int().describe("Memo ID"),
5
+ }, async ({ id }) => {
6
+ const result = await client.get(`/api/v1/memos/${id}/reactions`);
7
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
8
+ });
9
+ server.tool("upsert_reaction", "Add a reaction emoji to a memo (idempotent)", {
10
+ id: z.number().int().describe("Memo ID"),
11
+ reactionType: z.string().min(1).describe("Reaction emoji, e.g. 👍, ❤️, 🎉"),
12
+ }, async ({ id, reactionType }) => {
13
+ const reaction = await client.post(`/api/v1/memos/${id}/reactions`, {
14
+ reactionType,
15
+ });
16
+ return { content: [{ type: "text", text: JSON.stringify(reaction, null, 2) }] };
17
+ });
18
+ server.tool("delete_reaction", "Remove a reaction by ID", {
19
+ reactionId: z.number().int().describe("Reaction ID"),
20
+ }, async ({ reactionId }) => {
21
+ await client.delete(`/api/v1/reactions/${reactionId}`);
22
+ return { content: [{ type: "text", text: `Reaction ${reactionId} deleted.` }] };
23
+ });
24
+ };
25
+ //# sourceMappingURL=reactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.js","sourceRoot":"","sources":["../../src/tools/reactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAiB,EAAE,MAAmB,EAAE,EAAE;IAC9E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,0BAA0B,EAC1B;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;KACzC,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAA4B,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAC5F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,6CAA6C,EAC7C;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAC5E,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAW,iBAAiB,EAAE,YAAY,EAAE;YAC5E,YAAY;SACb,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3F,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,yBAAyB,EACzB;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KACrD,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,MAAM,MAAM,CAAC,MAAM,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,UAAU,WAAW,EAAE,CAAC,EAAE,CAAC;IAC3F,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MemosClient } from "../client.js";
3
+ export declare const registerRelationTools: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../src/tools/relations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SAmE3E,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ export const registerRelationTools = (server, client) => {
3
+ server.tool("list_memo_relations", "List relations of a memo (references and comments)", {
4
+ id: z.number().int().describe("Memo ID"),
5
+ }, async ({ id }) => {
6
+ const result = await client.get(`/api/v1/memos/${id}/relations`);
7
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
8
+ });
9
+ server.tool("set_memo_relations", "Set relations for a memo (replaces all existing relations)", {
10
+ id: z.number().int().describe("Memo ID"),
11
+ relations: z
12
+ .array(z.object({
13
+ relatedMemoId: z.number().int().describe("Related memo ID"),
14
+ type: z.enum(["REFERENCE", "COMMENT"]).describe("Relation type"),
15
+ }))
16
+ .describe("List of relations to set"),
17
+ }, async ({ id, relations }) => {
18
+ const body = {
19
+ relations: relations.map((r) => ({
20
+ memo: `memos/${id}`,
21
+ relatedMemo: `memos/${r.relatedMemoId}`,
22
+ type: r.type,
23
+ })),
24
+ };
25
+ const result = await client.patch(`/api/v1/memos/${id}/relations`, body);
26
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
27
+ });
28
+ server.tool("delete_memo_relation", "Remove a specific relation from a memo", {
29
+ id: z.number().int().describe("Memo ID"),
30
+ relatedMemoId: z.number().int().describe("Related memo ID to unlink"),
31
+ type: z.enum(["REFERENCE", "COMMENT"]).describe("Relation type to remove"),
32
+ }, async ({ id, relatedMemoId, type }) => {
33
+ // Get current relations, filter out the target, set remaining
34
+ const current = await client.get(`/api/v1/memos/${id}/relations`);
35
+ const remaining = (current.relations || []).filter((r) => !(r.relatedMemo === `memos/${relatedMemoId}` && r.type === type));
36
+ const result = await client.patch(`/api/v1/memos/${id}/relations`, { relations: remaining });
37
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
38
+ });
39
+ };
40
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../../src/tools/relations.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 registerResourceTools: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/tools/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SAmD3E,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ export const registerResourceTools = (server, client) => {
3
+ server.tool("list_resources", "List all resources (attachments)", {}, async () => {
4
+ const result = await client.get("/api/v1/resources");
5
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
6
+ });
7
+ server.tool("get_resource", "Get a resource by ID", {
8
+ id: z.number().int().describe("Resource ID"),
9
+ }, async ({ id }) => {
10
+ const resource = await client.get(`/api/v1/resources/${id}`);
11
+ return { content: [{ type: "text", text: JSON.stringify(resource, null, 2) }] };
12
+ });
13
+ server.tool("delete_resource", "Delete a resource", {
14
+ id: z.number().int().describe("Resource ID"),
15
+ }, async ({ id }) => {
16
+ await client.delete(`/api/v1/resources/${id}`);
17
+ return { content: [{ type: "text", text: `Resource ${id} deleted.` }] };
18
+ });
19
+ server.tool("link_resource_to_memo", "Link resources to a memo", {
20
+ memoId: z.number().int().describe("Memo ID"),
21
+ resourceIds: z.array(z.number().int()).min(1).describe("Resource IDs to link"),
22
+ }, async ({ memoId, resourceIds }) => {
23
+ const resources = resourceIds.map((id) => ({ name: `resources/${id}` }));
24
+ const result = await client.patch(`/api/v1/memos/${memoId}/resources`, { resources });
25
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
26
+ });
27
+ };
28
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/tools/resources.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAiB,EAAE,MAAmB,EAAE,EAAE;IAC9E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,kCAAkC,EAClC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAA4B,mBAAmB,CAAC,CAAC;QAChF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,sBAAsB,EACtB;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC7C,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3F,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,mBAAmB,EACnB;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC7C,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,0BAA0B,EAC1B;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAC/E,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;QAChC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,iBAAiB,MAAM,YAAY,EACnC,EAAE,SAAS,EAAE,CACd,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MemosClient } from "../client.js";
3
+ export declare const registerReviewTools: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/tools/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,mBAAmB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SAiHzE,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { z } from "zod";
2
+ export const registerReviewTools = (server, client) => {
3
+ server.tool("list_review_memos", "Get memos due for spaced-repetition review", {
4
+ force: z.boolean().default(false).describe("Force refresh the daily review cache"),
5
+ }, async ({ force }) => {
6
+ const params = {};
7
+ if (force)
8
+ params.force = "true";
9
+ const result = await client.get("/api/v1/review/memos", params);
10
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
11
+ });
12
+ server.tool("get_random_memo", "Get a random memo for surprise review", {}, async () => {
13
+ const memo = await client.get("/api/v1/review/random");
14
+ return { content: [{ type: "text", text: JSON.stringify(memo, null, 2) }] };
15
+ });
16
+ server.tool("list_on_this_day_memos", "Get memos created on this day in previous years", {
17
+ month: z.number().int().min(1).max(12).optional().describe("Month (1-12), defaults to current"),
18
+ day: z.number().int().min(1).max(31).optional().describe("Day (1-31), defaults to current"),
19
+ offset: z.number().int().min(0).default(0).describe("Pagination offset"),
20
+ pageSize: z.number().int().min(1).max(100).default(20).describe("Page size"),
21
+ }, async ({ month, day, offset, pageSize }) => {
22
+ const params = {
23
+ offset: String(offset),
24
+ pageSize: String(pageSize),
25
+ };
26
+ if (month !== undefined)
27
+ params.month = String(month);
28
+ if (day !== undefined)
29
+ params.day = String(day);
30
+ const result = await client.get("/api/v1/review/on-this-day", params);
31
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
32
+ });
33
+ server.tool("get_time_travel_memos", "Get memos from a random or specified time period", {
34
+ pageSize: z.number().int().min(1).max(100).default(20).describe("Page size"),
35
+ periodStart: z.string().optional().describe("ISO 8601 start date, e.g. 2024-01-01T00:00:00Z"),
36
+ periodEnd: z.string().optional().describe("ISO 8601 end date"),
37
+ offset: z.number().int().min(0).default(0).describe("Pagination offset"),
38
+ }, async ({ pageSize, periodStart, periodEnd, offset }) => {
39
+ const params = {
40
+ pageSize: String(pageSize),
41
+ offset: String(offset),
42
+ };
43
+ if (periodStart)
44
+ params.periodStart = periodStart;
45
+ if (periodEnd)
46
+ params.periodEnd = periodEnd;
47
+ const result = await client.get("/api/v1/review/time-travel", params);
48
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
49
+ });
50
+ server.tool("record_review", "Record that memos have been reviewed", {
51
+ memoIds: z.array(z.number().int()).min(1).describe("IDs of reviewed memos"),
52
+ source: z
53
+ .enum([
54
+ "REVIEW_SOURCE_REVIEW",
55
+ "REVIEW_SOURCE_ON_THIS_DAY",
56
+ "REVIEW_SOURCE_SURPRISE",
57
+ "REVIEW_SOURCE_TIME_TRAVEL",
58
+ ])
59
+ .describe("Review source"),
60
+ }, async ({ memoIds, source }) => {
61
+ const result = await client.post("/api/v1/review/record", {
62
+ memoNames: memoIds.map((id) => `memos/${id}`),
63
+ source,
64
+ });
65
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
66
+ });
67
+ server.tool("get_review_stats", "Get review statistics", {}, async () => {
68
+ const stats = await client.get("/api/v1/review/stats");
69
+ return { content: [{ type: "text", text: JSON.stringify(stats, null, 2) }] };
70
+ });
71
+ };
72
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/tools/review.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 registerTagTools: (server: McpServer, client: MemosClient) => void;
4
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,gBAAgB,GAAI,QAAQ,SAAS,EAAE,QAAQ,WAAW,SAgDtE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export const registerTagTools = (server, client) => {
3
+ server.tool("list_pinned_tags", "List all pinned tags", {}, async () => {
4
+ const result = await client.get("/api/v1/tags:pinned");
5
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
6
+ });
7
+ server.tool("list_tags_with_emoji", "List all tags with their associated emojis", {}, async () => {
8
+ const result = await client.get("/api/v1/tags:emoji");
9
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
10
+ });
11
+ server.tool("update_tag", "Update a tag's emoji or pinned status", {
12
+ tagName: z.string().min(1).describe("Tag name (without #)"),
13
+ emoji: z.string().optional().describe("Emoji to associate with the tag"),
14
+ pinned: z.boolean().optional().describe("Pin or unpin the tag"),
15
+ }, async ({ tagName, emoji, pinned }) => {
16
+ const body = {};
17
+ const updateMaskPaths = [];
18
+ if (emoji !== undefined) {
19
+ body.emoji = emoji;
20
+ updateMaskPaths.push("emoji");
21
+ }
22
+ if (pinned !== undefined) {
23
+ body.pinned = pinned;
24
+ updateMaskPaths.push("pinned");
25
+ }
26
+ const tag = await client.patch(`/api/v1/tags/${tagName}`, body, {
27
+ updateMask: updateMaskPaths.join(","),
28
+ });
29
+ return { content: [{ type: "text", text: JSON.stringify(tag, null, 2) }] };
30
+ });
31
+ };
32
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAiB,EAAE,MAAmB,EAAE,EAAE;IACzE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,sBAAsB,EACtB,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkB,qBAAqB,CAAC,CAAC;QACxE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,4CAA4C,EAC5C,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkB,oBAAoB,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,uCAAuC,EACvC;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACxE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QACnC,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAM,gBAAgB,OAAO,EAAE,EAAE,IAAI,EAAE;YACnE,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACtF,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,81 @@
1
+ export type Visibility = "PRIVATE" | "PROTECTED" | "PUBLIC";
2
+ export type RowStatus = "ACTIVE" | "ARCHIVED";
3
+ export type MemoRelationType = "REFERENCE" | "COMMENT";
4
+ export type ReviewSource = "REVIEW_SOURCE_REVIEW" | "REVIEW_SOURCE_ON_THIS_DAY" | "REVIEW_SOURCE_SURPRISE" | "REVIEW_SOURCE_TIME_TRAVEL";
5
+ export interface Memo {
6
+ name: string;
7
+ uid: string;
8
+ rowStatus: RowStatus;
9
+ creator: string;
10
+ createTime: string;
11
+ updateTime: string;
12
+ displayTime: string;
13
+ content: string;
14
+ visibility: Visibility;
15
+ tags: string[];
16
+ pinned: boolean;
17
+ resources: Resource[];
18
+ relations: MemoRelation[];
19
+ reactions: Reaction[];
20
+ property?: MemoProperty;
21
+ parent?: string;
22
+ snippet?: string;
23
+ location?: Location;
24
+ }
25
+ export interface MemoProperty {
26
+ hasLink: boolean;
27
+ hasTaskList: boolean;
28
+ hasCode: boolean;
29
+ hasIncompleteTasks: boolean;
30
+ }
31
+ export interface Location {
32
+ placeholder: string;
33
+ latitude: number;
34
+ longitude: number;
35
+ }
36
+ export interface Resource {
37
+ name: string;
38
+ uid: string;
39
+ createTime: string;
40
+ filename: string;
41
+ externalLink: string;
42
+ type: string;
43
+ size: string;
44
+ memo?: string;
45
+ }
46
+ export interface MemoRelation {
47
+ memo: string;
48
+ relatedMemo: string;
49
+ type: MemoRelationType;
50
+ }
51
+ export interface Reaction {
52
+ id: number;
53
+ creator: string;
54
+ contentId: string;
55
+ reactionType: string;
56
+ }
57
+ export interface Tag {
58
+ id: number;
59
+ createTime: string;
60
+ updateTime: string;
61
+ creator: string;
62
+ tagHash: string;
63
+ tagName: string;
64
+ emoji: string;
65
+ pinnedTime: string;
66
+ }
67
+ export interface ListResponse<T> {
68
+ [key: string]: T[] | string | undefined;
69
+ nextPageToken?: string;
70
+ }
71
+ export interface OnThisDayGroup {
72
+ year: number;
73
+ memos: Memo[];
74
+ }
75
+ export interface ReviewStats {
76
+ totalMemos: number;
77
+ reviewedLast30Days: number;
78
+ availableForReview: number;
79
+ totalSessions: number;
80
+ }
81
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@chriscurrycc/memos-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Model Context Protocol server for Memos - a self-hosted note-taking service",
5
+ "type": "module",
6
+ "bin": {
7
+ "memos-mcp": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsx src/index.ts",
15
+ "prepublishOnly": "tsc"
16
+ },
17
+ "keywords": [
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "memos",
21
+ "note-taking"
22
+ ],
23
+ "author": "chriscurrycc",
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@modelcontextprotocol/sdk": "^1.12.0",
27
+ "zod": "^4.3.6"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^25.5.0",
31
+ "tsx": "^4.19.0",
32
+ "typescript": "^6.0.2"
33
+ },
34
+ "engines": {
35
+ "node": ">=18.0.0"
36
+ }
37
+ }