AI驱动的安全创新:MCP技术的应用实践
原创 Leiothrix 2025-02-27 18:33 上海
由知名大模型Claude的母公司Anthropic发布模型上下文协议(MCP, Model Context Protocol),它通过提供一个通用的标准接口,让AI应用能轻松连接到各种数据源,如数据库、API和企业工具。
前言
在2024年11月25日,由知名大模型Claude的母公司Anthropic发布模型上下文协议(MCP, Model Context Protocol),旨在解决AI模型因信息孤岛而无法高效访问外部数据的难题。它通过提供一个通用的标准接口,让AI应用能轻松连接到各种数据源,如数据库、API和企业工具。
我真正注意到这个概念是在2025年1月,当时正值DeepSeek爆红以及Cline开发插件的流行时期。Cline作为首批支持MCP的应用插件之一,让我对这个概念产生了浓厚的兴趣,但因为春节期间只想着好好享受假期,也就草草的上网搜了一下简介了解了个大概。
如果想寻求安全中如何利用大模型来为自己的基础设施服务提高效率,如何将LLM真正融入到企业级的CI/CD中,以及针对大规模多事件的运维处理事项上。开发一个定制化的MCP一定是众多解决方案中效果最好,扩展性最高的。
MCP介绍
正如前言中所述,MCP通过一个通用的标准接口,可以让AI应用能轻松连接到各种数据源,因此也被人们称之为针对LLM的USB-C接口。

如上图MCP的架构图所示,大致由五个部分组成:
MCP Host:可以理解为你所需要通过MCP调用数据源的程序和工具。 MCP Client:负责将工具的请求转换为MCP可识别的调用。 MCP Server:轻量化的程序,如文件系统、Web搜索、数据库等服务。 Local Data Sources:本地需要访问的数据资源。 Remote Service:公开可调用的MCP接口等远程数据资源。 目前所支持的服务系统可以在GitHub仓库上找到:https://github.com/modelcontextprotocol/servers
而这里的MCP,指的就是一种开放协议,标准化了AI应用与外部数据源和工具的集成方式。其核心架构就为上图所示的客户端-服务器模型。根据MCP的介绍,MCP提供以下关键功能:
一系列预构建的集成,方便LLM直接使用。 灵活性,支持在不同LLM提供商和供应商间切换。 安全最佳实践,确保数据在基础设施内的安全性。
而在我写这篇文章的时候,翻阅了不少关于MCP的介绍文章,其中大部分的判断是MCP的出现不亚于Web动态语言的这一重大改革,还有一部分是说MCP是朝着LLM界的LSP(Language Server Protocol)标准对齐。而不管怎么说,这的确能让中小推理模型可以更好的结合上下文和获取到的基础数据,更好的提高模型能力,以用于解决复杂场景下机械性、重复性的工作。
其中,还有提到一个llms.txt的标准,将其类比Web2.0时期的robots.txt,用于帮助推理模型发现暴露的MCP、Agent等接口服务,让模型在访问到项目中的llms.txt就可以直接安装、使用对应的服务。
MCP应用场景
因MCP适用于多种需要AI访问外部数据的情况下,所以应用场景多数为:
AI驱动的IDE,连接代码仓库和开发工具。 增强聊天界面,整合知识库和客户数据。 定制AI工作流,访问数据库和企业系统。
为了能够更直观的理解MCP带来的LLM效能提升,我这里再引入一个使用案例辅助读者更好的理解这一概念。
首先我们可以在本地安装一个调试工具,这个工具在之后不论是测试还是开发都可以用到
npx @modelcontextprotocol/inspector
以官方的文件系统工具为例:https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem 该MCP服务可以通过调用对应的工具访问到本地的文件和目录,将其clone到本地

之后在MCP Inspector链接该工具,方法很简单,直接在Command和参数中运行这个文件即可

