dstools
Enables web search using DuckDuckGo, returning ranked results with titles, URLs, and snippets.
Enables image analysis using local vision models served via Ollama.
Enables image analysis using OpenAI's multimodal models (e.g., GPT-4o) to convert images into structured text.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dstoolsresearch quantum computing breakthroughs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dstools — DeepSeek-V4 MCP Toolkit
Give DeepSeek-V4 models eyes and a research desk.
An MCP (Model Context Protocol) server that augments DeepSeek's text models with two capabilities they don't have natively:
Image content understanding — DeepSeek-V4 is a text-only model.
dstoolsadds a vision tool that turns any image into rich, structured text the V4 model can reason over (leveraging its 1M-token context and world-class reasoning).Deep Research — a multi-step, citation-backed research pipeline that uses V4 as the planning + synthesis brain over live web search and page extraction.
dstools is a productizable, installable Python package. It speaks MCP over stdio and
Streamable HTTP, so any MCP-capable host (Claude Code, Claude Desktop, Cherry Studio, a
custom agent, …) can connect a DeepSeek-V4 backend to it and immediately call these tools.
Why this exists
DeepSeek-V4 (deepseek-v4-flash / deepseek-v4-pro, released 2026-04-24) is an outstanding
text model with 1M context, strong agentic/tool-calling ability, and an automatic context
cache — but the official chat API is text-only (no multimodal vision). dstools closes
exactly that gap:
DeepSeek-V4 strength | What's missing | What |
1M context, top reasoning | Can't see images |
|
Agentic, tool-calling | No live web access |
|
Automatic prompt caching | — | Stable-prefix prompts to maximise cache hits |
Thinking mode ( | — | Used selectively for hard synthesis steps |
The toolkit is deeply adapted to V4: it defaults to deepseek-v4-pro for synthesis and
deepseek-v4-flash for cheap sub-steps, toggles V4's native thinking mode per call, structures
prompts for cache hits, and uses V4's JSON-output mode for structured extraction.
Related MCP server: vision-bridge-mcp
Tools exposed
Tool | Description | Needs a key? |
| Describe/understand an image (path, URL, or base64). Returns structured text. | Vision provider key (or local model) |
| Extract text from an image (OCR). | Optional |
| Run a web search, return ranked results (title, url, snippet). | No (DuckDuckGo, keyless) |
| Fetch a URL and return clean, readable Markdown. | No |
| Full pipeline: plan → search → fetch → select → synthesize, with citations. | DeepSeek API key |
Granular tools (web_search, fetch_page, analyze_image) let the host agent run its own
agentic loop; deep_research is a one-shot orchestrator for when you just want a cited report.
Quick start
# 1. Install (Python 3.10+)
uv sync # or: pip install -e .
# 2. Configure
cp .env.example .env # then edit: set DEEPSEEK_API_KEY and a vision provider
# 3. Run the MCP server (stdio — for local hosts like Claude Code/Desktop)
uv run dstools serve
# …or over Streamable HTTP (for remote hosts)
uv run dstools serve --transport http --port 8000Connect from Claude Code:
claude mcp add --transport stdio dstools -- uv run --directory /path/to/dstools dstools serveA ready-made examples/claude_desktop_config.json is included for Claude Desktop.
Docker
Run the server over Streamable HTTP in a container:
docker build -t dstools .
docker run --rm -p 8000:8000 \
-e DEEPSEEK_API_KEY=sk-... \
-e VISION_BASE_URL=... -e VISION_API_KEY=... -e VISION_MODEL=... \
dstools
# → http://localhost:8000/mcpConfiguration
All settings are environment variables (.env supported). Sensible defaults mean the
keyless parts (search + fetch) work out of the box.
Variable | Default | Purpose |
| — | DeepSeek API key (required for |
|
| OpenAI-compatible endpoint |
|
| Synthesis / heavy model |
|
| Cheap sub-step model |
|
|
|
|
|
|
| — | OpenAI-compatible vision endpoint (any multimodal model) |
| — | Key for the vision endpoint |
| — | e.g. |
|
|
|
| — | Required if |
| — | Required if |
|
| Retries with backoff when keyless DDG rate-limits |
|
| Sub-queries generated per round |
|
| Research rounds (rounds >1 trigger query refinement) |
|
| Pages fetched, reranked & synthesised |
|
| Per-step model override (empty = flash for light steps, pro for synth) |
|
| Logging verbosity |
deep_research pipeline (v0.2)
deep_research is a smart, multi-round pipeline (DeepSeek-V4 as the brain):
Plan (V4-flash, JSON) →
breadthsearch queries.Round loop (
depthrounds): search → fetch → refine — V4-flash reads findings-so-far and generates next-round queries for uncovered facets.Rerank — V4-flash extracts the passages most relevant to the question from each page (always-on; quality over raw stuffing).
Synthesize (V4-pro + thinking) → cited markdown report.
Per-step models are tunable; set all RESEARCH_*_MODEL to deepseek-v4-flash
for the cheapest runs. dstools doctor prints a per-research cost estimate.
Vision providers (for analyze_image)
Since DeepSeek-V4 can't see images, point VISION_* at any OpenAI-compatible multimodal model:
OpenAI:
VISION_BASE_URL=https://api.openai.com/v1,VISION_MODEL=gpt-4o/gpt-4o-miniAlibaba Qwen-VL (DashScope, OpenAI-compat):
VISION_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1,VISION_MODEL=qwen-vl-maxZhipu GLM-4V:
VISION_BASE_URL=https://open.bigmodel.cn/api/paas/v4,VISION_MODEL=glm-4vLocal (Ollama):
VISION_BASE_URL=http://localhost:11434/v1,VISION_MODEL=qwen2.5-vl(no key needed)
Without a vision provider, analyze_image degrades to image metadata + OCR (if pytesseract
is installed) and returns a clear note — it never crashes.
Development
uv sync --extra dev
make lint # ruff
make typecheck # mypy
make test # pytest
make serve # run the server (stdio)Project layout
src/dstools/
server.py # FastMCP server + tool registration
cli.py # `dstools` CLI (serve / inspect / doctor)
config.py # pydantic-settings config
llm/ # DeepSeek (OpenAI-compat) + vision clients, V4 thinking-aware
search/ # pluggable search providers (DuckDuckGo default, Tavily optional)
web/ # async page fetcher + HTML→Markdown extraction
tools/ # image / search / fetch / research tools
utils/ # image I/O & encoding, text chunking
tests/ # pytest suite (network & LLM mocked)
examples/ # claude_desktop_config.json, mcp client demoLicense
MIT.
Available Tools
5 toolsanalyze_imageA
Understand an image and return a detailed text description.
Use this when you need to "see" an image — DeepSeek-V4 cannot read images
directly. Accepts an image as a local file path, an HTTP(S) URL, a data URI,
or a base64 string. Optionally pass question to focus the analysis
(e.g. "What error is shown in this screenshot?", "Read the chart values.").
Returns structured text you can reason over. Requires a configured vision
provider (VISION_*); degrades to metadata + OCR without one.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | ||
| question | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses input flexibility, optional question, requirement for a vision provider, and fallback to metadata+OCR. Does not mention privacy, rate limits, or response structure specifics. Output schema exists so structural detail is not required, but the fallback behavior is well-explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences that front-load the core purpose. Every sentence adds distinct value: purpose, use case, input formats, optional parameter, return type, and fallback behavior. No extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero schema coverage, no annotations, and two parameters (one required), the description covers all essential aspects: input options, optional focus question, dependency on vision provider, fallback behavior. Siblings in context allow differentiation. It is complete for an AI to decide when to invoke.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no descriptions (0% coverage). The description adds critical semantics: image parameter accepts multiple formats (local path, URL, data URI, base64). Question parameter is explained with concrete examples (e.g., 'What error is shown?'). This fully compensates for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool understands an image and returns a detailed text description. It lists accepted formats (local path, URL, data URI, base64) and optional question parameter. This differentiates it from siblings like ocr_image (simple OCR) and web_search (text-based).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: when you need to 'see' an image because the model cannot read images directly. Gives examples for the question parameter. Lacks explicit exclusions or direct comparison to ocr_image, but context from sibling tools provides implicit discrimination.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deep_researchA
Run a multi-step deep-research investigation and return a cited report.
Pipeline: decompose query into search queries -> search the web -> fetch &
read pages -> (between rounds) refine queries from findings -> extract the
most relevant passages -> synthesise a structured markdown report with inline
[n] citations and a numbered source list. Uses DeepSeek-V4 (flash for
plan/refine/rerank, pro for synthesis).
Tunables (0 = use defaults from config): breadth sub-queries per round
(default 3), depth rounds (default 2), max_sources pages read
(default 8). Higher = more thorough but slower/costlier.
Requires DEEPSEEK_API_KEY; search/fetch are keyless (DuckDuckGo).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| query | Yes | ||
| breadth | No | ||
| max_sources | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It discloses the pipeline, model used (DeepSeek-V4), tunables with defaults, requirements (DEEPSEEK_API_KEY), and that search/fetch are keyless. It does not mention failure modes or rate limits, but the cost/speed tradeoff is noted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (about 80 words) and well-structured: purpose sentence, pipeline overview, parameter explanation, and requirements. No wasted words; each sentence adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 0% schema coverage, and existence of an output schema, the description fully covers what the tool does, how it works, its parameters, prerequisites, and output format. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description explains each parameter's meaning and default behavior: breadth (sub-queries per round), depth (rounds), max_sources (pages read). The query parameter is self-explanatory. This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Run a multi-step deep-research investigation and return a cited report.' It specifies the verb (run investigation), resource (deep research), and output (cited report). It distinguishes itself from sibling tools like web_search by implying a multi-step, citation-generating process.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when a thorough, cited investigation is needed) vs simpler tools like web_search. However, it does not explicitly state when not to use it or list alternatives, though the pipeline details make the differentiation clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_pageA
Fetch a web page and return clean, readable Markdown.
Use this to read the full content of a URL (e.g. a search result). Strips
navigation/ads and extracts the main article text. Output is capped to
max_chars characters. Works without any API key.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| max_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses output capping ('max_chars'), no API key requirement, and content processing (strips navigation/ads). However, it does not mention rate limits or error handling, which are acceptable omissions for a simple fetch tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loaded with the main action and output. Every sentence adds value: purpose, usage, and behavioral details. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema (so return values are covered), the description adequately covers what the tool does, how it processes content, and its limitations (max_chars). It also mentions authentication (no API key), which is useful context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It explains the max_chars parameter ('Output is capped to max_chars characters') and gives a default. The url parameter is implied by the tool's purpose but not explicitly described, which is acceptable given its obvious nature.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch'), resource ('web page'), and output format ('clean, readable Markdown'). It also mentions stripping navigation/ads and extracting main article text, distinguishing it from siblings like web_search which returns search results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear when-to-use scenario: 'Use this to read the full content of a URL (e.g. a search result).' It does not explicitly mention when not to use or compare with siblings, but the use case is well-defined and appropriate for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ocr_imageA
Extract readable text from an image (OCR).
Accepts a file path, URL, data URI, or base64 string. Uses local Tesseract
when installed; otherwise falls back to the configured vision provider.
lang is a Tesseract language code (e.g. 'eng', 'chi_sim', 'eng+chi_sim').
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | eng | |
| image | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses input formats (file path, URL, data URI, base64) and backend behavior (local Tesseract or vision provider fallback). This adds behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no redundancy. Purpose is front-loaded, and every sentence adds necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters, no annotations, and existence of an output schema, the description covers input, language, and backend behavior adequately. Output format not required due to output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully explains both parameters: image accepts multiple formats, and lang is a Tesseract code with examples, adding crucial meaning beyond type strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Extract readable text from an image (OCR)', specifying the verb, resource, and technique. It distinguishes from siblings like analyze_image and web_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied but not explicitly stated. No guidance on when to use vs. alternatives like analyze_image, nor when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchA
Search the web and return ranked results (title, URL, snippet).
Use this for live, up-to-date information. Returns up to max_results
hits as a numbered markdown list. Follow up with fetch_page to read any
result in full. Works without any API key (DuckDuckGo).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the search engine (DuckDuckGo), number of results via max_results, and output format. Lacks details on rate limits, filtering, or error handling, which is needed without annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the core action. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers tool purpose, input, output format, and integration with fetch_page. Lacks mention of error conditions or empty result handling, but output schema may fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Explains max_results limits output and query is the search term. Since schema has 0% description coverage, the description adds necessary context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches the web and returns ranked results with title, URL, and snippet. It distinguishes from sibling tools by mentioning follow-up with fetch_page for full content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Advises using for 'live, up-to-date information' and suggests fetch_page for further reading. However, it does not explicitly exclude other use cases or compare with deep_research.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: analyzing images, deep research, fetching web pages, OCR, and web search. Even the two image-related tools (analyze_image and ocr_image) are differentiated by their function (understanding vs. text extraction).
All tool names follow a consistent verb_noun pattern using underscores (e.g., analyze_image, deep_research, fetch_page, ocr_image, web_search). No mixing of conventions.
With 5 tools, the server is well-scoped for its purpose as a utility toolkit covering image analysis, OCR, web search, web fetching, and deep research. The count is neither too thin nor excessive.
The tool set covers core image and web tasks comprehensively, though it might benefit from a summarization or comparison tool. No major gaps for its stated domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
AI image, video, voice and music generation over MCP, routed to Veo 3.1, Seedance 2.0 and more.
65+ AI tools as MCP: research, write, code, scrape, translate, RAG, agent memory, workflows
Web search, scraping, RAG answers with citations, and translation as MCP tools.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables real-time web search via DeepSeek's search-enhanced dialogue, providing search results as answers through MCP tools.1MIT
- AlicenseAqualityCmaintenanceBridges a vision model to enable text-only models like DeepSeek to describe images, extract text, and compare images via MCP tools.5379MIT
- AlicenseAqualityBmaintenanceBridges DeepSeek (text-only) with vision models via MCP, enabling image description and compression using any OpenAI-compatible visual API.3211MIT
- FlicenseNot gradedqualityBmaintenanceAutomates image analysis and coordinate-level visual reasoning through DeepSeek's web interface, with multi-round voting, image comparison, and follow-up Q&A via MCP tools.6
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lijiatuk/dstools'
If you have feedback or need assistance with the MCP directory API, please join our Discord server