> 技术文档 > 使用 MCP 将代理连接到 Elasticsearch 并对索引进行查询_es mcp

使用 MCP 将代理连接到 Elasticsearch 并对索引进行查询_es mcp

本文是之前文章 “将代理连接到 Elasticsearch 使用模型上下文协议” 的扩展。在这里,我们将以详细的步骤来一步一步地展示如何安装 MCP Server 及使用 MCP 服务器和我们的 Elasticsearch 中的数据来进行对话。

使用 MCP 将代理连接到 Elasticsearch 并对索引进行查询

ES/Kibana 双 MCP 架构下的新一代 Aiops 智能分析排障与管理实践 - 完整视频

安装

Elasticsearch 及 Kibana

如果你还没有安装好你自己的 Elasticsearch 及 Kibana,那么请参考如下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,请参考 Elastic Stack 8.x/9.x 的安装指南来进行。在本次安装中,我将使用 Elastic Stack 9.0 来进行展示。

首次安装 Elasticsearch 的时候,我们可以看到如下的画面:

如上所示,我们可以看到超级用户 elastic 的密码。我们记下这个密码,在下面的配置中使用。

获得 Elasticsearch API key

按照如下的步骤获得 API key:

点击上面的拷贝图标。我们把得到的 API key 保存好,供下面进行使用:Vk5sVE1KY0JIckVQMG9rbVNLREo6QjhSbEh2QkdlTjFpUkFKa1dZbTRuZw==

安装 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 索引进行交互。

Elasticsearch MCP Server

可用的工具

  • 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 处理结果,并以用户友好的格式呈现。

安装步骤

在本博客中,我们将在本地部署 MCP 服务器。使用 Elasticsearch MCP Server 最简单的方法是通过发布的 npm 包。

1)使用正确的 Node.js 版本。

如果你还没有安装 nvm (node version manager),那么请参考文章来进行安装。

brew install nvm
nvm --version
$ nvm --version0.40.3

我们使用如下的命令来下载 MCP server 文件:

git clone https://github.com/elastic/mcp-server-elasticsearch

然后我们进入到它的根目录下:

$ pwd/Users/liuxg/nodejs/mcp-server-elasticsearch$ lsLICENSE  catalog-info.yaml package.json tsconfig.jsonNOTICE.txt docs  renovate.json yarn.lockREADME.md index.ts scripts

我们打入如下的命令:

nvm use
$ nvm useFound \'/Users/liuxg/nodejs/mcp-server-elasticsearch/.nvmrc\' with version N/A: version \"v22.14.0\" is not yet installed.You need to run `nvm install` to install and use the node version specified in `.nvmrc`.$ nvm installFound \'/Users/liuxg/nodejs/mcp-server-elasticsearch/.nvmrc\' with version Downloading and installing node v22.14.0...Downloading https://nodejs.org/dist/v22.14.0/node-v22.14.0-darwin-arm64.tar.xz...################################################################################################## 100.0%Computing checksum with sha256sumChecksums matched!Now using node v22.14.0 (npm v10.9.2)Creating default alias: default -> 22.14.0 (-> v22.14.0)

2. 构建该项目

