Skip to main content

claude-vision-mcp

基于 Claude API 的视觉识别 MCP server:为不支持视觉识别的主模型多一双眼睛。

PyPI

这是什么

一个 stdio MCP server,暴露 describe_image 工具。主代理(如 Claude Code)调用它传入本地图片路径,工具内部用 http 直调视觉网关的 /v1/messages,把图片放在 user message 顶层 image content block(绕开网关只解析顶层 image、不解析 tool_result 内嵌 image 的兼容缺陷),视觉模型返回的文字作为 tool_result 返回给主代理。

为什么需要它:Claude Code 的 Read 工具读图时,会把图片塞进 tool_result.content 内嵌的 image block。但部分网关(如本环境的 xopkimik26)只解析 user message 顶层 image、不解析 tool_result 内嵌 image——结果主模型「看不到图」。本工具把识图挪到一个独立的 MCP server 里,对主代理消息流可见的永远是纯文字 tool_result,图片在工具内部的 http 调用中消化,从源头绕开缺陷。

详细背景见 cnpc/claude #48

安装

方式一:uvx(推荐,Claude Code 集成)

无需 clone,直接在 Claude Code 配置里挂载:

// ~/.claude.json 或项目 .claude.json
{
  "mcpServers": {
    "claude-vision-mcp": {
      "command": "uvx",
      "args": ["claude-vision-mcp"],
      "env": {
        "ANTHROPIC_BASE_URL": "${ANTHROPIC_BASE_URL}",
        "ANTHROPIC_AUTH_TOKEN": "${ANTHROPIC_AUTH_TOKEN}",
        "VISION_MODEL": "${VISION_MODEL}"
      },
      "timeout": 120000
    }
  }
}

uvx 会自动从 PyPI 拉起最新版本,隔离虚拟环境,不污染系统 Python。

方式二:本地开发

git clone https://cnb.cool/cnpc/mcp/claude-vision-mcp.git
cd claude-vision-mcp
uv sync --extra dev           # 装依赖 + dev 依赖
uv run pytest                 # 跑测试
uv run python -m claude_vision_mcp.server   # 直接启动 stdio server

环境变量

网关配置(必填)

