告别 DSL!我用 MCP 让 AI 帮我操作 Easysearch
还在为记不住 Elasticsearch DSL 语法发愁?match 和 term 傻傻分不清?聚合查询写半天还报错?
今天教你用 MCP(Model Context Protocol)封装 Easysearch,让 AI 帮你操作集群。从此告别 DSL,用自然语言就能完成搜索、写入、聚合统计!
效果演示
先看看最终效果。以下是我和 Kiro 的真实对话记录:
我:集群健康吗?
Kiro:
1 | { |
🟢 集群很健康!状态 green,1 个节点,2 个活跃分片,100% 健康。
我:创建一个产品索引,有名称、价格、分类、描述字段
Kiro:
1 | { |
产品索引创建成功!字段结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| name | text | 产品名称,支持中文分词搜索 |
| price | integer | 价格 |
| category | keyword | 分类,精确匹配 |
| description | text | 描述,支持中文分词搜索 |
我:写入 5 个苹果产品
Kiro:
1 | { |
5 个产品写入成功!
我:搜一下带芯片的产品
Kiro:
1 | { |
找到 3 个带芯片的产品!
我:5000 以下的有哪些?
Kiro:
1 | { |
5000 以下有 2 个:AirPods Pro 2(¥1899)和 iPad Air(¥4799)
我:按分类统计数量
Kiro:
1 | { |
我:平均价格多少?
Kiro:
1 | {"value": 7839.0} |
平均价格 ¥7839
全程不用写一行 DSL!我只说人话,Kiro 自动选择合适的工具、生成查询、返回结果。
什么是 MCP?
MCP(Model Context Protocol)是一个让 AI 调用外部工具的协议。简单说:
- 你定义一些”工具”(函数)
- AI 根据用户意图选择合适的工具
- AI 自动填参数、调用、返回结果
把 Easysearch 的操作封装成 MCP 工具,AI 就能帮你操作集群了。
为什么用 FastMCP?
FastMCP 是 MCP 官方提供的 Python 高级封装,让你用最少的代码写 MCP Server。
1 | from mcp.server.fastmcp import FastMCP |
FastMCP 的优势:
- 装饰器语法 -
@mcp.tool()一行搞定工具注册 - 自动生成 Schema - 根据函数签名和类型注解自动生成参数定义
- docstring 即描述 - 函数文档字符串自动变成工具描述,AI 根据这个选择调用哪个工具
- 同步函数支持 - 不用写 async/await
- 返回值自动序列化 - 直接 return dict,不用手动包装成 JSON
开始封装
项目结构
1 | easysearch-mcp-server/ |
安装依赖
1 | pip install mcp httpx |
核心代码
创建 easysearch_mcp.py:
1 | """ |
封装集群信息工具
1 |
|
封装索引操作工具
1 |
|
封装文档操作工具
1 |
|
封装搜索工具(重点!)
这是最有价值的部分,让 AI 帮你写 DSL:
1 |
|
封装聚合统计工具
1 |
|
启动入口
1 | if __name__ == "__main__": |
配置 Kiro
在项目根目录创建 .kiro/settings/mcp.json:
1 | { |
配置说明:
command: Python 解释器路径,建议用绝对路径如/usr/bin/python3args: MCP 服务器脚本的绝对路径env: 环境变量,配置 Easysearch 连接信息autoApprove: 自动批准的工具列表。默认情况下 Kiro 调用 MCP 工具前会弹窗让你确认,把工具名加到这个列表里就会自动执行,不用每次点确认,对话更流畅
重新加载 MCP:Cmd+Shift+P → 搜索 “Reconnect MCP Servers” 执行即可。
连接成功后,在 Kiro 左侧面板的 “MCP Servers” 视图里可以看到 easysearch 显示为绿色。
更多对话示例
继续看几个实际操作:
我:有哪些索引?
Kiro:(调用 list_indices)
1 | { |
目前有 1 个索引 products,包含 5 个文档。
我:products 索引有什么字段?
Kiro:(调用 get_index_mapping)
1 | { |
products 索引有 4 个字段:name、price、category、description。
我:集群有多少文档?
Kiro:(调用 cluster_stats)
1 | { |
集群共有 3 个索引,13 个文档,存储大小约 52KB。
我:写入单个文档
Kiro:(调用 index_document)
1 | { |
我:查一下 ID 是 magsafe-001 的文档
Kiro:(调用 get_document)
1 | { |
我:搜一下手机分类的产品
Kiro:(调用 search,生成 term 查询)
1 | { |
我:价格最高的是哪个?
Kiro:(调用 aggregate,agg_type=max)
1 | {"value": 16999.0} |
最高价格是 ¥16999(MacBook Pro 14)
我:价格最低呢?
Kiro:(调用 aggregate,agg_type=min)
1 | {"value": 1899.0} |
最低价格是 ¥1899(AirPods Pro 2)
我:算一下总价
Kiro:(调用 aggregate,agg_type=sum)
1 | {"value": 39195.0} |
5 个产品总价 ¥39195
我:删掉这个文档
Kiro:(调用 delete_document)
1 | { |
我:删掉 products 索引
Kiro:(调用 delete_index)
1 | {"acknowledged": true} |
索引已删除!
工具清单
封装完成后,AI 可以使用这 12 个工具:
| 工具 | 功能 | 典型用法 |
|---|---|---|
cluster_health |
集群健康状态 | “集群状态怎么样” |
cluster_stats |
集群统计 | “有多少文档” |
list_indices |
列出索引 | “有哪些索引” |
get_index_mapping |
查看字段结构 | “products 索引有什么字段” |
create_index |
创建索引 | “创建一个用户索引” |
delete_index |
删除索引 | “删掉 test 索引” |
index_document |
写入文档 | “添加一个产品” |
get_document |
获取文档 | “查一下 ID 是 xxx 的文档” |
delete_document |
删除文档 | “删掉这个文档” |
bulk_index |
批量写入 | “导入这批数据” |
search |
DSL 搜索 | “价格 1000-5000 的产品” |
search_simple |
关键词搜索 | “搜一下 iPhone” |
aggregate |
聚合统计 | “按分类统计” |
设计要点
1. 工具描述要清晰
AI 根据工具描述选择调用哪个,描述写得好,AI 选得准:
1 |
|
2. 返回结果要精简
Easysearch 原始返回包含大量元数据,动辄几百行。直接返回给 AI 会占用太多 token,也会干扰理解。精简后只保留关键信息:
1 | return { |
3. 提供简化版工具
search 需要写 DSL,search_simple 只要关键词。AI 会根据场景选择:
- 用户说”搜 iPhone” → 用
search_simple - 用户说”价格 1000-5000” → 用
search生成 range 查询
扩展思路
这个 MCP 还可以继续扩展:
- 添加更多搜索类型:bool 组合查询、fuzzy 模糊搜索、highlight 高亮
- 索引管理:reindex、别名管理、模板管理
- 集群运维:节点信息、分片分配、慢查询日志
- 数据导入导出:从 CSV/JSON 文件批量导入
总结
通过 MCP 封装 Easysearch:
- 告别 DSL 记忆负担 - AI 帮你生成查询语句
- 自然语言交互 - 说人话就能操作集群
- 降低使用门槛 - 不懂 ES 的人也能用
- 提高效率 - 复杂查询秒出结果
完整代码已开源,拿去用吧!
附录:完整源码
Kiro MCP 配置文件
.kiro/settings/mcp.json:
1 | { |
MCP Server 完整源码
easysearch_mcp.py:
1 | """ |
告别 DSL!我用 MCP 让 AI 帮我操作 Easysearch


