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

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

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

安装

Elasticsearch 及 Kibana

如果你还没有安装好你自己的 Elasticsearch 及 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:获取所有或指定索引的分片信息

安装步骤

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

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

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

复制代码
brew install nvm

nvm --version

$ nvm --version
0.40.3

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

复制代码
git clone https://github.com/elastic/mcp-server-elasticsearch

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

复制代码
$ pwd
/Users/liuxg/nodejs/mcp-server-elasticsearch
$ ls
LICENSE           catalog-info.yaml package.json      tsconfig.json
NOTICE.txt        docs              renovate.json     yarn.lock
README.md         index.ts          scripts

我们打入如下的命令:

复制代码
nvm use

$ nvm use
Found '/Users/liuxg/nodejs/mcp-server-elasticsearch/.nvmrc' with version <22.14.0>
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 install
Found '/Users/liuxg/nodejs/mcp-server-elasticsearch/.nvmrc' with version <22.14.0>
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 sha256sum
Checksums matched!
Now using node v22.14.0 (npm v10.9.2)
Creating default alias: default -> 22.14.0 (-> v22.14.0)
  1. 构建该项目

    sudo npm install typescript -g
    sudo npm install zod

    npm run build

    $ npm run build

    @elastic/mcp-server-elasticsearch@0.1.1 build
    tsc && shx chmod +x dist/*.js

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

  3. 打开 Claude 桌面应用

  4. 前往 Settings > Developer > MCP Servers

  5. 点击 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"
      }
    }
  }
}

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

  1. 使用 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

  1. 检查 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
  1. 创建一个索引

我们可以参考文章 "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?

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

复制代码
有多少个文档是男的,有多少个文档是女的?

我们接着提问:

复制代码
他们的平均年龄是多少?

我们再来提个问:

复制代码
哪个人的年龄是最大的?
复制代码
哪个人是程序员?

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

相关推荐
咚咚?2 小时前
麒麟操作系统达梦数据集群安装(一主多从)
数据库
好好沉淀2 小时前
Elasticsearch 中获取返回匹配记录总数
开发语言·elasticsearch
~kiss~2 小时前
什么是大模型的词元嵌入权重-Token Embedding Weights
ai
victory04312 小时前
Gradio实现中英文切换,不影响页面状态,不得刷新页面情况下
人工智能
u0109272712 小时前
使用XGBoost赢得Kaggle比赛
jvm·数据库·python
定偶2 小时前
MySQL多表连接查询详解
c语言·数据库·mysql
woshilys2 小时前
sql server 索引选择
数据库·sqlserver
微光闪现2 小时前
践行“科技向善”,微乐播捐赠108,888元助力唇腭裂儿童绽放笑容
人工智能
bamboolm2 小时前
java mysql 权限状态、流程问题
数据库·mysql
Hello.Reader2 小时前
Flink 内存与资源调优从 Process Memory 到 Fine-Grained Resource Management
大数据·flink