Elastic Security MCP App:AI驱动的交互式安全运营新范式
1. 项目概述:当AI助手成为你的安全分析师
如果你是一名安全运维工程师,每天面对的是海量的安全告警、复杂的攻击链分析和永无止境的威胁狩猎,那么“效率”就是你最核心的痛点。传统的安全运营中心(SOC)工作流,往往需要在多个工具界面间反复切换,手动编写查询语句,再凭经验分析结果,整个过程耗时耗力。现在,想象一下,你只需要在聊天窗口里对AI说一句:“帮我看看过去一小时内所有高风险的告警,并按严重程度排序”,一个功能完整的交互式安全仪表盘就直接呈现在对话中,你可以点击筛选、查看进程树、分析网络连接,而AI助手就在一旁,随时准备根据你的操作提供下一步建议。
这正是 Elastic Security MCP App 带来的变革。它不是一个简单的聊天机器人插件,而是一个基于 Model Context Protocol 构建的、具备完整交互式界面的“安全作战室”。它将 Elastic Security 平台的核心能力——告警分诊、攻击发现、案例管理、规则调优和威胁狩猎——封装成六个独立的工具,并让这些工具以富交互的 React UI 形式,直接嵌入到 Claude、Cursor、VS Code 等支持 MCP 的 AI 宿主中。其核心价值在于,它打破了“AI只能输出文本”的界限,实现了“AI调用工具,工具返回可操作的界面”,让人机协作的流畅度达到了新的高度。
简单来说,这个项目让 AI 大模型成为了安全分析师工作的“副驾驶”和“界面聚合器”。你不再需要离开对话环境去操作复杂的后台系统;相反,一个功能完备的安全操作界面被“召唤”到了你与 AI 对话的最前线。无论是资深分析师快速处置事件,还是新手学习调查流程,这都是一种颠覆性的体验提升。接下来,我将为你深入拆解这个项目的设计思路、实操细节以及背后的技术考量,让你不仅能部署使用,更能理解其为何如此设计。
2. 核心架构与交互逻辑深度解析
要理解这个 MCP App 的巧妙之处,我们必须先抛开代码,从它解决的核心问题入手:如何在保持 AI 上下文轻量的同时,赋予其操作复杂企业级安全系统的能力?
传统的 AI Agent 调用工具,通常是“一问一答”模式:用户提问 -> AI 思考 -> 调用工具 API -> 解析返回的 JSON/文本 -> 组织语言回复用户。这对于简单查询尚可,但对于需要多步、可视化、探索性交互的安全分析来说,简直是灾难。想象一下 AI 用文字向你描述一个包含几十条告警的列表、它们的关联关系和一张网络拓扑图——信息过载且毫无操作性。
2.1 MCP 与 “App” 模式的革新
Model Context Protocol 本身定义了一套标准,让 AI 宿主(如 Claude Desktop)可以发现并调用外部工具服务器(Server)提供的工具(Tools)。而MCP App在此基础上进行了关键扩展:它允许工具服务器返回的不再是纯文本或 JSON,而是一个完整的、可交互的 HTML/React 组件(即 “View”)。
这个设计带来了范式转变:
- 职责分离:AI(LLM)的职责回归到它最擅长的——理解用户意图、决定调用哪个工具、并基于工具返回的文本摘要进行推理和对话。
- 界面交付:复杂的、状态化的用户交互界面,由专门的工具服务器生成并直接渲染给用户。用户与这个界面交互时,完全不需要经过 AI 的上下文,避免了大量无关细节对 AI 推理的干扰。
- 直接通信:渲染后的 UI 界面(前端)可以与工具服务器(后端)建立直接通信通道,进行高效的数据获取和事件处理,响应速度远超经由 AI 中转的模式。
在这个安全 App 中,这一模式被运用得淋漓尽致。当你说“Claude,帮我分诊告警”时,Claude 会调用alert_triage工具。该工具返回两部分内容:一段给 Claude 看的文本摘要(例如“已获取最近50条告警,其中高风险10条”),和一个完整的 React 组件。这个组件在对话界面中渲染后,你就看到了一个功能齐全的告警仪表盘。接下来你所有的点击、筛选、排序操作,都由这个 UI 组件直接与后端的 Elasticsearch 通信完成,Claude 只在需要它提供分析建议时才被再次引入。
2.2 双通道工具设计:Model-facing 与 App-only
这是该项目架构中最精妙的设计之一,也是实现上述职责分离的关键。在它的mcp.json配置文件中,你会看到工具被分为两类:
Model-facing Tools(面向模型的工具):这类工具会被 AI 宿主(如 Claude)直接看到和调用。它们通常执行“入口”操作,比如
fetch_alerts(获取告警)。它们的核心作用是启动一个交互会话。当被调用时,它们除了返回文本摘要,更重要的是返回一个mcp.app.view指令,告诉宿主:“请渲染这个交互界面”。注意:这类工具的设计必须非常“克制”。它们的输入参数应尽可能简单(如时间范围、严重性过滤),输出应专注于启动视图。复杂的查询逻辑应该留给渲染后的 UI 去处理。
App-only Tools(仅应用内部工具):这类工具不会暴露给 AI 宿主。它们只供渲染后的 React UI 调用。例如,当你在告警仪表盘中点击“查看进程树”时,UI 会直接调用一个名为
get_process_tree的 app-only 工具。这意味着,UI 拥有了一套完整、高效的后端 API,可以支撑丰富的交互,而无需让 AI 知晓每一个细节。实操心得:在规划你自己的 MCP App 时,一定要仔细区分这两种工具。将数据获取、复杂计算、状态管理等“脏活累活”放到 app-only 工具中,让 model-facing 工具保持轻量和意图明确。这能显著提升 AI 调用工具的准确性和响应速度。
2.3 视图(View)构建与通信机制
视图是交互的核心。这个项目使用 React + TypeScript + Vite 来构建视图。每个工具(如告警分诊)对应的视图都是一个独立的 React 应用。当mcp.app.view指令被触发时,宿主会加载并渲染指定的 HTML 入口文件。
渲染后的视图如何与服务器通信?这里用到了一个关键的 MCP 特性:Server-Sent Events (SSE)。视图通过一个唯一的sessionId与服务器建立 SSE 连接。之后,视图可以发送 JSON-RPC 请求到该连接,调用那些 app-only 工具。同样,服务器也可以通过这个连接主动向视图推送数据(例如实时告警更新)。
这种设计的好处是:
- 实时性:非常适合安全运营这种需要实时感知新威胁的场景。
- 高效:基于事件的通信模型,避免了频繁的 HTTP 轮询。
- 状态保持:通过
sessionId,服务器可以为每个视图会话维护独立的状态(如用户筛选条件、已读告警列表)。
3. 六大安全工具实操详解与避坑指南
了解了架构,我们来看看这六个工具具体能做什么,以及在实际使用中如何发挥最大效用。我将结合常见的 SOC 工作流,为你梳理每个工具的核心操作和注意事项。
3.1 告警分诊 (Alert Triage)
这是 SOC 分析师日常工作的起点。工具界面通常分为三栏:左侧是告警列表,中间是当前选中告警的详细视图(含 AI 判读卡片),右侧是关联信息(如进程树、网络连接)。
核心操作流:
- 初始过滤:启动后,默认会加载最近一段时间(如1小时)的高危告警。首先利用顶部的过滤栏,按时间、严重等级、规则名称、主机/IP等快速缩小范围。
- AI辅助判读:点击任一告警,在详情面板中会看到“AI Verdict”卡片。这是该工具的一大亮点。它并非简单地复述告警信息,而是会调用 AI 模型(通过后台配置),结合告警上下文、主机基线等信息,给出“恶意”、“可疑”或“良性”的初步判断,并附上简短理由。
重要提示:AI 判读仅供参考,绝不能替代分析师的专业判断。它的价值在于快速标记出高置信度的误报或高威胁事件,帮你决定调查的优先级。务必结合右侧的进程树和网络证据进行核实。
- 深入调查:利用右侧的“Process Tree”和“Network”标签页。进程树可视化能清晰展示可疑进程的父子关系,快速定位攻击入口点。网络连接图则能揭示横向移动或数据外联的企图。
- 处置动作:在告警列表或详情页,通常有“标记为已读”、“变更状态”(如“进行中”、“已解决”)、“加入案例”等快速操作按钮。养成及时更新告警状态的习惯,这对团队协同和报表统计至关重要。
常见问题与排查:
- 问题:告警列表为空或加载缓慢。
- 排查:首先检查工具配置的 Elasticsearch 连接地址和 API Key 是否正确,且该 Key 拥有读取安全告警索引(通常是
.alerts-security.alerts-*)的权限。其次,确认时间过滤范围是否设置得太近或没有匹配的告警。
- 排查:首先检查工具配置的 Elasticsearch 连接地址和 API Key 是否正确,且该 Key 拥有读取安全告警索引(通常是
- 问题:AI 判读卡片显示“模型调用失败”或一直加载。
- 排查:这通常是因为后台的 AI 模型服务(如配置的 OpenAI 或 Anthropic API)未正确设置。你需要检查 MCP 服务器的环境变量或配置文件,确保
AI_PROVIDER、AI_MODEL、API_KEY等参数已正确配置。如果暂时不需要此功能,可以在界面设置中关闭 AI 判读。
- 排查:这通常是因为后台的 AI 模型服务(如配置的 OpenAI 或 Anthropic API)未正确设置。你需要检查 MCP 服务器的环境变量或配置文件,确保
3.2 攻击发现 (Attack Discovery)
这个工具旨在解决高级持续性威胁(APT)或复杂攻击中,单一告警难以看清全貌的问题。它通过关联分析,将离散的告警拼接成可能的攻击链。
核心操作流:
- 启动发现:你可以指定一个时间窗口和实体(如一个用户、一台主机),工具会自动运行后台的关联规则或机器学习作业,寻找期间内的可疑活动序列。
- 解读攻击链:结果会以时间线或图谱形式展示。每个节点代表一个事件或告警,连线代表它们之间的关联关系(如相同进程ID、父子进程、网络连接)。工具会为整条攻击链计算一个“置信度分数”,并尝试映射到 MITRE ATT&CK 框架的战术和技术上。
- 实体风险分析:界面会高亮显示在攻击链中反复出现的实体(如某个用户账号、某个IP地址),并给出其风险评分。这是识别受陷主机和攻击者的关键。
- 生成案例:一旦确认攻击链有效,可以一键将其所有相关告警和事件创建为一个新的调查案例,进入下一阶段的深入分析和响应。
避坑技巧:
- 调整关联阈值:初始运行可能会产生大量误关联。不要被复杂的图谱吓到。仔细检查关联逻辑(如同源IP、同哈希值)是否合理。有些工具允许调整关联规则的敏感度,在设置中调高阈值可以减少噪音。
- 结合外部情报:攻击发现工具主要依赖内部日志关联。对于识别出的可疑 IP 或域名,务必手动或通过集成的外部威胁情报平台进行二次验证,以确认其恶意性。
3.3 案例管理 (Case Management)
安全事件调查往往不是一蹴而就的,需要跟踪进度、分配人员、添加证据。案例管理工具就是将这个过程规范化、线上化。
核心操作流:
- 创建与关联:可以从头创建空案例,也可以直接从告警分诊或攻击发现界面将选中的条目关联到现有或新建案例中。
- 协同调查:案例界面应支持添加评论、上传文件(如内存转储、恶意样本)、标记时间线、分配负责人。确保你的团队有一套使用规范,比如评论时使用
@同事来通知,或使用特定的标签(如#需要取证、#等待外部反馈)来标记状态。 - AI 辅助动作:高级的案例管理工具会集成 AI 建议。例如,当你描述了一个勒索软件现象后,AI 可能会建议“运行以下 ES|QL 查询以查找同一网段内具有相似行为的其他主机”或“建议的遏制步骤包括:1. 网络隔离主机 2. ...”。
注意:AI 建议的操作,尤其是遏制和补救措施,必须经过分析师审核确认后才能执行。自动化响应在策略明确的情况下是高效的,但在复杂环境中可能引发误操作。
3.4 检测规则 (Detection Rules)
SOC 的检测能力建立在规则之上。这个工具让你能在一个界面内浏览、测试、调优所有安全检测规则。
核心操作流:
- 规则浏览与搜索:使用强大的 KQL(Kibana Query Language)搜索框,快速找到你关心的规则。例如,搜索
type:threat and tags:"Credential Access"来查找所有与凭据窃取相关的威胁规则。 - 识别“噪音”规则:工具通常会提供规则触发频率、误报率等指标。重点关注那些“高触发、低确证”的规则。这些是导致告警疲劳的主要元凶。
- 规则调优:点击进入规则详情,你可以看到其底层查询逻辑。调优不是简单地关闭规则,而是使其更精确。例如,一个规则检测“在非办公时间从管理员账号登录”,如果它总是对某位需要夜间运维的同事误报,正确的调优是在规则条件中添加一个例外列表(
not user.name: "night_admin"),而不是放宽时间条件。 - 版本对比与启用/禁用:在修改规则前,利用工具的版本对比功能,清晰看到改动之处。禁用规则时,务必在评论中注明原因和期限,方便后续审计。
3.5 威胁狩猎 (Threat Hunt)
威胁狩猎是主动寻找潜伏威胁的过程。这个工具的核心是一个集成了 ES|QL(Elasticsearch Query Language)的工作台和一个交互式调查图谱。
核心操作流:
- 提出假设:基于威胁情报、内部漏洞或异常行为模式,提出一个狩猎假设。例如:“假设有攻击者利用最近披露的 Log4j 漏洞进行初始访问。”
- 编写 ES|QL 查询:在工作台中编写查询来验证假设。ES|QL 的强大之处在于能跨索引关联查询。例如,你可以写一个查询,关联进程创建事件、网络连接事件和漏洞扫描结果,寻找特定模式。
FROM logs-* | WHERE event.action == "process_started" AND process.command_line LIKE "%java%" | EVAL hour_bucket = BUCKET(@timestamp, 1h) | JOIN [FROM metrics-* | WHERE system.process.cpu.total.pct > 0.8 | KEEP host.name, @timestamp, system.process.cpu.total.pct | RENAME @timestamp AS ts2] ON host.name | WHERE @timestamp - ts2 < 300000 // 5分钟内 | STATS count_per_host = COUNT(*) BY host.name | WHERE count_per_host > 10 - 可视化探索:查询结果中的实体(IP、主机名、用户)可以被点击,并自动添加到右侧的 D3 力导向图中。通过拖拽和连接这些实体,你可以直观地构建和探索它们之间的关系,发现隐藏的攻击路径。
- 保存与分享:将成功的狩猎查询保存为“探测包”或“保存的搜索”,方便日后重复执行或分享给团队其他成员,将个人经验转化为团队能力。
3.6 样本数据 (Sample Data)
这个工具对于演示、培训和测试环境至关重要。它允许你一键生成符合 Elastic Common Schema (ECS) 标准的模拟安全事件数据,覆盖多种预设的攻击场景(如勒索软件、横向移动、数据渗漏、Web攻击)。
使用场景与技巧:
- 演示与培训:在向领导或客户展示 SOC 平台能力时,使用真实数据可能涉及隐私。用样本数据可以安全、生动地演示整个告警分诊和调查流程。
- 测试与开发:在开发新的检测规则或调试 MCP App 本身时,你需要可控、可预测的数据来验证功能。样本数据生成器可以指定时间范围、事件数量,非常方便。
- 理解数据模型:对于新手分析师,通过查看和操作这些结构良好的样本数据,是快速理解 ECS 字段含义和安全事件逻辑的绝佳方式。
提示:生成样本数据时,建议先从一个较小的场景(如“初始访问”)和较短的时间窗口开始,避免一次性生成过多数据导致界面卡顿。确认流程跑通后,再逐步增加复杂度。
4. 从安装到调试:全流程实操指南
理论说得再多,不如动手一试。下面我将以最常用的 Claude Desktop 为例,带你走通从零安装、配置到验证的完整流程,并附上其他环境的要点。
4.1 环境准备与前置条件
在开始之前,你需要确保满足以下条件:
- 一个可用的 Elastic Stack 环境:包括 Elasticsearch 和 Kibana。你可以使用 Elastic Cloud(最快),也可以在本地或自有服务器上部署。版本建议使用 8.x 的最新稳定版。
- 相应的访问权限:
- Kibana URL:用于界面集成和部分 API 调用。
- Elasticsearch URL和API Key:这是 MCP App 与数据源通信的凭证。你需要一个具有足够权限的 API Key。
- 目标 AI 宿主:如 Claude Desktop、Cursor、VS Code with Continue 插件等。本指南以 Claude Desktop 为主。
创建 API Key 的详细步骤(这是最容易出错的一步):
- 登录你的 Kibana 控制台。
- 进入
Management -> Security -> API Keys。 - 点击
Create API key。 - 为密钥起一个描述性名称,如
mcp-security-app。 - 权限设置是关键:为了安全起见,应遵循最小权限原则。你需要创建一个具有特定权限的“角色”,然后将该角色赋予 API Key。
- 进入
Management -> Security -> Roles,点击Create role。 - 角色名:
mcp_security_read_role。 - 在
Elasticsearch权限部分,添加indices和cluster权限。 - Indices 权限:这是核心。你需要允许该角色读取安全相关的索引。添加以下索引模式,并赋予
read、view_index_metadata权限:.alerts-security.alerts-*logs-*metrics-*.siem-signals-*apm-*(如果涉及应用安全)
- Cluster 权限:通常需要
monitor或read权限,以便获取集群状态和信息。
- 进入
- 保存角色。
- 回到 API Keys 创建页面,在
Restrict privileges部分,选择Custom,然后添加你刚创建的角色mcp_security_read_role。 - 点击创建,务必立即复制并安全保存生成的 API Key,因为它只显示一次。
4.2 一键安装(.mcpb 文件方式) - 推荐新手
这是最快捷的安装方式,适合只想快速体验的用户。
- 前往项目的 GitHub Releases 页面 。
- 下载最新版本的
.mcpb文件(例如example-mcp-app-security-1.0.0.mcpb)。 - 双击下载的
.mcpb文件。如果你的系统已正确关联 Claude Desktop,它会自动启动并弹出安装对话框。 - 按照 Claude Desktop 的提示,依次输入:
- Elasticsearch URL:格式如
https://your-cluster.es.us-central1.gcp.cloud.es.io:9243或http://localhost:9200。 - Kibana URL:格式如
https://your-deployment.kb.us-central1.gcp.cloud.es.io或http://localhost:5601。 - Elasticsearch API Key:粘贴你之前创建并保存的密钥。
- Elasticsearch URL:格式如
- 点击确认安装。Claude Desktop 会保存这些配置,并启动 MCP 服务器进程。
验证安装是否成功:
- 打开 Claude Desktop,新建一个对话。
- 尝试输入指令:“列出最近的高危安全告警” 或 “帮我进行告警分诊”。
- 如果安装配置正确,Claude 应该会理解你的意图,并调用相应的工具。稍等片刻,一个交互式的告警分诊界面就应该会渲染在对话中。
- 如果 Claude 表示不知道相关工具,或者界面没有出现,请检查 Claude Desktop 的设置(
Settings -> Developer -> Edit Config),确认 MCP 配置已正确添加。
4.3 从源码构建与运行 - 适合开发者
如果你想深入了解其内部机制、进行二次开发或调试,从源码运行是必须的。
# 1. 克隆仓库 git clone https://github.com/elastic/example-mcp-app-security.git cd example-mcp-app-security # 2. 安装依赖 npm install # 3. 配置环境变量 # 复制示例配置文件,并填入你的实际信息 cp .env.example .env # 编辑 .env 文件,设置 ELASTICSEARCH_URL, KIBANA_URL, ELASTICSEARCH_API_KEY 等变量 # 4. 启动开发服务器 npm run dev # 这会同时启动 MCP 服务器和视图构建的监视模式开发模式下的重要说明:
npm run dev命令会启动服务器,并监听在某个端口(如3000)。你需要在 Claude Desktop 的配置中手动添加这个本地服务器,而不是使用.mcpb文件。- 在 Claude Desktop 的配置文件(通常是
claude_desktop_config.json)中,你需要添加如下配置:{ "mcpServers": { "elastic-security": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-elastic-security", "--elasticsearch-url", "YOUR_ES_URL", "--kibana-url", "YOUR_KB_URL", "--elasticsearch-api-key", "YOUR_API_KEY" ], "env": { // 可选的环境变量 } } } }- 或者,更简单的方式是使用
npx直接运行你本地构建的服务器,但需要指定绝对路径。
- 或者,更简单的方式是使用
- 开发时,对
server/目录下 TypeScript 代码的修改会触发服务器重启。对views/目录下 React 代码的修改,Vite 会进行热重载,你通常只需要在浏览器中刷新嵌入的视图界面即可看到变化。
4.4 在其他 AI 宿主中配置
- Cursor / VS Code (with Continue):原理类似,都是在其配置文件中添加 MCP 服务器配置。你需要找到对应 IDE 或插件的 MCP 配置位置(通常在用户设置或
.continuerc.json文件中),添加指向你运行的 MCP 服务器(无论是.mcpb安装的,还是本地npm run dev运行的)的配置块。具体格式请参考项目docs/目录下的对应指南。 - Claude Code:作为 Anthropic 官方的 IDE 插件,它提供了
claude mcp add命令行工具来添加 MCP 服务器,相对更集成化。 - Claude.ai (网页版):由于网页版无法直接访问本地服务器,部署最为复杂。你需要使用内网穿透工具(如
cloudflared)将本地运行的 MCP 服务器暴露到一个公网可访问的 HTTPS 地址,然后在 Claude.ai 的配置中填入该地址。此过程涉及网络安全风险,请谨慎操作,仅用于测试,并确保使用强密码或密钥保护你的隧道端点。
4.5 技能(Skills)安装:让 AI 更懂你
“技能”是 Claude 特有的概念,它是一个SKILL.md文件,用于教导 Claude 在什么场景下、如何使用某个 MCP 工具。这个安全 App 的skills/目录下就提供了预定义的技能。
安装技能的好处:即使你不提具体的工具名,Claude 也能根据你的自然语言描述,准确调用对应的安全工具。例如,你说“我感觉系统有点不对劲,帮我查查”,受过训练的 Claude 可能会建议“我来帮您运行一次威胁狩猎,或者查看一下最近的异常告警”。
安装方法:
- npx 一键安装(推荐):在终端运行
npx @modelcontextprotocol/create-skill@latest,按照提示选择从 URL 安装,并输入本项目 skills 目录下对应技能的 raw GitHub URL。 - 手动安装:将
SKILL.md文件内容复制,在 Claude Desktop 或 Claude.ai 的技能设置页面中粘贴创建。 - 本地加载:如果你在本地运行 Claude Desktop,可以将技能文件放在特定目录,并在配置中引用。
安装完成后,你可以和 Claude 进行更自然、更接近安全专家之间的对话,它会主动利用这些工具来辅助你。
5. 开发与定制:打造你自己的 MCP App
如果你不满足于使用,还想基于此项目进行定制或从头创建自己的 MCP App,这里有一些核心的开发要点。
5.1 项目结构解析
example-mcp-app-security/ ├── server/ # MCP 服务器核心代码 (TypeScript) │ ├── index.ts # 服务器入口,工具定义 │ ├── tools/ # 各个工具的后端实现 │ │ ├── alertTriage.ts │ │ └── ... │ └── views/ # 视图渲染逻辑 ├── views/ # 前端 React 应用 │ ├── src/ │ │ ├── tools/ # 各个工具对应的 React 组件 │ │ │ ├── AlertTriage/ │ │ │ └── ... │ │ └── main.tsx # 前端入口 │ └── index.html ├── skills/ # Claude Skills 定义文件 ├── mcp.json # MCP 服务器配置文件(声明工具和视图) ├── package.json └── ...mcp.json:这是 MCP 的“清单文件”,定义了服务器向宿主暴露了哪些工具(tools),以及这些工具可能返回哪些视图(views)。app-only工具也在这里声明,但不会放在根级的tools里,而是在视图的bindings中。server/tools/:每个工具一个文件,实现了工具的处理逻辑。对于 model-facing 工具,其函数最终要返回一个CallToolResult,其中包含content(给 AI 的文本)和view(给用户的界面)。views/src/tools/:每个工具对应的 React 组件。它们通过 MCP 提供的 SDK(如@modelcontextprotocol/sdk)与服务器建立 SSE 连接,并调用 app-only 工具。
5.2 添加一个新工具:以“漏洞扫描器”为例
假设我们想添加一个查看主机漏洞扫描结果的新工具。
步骤一:在mcp.json中声明
{ "mcp": { "tools": { "vulnerability_scanner": { "name": "vulnerability_scanner", "description": "Fetch and display vulnerability scan results for assets.", "inputSchema": { "type": "object", "properties": { "hostname": { "type": "string", "description": "Optional hostname to filter results." } } } } }, "views": { "vulnerabilityDashboard": { "name": "vulnerability_dashboard", "description": "Interactive dashboard for vulnerability management.", "bindings": { // 这里定义仅该视图可用的 app-only 工具 "get_vuln_details": { "name": "get_vuln_details", "description": "Get detailed information for a specific vulnerability CVE.", "inputSchema": { ... } } } } } } }步骤二:实现服务器端工具 (server/tools/vulnerabilityScanner.ts)
import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { CallToolResult } from '@modelcontextprotocol/sdk/types.js'; import { getElasticsearchClient } from '../elasticsearch.js'; // 假设的 ES 客户端 export async function handleVulnerabilityScanner( server: Server, params: { hostname?: string } ): Promise<CallToolResult> { // 1. 调用 Elasticsearch 获取漏洞数据(简化示例) const esClient = getElasticsearchClient(); let query: any = { query: { match_all: {} } }; if (params.hostname) { query = { query: { match: { 'host.name': params.hostname } } }; } const response = await esClient.search({ index: 'vulnerabilities-*', body: query, size: 100 }); const total = response.hits.total.value; const summaryText = `Found ${total} vulnerability records${params.hostname ? ` for host ${params.hostname}` : ''}.`; // 2. 返回结果:文本摘要 + 视图 return { content: [ { type: 'text', text: summaryText, }, ], // 关键:返回视图,触发 UI 渲染 view: { type: 'mcp.app.view', view: 'vulnerabilityDashboard', // 对应 mcp.json 中定义的 view name args: { // 可以将初始数据或参数传递给前端 initialHostname: params.hostname, initialCount: total, }, }, }; }步骤三:实现前端视图 (views/src/tools/VulnerabilityDashboard/index.tsx)这是一个 React 组件,它需要:
- 在
useEffect中,通过 SDK 建立与服务器的 SSE 连接。 - 使用
session.callTool()方法调用 app-only 工具get_vuln_details来获取数据。 - 将数据渲染为表格、图表等交互式界面。
- 处理用户的交互事件(如点击某行查看详情),并再次调用相应的 app-only 工具。
步骤四:实现 App-only 工具 (server/tools/getVulnDetails.ts)这个函数只处理来自前端视图的请求,执行具体的 ES 查询,返回详细的漏洞信息。
步骤五:注册工具在server/index.ts中,将新的handleVulnerabilityScanner函数注册到 MCP Server 实例。
5.3 调试技巧与常见问题
- 查看 MCP 通信日志:这是调试的黄金手段。在启动 Claude Desktop 时,可以通过环境变量开启详细日志。例如在终端中运行
MCP_DEBUG=1 /Applications/Claude.app/Contents/MacOS/Claude(macOS)。日志会显示所有工具调用请求和响应,帮助你判断是 AI 没有调用工具,还是工具调用失败了。 - “工具未找到”错误:确保
mcp.json中的工具定义与服务器代码中注册的工具名完全一致(包括大小写)。重启 MCP 服务器和 AI 宿主。 - 视图渲染失败或空白:打开浏览器的开发者工具(对于 Claude Desktop,可能需要一些技巧,或者直接调试从源码运行的独立视图页面),查看控制台是否有 JavaScript 错误,网络请求是否成功。检查视图的 HTML/JS 文件是否被正确构建和加载。
- Elasticsearch 连接错误:检查环境变量或配置文件中的 URL 和 API Key。尝试用
curl命令直接测试 API Key 的权限是否足够:curl -H "Authorization: ApiKey YOUR_KEY" YOUR_ES_URL/_security/_authenticate。 - 性能优化:如果工具响应慢,尤其是涉及大数据量查询时,考虑在工具实现中:
- 为查询添加合理的默认时间范围和分页。
- 使用异步处理,先快速返回一个“正在加载”的视图,然后让前端通过 app-only 工具逐步拉取数据。
- 在 Elasticsearch 层面优化索引和查询。
这个 Elastic Security MCP App 项目为我们展示了一个未来人机协作的绝佳范本。它没有试图让 AI 取代安全分析师,而是通过精巧的架构,将 AI 的意图理解、推理能力与专业安全工具的交互界面、数据处理能力深度融合。对于安全团队而言,它降低了高级分析的门槛,提升了应急响应的速度;对于开发者而言,它提供了一个清晰的蓝图,告诉我们如何将复杂的传统企业软件能力,通过 MCP 这个协议,优雅地暴露给新一代的 AI 智能体。无论是直接应用,还是借鉴其思想构建你自己的领域专属 AI 助手,这个项目都极具参考价值。在实际部署中,从一个小工具开始,逐步迭代,并始终将安全性和可控性放在首位,你将能切实感受到 AI 赋能所带来的效率革命。
