我們在之前的文章 “將 agents 連接到 Elasticsearch 使用模型上下文協議” 及 “使用 MCP 將代理連接到 Elasticsearch 并對索引進行查詢” 詳述了如何使用 Elasticsearch MCP server 來和我們的 Elasticsearch 進行對話。細心的開發者可能已經注意到我們的 Elasticsearch MCP server 已經重寫了,而且他的運行方式也有所改變。請參考鏈接?https://github.com/elastic/mcp-server-elasticsearch。在今天的文章里,我來詳述如何一步一步地安裝 Elasticsearch MCP server,并展示如何和 Elasticsearch 進行對話。
安裝
Elasticsearch 及 Kibana
如果你還沒有安裝好你自己的 Elasticsearch 及 Kibana,那么請參考如下的文章來進行安裝:
-
如何在 Linux,MacOS 及 Windows 上進行安裝 Elasticsearch
-
Kibana:如何在 Linux,MacOS 及 Windows 上安裝 Elastic 棧中的 Kibana
在安裝的時候,請參考 Elastic Stack 8.x/9.x 的安裝指南來進行。在本次安裝中,我將使用 Elastic Stack 9.1.2?來進行展示。
首次安裝 Elasticsearch 的時候,我們可以看到如下的畫面:
我們按照上面的鏈接把 Elasticsearch 及 Kibana 安裝好。
?獲得 Elasticsearch API key
按照如下的步驟獲得 API key:
點擊上面的拷貝圖標。我們把得到的 API key 保存好,供下面進行使用。
安裝 Claude Desktop
我們可以在地址?App unavailable \ Anthropic?下載并按照 Claude Desktop。由于一些原因,我們需要自己來注冊一個賬號。
安裝 MCP 服務器
我們參考連接 mcp-server-elasticsearch?來進行安裝。通過 Model Context Protocol (MCP),你可以直接從任何 MCP 客戶端(例如 Claude Desktop)連接到你的 Elasticsearch 數據。這個服務器使用 Model Context Protocol (MCP) 將智能代理連接到你的 Elasticsearch 數據,使你能夠通過自然語言對話與 Elasticsearch 索引進行交互。

