mcp-meilisearch 1.4.5 → 1.4.6
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/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/stdio.js +1 -4
- package/dist/utils/ai-handler.d.ts +2 -2
- package/dist/utils/ai-handler.d.ts.map +1 -1
- package/dist/utils/ai-handler.js +36 -5
- package/dist/utils/response-handler.d.ts +5 -0
- package/dist/utils/response-handler.d.ts.map +1 -1
- package/dist/utils/response-handler.js +26 -0
- package/package.json +4 -4
package/dist/server.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export declare const defaultOptions: {
|
|
|
12
12
|
mcpEndpoint: string;
|
|
13
13
|
sessionTimeout: number;
|
|
14
14
|
sessionCleanupInterval: number;
|
|
15
|
+
meilisearchHost: string | undefined;
|
|
16
|
+
meilisearchApiKey: string | undefined;
|
|
15
17
|
};
|
|
16
18
|
/**
|
|
17
19
|
* Implementation of an MCP server for Meilisearch
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAOvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE;;GAEG;AACH,UAAU,cAAc;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB;AASD,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAOvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE;;GAEG;AACH,UAAU,cAAc;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB;AASD,eAAO,MAAM,cAAc;;;;;;;CAO1B,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoB;IAE3D,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAuC;IAEvD;;;;OAIG;gBACS,MAAM,EAAE,SAAS,EAAE,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAOlE;;;;;OAKG;IACG,iBAAiB,CACrB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,WAAW,GAAE,MAAmC,GAC/C,OAAO,CAAC,IAAI,CAAC;IA+ChB;;;;OAIG;IACG,gBAAgB,CACpB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC;IA+BhB;;;;;OAKG;IACG,iBAAiB,CACrB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,IAAI,CAAC;IA+BhB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAqBhB;;;;;OAKG;YACW,uBAAuB;IAuCrC;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAWvC;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CA2B/B;AA+DD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GACrB,YAAW,MAAM,GAAG,OAAgB,EACpC,SAAS,OAAO,CAAC,aAAa,CAAC,KAC9B,OAAO,CAAC,cAAc,CAcxB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -17,6 +17,8 @@ export const defaultOptions = {
|
|
|
17
17
|
mcpEndpoint: "/mcp",
|
|
18
18
|
sessionTimeout: 3600000,
|
|
19
19
|
sessionCleanupInterval: 60000,
|
|
20
|
+
meilisearchHost: process.env.MEILISEARCH_HOST,
|
|
21
|
+
meilisearchApiKey: process.env.MEILISEARCH_API_KEY,
|
|
20
22
|
};
|
|
21
23
|
/**
|
|
22
24
|
* Implementation of an MCP server for Meilisearch
|
package/dist/stdio.js
CHANGED
|
@@ -2,7 +2,7 @@ import { AiProviderNameOptions } from "../types/options.js";
|
|
|
2
2
|
interface AITool {
|
|
3
3
|
name: string;
|
|
4
4
|
description: string;
|
|
5
|
-
parameters: Record<string,
|
|
5
|
+
parameters: Record<string, unknown>;
|
|
6
6
|
}
|
|
7
7
|
interface AIToolResponse {
|
|
8
8
|
toolName?: string;
|
|
@@ -17,13 +17,13 @@ interface AIToolResponse {
|
|
|
17
17
|
* to use based on the user's query
|
|
18
18
|
*/
|
|
19
19
|
export declare class AIService {
|
|
20
|
+
private availableTools;
|
|
20
21
|
private model;
|
|
21
22
|
private static instance;
|
|
22
23
|
private static serverInitialized;
|
|
23
24
|
private provider;
|
|
24
25
|
private readonly systemPrompt;
|
|
25
26
|
private client;
|
|
26
|
-
private availableTools;
|
|
27
27
|
/**
|
|
28
28
|
* Private constructor to prevent direct instantiation
|
|
29
29
|
* Use getInstance() method instead
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-handler.d.ts","sourceRoot":"","sources":["../../src/utils/ai-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-handler.d.ts","sourceRoot":"","sources":["../../src/utils/ai-handler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAI5D,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAmBD,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,MAAM,CAAgD;IAE9D;;;OAGG;IACH,OAAO;IAEP;;;OAGG;WACW,WAAW,IAAI,SAAS;IAOtC;;;;;;OAMG;IACH,UAAU,CACR,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,qBAAgC,EAC1C,KAAK,CAAC,EAAE,MAAM,GACb,IAAI;IAyBP;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAIxC,iBAAiB,IAAI,OAAO;IAI5B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;OAKG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,cAAc,CAAC;YA4BZ,kBAAkB;YA+DlB,uBAAuB;CAyDtC"}
|
package/dist/utils/ai-handler.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { OpenAI } from "openai";
|
|
2
2
|
import systemPrompt from "../prompts/system.js";
|
|
3
3
|
import { OPEN_ROUTER_API } from "../types/enums.js";
|
|
4
|
-
import { markdownToJson } from "./response-handler.js";
|
|
5
4
|
import { InferenceClient } from "@huggingface/inference";
|
|
5
|
+
import { markdownToJson, cleanNullValues } from "./response-handler.js";
|
|
6
6
|
/**
|
|
7
7
|
* AI Inference Service
|
|
8
8
|
*
|
|
@@ -10,13 +10,13 @@ import { InferenceClient } from "@huggingface/inference";
|
|
|
10
10
|
* to use based on the user's query
|
|
11
11
|
*/
|
|
12
12
|
export class AIService {
|
|
13
|
+
availableTools = [];
|
|
13
14
|
model = "gpt-3.5-turbo";
|
|
14
15
|
static instance = null;
|
|
15
16
|
static serverInitialized = false;
|
|
16
17
|
provider = "openai";
|
|
17
18
|
systemPrompt = systemPrompt;
|
|
18
19
|
client = null;
|
|
19
|
-
availableTools = [];
|
|
20
20
|
/**
|
|
21
21
|
* Private constructor to prevent direct instantiation
|
|
22
22
|
* Use getInstance() method instead
|
|
@@ -144,6 +144,22 @@ export class AIService {
|
|
|
144
144
|
return { error: "No choices returned from OpenAI" };
|
|
145
145
|
}
|
|
146
146
|
const message = response.choices[0].message;
|
|
147
|
+
if (message.tool_calls?.length) {
|
|
148
|
+
const toolCall = message.tool_calls[0]?.function;
|
|
149
|
+
if (!toolCall) {
|
|
150
|
+
return { error: "Invalid tool from OpenAI response" };
|
|
151
|
+
}
|
|
152
|
+
const inferenceToolResponse = {
|
|
153
|
+
name: toolCall.name,
|
|
154
|
+
parameters: cleanNullValues(JSON.parse(toolCall.arguments)),
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
error: null,
|
|
158
|
+
toolName: inferenceToolResponse.name,
|
|
159
|
+
parameters: inferenceToolResponse.parameters,
|
|
160
|
+
reasoning: JSON.stringify(inferenceToolResponse, null, 2),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
147
163
|
if (message.content) {
|
|
148
164
|
const toolCall = markdownToJson(message.content);
|
|
149
165
|
if (!toolCall) {
|
|
@@ -177,11 +193,26 @@ export class AIService {
|
|
|
177
193
|
return { error: "No choices in Hugging Face response" };
|
|
178
194
|
}
|
|
179
195
|
const message = response.choices[0].message;
|
|
180
|
-
if (message.
|
|
181
|
-
const toolCall =
|
|
196
|
+
if (message.tool_calls?.length) {
|
|
197
|
+
const toolCall = message.tool_calls[0]?.function;
|
|
182
198
|
if (!toolCall) {
|
|
183
|
-
return { error:
|
|
199
|
+
return { error: "Invalid tool from Hugging Face response" };
|
|
184
200
|
}
|
|
201
|
+
const inferenceToolResponse = {
|
|
202
|
+
name: toolCall.name,
|
|
203
|
+
parameters: cleanNullValues(JSON.parse(toolCall.arguments)),
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
error: null,
|
|
207
|
+
toolName: inferenceToolResponse.name,
|
|
208
|
+
parameters: inferenceToolResponse.parameters,
|
|
209
|
+
reasoning: JSON.stringify(inferenceToolResponse, null, 2),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
if (message.content) {
|
|
213
|
+
const toolCall = markdownToJson(message.content);
|
|
214
|
+
if (!toolCall)
|
|
215
|
+
return { error: "Invalid tool call format in content" };
|
|
185
216
|
return {
|
|
186
217
|
error: null,
|
|
187
218
|
toolName: toolCall.name,
|
|
@@ -7,4 +7,9 @@
|
|
|
7
7
|
* @returns A parsed JavaScript object/array, or null if parsing fails.
|
|
8
8
|
*/
|
|
9
9
|
export declare function markdownToJson<T>(markdownJsonString: string): T | null;
|
|
10
|
+
/**
|
|
11
|
+
* Recursively removes null values from an object, replacing them with undefined
|
|
12
|
+
* This ensures optional parameters are properly handled by JSON schema validation
|
|
13
|
+
*/
|
|
14
|
+
export declare function cleanNullValues(obj: Record<string, any>): Record<string, any>;
|
|
10
15
|
//# sourceMappingURL=response-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-handler.d.ts","sourceRoot":"","sources":["../../src/utils/response-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAoCtE"}
|
|
1
|
+
{"version":3,"file":"response-handler.d.ts","sourceRoot":"","sources":["../../src/utils/response-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAoCtE;AAgCD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAsB7E"}
|
|
@@ -70,3 +70,29 @@ function parseNestedJsonStrings(obj) {
|
|
|
70
70
|
}
|
|
71
71
|
return obj;
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Recursively removes null values from an object, replacing them with undefined
|
|
75
|
+
* This ensures optional parameters are properly handled by JSON schema validation
|
|
76
|
+
*/
|
|
77
|
+
export function cleanNullValues(obj) {
|
|
78
|
+
const result = {};
|
|
79
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
80
|
+
if (value === null) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
else if (typeof value === "object" && value !== null) {
|
|
84
|
+
if (Array.isArray(value)) {
|
|
85
|
+
result[key] = value.map((item) => typeof item === "object" && item !== null
|
|
86
|
+
? cleanNullValues(item)
|
|
87
|
+
: item);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
result[key] = cleanNullValues(value);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
result[key] = value;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-meilisearch",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.6",
|
|
4
4
|
"description": "Model Context Protocol (MCP) implementation for Meilisearch",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
],
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "tsc && tsc -p tsconfig.types.json",
|
|
27
|
-
"demo": "npm run build & npm run
|
|
27
|
+
"demo": "npm run build & npm run dev --workspace=demo",
|
|
28
28
|
"server": "npm run build && node --env-file=.env dist/index.js",
|
|
29
29
|
"prepublishOnly": "rm -rf dist && npm version patch && npm run build"
|
|
30
30
|
},
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"@modelcontextprotocol/sdk": "^1.11.4",
|
|
34
34
|
"axios": "^1.9.0",
|
|
35
35
|
"openai": "^4.100.0",
|
|
36
|
-
"zod": "^3.
|
|
36
|
+
"zod": "^3.25.1"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@types/node": "^22.15.
|
|
39
|
+
"@types/node": "^22.15.19",
|
|
40
40
|
"typescript": "^5.8.3",
|
|
41
41
|
"zod-to-json-schema": "^3.24.5"
|
|
42
42
|
},
|