capability-bridge
Adds vision capabilities to text-only coding models via MCP, enabling image analysis, OCR, and visual reasoning without switching the main model.
README
capability-bridge
Love your coding model, but it can't see? Give it eyes.
Keep DeepSeek — or any coding model — as your coding brain. capability-bridge adds vision through MCP, without switching your main model.
A transport-agnostic model capability bridge. MCP is the first transport; Vision is the first capability.
Features
- Give a text-only coding model vision —
vision_analyze(image, prompt)andvision_ocr(image)hand an image to a vision model and return text to your main model, without switching it. - Pluggable providers — one
OpenAICompatProviderspeaks OpenAI-compatible multimodal endpoints that acceptimage_urlcontent parts (Qwen, GLM, MiniMax-M3, ...); a nativeGeminiProvidercovers Google's protocol. Ordered fallback with retry and timeout. - Intent-driven visual reasoning — the
promptis a task-scoped Visual Brief. UI critique, aesthetic review, error-screenshot reading, and art interpretation are all the same primitive, not just captioning. - One-shot installer —
capability-bridge setupmerges into.mcp.jsonwithout clobbering other servers, reports missing API keys by name, and--testverifies the first provider live. - Transport-agnostic Core — stateless, no Context Manager; the host owns context and distills a brief. Architecture red lines are enforced by tests.
Quickstart (30 seconds)
From a cloned repository. (Once published to PyPI, this becomes
uv tool install capability-bridge.)
# 1. install the CLI once
uv tool install .
# 2a. Claude Code: one-shot setup (config + key check + MCP wiring + trigger) + live self-test
capability-bridge setup --target claude-code --test
# 2b. Codex: prints the ~/.codex/config.toml snippet and the `codex mcp add` alternative
capability-bridge setup --target codex --test
# 3. send a screenshot and ask "what's wrong here?"
setup merges only the capability-bridge entry into .mcp.json — it never overwrites other
servers (Claude Code target; the Codex target prints a config.toml snippet instead). Missing API
keys are reported by name; --test makes one real call to verify the first provider.
Running from the source repo during development? Start the server with uv run capability-bridge
instead of the installed CLI.
Examples
vision_analyze is visual reasoning, not just image description — the prompt is a task-scoped
Visual Brief. One primitive, three levels of use. All results below are real qwen3.6-flash output.
1. Basic — image understanding

image: docs/sample/sample.png
prompt: What does this mini dashboard show? Answer in one short sentence.
{
"content": "This mini dashboard presents a sales overview comparing performance across January, February, and March with a grand total of 3,200.",
"structured_data": null,
"provider": "qwen",
"model": "qwen3.6-flash",
"latency_ms": 3845,
"warnings": []
}
2. Visual reasoning — UI design critique
Give it a design brief and it becomes a design specialist, not a camera:

image: docs/sample/sample-ui.png
prompt: Analyze this dashboard UI as a senior product designer. This SaaS admin is being visually
redesigned to look modern, restrained, and professional, reducing the cheap template feel.
Another coding agent will implement your recommendations. Evaluate: information hierarchy,
density, whitespace/rhythm, color system, typography, card design, radius/shadows,
navigation-vs-content, what makes it look templated, and which changes give the most visual
improvement for the least effort. Do not just describe. Do not write code.
Output: 1) overall judgment 2) the 5 most important problems 3) a concrete improvement
direction per problem 4) implementation priority.
Real result (abridged):
The dashboard is currently shouting; a premium dashboard should whisper. It relies on color-based contrast (bright blocks) instead of structural contrast (space, size, weight).
Problems: aggressive rainbow KPI cards (the "chart library" trap) · insufficient whitespace & rhythm · visual noise in the charts · weak table hierarchy (2005-Excel borders) · inconsistent card styling + a jarring promo banner in the nav.
Priorities: strip the KPI card backgrounds → remove the sidebar promo banner → turn status pills into dot+text → open up spacing.
3. Aesthetic analysis — artwork interpretation

image: docs/sample/sample-art.png
prompt: Appreciate this artwork as a senior art critic and curator. Analyze: composition and visual
focus, light and shadow, color relationships and palette, brushwork/texture/material, space
and depth, style and genre, emotion and atmosphere, aesthetic character and artistic value.
Be specific and insightful.
Real result (abridged):
A self-referential tableau of digital whimsy and narrative recursion. Strict central composition; the open book — not the creature's face — is the true focal point. Warm golden-hour light, no harsh chiaroscuro. Monochromatic buttery-yellow harmony, broken only by the lime-green eyes. Shallow depth of field isolates a private moment of study. Pop Surrealism × digital character art; the book title "How many tears must a calm dragon shed?" turns the image into a dialogue about identity and emotion.
How it works
vision_analyze(image, prompt?) and vision_ocr(image) hand your image to a vision model
(Qwen, GLM, MiniMax-M3, Gemini, ...) and return the text to your main model. Providers are
tried in the order in config.yaml; if one times out, is rate-limited, or is unavailable, the
next one is tried automatically.
Configuration
config.yaml holds three objective sections: providers (endpoint type + api key env var),
models (provider/model/capabilities), and routing (ordered fallback list per capability).
Only objective facts live here — no subjective model scoring. A broken config (unknown model,
missing key) fails fast at startup with the exact field named.
Default model
The shipped config defaults to qwen3.6-flash (DashScope). qwen3-vl-flash is now a legacy
model family — its legacy snapshots are scheduled for deprecation, and Alibaba recommends
qwen3.6-flash as the official recommended replacement for the relevant Qwen3-VL Flash models
(same OpenAI-compatible interface, just change the model id). qwen3.6-flash is a hybrid-thinking
model with thinking enabled by default, which adds latency — the default timeout is 120s (complex
UI runs take ~40s).
To use a different model, change the model: line of the vision model entry in config.yaml
(e.g. qwen3.7-plus, MiniMax/MiniMax-M3, glm-4.6v) — a documented optional profile.
Note: the F1–F4 benchmark (
docs/benchmarks/2026-08-13-qwen-vision-ab.md) was run on the now-legacyqwen3-vl-flash.qwen3.6-flashis the official recommended replacement and should be re-validated for the same workloads (its complex-UI output was spot-checked on 2026-08-14 and is on par).
Tested providers
OpenAICompatProvider speaks any endpoint that accepts OpenAI-style multimodal
/chat/completions with image_url content parts.
Live tested (v0.1): Qwen (DashScope), GLM (Zhipu native, glm-4.6v), MiniMax-M3 (hosted
on DashScope — needs the model activated in the Bailian console).
Implemented, automated-tested only: Gemini native (GeminiProvider) — its contract is covered
by tests but it is not in the v0.1 live-provider acceptance matrix.
Compatibility with an OpenAI-compatible endpoint depends on that endpoint actually supporting
multimodal image_url inputs (e.g. MiniMax's own API is OpenAI-compatible for text but not for
vision).
Architecture
Agent (Claude Code / Codex)
│ MCP stdio
▼
Transport: MCP <- only place that imports mcp
▼
Capability Core <- transport-agnostic, stateless
Capabilities -> Routing -> Providers(interface) <- adapters
Concrete provider adapters live outside core/ and implement the ModelProvider interface.
The composition root (bootstrap.py) wires config → providers → routing → capability.
Development
uv run pytest
tests/test_architecture.py enforces the red lines (core never imports MCP / clients / concrete providers).
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.