thread-mcp 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 (63) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +497 -0
  3. package/dist/formatters/index.d.ts +5 -0
  4. package/dist/formatters/index.d.ts.map +1 -0
  5. package/dist/formatters/index.js +12 -0
  6. package/dist/formatters/index.js.map +1 -0
  7. package/dist/formatters/json.d.ts +3 -0
  8. package/dist/formatters/json.d.ts.map +1 -0
  9. package/dist/formatters/json.js +25 -0
  10. package/dist/formatters/json.js.map +1 -0
  11. package/dist/formatters/markdown.d.ts +3 -0
  12. package/dist/formatters/markdown.d.ts.map +1 -0
  13. package/dist/formatters/markdown.js +134 -0
  14. package/dist/formatters/markdown.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/server.d.ts +4 -0
  20. package/dist/server.d.ts.map +1 -0
  21. package/dist/server.js +175 -0
  22. package/dist/server.js.map +1 -0
  23. package/dist/storage/index.d.ts +3 -0
  24. package/dist/storage/index.d.ts.map +1 -0
  25. package/dist/storage/index.js +3 -0
  26. package/dist/storage/index.js.map +1 -0
  27. package/dist/storage/local.d.ts +23 -0
  28. package/dist/storage/local.d.ts.map +1 -0
  29. package/dist/storage/local.js +126 -0
  30. package/dist/storage/local.js.map +1 -0
  31. package/dist/storage/remote.d.ts +15 -0
  32. package/dist/storage/remote.d.ts.map +1 -0
  33. package/dist/storage/remote.js +91 -0
  34. package/dist/storage/remote.js.map +1 -0
  35. package/dist/tools/delete-thread.d.ts +71 -0
  36. package/dist/tools/delete-thread.d.ts.map +1 -0
  37. package/dist/tools/delete-thread.js +74 -0
  38. package/dist/tools/delete-thread.js.map +1 -0
  39. package/dist/tools/find-threads.d.ts +175 -0
  40. package/dist/tools/find-threads.d.ts.map +1 -0
  41. package/dist/tools/find-threads.js +265 -0
  42. package/dist/tools/find-threads.js.map +1 -0
  43. package/dist/tools/index.d.ts +270 -0
  44. package/dist/tools/index.d.ts.map +1 -0
  45. package/dist/tools/index.js +18 -0
  46. package/dist/tools/index.js.map +1 -0
  47. package/dist/tools/resume-thread.d.ts +138 -0
  48. package/dist/tools/resume-thread.d.ts.map +1 -0
  49. package/dist/tools/resume-thread.js +191 -0
  50. package/dist/tools/resume-thread.js.map +1 -0
  51. package/dist/tools/save-thread.d.ts +155 -0
  52. package/dist/tools/save-thread.d.ts.map +1 -0
  53. package/dist/tools/save-thread.js +116 -0
  54. package/dist/tools/save-thread.js.map +1 -0
  55. package/dist/tools/update-thread.d.ts +180 -0
  56. package/dist/tools/update-thread.d.ts.map +1 -0
  57. package/dist/tools/update-thread.js +159 -0
  58. package/dist/tools/update-thread.js.map +1 -0
  59. package/dist/types.d.ts +177 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +41 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +67 -0
