elasticsearch-mcp
A complete elasticsearch mcp server
Documentation
Octodet Elasticsearch MCP Server
A Model Context Protocol (MCP) server for Elasticsearch operations, providing a comprehensive set of tools for interacting with Elasticsearch clusters through the standardized Model Context Protocol. This server enables LLM-powered applications to search, update, and manage Elasticsearch data.
Features
- Complete Elasticsearch Operations: Full CRUD operations for documents and indices
- Bulk Operations: Process multiple operations in a single API call
- Query-Based Updates/Deletes: Modify or remove documents based on queries
- Cluster Management: Monitor health, shards, and templates
- Advanced Search: Full support for Elasticsearch DSL queries with highlighting
Installation
As an NPM Package
Install the package globally:
npm install -g @octodet/elasticsearch-mcpOr use it directly with npx:
npx @octodet/elasticsearch-mcpFrom Source
1. Clone this repository
2. Install dependencies:
npm install3. Build the server:
npm run buildIntegration with MCP Clients
VS Code Integration
Add the following configuration to your VS Code settings.json to integrate with the VS Code MCP extension:
"mcp.servers": {
"elasticsearch": {
"command": "npx",
"args": [
"-y", "@octodet/elasticsearch-mcp"
],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}Claude Desktop Integration
Configure in your Claude Desktop configuration file:
{
"mcpServers": {
"elasticsearch": {
"command": "npx",
"args": ["-y", "@octodet/elasticsearch-mcp"],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
}For Local Development
If you're developing the MCP server locally, you can configure the clients to use your local build:
{
"mcpServers": {
"elasticsearch": {
"command": "node",
"args": ["path/to/build/index.js"],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
}Configuration
The server uses the following environment variables for configuration:
| Variable | Description | Default |
|---|---|---|
| ES_URL | Elasticsearch server URL | http://localhost:9200 |
| ES_API_KEY | API key for authentication | |
| ES_USERNAME | Username for authentication | |
| ES_PASSWORD | Password for authentication | |
| ES_CA_CERT | Path to custom CA certificate | |
| ES_VERSION | Elasticsearch version (8 or 9) | 8 |
| ES_SSL_SKIP_VERIFY | Skip SSL verification | false |
| ES_PATH_PREFIX | Path prefix for Elasticsearch |
Tools
The server provides 16 MCP tools for Elasticsearch operations. Each tool is documented with its required and optional parameters:
1. List Indices
List all available Elasticsearch indices with detailed information.
Parameters:
- `indexPattern` (optional, string): Pattern to filter indices (e.g., "logs-_", "my-index-_")
Example:
{
"indexPattern": "logs-*"
}2. Get Mappings
Get field mappings for a specific Elasticsearch index.
Parameters:
- `index` (required, string): The name of the index to get mappings for
Example:
{
"index": "my-index"
}3. Search
Perform an Elasticsearch search with the provided query DSL and highlighting.
Parameters:
- `index` (required, string): The index or indices to search in (supports comma-separated values)
- `queryBody` (required, object): The Elasticsearch query DSL body
- `highlight` (optional, boolean): Enable search result highlighting (default: true)
Example:
{
"index": "my-index",
"queryBody": {
"query": {
"match": {
"content": "search term"
}
},
"size": 10,
"from": 0,
"sort": [{ "_score": { "order": "desc" } }]
},
"highlight": true
}4. Get Cluster Health
Get health information about the Elasticsearch cluster.
Parameters:
- None required
Example:
{}5. Get Shards
Get shard information for all or specific indices.
Parameters:
- `index` (optional, string): Specific index to get shard information for. If omitted, returns shards for all indices
Example:
{
"index": "my-index"
}6. Add Document
Add a new document to a specific Elasticsearch index.
Parameters:
- `index` (required, string): The index to add the document to
- `document` (required, object): The document content to add
- `id` (optional, string): Document ID. If omitted, Elasticsearch will generate one automatically
Example:
{
"index": "my-index",
"id": "doc1",
"document": {
"title": "My Document",
"content": "Document content here",
"timestamp": "2025-06-23T10:30:00Z",
"tags": ["important", "draft"]
}
}7. Update Document
Update an existing document in a specific Elasticsearch index.
Parameters:
- `index` (required, string): The index containing the document
- `id` (required, string): The ID of the document to update
- `document` (required, object): The partial document with fields to update
Example:
{
"index": "my-index",
"id": "doc1",
"document": {
"title": "Updated Document Title",
"last_modified": "2025-06-23T10:30:00Z"
}
}8. Delete Document
Delete a document from a specific Elasticsearch index.
Parameters:
- `index` (required, string): The index containing the document
- `id` (required, string): The ID of the document to delete
Example:
{
"index": "my-index",
"id": "doc1"
}9. Update By Query
Update documents in an Elasticsearch index based on a query.
Parameters:
- `index` (required, string): The index to update documents in
- `query` (required, object): Elasticsearch query to match documents for update
- `script` (required, object): Script to execute for updating matched documents
- `conflicts` (optional, string): How to handle version conflicts ("abort" or "proceed", default: "abort")
- `refresh` (optional, boolean): Whether to refresh the index after the operation (default: false)
Example:
{
"index": "my-index",
"query": {
"term": {
"status": "active"
}
},
"script": {
"source": "ctx._source.status = params.newStatus; ctx._source.updated_at = params.timestamp",
"params": {
"newStatus": "inactive",
"timestamp": "2025-06-23T10:30:00Z"
}
},
"conflicts": "proceed",
"refresh": true
}10. Delete By Query
Delete documents in an Elasticsearch index based on a query.
Parameters:
- `index` (required, string): The index to delete documents from
- `query` (required, object): Elasticsearch query to match documents for deletion
- `conflicts` (optional, string): How to handle version conflicts ("abort" or "proceed", default: "abort")
- `refresh` (optional, boolean): Whether to refresh the index after the operation (default: false)
Example:
{
"index": "my-index",
"query": {
"range": {
"created_date": {
"lt": "2025-01-01"
}
}
},
"conflicts": "proceed",
"refresh": true
}11. Bulk Operations
Perform multiple document operations in a single API call for better performance.
Parameters:
- `operations` (required, array): Array of operation objects, each containing:
- `action` (required, string): The operation type ("index", "create", "update", or "delete")
- `index` (required, string): The index for this operation
- `id` (optional, string): Document ID (required for update/delete, optional for index/create)
- `document` (conditional, object): Document content (required for index/create/update operations)
Example:
{
"operations": [
{
"action": "index",
"index": "my-index",
"id": "doc1",
"document": { "title": "Document 1", "content": "Content here" }
},
{
"action": "update",
"index": "my-index",
"id": "doc2",
"document": { "title": "Updated Title" }
},
{
"action": "delete",
"index": "my-index",
"id": "doc3"
}
]
}12. Create Index
Create a new Elasticsearch index with optional settings and mappings.
Parameters:
- `index` (required, string): The name of the index to create
- `settings` (optional, object): Index settings like number of shards, replicas, etc.
- `mappings` (optional, object): Field mappings defining how documents should be indexed
Example:
{
"index": "new-index",
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"custom_analyzer": {
"type": "standard",
"stopwords": "_english_"
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "custom_analyzer"
},
"created": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss'Z'"
},
"tags": {
"type": "keyword"
}
}
}
}13. Delete Index
Delete an Elasticsearch index permanently.
Parameters:
- `index` (required, string): The name of the index to delete
Example:
{
"index": "my-index"
}14. Count Documents
Count documents in an index, optionally filtered by a query.
Parameters:
- `index` (required, string): The index to count documents in
- `query` (optional, object): Elasticsearch query to filter documents for counting
Example:
{
"index": "my-index",
"query": {
"bool": {
"must": [
{ "term": { "status": "active" } },
{ "range": { "created_date": { "gte": "2025-01-01" } } }
]
}
}
}15. Get Templates
Get index templates from Elasticsearch.
Parameters:
- `name` (optional, string): Specific template name to retrieve. If omitted, returns all templates
Example:
{
"name": "logs-template"
}16. Get Aliases
Get index aliases from Elasticsearch.
Parameters:
- `name` (optional, string): Specific alias name to retrieve. If omitted, returns all aliases
Example:
{
"name": "logs-alias"
}Development
Running in Development Mode
Run the server in watch mode during development:
npm run devProtocol Implementation
This server implements the Model Context Protocol to enable standardized communication between LLM clients and Elasticsearch. It provides a set of tools that can be invoked by MCP clients to perform various Elasticsearch operations.
Adding New Tools
To add a new tool to the server:
1. Define the tool in `src/index.ts` using the MCP server's tool registration format
2. Implement the necessary functionality in `src/utils/elasticsearchService.ts`
3. Update this README to document the new tool
Other MCP Clients
This server can be used with any MCP-compatible client, including:
- OpenAI's ChatGPT via MCP plugins
- Anthropic's Claude Desktop
- Claude in VS Code
- Custom applications using the MCP SDK
Programmatic Usage
You can also use the server programmatically in your Node.js applications:
import { createOctodetElasticsearchMcpServer } from "@octodet/elasticsearch-mcp";
import { CustomTransport } from "@modelcontextprotocol/sdk/server";
// Configure the Elasticsearch connection
const config = {
url: "http://localhost:9200",
apiKey: "your_api_key",
version: "8",
};
// Create and start the server
async function startServer() {
const server = await createOctodetElasticsearchMcpServer(config);
// Connect to your custom transport
const transport = new CustomTransport();
await server.connect(transport);
console.log("Elasticsearch MCP server started");
}
startServer().catch(console.error);License
This project is licensed under the MIT License - see the LICENSE file for details.
Frequently asked questions
What is elasticsearch-mcp?
elasticsearch-mcp is A complete elasticsearch mcp server
How do I install elasticsearch-mcp?
Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.
Is elasticsearch-mcp open source?
Yes — it is hosted on GitHub at https://github.com/Octodet/elasticsearch-mcp and has 3 stars.
Related MCP tools
🔥 Official Firecrawl MCP Server - Adds powerful web scraping and search to Cursor, Claude and any other LLM clients.
Use any LLMs (Large Language Models) for Deep Research. Support SSE API and MCP server.
Enhanced MCP server for interactive user feedback and command execution in AI-assisted development, featuring dual interface support (Web UI and Desktop Application) with intelligent environment detection and cross-platform compatibility.
A powerful Zotero AI and MCP plugin with ChatGPT, Gemini 3.7, Claude Fable 5, Claude Opus 5, DeepSeek V4, Grok, OpenRouter, Kimi k3, GLM 5.3, SiliconFlow, GPT-oss, Gemma 4, Qwen 3.8
Connect your browser to AI models. Just use Dia on Chrome, Arc or Firefox.
文颜 MCP Server 可以让 AI 自动将 Markdown 文章排版后发布至微信公众号。
Run your own MCP server? See who uses it and what to fix.
Measure it with TrackMCP