Elasticsearch MCP服务器

一个为金融行业设计的Elasticsearch MCP服务器,提供多阶段PII脱敏功能,适用于受监管环境。

  • by amir-gorji
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 amir-gorji/kibana-assistant-mcp-server

使用说明

数字银行弹性MCP服务器

stdio 模型上下文协议 (MCP)Elasticsearch服务器,具有多阶段PII编辑功能,适用于金融机构或受监管环境。专为数字银行团队打造,业务经理、架构师和开发人员需要对话式访问运营数据,而无需手动编写KQL或Elasticsearch DSL。


目录

  1. 为什么存在
  2. 特性
  3. 建筑
  4. 快速开始
  5. 工具参考
  6. 提示和资源
  7. 安全与合规
  8. 类型系统
  9. 测试
  10. 项目结构
  11. 路线图
  12. 许可证

1.为什么存在

数字银行部落掌握着大量的遥测数据:支付轨道(SWIFT gpi、SEPA)、客户会话数据、APM跟踪和微服务日志。今天查询这些数据需要掌握Elasticsearch DSL或依赖可能无法回答特定问题的预构建仪表板。

此MCP服务器弥合了这一差距。它允许LLM代理发现您的集群、理解索引结构、执行只读查询和检查平台健康状况——所有这些都是通过一个安全、经过审计的管道完成的,该管道在数据离开您的基础设施之前对PII进行编辑。

Persona 他们得到了什么
业务经理 询问有关交易量、入职渠道或流动性指标的自然语言问题。代理为您构建DSL查询。
软件架构师 探索集群拓扑结构,查看索引映射,并在不切换到外部仪表板的情况下评估系统健康状况。
开发者 通过跨微服务关联日志进行调试。通过对话方式搜索错误模式、跟踪事务ID并检查警报规则。

2.特点

  • 群集发现 --自动发现索引、字段映射和文档计数,以便代理在查询之前知道哪些数据可用。
  • 只读搜索 --执行带有强制只读防护栏的Elasticsearch DSL查询。被屏蔽的关键字(_update, _delete, _bulk, script)在输入净化层被拒绝。
  • 群集运行状况 --返回总体集群状态(绿色/黄色/红色)、节点计数、分片计数以及集群、索引或分片粒度的未分配分片详细信息。
  • 警报状态 --检索Kibana警报规则及其上次执行状态,支持按规则类型、严重性标记和执行状态进行筛选(需要可选 KIBANA_URL).
  • 时间范围过滤 --自然时间表达式(now-24h, now-7d)自动合并到任何查询形状(bool、simple或空)中。
  • PII补救措施 --信用卡(Luhn验证)、IBAN、SSN、电子邮件和电话号码在结果到达LLM之前被屏蔽。PCI DSS和GDPR合规性的深度防御。
  • 审计日志 --每次工具调用都会记录到stderr中,包括工具名称、参数、执行时间、编校计数和错误详细信息。
  • 索引访问控制 --限制代理可以通过哪些索引进行触摸 ALLOWED_INDEX_PATTERNS.
  • 使用回退重试 --使用指数回退重试瞬态故障(429503,网络错误)。

3.建筑

┌─────────────┐     stdio / SSE      ┌──────────────────────┐
│  LLM Agent  │ ◄──────────────────► │   MCP Server         │
│  (Claude,   │                      │                      │
│   GPT, etc) │                      │  ┌────────────────┐  │
└─────────────┘                      │  │ Input Sanitizer │  │
                                     │  └───────┬────────┘  │
                                     │          ▼           │
                                     │  ┌────────────────┐  │
                                     │  │  Tool Execute   │  │
                                     │  └───────┬────────┘  │
                                     │          ▼           │
                                     │  ┌────────────────┐  │
                                     │  │ PII Redaction   │  │
                                     │  └───────┬────────┘  │
                                     │          ▼           │
                                     │  ┌────────────────┐  │
                                     │  │ Audit Logger    │  │
                                     │  └────────────────┘  │
                                     └──────────┬───────────┘
                                                │
                                                ▼
                                     ┌──────────────────────┐
                                     │  Elasticsearch        │
                                     │  Cluster              │
                                     └──────────────────────┘

每个工具调用都通过一个安全的管道进行: 验证输入 → 执行查询 → 编辑个人身份信息 → 日志审核条目 → 返回结果。此管道一次性实施 createSecureTool 并由所有工具共享。


