给纯文本模型装上眼睛:GLM-4.6V-Flash MCP + Skill 实践
注意!!!本文档是告诉你原理,实际操作中,你完全可以把你的需求告诉codex,让他帮你去写MCP、Skill,你直接要在https://bigmodel.cn/apikey/platform申请免费的API KEY然后告诉codex就行。文章结尾查看提示词。
起因:DeepSeek 很好,但看不见图片
我平时用 Codex + DeepSeek 写代码。DeepSeek 的文本和代码能力很强,但它是一个纯文本模型:官方 API 不支持直接输入图片。
这带来一个很现实的问题:
- 截图里的报错信息,我看不到
- UI 设计稿、流程图、架构图,我看不到
- 照片、扫描件、表格,我看不到
- 想 OCR 提取文字,也做不到
于是我在 Codex 里遇到了一个典型场景:我把一张 m.png 发给它,它只能看到文件路径,无法理解图片内容。
需求很明确:让纯文本模型也能“看图”。
为什么选择 MCP
要让 DeepSeek 具备视觉能力,并不需要换模型,也不需要训练。更实用的做法是加一层“视觉转译层”:
图片
↓
视觉模型(GLM-4.6V-Flash)
↓
文字描述
↓
DeepSeek 继续理解和推理MCP(Model Context Protocol)正好适合做这件事。它允许外部程序以“工具”的形式接入 Codex:
analyze_image:分析图片内容ocr_image:从图片中提取文字
DeepSeek 不需要原生支持视觉,它只需要调用 MCP 工具,然后拿到工具返回的文本结果。
flowchart LR
A[DeepSeek 主模型] -->|调用 MCP 工具| B[glm-vision MCP Server]
B -->|图片| C[GLM-4.6V-Flash]
C -->|文字描述| B
B -->|工具结果| A封装 MCP:你需要做什么
第一步:准备 API Key
我这里选择智谱开放平台的 glm-4.6v-flash,它是免费的视觉模型。
即使免费,也需要:
- 注册智谱开放平台
- 创建 API Key
- 得到类似
{API Key ID}.{secret}格式的 Key
我一开始拿到的 Key 复制得不完整,导致所有请求都返回 401。后来重新复制正确格式的 Key,认证立刻通过了。
所以这里有一个容易被忽略的点:Key 看起来再像,也要确保完整、无空格、来自正确的平台。
第二步:编写 MCP Server
核心代码很简单,本质上是一个本地 Python 服务:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("glm-vision")
@mcp.tool()
def analyze_image(image: str, prompt: str = "请描述这张图片") -> str:
# 将本地图片转为 base64 data URL
# 调用智谱 GLM-4.6V-Flash
# 返回文字结果
return result
@mcp.tool()
def ocr_image(image: str, language: str = "zh") -> str:
# 提取图片中的文字
return result关键实现细节:
- 本地图片转成 base64 data URL
- 远程 URL 直接传给 GLM
- 智谱 v4 接口使用 JWT 鉴权,不是简单地把 Key 放进 Bearer
- 支持国内
open.bigmodel.cn和国际api.z.ai两套端点 - 免费模型容易 429,内置自动重试
第三步:注册到 Codex
全局配置写在 ~/.codex/config.toml:
[mcp_servers.glm-vision]
command = "python"
args = ["C:/Users/90779/.codex/mcp/glm-vision-mcp/server.py"]重启 Codex 后,MCP 工具就可以被模型调用了。
有了 MCP,为什么还需要 Skill?
MCP 只是提供了“能力”,但没有解决“什么时候用”的问题。
实测发现,如果只配置 MCP,我每次都要明确说:
用 analyze_image 分析这张图片
这很反人类。
我想要的是:
帮我看一下这张图
图里报了什么错?
把截图里的文字提取出来
然后模型自动决定调用哪个工具。
这正是 Skill 要解决的问题。
MCP 和 Skill 的分工
MCP:提供工具能力
Skill:告诉模型什么时候用、怎么用、用哪个用一句话概括:
MCP 是“手”,Skill 是“操作手册”和“自动触发开关”。
我封装了一个 glm-vision-assist Skill:
- 用户提到图片、截图、UI、图表、照片 → 自动触发
- 需要描述/问答 → 自动调用
analyze_image - 需要 OCR/提取文字 → 自动调用
ocr_image - 中文路径乱码 → 自动复制到 ASCII 路径再处理
- 免费模型 429 限流 → 等待重试并提示用户
最终效果
现在我可以直接说:
帮我分析一下 D:/桌面/tmp/m.png或者:
这张截图里的报错是什么意思?模型会经历完整链路:
自然语言
↓
Skill 自动触发
↓
调用 MCP analyze_image / ocr_image
↓
GLM-4.6V-Flash 识别图片
↓
文字结果交给 DeepSeek
↓
输出最终回答经验总结
1. 纯文本模型 + 视觉转译层是可行的
不需要换模型,不需要训练,只需要在模型外面加一层“视觉代理”。
2. MCP 负责能力,Skill 负责体验
MCP 是基础能力,Skill 是让它真正好用的关键。没有 Skill,用户永远要手动指定工具。
3. 免费模型要接受限流
glm-4.6v-flash 免费,但访问量大时会返回 429。对个人使用够用,对生产环境建议换付费模型:
glm-4.6v-flashx
glm-4.6v4. API Key 安全
Key 应保存在 .env 或环境变量中,不要写进代码,不要提交到 Git。
5. 改配置后记得重启
MCP 和 Skill 都是全局配置,修改后需要重启 Codex 或新开会话才能生效。
结语
这次实践让我对 MCP 和 Skill 的分工有了更清晰的认知:
- MCP 解决“能不能做”
- Skill 解决“要不要自动做、怎么做”
两者结合,才是一个真正好用的 AI 工作流。
提示词
1、目前我的大模型deepseek不支持多模态(读图片的能力),请帮我用glm-4.6v-flash全局封装一个MCP,这是我的API Key:xxx(填写你在https://bigmodel.cn/apikey/platform申请的key)
2、我每次都需要说明使用MCP去读取太麻烦了,帮我封装一个skill,我直接用skill或者能通过我对话的语义自动去调用MCP