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.
Files changed (45) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +166 -0
  3. package/build/__tests__/config/config.test.d.ts +1 -0
  4. package/build/__tests__/config/config.test.js +56 -0
  5. package/build/__tests__/config/config.test.js.map +1 -0
  6. package/build/__tests__/index.test.d.ts +1 -0
  7. package/build/__tests__/index.test.js +25 -0
  8. package/build/__tests__/index.test.js.map +1 -0
  9. package/build/__tests__/integration/server.test.d.ts +1 -0
  10. package/build/__tests__/integration/server.test.js +73 -0
  11. package/build/__tests__/integration/server.test.js.map +1 -0
  12. package/build/__tests__/services/onyxApi.test.d.ts +1 -0
  13. package/build/__tests__/services/onyxApi.test.js +317 -0
  14. package/build/__tests__/services/onyxApi.test.js.map +1 -0
  15. package/build/__tests__/tools/tools.test.d.ts +1 -0
  16. package/build/__tests__/tools/tools.test.js +177 -0
  17. package/build/__tests__/tools/tools.test.js.map +1 -0
  18. package/build/config/index.d.ts +20 -0
  19. package/build/config/index.js +29 -0
  20. package/build/config/index.js.map +1 -0
  21. package/build/index.d.ts +2 -0
  22. package/build/index.js +24 -0
  23. package/build/index.js.map +1 -0
  24. package/build/server.d.ts +21 -0
  25. package/build/server.js +85 -0
  26. package/build/server.js.map +1 -0
  27. package/build/services/onyxApi.d.ts +82 -0
  28. package/build/services/onyxApi.js +367 -0
  29. package/build/services/onyxApi.js.map +1 -0
  30. package/build/tools/chatTool.d.ts +25 -0
  31. package/build/tools/chatTool.js +84 -0
  32. package/build/tools/chatTool.js.map +1 -0
  33. package/build/tools/index.d.ts +7 -0
  34. package/build/tools/index.js +8 -0
  35. package/build/tools/index.js.map +1 -0
  36. package/build/tools/searchTool.d.ts +20 -0
  37. package/build/tools/searchTool.js +55 -0
  38. package/build/tools/searchTool.js.map +1 -0
  39. package/build/tools/summarizeTool.d.ts +20 -0
  40. package/build/tools/summarizeTool.js +106 -0
  41. package/build/tools/summarizeTool.js.map +1 -0
  42. package/build/types/index.d.ts +198 -0
  43. package/build/types/index.js +111 -0
  44. package/build/types/index.js.map +1 -0
  45. 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,7 @@
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';
@@ -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
+ }>;