@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
package/build/server.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|