变量 必填 说明
ANTHROPIC_BASE_URL 视觉网关基地址(如 https://api.cnb.cool/...),不带尾部斜杠
ANTHROPIC_AUTH_TOKEN 网关认证令牌,同时用作 x-api-keyAuthorization: Bearer
VISION_MODEL 支持视觉的多模态模型 ID(如 xopkimik26),由调用方注入不写死

超时/重试配置(选填,未设时用默认值)

网关调用默认走流式(SSE),对瞬态错误(超时、连接失败、429 限流、5xx、524)做有限重试,指数退避。以下变量可覆盖默认值,在 .claude.jsonenv 字段透传:

变量 默认值 说明
VISION_CONNECT_TIMEOUT 10 TCP 连接建立超时(秒)
VISION_READ_TIMEOUT 60 等待响应超时(秒,视觉模型较慢需留足)
VISION_WRITE_TIMEOUT 10 发送请求体超时(秒)
VISION_POOL_TIMEOUT 10 从连接池获取连接超时(秒)
VISION_MAX_RETRIES 2 最大重试次数(不含首次请求,0 = 不重试)
VISION_RETRY_BASE_DELAY 1 退避基础延迟(秒,第 n 次重试前等待 base * 2^n)

所有变量均从环境读取,非法值(非数字、负数)回退默认值不抛错。

客户端 timeout 配置注意点(重要)

调用方在 .claude.json 的 MCP server 条目里配置的 timeout 字段,是每次工具调用的硬墙钟上限(单位毫秒,超时即中止调用)。视觉识别走流式后,推理重的模型(如 kimi 系)单次调用可能超过 2 分钟。若配置了过小的 timeout(如 120000),长耗时调用会被客户端中止、结果全丢

建议:

  • 不配置 timeout 字段(推荐):回退到 MCP_TOOL_TIMEOUT 默认约 28 小时,实际不限;超过 2 分钟的调用会自动转后台任务,结果不丢。
  • 调大到覆盖模型最坏生成时间(如 600000)。
{
  "mcpServers": {
    "claude-vision-mcp": {
      "command": "uvx",
      "args": ["claude-vision-mcp"],
      "env": {
        "ANTHROPIC_BASE_URL": "${ANTHROPIC_BASE_URL}",
        "ANTHROPIC_AUTH_TOKEN": "${ANTHROPIC_AUTH_TOKEN}",
        "VISION_MODEL": "${VISION_MODEL}"
      }
      // 不要配过小的 "timeout": 120000 —— 视觉调用可能超过 2 分钟
    }
  }
}

流式行为说明

  • 默认流式:请求体带 stream: true,网关边生成边返回,规避推理重模型非流式生成期的网关读超时(HTTP 524)。
  • 兼容回退:网关若忽略 stream 仍回标准 JSON,按非流式结果解析,行为不变。
  • 降级兜底:个别不支持流式的模型返回 4xx 时,自动降级为非流式重试一次,保证仍可用(此类模型天生慢,可能因网关读超时失败)。
  • 524 重试:524(网关读超时)已纳入重试白名单,偶发的 524 会被 VISION_MAX_RETRIES 重试吸收。

工具

describe_image

识别本地图片并返回文字描述。

参数:

参数 类型 必填 说明
image_path string 本地图片文件路径(绝对或相对)
instruction string 视觉理解指令,覆盖默认通用描述提示词

返回: 纯文字描述(tool_result 只含 text block,绝不返回 image block)。

失败处理: 图片读取失败、网关配置缺失、网关调用失败均以文字诊断返回(不抛错),主代理据此向用户反馈或重试。

架构

src/claude_vision_mcp/
├── pure.py     # 纯函数:请求体构造/SSE 解析/响应提取/错误诊断/脱敏/media_type 推断(单测覆盖)
├── gateway.py  # http 调用:httpx 直调 /v1/messages,流式主路径 + JSON 兼容回退(不纳入单测)
├── server.py   # FastMCP stdio 入口:注册 describe_image 工具
└── __init__.py

纪律:

  • 纯函数优先:网关请求体构造、响应文字提取为纯函数,单测覆盖;http 调用本身不纳入单测。
  • 禁止硬编码端点/模型/密钥:全走环境变量。
  • 日志脱敏:server 内部 stderr 日志经 redact_sensitive 脱敏,无密钥/图片 base64 明文泄露。
  • MCP stdio 协议:日志走 stderr,stdout 仅供 JSON-RPC。

后续扩展

当前仅 describe_image。后续可在 server.py 增量注册 describe_video / describe_audio 等工具,共用 gateway.py 的网关调用层。包名 claude-vision-mcp 已为多模态预留命名空间。

开发

uv sync --extra dev
uv run pytest            # 测试(纯函数 + gateway 重试路径 + 流式解析,共 90 用例)
uv run ruff check .      # lint
uv run ruff format .     # 格式化
uv run mypy src tests    # 类型检查

发布

v* tag 触发 CI 自动发布到公网 PyPI。打 tag 前需更新版本号:

  1. pyproject.tomlversion = "0.x.y"(唯一需改的地方,__init__.py/server.py 运行时从包元数据自动读取)
  2. 提交后打 tag:git tag v0.x.y && git push origin v0.x.y

未更新版本号会导致 uv publish 报 409(版本已存在)。

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

claude_vision_mcp-0.1.3.tar.gz (28.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

claude_vision_mcp-0.1.3-py3-none-any.whl (22.5 kB view details)

Uploaded Python 3

File details

Details for the file claude_vision_mcp-0.1.3.tar.gz.

File metadata

  • Download URL: claude_vision_mcp-0.1.3.tar.gz
  • Upload date:
  • Size: 28.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.4 {"installer":{"name":"uv","version":"0.12.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for claude_vision_mcp-0.1.3.tar.gz
Algorithm Hash digest
SHA256 ce2dab851ae55f95d57277dc832817afe16481ad70ba2f9c362915da630a2928
MD5 812b8ab64fd80fdec00bb609c8961afd
BLAKE2b-256 43ee8364de26c5cfc5177f5b47bc39e7e04cee27de46c5707dac5c8c5ab76eea

See more details on using hashes here.

File details

Details for the file claude_vision_mcp-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: claude_vision_mcp-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 22.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.4 {"installer":{"name":"uv","version":"0.12.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for claude_vision_mcp-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0138c7e408a0dc287ab060995c41bda3df5a9ea0137444173a4246e9b1402955
MD5 f05d3b0c6fd4f728f00e1d27abfc8721
BLAKE2b-256 c3e31e15a867985377766d9eb8c92e036229c21e8bf22dfa9c801faba14f7e4e

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page