mcp-meilisearch 1.0.2 → 1.0.5
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/client.d.ts +27 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +1 -1
- package/dist/http.d.ts +2 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -2
- package/dist/server.d.ts +102 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +142 -102
- package/dist/stdio.d.ts +2 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/tools/document-tools.d.ts +9 -0
- package/dist/tools/document-tools.d.ts.map +1 -0
- package/dist/tools/index-tools.d.ts +9 -0
- package/dist/tools/index-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.d.ts +9 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/settings-tools.d.ts +14 -0
- package/dist/tools/settings-tools.d.ts.map +1 -0
- package/dist/tools/system-tools.d.ts +14 -0
- package/dist/tools/system-tools.d.ts.map +1 -0
- package/dist/tools/task-tools.d.ts +9 -0
- package/dist/tools/task-tools.d.ts.map +1 -0
- package/dist/tools/task-tools.js +1 -1
- package/dist/tools/vector-tools.d.ts +15 -0
- package/dist/tools/vector-tools.d.ts.map +1 -0
- package/dist/utils/api-handler.d.ts +27 -0
- package/dist/utils/api-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.d.ts +35 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/package.json +7 -11
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare class MCPClient {
|
|
2
|
+
tools: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
}[];
|
|
6
|
+
private client;
|
|
7
|
+
private tries;
|
|
8
|
+
private transport;
|
|
9
|
+
private onToolsUpdatedCallback;
|
|
10
|
+
constructor(serverName: string);
|
|
11
|
+
setOnToolsUpdatedCallback(callback: (tools: Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}>) => void): void;
|
|
15
|
+
connectToServer(serverUrl: string): Promise<void>;
|
|
16
|
+
listTools(): Promise<void>;
|
|
17
|
+
private setUpNotifications;
|
|
18
|
+
callTool(name: string, args?: Record<string, any>): Promise<{
|
|
19
|
+
success: boolean;
|
|
20
|
+
data?: any;
|
|
21
|
+
error?: string;
|
|
22
|
+
}>;
|
|
23
|
+
private setUpTransport;
|
|
24
|
+
cleanup(): Promise<void>;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAQA,qBAAa,SAAS;IACpB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAM;IAEpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,sBAAsB,CAEd;gBAEJ,UAAU,EAAE,MAAM;IAOvB,yBAAyB,CAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI;IAKnE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAsChC,OAAO,CAAC,kBAAkB;IAkBpB,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACzB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAuCF,OAAO,CAAC,cAAc;IAWhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAUxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meilisearch MCP Server Configuration
|
|
3
|
+
*
|
|
4
|
+
* This file contains the configuration settings for connecting to the Meilisearch server.
|
|
5
|
+
* Configuration is loaded from environment variables with sensible defaults.
|
|
6
|
+
*/
|
|
7
|
+
export interface ServerConfig {
|
|
8
|
+
/** The URL of the Meilisearch instance */
|
|
9
|
+
host: string;
|
|
10
|
+
/** The API key for authenticating with Meilisearch */
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/** The timeout for API requests in milliseconds */
|
|
13
|
+
timeout: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load and initialize configuration from environment variables
|
|
17
|
+
*/
|
|
18
|
+
export declare const loadConfig: () => ServerConfig;
|
|
19
|
+
export declare const config: ServerConfig;
|
|
20
|
+
export default config;
|
|
21
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,QAAO,YAM7B,CAAC;AAGF,eAAO,MAAM,MAAM,cAAe,CAAC;AAGnC,eAAe,MAAM,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -11,7 +11,7 @@ export const loadConfig = () => {
|
|
|
11
11
|
return {
|
|
12
12
|
host: process.env.MEILISEARCH_HOST || "http://localhost:7700",
|
|
13
13
|
apiKey: process.env.MEILISEARCH_API_KEY || "",
|
|
14
|
-
timeout: parseInt(
|
|
14
|
+
timeout: parseInt("5000", 10),
|
|
15
15
|
};
|
|
16
16
|
};
|
|
17
17
|
// Export the config instance
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Plugin } from "vite";
|
|
2
|
+
/**
|
|
3
|
+
* Options for the MCP Vite plugin
|
|
4
|
+
*/
|
|
5
|
+
export interface MCPPluginOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Transport type for MCP server ("http" | "stdio")
|
|
8
|
+
* @default "http"
|
|
9
|
+
*/
|
|
10
|
+
transport?: "http" | "stdio";
|
|
11
|
+
/**
|
|
12
|
+
* HTTP port for MCP server
|
|
13
|
+
* @default 8080
|
|
14
|
+
*/
|
|
15
|
+
httpPort?: number;
|
|
16
|
+
/**
|
|
17
|
+
* MCP endpoint path
|
|
18
|
+
* @default "/mcp"
|
|
19
|
+
*/
|
|
20
|
+
mcpEndpoint?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Server name
|
|
23
|
+
* @default "meilisearch"
|
|
24
|
+
*/
|
|
25
|
+
serverName?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Server version
|
|
28
|
+
* @default "1.0.0"
|
|
29
|
+
*/
|
|
30
|
+
serverVersion?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Session timeout in milliseconds
|
|
33
|
+
* @default 3600000 (1 hour)
|
|
34
|
+
*/
|
|
35
|
+
sessionTimeout?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Session cleanup interval in milliseconds
|
|
38
|
+
* @default 60000 (1 minute)
|
|
39
|
+
*/
|
|
40
|
+
sessionCleanupInterval?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates a Vite plugin that integrates with the MCP server
|
|
44
|
+
* @param options Configuration options for the MCP server
|
|
45
|
+
* @returns A Vite plugin
|
|
46
|
+
*/
|
|
47
|
+
export declare function mcpPlugin(options?: MCPPluginOptions): Plugin;
|
|
48
|
+
/**
|
|
49
|
+
* Default export for convenience
|
|
50
|
+
*/
|
|
51
|
+
export default mcpPlugin;
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAK9B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA0IhE;AAED;;GAEG;AACH,eAAe,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,127 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { initServer } from "./server.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { createErrorResponse } from "./utils/error-handler.js";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a Vite plugin that integrates with the MCP server
|
|
6
|
+
* @param options Configuration options for the MCP server
|
|
7
|
+
* @returns A Vite plugin
|
|
8
|
+
*/
|
|
9
|
+
export function mcpPlugin(options = {}) {
|
|
10
|
+
const pluginId = `mcp-plugin-${randomUUID().slice(0, 8)}`;
|
|
11
|
+
let mcpServerInstance = null;
|
|
12
|
+
// Set default options
|
|
13
|
+
const transport = options.transport || "http";
|
|
14
|
+
return {
|
|
15
|
+
name: "vite:mcp-plugin",
|
|
16
|
+
apply: "serve", // Only apply this plugin during development
|
|
17
|
+
configureServer(server) {
|
|
18
|
+
// Store the custom config in Vite's server context for sharing
|
|
19
|
+
server.config.env.VITE_MCP_PLUGIN_ID = pluginId;
|
|
20
|
+
// Configure process.env variables with MCP server options
|
|
21
|
+
if (options.httpPort)
|
|
22
|
+
process.env.MCP_HTTP_PORT = String(options.httpPort);
|
|
23
|
+
if (options.mcpEndpoint)
|
|
24
|
+
process.env.MCP_ENDPOINT = options.mcpEndpoint;
|
|
25
|
+
if (options.serverName)
|
|
26
|
+
process.env.MCP_SERVER_NAME = options.serverName;
|
|
27
|
+
if (options.serverVersion)
|
|
28
|
+
process.env.MCP_SERVER_VERSION = options.serverVersion;
|
|
29
|
+
if (options.sessionTimeout)
|
|
30
|
+
process.env.MCP_SESSION_TIMEOUT = String(options.sessionTimeout);
|
|
31
|
+
if (options.sessionCleanupInterval)
|
|
32
|
+
process.env.MCP_SESSION_CLEANUP_INTERVAL = String(options.sessionCleanupInterval);
|
|
33
|
+
// Add CORS middleware
|
|
34
|
+
server.middlewares.use((req, res, next) => {
|
|
35
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
36
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
37
|
+
res.setHeader("Access-Control-Allow-Headers", `Origin, X-Requested-With, Content-Type, Accept, mcp-session-id`);
|
|
38
|
+
if (req.method === "OPTIONS") {
|
|
39
|
+
res.statusCode = 200;
|
|
40
|
+
res.end();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
next();
|
|
44
|
+
});
|
|
45
|
+
// Handle MCP endpoint requests
|
|
46
|
+
server.middlewares.use(async (req, res, next) => {
|
|
47
|
+
const mcpEndpoint = options.mcpEndpoint || "/mcp";
|
|
48
|
+
const url = req.url || "/";
|
|
49
|
+
if (url.startsWith(mcpEndpoint)) {
|
|
50
|
+
// Only proceed if MCP server is initialized
|
|
51
|
+
if (!mcpServerInstance) {
|
|
52
|
+
console.error("MCP server not initialized yet");
|
|
53
|
+
res.statusCode = 503;
|
|
54
|
+
res.setHeader("Content-Type", "application/json");
|
|
55
|
+
res.end(JSON.stringify(createErrorResponse("MCP server not initialized yet")));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (req.method === "GET") {
|
|
59
|
+
await mcpServerInstance.handleGetRequest(req, res);
|
|
60
|
+
}
|
|
61
|
+
else if (req.method === "POST") {
|
|
62
|
+
let body = "";
|
|
63
|
+
req.on("data", (chunk) => {
|
|
64
|
+
body += chunk.toString();
|
|
65
|
+
});
|
|
66
|
+
req.on("end", async () => {
|
|
67
|
+
try {
|
|
68
|
+
const jsonBody = JSON.parse(body);
|
|
69
|
+
await mcpServerInstance.handlePostRequest(req, res, jsonBody);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error("Error parsing request body:", error);
|
|
73
|
+
res.statusCode = 400;
|
|
74
|
+
res.end(JSON.stringify(createErrorResponse("Invalid JSON body")));
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
next();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
next();
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Start the MCP server when Vite server is ready
|
|
87
|
+
server.httpServer?.on("listening", async () => {
|
|
88
|
+
console.log(`Vite server is ready, initializing MCP server with ${transport} transport`);
|
|
89
|
+
try {
|
|
90
|
+
// Initialize the MCP server
|
|
91
|
+
const serverInstances = await initServer(transport);
|
|
92
|
+
mcpServerInstance = serverInstances.mcpServer;
|
|
93
|
+
const hostConfig = server.config.server;
|
|
94
|
+
const protocol = hostConfig.https ? "https" : "http";
|
|
95
|
+
const host = hostConfig.host === true
|
|
96
|
+
? "localhost"
|
|
97
|
+
: hostConfig.host || "localhost";
|
|
98
|
+
const port = hostConfig.port || 3000;
|
|
99
|
+
const mcpEndpoint = options.mcpEndpoint || "/mcp";
|
|
100
|
+
console.log(`MCP server initialized with ${transport} transport`);
|
|
101
|
+
console.log(`MCP endpoint available at: ${protocol}://${host}:${port}${mcpEndpoint}`);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error("Failed to initialize MCP server:", error);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
closeBundle() {
|
|
109
|
+
// Clean up resources when Vite is shutting down
|
|
110
|
+
if (mcpServerInstance) {
|
|
111
|
+
try {
|
|
112
|
+
console.log("Shutting down MCP server...");
|
|
113
|
+
if (typeof mcpServerInstance.shutdown === "function") {
|
|
114
|
+
mcpServerInstance.shutdown();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error("Error shutting down MCP server:", error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Default export for convenience
|
|
126
|
+
*/
|
|
127
|
+
export default mcpPlugin;
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { IncomingMessage, ServerResponse } from "http";
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for the MCP server
|
|
5
|
+
*/
|
|
6
|
+
interface ServerConfig {
|
|
7
|
+
httpPort: number;
|
|
8
|
+
mcpEndpoint: string;
|
|
9
|
+
serverName: string;
|
|
10
|
+
serverVersion: string;
|
|
11
|
+
sessionTimeout: number;
|
|
12
|
+
sessionCleanupInterval: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Implementation of an MCP server for Meilisearch
|
|
16
|
+
*/
|
|
17
|
+
declare class MCPServer {
|
|
18
|
+
private readonly JSON_RPC;
|
|
19
|
+
private readonly SESSION_ID_HEADER_NAME;
|
|
20
|
+
private server;
|
|
21
|
+
private cleanupInterval;
|
|
22
|
+
private sessions;
|
|
23
|
+
private config;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new MCP server instance
|
|
26
|
+
* @param server The underlying MCP server implementation
|
|
27
|
+
* @param config Configuration options
|
|
28
|
+
*/
|
|
29
|
+
constructor(server: McpServer, config?: Partial<ServerConfig>);
|
|
30
|
+
/**
|
|
31
|
+
* Handles an HTTP GET request
|
|
32
|
+
* @param req The HTTP request
|
|
33
|
+
* @param res The HTTP response
|
|
34
|
+
*/
|
|
35
|
+
handleGetRequest(req: IncomingMessage, res: ServerResponse): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Handles an HTTP POST request (executes MCP commands)
|
|
38
|
+
* @param req The HTTP request
|
|
39
|
+
* @param res The HTTP response
|
|
40
|
+
* @param body The request body
|
|
41
|
+
*/
|
|
42
|
+
handlePostRequest(req: IncomingMessage, res: ServerResponse, body: any): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Clean up and release server resources
|
|
45
|
+
*/
|
|
46
|
+
shutdown(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Handles the initial connection request
|
|
49
|
+
* @param req The HTTP request
|
|
50
|
+
* @param res The HTTP response
|
|
51
|
+
* @param body The request body
|
|
52
|
+
*/
|
|
53
|
+
private handleInitializeRequest;
|
|
54
|
+
/**
|
|
55
|
+
* Sends a notification about tool list changes
|
|
56
|
+
*/
|
|
57
|
+
private sendToolListChangedNotification;
|
|
58
|
+
/**
|
|
59
|
+
* Sends a notification through the transport
|
|
60
|
+
*/
|
|
61
|
+
private sendNotification;
|
|
62
|
+
/**
|
|
63
|
+
* Checks if the request body represents an initialize request
|
|
64
|
+
*/
|
|
65
|
+
private isInitializeRequest;
|
|
66
|
+
/**
|
|
67
|
+
* Extracts session ID from request headers
|
|
68
|
+
*/
|
|
69
|
+
private extractSessionId;
|
|
70
|
+
/**
|
|
71
|
+
* Updates the activity timestamp for a session
|
|
72
|
+
*/
|
|
73
|
+
private updateSessionActivity;
|
|
74
|
+
/**
|
|
75
|
+
* Sends an error response with the specified status code and message
|
|
76
|
+
*/
|
|
77
|
+
private sendErrorResponse;
|
|
78
|
+
/**
|
|
79
|
+
* Starts the session cleanup process
|
|
80
|
+
*/
|
|
81
|
+
private startSessionCleanup;
|
|
82
|
+
/**
|
|
83
|
+
* Removes expired sessions
|
|
84
|
+
*/
|
|
85
|
+
private cleanupExpiredSessions;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Return type for the initServer function
|
|
89
|
+
*/
|
|
90
|
+
export interface ServerInstances {
|
|
91
|
+
mcpServer?: MCPServer;
|
|
92
|
+
viteServer?: any;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Initialize the MCP server with the specified transport
|
|
96
|
+
* @param transport The transport type to use ("stdio" or "http")
|
|
97
|
+
* @returns A promise that resolves to the server instances
|
|
98
|
+
* @throws Error if the transport type is unsupported
|
|
99
|
+
*/
|
|
100
|
+
export declare const initServer: (transport: "stdio" | "http") => Promise<ServerInstances>;
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +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;AAgBvD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE;;GAEG;AACH,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAmBD;;GAEG;AACH,cAAM,SAAS;IACb,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoB;IAE3D,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,MAAM,CAAe;IAE7B;;;;OAIG;gBACS,MAAM,EAAE,SAAS,EAAE,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM;IAQjE;;;;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;IAkChB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAsBhB;;;;;OAKG;YACW,uBAAuB;IA6CrC;;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;IAM3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CA4B/B;AAyKD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GACrB,WAAW,OAAO,GAAG,MAAM,KAC1B,OAAO,CAAC,eAAe,CAezB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createServer as createViteServer } from "vite";
|
|
2
3
|
import { InitializeRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
3
4
|
import registerTaskTools from "./tools/task-tools.js";
|
|
4
5
|
import registerIndexTools from "./tools/index-tools.js";
|
|
@@ -8,7 +9,6 @@ import registerVectorTools from "./tools/vector-tools.js";
|
|
|
8
9
|
import registerDocumentTools from "./tools/document-tools.js";
|
|
9
10
|
import registerSettingsTools from "./tools/settings-tools.js";
|
|
10
11
|
import { createErrorResponse } from "./utils/error-handler.js";
|
|
11
|
-
import express from "express";
|
|
12
12
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
13
13
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
14
14
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
@@ -27,9 +27,8 @@ class MCPServer {
|
|
|
27
27
|
JSON_RPC = "2.0";
|
|
28
28
|
SESSION_ID_HEADER_NAME = "mcp-session-id";
|
|
29
29
|
server;
|
|
30
|
-
sessions = new Map();
|
|
31
|
-
toolsRegistered = false;
|
|
32
30
|
cleanupInterval = null;
|
|
31
|
+
sessions = new Map();
|
|
33
32
|
config;
|
|
34
33
|
/**
|
|
35
34
|
* Creates a new MCP server instance
|
|
@@ -39,7 +38,6 @@ class MCPServer {
|
|
|
39
38
|
constructor(server, config = {}) {
|
|
40
39
|
this.server = server;
|
|
41
40
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
42
|
-
this.toolsRegistered = this.registerTools();
|
|
43
41
|
// Start session cleanup if using HTTP transport
|
|
44
42
|
this.startSessionCleanup();
|
|
45
43
|
}
|
|
@@ -76,21 +74,22 @@ class MCPServer {
|
|
|
76
74
|
* Handles an HTTP POST request (executes MCP commands)
|
|
77
75
|
* @param req The HTTP request
|
|
78
76
|
* @param res The HTTP response
|
|
77
|
+
* @param body The request body
|
|
79
78
|
*/
|
|
80
|
-
async handlePostRequest(req, res) {
|
|
79
|
+
async handlePostRequest(req, res, body) {
|
|
81
80
|
const sessionId = this.extractSessionId(req);
|
|
82
81
|
try {
|
|
83
82
|
// Case 1: Existing session
|
|
84
83
|
if (sessionId && this.sessions.has(sessionId)) {
|
|
85
84
|
console.log(`POST request for existing session ${sessionId}`);
|
|
86
85
|
const sessionInfo = this.sessions.get(sessionId);
|
|
87
|
-
await sessionInfo.transport.handleRequest(req, res,
|
|
86
|
+
await sessionInfo.transport.handleRequest(req, res, body);
|
|
88
87
|
this.updateSessionActivity(sessionId);
|
|
89
88
|
return;
|
|
90
89
|
}
|
|
91
90
|
// Case 2: Initialize request
|
|
92
|
-
if (!sessionId && this.isInitializeRequest(
|
|
93
|
-
await this.handleInitializeRequest(req, res);
|
|
91
|
+
if (!sessionId && this.isInitializeRequest(body)) {
|
|
92
|
+
await this.handleInitializeRequest(req, res, body);
|
|
94
93
|
return;
|
|
95
94
|
}
|
|
96
95
|
// Case 3: Invalid request
|
|
@@ -128,8 +127,9 @@ class MCPServer {
|
|
|
128
127
|
* Handles the initial connection request
|
|
129
128
|
* @param req The HTTP request
|
|
130
129
|
* @param res The HTTP response
|
|
130
|
+
* @param body The request body
|
|
131
131
|
*/
|
|
132
|
-
async handleInitializeRequest(req, res) {
|
|
132
|
+
async handleInitializeRequest(req, res, body) {
|
|
133
133
|
console.log("Handling initialize request");
|
|
134
134
|
const newSessionId = randomUUID();
|
|
135
135
|
const transport = new StreamableHTTPServerTransport({
|
|
@@ -143,7 +143,7 @@ class MCPServer {
|
|
|
143
143
|
res.setHeader(this.SESSION_ID_HEADER_NAME, newSessionId);
|
|
144
144
|
res.setHeader("Access-Control-Expose-Headers", this.SESSION_ID_HEADER_NAME);
|
|
145
145
|
// Handle the initialize request
|
|
146
|
-
await transport.handleRequest(req, res,
|
|
146
|
+
await transport.handleRequest(req, res, body);
|
|
147
147
|
// Register the session
|
|
148
148
|
this.sessions.set(newSessionId, {
|
|
149
149
|
transport,
|
|
@@ -159,30 +159,6 @@ class MCPServer {
|
|
|
159
159
|
this.sendErrorResponse(res, 500, `Failed to initialize: ${error}`);
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
|
-
/**
|
|
163
|
-
* Registers all available tools with the MCP server
|
|
164
|
-
*/
|
|
165
|
-
registerTools() {
|
|
166
|
-
try {
|
|
167
|
-
console.log("Registering MCP tools...");
|
|
168
|
-
const tools = [
|
|
169
|
-
registerSystemTools,
|
|
170
|
-
registerIndexTools,
|
|
171
|
-
registerSearchTools,
|
|
172
|
-
registerSettingsTools,
|
|
173
|
-
registerDocumentTools,
|
|
174
|
-
registerTaskTools,
|
|
175
|
-
registerVectorTools,
|
|
176
|
-
];
|
|
177
|
-
tools.forEach((registerFn) => registerFn(this.server));
|
|
178
|
-
console.log("Successfully registered all tools");
|
|
179
|
-
return true;
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
console.error("Failed to register tools:", error);
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
162
|
/**
|
|
187
163
|
* Sends a notification about tool list changes
|
|
188
164
|
*/
|
|
@@ -226,7 +202,8 @@ class MCPServer {
|
|
|
226
202
|
* Extracts session ID from request headers
|
|
227
203
|
*/
|
|
228
204
|
extractSessionId(req) {
|
|
229
|
-
|
|
205
|
+
const headerValue = req.headers[this.SESSION_ID_HEADER_NAME.toLowerCase()];
|
|
206
|
+
return Array.isArray(headerValue) ? headerValue[0] : headerValue;
|
|
230
207
|
}
|
|
231
208
|
/**
|
|
232
209
|
* Updates the activity timestamp for a session
|
|
@@ -241,7 +218,9 @@ class MCPServer {
|
|
|
241
218
|
* Sends an error response with the specified status code and message
|
|
242
219
|
*/
|
|
243
220
|
sendErrorResponse(res, status, message) {
|
|
244
|
-
res.status
|
|
221
|
+
res.statusCode = status;
|
|
222
|
+
res.setHeader("Content-Type", "application/json");
|
|
223
|
+
res.end(JSON.stringify(createErrorResponse(message)));
|
|
245
224
|
}
|
|
246
225
|
/**
|
|
247
226
|
* Starts the session cleanup process
|
|
@@ -282,102 +261,163 @@ class MCPServer {
|
|
|
282
261
|
}
|
|
283
262
|
}
|
|
284
263
|
/**
|
|
285
|
-
* Initialize the MCP server with HTTP transport
|
|
264
|
+
* Initialize the MCP server with HTTP transport using Vite
|
|
286
265
|
*/
|
|
287
|
-
const initServerHTTPTransport = () => {
|
|
288
|
-
const config =
|
|
266
|
+
const initServerHTTPTransport = async () => {
|
|
267
|
+
const config = {
|
|
268
|
+
...DEFAULT_CONFIG,
|
|
269
|
+
httpPort: process.env.MCP_HTTP_PORT
|
|
270
|
+
? parseInt(process.env.MCP_HTTP_PORT, 10)
|
|
271
|
+
: DEFAULT_CONFIG.httpPort,
|
|
272
|
+
mcpEndpoint: process.env.MCP_ENDPOINT || DEFAULT_CONFIG.mcpEndpoint,
|
|
273
|
+
serverName: process.env.MCP_SERVER_NAME || DEFAULT_CONFIG.serverName,
|
|
274
|
+
serverVersion: process.env.MCP_SERVER_VERSION || DEFAULT_CONFIG.serverVersion,
|
|
275
|
+
sessionTimeout: process.env.MCP_SESSION_TIMEOUT
|
|
276
|
+
? parseInt(process.env.MCP_SESSION_TIMEOUT, 10)
|
|
277
|
+
: DEFAULT_CONFIG.sessionTimeout,
|
|
278
|
+
sessionCleanupInterval: process.env.MCP_SESSION_CLEANUP_INTERVAL
|
|
279
|
+
? parseInt(process.env.MCP_SESSION_CLEANUP_INTERVAL, 10)
|
|
280
|
+
: DEFAULT_CONFIG.sessionCleanupInterval,
|
|
281
|
+
};
|
|
289
282
|
const serverInstance = new McpServer({
|
|
290
283
|
name: config.serverName,
|
|
291
284
|
version: config.serverVersion,
|
|
292
285
|
});
|
|
286
|
+
// Register all tools
|
|
287
|
+
registerIndexTools(serverInstance);
|
|
288
|
+
registerDocumentTools(serverInstance);
|
|
289
|
+
registerSearchTools(serverInstance);
|
|
290
|
+
registerSettingsTools(serverInstance);
|
|
291
|
+
registerVectorTools(serverInstance);
|
|
292
|
+
registerSystemTools(serverInstance);
|
|
293
|
+
registerTaskTools(serverInstance);
|
|
293
294
|
const server = new MCPServer(serverInstance, config);
|
|
294
|
-
const
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
295
|
+
const isPluginMode = process.env.VITE_MCP_PLUGIN_ID !== undefined;
|
|
296
|
+
let vite;
|
|
297
|
+
if (!isPluginMode) {
|
|
298
|
+
vite = await createViteServer({
|
|
299
|
+
server: {
|
|
300
|
+
port: config.httpPort,
|
|
301
|
+
middlewareMode: true,
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
// Add CORS middleware
|
|
305
|
+
vite.middlewares.use((req, res, next) => {
|
|
306
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
307
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
308
|
+
res.setHeader("Access-Control-Allow-Headers", `Origin, X-Requested-With, Content-Type, Accept, ${server["SESSION_ID_HEADER_NAME"]}`);
|
|
309
|
+
if (req.method === "OPTIONS") {
|
|
310
|
+
res.statusCode = 200;
|
|
311
|
+
res.end();
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
next();
|
|
315
|
+
});
|
|
316
|
+
vite.middlewares.use(async (req, res, next) => {
|
|
317
|
+
const url = req.url || "/";
|
|
318
|
+
if (url.startsWith(config.mcpEndpoint)) {
|
|
319
|
+
if (req.method === "GET") {
|
|
320
|
+
await server.handleGetRequest(req, res);
|
|
321
|
+
}
|
|
322
|
+
else if (req.method === "POST") {
|
|
323
|
+
let body = "";
|
|
324
|
+
req.on("data", (chunk) => {
|
|
325
|
+
body += chunk.toString();
|
|
326
|
+
});
|
|
327
|
+
req.on("end", async () => {
|
|
328
|
+
try {
|
|
329
|
+
const jsonBody = JSON.parse(body);
|
|
330
|
+
await server.handlePostRequest(req, res, jsonBody);
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
console.error("Error parsing request body:", error);
|
|
334
|
+
res.statusCode = 400;
|
|
335
|
+
res.end(JSON.stringify(createErrorResponse("Invalid JSON body")));
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
next();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
next();
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
console.log("Meilisearch MCP Server is running on Vite HTTP transport (standalone mode):", `http://localhost:${config.httpPort}${config.mcpEndpoint}`);
|
|
348
|
+
// Handle server shutdown in standalone mode
|
|
349
|
+
process.on("SIGINT", async () => {
|
|
350
|
+
console.log("Received SIGINT signal");
|
|
351
|
+
server.shutdown();
|
|
352
|
+
if (vite) {
|
|
353
|
+
await vite.close();
|
|
354
|
+
console.log("Vite server closed");
|
|
355
|
+
}
|
|
328
356
|
process.exit(0);
|
|
329
357
|
});
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
console.log("Meilisearch MCP Server is running on Vite HTTP transport (plugin mode):", `${config.mcpEndpoint}`);
|
|
361
|
+
}
|
|
362
|
+
// Return both server instances for proper cleanup
|
|
363
|
+
return { mcpServer: server, viteServer: vite };
|
|
336
364
|
};
|
|
337
365
|
/**
|
|
338
366
|
* Initialize the MCP server with stdio transport
|
|
367
|
+
* @returns MCP server instance
|
|
339
368
|
*/
|
|
340
369
|
const initServerStdioTransport = async () => {
|
|
341
|
-
|
|
342
|
-
const
|
|
370
|
+
// Use environment variables if available, otherwise use defaults
|
|
371
|
+
const config = {
|
|
372
|
+
...DEFAULT_CONFIG,
|
|
373
|
+
serverName: process.env.MCP_SERVER_NAME || DEFAULT_CONFIG.serverName,
|
|
374
|
+
serverVersion: process.env.MCP_SERVER_VERSION || DEFAULT_CONFIG.serverVersion,
|
|
375
|
+
};
|
|
376
|
+
const serverInstance = new McpServer({
|
|
343
377
|
name: config.serverName,
|
|
344
378
|
version: config.serverVersion,
|
|
345
379
|
});
|
|
346
380
|
// Register all tools
|
|
347
|
-
registerIndexTools(
|
|
348
|
-
registerDocumentTools(
|
|
349
|
-
registerSearchTools(
|
|
350
|
-
registerSettingsTools(
|
|
351
|
-
registerVectorTools(
|
|
352
|
-
registerSystemTools(
|
|
353
|
-
registerTaskTools(
|
|
381
|
+
registerIndexTools(serverInstance);
|
|
382
|
+
registerDocumentTools(serverInstance);
|
|
383
|
+
registerSearchTools(serverInstance);
|
|
384
|
+
registerSettingsTools(serverInstance);
|
|
385
|
+
registerVectorTools(serverInstance);
|
|
386
|
+
registerSystemTools(serverInstance);
|
|
387
|
+
registerTaskTools(serverInstance);
|
|
388
|
+
// Create MCPServer instance
|
|
389
|
+
const server = new MCPServer(serverInstance, config);
|
|
354
390
|
// Connect stdio transport
|
|
355
391
|
const transport = new StdioServerTransport();
|
|
356
|
-
await
|
|
392
|
+
await serverInstance.connect(transport);
|
|
357
393
|
console.log("Meilisearch MCP Server is running on stdio transport");
|
|
358
394
|
// Handle process termination
|
|
359
395
|
process.on("SIGINT", () => {
|
|
360
396
|
console.log("Shutting down stdio server...");
|
|
361
397
|
process.exit(0);
|
|
362
398
|
});
|
|
399
|
+
return server;
|
|
363
400
|
};
|
|
364
401
|
/**
|
|
365
402
|
* Initialize the MCP server with the specified transport
|
|
366
403
|
* @param transport The transport type to use ("stdio" or "http")
|
|
404
|
+
* @returns A promise that resolves to the server instances
|
|
367
405
|
* @throws Error if the transport type is unsupported
|
|
368
406
|
*/
|
|
369
|
-
export const initServer = (transport) => {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
407
|
+
export const initServer = async (transport) => {
|
|
408
|
+
try {
|
|
409
|
+
switch (transport) {
|
|
410
|
+
case "stdio":
|
|
411
|
+
const stdioServer = await initServerStdioTransport();
|
|
412
|
+
return { mcpServer: stdioServer };
|
|
413
|
+
case "http":
|
|
414
|
+
return await initServerHTTPTransport();
|
|
415
|
+
default:
|
|
416
|
+
throw new Error(`Unsupported transport type: ${transport}`);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
console.error(`Fatal error initializing ${transport} transport:`, error);
|
|
421
|
+
throw error;
|
|
382
422
|
}
|
|
383
423
|
};
|
package/dist/stdio.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Register document management tools with the MCP server
|
|
4
|
+
*
|
|
5
|
+
* @param server - The MCP server instance
|
|
6
|
+
*/
|
|
7
|
+
export declare const registerDocumentTools: (server: McpServer) => void;
|
|
8
|
+
export default registerDocumentTools;
|
|
9
|
+
//# sourceMappingURL=document-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-tools.d.ts","sourceRoot":"","sources":["../../src/tools/document-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiDpE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,SAkQtD,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Register index management tools with the MCP server
|
|
4
|
+
*
|
|
5
|
+
* @param server - The MCP server instance
|
|
6
|
+
*/
|
|
7
|
+
export declare const registerIndexTools: (server: McpServer) => void;
|
|
8
|
+
export default registerIndexTools;
|
|
9
|
+
//# sourceMappingURL=index-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-tools.d.ts","sourceRoot":"","sources":["../../src/tools/index-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoCpE;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,SA6KnD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Register search tools with the MCP server
|
|
4
|
+
*
|
|
5
|
+
* @param server - The MCP server instance
|
|
6
|
+
*/
|
|
7
|
+
export declare const registerSearchTools: (server: McpServer) => void;
|
|
8
|
+
export default registerSearchTools;
|
|
9
|
+
//# sourceMappingURL=search-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCpE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,SAAS,SA2QpD,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Meilisearch Settings Management Tools
|
|
4
|
+
*
|
|
5
|
+
* This module implements MCP tools for managing index settings in Meilisearch.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Register settings management tools with the MCP server
|
|
9
|
+
*
|
|
10
|
+
* @param server - The MCP server instance
|
|
11
|
+
*/
|
|
12
|
+
export declare const registerSettingsTools: (server: McpServer) => void;
|
|
13
|
+
export default registerSettingsTools;
|
|
14
|
+
//# sourceMappingURL=settings-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-tools.d.ts","sourceRoot":"","sources":["../../src/tools/settings-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE;;;;GAIG;AAEH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,SA0VtD,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Meilisearch System Tools
|
|
4
|
+
*
|
|
5
|
+
* This module implements MCP tools for system operations in Meilisearch.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Register system tools with the MCP server
|
|
9
|
+
*
|
|
10
|
+
* @param server - The MCP server instance
|
|
11
|
+
*/
|
|
12
|
+
export declare const registerSystemTools: (server: McpServer) => void;
|
|
13
|
+
export default registerSystemTools;
|
|
14
|
+
//# sourceMappingURL=system-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-tools.d.ts","sourceRoot":"","sources":["../../src/tools/system-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE;;;;GAIG;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,SAAS,SAyOpD,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Register task management tools with the MCP server
|
|
4
|
+
*
|
|
5
|
+
* @param server - The MCP server instance
|
|
6
|
+
*/
|
|
7
|
+
export declare const registerTaskTools: (server: McpServer) => void;
|
|
8
|
+
export default registerTaskTools;
|
|
9
|
+
//# sourceMappingURL=task-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tools.d.ts","sourceRoot":"","sources":["../../src/tools/task-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCpE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,SAyNlD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
package/dist/tools/task-tools.js
CHANGED
|
@@ -160,7 +160,7 @@ export const registerTaskTools = (server) => {
|
|
|
160
160
|
const response = await apiClient.get(`/tasks/${taskUid}`);
|
|
161
161
|
taskData = response.data;
|
|
162
162
|
// Check if the task has completed
|
|
163
|
-
if (["succeeded", "failed", "canceled"].includes(
|
|
163
|
+
if (["succeeded", "failed", "canceled"].includes(response.statusText)) {
|
|
164
164
|
taskCompleted = true;
|
|
165
165
|
}
|
|
166
166
|
else {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Meilisearch Vector Search Tools
|
|
4
|
+
*
|
|
5
|
+
* This module implements MCP tools for vector search capabilities in Meilisearch.
|
|
6
|
+
* Note: Vector search is an experimental feature in Meilisearch.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Register vector search tools with the MCP server
|
|
10
|
+
*
|
|
11
|
+
* @param server - The MCP server instance
|
|
12
|
+
*/
|
|
13
|
+
export declare const registerVectorTools: (server: McpServer) => void;
|
|
14
|
+
export default registerVectorTools;
|
|
15
|
+
//# sourceMappingURL=vector-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-tools.d.ts","sourceRoot":"","sources":["../../src/tools/vector-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE;;;;;GAKG;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,SAAS,SAmQpD,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* Meilisearch API client
|
|
4
|
+
*
|
|
5
|
+
* This module provides a configured Axios instance for making requests to the Meilisearch API.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Creates a configured Axios instance for Meilisearch API requests
|
|
9
|
+
*
|
|
10
|
+
* @returns An Axios instance with base configuration
|
|
11
|
+
*/
|
|
12
|
+
export declare const createApiClient: () => {
|
|
13
|
+
get: <T = any>(url: string, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
14
|
+
post: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
15
|
+
put: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
16
|
+
patch: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
17
|
+
delete: <T = any>(url: string, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
18
|
+
};
|
|
19
|
+
export declare const apiClient: {
|
|
20
|
+
get: <T = any>(url: string, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
21
|
+
post: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
22
|
+
put: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
23
|
+
patch: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
24
|
+
delete: <T = any>(url: string, config?: AxiosRequestConfig) => Promise<AxiosResponse<T>>;
|
|
25
|
+
};
|
|
26
|
+
export default apiClient;
|
|
27
|
+
//# sourceMappingURL=api-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-handler.d.ts","sourceRoot":"","sources":["../../src/utils/api-handler.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAIjE;;;;GAIG;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe;UAWlB,CAAC,aAAa,MAAM,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;WAE5E,CAAC,aAAa,MAAM,SAAS,GAAG,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;UAE1F,CAAC,aAAa,MAAM,SAAS,GAAG,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAEvF,CAAC,aAAa,MAAM,SAAS,GAAG,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAExF,CAAC,aAAa,MAAM,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAGzF,CAAC;AAGF,eAAO,MAAM,SAAS;UAdZ,CAAC,aAAa,MAAM,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;WAE5E,CAAC,aAAa,MAAM,SAAS,GAAG,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;UAE1F,CAAC,aAAa,MAAM,SAAS,GAAG,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAEvF,CAAC,aAAa,MAAM,SAAS,GAAG,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAExF,CAAC,aAAa,MAAM,WAAW,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAMhD,CAAC;AAG3C,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handling utilities for Meilisearch API responses
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Formats Meilisearch API errors for consistent error messaging
|
|
6
|
+
*
|
|
7
|
+
* @param error - The error from the API request
|
|
8
|
+
* @returns A formatted error message
|
|
9
|
+
*/
|
|
10
|
+
export declare const handleApiError: (error: any) => string;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a standardized error response object for MCP tools
|
|
13
|
+
*
|
|
14
|
+
* @param error - The error from the API request
|
|
15
|
+
* @returns An MCP tool response object with error flag
|
|
16
|
+
*/
|
|
17
|
+
export declare const createErrorResponse: (error: any) => {
|
|
18
|
+
isError: boolean;
|
|
19
|
+
content: {
|
|
20
|
+
type: string;
|
|
21
|
+
text: string;
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
declare const _default: {
|
|
25
|
+
handleApiError: (error: any) => string;
|
|
26
|
+
createErrorResponse: (error: any) => {
|
|
27
|
+
isError: boolean;
|
|
28
|
+
content: {
|
|
29
|
+
type: string;
|
|
30
|
+
text: string;
|
|
31
|
+
}[];
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export default _default;
|
|
35
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,GAAG,KAAG,MAU3C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,GAAG;;;;;;CAK7C,CAAC;;4BAvBoC,GAAG,KAAG,MAAM;iCAkBP,GAAG;;;;;;;;AAO9C,wBAGE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-meilisearch",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "Model Context Protocol (MCP) implementation for Meilisearch",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,27 +13,23 @@
|
|
|
13
13
|
"client"
|
|
14
14
|
],
|
|
15
15
|
"scripts": {
|
|
16
|
-
"
|
|
17
|
-
"serve:
|
|
16
|
+
"build": "tsc && tsc --project tsconfig.types.json",
|
|
17
|
+
"serve:http": "npm run build && chmod 755 dist/http.js",
|
|
18
|
+
"serve:stdio": "npm run build && chmod 755 dist/stdio.js",
|
|
18
19
|
"server": "npm run serve:stdio && node --env-file=.env dist/stdio.js",
|
|
19
20
|
"client": "npm run serve:http && node --env-file=.env dist/http.js & npm run preview --workspace=client",
|
|
20
21
|
"prepare": "npm version patch",
|
|
21
|
-
"prepublishOnly": "
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {
|
|
24
25
|
"@modelcontextprotocol/sdk": "^1.10.1",
|
|
25
26
|
"axios": "^1.9.0",
|
|
26
|
-
"
|
|
27
|
-
"vue": "^3.5.13",
|
|
27
|
+
"vite": "^6.3.5",
|
|
28
28
|
"zod": "^3.24.4"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@types/express": "^5.0.1",
|
|
32
31
|
"@types/node": "^22.14.0",
|
|
33
|
-
"
|
|
34
|
-
"@vue/tsconfig": "^0.7.0",
|
|
35
|
-
"typescript": "^5.8.3",
|
|
36
|
-
"vite": "^6.3.5"
|
|
32
|
+
"typescript": "^5.8.3"
|
|
37
33
|
},
|
|
38
34
|
"engines": {
|
|
39
35
|
"node": ">=20.12.2",
|