4.快速入门

先决条件

  • Node.js 18+
  • Elasticsearch部署(弹性云或自托管)
  • 对要公开的索引具有只读权限的API密钥
  • 与Elasticsearch兼容<8.18(在8.18中引入内置MCP构建器功能之前)

安装和构建

git clone <this-repo>
cd financial-elastic-mcp-server
npm install
npm run build:mcp

配置

创建一个 .env 文件或导出环境变量:

# Required
export ELASTIC_URL="https://your-deployment.es.us-east-1.aws.found.io"
export ELASTIC_API_KEY="your-base64-encoded-api-key"

# Optional — set to enable Kibana-specific features (e.g., get_alert_status)
export KIBANA_URL="https://your-deployment.kb.us-east-1.aws.found.io"

# Optional
export ALLOWED_INDEX_PATTERNS="logs-*,transactions-*"  # Comma-separated. Empty = all indices.
export MAX_SEARCH_SIZE="100"                            # Max docs per search (1-500, default 100)
export REQUEST_TIMEOUT_MS="30000"                       # HTTP timeout (default 30s)
export RETRY_ATTEMPTS="3"                               # Retry count for transient failures
export RETRY_DELAY_MS="1000"                            # Base delay for exponential backoff
export KIBANA_SPACE=""                                  # Kibana space (empty = default space)
export AUDIT_ENABLED="true"                             # Audit logging to stderr (default true)
export PII_REDACTION_ENABLED="true"                     # PII masking (default true)

跑

node dist/stdio.mjs

连接到克劳德桌面

添加到您的 claude_desktop_config.json:

{
  "mcpServers": {
    "elastic": {
      "command": "node",
      "args": ["/absolute/path/to/dist/stdio.mjs"],
      "env": {
        "ELASTIC_URL": "https://your-deployment.es.us-east-1.aws.found.io",
        "ELASTIC_API_KEY": "your-api-key"
      }
    }
  }
}

5.工具参考

discover_cluster

从这里开始。 发现所有可用索引及其字段映射。在构造查询之前,代理应首先调用此函数以了解存在哪些数据。

参数 类型 默认值 说明
pattern 字符串 * 索引模式过滤器(例如。, logs-*)
include_hidden 布尔值 false 包括系统指标(.kibana等等)
max_indices 编号 50 获取映射的索引上限

返回按文档计数排序的索引(最大的第一个),每个索引都有一个简单的列表 { field, type } 映射。


elastic_search

对Elasticsearch索引执行只读ElasticsearchDSL查询。

参数 类型 默认值 说明
index 字符串 必需的 要搜索的索引模式(例如。, transactions-*)
query 对象 必需的 Elasticsearch DSL查询体
size 编号 10 返回结果(上限为 MAX_SEARCH_SIZE)
time_range string -- 时间过滤器表达式(例如。, now-24h, now-7d)

这 time_range 参数会自动合并到您提供的任何查询形状中——布尔查询、简单查询或空查询都可以。


check_cluster_health

返回Elasticsearch集群的运行状况。使用此功能诊断降级或红色集群,并在调查查询或性能问题之前验证平台运行状况。

参数 类型 默认值 说明
level enum "cluster" 粒度: "cluster", "indices",或 "shards"更高级别包括每个索引或每个分片的详细信息。

退货 status (绿色/黄色/红色)、节点计数、分片计数和 unassigned_shards.


get_alert_status

检索Kibana警报规则及其上次执行状态。需要 KIBANA_URL 待配置。在调查事件时使用此功能来识别火灾或错误警报。如果出现以下情况,则返回一条优雅的错误消息 KIBANA_URL 未设置或Kibana警报插件未启用。

参数 类型 默认值 说明
severity string -- 按严重性标签过滤(例如。, "critical", "warning")
rule_type string -- 按规则类型ID过滤(例如。, ".es-query", "apm.error_rate")
status enum -- 客户端筛选器: "active", "inactive", "error",或 "ok"
max_results 编号 20 要返回的最大规则数

6.提示和资源

服务器暴露MCP 提示 (指导工作流程)和 资源 (静态参考文档)及其工具。

提示 提供LLM可以遵循的分步调查工作流程:

提示 目的
investigate_failed_transactions Elasticsearch中诊断支付失败的指导性工作流程
compliance_audit_query 构建PCI DSS/AML审计查询的结构化方法
performance_investigation 逐步调查延迟或吞吐量回归