这里链接成功后选择了list_directory工具,输入需要读取的对应path即可访问到。看起来很简单是不是,就只要能让LLM能够正确选择对应工具名称和填对参数就行,其实本质上就类似于提供了一个Function Calling。但MCP的好处不同在于,协议提供了一种标准统一管理和发现、以及多种资源采集的访问能力。同时也有着低耦合,可以满足快速迭代的属性。
有了MCP的标准协议后,程序员在开发基础设施架构时,也可以利用常规的开发语言,将LLM的灵活性与中间件的强大功能巧妙融合,从而更高效、便捷地实现目标。

上图就是Java开发框架Spring AI对MCP的支持架构图
其MCP有两种部署方式,一种是本地,采用标准的输入/输出来进行通信;另一种则是远程,采用SSE (Server-Sent Events)的通信方式,而所有传输都使用 JSON-RPC 2.0 来交换消息。
开发一个自动研判恶意操作的MCP
因为目的是想着随便开发一个做个教学过程,正好最近在看类似的书,就一起做一个Demo来学习巩固下。

程序大致逻辑就是通过ebpf写一个Agent安装在主机上来监听内核的执行命令,执行过的所有命令都保存在远端的Mongodb数据库中,而后续LLM(比如xxx时间段有恶意流量,需要上主机进一步排查取证)直接调用MCP查询某个时间段执行过的所有命令并研判是否属于恶意操作。
开发环境部署调试
开发MCP的框架很多,可以在这里找到你所熟知语言的框架:https://github.com/punkpeye/awesome-mcp-servers/blob/main/README-zh.md#%E6%A1%86%E6%9E%B6
我这里就选Python的FastMCP来实现:https://github.com/jlowin/fastmcp
在开发之前,我先通过搭建一个Hello World例子,来完善开发所需要的一些前置条件:
uv init ebpfExecDB #创建一个用uv来管理虚拟python环境的项目
用uv的工具创建一个虚拟环境 通过uv的pip来安装框架依赖
uv pip install fastmcp
按照官网的例子,我直接用下面的代码来测试一下
# server.py
from fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a Static Resource
@mcp.resource("config://app")
def get_config() -> str:
"""Static configuration data"""
return"App configuration here"
# Add a dynamic resource
@mcp.resource("users://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
"""Dynamic user data"""
returnf"Profile data for user {user_id}"
# Add a prompt template
@mcp.prompt()
def review_code(code: str) -> str:
returnf"Please review this code:\n\n{code}"可以看到在代码中除了Tool的工具之外,还有Resource、Prompt等类型
Resource:分为静态和动态两种资源类型,可以看作web2中的GET请求,用于请求某些特定的资源。如文本、PDF、图片、音视频等。 Tool:这个可以执行代码,类似web2中的REST API请求端点。 Prompt:有时候需要让工具接着调用其他的MCP或者处理定向的内容,可以用这个返回对应prompt,让模型更侧重自己的方向理解。

与此还有的是采样Sampling,可以将服务器需要补充或者修订的内容发送给客户端的LLM,让LLM和用户进行确认并采取下一步动作。比如MCP调用的时候会向用户发送可能输入的参数,当确定后将会进行调研,这个过程类比就是MCP采样能力。
接着将代码保存为server.py,并运行下面的命令启动调试,调试的方式就是直接运行fastmcp dev,其中内置了MCP Inspector的工具
uv run --with fastmcp fastmcp dev server.py
启动后会输出访问本地的5173端口,找到对应的工具直接调试使用即可

LLM通过MCP取证程序开发
介绍完初步调试,在这里我就使用Cline来开发,先向它描述了我需要的开发需求
在ebpf2db.py文件中用ebpf编写一个监控本地Linux执行过的命令,并保存到日志文件中,同时写入到mongodb中
接着本地搭建一个mongodb
docker run -d -p 27017:27017 --name mongo-container mongo:7.0.16-rc1
AI给我生成的代码如下:
#!/usr/bin/env python3
from bcc import BPF
from pymongo import MongoClient
import time
import os
import logging
# MongoDB configuration
MONGO_URI = "mongodb://localhost:27017/"
DB_NAME = "execMcpSecurity"
COLLECTION_NAME = "commands"
# Logging configuration
LOG_FILE = "/var/log/command.log"
logging.basicConfig(
filename=LOG_FILE,
level=logging.INFO,
format="%(asctime)s - %(message)s"
)
# eBPF program
bpf_text = """
#include <uapi/linux/ptrace.h>
#include <linux/sched.h>
struct data_t {
char comm[TASK_COMM_LEN];
char argv[256];
};
BPF_PERF_OUTPUT(events);
int syscall__execve(struct pt_regs *ctx, const char __user *filename,
const char __user *const __user *argv,
const char __user *const __user *envp) {
struct data_t data = {};
bpf_get_current_comm(&data.comm, sizeof(data.comm));
bpf_probe_read_user_str(&data.argv, sizeof(data.argv), (void *)argv[0]);
events.perf_submit(ctx, &data, sizeof(data));
return 0;
}
"""
# Initialize MongoDB client
client = MongoClient(MONGO_URI)
db = client[DB_NAME]
collection = db[COLLECTION_NAME]
def handle_event(cpu, data, size):
event = b["events"].event(data)
command = event.comm.decode('utf-8')
args = event.argv.decode('utf-8')
# Log to file
log_message = f"Command: {command}, Args: {args}"
logging.info(log_message)
# Insert to MongoDB
document = {
"timestamp": time.time(),
"command": command,
"arguments": args
}
collection.insert_one(document)
# Load BPF program
b = BPF(text=bpf_text)
# 修改事件名为 __x64_sys_execve(x86_64 架构)
b.attach_kprobe(event="__x64_sys_execve", fn_name="syscall__execve")
print("Monitoring system commands... Press Ctrl+C to stop.")
# Process events
b["events"].open_perf_buffer(handle_event)
whileTrue:
try:
b.perf_buffer_poll()
except KeyboardInterrupt:
print("\nMonitoring stopped.")
break
如果过程中有遇到如下错误,可能是使用了python 3.10+的版本
ImportError: cannot import name 'MutableMapping' from 'collections'
因为大多数apt install的方式下载的python3-bcc都比较老了,我这里用的是py 3.10+,最好的解决办法就是自己本地编译一个bcc
https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---source
可以根据这个文档中介绍的安装依赖和编译bcc 完成编译之后如果没有在虚拟环境中安装成功bcc,还是提示找不到对应模块的话,可以在之前编译bcc的build/src/python目录下找到setup.py,手动安装一下即可。
(envname) root@chen-VMware-Virtual-Platform:~# python3 ebpfExec2DB.py
cannot attach kprobe, Invalid argument
Traceback (most recent call last):
File "/root/ebpfExec2DB.py", line 69, in
b.attach_kprobe(event="sys_execve", fn_name="syscall__execve")
File "/root/envname/lib/python3.12/site-packages/bcc-0.33.0+2b32635a-py3.12.egg/bcc/__init__.py", line 881, in attach_kprobe
Exception: Failed to attach BPF program b'syscall__execve' to kprobe b'sys_execve', it's not traceable (either non-existing, inlined, or marked as "notrace")
之前生成的代码还有些问题,比如运行后如果出现这个问题,就是AI给出的代码还是不够完善,在新内核(5.x+)中系统调用名称已变更,需使用架构前缀:
# 修改事件名为 __x64_sys_execve(x86_64 架构)
b.attach_kprobe(event="__x64_sys_execve", fn_name="syscall__execve")
还能通过下面的命令查看对应可以调用的系统名称
sudo cat /sys/kernel/debug/tracing/available_filter_functions | grep execve

随后我们直接运行这个程序

该Agent将本地的所有命令执行过程都存储到/var/log/command.log文件中,同时也存储到mongodb中(该阶段也可以用logstash等日志采集工具)。

日志中有对应的数据

mongodb中也正常保存了对应的数据,这样一来逻辑确实没有问题了,程序也跑通了,但是发现对应的echo命令却没有正常捕获下来。 问了下AI,告诉我echo无法被execve捕获,而/bin/bash可以(情况也确实这样),那这样一来就无法再获取到通过shell内置直接运行的echo。

我也问了该如何完善这部分的代码,使其内置的shell恶意操作也可以捕捉到:
Shell 内置命令:echo、cd 等内置命令不会触发 execve。
这个内置命令有什么其他监控的方式可以通过ebpf触发到吗

由于只是开发MCP的Demo,这里就不完善ebpf程序逻辑,不再深入钻研了。 接着就是使用FastMCP开发一个接口能让LLM理解并填写查询:
# mongodb_server.py
from fastmcp import FastMCP
from pymongo import MongoClient
from datetime import datetime
from typing import Optional, List, Dict
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
def get_db_config():
"""Get database configuration from environment variables."""
config = {
"uri": os.getenv("MONGO_URI", "mongodb://localhost:27017"),
"key": os.getenv("QUERY_KEY"),
"database": os.getenv("DATABASE_NAME","execMcpSecurity")
}
ifnot all([config["uri"], config["key"], config["database"]]):
logger.error("Missing required database configuration. Please check environment variables:")
logger.error("MONGO_URI, QUERY_KEY, and DATABASE_NAME are required")
raise ValueError("Missing required database configuration")
return config
# 创建 MCP Server
mcp = FastMCP("ebpfExecDB")
# 定义查询工具:根据集合名称和时间戳范围查询集合内容
@mcp.tool()
def query_collection(
collection_name: str,
start_time: Optional[str] = None,
end_time: Optional[str] = None
) -> List[Dict]:
"""
根据集合名称和时间戳范围查询集合内容。
:param collection_name: 集合名称
:param start_time: 开始时间(ISO格式,如2025-01-01T00:00:00)
:param end_time: 结束时间(ISO格式,如2025-01-02T23:59:59)
"""
config = get_db_config()
if config['key'] != 'admin888':
return
# 初始化 MongoDB 客户端
client = MongoClient(config['uri'])
db = client[config['database']]
collection = db[collection_name] # 动态选择集合
query = {}
if start_time:
query["timestamp"] = {"$gte": datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S").timestamp()}
if end_time:
if"timestamp"notin query:
query["timestamp"] = {}
query["timestamp"]["$lte"] = datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%S").timestamp()
logging.debug(f"Querying collection '{collection}' with query: {query}")
result = list(collection.find(query))
return result
这个是AI给我生成的,但是给我生成的代码格式一开始是用的字符串,我改成Mongodb中可以匹配的时间戳。接着我们直接在 MCP Inspector中测试一下查询

MCP开发的好处就在于还可以在运行的时候就附带上Key密钥来进行交互,类似REST API的常见JWT和密码机制。 接下来就是在本地安装MCP,由于是python的框架,就是用uv来链接本地的MCP 通常会把这类配置叫做claude_desktop_config.json或者cline中的cline_mcp_setting.json
但如果你不知道该怎么填,可以通过fastmcp install xxx.py的方式生成一个

会根据你的系统在对应的目录下生成一个这样的配置文件,打开就可以看到具体安装的配置参数应该怎么填了。

但是这个还不能是最终的配置,因为uv我本地项目用了uv init来创建一个独特的.venv环境,所以在使用uv run的时候需要指定工作目录。加上我在代码中将验Mongodb和验证的key放到了环境变了中获取,因此这里也需要添加上。
{
"mcpServers": {
"ebpfExecDB": {
"type": "stdio",
"command": "uv",
"args": [
"run",
"--directory",
"/Users/test/Desktop/work/MCPSecurity/VptFetch/ebpfExecDB",
"--with",
"fastmcp",
"fastmcp",
"run",
"/Users/test/Desktop/work/MCPSecurity/VptFetch/ebpfExecDB/ebpfExecDB.py"
],
"env": {
"MONGO_URI": "mongodb://localhost:27017",
"DATABASE_NAME": "execMcpSecurity",
"QUERY_KEY": "admin888"
}
}
}
}
我这里直接安装在Cline里面了,而在你安装完成MCP后,我们就可以直接在Cline中问:
调用ebpfExecDB查询commands集合在今天2025年2月24日中午12点到晚上24点之间的内容,并根据这段内容告诉我都执行了些什么命令
MCP的好处就是在于模型可以逐步确认你填写的参数是否正确,点击确认后会输出对应的结果

唯一美中不足的是这里模型输出编程英文了,可能是Cline的系统提示词本身就是英语,因此造成语言输出有时候会混乱。
这样一来,就可以让LLM根据某一个时间段,某一个集合(可以根据Agent上主机名称的不同来命名)来实时判断系统在这些时间都做了什么,并通过另一个MCP自动处理封禁、并接着一个一个的调用MCP来取证、通知、定位漏洞提交PR给研发人员紧急修复等等...
完整的代码我将其上传至Github上了:https://github.com/sf197/ebpfExecDB
MCP在信息安全中的实践和思路
既然已经了解MCP的大致原理和开发过程,也整体上有印象知道是做些什么的了。 于是就开始思考信息安全领域可利用MCP来开发更高效安全建设的应用场景:
威胁情报整合:AI工具通过MCP连接多个威胁源、漏洞数据库和内部安全日志,综合分析识别模式和异常。例如,SIEM系统可利用MCP整合日志数据,提升威胁检测效率。 安全自动化:AI代理可通过MCP访问相关数据和工具,自动化事件响应或补丁管理,减少定制集成的复杂性。 用户行为分析:AI可连接用户活动日志和访问控制系统,检测内部威胁或异常行为,提升安全监控能力。 合规与审计:AI可通过MCP访问政策文档、系统配置和活动日志,自动化合规检查和审计流程。 安全编排:MCP可将AI集成到安全编排平台,实现更智能的自动化工作流。
例如常见的企业DevSecOps应用场景,如何让LLM赋能开发场景,提高代码质量、隐私合规、数据安全等指标。是不是可以将每次增量的代码commit进行扫码,通过有记忆存储能力的模型结合之前检测出来过的漏洞结合一起判断?
或者直接由大模型来检索漏洞,给出详细代码修复信息,同时调用MCP来提交Issue或者PR。
总感觉我自己的思路着实有限,加上这些方向都还有些虚头巴脑。于是乎就把我的想让Sonnet 3.7强大的代码能力为我思考,看看有没有让人耳目一新的思路。我调整了下询问的Prompt:
你是一名经验、想象力丰富的信息安全从业人员,最近企业需要应用AI能力来赋能企业的安全建设、办公安全、DevSecOps等场景。我想让你结合AI和MCP(Model Context Protocol)来实现落地应用。我已经总结出来了如下几个可能性:
信息安全领域可利用MCP开发更高效的应用场景,以下为可能的用例:
1. **威胁情报整合**:AI工具通过MCP连接多个威胁源、漏洞数据库和内部安全日志,综合分析识别模式和异常。例如,SIEM系统可利用MCP整合日志数据,提升威胁检测效率。
2. **安全自动化**:AI代理可通过MCP访问相关数据和工具,自动化事件响应或补丁管理,减少定制集成的复杂性。
3. **用户行为分析**:AI可连接用户活动日志和访问控制系统,检测内部威胁或异常行为,提升安全监控能力。
4. **合规与审计**:AI可通过MCP访问政策文档、系统配置和活动日志,自动化合规检查和审计流程。
5. **安全编排**:MCP可将AI集成到安全编排平台,实现更智能的自动化工作流。
根据上面几点我拓展等几个方向思路:
1. 采集恶意攻击信息统计为时序序列,让LLM来预测攻击?
2. 接入黑盒扫描的工具,实现自动化扫描?
3. 融合Jumpserver在监听到敏感行为后自动取证?
4. 结合VirusTotal对研判为钓鱼邮件对附件自动扫描取证?
5. 通过MCP在流水线上线前的SAST、IAST、DAST等结果研判,自动卡点?
6. 结合DeepSearch的功能,实现针对某个项目的合规基线检查?
7. 通过MCP调取SAST的变量关系数据库,绘制污点数据流,审查漏洞?
8. 通过MCP访问网页提炼多个CVE漏洞信息来源,研判漏洞优先级?
9. 用MCP的框架写一个Agent,通过远程的方式从各个机器上获取数据交由LLM处理
但我觉得这些都比较理论,没有一个更切实际的可行性方向,麻烦你给出我几个非常具有可行性的方向思路,同时给出具体实践的方法。如有必要可以再生成SVG图供我更好的理解你给出的方法体系。
自适应安全策略
Sonnet的回答确实让人很震惊,比如第一个自适应安全策略

该思路看了下,应该是通过MCP读取安全设备的捕获标准和策略是否需要进一步优化,感觉架构图中应该还少了BAS,将BAS的扫描结果读取,并配合安全设备的策略规则自动化优化,并交由人工审核后通过。
针对云安全平台的基线检查安全评估

检测恶意邮件的思路
智能漏洞管理与优先级排序系统
具体方案: 构建通过MCP整合多源漏洞数据并利用LLM进行智能分析的系统,实现漏洞的自动化优先级排序。实施方法:
通过MCP连接漏洞扫描工具(Nessus、Qualys等)、威胁情报源和CVE数据库 开发漏洞上下文获取模块,使用MCP为LLM提供漏洞详情、受影响资产信息和环境数据 设计基于多因素的评分模型,包括CVSS、资产价值、攻击面暴露度等 实现自动修复建议生成,包括临时缓解方案和长期修复措施 与补丁管理和变更管理流程集成,形成闭环
DevSecOps集成MCP
紧接着重点问了下DevSecOps平台的架构图是什么样的
DevSecOps安全集成
可行性分析:在CI/CD流程中插入安全检查点,实现"左移"安全策略,具有明确的实施途径。
具体实践方法:
* 开发MCP适配器接入Jenkins/GitLab/GitHub Actions等CI/CD工具
* 构建安全闸门机制:结合SAST、DAST、SCA工具结果,由AI判断是否允许构建继续
* 实现智能漏洞分析:通过MCP收集代码上下文、补丁信息和业务重要性,AI评估实际风险
* 提供自动修复建议:对于常见漏洞类型,AI可生成修复代码建议并创建PR
请再详细介绍DevSecOps安全集成如何实现,请用SVG画出架构图,同样的不要给我生成任何代码,只需要画出SVG的图和一些介绍即可。
或许还可以参照https://github.com/patched-codes/patchwork/tree/main/patchwork/patchflows/AutoFix 的自动修复设计思路,通过分段处理白盒等安全设备,降低其误报率,最后调用MCP等工具、资源(修复文档) 自动生成PR的修复方案。
总结与思考
从之前的开发用例过程中不难看出,MCP的特性非常明显:
灵活性:接入本地、远程等可以获取到的基础设施文档、图像、数据等资源信息。 易用性:开发成本低、现存的框架几乎有着开箱即用的接口。 安全性:调用本地的代码,可以很好的控制数据资源的审计和访问权限控制。
MCP作为一种新兴协议,在信息安全领域的应用尚处于早期阶段,但其标准化和灵活性为安全工具的开发提供了巨大潜力。随着更多公司采用MCP,预计未来将出现更多创新性应用案例,特别是在威胁检测、自动化和合规领域。
今天还看到有人把 Anthropic 发布的开发工具Claude Code 的原理公布出来了
一整个就是MCP的本地工具实现
不论是RAG(Retrieval-Augmented Generation)、Agent,这些提升模型能力的优化手段,都不过是通向真正智能时代的一段过渡。随着AGI(Artificial General Intelligence)的曙光初现,知识库与外接能力亦或将成为历史。不管怎么说,AI都在逐步迈向自我完善的新阶段,直到真正实现自身可完善的通用能力。
Reference
[1]. https://www.anthropic.com/news/model-context-protocol
[2]. https://modelcontextprotocol.io/introduction
[3]. https://github.com/modelcontextprotocol/servers
[4]. https://spring.io/blog/2024/12/11/spring-ai-mcp-announcement
[5]. https://github.com/jlowin/fastmcp
[6]. https://zhuanlan.zhihu.com/p/9407964392
[7]. https://mp.weixin.qq.com/s/ASmcjW53HKokdYt1m-xyXA
[8]. https://mp.weixin.qq.com/s/UdxLiXf8cYpFMAKD2HJCUw
[9]. https://github.com/punkpeye/awesome-mcp-servers/blob/main/README-zh.md
[10]. https://aicoding.csdn.net/67656c512db35d1195209ba2.html