Research plugins for DeepSeek Harness — a pnpm monorepo adding web search and MCP (Model Context Protocol) bridges for AI research, web scraping, and live documentation to your DSH agent.
What this is · Install · API keys · Repo layout · License
dsh-research-plugins gives your DeepSeek Harness (DSH) agent three research superpowers it does not have out of the box:
- Web search via the Tavily Search API — a settings toggle that swaps the built-in DeepSeek search for Tavily, with keyless search support.
- Web scraping & crawling via the Firecrawl MCP server — scrape, crawl, map, and search the open web inside tool calls.
- Up-to-date library docs via the Context7 MCP server — on-demand documentation and code examples for any library or framework.
Everything is delivered as drop-in DSH plugins — no vendor lock-in, no forks, just a dsh plugin add away.
| Package | What it adds |
|---|---|
@pymodel/dsh-tavily |
Tavily Search API as a web search provider (settings toggle, keyless search) + a Tavily MCP bridge (tavily-search / tavily-extract keyless; crawl / map with a key) |
dsh-mcp-firecrawl |
Firecrawl MCP: keyless search / scrape / parse; full tool surface with an API key |
dsh-mcp-context7 |
Context7 MCP: mcp__context7__* up-to-date library docs and code examples |
Each package installs independently into a DSH profile:
dsh plugin --profile web add @pymodel/dsh-tavily
dsh plugin --profile web add dsh-mcp-firecrawl
dsh plugin --profile web add dsh-mcp-context7
dsh webOr follow GitHub (this repo, latest commits):
dsh plugin --profile web add github:PyModel/dsh-research-plugins#path:packages/dsh-tavily
dsh plugin --profile web add github:PyModel/dsh-research-plugins#path:packages/dsh-mcp-firecrawl
dsh plugin --profile web add github:PyModel/dsh-research-plugins#path:packages/dsh-mcp-context7The MCP bridges use the harness's shipped @deepseek-ai/dsh-mcp-client. They read keys from the launch environment (a real env var, the project .env, or $DSH_HOME/.env) — not from $DSH_HOME/.credentials.yaml:
| Plugin | Env var | Required | Endpoint |
|---|---|---|---|
dsh-tavily (MCP part) |
TAVILY_API_KEY |
no (keyless MCP: search + extract; crawl/map need a key) | https://mcp.tavily.com/mcp/ |
dsh-mcp-firecrawl |
FIRECRAWL_API_KEY |
no (keyless: search/scrape/parse; full surface with a key) | https://mcp.firecrawl.dev/v2/mcp |
dsh-mcp-context7 |
CONTEXT7_API_KEY |
no (keyless works) | https://mcp.context7.com/mcp |
Keys are sent as an Authorization: Bearer header at load time — never in the URL and never in plain YAML. Without a key the bridges run in each vendor's documented keyless mode (X-Tavily-Access-Mode: keyless for Tavily), so every row works out of the box. A key added to .env needs a dsh web restart.
The bundles insert loader entries mcp-tavily, mcp-firecrawl and mcp-context7. If your profile's cordis.patch.yml also inserts one of those ids, DSH refuses to boot (duplicate loader entry id: mcp-tavily) and DSH Desktop opens Safe Mode. A second row under another id with the same serverName fails too (serverName "tavily" is already in use).
Delete your own row, or keep your settings (a proxy or gateway URL, say) by turning it into an override of the plugin's row. An override replaces the whole config, so restate every key:
# $DSH_HOME/profiles/web/cordis.patch.yml
- id: mcp-tavily
config:
serverName: tavily
transport: streamable-http
url: http://127.0.0.1:8787/tavily/mcp
toolCallTimeoutMs: 60000
failOnStartupError: falsepackages/
dsh-tavily/ # web-search provider + settings card + Tavily MCP row
dsh-mcp-firecrawl/ # pure-config Firecrawl MCP bundle
dsh-mcp-context7/ # pure-config Context7 MCP bundle
The Firecrawl and Context7 packages are pure-config bundles (package.json + cordis.patch.yml) with no build step. The Tavily package keeps its prebuilt lib/ and browser client.
Issues and pull requests are welcome. Please open a discussion on GitHub before starting large changes.