@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.
- package/CHANGELOG.md +47 -0
- package/LICENSE +21 -0
- package/README.md +314 -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 +26 -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 +82 -0
- package/build/server.js.map +1 -0
- package/build/services/onyxApi.d.ts +68 -0
- package/build/services/onyxApi.js +272 -0
- package/build/services/onyxApi.js.map +1 -0
- package/build/tools/chatTool.d.ts +23 -0
- package/build/tools/chatTool.js +60 -0
- package/build/tools/chatTool.js.map +1 -0
- package/build/tools/index.d.ts +6 -0
- package/build/tools/index.js +7 -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/types/index.d.ts +157 -0
- package/build/types/index.js +86 -0
- package/build/types/index.js.map +1 -0
- package/package.json +1 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the OnyxApiService
|
|
3
|
+
*/
|
|
4
|
+
import nock from 'nock';
|
|
5
|
+
import { OnyxApiService } from '../../services/onyxApi.js';
|
|
6
|
+
// Mock config for testing
|
|
7
|
+
const mockConfig = {
|
|
8
|
+
apiUrl: 'http://test-api.com/api',
|
|
9
|
+
apiToken: 'test-token',
|
|
10
|
+
};
|
|
11
|
+
describe('OnyxApiService', () => {
|
|
12
|
+
let onyxApiService;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
// Create service instance
|
|
15
|
+
onyxApiService = new OnyxApiService(mockConfig);
|
|
16
|
+
// Disable real HTTP requests
|
|
17
|
+
nock.disableNetConnect();
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
// Clean up nock after each test
|
|
21
|
+
nock.cleanAll();
|
|
22
|
+
nock.enableNetConnect();
|
|
23
|
+
});
|
|
24
|
+
describe('searchOnyx', () => {
|
|
25
|
+
it('should make a POST request to the search endpoint with correct parameters', async () => {
|
|
26
|
+
// Mock the search API response
|
|
27
|
+
const mockResponse = {
|
|
28
|
+
documents: [
|
|
29
|
+
{
|
|
30
|
+
document_id: 'doc1',
|
|
31
|
+
chunk_ind: 1,
|
|
32
|
+
semantic_identifier: 'Test Document',
|
|
33
|
+
blurb: 'Test blurb',
|
|
34
|
+
source_type: 'test',
|
|
35
|
+
score: 0.95,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
// Set up the mock
|
|
40
|
+
nock('http://test-api.com')
|
|
41
|
+
.post('/api/admin/search')
|
|
42
|
+
.reply(200, mockResponse);
|
|
43
|
+
// Call the method
|
|
44
|
+
const result = await onyxApiService.searchOnyx('test query', [], 1, 2);
|
|
45
|
+
// Verify the result
|
|
46
|
+
expect(result).toEqual(mockResponse.documents);
|
|
47
|
+
});
|
|
48
|
+
it('should include document sets in the request when provided', async () => {
|
|
49
|
+
// Mock the search API response
|
|
50
|
+
const mockResponse = {
|
|
51
|
+
documents: [
|
|
52
|
+
{
|
|
53
|
+
document_id: 'doc1',
|
|
54
|
+
chunk_ind: 1,
|
|
55
|
+
semantic_identifier: 'Test Document',
|
|
56
|
+
blurb: 'Test blurb',
|
|
57
|
+
source_type: 'test',
|
|
58
|
+
score: 0.95,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
// Set up the mock
|
|
63
|
+
nock('http://test-api.com')
|
|
64
|
+
.post('/api/admin/search')
|
|
65
|
+
.reply(200, mockResponse);
|
|
66
|
+
// Call the method with document sets
|
|
67
|
+
const result = await onyxApiService.searchOnyx('test query', ['Test Set']);
|
|
68
|
+
// Verify the result
|
|
69
|
+
expect(result).toEqual(mockResponse.documents);
|
|
70
|
+
});
|
|
71
|
+
it('should throw an error when the API request fails', async () => {
|
|
72
|
+
// Set up the mock to return an error
|
|
73
|
+
nock('http://test-api.com')
|
|
74
|
+
.post('/api/admin/search')
|
|
75
|
+
.reply(500, { error: 'Internal server error' });
|
|
76
|
+
// Call the method and expect it to throw
|
|
77
|
+
await expect(onyxApiService.searchOnyx('test query')).rejects.toThrow('Failed to search Onyx');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('fetchDocumentChunk', () => {
|
|
81
|
+
it('should make a GET request to the chunk-info endpoint with correct parameters', async () => {
|
|
82
|
+
// Mock the chunk-info API response
|
|
83
|
+
const mockResponse = {
|
|
84
|
+
content: 'Test chunk content',
|
|
85
|
+
num_tokens: 10,
|
|
86
|
+
};
|
|
87
|
+
// Set up the mock
|
|
88
|
+
nock('http://test-api.com')
|
|
89
|
+
.get('/api/document/chunk-info')
|
|
90
|
+
.query({
|
|
91
|
+
document_id: 'doc1',
|
|
92
|
+
chunk_id: 1,
|
|
93
|
+
})
|
|
94
|
+
.reply(200, mockResponse);
|
|
95
|
+
// Call the method
|
|
96
|
+
const result = await onyxApiService.fetchDocumentChunk('doc1', 1);
|
|
97
|
+
// Verify the result
|
|
98
|
+
expect(result).toEqual(mockResponse.content);
|
|
99
|
+
});
|
|
100
|
+
it('should return empty string when the API request fails', async () => {
|
|
101
|
+
// Set up the mock to return an error
|
|
102
|
+
nock('http://test-api.com')
|
|
103
|
+
.get('/api/document/chunk-info')
|
|
104
|
+
.query({
|
|
105
|
+
document_id: 'doc1',
|
|
106
|
+
chunk_id: 1,
|
|
107
|
+
})
|
|
108
|
+
.reply(500, { error: 'Internal server error' });
|
|
109
|
+
// Call the method
|
|
110
|
+
const result = await onyxApiService.fetchDocumentChunk('doc1', 1);
|
|
111
|
+
// Verify the result
|
|
112
|
+
expect(result).toEqual('');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('fetchDocumentContent', () => {
|
|
116
|
+
it('should fetch document size info and then all chunks', async () => {
|
|
117
|
+
// Mock the document-size-info API response
|
|
118
|
+
const mockSizeResponse = {
|
|
119
|
+
num_chunks: 2,
|
|
120
|
+
total_tokens: 20
|
|
121
|
+
};
|
|
122
|
+
// Mock the chunk-info API responses
|
|
123
|
+
const mockChunk1Response = {
|
|
124
|
+
content: 'Chunk 1 content',
|
|
125
|
+
num_tokens: 10
|
|
126
|
+
};
|
|
127
|
+
const mockChunk2Response = {
|
|
128
|
+
content: 'Chunk 2 content',
|
|
129
|
+
num_tokens: 10
|
|
130
|
+
};
|
|
131
|
+
// Set up the mocks
|
|
132
|
+
nock('http://test-api.com')
|
|
133
|
+
.get('/api/document/document-size-info')
|
|
134
|
+
.query({
|
|
135
|
+
document_id: 'doc1'
|
|
136
|
+
})
|
|
137
|
+
.reply(200, mockSizeResponse);
|
|
138
|
+
nock('http://test-api.com')
|
|
139
|
+
.get('/api/document/chunk-info')
|
|
140
|
+
.query({
|
|
141
|
+
document_id: 'doc1',
|
|
142
|
+
chunk_id: 0
|
|
143
|
+
})
|
|
144
|
+
.reply(200, mockChunk1Response);
|
|
145
|
+
nock('http://test-api.com')
|
|
146
|
+
.get('/api/document/chunk-info')
|
|
147
|
+
.query({
|
|
148
|
+
document_id: 'doc1',
|
|
149
|
+
chunk_id: 1
|
|
150
|
+
})
|
|
151
|
+
.reply(200, mockChunk2Response);
|
|
152
|
+
// Call the method
|
|
153
|
+
const result = await onyxApiService.fetchDocumentContent('doc1');
|
|
154
|
+
// Verify the result
|
|
155
|
+
expect(result).toContain(mockChunk1Response.content);
|
|
156
|
+
expect(result).toContain(mockChunk2Response.content);
|
|
157
|
+
});
|
|
158
|
+
it('should return empty string when the API request fails', async () => {
|
|
159
|
+
// Set up the mock to return an error
|
|
160
|
+
nock('http://test-api.com')
|
|
161
|
+
.get('/api/document/document-size-info')
|
|
162
|
+
.query({
|
|
163
|
+
document_id: 'doc1'
|
|
164
|
+
})
|
|
165
|
+
.reply(500, { error: 'Internal server error' });
|
|
166
|
+
// Call the method
|
|
167
|
+
const result = await onyxApiService.fetchDocumentContent('doc1');
|
|
168
|
+
// Verify the result
|
|
169
|
+
expect(result).toEqual('');
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('createChatSession', () => {
|
|
173
|
+
it('should make a POST request to create a chat session', async () => {
|
|
174
|
+
// Mock the create-chat-session API response
|
|
175
|
+
const mockResponse = {
|
|
176
|
+
chat_session_id: 'test-session-id'
|
|
177
|
+
};
|
|
178
|
+
// Set up the mock
|
|
179
|
+
nock('http://test-api.com')
|
|
180
|
+
.post('/api/chat/create-chat-session')
|
|
181
|
+
.reply(200, mockResponse);
|
|
182
|
+
// Call the method
|
|
183
|
+
const result = await onyxApiService.createChatSession(15);
|
|
184
|
+
// Verify the result
|
|
185
|
+
expect(result).toEqual(mockResponse.chat_session_id);
|
|
186
|
+
});
|
|
187
|
+
it('should throw an error when the API request fails', async () => {
|
|
188
|
+
// Set up the mock to return an error
|
|
189
|
+
nock('http://test-api.com')
|
|
190
|
+
.post('/api/chat/create-chat-session')
|
|
191
|
+
.reply(500, { error: 'Internal server error' });
|
|
192
|
+
// Call the method and expect it to throw
|
|
193
|
+
await expect(onyxApiService.createChatSession(15)).rejects.toThrow('Failed to create chat session');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('sendChatMessage', () => {
|
|
197
|
+
it('should make a POST request to send a chat message and parse JSON response', async () => {
|
|
198
|
+
// Mock the send-message API response (single JSON)
|
|
199
|
+
const mockResponse = JSON.stringify({
|
|
200
|
+
answer: 'Test answer',
|
|
201
|
+
documents: [
|
|
202
|
+
{ document_id: 'doc1', semantic_identifier: 'Test Document 1' },
|
|
203
|
+
{ document_id: 'doc2', semantic_identifier: 'Test Document 2' }
|
|
204
|
+
]
|
|
205
|
+
});
|
|
206
|
+
// Set up the mock
|
|
207
|
+
nock('http://test-api.com')
|
|
208
|
+
.post('/api/chat/send-message')
|
|
209
|
+
.reply(200, mockResponse);
|
|
210
|
+
// Call the method
|
|
211
|
+
const result = await onyxApiService.sendChatMessage('test-session-id', 'test query');
|
|
212
|
+
// Verify the result
|
|
213
|
+
expect(result.answer).toEqual('Test answer');
|
|
214
|
+
expect(result.documents).toHaveLength(2);
|
|
215
|
+
expect(result.documents[0].document_id).toEqual('doc1');
|
|
216
|
+
});
|
|
217
|
+
it('should handle JSON lines format response', async () => {
|
|
218
|
+
// Mock the send-message API response (JSON lines)
|
|
219
|
+
const mockResponse = '{"answer_piece":"Part 1 of answer"}\n' +
|
|
220
|
+
'{"answer_piece":"Part 2 of answer"}\n' +
|
|
221
|
+
'{"top_documents":[{"document_id":"doc1","semantic_identifier":"Test Document 1"}]}';
|
|
222
|
+
// Set up the mock
|
|
223
|
+
nock('http://test-api.com')
|
|
224
|
+
.post('/api/chat/send-message')
|
|
225
|
+
.reply(200, mockResponse);
|
|
226
|
+
// Call the method
|
|
227
|
+
const result = await onyxApiService.sendChatMessage('test-session-id', 'test query');
|
|
228
|
+
// Verify the result
|
|
229
|
+
expect(result.answer).toEqual('Part 1 of answerPart 2 of answer');
|
|
230
|
+
expect(result.documents).toHaveLength(1);
|
|
231
|
+
expect(result.documents[0].document_id).toEqual('doc1');
|
|
232
|
+
});
|
|
233
|
+
it('should throw an error when the API request fails', async () => {
|
|
234
|
+
// Set up the mock to return an error
|
|
235
|
+
nock('http://test-api.com')
|
|
236
|
+
.post('/api/chat/send-message')
|
|
237
|
+
.reply(500, { error: 'Internal server error' });
|
|
238
|
+
// Call the method and expect it to throw
|
|
239
|
+
await expect(onyxApiService.sendChatMessage('test-session-id', 'test query')).rejects.toThrow('Error chatting with Onyx');
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
describe('buildContext', () => {
|
|
243
|
+
it('should build a formatted context string from search results and contents', () => {
|
|
244
|
+
// Test data
|
|
245
|
+
const results = [
|
|
246
|
+
{
|
|
247
|
+
document_id: 'doc1',
|
|
248
|
+
chunk_ind: 1,
|
|
249
|
+
semantic_identifier: 'Test Document 1',
|
|
250
|
+
score: 0.95,
|
|
251
|
+
link: 'http://example.com/doc1',
|
|
252
|
+
blurb: 'Test blurb 1',
|
|
253
|
+
source_type: 'test'
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
document_id: 'doc2',
|
|
257
|
+
chunk_ind: 2,
|
|
258
|
+
semantic_identifier: 'Test Document 2',
|
|
259
|
+
score: 0.85,
|
|
260
|
+
link: undefined,
|
|
261
|
+
blurb: 'Test blurb 2',
|
|
262
|
+
source_type: 'test'
|
|
263
|
+
}
|
|
264
|
+
];
|
|
265
|
+
const contents = [
|
|
266
|
+
'Content for document 1',
|
|
267
|
+
'Content for document 2'
|
|
268
|
+
];
|
|
269
|
+
// Call the method
|
|
270
|
+
const result = onyxApiService.buildContext(results, contents);
|
|
271
|
+
// Verify the result
|
|
272
|
+
expect(result).toContain('# Test Document 1');
|
|
273
|
+
expect(result).toContain('Source: http://example.com/doc1');
|
|
274
|
+
expect(result).toContain('Relevance Score: 0.95');
|
|
275
|
+
expect(result).toContain('Content for document 1');
|
|
276
|
+
expect(result).toContain('# Test Document 2');
|
|
277
|
+
expect(result).toContain('Source: doc2');
|
|
278
|
+
expect(result).toContain('Relevance Score: 0.85');
|
|
279
|
+
expect(result).toContain('Content for document 2');
|
|
280
|
+
});
|
|
281
|
+
it('should skip results with no content', () => {
|
|
282
|
+
// Test data
|
|
283
|
+
const results = [
|
|
284
|
+
{
|
|
285
|
+
document_id: 'doc1',
|
|
286
|
+
chunk_ind: 1,
|
|
287
|
+
semantic_identifier: 'Test Document 1',
|
|
288
|
+
score: 0.95,
|
|
289
|
+
link: 'http://example.com/doc1',
|
|
290
|
+
blurb: 'Test blurb 1',
|
|
291
|
+
source_type: 'test'
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
document_id: 'doc2',
|
|
295
|
+
chunk_ind: 2,
|
|
296
|
+
semantic_identifier: 'Test Document 2',
|
|
297
|
+
score: 0.85,
|
|
298
|
+
link: 'http://example.com/doc2',
|
|
299
|
+
blurb: 'Test blurb 2',
|
|
300
|
+
source_type: 'test'
|
|
301
|
+
}
|
|
302
|
+
];
|
|
303
|
+
const contents = [
|
|
304
|
+
'Content for document 1',
|
|
305
|
+
'' // Empty content for second document
|
|
306
|
+
];
|
|
307
|
+
// Call the method
|
|
308
|
+
const result = onyxApiService.buildContext(results, contents);
|
|
309
|
+
// Verify the result
|
|
310
|
+
expect(result).toContain('# Test Document 1');
|
|
311
|
+
expect(result).toContain('Content for document 1');
|
|
312
|
+
// Should not contain document 2 info
|
|
313
|
+
expect(result).not.toContain('# Test Document 2');
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
//# sourceMappingURL=onyxApi.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onyxApi.test.js","sourceRoot":"","sources":["../../../src/__tests__/services/onyxApi.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { handleChatWithOnyx } from '../../tools/chatTool.js';
|
|
5
|
+
import { handleSearchOnyx } from '../../tools/searchTool.js';
|
|
6
|
+
import { jest } from '@jest/globals';
|
|
7
|
+
describe('Tool Handlers', () => {
|
|
8
|
+
let mockOnyxApiService;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
// Create a mock instance of OnyxApiService
|
|
11
|
+
mockOnyxApiService = {
|
|
12
|
+
apiUrl: 'http://test-api.com/api',
|
|
13
|
+
apiToken: 'test-token',
|
|
14
|
+
createChatSession: jest.fn(),
|
|
15
|
+
sendChatMessage: jest.fn(),
|
|
16
|
+
searchOnyx: jest.fn(),
|
|
17
|
+
fetchDocumentChunk: jest.fn(),
|
|
18
|
+
fetchDocumentContent: jest.fn(),
|
|
19
|
+
buildContext: jest.fn()
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
describe('handleChatWithOnyx', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
// Set up the mock implementations
|
|
25
|
+
mockOnyxApiService.createChatSession.mockImplementation(() => {
|
|
26
|
+
return Promise.resolve('test-session-id');
|
|
27
|
+
});
|
|
28
|
+
mockOnyxApiService.sendChatMessage.mockImplementation(() => {
|
|
29
|
+
return Promise.resolve({
|
|
30
|
+
answer: 'Test answer',
|
|
31
|
+
documents: [
|
|
32
|
+
{ document_id: 'doc1', semantic_identifier: 'Test Document 1' },
|
|
33
|
+
{ document_id: 'doc2', semantic_identifier: 'Test Document 2' },
|
|
34
|
+
],
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it('should throw an error for invalid arguments', async () => {
|
|
39
|
+
// Test with null arguments
|
|
40
|
+
const result1 = await handleChatWithOnyx(null, mockOnyxApiService);
|
|
41
|
+
expect(result1.isError).toBe(true);
|
|
42
|
+
expect(result1.content[0].text).toContain('Invalid arguments');
|
|
43
|
+
// Test with non-object arguments
|
|
44
|
+
const result2 = await handleChatWithOnyx('not an object', mockOnyxApiService);
|
|
45
|
+
expect(result2.isError).toBe(true);
|
|
46
|
+
expect(result2.content[0].text).toContain('Invalid arguments');
|
|
47
|
+
});
|
|
48
|
+
it('should throw an error for missing query', async () => {
|
|
49
|
+
const result = await handleChatWithOnyx({ personaId: 15 }, mockOnyxApiService);
|
|
50
|
+
expect(result.isError).toBe(true);
|
|
51
|
+
expect(result.content[0].text).toContain('Query is required');
|
|
52
|
+
});
|
|
53
|
+
it('should create a new chat session when chatSessionId is not provided', async () => {
|
|
54
|
+
await handleChatWithOnyx({ query: 'test query' }, mockOnyxApiService);
|
|
55
|
+
expect(mockOnyxApiService.createChatSession).toHaveBeenCalledWith(15); // Default personaId
|
|
56
|
+
});
|
|
57
|
+
it('should use existing chat session when chatSessionId is provided', async () => {
|
|
58
|
+
await handleChatWithOnyx({ query: 'test query', chatSessionId: 'existing-session' }, mockOnyxApiService);
|
|
59
|
+
expect(mockOnyxApiService.createChatSession).not.toHaveBeenCalled();
|
|
60
|
+
expect(mockOnyxApiService.sendChatMessage).toHaveBeenCalledWith('existing-session', 'test query', []);
|
|
61
|
+
});
|
|
62
|
+
it('should send a chat message and return formatted response', async () => {
|
|
63
|
+
const result = await handleChatWithOnyx({ query: 'test query' }, mockOnyxApiService);
|
|
64
|
+
expect(mockOnyxApiService.sendChatMessage).toHaveBeenCalledWith('test-session-id', 'test query', []);
|
|
65
|
+
expect(result.content[0].type).toBe('text');
|
|
66
|
+
expect(result.content[0].text).toContain('Test answer');
|
|
67
|
+
expect(result.content[0].text).toContain('Test Document 1');
|
|
68
|
+
expect(result.content[0].text).toContain('doc2');
|
|
69
|
+
// Use type assertion to access metadata
|
|
70
|
+
const content = result.content[0];
|
|
71
|
+
expect(content.metadata?.chat_session_id).toBe('test-session-id');
|
|
72
|
+
});
|
|
73
|
+
it('should handle API errors gracefully', async () => {
|
|
74
|
+
// Mock the API to throw an error
|
|
75
|
+
mockOnyxApiService.createChatSession.mockImplementation(() => {
|
|
76
|
+
return Promise.reject(new Error('API error'));
|
|
77
|
+
});
|
|
78
|
+
const result = await handleChatWithOnyx({ query: 'test query' }, mockOnyxApiService);
|
|
79
|
+
expect(result.isError).toBe(true);
|
|
80
|
+
expect(result.content[0].text).toContain('Error chatting with Onyx');
|
|
81
|
+
expect(result.content[0].text).toContain('API error');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('handleSearchOnyx', () => {
|
|
85
|
+
beforeEach(() => {
|
|
86
|
+
// Set up the mock implementations
|
|
87
|
+
mockOnyxApiService.searchOnyx.mockImplementation(() => {
|
|
88
|
+
const results = [
|
|
89
|
+
{
|
|
90
|
+
document_id: 'doc1',
|
|
91
|
+
chunk_ind: 1,
|
|
92
|
+
semantic_identifier: 'Test Document 1',
|
|
93
|
+
score: 0.95,
|
|
94
|
+
link: 'http://example.com/doc1',
|
|
95
|
+
blurb: 'Test blurb 1',
|
|
96
|
+
source_type: 'test'
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
document_id: 'doc2',
|
|
100
|
+
chunk_ind: 2,
|
|
101
|
+
semantic_identifier: 'Test Document 2',
|
|
102
|
+
score: 0.85,
|
|
103
|
+
link: 'http://example.com/doc2',
|
|
104
|
+
blurb: 'Test blurb 2',
|
|
105
|
+
source_type: 'test'
|
|
106
|
+
}
|
|
107
|
+
];
|
|
108
|
+
return Promise.resolve(results);
|
|
109
|
+
});
|
|
110
|
+
// @ts-expect-error - TypeScript errors for mock implementation
|
|
111
|
+
mockOnyxApiService.fetchDocumentChunk = jest.fn().mockImplementation(() => Promise.resolve('Mocked chunk content'));
|
|
112
|
+
// @ts-expect-error - TypeScript errors for mock implementation
|
|
113
|
+
mockOnyxApiService.fetchDocumentContent = jest.fn().mockImplementation(() => Promise.resolve('Mocked document content'));
|
|
114
|
+
// @ts-expect-error - TypeScript errors for mock implementation
|
|
115
|
+
mockOnyxApiService.buildContext = jest.fn().mockReturnValue('Formatted context');
|
|
116
|
+
});
|
|
117
|
+
it('should throw an error for invalid arguments', async () => {
|
|
118
|
+
// Test with null arguments
|
|
119
|
+
const result1 = await handleSearchOnyx(null, mockOnyxApiService);
|
|
120
|
+
expect(result1.isError).toBe(true);
|
|
121
|
+
expect(result1.content[0].text).toContain('Invalid arguments');
|
|
122
|
+
// Test with non-object arguments
|
|
123
|
+
const result2 = await handleSearchOnyx('not an object', mockOnyxApiService);
|
|
124
|
+
expect(result2.isError).toBe(true);
|
|
125
|
+
expect(result2.content[0].text).toContain('Invalid arguments');
|
|
126
|
+
});
|
|
127
|
+
it('should throw an error for missing query', async () => {
|
|
128
|
+
const result = await handleSearchOnyx({ maxResults: 5 }, mockOnyxApiService);
|
|
129
|
+
expect(result.isError).toBe(true);
|
|
130
|
+
expect(result.content[0].text).toContain('Query is required');
|
|
131
|
+
});
|
|
132
|
+
it('should search with default parameters when only query is provided', async () => {
|
|
133
|
+
await handleSearchOnyx({ query: 'test query' }, mockOnyxApiService);
|
|
134
|
+
expect(mockOnyxApiService.searchOnyx).toHaveBeenCalledWith('test query', [], 1, 1);
|
|
135
|
+
});
|
|
136
|
+
it('should search with custom parameters when provided', async () => {
|
|
137
|
+
await handleSearchOnyx({
|
|
138
|
+
query: 'test query',
|
|
139
|
+
documentSets: ['set1', 'set2'],
|
|
140
|
+
maxResults: 10,
|
|
141
|
+
chunksAbove: 2,
|
|
142
|
+
chunksBelow: 3,
|
|
143
|
+
}, mockOnyxApiService);
|
|
144
|
+
expect(mockOnyxApiService.searchOnyx).toHaveBeenCalledWith('test query', ['set1', 'set2'], 2, 3);
|
|
145
|
+
});
|
|
146
|
+
it('should fetch document chunks by default', async () => {
|
|
147
|
+
await handleSearchOnyx({ query: 'test query' }, mockOnyxApiService);
|
|
148
|
+
expect(mockOnyxApiService.fetchDocumentChunk).toHaveBeenCalledTimes(2);
|
|
149
|
+
expect(mockOnyxApiService.fetchDocumentContent).not.toHaveBeenCalled();
|
|
150
|
+
});
|
|
151
|
+
it('should fetch full documents when retrieveFullDocuments is true', async () => {
|
|
152
|
+
await handleSearchOnyx({
|
|
153
|
+
query: 'test query',
|
|
154
|
+
retrieveFullDocuments: true,
|
|
155
|
+
}, mockOnyxApiService);
|
|
156
|
+
expect(mockOnyxApiService.fetchDocumentContent).toHaveBeenCalledTimes(2);
|
|
157
|
+
expect(mockOnyxApiService.fetchDocumentChunk).not.toHaveBeenCalled();
|
|
158
|
+
});
|
|
159
|
+
it('should build and return context from search results', async () => {
|
|
160
|
+
const result = await handleSearchOnyx({ query: 'test query' }, mockOnyxApiService);
|
|
161
|
+
expect(mockOnyxApiService.buildContext).toHaveBeenCalled();
|
|
162
|
+
expect(result.content[0].type).toBe('text');
|
|
163
|
+
expect(result.content[0].text).toBe('Formatted context');
|
|
164
|
+
});
|
|
165
|
+
it('should handle API errors gracefully', async () => {
|
|
166
|
+
// Mock the API to throw an error
|
|
167
|
+
mockOnyxApiService.searchOnyx.mockImplementation(() => {
|
|
168
|
+
return Promise.reject(new Error('API error'));
|
|
169
|
+
});
|
|
170
|
+
const result = await handleSearchOnyx({ query: 'test query' }, mockOnyxApiService);
|
|
171
|
+
expect(result.isError).toBe(true);
|
|
172
|
+
expect(result.content[0].text).toContain('Error searching Onyx');
|
|
173
|
+
expect(result.content[0].text).toContain('API error');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for the Onyx MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import { OnyxConfig } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Load configuration from environment variables
|
|
7
|
+
* @returns The Onyx configuration
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadConfig(): OnyxConfig;
|
|
10
|
+
/**
|
|
11
|
+
* Server configuration
|
|
12
|
+
*/
|
|
13
|
+
export declare const SERVER_CONFIG: {
|
|
14
|
+
name: string;
|
|
15
|
+
version: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Debug mode flag
|
|
19
|
+
*/
|
|
20
|
+
export declare const DEBUG: boolean;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load configuration from environment variables
|
|
3
|
+
* @returns The Onyx configuration
|
|
4
|
+
*/
|
|
5
|
+
export function loadConfig() {
|
|
6
|
+
const config = {
|
|
7
|
+
apiUrl: process.env.ONYX_API_URL || 'http://localhost:8080/api',
|
|
8
|
+
apiToken: process.env.ONYX_API_TOKEN || '',
|
|
9
|
+
};
|
|
10
|
+
if (!config.apiToken) {
|
|
11
|
+
console.error('ONYX_API_TOKEN environment variable is required');
|
|
12
|
+
}
|
|
13
|
+
return config;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Server configuration
|
|
17
|
+
*/
|
|
18
|
+
export const SERVER_CONFIG = {
|
|
19
|
+
name: 'onyx-mcp-server',
|
|
20
|
+
version: '1.0.0',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Debug mode flag
|
|
24
|
+
*/
|
|
25
|
+
export const DEBUG = process.env.DEBUG === 'true';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAe;QACzB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,2BAA2B;QAC/D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;KAC3C,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC"}
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Onyx MCP Server
|
|
4
|
+
* Entry point for the Onyx MCP Server
|
|
5
|
+
*/
|
|
6
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
7
|
+
import { OnyxMcpServer } from './server.js';
|
|
8
|
+
/**
|
|
9
|
+
* Main function to start the server
|
|
10
|
+
*/
|
|
11
|
+
async function main() {
|
|
12
|
+
try {
|
|
13
|
+
const server = new OnyxMcpServer();
|
|
14
|
+
const transport = new StdioServerTransport();
|
|
15
|
+
await server.run(transport);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error('Failed to start Onyx MCP Server:', error);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Start the server
|
|
23
|
+
main().catch(console.error);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OnyxMcpServer class
|
|
3
|
+
* Main server class for the Onyx MCP Server
|
|
4
|
+
*/
|
|
5
|
+
export declare class OnyxMcpServer {
|
|
6
|
+
private server;
|
|
7
|
+
private onyxApiService;
|
|
8
|
+
/**
|
|
9
|
+
* Constructor
|
|
10
|
+
*/
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Set up tool handlers
|
|
14
|
+
*/
|
|
15
|
+
private setupToolHandlers;
|
|
16
|
+
/**
|
|
17
|
+
* Run the server
|
|
18
|
+
* @param transport The server transport
|
|
19
|
+
*/
|
|
20
|
+
run(transport: any): Promise<void>;
|
|
21
|
+
}
|