@aeriondyseti/vector-memory-mcp 0.9.0-dev.2 → 0.9.0-dev.4
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.
- package/README.md +21 -1
- package/dist/scripts/publish.d.ts +13 -0
- package/dist/scripts/publish.d.ts.map +1 -0
- package/dist/scripts/publish.js +56 -0
- package/dist/scripts/publish.js.map +1 -0
- package/dist/scripts/test-runner.d.ts +9 -0
- package/dist/scripts/test-runner.d.ts.map +1 -0
- package/dist/scripts/test-runner.js +61 -0
- package/dist/scripts/test-runner.js.map +1 -0
- package/dist/scripts/warmup.d.ts +8 -0
- package/dist/scripts/warmup.d.ts.map +1 -0
- package/dist/scripts/warmup.js +61 -0
- package/dist/scripts/warmup.js.map +1 -0
- package/dist/src/config/index.d.ts +23 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +46 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/db/connection.d.ts +3 -0
- package/dist/src/db/connection.d.ts.map +1 -0
- package/dist/src/db/connection.js +10 -0
- package/dist/src/db/connection.js.map +1 -0
- package/dist/src/db/memory.repository.d.ts +13 -0
- package/dist/src/db/memory.repository.d.ts.map +1 -0
- package/dist/src/db/memory.repository.js +97 -0
- package/dist/src/db/memory.repository.js.map +1 -0
- package/dist/src/db/schema.d.ts +4 -0
- package/dist/src/db/schema.d.ts.map +1 -0
- package/dist/src/db/schema.js +12 -0
- package/dist/src/db/schema.js.map +1 -0
- package/dist/src/http/mcp-transport.d.ts +19 -0
- package/dist/src/http/mcp-transport.d.ts.map +1 -0
- package/dist/src/http/mcp-transport.js +191 -0
- package/dist/src/http/mcp-transport.js.map +1 -0
- package/dist/src/http/server.d.ts +12 -0
- package/dist/src/http/server.d.ts.map +1 -0
- package/dist/src/http/server.js +168 -0
- package/dist/src/http/server.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +59 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/handlers.d.ts +11 -0
- package/dist/src/mcp/handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers.js +175 -0
- package/dist/src/mcp/handlers.js.map +1 -0
- package/dist/src/mcp/server.d.ts +5 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +22 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools.d.ts +9 -0
- package/dist/src/mcp/tools.d.ts.map +1 -0
- package/dist/src/mcp/tools.js +243 -0
- package/dist/src/mcp/tools.js.map +1 -0
- package/dist/src/services/embeddings.service.d.ts +12 -0
- package/dist/src/services/embeddings.service.d.ts.map +1 -0
- package/dist/src/services/embeddings.service.js +37 -0
- package/dist/src/services/embeddings.service.js.map +1 -0
- package/dist/src/services/memory.service.d.ts +31 -0
- package/dist/src/services/memory.service.d.ts.map +1 -0
- package/dist/src/services/memory.service.js +131 -0
- package/dist/src/services/memory.service.js.map +1 -0
- package/dist/src/types/memory.d.ts +17 -0
- package/dist/src/types/memory.d.ts.map +1 -0
- package/dist/src/types/memory.js +15 -0
- package/dist/src/types/memory.js.map +1 -0
- package/package.json +14 -10
- package/src/config/index.ts +0 -75
- package/src/db/connection.ts +0 -11
- package/src/db/memory.repository.ts +0 -115
- package/src/db/schema.ts +0 -34
- package/src/http/mcp-transport.ts +0 -255
- package/src/http/server.ts +0 -190
- package/src/index.ts +0 -70
- package/src/mcp/handlers.ts +0 -248
- package/src/mcp/server.ts +0 -34
- package/src/mcp/tools.ts +0 -254
- package/src/services/embeddings.service.ts +0 -48
- package/src/services/memory.service.ts +0 -185
- package/src/types/memory.ts +0 -31
package/src/http/server.ts
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { Hono } from "hono";
|
|
2
|
-
import { cors } from "hono/cors";
|
|
3
|
-
import type { MemoryService } from "../services/memory.service.js";
|
|
4
|
-
import type { Config } from "../config/index.js";
|
|
5
|
-
import { isDeleted } from "../types/memory.js";
|
|
6
|
-
import { createMcpRoutes } from "./mcp-transport.js";
|
|
7
|
-
import type { Memory } from "../types/memory.js";
|
|
8
|
-
|
|
9
|
-
export interface HttpServerOptions {
|
|
10
|
-
memoryService: MemoryService;
|
|
11
|
-
config: Config;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// Track server start time for uptime calculation
|
|
15
|
-
const startedAt = Date.now();
|
|
16
|
-
|
|
17
|
-
export function createHttpApp(memoryService: MemoryService, config: Config): Hono {
|
|
18
|
-
const app = new Hono();
|
|
19
|
-
|
|
20
|
-
// Enable CORS for local development
|
|
21
|
-
app.use("/*", cors());
|
|
22
|
-
|
|
23
|
-
// Mount MCP routes for StreamableHTTP transport
|
|
24
|
-
const mcpApp = createMcpRoutes(memoryService);
|
|
25
|
-
app.route("/", mcpApp);
|
|
26
|
-
|
|
27
|
-
// Health check endpoint with config info
|
|
28
|
-
app.get("/health", (c) => {
|
|
29
|
-
return c.json({
|
|
30
|
-
status: "ok",
|
|
31
|
-
timestamp: new Date().toISOString(),
|
|
32
|
-
pid: process.pid,
|
|
33
|
-
uptime: Math.floor((Date.now() - startedAt) / 1000),
|
|
34
|
-
config: {
|
|
35
|
-
dbPath: config.dbPath,
|
|
36
|
-
embeddingModel: config.embeddingModel,
|
|
37
|
-
embeddingDimension: config.embeddingDimension,
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// Search endpoint
|
|
43
|
-
app.post("/search", async (c) => {
|
|
44
|
-
try {
|
|
45
|
-
const body = await c.req.json();
|
|
46
|
-
const query = body.query;
|
|
47
|
-
const limit = body.limit ?? 10;
|
|
48
|
-
|
|
49
|
-
if (!query || typeof query !== "string") {
|
|
50
|
-
return c.json({ error: "Missing or invalid 'query' field" }, 400);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const memories = await memoryService.search(query, limit);
|
|
54
|
-
|
|
55
|
-
return c.json({
|
|
56
|
-
memories: memories.map((m) => ({
|
|
57
|
-
id: m.id,
|
|
58
|
-
content: m.content,
|
|
59
|
-
metadata: m.metadata,
|
|
60
|
-
createdAt: m.createdAt.toISOString(),
|
|
61
|
-
})),
|
|
62
|
-
count: memories.length,
|
|
63
|
-
});
|
|
64
|
-
} catch (error) {
|
|
65
|
-
const message = error instanceof Error ? error.message : "Unknown error";
|
|
66
|
-
return c.json({ error: message }, 500);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Store endpoint
|
|
71
|
-
app.post("/store", async (c) => {
|
|
72
|
-
try {
|
|
73
|
-
const body = await c.req.json();
|
|
74
|
-
const { content, metadata, embeddingText } = body;
|
|
75
|
-
|
|
76
|
-
if (!content || typeof content !== "string") {
|
|
77
|
-
return c.json({ error: "Missing or invalid 'content' field" }, 400);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const memory = await memoryService.store(
|
|
81
|
-
content,
|
|
82
|
-
metadata ?? {},
|
|
83
|
-
embeddingText
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
return c.json({
|
|
87
|
-
id: memory.id,
|
|
88
|
-
createdAt: memory.createdAt.toISOString(),
|
|
89
|
-
});
|
|
90
|
-
} catch (error) {
|
|
91
|
-
const message = error instanceof Error ? error.message : "Unknown error";
|
|
92
|
-
return c.json({ error: message }, 500);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
// Delete endpoint
|
|
97
|
-
app.delete("/memories/:id", async (c) => {
|
|
98
|
-
try {
|
|
99
|
-
const id = c.req.param("id");
|
|
100
|
-
const deleted = await memoryService.delete(id);
|
|
101
|
-
|
|
102
|
-
if (!deleted) {
|
|
103
|
-
return c.json({ error: "Memory not found" }, 404);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return c.json({ deleted: true });
|
|
107
|
-
} catch (error) {
|
|
108
|
-
const message = error instanceof Error ? error.message : "Unknown error";
|
|
109
|
-
return c.json({ error: message }, 500);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Get latest handoff
|
|
114
|
-
app.get("/handoff", async (c) => {
|
|
115
|
-
try {
|
|
116
|
-
const handoff = await memoryService.getLatestHandoff();
|
|
117
|
-
|
|
118
|
-
if (!handoff) {
|
|
119
|
-
return c.json({ error: "No handoff found" }, 404);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Fetch referenced memories if any
|
|
123
|
-
const memoryIds = (handoff.metadata.memory_ids as string[] | undefined) ?? [];
|
|
124
|
-
const referencedMemories: Array<{ id: string; content: string }> = [];
|
|
125
|
-
|
|
126
|
-
for (const id of memoryIds) {
|
|
127
|
-
const memory = await memoryService.get(id);
|
|
128
|
-
if (memory && !isDeleted(memory)) {
|
|
129
|
-
referencedMemories.push({ id: memory.id, content: memory.content });
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return c.json({
|
|
134
|
-
content: handoff.content,
|
|
135
|
-
metadata: handoff.metadata,
|
|
136
|
-
referencedMemories,
|
|
137
|
-
updatedAt: handoff.updatedAt.toISOString(),
|
|
138
|
-
});
|
|
139
|
-
} catch (error) {
|
|
140
|
-
const message = error instanceof Error ? error.message : "Unknown error";
|
|
141
|
-
return c.json({ error: message }, 500);
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
// Get single memory
|
|
146
|
-
app.get("/memories/:id", async (c) => {
|
|
147
|
-
try {
|
|
148
|
-
const id = c.req.param("id");
|
|
149
|
-
const memory = await memoryService.get(id);
|
|
150
|
-
|
|
151
|
-
if (!memory || isDeleted(memory)) {
|
|
152
|
-
return c.json({ error: "Memory not found" }, 404);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return c.json({
|
|
156
|
-
id: memory.id,
|
|
157
|
-
content: memory.content,
|
|
158
|
-
metadata: memory.metadata,
|
|
159
|
-
createdAt: memory.createdAt.toISOString(),
|
|
160
|
-
updatedAt: memory.updatedAt.toISOString(),
|
|
161
|
-
});
|
|
162
|
-
} catch (error) {
|
|
163
|
-
const message = error instanceof Error ? error.message : "Unknown error";
|
|
164
|
-
return c.json({ error: message }, 500);
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
return app;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
export async function startHttpServer(
|
|
172
|
-
memoryService: MemoryService,
|
|
173
|
-
config: Config
|
|
174
|
-
): Promise<{ stop: () => void }> {
|
|
175
|
-
const app = createHttpApp(memoryService, config);
|
|
176
|
-
|
|
177
|
-
const server = Bun.serve({
|
|
178
|
-
port: config.httpPort,
|
|
179
|
-
hostname: config.httpHost,
|
|
180
|
-
fetch: app.fetch,
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
console.error(
|
|
184
|
-
`[vector-memory-mcp] HTTP server listening on http://${config.httpHost}:${config.httpPort}`
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
return {
|
|
188
|
-
stop: () => server.stop(),
|
|
189
|
-
};
|
|
190
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { loadConfig, parseCliArgs } from "./config/index.js";
|
|
4
|
-
import { connectToDatabase } from "./db/connection.js";
|
|
5
|
-
import { MemoryRepository } from "./db/memory.repository.js";
|
|
6
|
-
import { EmbeddingsService } from "./services/embeddings.service.js";
|
|
7
|
-
import { MemoryService } from "./services/memory.service.js";
|
|
8
|
-
import { startServer } from "./mcp/server.js";
|
|
9
|
-
import { startHttpServer } from "./http/server.js";
|
|
10
|
-
|
|
11
|
-
async function main(): Promise<void> {
|
|
12
|
-
const args = process.argv.slice(2);
|
|
13
|
-
|
|
14
|
-
// Check for warmup command
|
|
15
|
-
if (args[0] === "warmup") {
|
|
16
|
-
const { warmup } = await import("../scripts/warmup.js");
|
|
17
|
-
await warmup();
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Parse CLI args and load config
|
|
22
|
-
const overrides = parseCliArgs(args);
|
|
23
|
-
const config = loadConfig(overrides);
|
|
24
|
-
|
|
25
|
-
// Initialize database
|
|
26
|
-
const db = await connectToDatabase(config.dbPath);
|
|
27
|
-
|
|
28
|
-
// Initialize layers
|
|
29
|
-
const repository = new MemoryRepository(db);
|
|
30
|
-
const embeddings = new EmbeddingsService(config.embeddingModel, config.embeddingDimension);
|
|
31
|
-
const memoryService = new MemoryService(repository, embeddings);
|
|
32
|
-
|
|
33
|
-
// Track cleanup functions
|
|
34
|
-
let httpStop: (() => void) | null = null;
|
|
35
|
-
|
|
36
|
-
// Graceful shutdown handler
|
|
37
|
-
const shutdown = () => {
|
|
38
|
-
console.error("[vector-memory-mcp] Shutting down...");
|
|
39
|
-
if (httpStop) httpStop();
|
|
40
|
-
db.close();
|
|
41
|
-
process.exit(0);
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// Handle signals and stdin close (parent process exit)
|
|
45
|
-
process.on("SIGTERM", shutdown);
|
|
46
|
-
process.on("SIGINT", shutdown);
|
|
47
|
-
process.stdin.on("close", shutdown);
|
|
48
|
-
process.stdin.on("end", shutdown);
|
|
49
|
-
|
|
50
|
-
// Start HTTP server if transport mode includes it
|
|
51
|
-
if (config.enableHttp) {
|
|
52
|
-
const http = await startHttpServer(memoryService, config);
|
|
53
|
-
httpStop = http.stop;
|
|
54
|
-
console.error(
|
|
55
|
-
`[vector-memory-mcp] MCP available at http://${config.httpHost}:${config.httpPort}/mcp`
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Start stdio transport unless in HTTP-only mode
|
|
60
|
-
if (config.transportMode !== "http") {
|
|
61
|
-
await startServer(memoryService);
|
|
62
|
-
} else {
|
|
63
|
-
// In HTTP-only mode, keep the process running
|
|
64
|
-
console.error("[vector-memory-mcp] Running in HTTP-only mode (no stdio)");
|
|
65
|
-
// Keep process alive - the HTTP server runs indefinitely
|
|
66
|
-
await new Promise(() => {});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
main().catch(console.error);
|
package/src/mcp/handlers.ts
DELETED
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
import type { MemoryService } from "../services/memory.service.js";
|
|
3
|
-
|
|
4
|
-
export async function handleStoreMemories(
|
|
5
|
-
args: Record<string, unknown> | undefined,
|
|
6
|
-
service: MemoryService
|
|
7
|
-
): Promise<CallToolResult> {
|
|
8
|
-
const memories = args?.memories as Array<{
|
|
9
|
-
content: string;
|
|
10
|
-
embedding_text?: string;
|
|
11
|
-
metadata?: Record<string, unknown>;
|
|
12
|
-
}>;
|
|
13
|
-
|
|
14
|
-
const ids: string[] = [];
|
|
15
|
-
for (const item of memories) {
|
|
16
|
-
const memory = await service.store(
|
|
17
|
-
item.content,
|
|
18
|
-
item.metadata ?? {},
|
|
19
|
-
item.embedding_text
|
|
20
|
-
);
|
|
21
|
-
ids.push(memory.id);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
content: [
|
|
26
|
-
{
|
|
27
|
-
type: "text",
|
|
28
|
-
text:
|
|
29
|
-
ids.length === 1
|
|
30
|
-
? `Memory stored with ID: ${ids[0]}`
|
|
31
|
-
: `Stored ${ids.length} memories:\n${ids.map((id) => `- ${id}`).join("\n")}`,
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export async function handleDeleteMemories(
|
|
38
|
-
args: Record<string, unknown> | undefined,
|
|
39
|
-
service: MemoryService
|
|
40
|
-
): Promise<CallToolResult> {
|
|
41
|
-
const ids = args?.ids as string[];
|
|
42
|
-
const results: string[] = [];
|
|
43
|
-
|
|
44
|
-
for (const id of ids) {
|
|
45
|
-
const success = await service.delete(id);
|
|
46
|
-
results.push(
|
|
47
|
-
success ? `Memory ${id} deleted successfully` : `Memory ${id} not found`
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return {
|
|
52
|
-
content: [
|
|
53
|
-
{
|
|
54
|
-
type: "text",
|
|
55
|
-
text: results.join("\n"),
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
export async function handleUpdateMemories(
|
|
63
|
-
args: Record<string, unknown> | undefined,
|
|
64
|
-
service: MemoryService
|
|
65
|
-
): Promise<CallToolResult> {
|
|
66
|
-
const updates = args?.updates as Array<{
|
|
67
|
-
id: string;
|
|
68
|
-
content?: string;
|
|
69
|
-
embedding_text?: string;
|
|
70
|
-
metadata?: Record<string, unknown>;
|
|
71
|
-
}>;
|
|
72
|
-
|
|
73
|
-
const results: string[] = [];
|
|
74
|
-
|
|
75
|
-
for (const update of updates) {
|
|
76
|
-
const memory = await service.update(update.id, {
|
|
77
|
-
content: update.content,
|
|
78
|
-
embeddingText: update.embedding_text,
|
|
79
|
-
metadata: update.metadata,
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
if (memory) {
|
|
83
|
-
results.push(`Memory ${update.id} updated successfully`);
|
|
84
|
-
} else {
|
|
85
|
-
results.push(`Memory ${update.id} not found`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return {
|
|
90
|
-
content: [
|
|
91
|
-
{
|
|
92
|
-
type: "text",
|
|
93
|
-
text: results.join("\n"),
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export async function handleSearchMemories(
|
|
100
|
-
args: Record<string, unknown> | undefined,
|
|
101
|
-
service: MemoryService
|
|
102
|
-
): Promise<CallToolResult> {
|
|
103
|
-
const query = args?.query as string;
|
|
104
|
-
const limit = (args?.limit as number) ?? 10;
|
|
105
|
-
const includeDeleted = (args?.include_deleted as boolean) ?? false;
|
|
106
|
-
const memories = await service.search(query, limit, includeDeleted);
|
|
107
|
-
|
|
108
|
-
if (memories.length === 0) {
|
|
109
|
-
return {
|
|
110
|
-
content: [{ type: "text", text: "No memories found matching your query." }],
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const results = memories.map((mem) => {
|
|
115
|
-
let result = `ID: ${mem.id}\nContent: ${mem.content}`;
|
|
116
|
-
if (Object.keys(mem.metadata).length > 0) {
|
|
117
|
-
result += `\nMetadata: ${JSON.stringify(mem.metadata)}`;
|
|
118
|
-
}
|
|
119
|
-
if (includeDeleted && mem.supersededBy) {
|
|
120
|
-
result += `\n[DELETED]`;
|
|
121
|
-
}
|
|
122
|
-
return result;
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
content: [{ type: "text", text: results.join("\n\n---\n\n") }],
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export async function handleGetMemories(
|
|
131
|
-
args: Record<string, unknown> | undefined,
|
|
132
|
-
service: MemoryService
|
|
133
|
-
): Promise<CallToolResult> {
|
|
134
|
-
const ids = args?.ids as string[];
|
|
135
|
-
|
|
136
|
-
const format = (
|
|
137
|
-
memoryId: string,
|
|
138
|
-
memory: Awaited<ReturnType<MemoryService["get"]>>
|
|
139
|
-
) => {
|
|
140
|
-
if (!memory) {
|
|
141
|
-
return `Memory ${memoryId} not found`;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
let result = `ID: ${memory.id}\nContent: ${memory.content}`;
|
|
145
|
-
if (Object.keys(memory.metadata).length > 0) {
|
|
146
|
-
result += `\nMetadata: ${JSON.stringify(memory.metadata)}`;
|
|
147
|
-
}
|
|
148
|
-
result += `\nCreated: ${memory.createdAt.toISOString()}`;
|
|
149
|
-
result += `\nUpdated: ${memory.updatedAt.toISOString()}`;
|
|
150
|
-
if (memory.supersededBy) {
|
|
151
|
-
result += `\nSuperseded by: ${memory.supersededBy}`;
|
|
152
|
-
}
|
|
153
|
-
return result;
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
const blocks: string[] = [];
|
|
157
|
-
for (const id of ids) {
|
|
158
|
-
const memory = await service.get(id);
|
|
159
|
-
blocks.push(format(id, memory));
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
content: [{ type: "text", text: blocks.join("\n\n---\n\n") }],
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export async function handleStoreHandoff(
|
|
168
|
-
args: Record<string, unknown> | undefined,
|
|
169
|
-
service: MemoryService
|
|
170
|
-
): Promise<CallToolResult> {
|
|
171
|
-
const memory = await service.storeHandoff({
|
|
172
|
-
project: args?.project as string,
|
|
173
|
-
branch: args?.branch as string | undefined,
|
|
174
|
-
summary: args?.summary as string,
|
|
175
|
-
completed: (args?.completed as string[] | undefined) ?? [],
|
|
176
|
-
in_progress_blocked: (args?.in_progress_blocked as string[] | undefined) ?? [],
|
|
177
|
-
key_decisions: (args?.key_decisions as string[] | undefined) ?? [],
|
|
178
|
-
next_steps: (args?.next_steps as string[] | undefined) ?? [],
|
|
179
|
-
memory_ids: (args?.memory_ids as string[] | undefined) ?? [],
|
|
180
|
-
metadata: (args?.metadata as Record<string, unknown>) ?? {},
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
return {
|
|
184
|
-
content: [{ type: "text", text: `Handoff stored with memory ID: ${memory.id}` }],
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export async function handleGetHandoff(
|
|
189
|
-
_args: Record<string, unknown> | undefined,
|
|
190
|
-
service: MemoryService
|
|
191
|
-
): Promise<CallToolResult> {
|
|
192
|
-
const handoff = await service.getLatestHandoff();
|
|
193
|
-
|
|
194
|
-
if (!handoff) {
|
|
195
|
-
return {
|
|
196
|
-
content: [{ type: "text", text: "No stored handoff found." }],
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Fetch referenced memories if any
|
|
201
|
-
const memoryIds = (handoff.metadata.memory_ids as string[] | undefined) ?? [];
|
|
202
|
-
let memoriesSection = "";
|
|
203
|
-
|
|
204
|
-
if (memoryIds.length > 0) {
|
|
205
|
-
const memories: string[] = [];
|
|
206
|
-
for (const id of memoryIds) {
|
|
207
|
-
const memory = await service.get(id);
|
|
208
|
-
if (memory) {
|
|
209
|
-
memories.push(`### Memory: ${id}\n${memory.content}`);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
if (memories.length > 0) {
|
|
213
|
-
memoriesSection = `\n\n## Referenced Memories\n\n${memories.join("\n\n")}`;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return {
|
|
218
|
-
content: [{ type: "text", text: handoff.content + memoriesSection }],
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export async function handleToolCall(
|
|
223
|
-
name: string,
|
|
224
|
-
args: Record<string, unknown> | undefined,
|
|
225
|
-
service: MemoryService
|
|
226
|
-
): Promise<CallToolResult> {
|
|
227
|
-
switch (name) {
|
|
228
|
-
case "store_memories":
|
|
229
|
-
return handleStoreMemories(args, service);
|
|
230
|
-
case "update_memories":
|
|
231
|
-
return handleUpdateMemories(args, service);
|
|
232
|
-
case "delete_memories":
|
|
233
|
-
return handleDeleteMemories(args, service);
|
|
234
|
-
case "search_memories":
|
|
235
|
-
return handleSearchMemories(args, service);
|
|
236
|
-
case "get_memories":
|
|
237
|
-
return handleGetMemories(args, service);
|
|
238
|
-
case "store_handoff":
|
|
239
|
-
return handleStoreHandoff(args, service);
|
|
240
|
-
case "get_handoff":
|
|
241
|
-
return handleGetHandoff(args, service);
|
|
242
|
-
default:
|
|
243
|
-
return {
|
|
244
|
-
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
245
|
-
isError: true,
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
}
|
package/src/mcp/server.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
-
import {
|
|
4
|
-
CallToolRequestSchema,
|
|
5
|
-
ListToolsRequestSchema,
|
|
6
|
-
} from "@modelcontextprotocol/sdk/types.js";
|
|
7
|
-
|
|
8
|
-
import { tools } from "./tools.js";
|
|
9
|
-
import { handleToolCall } from "./handlers.js";
|
|
10
|
-
import type { MemoryService } from "../services/memory.service.js";
|
|
11
|
-
|
|
12
|
-
export function createServer(memoryService: MemoryService): Server {
|
|
13
|
-
const server = new Server(
|
|
14
|
-
{ name: "vector-memory-mcp", version: "0.6.0" },
|
|
15
|
-
{ capabilities: { tools: {} } }
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
19
|
-
return { tools };
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
23
|
-
const { name, arguments: args } = request.params;
|
|
24
|
-
return handleToolCall(name, args, memoryService);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
return server;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export async function startServer(memoryService: MemoryService): Promise<void> {
|
|
31
|
-
const server = createServer(memoryService);
|
|
32
|
-
const transport = new StdioServerTransport();
|
|
33
|
-
await server.connect(transport);
|
|
34
|
-
}
|