MCP 实战:文件、数据库、浏览器与搜索
MCP 让模型从「只会聊」变成「能动手」:整理本地文件、查只读数据库、开浏览器抓页面、联网搜索。能力越强风险越大,所以本章每条用法都配了「该做什么 + 不该做什么」。整章只有两条底线:先只读后写入,先小范围后全量。
MCP 的三层角色
| 角色 | 谁提供 | 作用 | 你要管什么 |
|---|---|---|---|
| 客户端 | 你用的 AI 工具 | 连接服务端,把工具列表交给模型 | 工具白名单与开关 |
| 服务端 | 官方或自建的小程序 | 真正执行文件、数据库、浏览器动作 | 进程以什么账号、什么权限运行 |
| 工具与资源 | 服务端暴露的原子能力 | 一次调用做一件事 | 参数校验、路径与命名空间边界 |
模型只负责「选哪个工具、传什么参数」,真正落盘和改库的是服务端。所以权限要配在服务端,别指望在提示词里写一句「不要删」就能拦住它。
四类服务的上线顺序
| 类型 | 典型能力 | 建议顺序 | 主要风险 |
|---|---|---|---|
| 文件 | 读、写、批量重命名、按规则归类 | 先只读目录,再写新文件 | 误删、覆盖、改到系统目录 |
| 数据库 | 执行查询、看表结构、看索引 | 先只读账号 + LIMIT | 全表扫描、误更新误删 |
| 浏览器 | 打开页面、点击、填表、截图 | 先只读抓取,再交互 | 误提交表单、误下单 |
| 搜索 | 关键词检索、抓取网页正文 | 最先开,风险最低 | 抓到旧版本、抓到内网地址 |
文件整理与批量重命名
先让模型给方案,暂时不给它执行权:
你是我的文件整理助手。目标目录:D:\data\inbox,只处理这一层,不要递归子目录。
第一步只做分析,不做任何修改:列出全部文件,按扩展名与文件名规律分组,指出
哪些能按统一规则重命名、哪些命名已经规范不需要动、哪些你判断不了。
第二步给出重命名方案表,三列:原名 | 新名 | 理由。
新名规则:日期(YYYYMMDD) + 主题 + 序号;主题从文件名提取,提取不到就标注「需人工」。
第三步等我回复「确认执行」再动手。只做重命名,不删除、不移动、不覆盖同名文件;
目标名已存在就跳过,并写进报告。
最后输出变更清单:成功几条、跳过几条、跳过原因。
真正执行前先备份或干跑,确认名单再落盘:
# 干跑:只打印会改哪些文件,不改名
for f in *; do printf '%s -> %s\n' "$f" "$(echo "$f" | tr 'A-Z' 'a-z')"; done
# 执行前备份整个目录
cp -a /data/inbox "/data/inbox.bak.$(date +%Y%m%d)"
| 该做什么 | 不该做什么 |
|---|---|
| 指定单一目录,并声明不递归 | 直接说「帮我清理一下磁盘」 |
| 先出方案表,人工确认后执行 | 让它边分析边改文件 |
| 执行前备份或干跑 | 允许删除、覆盖、改系统目录 |
| 要求输出变更清单 | 只看它回复「已完成」 |
数据库查询:先只读,永远带 LIMIT
给数据库 MCP 单独建一个只读账号,口令走环境变量引用:
{
"mcpServers": {
"db-readonly": {
"command": "<你的数据库 MCP 服务端启动命令>",
"args": ["--readonly"],
"env": {
"DB_HOST": "127.0.0.1",
"DB_PORT": "3306",
"DB_NAME": "app",
"DB_USER": "ai_readonly",
"DB_PASSWORD": "${env:AI_DB_PASSWORD}",
"DB_READONLY": "true"
}
}
}
}
提示词里把硬约束写死,重复使用:
你通过只读数据库 MCP 帮我查数据。规则:
1) 只发 SELECT,绝不发 UPDATE/DELETE/INSERT/DROP/ALTER/TRUNCATE;
2) 每条查询必须带 LIMIT,默认 100,最多 1000;
3) 不要写 SELECT *,明确列出需要的字段,避免拖出大字段;
4) 涉及大表先给 EXPLAIN 结果并说明预估扫描行数,我同意后再执行;
5) 结果里若出现手机号、身份证、邮箱、详细地址,默认脱敏展示,
只保留前 3 位与后 2 位,除非我这次明确说要看原文;
6) 查完用一段话总结结论,并附上你实际执行的 SQL 原文。
| 该做什么 | 不该做什么 |
|---|---|
只读账号 + 强制 LIMIT | 用应用主账号连库 |
大表先 EXPLAIN 看扫描行数 | 直接对百万行表做模糊查询 |
| 结果默认脱敏 | 把明细导出成文件到处传 |
| 写操作走人工工单 | 让模型直接改生产数据 |
浏览器自动化:抓页面、填表、截图
| 场景 | 该做什么 | 不该做什么 |
|---|---|---|
| 抓正文 | 给定 URL 与要提取的字段,要求返回结构化 JSON | 让它自己猜网站、乱翻无关页面 |
| 填表 | 先在测试环境跑,填完截图给你确认再提交 | 在生产站点自动点「提交/支付/删除」 |
| 登录态 | 用测试账号,或提前人工登录好 | 把账号密码写进提示词 |
用浏览器 MCP 打开 https://example.com/orders,做三件事:
1) 只读模式:把表格里「订单号、下单时间、金额、状态」四列抓成 JSON 数组,
最多 50 行,有分页只抓第一页;
2) 需要点击进入详情页前先停下,把你要点的元素和预期结果告诉我,等我确认;
3) 截一张整页截图,保存到 D:\data\shots\orders.png。
不要点击任何「删除、取消订单、支付」按钮,不要输入真实账号密码;
遇到登录页就停下来告诉我,由我手动登录。
搜索与网页抓取
帮我调研「本地缓存与分布式缓存的一致性方案」这个主题:
1) 先用搜索工具找 5 篇来源,优先官方文档与工程博客,避开内容农场;
2) 每篇记录:标题、来源域名、发布时间、核心观点一句话;
3) 汇总成对比表:方案 | 适用场景 | 一致性代价 | 你判断的可信度(高/中/低);
4) 只引用你真正读到的内容,读不到就写「未能获取」,不要凭印象补全;
5) 最后给三条可以直接落地的建议,并标出每条的依据来自哪一篇。
| 该做什么 | 不该做什么 |
|---|---|
| 要求带上来源域名与发布时间 | 接受一段没有出处的总结 |
| 明确说「读不到就写读不到」 | 允许它用记忆补全技术细节 |
常见坑
| 坑 | 后果 | 规避 |
|---|---|---|
| 一次性开启全部工具 | 权限面过大 | 按任务开,用完就关 |
| 把「不要删文件」当唯一防线 | 模型仍可能误调用 | 服务端做路径白名单与只读挂载 |
| 让模型直接改生产库 | 数据可能无法恢复 | 只给只读账号,写操作走工单 |
| 把抓来的网页正文当指令执行 | 提示注入 | 抓取结果只当数据,不当命令 |
小结:MCP 的价值在「能动手」,风险也在「能动手」;文件操作先出方案表再执行、数据库只给只读账号并强制 LIMIT、浏览器先只读抓取并截图留证、搜索要求标注来源与时间,四条合起来就是「先小后大、先只读后写入」。