当前位置: 首页 > backend >正文

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

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

安装

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:获取所有或指定索引的分片信息

安装步骤

在本博客中,我们将在本地部署 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)

2. 构建该项目

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

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?

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

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

我们接着提问:

他们的平均年龄是多少?

我们再来提个问:

哪个人的年龄是最大的?

哪个人是程序员?

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

http://www.xdnf.cn/news/10574.html

相关文章:

  • 电脑为什么换个ip就上不了网了
  • Java Netty 中处理粘包和半包问题的解决方案 | TCP消息完整性校验(XOR )
  • JavaScript性能优化:实战技巧提升10倍速度
  • 【性能调优系列】深入解析火焰图:从基础阅读到性能优化实战
  • 【python深度学习】Day43 复习日
  • MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件
  • 抛砖引玉:RadarDet4D,NuScenes数据集Radar模态目标检测第二名(即将开源)
  • 【Elasticsearch】Elasticsearch 核心技术(一):索引
  • Attention注意力机制
  • 【git-首次初始化本地项目、关联远程仓库】
  • 飞牛fnNAS存储空间模式详解
  • 缓存击穿、缓存雪崩、缓存穿透以及数据库缓存双写不一致问题
  • Transformer相关
  • 辅助角公式
  • 财管-0-战略和战略管理
  • Spring Boot + MyBatis 实现的简单用户管理项目的完整目录结构示例
  • AI 医疗影像诊断:技术实现、临床应用与未来趋势 —— 以肺部 CT 早期肺癌检测为例
  • 文言文停词库 | 古文停词库 | 624个简体停词 |文言文python分词库-thulac
  • Baklib知识中台加速企业服务智能化实践
  • 达梦分布式集群DPC_分布式事务理解_yxy
  • 机器学习算法-k-means
  • LeetCode 40.组合总和II:含重复元素的组合问题去重策略详解
  • 生物化学笔记:神经生物学概论【脑客中国·科研】第186位讲者 | 何超:大脑的觉醒与睡眠
  • LCA(最近公共祖先)与树上差分
  • 【Dv3Admin】工具异常处理配置文件解析
  • 智能指针unique
  • 【MySQL】第13节|MySQL 中模糊查询的全面总结
  • Codeforces Round 1028 (Div. 2)(ABC)
  • JAVA实战开源项目:精简博客系统 (Vue+SpringBoot) 附源码
  • Python打卡训练营Day42