README Documentation
MCP Meilisearch API Server
A Model Context Protocol (MCP) server implementation that provides a bridge between AI models and the Meilisearch search engine.
Overview
- MCP Server: Exposes Meilisearch APIs as tools using the Model Context Protocol.
- Web Client Demo: A demo interface showcasing search functionalities.
- AI Inference: Intelligent tool selection based on user queries.
Key Features
- Multiple Transport Options: Supports both STDIO and StreamableHTTP transports.
- Meilisearch API Support: Full access to Meilisearch functionalities.
- Web Client Demo: Updated interface showcasing search capabilities and features.
- AI Inference: Leverages LLMs from providers such as OpenAI, HuggingFace, OpenRouter, and Ollama to intelligently determine and utilize the most suitable tool for user queries.
Getting Started
Prerequisites
- Node.js v20 or higher.
- A running Meilisearch instance (local or remote).
- API key for Meilisearch (if required).
- AI provider API key (if using AI inference).
Installation
Install the package:
# Using npm
npm install mcp-meilisearch
# Using yarn
yarn add mcp-meilisearch
# Using pnpm
pnpm add mcp-meilisearch
Options
Meilisearch Connection Options
meilisearchHost: URL of the Meilisearch instance (Default: "http://localhost:7700")meilisearchApiKey: API key for authenticating with Meilisearch (Default: "")
MCP Server Options
transport: Transport type for MCP server ("http" | "stdio") (Default: "http")httpPort: HTTP port for MCP server (Default: 4995)mcpEndpoint: MCP endpoint path (Default: "/mcp")
Session Options
sessionTimeout: Session timeout in milliseconds (Default: 3600000)sessionCleanupInterval: Session cleanup interval in milliseconds (Default: 60000)
AI Inference Options
aiProviderName: Name of the AI provider ("openai" | "huggingface" | "openrouter" | "ollama") (Default: "openai")aiProviderApiKey: AI provider API key for AI inferencellmModel: AI model to use (Default: "gpt-3.5-turbo")
Please be aware that not all models support function calling, which is required for proper AI inference in this package. Make sure to select a model that supports the tools parameter.
| Provider | Supported Models |
|---|---|
| OpenAI | List of supported models |
| OpenRouter | List of supported models |
| HuggingFace | List of supported models |
| Ollama | List of supported models |
Example server setup
await mcpMeilisearchServer({
meilisearchHost: "http://localhost:7700",
aiProviderName: "openrouter",
aiProviderApiKey: "your_openrouter_api_key",
llmModel: "anthropic/claude-3-opus", // Make sure to use a model that supports function calling
});
Using the MCPClient
The package exports the MCPClient class for client-side integration:
import { MCPClient } from "mcp-meilisearch/client";
const client = new MCPClient("mcp-meilisearch-client");
await client.connectToServer("http://localhost:4995/mcp");
const result = await client.callTool("global-search", {
q: "search kiosco antonio",
});
Client Methods
callTool(name, args)
Calls a specific tool on the MCP server with optional arguments.
Parameters:
name: String - The name of the tool to callargs: Object (Optional) - Arguments to pass to the tool
processSummary(query)
Processes data using AI to generate a human-readable summary.
Parameters:
query: Any - The data to be summarized
callToolWithAI(query, options)
Processes a user query through AI to determine and execute the most appropriate tool.
Parameters:
query: String - The user's query or request to be processedoptions: Object (Optional) - Configuration optionsspecificTools: String[] (Optional) - Restricts tool selection to this list of tool namesjustReasoning: Boolean (Optional) - When set totrue, returns only the AI's reasoning without executing the selected toolprovideSummary: Boolean (Optional) - When set totrue, generates a concise summary of the search results along with the regular response
Starting the Server
You can start the server programmatically:
import mcpMeilisearchServer from "mcp-meilisearch";
await mcpMeilisearchServer({
meilisearchHost: "http://localhost:7700",
meilisearchApiKey: "your_meilisearch_api_key",
aiProviderName: "openai",
aiProviderApiKey: "your_ai_provider_api_key",
llmModel: "gpt-4",
});
Tools
The MCP server exposes various tools that allow you to interact with Meilisearch functionalities. Each tool corresponds to a specific Meilisearch API endpoint, enabling you to perform operations such as searching, indexing, and managing documents.
Tool Categories
- System Tools: Health checks, version info, server stats.
- Index Tools: Manage indexes (create, update, delete, list).
- Document Tools: Add, update, delete, and retrieve documents.
- Search Tools: Advanced search, including vector search.
- Settings Tools: Configure index settings.
- Task Tools: Manage asynchronous tasks.
- Vector Tools: Experimental vector search capabilities.
System Tools
health
- Description: Check if the Meilisearch server is healthy.
version
- Description: Get the version information of the Meilisearch server.
info
- Description: Get the system information of the Meilisearch server.
stats
- Description: Get statistics about all indexes or a specific index.
- Parameters:
indexUid(string, optional): Unique identifier of the index.
get-tasks
- Description: Get information about tasks with optional filtering.
- Parameters:
limit(number, optional): Maximum number of tasks to return.from(number, optional): Task uid from which to start fetching.status(string, optional): Status of tasks to return.type(string, optional): Type of tasks to return.indexUids(string[], optional): UIDs of the indexes on which tasks were performed.
delete-tasks
- Description: Delete tasks based on provided filters.
- Parameters:
statuses(string[], optional): Statuses of tasks to delete.types(string[], optional): Types of tasks to delete.indexUids(string[], optional): UIDs of the indexes on which tasks to delete were performed.uids(number[], optional): UIDs of the tasks to delete.canceledBy(number[], optional): UIDs of the tasks that canceled tasks to delete.beforeUid(number, optional): Delete tasks whose uid is before this value.beforeStartedAt(string, optional): Delete tasks that started processing before this date (ISO 8601 format).beforeFinishedAt(string, optional): Delete tasks that finished processing before this date (ISO 8601 format).
Index Tools
list-indexes
- Description: List all indexes in the Meilisearch instance.
- Parameters:
limit(number, optional): Maximum number of indexes to return.offset(number, optional): Number of indexes to skip.
get-index
- Description: Get information about a specific Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.
create-index
- Description: Create a new Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier for the new index.primaryKey(string, optional): Primary key for the index.
update-index
- Description: Update a Meilisearch index (currently only supports updating the primary key).
- Parameters:
indexUid(string, required): Unique identifier of the index.primaryKey(string, required): New primary key for the index.
delete-index
- Description: Delete a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index to delete.
swap-indexes
- Description: Swap two or more indexes in Meilisearch.
- Parameters:
indexes(string, required): JSON array of index pairs to swap, e.g. [["movies", "movies_new"]].
Document Tools
get-documents
- Description: Get documents from a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.limit(number, optional): Maximum number of documents to return (default: 20).offset(number, optional): Number of documents to skip (default: 0).fields(string[], optional): Fields to return in the documents.filter(string, optional): Filter query to apply.
get-document
- Description: Get a document by its ID from a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.documentId(string, required): ID of the document to retrieve.fields(string[], optional): Fields to return in the document.
add-documents
- Description: Add documents to a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.documents(string, required): JSON array of documents to add.primaryKey(string, optional): Primary key for the documents.
update-documents
- Description: Update documents in a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.documents(string, required): JSON array of documents to update.primaryKey(string, optional): Primary key for the documents.
delete-document
- Description: Delete a document by its ID from a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.documentId(string, required): ID of the document to delete.
delete-documents
- Description: Delete multiple documents by their IDs from a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.documentIds(string, required): JSON array of document IDs to delete.
delete-all-documents
- Description: Delete all documents in a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.
Search Tools
search
- Description: Search for documents in a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.q(string, required): Search query.limit(number, optional): Maximum number of results to return (default: 20).offset(number, optional): Number of results to skip (default: 0).filter(string, optional): Filter query to apply.sort(string[], optional): Attributes to sort by, e.g. ["price:asc"].facets(string[], optional): Facets to return.attributesToRetrieve(string[], optional): Attributes to include in results.attributesToCrop(string[], optional): Attributes to crop.cropLength(number, optional): Length at which to crop cropped attributes.attributesToHighlight(string[], optional): Attributes to highlight.highlightPreTag(string, optional): Tag to insert before highlighted text.highlightPostTag(string, optional): Tag to insert after highlighted text.showMatchesPosition(boolean, optional): Whether to include match positions in results.matchingStrategy(string, optional): Matching strategy: 'all' or 'last'.
multi-search
- Description: Perform multiple searches in one request.
- Parameters:
queries(string, required): JSON array of search queries, each containing the same parameters as thesearchtool.
global-search
- Description: Search for a term across all available Meilisearch indexes and return combined results.
- Parameters:
q(string, required): Search query.limit(number, optional): Maximum number of results to return per index (default: 20).attributesToRetrieve(string[], optional): Attributes to include in results.
facet-search
- Description: Search for facet values matching specific criteria.
- Parameters:
indexUid(string, required): Unique identifier of the index.facetName(string, required): Name of the facet to search.facetQuery(string, optional): Query to match against facet values.filter(string, optional): Filter to apply to the base search.
Settings Tools
get-settings
- Description: Get all settings for a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.
update-settings
- Description: Update settings for a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.settings(string, required): JSON object containing settings to update.
reset-settings
- Description: Reset all settings for a Meilisearch index to their default values.
- Parameters:
indexUid(string, required): Unique identifier of the index.
Get Settings Tools
The following tools retrieve specific settings for a Meilisearch index:
- get-displayed-attributes
- get-searchable-attributes
- get-filterable-attributes
- get-sortable-attributes
- get-ranking-rules
- get-stop-words
- get-synonyms
- get-typo-tolerance
- get-pagination
- get-faceting
- get-dictionary
- get-proximity-precision
- get-separator-tokens
- get-non-separator-tokens
- get-word-dictionary
All these tools have the same parameter:
indexUid(string, required): Unique identifier of the index.
Update Settings Tools
The following tools update specific settings for a Meilisearch index:
-
update-displayed-attributes
indexUid(string, required): Unique identifier of the index.displayedAttributes(string, required): JSON array of attributes to display, e.g. ["title", "description"].
-
update-searchable-attributes
indexUid(string, required): Unique identifier of the index.searchableAttributes(string, required): JSON array of attributes that can be searched, e.g. ["title", "description"].
-
update-filterable-attributes
indexUid(string, required): Unique identifier of the index.filterableAttributes(string, required): JSON array of attributes that can be used as filters, e.g. ["genre", "director"].
-
update-sortable-attributes
indexUid(string, required): Unique identifier of the index.sortableAttributes(string, required): JSON array of attributes that can be used for sorting, e.g. ["price", "date"].
-
update-ranking-rules
indexUid(string, required): Unique identifier of the index.rankingRules(string, required): JSON array of ranking rules, e.g. ["typo", "words", "proximity", "attribute", "sort", "exactness"].
-
update-stop-words
indexUid(string, required): Unique identifier of the index.stopWords(string, required): JSON array of words to ignore in search queries, e.g. ["the", "a", "an"].
-
update-synonyms
indexUid(string, required): Unique identifier of the index.synonyms(string, required): JSON object mapping words to their synonyms, e.g. {"movie": ["film"]}.
-
update-typo-tolerance
indexUid(string, required): Unique identifier of the index.typoTolerance(string, required): JSON object with typo tolerance configuration, e.g. {"enabled": true, "minWordSizeForTypos": {"oneTypo": 5, "twoTypos": 9}}.
-
update-pagination
indexUid(string, required): Unique identifier of the index.pagination(string, required): JSON object with pagination configuration, e.g. {"maxTotalHits": 1000}.
-
update-faceting
indexUid(string, required): Unique identifier of the index.faceting(string, required): JSON object with faceting configuration, e.g. {"maxValuesPerFacet": 100}.
-
update-dictionary
indexUid(string, required): Unique identifier of the index.dictionary(string, required): JSON array of words to consider as a single word, e.g. ["San Francisco", "New York"].
-
update-proximity-precision
indexUid(string, required): Unique identifier of the index.proximityPrecision(string, required): String with proximity precision value, can be 'byWord' or 'byAttribute'.
-
update-separator-tokens
indexUid(string, required): Unique identifier of the index.separatorTokens(string, required): JSON array of tokens that should be considered as word separators, e.g. ["-", "_"].
-
update-non-separator-tokens
indexUid(string, required): Unique identifier of the index.nonSeparatorTokens(string, required): JSON array of tokens that should not be considered as word separators, e.g. ["@", "."].
-
update-word-dictionary
indexUid(string, required): Unique identifier of the index.wordDictionary(string, required): JSON array of custom words to add to the dictionary, e.g. ["cbuilder", "meilisearch"].
Reset Settings Tools
The following tools reset specific settings for a Meilisearch index to their default values:
- reset-displayed-attributes
- reset-searchable-attributes
- reset-filterable-attributes
- reset-sortable-attributes
- reset-ranking-rules
- reset-stop-words
- reset-synonyms
- reset-typo-tolerance
- reset-pagination
- reset-faceting
- reset-dictionary
- reset-proximity-precision
- reset-separator-tokens
- reset-non-separator-tokens
- reset-word-dictionary
All these reset tools have the same parameter:
indexUid(string, required): Unique identifier of the index.
Task Tools
list-tasks
- Description: List tasks with optional filtering.
- Parameters:
limit(number, optional): Maximum number of tasks to return.from(number, optional): Task uid from which to start fetching.statuses(string[], optional): Statuses of tasks to return.types(string[], optional): Types of tasks to return.indexUids(string[], optional): UIDs of the indexes on which tasks were performed.uids(number[], optional): UIDs of specific tasks to return.
get-task
- Description: Get information about a specific task.
- Parameters:
taskUid(number, required): Unique identifier of the task.
cancel-tasks
- Description: Cancel tasks based on provided filters.
- Parameters:
statuses(string[], optional): Statuses of tasks to cancel.types(string[], optional): Types of tasks to cancel.indexUids(string[], optional): UIDs of the indexes on which tasks to cancel were performed.uids(number[], optional): UIDs of the tasks to cancel.
wait-for-task
- Description: Wait for a specific task to complete.
- Parameters:
taskUid(number, required): Unique identifier of the task to wait for.timeoutMs(number, optional): Maximum time to wait in milliseconds (default: 5000).intervalMs(number, optional): Polling interval in milliseconds (default: 500).
Vector Tools
enable-vector-search
- Description: Enable the vector search experimental feature in Meilisearch.
get-experimental-features
- Description: Get the status of experimental features in Meilisearch.
update-embedders
- Description: Configure embedders for vector search.
- Parameters:
indexUid(string, required): Unique identifier of the index.embedders(string, required): JSON object containing embedder configurations.
get-embedders
- Description: Get the embedders configuration for an index.
- Parameters:
indexUid(string, required): Unique identifier of the index.
reset-embedders
- Description: Reset the embedders configuration for an index.
- Parameters:
indexUid(string, required): Unique identifier of the index.
vector-search
- Description: Perform a vector search in a Meilisearch index.
- Parameters:
indexUid(string, required): Unique identifier of the index.vector(string, required): JSON array representing the vector to search for.limit(number, optional): Maximum number of results to return (default: 20).offset(number, optional): Number of results to skip (default: 0).filter(string, optional): Filter to apply (e.g., 'genre = horror AND year > 2020').embedder(string, optional): Name of the embedder to use (if omitted, a 'vector' must be provided).attributes(string[], optional): Attributes to include in the vector search.query(string, optional): Text query to search for (if using 'embedder' instead of 'vector').hybrid(boolean, optional): Whether to perform a hybrid search (combining vector and text search).hybridRatio(number, optional): Ratio of vector vs text search in hybrid search (0-1, default: 0.5).