@mclawnet/mcp-server 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.
@@ -0,0 +1,137 @@
1
+ import { type EmbeddingService, type MemoryStore } from "@mclawnet/memory";
2
+ export interface MemoryToolContext {
3
+ store: MemoryStore;
4
+ embeddingService: EmbeddingService;
5
+ }
6
+ export declare function getMemoryToolDefinitions(): ({
7
+ name: string;
8
+ description: string;
9
+ inputSchema: {
10
+ type: "object";
11
+ properties: {
12
+ roleId: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ query: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ domain: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ limit: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ crossRole: {
29
+ type: string;
30
+ description: string;
31
+ };
32
+ content?: undefined;
33
+ type?: undefined;
34
+ tags?: undefined;
35
+ importance?: undefined;
36
+ scope?: undefined;
37
+ };
38
+ required: string[];
39
+ };
40
+ } | {
41
+ name: string;
42
+ description: string;
43
+ inputSchema: {
44
+ type: "object";
45
+ properties: {
46
+ roleId: {
47
+ type: string;
48
+ description: string;
49
+ };
50
+ content: {
51
+ type: string;
52
+ description: string;
53
+ };
54
+ type: {
55
+ type: string;
56
+ enum: string[];
57
+ description: string;
58
+ };
59
+ tags: {
60
+ type: string;
61
+ items: {
62
+ type: string;
63
+ };
64
+ description: string;
65
+ };
66
+ domain: {
67
+ type: string;
68
+ description: string;
69
+ };
70
+ importance: {
71
+ type: string;
72
+ description: string;
73
+ };
74
+ query?: undefined;
75
+ limit?: undefined;
76
+ crossRole?: undefined;
77
+ scope?: undefined;
78
+ };
79
+ required: string[];
80
+ };
81
+ } | {
82
+ name: string;
83
+ description: string;
84
+ inputSchema: {
85
+ type: "object";
86
+ properties: {
87
+ roleId: {
88
+ type: string;
89
+ description: string;
90
+ };
91
+ query?: undefined;
92
+ domain?: undefined;
93
+ limit?: undefined;
94
+ crossRole?: undefined;
95
+ content?: undefined;
96
+ type?: undefined;
97
+ tags?: undefined;
98
+ importance?: undefined;
99
+ scope?: undefined;
100
+ };
101
+ required: string[];
102
+ };
103
+ } | {
104
+ name: string;
105
+ description: string;
106
+ inputSchema: {
107
+ type: "object";
108
+ properties: {
109
+ roleId: {
110
+ type: string;
111
+ description: string;
112
+ };
113
+ scope: {
114
+ type: string;
115
+ enum: string[];
116
+ description: string;
117
+ };
118
+ query?: undefined;
119
+ domain?: undefined;
120
+ limit?: undefined;
121
+ crossRole?: undefined;
122
+ content?: undefined;
123
+ type?: undefined;
124
+ tags?: undefined;
125
+ importance?: undefined;
126
+ };
127
+ required: string[];
128
+ };
129
+ })[];
130
+ export declare function handleMemoryToolCall(name: string, args: Record<string, unknown>, context: MemoryToolContext): Promise<{
131
+ content: Array<{
132
+ type: "text";
133
+ text: string;
134
+ }>;
135
+ isError?: boolean;
136
+ }>;
137
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAI1B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAgB,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4EvC;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA2BhF"}
@@ -0,0 +1,221 @@
1
+ import { createLogger } from "@mclawnet/logger";
2
+ import { EWCGuard, pruneMemories, recalculateAllImportance, storeWithFusion, } from "@mclawnet/memory";
3
+ const log = createLogger({ module: "mcp-server/tools/memory" });
4
+ export function getMemoryToolDefinitions() {
5
+ return [
6
+ {
7
+ name: "memory_search",
8
+ description: "Search role memories by semantic similarity. Returns the most relevant past experiences, patterns, and lessons.",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ roleId: { type: "string", description: "Role ID for memory scope" },
13
+ query: { type: "string", description: "Natural language search query" },
14
+ domain: { type: "string", description: "Filter by domain label" },
15
+ limit: { type: "number", description: "Max results to return (default 5)" },
16
+ crossRole: { type: "boolean", description: "Search across all roles (ignore roleId filter)" },
17
+ },
18
+ required: ["roleId", "query"],
19
+ },
20
+ },
21
+ {
22
+ name: "memory_store",
23
+ description: "Store a new memory entry for the specified role. Use this to persist valuable experiences, patterns, error lessons, or preferences.",
24
+ inputSchema: {
25
+ type: "object",
26
+ properties: {
27
+ roleId: { type: "string", description: "Role ID for memory scope" },
28
+ content: { type: "string", description: "Memory content in natural language" },
29
+ type: {
30
+ type: "string",
31
+ enum: ["experience", "pattern", "error", "preference"],
32
+ description: "Type of memory",
33
+ },
34
+ tags: {
35
+ type: "array",
36
+ items: { type: "string" },
37
+ description: "Tags for categorisation",
38
+ },
39
+ domain: { type: "string", description: "Domain label (e.g. 'frontend', 'backend')" },
40
+ importance: {
41
+ type: "number",
42
+ description: "Importance score 0-1 (default 0.5)",
43
+ },
44
+ },
45
+ required: ["roleId", "content", "type"],
46
+ },
47
+ },
48
+ {
49
+ name: "memory_stats",
50
+ description: "Get memory statistics for the specified role: total count, breakdown by type/level, top domains.",
51
+ inputSchema: {
52
+ type: "object",
53
+ properties: {
54
+ roleId: { type: "string", description: "Role ID for memory scope" },
55
+ },
56
+ required: ["roleId"],
57
+ },
58
+ },
59
+ {
60
+ name: "memory_reflect",
61
+ description: "Trigger a reflection pass over recent memories to consolidate patterns and prune low-value entries.",
62
+ inputSchema: {
63
+ type: "object",
64
+ properties: {
65
+ roleId: { type: "string", description: "Role ID for memory scope" },
66
+ scope: {
67
+ type: "string",
68
+ enum: ["light", "full"],
69
+ description: "Reflection depth: light (quick) or full (thorough)",
70
+ },
71
+ },
72
+ required: ["roleId"],
73
+ },
74
+ },
75
+ ];
76
+ }
77
+ export async function handleMemoryToolCall(name, args, context) {
78
+ try {
79
+ const roleId = args.roleId;
80
+ log.info({ tool: name, roleId }, "MCP tool called");
81
+ switch (name) {
82
+ case "memory_search":
83
+ return await handleMemorySearch(args, context);
84
+ case "memory_store":
85
+ return await handleMemoryStore(args, context);
86
+ case "memory_stats":
87
+ return await handleMemoryStats(args, context);
88
+ case "memory_reflect":
89
+ return await handleMemoryReflect(args, context);
90
+ default:
91
+ return {
92
+ content: [{ type: "text", text: JSON.stringify({ error: `Unknown tool: ${name}` }) }],
93
+ isError: true,
94
+ };
95
+ }
96
+ }
97
+ catch (err) {
98
+ const message = err instanceof Error ? err.message : String(err);
99
+ log.error({ tool: name, err }, "MCP tool error");
100
+ return {
101
+ content: [{ type: "text", text: JSON.stringify({ error: message }) }],
102
+ isError: true,
103
+ };
104
+ }
105
+ }
106
+ async function handleMemorySearch(args, context) {
107
+ const query = args.query;
108
+ const crossRole = args.crossRole;
109
+ const roleId = crossRole ? undefined : args.roleId;
110
+ const domain = args.domain;
111
+ const limit = args.limit ?? 5;
112
+ const queryEmbedding = await context.embeddingService.embed(query);
113
+ const results = context.store.searchMemories(queryEmbedding, {
114
+ roleId,
115
+ domain,
116
+ limit,
117
+ crossRole,
118
+ });
119
+ const serialisable = results.map((m) => ({
120
+ id: m.id,
121
+ roleId: m.roleId,
122
+ content: m.content,
123
+ type: m.type,
124
+ level: m.level,
125
+ tags: m.tags,
126
+ domain: m.domain,
127
+ importance: m.importance,
128
+ accessCount: m.accessCount,
129
+ createdAt: m.createdAt,
130
+ }));
131
+ log.info({ query, roleId: args.roleId, crossRole, resultCount: serialisable.length }, "memory_search completed");
132
+ return {
133
+ content: [{ type: "text", text: JSON.stringify(serialisable, null, 2) }],
134
+ };
135
+ }
136
+ async function handleMemoryStore(args, context) {
137
+ const roleId = args.roleId;
138
+ const content = args.content;
139
+ const type = args.type;
140
+ const tags = args.tags ?? [];
141
+ const domain = args.domain;
142
+ const importance = args.importance;
143
+ const result = await storeWithFusion(context.store, context.embeddingService, {
144
+ roleId,
145
+ content,
146
+ type,
147
+ level: "long-term",
148
+ tags,
149
+ domain,
150
+ importance,
151
+ });
152
+ log.info({ id: result.memory.id, roleId, type, domain, importance, fusionAction: result.fusionAction }, "memory_store completed");
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: JSON.stringify({
158
+ success: true,
159
+ id: result.memory.id,
160
+ fusionAction: result.fusionAction,
161
+ }),
162
+ },
163
+ ],
164
+ };
165
+ }
166
+ async function handleMemoryStats(args, context) {
167
+ const roleId = args.roleId;
168
+ const stats = context.store.getStats(roleId);
169
+ return {
170
+ content: [{ type: "text", text: JSON.stringify(stats, null, 2) }],
171
+ };
172
+ }
173
+ async function handleMemoryReflect(args, context) {
174
+ const roleId = args.roleId;
175
+ const scope = args.scope ?? "light";
176
+ const db = context.store.getDb();
177
+ const vectorIndex = context.store.getVectorIndex();
178
+ if (scope === "light") {
179
+ const pruneResult = pruneMemories(roleId, db, vectorIndex);
180
+ log.info({ roleId, scope, ...pruneResult }, "memory_reflect completed");
181
+ return {
182
+ content: [{ type: "text", text: JSON.stringify({ scope, ...pruneResult }) }],
183
+ };
184
+ }
185
+ // scope === "full": re-embed if needed + recalculate all + prune all roles
186
+ const reembedResult = await context.store.reembedAll(context.embeddingService);
187
+ const recalculated = recalculateAllImportance(db);
188
+ const roleIds = db.prepare("SELECT DISTINCT role_id FROM memories").all().map((r) => r.role_id);
189
+ let totalDemotedToLongTerm = 0;
190
+ let totalDemotedToArchived = 0;
191
+ let totalDeleted = 0;
192
+ for (const rid of roleIds) {
193
+ const r = pruneMemories(rid, db, vectorIndex);
194
+ totalDemotedToLongTerm += r.demotedToLongTerm;
195
+ totalDemotedToArchived += r.demotedToArchived;
196
+ totalDeleted += r.deleted;
197
+ }
198
+ const ewcGuard = new EWCGuard(db);
199
+ let profilesRefreshed = 0;
200
+ for (const rid of roleIds) {
201
+ const profile = ewcGuard.computeProfile(rid);
202
+ if (profile)
203
+ profilesRefreshed++;
204
+ }
205
+ const result = {
206
+ scope,
207
+ reembedded: reembedResult.updated,
208
+ reembedFailed: reembedResult.failed,
209
+ recalculated,
210
+ rolesProcessed: roleIds.length,
211
+ demotedToLongTerm: totalDemotedToLongTerm,
212
+ demotedToArchived: totalDemotedToArchived,
213
+ deleted: totalDeleted,
214
+ profilesRefreshed,
215
+ };
216
+ log.info(result, "memory_reflect completed");
217
+ return {
218
+ content: [{ type: "text", text: JSON.stringify(result) }],
219
+ };
220
+ }
221
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { SkillStore } from "@mclawnet/skill-manager";
2
+ export interface SkillToolContext {
3
+ store: SkillStore;
4
+ }
5
+ export declare function getSkillToolDefinitions(): ({
6
+ name: string;
7
+ description: string;
8
+ inputSchema: {
9
+ type: "object";
10
+ properties: {
11
+ name?: undefined;
12
+ };
13
+ required?: undefined;
14
+ };
15
+ } | {
16
+ name: string;
17
+ description: string;
18
+ inputSchema: {
19
+ type: "object";
20
+ properties: {
21
+ name: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ };
26
+ required: string[];
27
+ };
28
+ })[];
29
+ export declare function handleSkillToolCall(name: string, args: Record<string, unknown>, context: SkillToolContext): Promise<{
30
+ content: Array<{
31
+ type: "text";
32
+ text: string;
33
+ }>;
34
+ isError?: boolean;
35
+ }>;
36
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;KAsBtC;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAyChF"}
@@ -0,0 +1,69 @@
1
+ import { createLogger } from "@mclawnet/logger";
2
+ const logger = createLogger({ module: "mcp-server/tools/skill" });
3
+ export function getSkillToolDefinitions() {
4
+ return [
5
+ {
6
+ name: "skill_list",
7
+ description: "列出所有已安装的技能(skill)。用于了解当前可用的专业能力。",
8
+ inputSchema: {
9
+ type: "object",
10
+ properties: {},
11
+ },
12
+ },
13
+ {
14
+ name: "skill_read",
15
+ description: "读取指定技能的完整内容。",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ name: { type: "string", description: "技能名称(kebab-case)" },
20
+ },
21
+ required: ["name"],
22
+ },
23
+ },
24
+ ];
25
+ }
26
+ export async function handleSkillToolCall(name, args, context) {
27
+ try {
28
+ switch (name) {
29
+ case "skill_list": {
30
+ const skills = context.store.scan();
31
+ return {
32
+ content: [
33
+ { type: "text", text: JSON.stringify({ skills, total: skills.length }) },
34
+ ],
35
+ };
36
+ }
37
+ case "skill_read": {
38
+ const skillName = args.name;
39
+ if (!skillName) {
40
+ return {
41
+ content: [{ type: "text", text: JSON.stringify({ error: "Missing 'name' argument" }) }],
42
+ isError: true,
43
+ };
44
+ }
45
+ const content = context.store.readSkill(skillName);
46
+ if (!content) {
47
+ return {
48
+ content: [{ type: "text", text: JSON.stringify({ error: `Skill "${skillName}" not found` }) }],
49
+ isError: true,
50
+ };
51
+ }
52
+ return { content: [{ type: "text", text: content }] };
53
+ }
54
+ default:
55
+ return {
56
+ content: [{ type: "text", text: JSON.stringify({ error: `Unknown skill tool: ${name}` }) }],
57
+ isError: true,
58
+ };
59
+ }
60
+ }
61
+ catch (err) {
62
+ logger.error({ err, tool: name }, "Skill tool error");
63
+ return {
64
+ content: [{ type: "text", text: JSON.stringify({ error: String(err) }) }],
65
+ isError: true,
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@mclawnet/mcp-server",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "import": "./dist/index.js",
8
+ "types": "./dist/index.d.ts"
9
+ },
10
+ "./package.json": "./package.json"
11
+ },
12
+ "bin": {
13
+ "clawnet-mcp": "dist/server.js"
14
+ },
15
+ "dependencies": {
16
+ "@modelcontextprotocol/sdk": "^1.27.1",
17
+ "@mclawnet/logger": "0.1.2",
18
+ "@mclawnet/skill-manager": "0.1.0",
19
+ "@mclawnet/memory": "0.1.1"
20
+ },
21
+ "devDependencies": {
22
+ "@types/better-sqlite3": "^7",
23
+ "@types/node": "^22.0.0",
24
+ "better-sqlite3": "^11.0.0",
25
+ "typescript": "^5.8.0",
26
+ "vitest": "^4.0.18"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "clean": "rm -rf dist",
31
+ "test": "vitest run"
32
+ }
33
+ }