@@ -0,0 +1,177 @@
1
+ import { z } from "zod";
2
+ export declare const MessageRoleSchema: z.ZodEnum<["user", "assistant", "system"]>;
3
+ export type MessageRole = z.infer<typeof MessageRoleSchema>;
4
+ export declare const MessageSchema: z.ZodObject<{
5
+ role: z.ZodEnum<["user", "assistant", "system"]>;
6
+ content: z.ZodString;
7
+ timestamp: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ role: "user" | "assistant" | "system";
10
+ content: string;
11
+ timestamp?: string | undefined;
12
+ }, {
13
+ role: "user" | "assistant" | "system";
14
+ content: string;
15
+ timestamp?: string | undefined;
16
+ }>;
17
+ export type Message = z.infer<typeof MessageSchema>;
18
+ export declare const ConversationMetadataSchema: z.ZodObject<{
19
+ title: z.ZodString;
20
+ sourceApp: z.ZodOptional<z.ZodString>;
21
+ createdAt: z.ZodString;
22
+ updatedAt: z.ZodOptional<z.ZodString>;
23
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
24
+ summary: z.ZodOptional<z.ZodString>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ title: string;
27
+ createdAt: string;
28
+ sourceApp?: string | undefined;
29
+ updatedAt?: string | undefined;
30
+ tags?: string[] | undefined;
31
+ summary?: string | undefined;
32
+ }, {
33
+ title: string;
34
+ createdAt: string;
35
+ sourceApp?: string | undefined;
36
+ updatedAt?: string | undefined;
37
+ tags?: string[] | undefined;
38
+ summary?: string | undefined;
39
+ }>;
40
+ export type ConversationMetadata = z.infer<typeof ConversationMetadataSchema>;
41
+ export declare const ConversationSchema: z.ZodObject<{
42
+ id: z.ZodString;
43
+ metadata: z.ZodObject<{
44
+ title: z.ZodString;
45
+ sourceApp: z.ZodOptional<z.ZodString>;
46
+ createdAt: z.ZodString;
47
+ updatedAt: z.ZodOptional<z.ZodString>;
48
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
49
+ summary: z.ZodOptional<z.ZodString>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ title: string;
52
+ createdAt: string;
53
+ sourceApp?: string | undefined;
54
+ updatedAt?: string | undefined;
55
+ tags?: string[] | undefined;
56
+ summary?: string | undefined;
57
+ }, {
58
+ title: string;
59
+ createdAt: string;
60
+ sourceApp?: string | undefined;
61
+ updatedAt?: string | undefined;
62
+ tags?: string[] | undefined;
63
+ summary?: string | undefined;
64
+ }>;
65
+ messages: z.ZodArray<z.ZodObject<{
66
+ role: z.ZodEnum<["user", "assistant", "system"]>;
67
+ content: z.ZodString;
68
+ timestamp: z.ZodOptional<z.ZodString>;
69
+ }, "strip", z.ZodTypeAny, {
70
+ role: "user" | "assistant" | "system";
71
+ content: string;
72
+ timestamp?: string | undefined;
73
+ }, {
74
+ role: "user" | "assistant" | "system";
75
+ content: string;
76
+ timestamp?: string | undefined;
77
+ }>, "many">;
78
+ }, "strip", z.ZodTypeAny, {
79
+ id: string;
80
+ metadata: {
81
+ title: string;
82
+ createdAt: string;
83
+ sourceApp?: string | undefined;
84
+ updatedAt?: string | undefined;
85
+ tags?: string[] | undefined;
86
+ summary?: string | undefined;
87
+ };
88
+ messages: {
89
+ role: "user" | "assistant" | "system";
90
+ content: string;
91
+ timestamp?: string | undefined;
92
+ }[];
93
+ }, {
94
+ id: string;
95
+ metadata: {
96
+ title: string;
97
+ createdAt: string;
98
+ sourceApp?: string | undefined;
99
+ updatedAt?: string | undefined;
100
+ tags?: string[] | undefined;
101
+ summary?: string | undefined;
102
+ };
103
+ messages: {
104
+ role: "user" | "assistant" | "system";
105
+ content: string;
106
+ timestamp?: string | undefined;
107
+ }[];
108
+ }>;
109
+ export type Conversation = z.infer<typeof ConversationSchema>;
110
+ export declare const OutputFormatSchema: z.ZodEnum<["markdown", "json"]>;
111
+ export type OutputFormat = z.infer<typeof OutputFormatSchema>;
112
+ export declare const SaveOptionsSchema: z.ZodObject<{
113
+ format: z.ZodDefault<z.ZodEnum<["markdown", "json"]>>;
114
+ includeMetadata: z.ZodDefault<z.ZodBoolean>;
115
+ includeTimestamps: z.ZodDefault<z.ZodBoolean>;
116
+ }, "strip", z.ZodTypeAny, {
117
+ format: "markdown" | "json";
118
+ includeMetadata: boolean;
119
+ includeTimestamps: boolean;
120
+ }, {
121
+ format?: "markdown" | "json" | undefined;
122
+ includeMetadata?: boolean | undefined;
123
+ includeTimestamps?: boolean | undefined;
124
+ }>;
125
+ export type SaveOptions = z.infer<typeof SaveOptionsSchema>;
126
+ export declare const RemoteConfigSchema: z.ZodObject<{
127
+ url: z.ZodString;
128
+ apiKey: z.ZodOptional<z.ZodString>;
129
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
130
+ }, "strip", z.ZodTypeAny, {
131
+ url: string;
132
+ apiKey?: string | undefined;
133
+ headers?: Record<string, string> | undefined;
134
+ }, {
135
+ url: string;
136
+ apiKey?: string | undefined;
137
+ headers?: Record<string, string> | undefined;
138
+ }>;
139
+ export type RemoteConfig = z.infer<typeof RemoteConfigSchema>;
140
+ export declare const SavedConversationInfoSchema: z.ZodObject<{
141
+ id: z.ZodString;
142
+ title: z.ZodString;
143
+ filePath: z.ZodOptional<z.ZodString>;
144
+ remoteUrl: z.ZodOptional<z.ZodString>;
145
+ format: z.ZodEnum<["markdown", "json"]>;
146
+ savedAt: z.ZodString;
147
+ sourceApp: z.ZodOptional<z.ZodString>;
148
+ }, "strip", z.ZodTypeAny, {
149
+ title: string;
150
+ id: string;
151
+ format: "markdown" | "json";
152
+ savedAt: string;
153
+ sourceApp?: string | undefined;
154
+ filePath?: string | undefined;
155
+ remoteUrl?: string | undefined;
156
+ }, {
157
+ title: string;
158
+ id: string;
159
+ format: "markdown" | "json";
160
+ savedAt: string;
161
+ sourceApp?: string | undefined;
162
+ filePath?: string | undefined;
163
+ remoteUrl?: string | undefined;
164
+ }>;
165
+ export type SavedConversationInfo = z.infer<typeof SavedConversationInfoSchema>;
166
+ export interface StorageProvider {
167
+ save(conversation: Conversation, options: SaveOptions): Promise<SavedConversationInfo>;
168
+ list(): Promise<SavedConversationInfo[]>;
169
+ get(id: string): Promise<Conversation | null>;
170
+ delete(id: string): Promise<boolean>;
171
+ }
172
+ export interface Formatter {
173
+ format(conversation: Conversation, options: SaveOptions): string;
174
+ parse(content: string): Conversation;
175
+ extension: string;
176
+ }
177
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB,4CAA0C,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,aAAa;;;;;;;;;;;;EAIxB,CAAC;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;EAOrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,kBAAkB,iCAA+B,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;EAQtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,IAAI,CACF,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC;IACjE,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ export const MessageRoleSchema = z.enum(["user", "assistant", "system"]);
3
+ export const MessageSchema = z.object({
4
+ role: MessageRoleSchema,
5
+ content: z.string(),
6
+ timestamp: z.string().datetime().optional(),
7
+ });
8
+ export const ConversationMetadataSchema = z.object({
9
+ title: z.string(),
10
+ sourceApp: z.string().optional(),
11
+ createdAt: z.string().datetime(),
12
+ updatedAt: z.string().datetime().optional(),
13
+ tags: z.array(z.string()).optional(),
14
+ summary: z.string().optional(),
15
+ });
16
+ export const ConversationSchema = z.object({
17
+ id: z.string(),
18
+ metadata: ConversationMetadataSchema,
19
+ messages: z.array(MessageSchema),
20
+ });
21
+ export const OutputFormatSchema = z.enum(["markdown", "json"]);
22
+ export const SaveOptionsSchema = z.object({
23
+ format: OutputFormatSchema.default("markdown"),
24
+ includeMetadata: z.boolean().default(true),
25
+ includeTimestamps: z.boolean().default(true),
26
+ });
27
+ export const RemoteConfigSchema = z.object({
28
+ url: z.string().url(),
29
+ apiKey: z.string().optional(),
30
+ headers: z.record(z.string()).optional(),
31
+ });
32
+ export const SavedConversationInfoSchema = z.object({
33
+ id: z.string(),
34
+ title: z.string(),
35
+ filePath: z.string().optional(),
36
+ remoteUrl: z.string().optional(),
37
+ format: OutputFormatSchema,
38
+ savedAt: z.string().datetime(),
39
+ sourceApp: z.string().optional(),
40
+ });
41
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAGzE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,0BAA0B;IACpC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;CACjC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAG/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC;IAC9C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1C,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC7C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,kBAAkB;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "thread-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for saving AI conversation threads to local files or remote servers",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "thread-mcp": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/yugui923/thread-mcp.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/yugui923/thread-mcp/issues"
22
+ },
23
+ "homepage": "https://github.com/yugui923/thread-mcp#readme",
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "start": "node dist/index.js",
27
+ "dev": "tsx src/index.ts",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "test:coverage": "vitest run --coverage",
31
+ "lint": "eslint src tests",
32
+ "format": "prettier --write .",
33
+ "format:check": "prettier --check .",
34
+ "typecheck": "tsc --noEmit",
35
+ "clean": "rm -rf dist",
36
+ "prepublishOnly": "npm run build"
37
+ },
38
+ "keywords": [
39
+ "mcp",
40
+ "model-context-protocol",
41
+ "ai",
42
+ "conversation",
43
+ "thread",
44
+ "claude",
45
+ "llm"
46
+ ],
47
+ "author": "",
48
+ "license": "MIT",
49
+ "engines": {
50
+ "node": ">=22.0.0"
51
+ },
52
+ "dependencies": {
53
+ "@modelcontextprotocol/sdk": "^1.0.0",
54
+ "zod": "^3.24.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^22.0.0",
58
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
59
+ "@typescript-eslint/parser": "^8.0.0",
60
+ "@vitest/coverage-v8": "^2.0.0",
61
+ "eslint": "^9.0.0",
62
+ "prettier": "^3.4.0",
63
+ "tsx": "^4.19.0",
64
+ "typescript": "^5.7.0",
65
+ "vitest": "^2.0.0"
66
+ }
67
+ }