在 MCP Toolbox 中通过 elasticsearch-esql 工具执行 ES|QL 查询:配置、参数与底层实现

发布时间:2026/9/14 15:29:57

在 MCP Toolbox 中通过 elasticsearch-esql 工具执行 ES|QL 查询:配置、参数与底层实现 在 MCP Toolbox 中通过 elasticsearch-esql 工具执行 ES|QL 查询配置、参数与底层实现【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox导读本文围绕 MCP Toolbox for Databases 的elasticsearch-esql工具展开讲解如何通过声明式 YAML 配置在 MCP 服务器中向 LLM Agent 暴露 ES|QL 查询能力完成对 Elasticsearch 集群的复杂搜索与聚合。你将掌握该工具的全部配置字段query、format、timeout、parameters、兼容数据源要求、命名参数绑定规则以及它与elasticsearch-execute-esql的定位差异并深入理解其底层调用链go-elasticsearch →_query/_esqlAPI → 结果规范化。工具定位为 Agent 提供声明式 ES|QL 查询入口elasticsearch-esql是 MCP Toolbox 在 Elasticsearch 集成中提供的两个 ES|QL 工具之一其资源类型resource type为elasticsearch-esql对应源码注册点位于 internal/tools/elasticsearch/elasticsearchesql/elasticsearchesql.go。该工具的核心作用是在工具配置中固化一条 ES|QL 查询让 LLM 以参数形式补充查询中的变量例如LIMIT ?limit从而实现预定义查询模板 Agent 运行时传参的受控查询模式。在 docs/en/integrations/elasticsearch/tools/elasticsearch-esql.md 中该工具的官方描述为Execute ES|QL queries. This tool allows you to execute ES|QL queries against your Elasticsearch cluster. You can use this to perform complex searches and aggregations.ES|QLElasticsearch Query Language是 Elasticsearch 提供的查询语言支持通过管道式语句如FROM index | WHERE ... | STATS ...完成搜索与聚合。如果你对 ES|QL 语法不熟悉可以参阅 Elastic 官方入门文档链接见原文档。前置条件配置 elasticsearch 数据源elasticsearch-esql属于工具tool层配置必须绑定到一个type: elasticsearch的数据源source上才能工作。数据源配置示例见 docs/en/integrations/elasticsearch/source.mdkind: source name: my-elasticsearch-source type: elasticsearch addresses: - http://localhost:9200 apikey: my-api-key数据源支持字段如下fieldtyperequireddescriptiontypestringtrue必须为 elasticsearch。addresses[]stringtrue要连接的 Elasticsearch 主机列表。apikeystringtrue用于认证的 API key。需要说明的是从源码实现看认证方式并不局限于 API key。在 internal/sources/elasticsearch/elasticsearch.go 中Initialize允许使用username/password或API key两种方式之一优先采用usernamepassword组合其次采用apikey若两者都未提供则初始化报错elasticsearch source %q requires either username/password or an API key。因此你可以根据集群配置选择其中一种认证方式。数据源初始化时还会做一次连通性探测esapi.InfoRequest即调用集群 Info API只有连接成功res.IsError()为 false才会返回可用的 Source 实例internal/sources/elasticsearch/elasticsearch.go这保证了工具在运行时指向的是一个真实可用的集群。配置elasticsearch-esql工具elasticsearch-esql采用 MCP Toolbox 通用的工具 YAML 配置格式kind为tool。原文档给出的最小可用示例kind: tool name: query_my_index type: elasticsearch-esql source: elasticsearch-source description: Use this tool to execute ES|QL queries. query: | FROM my-index | KEEP * | LIMIT ?limit parameters: - name: limit type: integer description: Limit the number of results. required: true配置要点name工具名称将作为 MCP 工具名暴露给 Agenttype必须为elasticsearch-esql否则不会被工具注册表识别source数据源名称需与上面定义的kind: source的name对应且该数据源必须实现ElasticsearchClient()与RunSQL(...)接口见下文源码级原理description工具描述Initialize阶段要求必填为空会报错elasticsearchesql.go该描述会作为 Manifest 的一部分传给 LLMqueryES|QL 查询语句本体支持多行块|块查询中的?name占位符会被命名参数替换parameters参数列表将注册为 MCP 工具入参。参考字段全表fieldtyperequireddescriptionquerystringfalse要执行的 ES|QL 查询。也可以通过参数传入。formatstringfalse查询结果格式默认json。合法值csv、json、tsv、txt、yaml、cbor、smile、arrow。timeoutintegerfalse查询超时时间秒默认 601 分钟。parametersparametersfalse与 ES|QL 查询配合使用的参数列表。仅支持string、integer、float、boolean类型。注意原文档中query字段在参考表中标注为required: false但源码中该字段带有validate:required校验标签elasticsearchesql.go即实际配置时必须提供query内容——参考表的 false 表示查询文本也可以通过参数动态传入而静态配置层面的校验仍要求该字段存在。source、type、description在源码中同样带validate:required。format 与 timeout 的底层行为format会原样透传给 Elasticsearch 的_queryES|QLAPI 的format参数elasticsearch.go支持csv、json、tsv、txt、yaml、cbor、smile、arrow。默认值为json与 elasticsearchexecuteesql.go 中format 时回退为json的逻辑一致。注意代码中RunSQL使用esapi.EsqlQueryRequest并设置FilterPath: []string{columns, values}即 JSON 模式下返回体只保留columns与values两个字段。timeout当配置值大于 0 时Invoke 阶段通过context.WithTimeout(ctx, time.Duration(t.Cfg.Timeout)*time.Second)设置超时未配置时回退为 1 分钟time.Minute见 elasticsearchesql.go。超时以秒为单位作用于整条查询的上下文context超时后查询会被取消。定义参数与命名参数绑定parameters的完整语义定义在 docs/en/documentation/configuration/tools/_index.md 的 Specifying Parameters 一节它是一个 Parameter 对象列表parameters: - name: limit type: integer description: Limit the number of results.每个参数的通用字段包括fieldtyperequireddescriptionnamestringtrue参数名须与查询中的?name占位符对应。typestringtrue必须是 string、integer、float、boolean、array 之一。descriptionstringtrue参数的自然语言描述会提供给 Agent 作为上下文。defaultparameter typefalse参数默认值一旦提供required自动为false。requiredboolfalse参数是否必填默认true。allowedValues[]stringfalse输入值校验白名单支持正则。excludedValues[]stringfalse输入值校验黑名单支持正则。minValue / maxValueint or floatfalse仅对integer/float有效限制取值范围。需要特别强调的是elasticsearch-esql的参数类型仅支持string、integer、float、boolean四种。源码在 Invoke 阶段对每个参数做了类型检查若参数类型为array会直接返回 Agent 错误array parameters are not supported yetelasticsearchesql.go。这与 ES|QL 命名参数本身的类型约束一致。命名参数绑定机制ES|QL 使用?name语法声明命名参数Elasticsearch 要求这些参数以单键对象数组的形式传给_queryAPI。MCP Toolbox 正是按此约定实现的——Invoke 时遍历工具配置中的每个参数把运行时传入的值包装成map[string]any{参数名: 值}追加到paramsList最终构造出形如[{limit: 100}]的请求体elasticsearchesql.goelasticsearch.go。所以查询模板中的占位符必须与参数name完全一致。完整可运行示例结合数据源一个完整可运行的两段式配置如下kind: source name: elasticsearch-source type: elasticsearch addresses: - http://localhost:9200 apikey: my-api-key --- kind: tool name: query_my_index type: elasticsearch-esql source: elasticsearch-source description: Use this tool to execute ES|QL queries. query: | FROM my-index | KEEP * | LIMIT ?limit format: json timeout: 60 parameters: - name: limit type: integer description: Limit the number of results. required: true执行时Agent 传入limit参数例如 100工具将其绑定到查询中的?limit得到FROM my-index | KEEP * | LIMIT 100并提交执行。你也可以利用前面提到的通用参数字段进一步增强例如为limit设置default: 10使其可选或设置minValue/maxValue约束取值范围。与 elasticsearch-execute-esql 的差异在 docs/en/integrations/elasticsearch/tools/elasticsearch-execute-esql.md 中还有另一个同类工具elasticsearch-execute-esql资源类型elasticsearch-execute-esql源码见 internal/tools/elasticsearch/elasticsearchexecuteesql/elasticsearchexecuteesql.go二者形成互补维度elasticsearch-esqlelasticsearch-execute-esql查询来源配置中预先固化query字段运行时由 Agent 任意传入query参数参数机制支持命名参数parameters绑定到?name占位符无命名参数query直接作为调用入参适用场景受控、可复用的固定查询模板临时性、语句未知的 ad-hoc 查询注解默认只读注解NewReadOnlyAnnotations破坏性注解NewDestructiveAnnotations从源码看elasticsearch-execute-esql的 Invoke 直接从调用参数中取出query字符串执行format为空时回退为jsonelasticsearchexecuteesql.go。此外MCP Toolbox 还提供了预构建配置prebuilt configelasticsearch通过--prebuilt elasticsearch一键启用见 internal/prebuiltconfigs/tools/elasticsearch.yaml该预构建配置注册了execute_esql_query工具对应elasticsearch-execute-esql类型并通过环境变量ELASTICSEARCH_HOST与ELASTICSEARCH_APIKEY注入数据源连接信息详见 docs/en/integrations/elasticsearch/prebuilt-configs/elasticsearch.md。源码级原理从 YAML 配置到 ES|QL 结果注册与初始化与 MCP Toolbox 其他工具一样elasticsearch-esql通过包级init()中的tools.Register(elasticsearch-esql, newConfig)注册到全局工具注册表elasticsearchesql.go之后工具配置就能以type: elasticsearch-esql被解析。Initialize校验description非空构建tools.Manifest包含描述与参数清单并默认赋予只读注解。数据源兼容性校验elasticsearch-esql定义了一个最小兼容接口elasticsearchesql.gotype compatibleSource interface { ElasticsearchClient() es.EsClient RunSQL(ctx context.Context, format, query string, params []map[string]any) (any, error) }ValidateSource会断言工具绑定的数据源是否实现该接口否则返回invalid source for elasticsearch-esql toolelasticsearchesql.go。这正是 docs/en/integrations/elasticsearch/tools/elasticsearch-esql.md 中{{ compatible-sources }}短代码所渲染内容的源码依据——该工具只对实现了上述接口的 Elasticsearch 数据源即type: elasticsearch可用。查询执行链路一次调用的完整链路为参数收集与类型检查遍历配置中的parameters拒绝array类型将运行时值包装为单键对象数组elasticsearchesql.go构造请求体RunSQL将query与params序列化为 JSON交给esapi.EsqlQueryRequest并设置format与FilterPath[columns,values]elasticsearch.go。Elasticsearch 官方 Go 客户端go-elasticsearch/v9负责实际 HTTP 通信响应规范化EsqlToMap把 ES|QL 返回的columns 行式values转换为[]map[string]any每行一个 map键为列名列缺失时以nil补齐elasticsearch.go。这也是 Agent 拿到的最终结构化结果错误处理集群返回错误状态时尝试解码 Elasticsearch 错误体并原样返回解码失败则返回状态码错误elasticsearch.go。RunSQL的单元测试internal/tools/elasticsearch/elasticsearchesql/elasticsearchesql_test.go覆盖了参数绑定与调用流程可以作为理解该工具行为的补充参考。常见问题与最佳实践查询中使用了?limit但未定义参数ES|QL 查询中的每个?name占位符都应在parameters中声明对应name否则该占位符不会被绑定查询可能因缺失参数而被集群拒绝。参数类型限制elasticsearch-esql的参数只支持string、integer、float、boolean不要声明array类型的参数——Invoke 时会直接报错。认证方式选择数据源支持apikey或username/password二选一若你的集群启用了 API key 权限控制还需确保 key 具备执行目标 ES|QL 语句的权限。超时控制长时间聚合如大规模STATS建议显式设置timeout秒默认 60 秒超时会通过 context 取消查询。结果格式默认json即可满足大多数 Agent 场景csv/tsv适合与表格类下游工具衔接arrow/cbor/smile是二进制格式通常需要额外解析非必要不建议使用。安全注解elasticsearch-esql默认是只读注解NewReadOnlyAnnotations这意味着它天然适合FROM ... | WHERE ... | STATS这类纯查询如需让 Agent 执行任意语句包括潜在写入应改用elasticsearch-execute-esql默认破坏性注解并谨慎控制权限。总结elasticsearch-esql是 MCP Toolbox Elasticsearch 集成中面向受控查询场景的工具它在配置中固化 ES|QL 查询模板通过命名参数把运行时变量安全地注入?name占位符最终借助 go-elasticsearch 客户端调用 ES|QL API并把columns/values响应规范化为 Agent 易用的 map 结构。掌握本文的字段语义query/format/timeout/parameters、命名参数绑定规则以及与elasticsearch-execute-esql的分工你就可以在自己的 Toolbox 配置中为 LLM Agent 提供精确、可复用、可观测的 Elasticsearch 查询能力。【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/14 15:29:57