资源 LLM可以阅读的静态参考文件:

资源 目的
banking_query_patterns 银行数据的常见Elasticsearch查询模式
elasticsearch_best_practices 查询优化和索引卫生指南
banking_domain_glossary 域术语的定义(SWIFT、SEPA、IBAN、流动性等)

7.安全与合规

此服务器专为受监管的环境而设计。多个防御层确保敏感数据永远不会在不受保护的情况下到达LLM。

PII补救措施

所有工具响应在离开服务器之前都会经过编校层。检测并屏蔽以下模式:

数据类型 示例输入 屏蔽输出
信用卡 4111 1111 1111 1111 **** **** **** 1111
伊班 DE89370400440532013000 DE89****3000
SSN 123-45-6789 ***-**-****
电子邮件 john.doe@bank.com j***@bank.com
电话 +1 555-123-4567 +15***67

信用卡检测使用Luhn验证来避免随机16位数字的误报。

输入消毒

每个查询在执行前都会扫描危险关键字:

  • script, _update, _delete, _bulk, ctx._source

索引名称根据严格的正则表达式进行验证([a-zA-Z0-9\-.*,_]+)以防止注射。

索引访问控制

集 ALLOWED_INDEX_PATTERNS 以限制代理可以查询哪些索引。设置后,将拒绝对这些模式之外的索引的任何请求。这强制执行 最小特权原则 在MCP层,补充了Elastic的原生RBAC。

审计跟踪

每次工具调用都会向stderr生成一个结构化的JSON日志条目:

{
  "timestamp": "2026-02-15T10:30:00.000Z",
  "tool_called": "elastic_search",
  "input_parameters": "{\"index\":\"transactions-*\",...}",
  "output_size_bytes": 4521,
  "redaction_count": 3,
  "redacted_types": ["credit_card", "email"],
  "execution_time_ms": 245,
  "status": "success"
}

输入参数被截断为500个字符,以防止敏感数据泄露到日志中。


8.类型系统

工具结果使用 不匹配 区分类型安全模式匹配的联合:

import type { Model } from 'dismatch';

type ToolResult<T> = ToolSuccess<T> | ToolError;
type ToolSuccess<T> = Model<
  'success',
  { data: T; total?: number; aggregations?: Record<string, any> }
>;
type ToolError = Model<'error', { error: string }>;

这 type 现场('success' | 'error')是判别式。工具结果上的所有分支都使用 match() 从dismatch到详尽的编译时检查模式匹配——否 if/else 链条或 switch 声明。


9.测试

单元和集成测试

服务器附带了一个基于 Vitest.测试与其模块位于同一地点 __tests__/ 目录。

npm test

单元测试 单独覆盖单个库模块:

模块 测试内容
piiRedaction 模式检测精度、Luhn验证、掩蔽格式
inputSanitizer 阻止关键字检测、索引名称验证
mappingUtils 字段扁平化、多字段扩展、重复数据删除
auditLogger 日志格式、截断、stderr路由

集成测试 端到端练习完整的工具执行管道(输入→ 执行→ 个人身份信息脱敏→ 结果),HTTP层被mock-fns替换:

工具/模块 涵盖的关键场景
discoverCluster 索引发现、隐藏索引过滤、映射获取失败
checkClusterHealth 集群/索引/分片级输出,参数传递
getAlertStatus 规则规范化、KQL过滤器构建、404/403优雅错误
prompts 快速注册、参数模式、模板呈现
resources 资源注册、URI解析、内容完整性

所有82项测试都通过了当前版本。

手动重动作演示

scripts/test-redaction.ts 是一个自包含的脚本,它针对真实的事务日志负载运行编校引擎,因此您可以在没有Elasticsearch集群的情况下直观地验证掩码格式和准确性。

# Stage 1 only — no AWS credentials needed
npm run test:redaction

# Both stages — requires AWS credentials and Comprehend access
npm run test:redaction -- --comprehend

第1阶段 (正则表达式,始终运行)包括:

PII类型 示例输入 屏蔽输出 注释
信用卡 4111 1111 1111 1111 **** **** **** 1111 Luhn验证;失败的Luhn数保持不变
伊班 DE89370400440532013000 DE89****3000
SSN 123-45-6789 ***-**-****
电子邮件 john.doe@bank.com j***@bank.com
电话 +31 6 1234 5678 +31***78

