opencode-eyes
Manifest validDeepSeek Harness plugin and OpenCode MCP server: describe an image with StepFun step-3.7-flash, so a text-only model can see. Exposes mcp__opencode_eyes__describe_image.
opencode-eyes
Eyes for models that cannot see. The image goes to StepFun's
step-3.7-flash vision model; the description comes back as tool output.
给不具备多模态能力的模型一双眼睛:把图片交给 StepFun 多模态模型,拿回文字描述。
As a DeepSeek Harness plugin: the MCP server ships inside the bundle, so
installing one plugin is the whole setup — no mcpServers file to hand-edit.
Install
DeepSeek Harness Desktop — open Plugins in the sidebar, choose Add plugin, and enter:
https://github.com/bauerelizabeth07139/opencode-eyes
Then switch the new dsh-opencode-eyes bundle on. The Desktop app boots the
reserved desktop profile, so that is where it has to be enabled.
dsh CLI — install it into the profile you actually boot:
dsh plugin --profile web add bauerelizabeth07139/opencode-eyes
No git on the machine? pnpm resolves a git shorthand with git ls-remote,
which fails with 'git' is not recognized when git is missing. Use the tarball
instead — that path is plain HTTPS:
dsh plugin --profile web add https://codeload.github.com/bauerelizabeth07139/opencode-eyes/tar.gz/main
The same address works in the Desktop Add plugin dialog. Replace main
with a commit SHA to pin an exact revision (/tar.gz/<sha>).
Uninstall with dsh plugin --profile web remove dsh-opencode-eyes.
Requirements
- Python ≥ 3.8 on
PATH, or pointed at withpython. - Pillow in that interpreter — the server's only third-party import
(
pip install Pillow). - A StepFun API key in
STEP_API_KEY(orconfig.apiKey). Without one the server still starts anddescribe_imagereturns a clear error.
Tools
The server registers 1 tool(s). DSH namespaces them automatically,
so the model calls them as mcp__opencode_eyes__<tool>:
| Tool | What it does |
|---|---|
describe_image | Reads an image file, base64-encodes it as JPEG (optionally downscaled) and asks the vision model to describe it. Parameters: image_path (required), prompt (optional). |
Configuration
| Key | Environment variable | Default | Meaning |
|---|---|---|---|
python | — | discovered | interpreter that runs the server |
apiKey | STEP_API_KEY | (empty) | StepFun credential; required by describe_image |
model | STEP_MODEL | step-3.7-flash | model id sent in the request |
timeoutSeconds | STEP_TIMEOUT | 120 | the server's own HTTP timeout |
maxDimension | STEP_MAX_DIMENSION | 2048 | images are downscaled to this edge length |
jpegQuality | STEP_JPEG_QUALITY | 85 | JPEG quality of the re-encoded image |
toolCallTimeoutMs | — | 300000 | DSH's per-call budget; keep it above timeoutSeconds |
env | — | {} | raw environment passthrough for anything else |
Every field is optional and lives in the loader row. For example, in
cordis.patch.yml:
- id: dsh-opencode-eyes
name: 'dsh-opencode-eyes'
config:
apiKey: 'sk-...'
toolCallTimeoutMs: 300000
Notes
- The API base URL is compiled into the server (
https://api.stepfun.com/step_plan/v1/chat/completions); there is nobaseUrloption to point it elsewhere. This plugin exposes only what the server actually reads. src/layout. The package is asrc/-layout Python module, so the server must run with the repository'ssrcdirectory as its working directory. The plugin does that for you.- Timeouts. The server waits up to
STEP_TIMEOUT(120 s) for StepFun, which is longer than the harness's 60 s default, so the plugin mounts with a 300 s per-call budget.
How it is mounted
index.js resolves a Python interpreter (the configured python, then
python3/python on PATH), hands the server its argv and working directory,
and mounts it as a stdio MCP server through @deepseek-ai/dsh-mcp-client with
failOnStartupError: true, so a server that cannot start is a visible error
rather than a silently missing tool.
Credentials are forwarded explicitly. The harness scrubs credential-shaped
variables (KEY, TOKEN, SECRET, PASSWORD) out of the environment a child
process inherits, so config.apiKey — falling back to the variable the server
documents — is written into the child's environment by the plugin itself. That
means both of these work:
config:
apiKey: '<your key>'
export STEP_API_KEY='<your key>' # picked up at load time
Development
No build step and no runtime dependencies — @deepseek-ai/cordis and
@deepseek-ai/dsh-mcp-client are peers supplied by the Harness.
npm test # node >= 22: manifest checks + the stdio mount, both Harness-free
The mount test loads index.js with @deepseek-ai/dsh-mcp-client stubbed and
asserts the exact stdio configuration the plugin produces, including the
credential forwarding above.
Repository layout
| Path | Purpose |
|---|---|
index.js | the DSH plugin: resolves the interpreter and mounts the server |
cordis.patch.yml | the loader row that activates the plugin |
locale/{en,zh}.json | card title and description for the plugin lists |
assets/icon.svg | card artwork |
test/ | npm test: manifest composition and the mount contract |
src/opencode_eyes/ | the MCP server, unchanged |
pyproject.toml, requirements.txt | the Python package metadata, unchanged |
Other hosts (unchanged)
The server is a plain stdio MCP server and still works anywhere else. The
repository's original README is kept verbatim as
README.opencode.md, and the launch stanza from it keeps
working:
{
"mcp": {
"opencode-eyes": {
"type": "local",
"command": ["python", "-m", "opencode_eyes"],
"enabled": true,
"timeout": 120000,
"environment": { "STEP_API_KEY": "你的StepFun API Key" }
}
}
}
On another host, run the server from the repository's src directory (or put
src on PYTHONPATH) — that is the one thing the plugin adds.
License
MIT — the repository declared MIT in pyproject.toml but shipped no licence file; this plugin's release adds one.
Comments
Loading…
Similar plugins
by liustack
The first vision plugin for DeepSeek Harness, and the vision bridge for every text-only coding agent. Paste an image, get structured JSON evidence (OCR, layout, semantics). | 全网最强 DeepSeek Harness 外挂视
★ 4.1k
↓ 24.2k/wk
MIT
TypeScript
Oct 4, 2026
dsh plugin --profile web add @liustack/modlensby Zh-U-hB
DeepSeek Harness plugin: route image-bearing messages to a user-configured OpenAI-compatible vision endpoint when the active text model cannot see images
★ 0
MIT
TypeScript
Aug 16, 2026
dsh plugin --profile web add @deepseek-ai/dsh-vision-bridgeby Sorwcyra
Paste images into DeepSeek Harness with a four-model vision race, OCR, and an automatic text bridge.
★ 4
MIT
JavaScript
Aug 14, 2026
dsh plugin --profile web add ds-vision-pluginby Harvey-Will
DeepSeek Harness vision plugin: 8 analysis modes (describe, OCR, chart data, UI review, object detection, compare, code-gen, debug), any OpenAI- or Anthropic-compatible vision API, with a built-in fre
★ 1
MIT
TypeScript
Sep 30, 2026
dsh plugin --profile web add dsh-vision-analysisby poiuyjie
DSH plugin: Auto-convert images to text for pure-text LLMs (DeepSeek etc.) via any vision model. No need to switch your main model.
★ 13
MIT
JavaScript
Sep 9, 2026
dsh plugin --profile web add dsh-vision-opencodeVision bridge for text-only DeepSeek: send images (alone or mixed with text) and a fast tiny vision model describes them behind the scenes — the chat keeps the picture, DeepSeek sees only text. Pure p
★ 0
dsh plugin --profile web add dseyesopen