如何用 marimo check 在运行前检查并自动修复笔记本问题?

如何用 marimo check 在运行前检查并自动修复笔记本问题? 【免费下载链接】marimo A reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All …

2026/9/14 15:24:56

MetaMessage:统一WebSocket、WebRTC与SSE的消息层协议

二〇二四年接近年末的时候,IETF 的邮件列表里出现了一个轻量但野心不小的提案,名字叫MetaMessage。我第一眼看到它的时候,其实是抱着“又来一个协议”的心态点进去的,但读完 draft 的摘要之后,我意识到这东西跟那些“为…

2026/9/14 16:20:05

如何把小爱音箱接入大语言模型:MiGPT 完整配置与实践指南

如何把小爱音箱接入大语言模型:MiGPT 完整配置与实践指南 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 对音箱说「小爱同学&#x…

2026/9/14 16:20:05

机器视觉能检什么?五大检测维度与玻璃划痕项目实战

上个月一个做玻璃盖板的朋友打电话过来,说产线上十几个人拿着灯管检划痕,眼睛都花了,问我机器视觉到底能不能干这个活。电话挂了之后我想了很久,这个问题其实每个刚接触机器视觉的人都会问:机器视觉到底可以检哪些&…

2026/9/14 16:20:05

Pot 划词翻译与截图 OCR:3 步搭好免费的悬浮翻译工作流

Pot 划词翻译与截图 OCR:3 步搭好免费的悬浮翻译工作流 【免费下载链接】pot-desktop 🌈一个跨平台的划词翻译和OCR软件 | A cross-platform software for text translation and recognition. 项目地址: https://gitcode.com/GitHub_Trending/po/pot-d…

2026/9/14 16:20:05

OG网创自动采集系统:一站式网络资源管理解决方案

1. OG网创自动采集系统概述在当今互联网内容爆炸式增长的时代,如何高效获取和管理网络资源成为许多站长和内容创作者面临的挑战。OG网创自动采集系统正是为解决这一痛点而生的工具,它能够实现资源的自动采集、发布和转存,大幅提升工作效率。这…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码