第2阶段 (--comprehend)在第一阶段输出的基础上添加AWS Comprehend NER,捕获正则表达式无法捕获的上下文PII:

PII类型 示例输入 屏蔽输出
全名 John Doe [REDACTED:NAME]
街道地址 42 Main Street, Amsterdam [REDACTED:ADDRESS]
IP地址 192.168.1.101 [REDACTED:IP_ADDRESS]

脚本在每个阶段后打印摘要,显示 redactionCount 和 redactedTypes,并明确确认无效的Luhn卡号保持不变。


10.项目结构

src/
├── lib/
│   ├── types.ts                    # ToolResult<T> discriminated union
│   ├── config.ts                   # Environment-based configuration loader
│   ├── esClient.ts                 # Elasticsearch/Kibana HTTP client with retry
│   ├── toolWrapper.ts              # Secure tool pipeline (sanitize → execute → redact → audit)
│   ├── piiRedaction.ts             # Regex-based PII detection and masking
│   ├── inputSanitizer.ts           # Query validation and index name sanitization
│   ├── auditLogger.ts              # Structured audit logging to stderr
│   ├── mappingUtils.ts             # Elasticsearch mapping flattener
│   └── __tests__/                  # Unit tests for lib modules
├── tools/
│   ├── index.ts                    # Tool registry
│   ├── discoverCluster.ts          # discover_cluster tool
│   ├── elasticSearch.ts            # elastic_search tool
│   ├── checkClusterHealth.ts       # check_cluster_health tool
│   ├── getAlertStatus.ts           # get_alert_status tool
│   └── __tests__/                  # Integration tests for tools
├── prompts/
│   ├── index.ts                    # Prompt registry
│   ├── investigateFailedTransactions.ts
│   ├── complianceAuditQuery.ts
│   ├── performanceInvestigation.ts
│   └── __tests__/
├── resources/
│   ├── index.ts                    # Resource registry
│   ├── bankingQueryPatterns.ts
│   ├── elasticsearchBestPractices.ts
│   ├── bankingDomainGlossary.ts
│   └── __tests__/
└── mastra/
    └── stdio.ts                    # MCP server entry point (stdio transport)
scripts/
└── test-redaction.ts               # Manual PII redaction demo (Stage 1 + optional Stage 2)

11.路线图

此仓库-弹性<v8.18兼容性

Elastic v8.18引入了原生 MCP构建器 它将Elasticsearch直接暴露给LLM,而无需自定义服务器。对于已经使用v8.18+的团队来说,该功能涵盖了此仓库提供的大部分内容。

因此,此回购的范围为 v8.18以下的Elasticsearch部署 --自托管集群、弹性云层或尚无法升级的气隙环境。它将保持在维护模式:错误修复、依赖关系更新和下面未完成的清理项目。这里没有计划使用主要的新工具。

新回购-- elastic-pii-proxy

Elastic的原生MCP服务器(v8.18+)功能强大,但没有内置的PII编辑或合规控制,这使得它不适合开箱即用的受监管环境。

配套项目将是 轻量级MCP代理 它位于Elastic的官方MCP服务器和LLM或运营商之间:

┌─────────────┐     MCP      ┌──────────────────┐     MCP      ┌─────────────────────┐
│  LLM Agent  │ ◄──────────► │ elastic-pii-proxy │ ◄──────────► │ Elastic MCP (v8.18+)│
│  (Claude,   │              │                  │              │                     │
│   GPT, etc) │              │  PII Redaction   │              │  Native Elastic MCP │
└─────────────┘              │  Audit Logging   │              └─────────────────────┘
                             │  GDPR/DORA/CCPA  │
                             └──────────────────┘

代理拦截来自Elastic的MCP响应,运行编校管道,发出合规性审计跟踪,并将经过净化的结果转发给LLM,而不需要对Elastic部署本身进行任何更改。

计划能力:

  • 透明MCP代理——上游Elastic MCP配置不变
  • 从该仓库继承的多阶段PII编辑(正则表达式+AWS Comprehend NER)
  • 可配置的合规性配置文件(GDPR、DORA、CCPA字段级规则)
  • 带有编辑计数和字段来源的结构化审计日志
  • 零信任态度:没有原始个人身份信息能够到达LLM

12.许可证

MIT——免费使用、修改和分发。