onyx-kb-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.
- package/LICENSE +1 -0
- package/README.md +166 -0
- package/build/__tests__/config/config.test.d.ts +1 -0
- package/build/__tests__/config/config.test.js +56 -0
- package/build/__tests__/config/config.test.js.map +1 -0
- package/build/__tests__/index.test.d.ts +1 -0
- package/build/__tests__/index.test.js +25 -0
- package/build/__tests__/index.test.js.map +1 -0
- package/build/__tests__/integration/server.test.d.ts +1 -0
- package/build/__tests__/integration/server.test.js +73 -0
- package/build/__tests__/integration/server.test.js.map +1 -0
- package/build/__tests__/services/onyxApi.test.d.ts +1 -0
- package/build/__tests__/services/onyxApi.test.js +317 -0
- package/build/__tests__/services/onyxApi.test.js.map +1 -0
- package/build/__tests__/tools/tools.test.d.ts +1 -0
- package/build/__tests__/tools/tools.test.js +177 -0
- package/build/__tests__/tools/tools.test.js.map +1 -0
- package/build/config/index.d.ts +20 -0
- package/build/config/index.js +29 -0
- package/build/config/index.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +24 -0
- package/build/index.js.map +1 -0
- package/build/server.d.ts +21 -0
- package/build/server.js +85 -0
- package/build/server.js.map +1 -0
- package/build/services/onyxApi.d.ts +82 -0
- package/build/services/onyxApi.js +367 -0
- package/build/services/onyxApi.js.map +1 -0
- package/build/tools/chatTool.d.ts +25 -0
- package/build/tools/chatTool.js +84 -0
- package/build/tools/chatTool.js.map +1 -0
- package/build/tools/index.d.ts +7 -0
- package/build/tools/index.js +8 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/searchTool.d.ts +20 -0
- package/build/tools/searchTool.js +55 -0
- package/build/tools/searchTool.js.map +1 -0
- package/build/tools/summarizeTool.d.ts +20 -0
- package/build/tools/summarizeTool.js +106 -0
- package/build/tools/summarizeTool.js.map +1 -0
- package/build/types/index.d.ts +198 -0
- package/build/types/index.js +111 -0
- package/build/types/index.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Onyx API Service
|
|
3
|
+
* Handles all interactions with the Onyx API
|
|
4
|
+
*/
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import { DEBUG } from '../config/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* OnyxApiService class for interacting with the Onyx API
|
|
9
|
+
*/
|
|
10
|
+
export class OnyxApiService {
|
|
11
|
+
/**
|
|
12
|
+
* Constructor
|
|
13
|
+
* @param config The Onyx configuration
|
|
14
|
+
*/
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Search Onyx for relevant documents
|
|
20
|
+
* @param query The search query
|
|
21
|
+
* @param documentSets Optional document sets to search within
|
|
22
|
+
* @param chunksAbove Number of chunks to include above the matching chunk
|
|
23
|
+
* @param chunksBelow Number of chunks to include below the matching chunk
|
|
24
|
+
* @returns Array of search results
|
|
25
|
+
*/
|
|
26
|
+
async searchOnyx(query, documentSets = [], chunksAbove = 0, chunksBelow = 0) {
|
|
27
|
+
try {
|
|
28
|
+
const response = await axios.post(`${this.config.apiUrl}/admin/search`, {
|
|
29
|
+
query,
|
|
30
|
+
filters: {
|
|
31
|
+
document_set: documentSets.length > 0 ? documentSets : null,
|
|
32
|
+
source_type: null,
|
|
33
|
+
time_cutoff: null,
|
|
34
|
+
tags: null
|
|
35
|
+
},
|
|
36
|
+
chunks_above: chunksAbove,
|
|
37
|
+
chunks_below: chunksBelow,
|
|
38
|
+
evaluation_type: 'skip' // Disable LLM filtering - return all semantic matches, let Claude filter
|
|
39
|
+
}, {
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
'Authorization': `Bearer ${this.config.apiToken}`
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return response.data.top_documents || response.data.documents || [];
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error('Error searching Onyx:', error);
|
|
49
|
+
throw new Error(`Failed to search Onyx: ${error instanceof Error ? error.message : String(error)}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Fetch a specific chunk from a document
|
|
54
|
+
* @param documentId The document ID
|
|
55
|
+
* @param chunkId The chunk ID
|
|
56
|
+
* @returns The chunk content
|
|
57
|
+
*/
|
|
58
|
+
async fetchDocumentChunk(documentId, chunkId) {
|
|
59
|
+
try {
|
|
60
|
+
const encodedDocId = encodeURIComponent(documentId);
|
|
61
|
+
const response = await axios.get(`${this.config.apiUrl}/document/chunk-info?document_id=${encodedDocId}&chunk_id=${chunkId}`, {
|
|
62
|
+
headers: {
|
|
63
|
+
'Authorization': `Bearer ${this.config.apiToken}`
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return response.data.content || '';
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error(`Error fetching chunk ${chunkId} for document ${documentId}:`, error);
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Fetch the full content of a document by retrieving all its chunks
|
|
75
|
+
* @param documentId The document ID
|
|
76
|
+
* @returns The full document content
|
|
77
|
+
*/
|
|
78
|
+
async fetchDocumentContent(documentId) {
|
|
79
|
+
try {
|
|
80
|
+
const encodedDocId = encodeURIComponent(documentId);
|
|
81
|
+
// First get document info to know how many chunks there are
|
|
82
|
+
const infoResponse = await axios.get(`${this.config.apiUrl}/document/document-size-info?document_id=${encodedDocId}`, {
|
|
83
|
+
headers: {
|
|
84
|
+
'Authorization': `Bearer ${this.config.apiToken}`
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
const numChunks = infoResponse.data.num_chunks;
|
|
88
|
+
// Fetch all chunks and combine them
|
|
89
|
+
let fullContent = '';
|
|
90
|
+
for (let i = 0; i < numChunks; i++) {
|
|
91
|
+
const chunkResponse = await axios.get(`${this.config.apiUrl}/document/chunk-info?document_id=${encodedDocId}&chunk_id=${i}`, {
|
|
92
|
+
headers: {
|
|
93
|
+
'Authorization': `Bearer ${this.config.apiToken}`
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
fullContent += chunkResponse.data.content + '\n\n';
|
|
97
|
+
}
|
|
98
|
+
return fullContent;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(`Error fetching full content for document ${documentId}:`, error);
|
|
102
|
+
return '';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create a new chat session
|
|
107
|
+
* @param personaId The persona ID to use
|
|
108
|
+
* @returns The chat session ID
|
|
109
|
+
*/
|
|
110
|
+
async createChatSession(personaId) {
|
|
111
|
+
console.error(`Creating new chat session with persona_id: ${personaId}`);
|
|
112
|
+
const createSessionUrl = `${this.config.apiUrl}/chat/create-chat-session`;
|
|
113
|
+
console.error(`Sending request to: ${createSessionUrl}`);
|
|
114
|
+
try {
|
|
115
|
+
const chatSessionResponse = await axios.post(createSessionUrl, {
|
|
116
|
+
persona_id: personaId,
|
|
117
|
+
description: 'API Test Chat'
|
|
118
|
+
}, {
|
|
119
|
+
headers: {
|
|
120
|
+
'Content-Type': 'application/json',
|
|
121
|
+
'Authorization': `Bearer ${this.config.apiToken}`
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
if (DEBUG) {
|
|
125
|
+
console.error(`Chat session response: ${JSON.stringify(chatSessionResponse.data)}`);
|
|
126
|
+
console.error(`Response status: ${chatSessionResponse.status}`);
|
|
127
|
+
console.error(`Response headers: ${JSON.stringify(chatSessionResponse.headers)}`);
|
|
128
|
+
}
|
|
129
|
+
const sessionId = chatSessionResponse.data.chat_session_id;
|
|
130
|
+
console.error(`Chat session created with ID: ${sessionId}`);
|
|
131
|
+
return sessionId;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Error creating chat session:', error);
|
|
135
|
+
throw new Error(`Failed to create chat session: ${error instanceof Error ? error.message : String(error)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Send a message to a chat session
|
|
140
|
+
* @param sessionId The chat session ID
|
|
141
|
+
* @param query The message to send
|
|
142
|
+
* @param documentSets Optional document sets to search within
|
|
143
|
+
* @returns The chat response
|
|
144
|
+
*/
|
|
145
|
+
async sendChatMessage(sessionId, query, documentSets = []) {
|
|
146
|
+
const sendMessageUrl = `${this.config.apiUrl}/chat/send-message`;
|
|
147
|
+
console.error(`Sending message to: ${sendMessageUrl}`);
|
|
148
|
+
console.error(`With chat_session_id: ${sessionId}`);
|
|
149
|
+
// Build filters - only include document_set if explicitly specified
|
|
150
|
+
// Otherwise, let the persona's configured document sets be used
|
|
151
|
+
const filters = {
|
|
152
|
+
source_type: null,
|
|
153
|
+
time_cutoff: null,
|
|
154
|
+
tags: null
|
|
155
|
+
};
|
|
156
|
+
// Only add document_set filter if user explicitly specified document sets
|
|
157
|
+
if (documentSets.length > 0) {
|
|
158
|
+
filters.document_set = documentSets;
|
|
159
|
+
}
|
|
160
|
+
const messagePayload = {
|
|
161
|
+
chat_session_id: sessionId,
|
|
162
|
+
parent_message_id: null,
|
|
163
|
+
message: query,
|
|
164
|
+
search_doc_ids: [],
|
|
165
|
+
file_descriptors: [],
|
|
166
|
+
prompt_id: null,
|
|
167
|
+
retrieval_options: {
|
|
168
|
+
run_search: 'auto',
|
|
169
|
+
real_time: true,
|
|
170
|
+
filters
|
|
171
|
+
},
|
|
172
|
+
regenerate: false
|
|
173
|
+
};
|
|
174
|
+
if (DEBUG) {
|
|
175
|
+
console.error('=== DEBUG INFO ===');
|
|
176
|
+
console.error(`API URL: ${this.config.apiUrl}`);
|
|
177
|
+
console.error(`Send Message URL: ${sendMessageUrl}`);
|
|
178
|
+
console.error(`Message Payload: ${JSON.stringify(messagePayload)}`);
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const messageResponse = await axios.post(sendMessageUrl, messagePayload, {
|
|
182
|
+
headers: {
|
|
183
|
+
'Content-Type': 'application/json',
|
|
184
|
+
'Authorization': `Bearer ${this.config.apiToken}`
|
|
185
|
+
},
|
|
186
|
+
responseType: 'text'
|
|
187
|
+
});
|
|
188
|
+
// Get the response text
|
|
189
|
+
const responseText = messageResponse.data;
|
|
190
|
+
if (DEBUG) {
|
|
191
|
+
console.error(`Response status: ${messageResponse.status}`);
|
|
192
|
+
console.error(`Response headers: ${JSON.stringify(messageResponse.headers)}`);
|
|
193
|
+
console.error(`Response text (first 200 chars): ${responseText.substring(0, 200)}...`);
|
|
194
|
+
}
|
|
195
|
+
// Initialize variables for answer and documents
|
|
196
|
+
let answer = '';
|
|
197
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
198
|
+
let documents = [];
|
|
199
|
+
try {
|
|
200
|
+
// First try parsing as a single JSON object
|
|
201
|
+
const jsonResponse = JSON.parse(responseText);
|
|
202
|
+
if (DEBUG) {
|
|
203
|
+
console.error(`Parsed response as single JSON: ${Object.keys(jsonResponse).join(', ')}`);
|
|
204
|
+
}
|
|
205
|
+
if (jsonResponse.answer) {
|
|
206
|
+
answer = jsonResponse.answer;
|
|
207
|
+
}
|
|
208
|
+
if (jsonResponse.documents || jsonResponse.top_documents) {
|
|
209
|
+
documents = jsonResponse.documents || jsonResponse.top_documents || [];
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (e) {
|
|
213
|
+
// If that fails, try parsing as JSON lines (streaming response)
|
|
214
|
+
console.error(`Failed to parse as single JSON, trying JSON lines: ${e}`);
|
|
215
|
+
const responseLines = responseText.split('\n').filter(line => line.trim());
|
|
216
|
+
for (const line of responseLines) {
|
|
217
|
+
try {
|
|
218
|
+
const data = JSON.parse(line);
|
|
219
|
+
// Handle legacy format
|
|
220
|
+
if (data.answer_piece) {
|
|
221
|
+
answer += data.answer_piece;
|
|
222
|
+
}
|
|
223
|
+
else if (data.top_documents) {
|
|
224
|
+
documents = data.top_documents;
|
|
225
|
+
}
|
|
226
|
+
// Handle new streaming format: {"ind": X, "obj": {...}}
|
|
227
|
+
if (data.obj) {
|
|
228
|
+
const obj = data.obj;
|
|
229
|
+
// Message content delta
|
|
230
|
+
if (obj.type === 'message_delta' && obj.content) {
|
|
231
|
+
answer += obj.content;
|
|
232
|
+
}
|
|
233
|
+
// Search results with documents
|
|
234
|
+
if (obj.type === 'internal_search_tool_delta' && obj.documents && obj.documents.length > 0) {
|
|
235
|
+
documents = obj.documents.map((doc) => ({
|
|
236
|
+
document_id: doc.document_id,
|
|
237
|
+
semantic_identifier: doc.semantic_identifier || '',
|
|
238
|
+
link: doc.link,
|
|
239
|
+
score: doc.score
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (parseError) {
|
|
245
|
+
// Skip invalid JSON lines
|
|
246
|
+
if (DEBUG) {
|
|
247
|
+
console.error(`Error parsing line: ${parseError}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return { answer, documents };
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
console.error('Error sending chat message:', error);
|
|
256
|
+
if (axios.isAxiosError(error) && error.response) {
|
|
257
|
+
console.error('=== ERROR DETAILS ===');
|
|
258
|
+
console.error(`Response status: ${error.response?.status}`);
|
|
259
|
+
console.error(`Response data: ${JSON.stringify(error.response?.data)}`);
|
|
260
|
+
if (DEBUG) {
|
|
261
|
+
console.error(`Request URL: ${error.config?.url}`);
|
|
262
|
+
console.error(`Request method: ${error.config?.method}`);
|
|
263
|
+
console.error(`Request headers: ${JSON.stringify(error.config?.headers)}`);
|
|
264
|
+
console.error(`Request data: ${JSON.stringify(error.config?.data)}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
throw new Error(`Error chatting with Onyx: ${error instanceof Error ? error.message : String(error)}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Build a comprehensive context from search results and content
|
|
272
|
+
* @param results The search results
|
|
273
|
+
* @param contents The content for each result
|
|
274
|
+
* @returns Formatted context string
|
|
275
|
+
*/
|
|
276
|
+
buildContext(results, contents) {
|
|
277
|
+
let contextBuilder = '';
|
|
278
|
+
// Filter to valid results
|
|
279
|
+
const validResults = [];
|
|
280
|
+
for (let i = 0; i < results.length; i++) {
|
|
281
|
+
if (contents[i]) {
|
|
282
|
+
validResults.push({ result: results[i], content: contents[i], index: i });
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// START with a summary of ALL sources found
|
|
286
|
+
contextBuilder += '## Search Results Summary\n';
|
|
287
|
+
contextBuilder += `**Found ${validResults.length} documents. All sources:**\n\n`;
|
|
288
|
+
validResults.forEach((item, i) => {
|
|
289
|
+
const link = item.result.link || item.result.document_id;
|
|
290
|
+
const name = item.result.semantic_identifier;
|
|
291
|
+
if (link.startsWith('http')) {
|
|
292
|
+
contextBuilder += `${i + 1}. [${name}](${link})\n`;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
contextBuilder += `${i + 1}. ${name}\n`;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
contextBuilder += '\n---\n\n## Full Content\n\n';
|
|
299
|
+
// Add full content for each result
|
|
300
|
+
for (let i = 0; i < validResults.length; i++) {
|
|
301
|
+
const { result, content } = validResults[i];
|
|
302
|
+
contextBuilder += `### [${i + 1}/${validResults.length}] ${result.semantic_identifier}\n`;
|
|
303
|
+
contextBuilder += `**Source:** ${result.link || result.document_id}\n\n`;
|
|
304
|
+
contextBuilder += content;
|
|
305
|
+
contextBuilder += '\n\n---\n\n';
|
|
306
|
+
}
|
|
307
|
+
// END with reminder to check all results
|
|
308
|
+
contextBuilder += '\n## END OF RESULTS\n';
|
|
309
|
+
contextBuilder += `Total: ${validResults.length} documents. Make sure you reviewed all of them above.\n`;
|
|
310
|
+
return contextBuilder;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* List all available personas/agents
|
|
314
|
+
* @returns Array of personas
|
|
315
|
+
*/
|
|
316
|
+
async listPersonas() {
|
|
317
|
+
try {
|
|
318
|
+
const response = await axios.get(`${this.config.apiUrl}/persona`, {
|
|
319
|
+
headers: {
|
|
320
|
+
'Authorization': `Bearer ${this.config.apiToken}`
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
return response.data || [];
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
console.error('Error listing personas:', error);
|
|
327
|
+
throw new Error(`Failed to list personas: ${error instanceof Error ? error.message : String(error)}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Find a persona by name (case-insensitive)
|
|
332
|
+
* @param name The persona name to search for
|
|
333
|
+
* @returns The persona ID and name if found, null otherwise
|
|
334
|
+
*/
|
|
335
|
+
async findPersonaByName(name) {
|
|
336
|
+
try {
|
|
337
|
+
const personas = await this.listPersonas();
|
|
338
|
+
console.error(`Found ${personas.length} personas. Available: ${personas.map(p => `"${p.name}" (${p.id})`).join(', ')}`);
|
|
339
|
+
const normalizedName = name.toLowerCase().trim();
|
|
340
|
+
// Try exact match first (case-insensitive)
|
|
341
|
+
const exactMatch = personas.find(p => p.name.toLowerCase().trim() === normalizedName);
|
|
342
|
+
if (exactMatch) {
|
|
343
|
+
console.error(`Found exact persona match: "${exactMatch.name}" (ID: ${exactMatch.id})`);
|
|
344
|
+
return { id: exactMatch.id, name: exactMatch.name };
|
|
345
|
+
}
|
|
346
|
+
// Try partial match (name contains search term)
|
|
347
|
+
const partialMatch = personas.find(p => p.name.toLowerCase().includes(normalizedName));
|
|
348
|
+
if (partialMatch) {
|
|
349
|
+
console.error(`Found partial persona match: "${partialMatch.name}" (ID: ${partialMatch.id})`);
|
|
350
|
+
return { id: partialMatch.id, name: partialMatch.name };
|
|
351
|
+
}
|
|
352
|
+
// Try if search term contains persona name
|
|
353
|
+
const reverseMatch = personas.find(p => normalizedName.includes(p.name.toLowerCase().trim()));
|
|
354
|
+
if (reverseMatch) {
|
|
355
|
+
console.error(`Found reverse persona match: "${reverseMatch.name}" (ID: ${reverseMatch.id})`);
|
|
356
|
+
return { id: reverseMatch.id, name: reverseMatch.name };
|
|
357
|
+
}
|
|
358
|
+
console.error(`No persona found matching "${name}".`);
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
console.error('Error finding persona by name:', error);
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=onyxApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onyxApi.js","sourceRoot":"","sources":["../../src/services/onyxApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { OnyxApiService } from '../services/onyxApi.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the chat_with_onyx tool request
|
|
4
|
+
* @param args The tool arguments
|
|
5
|
+
* @param onyxApiService The Onyx API service
|
|
6
|
+
* @returns The tool response
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleChatWithOnyx(args: unknown, onyxApiService: OnyxApiService): Promise<{
|
|
9
|
+
content: {
|
|
10
|
+
type: string;
|
|
11
|
+
text: string;
|
|
12
|
+
metadata: {
|
|
13
|
+
chat_session_id: string;
|
|
14
|
+
persona_id: number;
|
|
15
|
+
persona_name: string | null;
|
|
16
|
+
};
|
|
17
|
+
}[];
|
|
18
|
+
isError?: undefined;
|
|
19
|
+
} | {
|
|
20
|
+
content: {
|
|
21
|
+
type: string;
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
isError: boolean;
|
|
25
|
+
}>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Tool Handler
|
|
3
|
+
* Handles the chat_with_onyx tool requests
|
|
4
|
+
*/
|
|
5
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
const DEFAULT_PERSONA_ID = parseInt(process.env.DEFAULT_PERSONA_ID || '15', 10);
|
|
7
|
+
/**
|
|
8
|
+
* Handle the chat_with_onyx tool request
|
|
9
|
+
* @param args The tool arguments
|
|
10
|
+
* @param onyxApiService The Onyx API service
|
|
11
|
+
* @returns The tool response
|
|
12
|
+
*/
|
|
13
|
+
export async function handleChatWithOnyx(args, onyxApiService) {
|
|
14
|
+
try {
|
|
15
|
+
if (typeof args !== 'object' || args === null) {
|
|
16
|
+
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments');
|
|
17
|
+
}
|
|
18
|
+
const { query, personaId: providedPersonaId, personaName, documentSets = [],
|
|
19
|
+
// Unused parameter removed: enableAutoDetectFilters
|
|
20
|
+
chatSessionId = null } = args;
|
|
21
|
+
if (!query || typeof query !== 'string') {
|
|
22
|
+
throw new McpError(ErrorCode.InvalidParams, 'Query is required');
|
|
23
|
+
}
|
|
24
|
+
// Resolve persona ID from name if provided
|
|
25
|
+
let resolvedPersonaId = providedPersonaId ?? DEFAULT_PERSONA_ID;
|
|
26
|
+
let resolvedPersonaName = null;
|
|
27
|
+
let personaLookupMessage = '';
|
|
28
|
+
if (personaName && typeof personaName === 'string') {
|
|
29
|
+
console.error(`Looking up persona by name: "${personaName}"`);
|
|
30
|
+
const result = await onyxApiService.findPersonaByName(personaName);
|
|
31
|
+
if (result !== null) {
|
|
32
|
+
resolvedPersonaId = result.id;
|
|
33
|
+
resolvedPersonaName = result.name;
|
|
34
|
+
personaLookupMessage = `Persona found: "${resolvedPersonaName}" (ID: ${resolvedPersonaId})`;
|
|
35
|
+
console.error(personaLookupMessage);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
personaLookupMessage = `Persona "${personaName}" not found, using default (ID: ${resolvedPersonaId})`;
|
|
39
|
+
console.error(personaLookupMessage);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Variable to store the chat session ID (either existing or new)
|
|
43
|
+
let sessionId = chatSessionId;
|
|
44
|
+
// Step 1: Create a chat session if one doesn't exist
|
|
45
|
+
if (!sessionId) {
|
|
46
|
+
sessionId = await onyxApiService.createChatSession(resolvedPersonaId);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.error(`Using existing chat session with ID: ${sessionId}`);
|
|
50
|
+
}
|
|
51
|
+
// Step 2: Send a message to the chat session
|
|
52
|
+
const { answer, documents } = await onyxApiService.sendChatMessage(sessionId, query, documentSets);
|
|
53
|
+
// Build persona info for response
|
|
54
|
+
const personaInfo = resolvedPersonaName
|
|
55
|
+
? `Persona: "${resolvedPersonaName}" (ID: ${resolvedPersonaId})`
|
|
56
|
+
: `Persona ID: ${resolvedPersonaId}`;
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: `${answer}\n\nSources:\n${documents.map(doc => `- ${doc.semantic_identifier || 'Unknown'} (${doc.document_id || 'Unknown ID'})`).join('\n')}\n\n---\n${personaInfo}\nChat Session ID: ${sessionId}`,
|
|
62
|
+
metadata: {
|
|
63
|
+
chat_session_id: sessionId,
|
|
64
|
+
persona_id: resolvedPersonaId,
|
|
65
|
+
persona_name: resolvedPersonaName
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('Error in handleChatWithOnyx:', error);
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: 'text',
|
|
77
|
+
text: `Error chatting with Onyx: ${error instanceof Error ? error.message : String(error)}`
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
isError: true
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=chatTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatTool.js","sourceRoot":"","sources":["../../src/tools/chatTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Handlers
|
|
3
|
+
* Exports all tool handlers for the Arqitech MCP Server
|
|
4
|
+
*/
|
|
5
|
+
export { handleSearchOnyx } from './searchTool.js';
|
|
6
|
+
export { handleChatWithOnyx } from './chatTool.js';
|
|
7
|
+
export { handleSummarizeArq } from './summarizeTool.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { OnyxApiService } from '../services/onyxApi.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the search_arq tool request
|
|
4
|
+
* @param args The tool arguments
|
|
5
|
+
* @param onyxApiService The Onyx API service
|
|
6
|
+
* @returns The tool response
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleSearchOnyx(args: unknown, onyxApiService: OnyxApiService): Promise<{
|
|
9
|
+
content: {
|
|
10
|
+
type: string;
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
content: {
|
|
16
|
+
type: string;
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
isError: boolean;
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search Tool Handler
|
|
3
|
+
* Handles the search_arq tool requests
|
|
4
|
+
*/
|
|
5
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Handle the search_arq tool request
|
|
8
|
+
* @param args The tool arguments
|
|
9
|
+
* @param onyxApiService The Onyx API service
|
|
10
|
+
* @returns The tool response
|
|
11
|
+
*/
|
|
12
|
+
export async function handleSearchOnyx(args, onyxApiService) {
|
|
13
|
+
try {
|
|
14
|
+
if (typeof args !== 'object' || args === null) {
|
|
15
|
+
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments');
|
|
16
|
+
}
|
|
17
|
+
const { query, documentSets = [], maxResults = 10, chunksAbove = 1, chunksBelow = 1, retrieveFullDocuments = false } = args;
|
|
18
|
+
if (!query || typeof query !== 'string') {
|
|
19
|
+
throw new McpError(ErrorCode.InvalidParams, 'Query is required');
|
|
20
|
+
}
|
|
21
|
+
// Step 1: Perform semantic search to find relevant documents
|
|
22
|
+
const searchResults = await onyxApiService.searchOnyx(query, documentSets, chunksAbove, chunksBelow);
|
|
23
|
+
// Step 2: Get the most relevant results
|
|
24
|
+
const relevantResults = searchResults
|
|
25
|
+
.sort((a, b) => b.score - a.score)
|
|
26
|
+
.slice(0, maxResults);
|
|
27
|
+
// Step 3: For each relevant document, fetch either the specific chunk or full document content
|
|
28
|
+
const relevantContent = await Promise.all(relevantResults.map(result => retrieveFullDocuments
|
|
29
|
+
? onyxApiService.fetchDocumentContent(result.document_id)
|
|
30
|
+
: onyxApiService.fetchDocumentChunk(result.document_id, result.chunk_ind)));
|
|
31
|
+
// Step 4: Combine into comprehensive context
|
|
32
|
+
const context = onyxApiService.buildContext(relevantResults, relevantContent);
|
|
33
|
+
return {
|
|
34
|
+
content: [
|
|
35
|
+
{
|
|
36
|
+
type: 'text',
|
|
37
|
+
text: context,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error('Error in handleSearchOnyx:', error);
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'text',
|
|
48
|
+
text: `Error searching Onyx: ${error instanceof Error ? error.message : String(error)}`,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
isError: true,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=searchTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchTool.js","sourceRoot":"","sources":["../../src/tools/searchTool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAIzE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa,EAAE,cAA8B;IAClF,IAAI,CAAC;QACH,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,EACJ,KAAK,EACL,YAAY,GAAG,EAAE,EACjB,UAAU,GAAG,EAAE,EACf,WAAW,GAAG,CAAC,EACf,WAAW,GAAG,CAAC,EACf,qBAAqB,GAAG,KAAK,EAC9B,GAAG,IAAoB,CAAC;QAEzB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QACnE,CAAC;QAED,6DAA6D;QAC7D,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAErG,wCAAwC;QACxC,MAAM,eAAe,GAAG,aAAa;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAExB,+FAA+F;QAC/F,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC3B,qBAAqB;YACnB,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC;YACzD,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAC5E,CACF,CAAC;QAEF,6CAA6C;QAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QAE9E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO;iBACd;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACxF;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { OnyxApiService } from '../services/onyxApi.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the summarize_arq tool request
|
|
4
|
+
* @param args The tool arguments
|
|
5
|
+
* @param onyxApiService The Onyx API service
|
|
6
|
+
* @returns The tool response with executive summary
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleSummarizeArq(args: unknown, onyxApiService: OnyxApiService): Promise<{
|
|
9
|
+
content: {
|
|
10
|
+
type: string;
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
content: {
|
|
16
|
+
type: string;
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
isError: boolean;
|
|
20
|
+
}>;
|