@iflow-mcp/lupuletic-onyx-mcp-server 1.2.2

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 (43) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +314 -0
  4. package/build/__tests__/config/config.test.d.ts +1 -0
  5. package/build/__tests__/config/config.test.js +56 -0
  6. package/build/__tests__/config/config.test.js.map +1 -0
  7. package/build/__tests__/index.test.d.ts +1 -0
  8. package/build/__tests__/index.test.js +25 -0
  9. package/build/__tests__/index.test.js.map +1 -0
  10. package/build/__tests__/integration/server.test.d.ts +1 -0
  11. package/build/__tests__/integration/server.test.js +73 -0
  12. package/build/__tests__/integration/server.test.js.map +1 -0
  13. package/build/__tests__/services/onyxApi.test.d.ts +1 -0
  14. package/build/__tests__/services/onyxApi.test.js +317 -0
  15. package/build/__tests__/services/onyxApi.test.js.map +1 -0
  16. package/build/__tests__/tools/tools.test.d.ts +1 -0
  17. package/build/__tests__/tools/tools.test.js +177 -0
  18. package/build/__tests__/tools/tools.test.js.map +1 -0
  19. package/build/config/index.d.ts +20 -0
  20. package/build/config/index.js +26 -0
  21. package/build/config/index.js.map +1 -0
  22. package/build/index.d.ts +2 -0
  23. package/build/index.js +24 -0
  24. package/build/index.js.map +1 -0
  25. package/build/server.d.ts +21 -0
  26. package/build/server.js +82 -0
  27. package/build/server.js.map +1 -0
  28. package/build/services/onyxApi.d.ts +68 -0
  29. package/build/services/onyxApi.js +272 -0
  30. package/build/services/onyxApi.js.map +1 -0
  31. package/build/tools/chatTool.d.ts +23 -0
  32. package/build/tools/chatTool.js +60 -0
  33. package/build/tools/chatTool.js.map +1 -0
  34. package/build/tools/index.d.ts +6 -0
  35. package/build/tools/index.js +7 -0
  36. package/build/tools/index.js.map +1 -0
  37. package/build/tools/searchTool.d.ts +20 -0
  38. package/build/tools/searchTool.js +55 -0
  39. package/build/tools/searchTool.js.map +1 -0
  40. package/build/types/index.d.ts +157 -0
  41. package/build/types/index.js +86 -0
  42. package/build/types/index.js.map +1 -0
  43. package/package.json +1 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Onyx MCP Server