可用的工具
- list_indices:列出所有可用的 Elasticsearch 索引
- get_mappings:獲取指定 Elasticsearch 索引的字段映射
- search:使用提供的查詢 DSL 執行一次 Elasticsearch 搜索
- get_shards:獲取所有或指定索引的分片信息
可實現的查詢
- "What indices do I have in my Elasticsearch cluster?"
- "Show me the field mappings for the 'products' index."
- "Find all orders over $500 from last month."
- "Which products received the most 5-star reviews?"
工作原理
- MCP Client 分析你的請求,并確定需要執行哪些 Elasticsearch 操作。
- MCP Server 執行這些操作(列出索引、獲取映射、執行搜索)。
- MCP Client 處理結果,并以用戶友好的格式呈現。
安裝步驟
注意:
0.3.1 及更早版本是通過 npm 安裝的。這些版本已被棄用且不再受支持。以下說明僅適用于 0.4.0 及更高版本。
要查看 0.3.1 及更早版本的說明,請參閱 v0.3.1 的 README。
在本博客中,我們將在本地部署 MCP 服務器。我們查看頁面?https://github.com/elastic/mcp-server-elasticsearch。這個 MCP 服務器作為一個 Docker 鏡像提供,地址是 docker.elastic.co/mcp/elasticsearch,支持 MCP 的 stdio、SSE 和 streamable-HTTP 協議。它的安裝也非常直接。在新的發布中,它使用 docker 來進行安裝。運行這個容器而不帶任何參數會輸出一條用法信息:
docker run docker.elastic.co/mcp/elasticsearch
Usage: elasticsearch-mcp-server <COMMAND>Commands:stdio Start a stdio serverhttp Start a streamable-HTTP server with optional SSE supporthelp Print this message or the help of the given subcommand(s)Options:-h, --help Print help-V, --version Print version
使用 stdio 協議
MCP 服務器需要設置環境變量:
-
ES_URL: 你的 Elasticsearch 集群的 URL
-
身份驗證可使用 API key 或基本認證:
-
API key: ES_API_KEY
-
基本認證: ES_USERNAME 和 ES_PASSWORD
-
-
可選: ES_SSL_SKIP_VERIFY 設置為 true 時,會在連接 Elasticsearch 時跳過 SSL/TLS 證書驗證。提供自定義證書的功能將在后續版本中加入。
MCP 服務器在 stdio 模式下通過以下命令啟動:
docker run -i --rm -e ES_URL -e ES_API_KEY docker.elastic.co/mcp/elasticsearch stdio
針對我們運行在 https://localhost:9200 的 Elasticsearch,我們使用如下的命令來運行:
ES_URL=https://host.docker.internal:9200 ES_API_KEY=ZWRqdDBKZ0JDUHpOTGZoR0E0UzA6Z1B2TlBpUUppTUNvUHlCWEdQSGtrdw== ES_SSL_SKIP_VERIFY=true docker run -i --rm -e ES_URL -e ES_API_KEY -e ES_SSL_SKIP_VERIFY docker.elastic.co/mcp/elasticsearch stdio
我們替換 https://localhost:9200 為地址?https://host.docker.internal:9200?。
配置 Claude Desktop
針對免費的 Claude Desktop,它只支持 stdio。
-
打開 Claude 桌面應用
-
前往?Settings > Developer > MCP Servers
-
點擊?Edit Config?并添加一個新的 MCP 服務器,配置如下:
Claude Desktop 的配置如下:
{"mcpServers": {"elasticsearch-mcp-server": {"command": "docker","args": ["run", "-i", "--rm","-e", "ES_URL", "-e", "ES_API_KEY","docker.elastic.co/mcp/elasticsearch","stdio"],"env": {"ES_URL": "<elasticsearch-cluster-url>","ES_API_KEY": "<elasticsearch-API-key>"}}}
}
針對我們的情況,我們使用如下從配置:
{"mcpServers": {"elasticsearch-mcp-server": {"command": "docker","args": ["run","-i","--rm","-e","ES_URL","-e","ES_API_KEY","-e","ES_SSL_SKIP_VERIFY","docker.elastic.co/mcp/elasticsearch","stdio"],"env": {"ES_URL": "https://host.docker.internal:9200","ES_API_KEY": "ZWRqdDBKZ0JDUHpOTGZoR0E0UzA6Z1B2TlBpUUppTUNvUHlCWEdQSGtrdw==","ES_SSL_SKIP_VERIFY": "true"}}}
}
我們需要替換 https://localhost:9200 為?https://host.docker.internal:9200。由于目前的版本不支持 SSL 連接,我們設置?"ES_SSL_SKIP_VERIFY": "true"。如果在連接的過程中有錯誤,請在如下的地址查找錯誤信息:
~/Library/Logs/Claude/
$ cd ~/Library/Logs/Claude/
$ ls
main.log mcp.log
mcp-server-elasticsearch-mcp-server-local.log window.log
mcp-server-elasticsearch-mcp-server.log
測試
我們接下來測試我們的 Elasticsearch MCP server:
What are the indices in the Elasticsearch cluster?
What is the mapping for "my-index"?
Please return in JSON format
?接下來,我們導入一個 Kibana 自帶的索引:
這樣我們就向 Elasticsearch 寫入了一個叫做?kibana_sample_data_flights 名字的索引。
我們做如下的查詢:
What is the cheapest price from CN to US? and tell me the OriginCityName and DestCityName
在上面我們并沒有指名任何索引的名稱:
Please use the flights index
我們也可以嘗試使用中文來進行查詢:
從中國到美國的最低價格是多少?請告訴我出發城市名稱和目的地城市名稱。
很顯然,我們也得到了我們需要的答案。
{`index`: `kibana_sample_data_flights`,`query_body`: {`size`: 1,`sort`: [{`AvgTicketPrice`: {`order`: `asc`}}],`query`: {`bool`: {`must`: [{`term`: {`OriginCountry`: `CN`}},{`term`: {`DestCountry`: `US`}}]}},`_source`: [`AvgTicketPrice`,`OriginCityName`,`DestCityName`,`OriginCountry`,`DestCountry`]}
}
結論
通過 Elasticsearch MCP server 的使用,我們可以很方便地使用自然語音的方式來對我們的數據進行查詢。我們可以不必使用非常難寫的 DSL 語句。
Happy Exploration!