Tools and MCP
@anionex/dsh-vision-toolkit
Integrates image Q&A, OCR, grounding, cropping, tracing, pixel comparison, HTML screenshots, and a task Skill into DSH Web and Headless. Configure a vision provider; first use may set up Python.
Tools and MCP
By aaronlei · community
Adds configurable web search to DSH across Chat Completions, Responses, Anthropic Messages, and standalone APIs, normalizing results into cited sources. Vendor and protocol coverage varies; some combinations are degraded or unverified.
DeepSeek Harness plugin in Tools and MCP
Review the source and trust level before running this DSH plugin command.
dsh plugin --profile web add dsh-web-search-diyAlternative installation methods
English · 简体中文
<p align="center"> <a href="https://www.npmjs.com/package/dsh-web-search-diy"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-web-search-diy?style=flat-square&label=npm&color=cb3837"></a> <a href="LICENSE"><img alt="license: MIT" src="https://img.shields.io/npm/l/dsh-web-search-diy?style=flat-square&color=blue"></a> <a href="package.json"><img alt="node >= 18" src="https://img.shields.io/badge/node-%3E%3D18-339933?style=flat-square&logo=nodedotjs&logoColor=white"></a> <a href="#capability-matrix"><img alt="vendors: 7" src="https://img.shields.io/badge/vendors-7-8A2BE2?style=flat-square"></a> <a href="#capability-matrix"><img alt="protocols: 4" src="https://img.shields.io/badge/protocols-4-8A2BE2?style=flat-square"></a> <a href="https://github.com/deepseek-ai/deepseek-harness"><img alt="dsh plugin" src="https://img.shields.io/badge/dsh-plugin-4D6BFE?style=flat-square"></a> </p>A web search provider plugin for the DeepSeek Harness (DSH). It supplies the built-in
web_searchtool per vendor × protocol: three in-protocol shapes (Chat Completions / Responses / Anthropic Messages) plus standalone search, covering DeepSeek, Kimi, Zhipu, Qwen, OpenAI, Anthropic, OpenRouter, and four custom targets. Results are normalized into structured citation sources for the calling model to ground its answer on. The plugin also ships an observability page that records every search and can backfill history from older session logs.
vendor/protocol; v1/v2 files migrate on read and the old file is backed up as .v2.bak before the first save.reasoning.effort / output_config / thinking is dropped one at a time and retried.source.summary (capped at 2,000 characters) and skips it when the original body equals snippet; snippets are capped the same way. The model reads the summary before falling back to the snippet.web_search is no longer offered to the model instead of failing after invocation.node:sqlite with WAL, 0600 permissions, transactional writes and a 50,000-row retention cap. Importing scans $DSH_HOME/sessions for older web_search calls and is idempotent; JSONL/CSV export and a typed-DELETE clear are available.requestTimeoutMs defaults to 25 s (60 s for test connections), and caller cancellation stays distinct from a timeout.Legend: ✅ full (in-protocol search + citable sources); ◐ degraded (searches, but sources or model are limited); ✗ unsupported; ⚙ custom.
| Vendor | Chat Completions | Responses | Anthropic Messages | Standalone search |
|---|---|---|---|---|
| DeepSeek | ✗ | ◐ deepseek-v4-pro only; sources from open_page |
✅ | ✅ /v1/tools/search |
| Kimi | ✗ built-in $web_search retired |
✅ web_search + include |
✗ no server tool in the schema | ✅ /v1/tools/search |
| Zhipu | ✅ web_search tool |
✅ web_search + results[] |
✗ accepts but does not run it | ✅ /paas/v4/web_search |
| Qwen | ◐ enable_search, no sources |
✅ action.sources (url only) |
✅ needs the billing header | ✗ no standalone REST |
| OpenAI | ◐ gpt-5-search-api only |
✅ full filters / include |
✗ no such endpoint | ✗ |
| Anthropic | ✗ | ✗ | ✅ native web_search |
✗ |
| OpenRouter | ✅ openrouter:web_search |
✅ same server tool | ◐ alias, untested | ✗ |
| Custom | ⚙ template + 4 variants | ⚙ template + toolType |
⚙ template + toolType |
⚙ template + 8 mapping fields |
13 full, 4 degraded (OpenRouter Anthropic is pending), 4 custom. Eight
unsupportedentries exist only for the collapsed section and never create a configuration bucket.
Published on npm:
dsh plugin --profile web add dsh-web-search-diy
The bundle patch performs the wiring, so no manual cordis.patch.yml edits are required:
web-search-diy loader entry;web row's searchProvider to diy-search and restates fetchProvider: http (a patch replaces the whole row config);web-search-deepseek provider.For local development, install the checkout as a link:
dsh plugin --profile web add link:./dsh-web-search-diy
The plugin declares the
@deepseek-ai/*hooks aspeerDependencies. Runpnpm installonce in the plugin directory before linking; the harness provides the peers at runtime.
Location: Plugins → Installed plugins → the dsh-web-search-diy card (clicking the card opens this plugin's configuration page). Copy follows Settings → Language (zh, en, ja, es, fr, de, ru, pt).
In-protocol search or Standalone search. Standalone has no model turn, so model and output-budget fields are hidden.search.DEEPSEEK_SEARCH_BASE_URL overrides the endpoint; an explicitly saved Endpoint wins over it.$DSH_HOME/dsh-web-search-diy.json, written by the configuration page:
{
"version": 3,
"vendor": "qwen",
"protocol": "responses",
"targets": {
"qwen/responses": {
"baseURL": "https://maas.qianwenaiapi.com/compatible-mode/v1",
"apiKeyEnv": "QWEN_TOKEN_PLAN_API_KEY",
"model": "qwen3.8-flash",
"maxOutputTokens": 4096,
"toolType": "web_search",
"includeSources": true
},
"custom/search": {
"baseURL": "https://search-gateway.example.com",
"path": "/v1/tools/search",
"apiKeyEnv": "SEARCH_GATEWAY_API_KEY",
"queryField": "q",
"countField": "size",
"resultsPath": "data.items",
"urlField": "link",
"titleField": "name",
"snippetField": "desc",
"count": 10
}
}
}
vendor and protocol; each target bucket stores only the keys declared in its fields.template is a fill action, not configuration; submitting it is rejected.v2 mode |
v3 target |
|---|---|
responses |
qwen/responses |
anthropic-messages |
deepseek/anthropic-messages |
zhipu-web-search |
zhipu/search |
zhipu-chat-search |
zhipu/chat-completions |
dsh-web-search-diy.json.v2.bak (once, for rollback).responsesToolType → toolType, responsesIncludeSources → includeSources, responsesReasoningEffort → reasoningEffort, anthropicThinking → thinking, anthropicEffort → effort; apiVersion is dropped (fixed at 2023-06-01).| Protocol / vendor | Fields |
|---|---|
| Common | baseURL, apiKeyEnv, model, maxOutputTokens (the last two are hidden for standalone) |
| Responses · OpenAI | toolType, includeSources, reasoningEffort, searchContextSize, allowedDomains, blockedDomains, userLocation, externalWebAccess, returnTokenBudget, searchContentTypes, imageMaxResults, imageCaption |
| Responses · Kimi | toolType, includeSources, allowedDomains (blockedDomains / search_context_size return 400) |
| Responses · Zhipu / Qwen | toolType, includeSources, reasoningEffort |
| Responses · DeepSeek | toolType; the model is locked to deepseek-v4-pro and include is not sent |
| Responses · OpenRouter | toolType, includeSources, engine, mode, maxResults, maxUses, maxTotalResults, searchContextSize, maxCharacters, userLocation, allowedDomains, excludedDomains, xSearch |
| Anthropic Messages | toolType, maxUses, thinking, effort, allowedDomains, blockedDomains, userLocation, responseInclusion |
| Chat · Zhipu | searchEngine, count, searchRecencyFilter, contentSize, searchDomainFilter, requireSearch, searchPrompt, reasoningEffort |
| Chat · Qwen | searchStrategy, forcedSearch, freshness, assignedSiteList, searchExtension, promptIntervene |
| Chat · OpenRouter | engine, mode, maxResults, maxUses, maxTotalResults, searchContextSize, maxCharacters, userLocation, allowedDomains, excludedDomains, xSearch |
| Chat · OpenAI | no search parameters; the model is locked to gpt-5-search-api |
| Standalone | count, includeContent, searchEngine / contentSize / searchRecencyFilter / searchDomainFilter (Zhipu), oriQuestion / localization (DeepSeek), timeoutSeconds (Kimi), digestEntries, digestSnippetChars; custom adds path and the 8 mapping fields |
oriQuestionsends the human prompt that triggered the search as DeepSeek'sori_question: whitespace collapsed, cut to 128 characters, read from the initiating Session and omitted out
README excerpt; see the original.
Data as of 2026-11-05
Tools and MCP
Integrates image Q&A, OCR, grounding, cropping, tracing, pixel comparison, HTML screenshots, and a task Skill into DSH Web and Headless. Configure a vision provider; first use may set up Python.
Tools and MCP
Connects local-shell-mcp shell, file, browser-automation, and remote-worker capabilities to DSH, including MCP tools and a per-session Live Workspace. Operations depend on upstream configuration.
Tools and MCP
Brings OpenBiliClaw recommendations, saved items, profiles, and dialogue into DSH Web and exposes agent tools; requires its running backend with Agent Bridge v2. Crawling stays in the main project.
Tools and MCP
Queries, searches, and recommends DSH plugins with published scoring and trend data; its rankings periodically sync GitHub topic repositories and depend on that collection coverage.
Tools and MCP
Parses local PDF, Office, Markdown, HTML, CSV, and text files, with offline OCR; reads only the session workspace or allowed roots, with a bundled OCR runtime for Windows x64.
Tools and MCP
Adds vision routing and image tools for text-only DSH agents, including OCR, grounding, cropping, and pixel comparison; the default cloud chain sends images remotely unless Local-only vision is enabled.