@henrychong-ai/mcp-neo4j-knowledge-graph 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.
- package/LICENSE +21 -0
- package/README.md +718 -0
- package/dist/KnowledgeGraphManager.d.ts +215 -0
- package/dist/KnowledgeGraphManager.js +910 -0
- package/dist/KnowledgeGraphManager.js.map +1 -0
- package/dist/callToolHandler.d.ts +5 -0
- package/dist/callToolHandler.js +26 -0
- package/dist/callToolHandler.js.map +1 -0
- package/dist/cli/neo4j-setup.d.ts +52 -0
- package/dist/cli/neo4j-setup.js +258 -0
- package/dist/cli/neo4j-setup.js.map +1 -0
- package/dist/config/paths.d.ts +13 -0
- package/dist/config/paths.js +41 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/storage.d.ts +35 -0
- package/dist/config/storage.js +52 -0
- package/dist/config/storage.js.map +1 -0
- package/dist/embeddings/DefaultEmbeddingService.d.ts +64 -0
- package/dist/embeddings/DefaultEmbeddingService.js +139 -0
- package/dist/embeddings/DefaultEmbeddingService.js.map +1 -0
- package/dist/embeddings/EmbeddingJobManager.d.ts +212 -0
- package/dist/embeddings/EmbeddingJobManager.js +545 -0
- package/dist/embeddings/EmbeddingJobManager.js.map +1 -0
- package/dist/embeddings/EmbeddingService.d.ts +96 -0
- package/dist/embeddings/EmbeddingService.js +44 -0
- package/dist/embeddings/EmbeddingService.js.map +1 -0
- package/dist/embeddings/EmbeddingServiceFactory.d.ts +72 -0
- package/dist/embeddings/EmbeddingServiceFactory.js +147 -0
- package/dist/embeddings/EmbeddingServiceFactory.js.map +1 -0
- package/dist/embeddings/OpenAIEmbeddingService.d.ts +73 -0
- package/dist/embeddings/OpenAIEmbeddingService.js +195 -0
- package/dist/embeddings/OpenAIEmbeddingService.js.map +1 -0
- package/dist/embeddings/config.d.ts +83 -0
- package/dist/embeddings/config.js +65 -0
- package/dist/embeddings/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +220 -0
- package/dist/index.js.map +1 -0
- package/dist/server/handlers/callToolHandler.d.ts +20 -0
- package/dist/server/handlers/callToolHandler.js +505 -0
- package/dist/server/handlers/callToolHandler.js.map +1 -0
- package/dist/server/handlers/listToolsHandler.d.ts +7 -0
- package/dist/server/handlers/listToolsHandler.js +511 -0
- package/dist/server/handlers/listToolsHandler.js.map +1 -0
- package/dist/server/handlers/toolHandlers/addObservations.d.ts +12 -0
- package/dist/server/handlers/toolHandlers/addObservations.js +99 -0
- package/dist/server/handlers/toolHandlers/addObservations.js.map +1 -0
- package/dist/server/handlers/toolHandlers/createEntities.d.ts +12 -0
- package/dist/server/handlers/toolHandlers/createEntities.js +20 -0
- package/dist/server/handlers/toolHandlers/createEntities.js.map +1 -0
- package/dist/server/handlers/toolHandlers/createRelations.d.ts +12 -0
- package/dist/server/handlers/toolHandlers/createRelations.js +20 -0
- package/dist/server/handlers/toolHandlers/createRelations.js.map +1 -0
- package/dist/server/handlers/toolHandlers/deleteEntities.d.ts +12 -0
- package/dist/server/handlers/toolHandlers/deleteEntities.js +20 -0
- package/dist/server/handlers/toolHandlers/deleteEntities.js.map +1 -0
- package/dist/server/handlers/toolHandlers/index.d.ts +8 -0
- package/dist/server/handlers/toolHandlers/index.js +9 -0
- package/dist/server/handlers/toolHandlers/index.js.map +1 -0
- package/dist/server/handlers/toolHandlers/readGraph.d.ts +12 -0
- package/dist/server/handlers/toolHandlers/readGraph.js +20 -0
- package/dist/server/handlers/toolHandlers/readGraph.js.map +1 -0
- package/dist/server/setup.d.ts +8 -0
- package/dist/server/setup.js +48 -0
- package/dist/server/setup.js.map +1 -0
- package/dist/storage/FileStorageProvider.d.ts +125 -0
- package/dist/storage/FileStorageProvider.js +322 -0
- package/dist/storage/FileStorageProvider.js.map +1 -0
- package/dist/storage/SearchResultCache.d.ts +102 -0
- package/dist/storage/SearchResultCache.js +258 -0
- package/dist/storage/SearchResultCache.js.map +1 -0
- package/dist/storage/StorageProvider.d.ts +171 -0
- package/dist/storage/StorageProvider.js +46 -0
- package/dist/storage/StorageProvider.js.map +1 -0
- package/dist/storage/StorageProviderFactory.d.ts +63 -0
- package/dist/storage/StorageProviderFactory.js +113 -0
- package/dist/storage/StorageProviderFactory.js.map +1 -0
- package/dist/storage/VectorStoreFactory.d.ts +43 -0
- package/dist/storage/VectorStoreFactory.js +41 -0
- package/dist/storage/VectorStoreFactory.js.map +1 -0
- package/dist/storage/neo4j/Neo4jConfig.d.ts +37 -0
- package/dist/storage/neo4j/Neo4jConfig.js +13 -0
- package/dist/storage/neo4j/Neo4jConfig.js.map +1 -0
- package/dist/storage/neo4j/Neo4jConnectionManager.d.ts +40 -0
- package/dist/storage/neo4j/Neo4jConnectionManager.js +58 -0
- package/dist/storage/neo4j/Neo4jConnectionManager.js.map +1 -0
- package/dist/storage/neo4j/Neo4jSchemaManager.d.ts +74 -0
- package/dist/storage/neo4j/Neo4jSchemaManager.js +224 -0
- package/dist/storage/neo4j/Neo4jSchemaManager.js.map +1 -0
- package/dist/storage/neo4j/Neo4jStorageProvider.d.ts +225 -0
- package/dist/storage/neo4j/Neo4jStorageProvider.js +1900 -0
- package/dist/storage/neo4j/Neo4jStorageProvider.js.map +1 -0
- package/dist/storage/neo4j/Neo4jVectorStore.d.ts +80 -0
- package/dist/storage/neo4j/Neo4jVectorStore.js +396 -0
- package/dist/storage/neo4j/Neo4jVectorStore.js.map +1 -0
- package/dist/types/entity-embedding.d.ts +156 -0
- package/dist/types/entity-embedding.js +2 -0
- package/dist/types/entity-embedding.js.map +1 -0
- package/dist/types/relation.d.ts +77 -0
- package/dist/types/relation.js +93 -0
- package/dist/types/relation.js.map +1 -0
- package/dist/types/temporalEntity.d.ts +55 -0
- package/dist/types/temporalEntity.js +66 -0
- package/dist/types/temporalEntity.js.map +1 -0
- package/dist/types/temporalRelation.d.ts +60 -0
- package/dist/types/temporalRelation.js +89 -0
- package/dist/types/temporalRelation.js.map +1 -0
- package/dist/types/vector-index.d.ts +48 -0
- package/dist/types/vector-index.js +2 -0
- package/dist/types/vector-index.js.map +1 -0
- package/dist/types/vector-store.d.ts +16 -0
- package/dist/types/vector-store.js +2 -0
- package/dist/types/vector-store.js.map +1 -0
- package/dist/utils/fs.d.ts +2 -0
- package/dist/utils/fs.js +3 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import * as toolHandlers from './toolHandlers/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handles the CallTool request.
|
|
4
|
+
* Delegates to the appropriate tool handler based on the tool name.
|
|
5
|
+
*
|
|
6
|
+
* @param request The CallTool request object
|
|
7
|
+
* @param knowledgeGraphManager The KnowledgeGraphManager instance
|
|
8
|
+
* @returns A response object with the result content
|
|
9
|
+
* @throws Error if the tool is unknown or arguments are missing
|
|
10
|
+
*/
|
|
11
|
+
export async function handleCallToolRequest(request,
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
knowledgeGraphManager) {
|
|
14
|
+
if (!request) {
|
|
15
|
+
throw new Error('Invalid request: request is null or undefined');
|
|
16
|
+
}
|
|
17
|
+
if (!request.params) {
|
|
18
|
+
throw new Error('Invalid request: missing params');
|
|
19
|
+
}
|
|
20
|
+
const { name, arguments: args } = request.params;
|
|
21
|
+
if (!name) {
|
|
22
|
+
throw new Error('Invalid request: missing tool name');
|
|
23
|
+
}
|
|
24
|
+
if (!args) {
|
|
25
|
+
throw new Error(`No arguments provided for tool: ${name}`);
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
switch (name) {
|
|
29
|
+
case 'create_entities':
|
|
30
|
+
return await toolHandlers.handleCreateEntities(args, knowledgeGraphManager);
|
|
31
|
+
case 'read_graph':
|
|
32
|
+
return await toolHandlers.handleReadGraph(args, knowledgeGraphManager);
|
|
33
|
+
case 'create_relations':
|
|
34
|
+
return await toolHandlers.handleCreateRelations(args, knowledgeGraphManager);
|
|
35
|
+
case 'add_observations':
|
|
36
|
+
return await toolHandlers.handleAddObservations(args, knowledgeGraphManager);
|
|
37
|
+
case 'delete_entities':
|
|
38
|
+
return await toolHandlers.handleDeleteEntities(args, knowledgeGraphManager);
|
|
39
|
+
case 'delete_observations':
|
|
40
|
+
await knowledgeGraphManager.deleteObservations(args.deletions);
|
|
41
|
+
return { content: [{ type: 'text', text: 'Observations deleted successfully' }] };
|
|
42
|
+
case 'delete_relations':
|
|
43
|
+
await knowledgeGraphManager.deleteRelations(args.relations);
|
|
44
|
+
return { content: [{ type: 'text', text: 'Relations deleted successfully' }] };
|
|
45
|
+
case 'get_relation':
|
|
46
|
+
const relation = await knowledgeGraphManager.getRelation(args.from, args.to, args.relationType);
|
|
47
|
+
if (!relation) {
|
|
48
|
+
return {
|
|
49
|
+
content: [
|
|
50
|
+
{
|
|
51
|
+
type: 'text',
|
|
52
|
+
text: `Relation not found: ${args.from} -> ${args.relationType} -> ${args.to}`,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return { content: [{ type: 'text', text: JSON.stringify(relation, null, 2) }] };
|
|
58
|
+
case 'update_relation':
|
|
59
|
+
await knowledgeGraphManager.updateRelation(args.relation);
|
|
60
|
+
return { content: [{ type: 'text', text: 'Relation updated successfully' }] };
|
|
61
|
+
case 'search_nodes':
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: 'text',
|
|
66
|
+
text: JSON.stringify(await knowledgeGraphManager.searchNodes(args.query), null, 2),
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
case 'open_nodes':
|
|
71
|
+
return {
|
|
72
|
+
content: [
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: JSON.stringify(await knowledgeGraphManager.openNodes(args.names), null, 2),
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
case 'get_entity_history':
|
|
80
|
+
try {
|
|
81
|
+
const history = await knowledgeGraphManager.getEntityHistory(args.entityName);
|
|
82
|
+
return { content: [{ type: 'text', text: JSON.stringify(history, null, 2) }] };
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
86
|
+
return {
|
|
87
|
+
content: [{ type: 'text', text: `Error retrieving entity history: ${errorMessage}` }],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
case 'get_relation_history':
|
|
91
|
+
try {
|
|
92
|
+
const history = await knowledgeGraphManager.getRelationHistory(args.from, args.to, args.relationType);
|
|
93
|
+
return { content: [{ type: 'text', text: JSON.stringify(history, null, 2) }] };
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
97
|
+
return {
|
|
98
|
+
content: [{ type: 'text', text: `Error retrieving relation history: ${errorMessage}` }],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
case 'get_graph_at_time':
|
|
102
|
+
try {
|
|
103
|
+
const graph = await knowledgeGraphManager.getGraphAtTime(args.timestamp);
|
|
104
|
+
return { content: [{ type: 'text', text: JSON.stringify(graph, null, 2) }] };
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
108
|
+
return {
|
|
109
|
+
content: [{ type: 'text', text: `Error retrieving graph at time: ${errorMessage}` }],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
case 'get_decayed_graph':
|
|
113
|
+
try {
|
|
114
|
+
// Extract optional parameters if provided by client
|
|
115
|
+
const options = {};
|
|
116
|
+
if (args.reference_time) {
|
|
117
|
+
options.referenceTime = Number(args.reference_time);
|
|
118
|
+
}
|
|
119
|
+
if (args.decay_factor) {
|
|
120
|
+
options.decayFactor = Number(args.decay_factor);
|
|
121
|
+
}
|
|
122
|
+
// Pass options to getDecayedGraph if any are provided
|
|
123
|
+
const graph = Object.keys(options).length > 0
|
|
124
|
+
? await knowledgeGraphManager.getDecayedGraph(options)
|
|
125
|
+
: await knowledgeGraphManager.getDecayedGraph();
|
|
126
|
+
return { content: [{ type: 'text', text: JSON.stringify(graph, null, 2) }] };
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
130
|
+
return {
|
|
131
|
+
content: [{ type: 'text', text: `Error retrieving decayed graph: ${errorMessage}` }],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
case 'force_generate_embedding':
|
|
135
|
+
// Validate arguments
|
|
136
|
+
if (!args.entity_name) {
|
|
137
|
+
throw new Error('Missing required parameter: entity_name');
|
|
138
|
+
}
|
|
139
|
+
process.stderr.write(`[DEBUG] Force generating embedding for entity: ${args.entity_name}\n`);
|
|
140
|
+
try {
|
|
141
|
+
// First determine if the input looks like a UUID
|
|
142
|
+
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
143
|
+
const isUUID = uuidPattern.test(String(args.entity_name));
|
|
144
|
+
if (isUUID) {
|
|
145
|
+
process.stderr.write(`[DEBUG] Input appears to be a UUID: ${args.entity_name}\n`);
|
|
146
|
+
}
|
|
147
|
+
// Try to get all entities first to locate the correct one
|
|
148
|
+
process.stderr.write(`[DEBUG] Trying to find entity by opening all nodes...\n`);
|
|
149
|
+
const allEntities = await knowledgeGraphManager.openNodes([]);
|
|
150
|
+
let entity = null;
|
|
151
|
+
if (allEntities && allEntities.entities && allEntities.entities.length > 0) {
|
|
152
|
+
process.stderr.write(`[DEBUG] Found ${allEntities.entities.length} entities in total\n`);
|
|
153
|
+
// Try different methods to find the entity
|
|
154
|
+
// 1. Direct match by name
|
|
155
|
+
entity = allEntities.entities.find((e) => e.name === args.entity_name);
|
|
156
|
+
// 2. If not found and input is UUID, try matching by ID
|
|
157
|
+
if (!entity && isUUID) {
|
|
158
|
+
entity = allEntities.entities.find((e) =>
|
|
159
|
+
// The id property might not be in the Entity interface, but could exist at runtime
|
|
160
|
+
'id' in e && e.id === args.entity_name);
|
|
161
|
+
process.stderr.write(`[DEBUG] Searching by ID match for UUID: ${args.entity_name}\n`);
|
|
162
|
+
}
|
|
163
|
+
// Log found entities to help debugging
|
|
164
|
+
if (!entity) {
|
|
165
|
+
process.stderr.write(`[DEBUG] Entity not found in list. Available entities: ${JSON.stringify(allEntities.entities.map((e) => ({
|
|
166
|
+
name: e.name,
|
|
167
|
+
id: e.id,
|
|
168
|
+
})))}\n`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
process.stderr.write(`[DEBUG] No entities found in graph\n`);
|
|
173
|
+
}
|
|
174
|
+
// If still not found, try explicit lookup by name
|
|
175
|
+
if (!entity) {
|
|
176
|
+
process.stderr.write(`[DEBUG] Entity not found in list, trying explicit lookup by name...\n`);
|
|
177
|
+
const openedEntities = await knowledgeGraphManager.openNodes([
|
|
178
|
+
String(args.entity_name),
|
|
179
|
+
]);
|
|
180
|
+
if (openedEntities && openedEntities.entities && openedEntities.entities.length > 0) {
|
|
181
|
+
entity = openedEntities.entities[0];
|
|
182
|
+
process.stderr.write(`[DEBUG] Found entity by name: ${entity.name} (ID: ${entity.id || 'none'})\n`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// If still not found, check if we can query by ID through the storage provider
|
|
186
|
+
if (!entity &&
|
|
187
|
+
isUUID &&
|
|
188
|
+
knowledgeGraphManager.storageProvider &&
|
|
189
|
+
typeof knowledgeGraphManager.storageProvider.getEntityById === 'function') {
|
|
190
|
+
try {
|
|
191
|
+
process.stderr.write(`[DEBUG] Trying direct database lookup by ID: ${args.entity_name}\n`);
|
|
192
|
+
entity = await knowledgeGraphManager.storageProvider.getEntityById(args.entity_name);
|
|
193
|
+
if (entity) {
|
|
194
|
+
process.stderr.write(`[DEBUG] Found entity by direct ID lookup: ${entity.name} (ID: ${entity.id || 'none'})\n`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
process.stderr.write(`[DEBUG] Direct ID lookup failed: ${err}\n`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Final check
|
|
202
|
+
if (!entity) {
|
|
203
|
+
process.stderr.write(`[ERROR] Entity not found after all lookup attempts: ${args.entity_name}\n`);
|
|
204
|
+
throw new Error(`Entity not found: ${args.entity_name}`);
|
|
205
|
+
}
|
|
206
|
+
process.stderr.write(`[DEBUG] Successfully found entity: ${entity.name} (ID: ${entity.id || 'none'})\n`);
|
|
207
|
+
// Check if embedding service and job manager are available
|
|
208
|
+
if (!knowledgeGraphManager.embeddingJobManager) {
|
|
209
|
+
process.stderr.write(`[ERROR] EmbeddingJobManager not initialized\n`);
|
|
210
|
+
throw new Error('EmbeddingJobManager not initialized');
|
|
211
|
+
}
|
|
212
|
+
process.stderr.write(`[DEBUG] EmbeddingJobManager found, proceeding\n`);
|
|
213
|
+
// Directly get the text for the entity
|
|
214
|
+
const embeddingText = knowledgeGraphManager.embeddingJobManager._prepareEntityText(entity);
|
|
215
|
+
process.stderr.write(`[DEBUG] Prepared entity text for embedding, length: ${embeddingText.length}\n`);
|
|
216
|
+
// Generate embedding directly
|
|
217
|
+
const embeddingService = knowledgeGraphManager.embeddingJobManager.embeddingService;
|
|
218
|
+
if (!embeddingService) {
|
|
219
|
+
process.stderr.write(`[ERROR] Embedding service not available\n`);
|
|
220
|
+
throw new Error('Embedding service not available');
|
|
221
|
+
}
|
|
222
|
+
const vector = await embeddingService.generateEmbedding(embeddingText);
|
|
223
|
+
process.stderr.write(`[DEBUG] Generated embedding vector, length: ${vector.length}\n`);
|
|
224
|
+
// Store embedding directly
|
|
225
|
+
const embedding = {
|
|
226
|
+
vector,
|
|
227
|
+
model: embeddingService.getModelInfo().name,
|
|
228
|
+
lastUpdated: Date.now(),
|
|
229
|
+
};
|
|
230
|
+
// Store the embedding with both name and ID for redundancy
|
|
231
|
+
process.stderr.write(`[DEBUG] Storing embedding for entity: ${entity.name}\n`);
|
|
232
|
+
await knowledgeGraphManager.storageProvider.storeEntityVector(entity.name, embedding);
|
|
233
|
+
const entityId = entity.id;
|
|
234
|
+
if (entityId && typeof entityId === 'string') {
|
|
235
|
+
process.stderr.write(`[DEBUG] Also storing embedding with entity ID: ${entityId}\n`);
|
|
236
|
+
try {
|
|
237
|
+
await knowledgeGraphManager.storageProvider.storeEntityVector(entityId, embedding);
|
|
238
|
+
}
|
|
239
|
+
catch (idStoreError) {
|
|
240
|
+
process.stderr.write(`[WARN] Failed to store embedding by ID, but name storage succeeded: ${idStoreError}\n`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
process.stderr.write(`[DEBUG] Successfully stored embedding for ${entity.name}\n`);
|
|
244
|
+
return {
|
|
245
|
+
content: [
|
|
246
|
+
{
|
|
247
|
+
type: 'text',
|
|
248
|
+
text: JSON.stringify({
|
|
249
|
+
success: true,
|
|
250
|
+
entity: entity.name,
|
|
251
|
+
entity_id: entity.id,
|
|
252
|
+
vector_length: vector.length,
|
|
253
|
+
model: embeddingService.getModelInfo().name,
|
|
254
|
+
}, null, 2),
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
};
|
|
258
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
process.stderr.write(`[ERROR] Failed to force generate embedding: ${error.message}\n`);
|
|
262
|
+
if (error.stack) {
|
|
263
|
+
process.stderr.write(`[ERROR] Stack trace: ${error.stack}\n`);
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
content: [{ type: 'text', text: `Failed to generate embedding: ${error.message}` }],
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
case 'semantic_search':
|
|
270
|
+
try {
|
|
271
|
+
// Extract search options from args
|
|
272
|
+
const searchOptions = {
|
|
273
|
+
limit: args.limit || 10,
|
|
274
|
+
minSimilarity: args.min_similarity || 0.6,
|
|
275
|
+
entityTypes: args.entity_types || [],
|
|
276
|
+
hybridSearch: args.hybrid_search !== undefined ? args.hybrid_search : true,
|
|
277
|
+
semanticWeight: args.semantic_weight || 0.6,
|
|
278
|
+
semanticSearch: true,
|
|
279
|
+
};
|
|
280
|
+
// Call the search method with semantic search options
|
|
281
|
+
const results = await knowledgeGraphManager.search(String(args.query), searchOptions);
|
|
282
|
+
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
286
|
+
return {
|
|
287
|
+
content: [{ type: 'text', text: `Error performing semantic search: ${errorMessage}` }],
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
case 'get_entity_embedding':
|
|
291
|
+
try {
|
|
292
|
+
// Check if entity exists
|
|
293
|
+
const entity = await knowledgeGraphManager.openNodes([String(args.entity_name)]);
|
|
294
|
+
if (!entity.entities || entity.entities.length === 0) {
|
|
295
|
+
return { content: [{ type: 'text', text: `Entity not found: ${args.entity_name}` }] };
|
|
296
|
+
}
|
|
297
|
+
// Access the embedding using appropriate interface
|
|
298
|
+
if (knowledgeGraphManager.storageProvider &&
|
|
299
|
+
typeof knowledgeGraphManager.storageProvider
|
|
300
|
+
.getEntityEmbedding === 'function') {
|
|
301
|
+
const embedding = await knowledgeGraphManager.storageProvider.getEntityEmbedding(String(args.entity_name));
|
|
302
|
+
if (!embedding) {
|
|
303
|
+
return {
|
|
304
|
+
content: [
|
|
305
|
+
{ type: 'text', text: `No embedding found for entity: ${args.entity_name}` },
|
|
306
|
+
],
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
content: [
|
|
311
|
+
{
|
|
312
|
+
type: 'text',
|
|
313
|
+
text: JSON.stringify({
|
|
314
|
+
entityName: args.entity_name,
|
|
315
|
+
embedding: embedding.vector,
|
|
316
|
+
model: embedding.model || 'unknown',
|
|
317
|
+
dimensions: embedding.vector ? embedding.vector.length : 0,
|
|
318
|
+
lastUpdated: embedding.lastUpdated || Date.now(),
|
|
319
|
+
}, null, 2),
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
return {
|
|
326
|
+
content: [
|
|
327
|
+
{
|
|
328
|
+
type: 'text',
|
|
329
|
+
text: `Embedding retrieval not supported by this storage provider`,
|
|
330
|
+
},
|
|
331
|
+
],
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
337
|
+
return {
|
|
338
|
+
content: [{ type: 'text', text: `Error retrieving entity embedding: ${errorMessage}` }],
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
case 'debug_embedding_config':
|
|
342
|
+
// Diagnostic tool to check embedding configuration
|
|
343
|
+
try {
|
|
344
|
+
// Check for OpenAI API key
|
|
345
|
+
const hasOpenAIKey = !!process.env.OPENAI_API_KEY;
|
|
346
|
+
const embeddingModel = process.env.OPENAI_EMBEDDING_MODEL || 'text-embedding-3-small';
|
|
347
|
+
// Check if embedding job manager is initialized
|
|
348
|
+
const hasEmbeddingJobManager = !!knowledgeGraphManager.embeddingJobManager;
|
|
349
|
+
// Get storage provider info
|
|
350
|
+
const storageType = process.env.MEMORY_STORAGE_TYPE || 'neo4j';
|
|
351
|
+
const storageProvider = knowledgeGraphManager.storageProvider;
|
|
352
|
+
// Get Neo4j specific configuration
|
|
353
|
+
const neo4jInfo = {
|
|
354
|
+
uri: process.env.NEO4J_URI || 'default',
|
|
355
|
+
username: process.env.NEO4J_USERNAME ? 'configured' : 'not configured',
|
|
356
|
+
database: process.env.NEO4J_DATABASE || 'neo4j',
|
|
357
|
+
vectorIndex: process.env.NEO4J_VECTOR_INDEX || 'entity_embeddings',
|
|
358
|
+
vectorDimensions: process.env.NEO4J_VECTOR_DIMENSIONS || '1536',
|
|
359
|
+
similarityFunction: process.env.NEO4J_SIMILARITY_FUNCTION || 'cosine',
|
|
360
|
+
connectionStatus: 'unknown',
|
|
361
|
+
};
|
|
362
|
+
// Check if Neo4j connection manager is available
|
|
363
|
+
if (storageProvider && typeof storageProvider.getConnectionManager === 'function') {
|
|
364
|
+
try {
|
|
365
|
+
const connectionManager = storageProvider.getConnectionManager();
|
|
366
|
+
if (connectionManager) {
|
|
367
|
+
neo4jInfo.connectionStatus = 'available';
|
|
368
|
+
// Check if vector store is initialized
|
|
369
|
+
if (storageProvider.vectorStore) {
|
|
370
|
+
neo4jInfo.vectorStoreStatus = 'available';
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
neo4jInfo.vectorStoreStatus = 'not initialized';
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
379
|
+
neo4jInfo.connectionStatus = `error: ${errorMessage}`;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// Count entities with embeddings via Neo4j vector store
|
|
383
|
+
let entitiesWithEmbeddings = 0;
|
|
384
|
+
if (storageProvider && storageProvider.countEntitiesWithEmbeddings) {
|
|
385
|
+
try {
|
|
386
|
+
entitiesWithEmbeddings = await storageProvider.countEntitiesWithEmbeddings();
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
process.stderr.write(`[ERROR] Error checking embeddings count: ${error}\n`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Get embedding service information
|
|
393
|
+
let embeddingServiceInfo = null;
|
|
394
|
+
if (hasEmbeddingJobManager &&
|
|
395
|
+
knowledgeGraphManager.embeddingJobManager.embeddingService) {
|
|
396
|
+
try {
|
|
397
|
+
embeddingServiceInfo = knowledgeGraphManager.embeddingJobManager.embeddingService.getModelInfo();
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
401
|
+
process.stderr.write(`[ERROR] Error getting embedding service info: ${errorMessage}\n`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// Get embedding service provider info if available
|
|
405
|
+
let embeddingProviderInfo = null;
|
|
406
|
+
if (storageProvider && storageProvider.embeddingService) {
|
|
407
|
+
try {
|
|
408
|
+
embeddingProviderInfo = storageProvider.embeddingService.getProviderInfo();
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
412
|
+
process.stderr.write(`[ERROR] Error getting embedding provider info: ${errorMessage}\n`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// Check pending embedding jobs if available
|
|
416
|
+
let pendingJobs = 0;
|
|
417
|
+
if (hasEmbeddingJobManager && knowledgeGraphManager.embeddingJobManager.getPendingJobs) {
|
|
418
|
+
try {
|
|
419
|
+
pendingJobs = knowledgeGraphManager.embeddingJobManager.getPendingJobs().length;
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
423
|
+
process.stderr.write(`[ERROR] Error getting pending jobs: ${errorMessage}\n`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Return diagnostic information with proper formatting
|
|
427
|
+
const diagnosticInfo = {
|
|
428
|
+
storage_type: storageType,
|
|
429
|
+
openai_api_key_present: hasOpenAIKey,
|
|
430
|
+
embedding_model: embeddingModel,
|
|
431
|
+
embedding_job_manager_initialized: hasEmbeddingJobManager,
|
|
432
|
+
embedding_service_initialized: !!embeddingProviderInfo,
|
|
433
|
+
embedding_service_info: embeddingServiceInfo,
|
|
434
|
+
embedding_provider_info: embeddingProviderInfo,
|
|
435
|
+
neo4j_config: neo4jInfo,
|
|
436
|
+
entities_with_embeddings: entitiesWithEmbeddings,
|
|
437
|
+
pending_embedding_jobs: pendingJobs,
|
|
438
|
+
environment_variables: {
|
|
439
|
+
DEBUG: process.env.DEBUG === 'true',
|
|
440
|
+
NODE_ENV: process.env.NODE_ENV,
|
|
441
|
+
MEMORY_STORAGE_TYPE: process.env.MEMORY_STORAGE_TYPE || 'neo4j',
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
return {
|
|
445
|
+
content: [
|
|
446
|
+
{
|
|
447
|
+
type: 'text',
|
|
448
|
+
text: JSON.stringify(diagnosticInfo, null, 2),
|
|
449
|
+
},
|
|
450
|
+
],
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
catch (error) {
|
|
454
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
455
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
456
|
+
process.stderr.write(`[ERROR] Error in debug_embedding_config: ${errorMessage}\n`);
|
|
457
|
+
return {
|
|
458
|
+
content: [
|
|
459
|
+
{
|
|
460
|
+
type: 'text',
|
|
461
|
+
text: JSON.stringify({
|
|
462
|
+
error: errorMessage,
|
|
463
|
+
stack: errorStack,
|
|
464
|
+
}, null, 2),
|
|
465
|
+
},
|
|
466
|
+
],
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
case 'diagnose_vector_search':
|
|
470
|
+
if (knowledgeGraphManager.storageProvider &&
|
|
471
|
+
typeof knowledgeGraphManager.storageProvider
|
|
472
|
+
.diagnoseVectorSearch === 'function') {
|
|
473
|
+
return {
|
|
474
|
+
content: [
|
|
475
|
+
{
|
|
476
|
+
type: 'text',
|
|
477
|
+
text: JSON.stringify(await knowledgeGraphManager.storageProvider.diagnoseVectorSearch()),
|
|
478
|
+
},
|
|
479
|
+
],
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
return {
|
|
484
|
+
content: [
|
|
485
|
+
{
|
|
486
|
+
type: 'text',
|
|
487
|
+
text: JSON.stringify({
|
|
488
|
+
error: 'Diagnostic method not available',
|
|
489
|
+
storageType: knowledgeGraphManager.storageProvider
|
|
490
|
+
? knowledgeGraphManager.storageProvider.constructor.name
|
|
491
|
+
: 'unknown',
|
|
492
|
+
}, null, 2),
|
|
493
|
+
},
|
|
494
|
+
],
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
default:
|
|
498
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
catch (error) {
|
|
502
|
+
throw error;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=callToolHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callToolHandler.js","sourceRoot":"","sources":["../../../src/server/handlers/callToolHandler.ts"],"names":[],"mappings":"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"}
|