@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,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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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
+ }