3
+ * Main server class for the Onyx MCP Server
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
7
+ import { OnyxApiService } from './services/onyxApi.js';
8
+ import { loadConfig, SERVER_CONFIG } from './config/index.js';
9
+ import { handleSearchOnyx, handleChatWithOnyx } from './tools/index.js';
10
+ import { toolSchemas } from './types/index.js';
11
+ /**
12
+ * OnyxMcpServer class
13
+ * Main server class for the Onyx MCP Server
14
+ */
15
+ export class OnyxMcpServer {
16
+ /**
17
+ * Constructor
18
+ */
19
+ constructor() {
20
+ this.server = new Server({
21
+ name: SERVER_CONFIG.name,
22
+ version: SERVER_CONFIG.version,
23
+ }, {
24
+ capabilities: {
25
+ resources: {},
26
+ tools: {},
27
+ },
28
+ });
29
+ // Get configuration from environment variables
30
+ const config = loadConfig();
31
+ this.onyxApiService = new OnyxApiService(config);
32
+ this.setupToolHandlers();
33
+ // Error handling
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ this.server.onerror = (error) => console.error('[MCP Error]', error);
36
+ process.on('SIGINT', async () => {
37
+ await this.server.close();
38
+ process.exit(0);
39
+ });
40
+ }
41
+ /**
42
+ * Set up tool handlers
43
+ */
44
+ setupToolHandlers() {
45
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
46
+ switch (request.params.name) {
47
+ case 'search_onyx':
48
+ return handleSearchOnyx(request.params.arguments, this.onyxApiService);
49
+ case 'chat_with_onyx':
50
+ return handleChatWithOnyx(request.params.arguments, this.onyxApiService);
51
+ default:
52
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}`);
53
+ }
54
+ });
55
+ }
56
+ /**
57
+ * Run the server
58
+ * @param transport The server transport
59
+ */
60
+ // Using any for transport as the Transport type is not exported from the SDK
61
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
+ async run(transport) {
63
+ // Set up request handlers before connecting
64
+ this.setupToolHandlers();
65
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
66
+ return {
67
+ tools: [
68
+ toolSchemas.search_onyx,
69
+ toolSchemas.chat_with_onyx,
70
+ ],
71
+ };
72
+ });
73
+ // Connect to the transport
74
+ await this.server.connect(transport);
75
+ // For testing purposes, if the transport has a setupForTest method, call it
76
+ if (transport.setupForTest && typeof transport.setupForTest === 'function') {
77
+ transport.setupForTest();
78
+ }
79
+ console.error('Onyx MCP Server running on stdio');
80
+ }
81
+ }
82
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { OnyxConfig, OnyxSearchResult } from '../types/index.js';
2
+ /**
3
+ * Document interface for chat responses
4
+ */
5
+ interface OnyxDocument {
6
+ document_id: string;
7
+ semantic_identifier: string;
8
+ score?: number;
9
+ link?: string;
10
+ }
11
+ /**
12
+ * OnyxApiService class for interacting with the Onyx API
13
+ */
14
+ export declare class OnyxApiService {
15
+ private config;
16
+ /**
17
+ * Constructor
18
+ * @param config The Onyx configuration
19
+ */
20
+ constructor(config: OnyxConfig);
21
+ /**
22
+ * Search Onyx for relevant documents
23
+ * @param query The search query
24
+ * @param documentSets Optional document sets to search within
25
+ * @param chunksAbove Number of chunks to include above the matching chunk
26
+ * @param chunksBelow Number of chunks to include below the matching chunk
27
+ * @returns Array of search results
28
+ */
29
+ searchOnyx(query: string, documentSets?: string[], chunksAbove?: number, chunksBelow?: number): Promise<OnyxSearchResult[]>;
30
+ /**
31
+ * Fetch a specific chunk from a document
32
+ * @param documentId The document ID
33
+ * @param chunkId The chunk ID
34
+ * @returns The chunk content
35
+ */
36
+ fetchDocumentChunk(documentId: string, chunkId: number): Promise<string>;
37
+ /**
38
+ * Fetch the full content of a document by retrieving all its chunks
39
+ * @param documentId The document ID
40
+ * @returns The full document content
41
+ */
42
+ fetchDocumentContent(documentId: string): Promise<string>;
43
+ /**
44
+ * Create a new chat session
45
+ * @param personaId The persona ID to use
46
+ * @returns The chat session ID
47
+ */
48
+ createChatSession(personaId: number): Promise<string>;
49
+ /**
50
+ * Send a message to a chat session
51
+ * @param sessionId The chat session ID
52
+ * @param query The message to send
53
+ * @param documentSets Optional document sets to search within
54
+ * @returns The chat response
55
+ */
56
+ sendChatMessage(sessionId: string, query: string, documentSets?: string[]): Promise<{
57
+ answer: string;
58
+ documents: OnyxDocument[];
59
+ }>;
60
+ /**
61
+ * Build a comprehensive context from search results and content
62
+ * @param results The search results
63
+ * @param contents The content for each result
64
+ * @returns Formatted context string
65
+ */
66
+ buildContext(results: OnyxSearchResult[], contents: string[]): string;
67
+ }
68
+ export {};
@@ -0,0 +1,272 @@
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: 'basic' // Enable LLM relevance filtering
39
+ }, {
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ 'Authorization': `Bearer ${this.config.apiToken}`
43
+ }
44
+ });
45
+ return 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
+ const messagePayload = {
150
+ chat_session_id: sessionId,
151
+ parent_message_id: null,
152
+ message: query,
153
+ search_doc_ids: [],
154
+ file_descriptors: [],
155
+ prompt_id: null,
156
+ retrieval_options: {
157
+ run_search: 'auto',
158
+ real_time: true,
159
+ filters: {
160
+ document_set: documentSets.length > 0 ? documentSets : null,
161
+ source_type: null,
162
+ time_cutoff: null,
163
+ tags: null
164
+ }
165
+ },
166
+ regenerate: false
167
+ };
168
+ if (DEBUG) {
169
+ console.error('=== DEBUG INFO ===');
170
+ console.error(`API URL: ${this.config.apiUrl}`);
171
+ console.error(`Send Message URL: ${sendMessageUrl}`);
172
+ console.error(`Message Payload: ${JSON.stringify(messagePayload)}`);
173
+ }
174
+ try {
175
+ const messageResponse = await axios.post(sendMessageUrl, messagePayload, {
176
+ headers: {
177
+ 'Content-Type': 'application/json',
178
+ 'Authorization': `Bearer ${this.config.apiToken}`
179
+ },
180
+ responseType: 'text'
181
+ });
182
+ // Get the response text
183
+ const responseText = messageResponse.data;
184
+ if (DEBUG) {
185
+ console.error(`Response status: ${messageResponse.status}`);
186
+ console.error(`Response headers: ${JSON.stringify(messageResponse.headers)}`);
187
+ console.error(`Response text (first 200 chars): ${responseText.substring(0, 200)}...`);
188
+ }
189
+ // Initialize variables for answer and documents
190
+ let answer = '';
191
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
192
+ let documents = [];
193
+ try {
194
+ // First try parsing as a single JSON object
195
+ const jsonResponse = JSON.parse(responseText);
196
+ if (DEBUG) {
197
+ console.error(`Parsed response as single JSON: ${Object.keys(jsonResponse).join(', ')}`);
198
+ }
199
+ if (jsonResponse.answer) {
200
+ answer = jsonResponse.answer;
201
+ }
202
+ if (jsonResponse.documents || jsonResponse.top_documents) {
203
+ documents = jsonResponse.documents || jsonResponse.top_documents || [];
204
+ }
205
+ }
206
+ catch (e) {
207
+ // If that fails, try parsing as JSON lines
208
+ console.error(`Failed to parse as single JSON, trying JSON lines: ${e}`);
209
+ const responseLines = responseText.split('\n').filter(line => line.trim());
210
+ for (const line of responseLines) {
211
+ try {
212
+ const data = JSON.parse(line);
213
+ if (DEBUG) {
214
+ console.error(`Parsed line data type: ${Object.keys(data).join(', ')}`);
215
+ }
216
+ if (data.answer_piece) {
217
+ answer += data.answer_piece;
218
+ }
219
+ else if (data.top_documents) {
220
+ documents = data.top_documents;
221
+ }
222
+ }
223
+ catch (e) {
224
+ // Skip invalid JSON
225
+ console.error(`Error parsing line: ${e}`);
226
+ }
227
+ }
228
+ }
229
+ return { answer, documents };
230
+ }
231
+ catch (error) {
232
+ console.error('Error sending chat message:', error);
233
+ if (axios.isAxiosError(error) && error.response) {
234
+ console.error('=== ERROR DETAILS ===');
235
+ console.error(`Response status: ${error.response?.status}`);
236
+ console.error(`Response data: ${JSON.stringify(error.response?.data)}`);
237
+ if (DEBUG) {
238
+ console.error(`Request URL: ${error.config?.url}`);
239
+ console.error(`Request method: ${error.config?.method}`);
240
+ console.error(`Request headers: ${JSON.stringify(error.config?.headers)}`);
241
+ console.error(`Request data: ${JSON.stringify(error.config?.data)}`);
242
+ }
243
+ }
244
+ throw new Error(`Error chatting with Onyx: ${error instanceof Error ? error.message : String(error)}`);
245
+ }
246
+ }
247
+ /**
248
+ * Build a comprehensive context from search results and content
249
+ * @param results The search results
250
+ * @param contents The content for each result
251
+ * @returns Formatted context string
252
+ */
253
+ buildContext(results, contents) {
254
+ let contextBuilder = '';
255
+ for (let i = 0; i < results.length; i++) {
256
+ const result = results[i];
257
+ const content = contents[i];
258
+ if (!content)
259
+ continue;
260
+ // Add document metadata
261
+ contextBuilder += `# ${result.semantic_identifier}\n`;
262
+ contextBuilder += `Source: ${result.link || result.document_id}\n`;
263
+ contextBuilder += `Relevance Score: ${result.score}\n\n`;
264
+ // Add content
265
+ contextBuilder += content;
266
+ // Add separator
267
+ contextBuilder += '\n\n---\n\n';
268
+ }
269
+ return contextBuilder;
270
+ }
271
+ }
272
+ //# 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,23 @@
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
+ };
15
+ }[];
16
+ isError?: undefined;
17
+ } | {
18
+ content: {
19
+ type: string;
20
+ text: string;
21
+ }[];
22
+ isError: boolean;
23
+ }>;
@@ -0,0 +1,60 @@
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 = DEFAULT_PERSONA_ID, 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
+ // Variable to store the chat session ID (either existing or new)
25
+ let sessionId = chatSessionId;
26
+ // Step 1: Create a chat session if one doesn't exist
27
+ if (!sessionId) {
28
+ sessionId = await onyxApiService.createChatSession(personaId);
29
+ }
30
+ else {
31
+ console.error(`Using existing chat session with ID: ${sessionId}`);
32
+ }
33
+ // Step 2: Send a message to the chat session
34
+ const { answer, documents } = await onyxApiService.sendChatMessage(sessionId, query, documentSets);
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: `${answer}\n\nSources:\n${documents.map(doc => `- ${doc.semantic_identifier || 'Unknown'} (${doc.document_id || 'Unknown ID'})`).join('\n')}\n\n---\nChat Session ID: ${sessionId}`,
40
+ metadata: {
41
+ chat_session_id: sessionId
42
+ }
43
+ }
44
+ ]
45
+ };
46
+ }
47
+ catch (error) {
48
+ console.error('Error in handleChatWithOnyx:', error);
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: `Error chatting with Onyx: ${error instanceof Error ? error.message : String(error)}`
54
+ }
55
+ ],
56
+ isError: true
57
+ };
58
+ }
59
+ }
60
+ //# sourceMappingURL=chatTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatTool.js","sourceRoot":"","sources":["../../src/tools/chatTool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAIzE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAa,EAAE,cAA8B;IACpF,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,SAAS,GAAG,kBAAkB,EAC9B,YAAY,GAAG,EAAE;QACjB,oDAAoD;QACpD,aAAa,GAAG,IAAI,EACrB,GAAG,IAAkB,CAAC;QAEvB,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,iEAAiE;QACjE,IAAI,SAAS,GAAG,aAAa,CAAC;QAE9B,qDAAqD;QACrD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,6CAA6C;QAC7C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAEnG,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,GAAG,MAAM,iBAAiB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAClD,KAAK,GAAG,CAAC,mBAAmB,IAAI,SAAS,KAAK,GAAG,CAAC,WAAW,IAAI,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,SAAS,EAAE;oBACtI,QAAQ,EAAE;wBACR,eAAe,EAAE,SAAS;qBAC3B;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC5F;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tool Handlers
3
+ * Exports all tool handlers for the Onyx MCP Server
4
+ */
5
+ export { handleSearchOnyx } from './searchTool.js';
6
+ export { handleChatWithOnyx } from './chatTool.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tool Handlers
3
+ * Exports all tool handlers for the Onyx MCP Server
4
+ */
5
+ export { handleSearchOnyx } from './searchTool.js';
6
+ export { handleChatWithOnyx } from './chatTool.js';
7
+ //# 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"}
@@ -0,0 +1,20 @@
1
+ import { OnyxApiService } from '../services/onyxApi.js';
2
+ /**
3
+ * Handle the search_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 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_onyx tool requests
4
+ */
5
+ import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
6
+ /**
7
+ * Handle the search_onyx 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 = 5, 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,CAAC,EACd,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"}