sudo npm install typescript -gsudo npm install zod
npm run build
$ npm run build> @elastic/mcp-server-elasticsearch@0.1.1 build> tsc && shx chmod +x dist/*.js

3. 在 Claude 桌面应用中本地运行:

  1. 打开 Claude 桌面应用

  2. 前往 Settings > Developer > MCP Servers

  3. 点击 Edit Config 并添加一个新的 MCP 服务器,配置如下:

针对我们的配置,我们使用如下的配置:

{ \"mcpServers\": { \"elasticsearch-mcp-server-local\": { \"command\": \"node\", \"args\": [ \"/Users/liuxg/nodejs/mcp-server-elasticsearch/dist/index.js\" ], \"env\": { \"ES_URL\": \"https://localhost:9200\", \"ES_API_KEY\": \"Vk5sVE1KY0JIckVQMG9rbVNLREo6QjhSbEh2QkdlTjFpUkFKa1dZbTRuZw==\", \"ES_CA_CERT\": \"/Users/liuxg/elastic/elasticsearch-9.0.1/config/certs/http_ca.crt\" } } }}

我们需要根据自己的配置进行相应的修改。

4. 使用 MCP Inspector 进行调试

sudo npm install @modelcontextprotocol/inspector@0.13.0
ES_URL=your-elasticsearch-url ES_API_KEY=your-api-key npm run inspector
ES_URL=https://localhost:9200 ES_API_KEY=Vk5sVE1KY0JIckVQMG9rbVNLREo6QjhSbEh2QkdlTjFpUkFKa1dZbTRuZw== npm run inspector

5. 检查 Claude desktop 是否连接到 Elasticsearch:

从上面的展示中,我们可以看出来 elasticsearch-mcp-server-local 已经被成功地连接成功,并且它展示了 4 个工具。

Demo 时刻

我们现在使用 Claude Deskop 来展示几个功能:

1)查询 Elasticsearch 有哪些索引:

What are the indices in Elasticsearch?

我们选择 Allow always:

它返回了一些我自己创建的索引。我们也可以在 Kibana 中进行查看:

GET /_cat/indices/*,-.*?v

2) 创建一个索引

我们可以参考文章 “Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索”。我们使用如下的命令来创建 people 索引:

PUT /people{ \"mappings\": { \"properties\": { \"name\": { \"type\": \"text\" }, \"description\": { \"type\": \"text\" }, \"sex\": { \"type\": \"keyword\" }, \"age\": { \"type\": \"integer\" }, \"address\": { \"type\": \"text\" } } }}
POST /_bulk{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"1\" } }{ \"name\" : \"John Doe\", \"description\" : \"A software developer\", \"sex\" : \"Male\", \"age\" : 30, \"address\" : \"123 Elm Street, Springfield\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"2\" } }{ \"name\" : \"Jane Smith\", \"description\" : \"A project manager\", \"sex\" : \"Female\", \"age\" : 28, \"address\" : \"456 Maple Avenue, Anytown\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"3\" } }{ \"name\" : \"Alice Johnson\", \"description\" : \"A graphic designer\", \"sex\" : \"Female\", \"age\" : 26, \"address\" : \"789 Oak Lane, Metropolis\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"4\" } }{ \"name\" : \"Bob Brown\", \"description\" : \"A marketing specialist\", \"sex\" : \"Male\", \"age\" : 32, \"address\" : \"321 Pine Street, Gotham\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"5\" } }{ \"name\" : \"Charlie Davis\", \"description\" : \"An IT analyst\", \"sex\" : \"Male\", \"age\" : 29, \"address\" : \"654 Cedar Blvd, Star City\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"6\" } }{ \"name\" : \"Diana Prince\", \"description\" : \"A diplomat\", \"sex\" : \"Female\", \"age\" : 35, \"address\" : \"987 Birch Road, Themyscira\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"7\" } }{ \"name\" : \"Evan Wright\", \"description\" : \"A journalist\", \"sex\" : \"Male\", \"age\" : 27, \"address\" : \"213 Willow Lane, Central City\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"8\" } }{ \"name\" : \"Fiona Gallagher\", \"description\" : \"A nurse\", \"sex\" : \"Female\", \"age\" : 31, \"address\" : \"546 Spruce Street, South Side\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"9\" } }{ \"name\" : \"George King\", \"description\" : \"A teacher\", \"sex\" : \"Male\", \"age\" : 34, \"address\" : \"879 Elm St, Smallville\" }{ \"index\" : { \"_index\" : \"people\", \"_id\" : \"10\" } }{ \"name\" : \"Helen Parr\", \"description\" : \"A full-time superhero\", \"sex\" : \"Female\", \"age\" : 37, \"address\" : \"123 Metro Avenue, Metroville\" }

我们使用如下的命令来进行提问:

How many documents are there in people index?

我们接下来用中文进行提问:

有多少个文档是男的,有多少个文档是女的?

我们接着提问:

他们的平均年龄是多少?

我们再来提个问:

哪个人的年龄是最大的?

哪个人是程序员?

好的,我们的今天的展示就到这里。我们在以后给大家更多的展示。