deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
A third-party plugin that brings Exa — the neural web search and fetch engine — into DeepSeek Harness (dsh). It connects to Exa's hosted MCP endpoint (Streamable HTTP) through the MCP client bridge that ships with the dsh CLI, and registers Exa's tools as native agent tools under the exa namespace.
mcp__exa__web_search_exa · mcp__exa__web_fetch_exa
mcp__exa__web_search_advanced_exa · mcp__exa__agent_run (with an API key)
cordis.yml.Option A — install as a plugin bundle (recommended, requires pnpm):
npm install -g pnpm
dsh plugin --profile web add github:MicroHEROX/dsh-exa-mcp
dsh web
Verify after a
github:install — when the route to github.com is unstable, agithub:(git) install can silently fail or finish with an un-synceddsh.profile.bundles(locallink:/file:installs are unaffected). Verify and fix in one step:# check: does the bundle layer appear? dsh --profile web --dump-config | grep -A2 "== dsh-exa-mcp" # if not (or to fix preemptively), append the bundle to the profile manifest: node -e "const fs=require('fs');const p=process.env.DSH_HOME+'/profiles/web/package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));if(!(j.dsh.profile.bundles||[]).includes('dsh-exa-mcp')){j.dsh.profile.bundles=[...(j.dsh.profile.bundles||[]),'dsh-exa-mcp'];fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n','utf8');console.log('fixed: dsh-exa-mcp appended');}else{console.log('already present');}"The timing issue is reported upstream (Discussions #656);
--patchoverlays are never affected.
Option B — one-off overlay, no install:
dsh web --patch /path/to/dsh-exa-mcp/cordis.patch.yml
Option C — keep it permanently without installing: merge the single insert block from cordis.patch.yml into $DSH_HOME/profiles/<name>/cordis.patch.yml (or $DSH_HOME/cordis.patch.yml for every profile).
Install behavior: pnpm installs git dependencies through the
filesfield, sodocs/is not installed into your runtime — onlycordis.patch.ymlis. The docs live in this repository.
The hosted endpoint works anonymously on Exa's free tier (rate-limited, basic tools only). To lift limits and unlock advanced search / Exa Agent, create an API key and set it in the environment:
export EXA_API_KEY="your-key" # macOS / Linux
$env:EXA_API_KEY = "your-key" # Windows PowerShell
The plugin auto-detects the key at load time: EXA_API_KEY set → sends x-api-key; unset → anonymous. Never put the key into any patch file.
dsh web (with the bundle or overlay applied).mcp__exa__web_search_exa (and web_fetch_exa for full text) and answered from the results.https://mcp.exa.ai/mcp via @deepseek-ai/dsh-mcp-client (streamable-http transport), the official bridge shipped with the dsh CLI.mcp__exa__<tool>; re-syncs automatically on tools/list_changed notifications.x-api-key only when EXA_API_KEY is present (graceful anonymous fallback — no broken undefined header).toolCallTimeoutMs: 180000 for long research tasks; reconnect policy left at bridge defaults.dsh.bundle.patch), patch-layer composition, per-id override (mcp-exa), !!js config expressions only.https://mcp.exa.ai/mcp?login) — the dsh MCP bridge has no OAuth flow; use an API key.$DSH_HOME/profiles/.| Route | How |
|---|---|
| Anonymous search + fetch | Do nothing — free tier, rate-limited, 2 tools |
| Full tool set (advanced search, Agent) | Set EXA_API_KEY + restart; whitelist Agent via ?tools= (below) |
| Tool whitelist / default search type | Override the mcp-exa row's url with ?tools=web_search_exa,web_fetch_exa,agent_run or ?defaultSearchType=fast (see docs/API.md) |
| Multiple MCP servers | Add more mcp-client rows with unique serverName values |
| Hot reload | Edit the row in a patch layer — HMR reconnects without process restart |
| Uninstall | dsh plugin --profile <name> remove dsh-exa-mcp — profile and base bundles stay intact |
| Route | Why not |
|---|---|
| OAuth login flow | dsh mcp-client does not implement the OAuth handshake — use an API key |
| MCP resources / prompts from Exa | The harness bridges tools only |
| Per-request auth switching | The EXA_API_KEY decision is made at config evaluation (startup / HMR), not per call |
Using the same patch twice (bundle installed and --patch) |
dsh fails loud with duplicate loader entry id: mcp-exa — pick one method |
| API key in patch files | Keys belong in environment variables; committing them is a leak |
Bundle installs (installed via dsh plugin add):
dsh plugin --profile <name> remove dsh-exa-mcp
Verify nothing remains:
dsh --profile <name> --dump-config | grep -c "dsh-exa-mcp" # expect 0
If installed from a
github:spec during an unstable network window,removecan leave a danglingdsh-exa-mcpentry indsh.profile.bundles, which makes the profile fail to boot withcannot resolve profile bundle "dsh-exa-mcp". Fix by removing the entry (node, no BOM):node -e "const fs=require('fs');const p=process.env.DSH_HOME+'/profiles/<name>/package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));j.dsh.profile.bundles=(j.dsh.profile.bundles||[]).filter(b=>b!=='dsh-exa-mcp');fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n','utf8')"
Overlay / manual installs (no bundle):
--patch overlays: just drop the --patch <path>/cordis.patch.yml flag from your start command — nothing persists.mcp-exa block (or the whole insert list) from $DSH_HOME/profiles/<name>/cordis.patch.yml, or $DSH_HOME/cordis.patch.yml for every profile.Optional: unset EXA_API_KEY in your environment if you no longer use Exa.
Uninstalling never touches your deepseek-harness installation or any other bundle — it only edits the profile directory under $DSH_HOME.
| Component | Version | Notes |
|---|---|---|
dsh-exa-mcp (this plugin) |
0.1.0 | See releases |
DeepSeek Harness CLI (@deepseek-ai/dsh) |
≥ 0.1.0-rc.5, tested on 0.1.0-rc.6 | The CLI ships the @deepseek-ai/dsh-mcp-client bridge this bundle mounts |
MCP bridge (@deepseek-ai/dsh-mcp-client) |
^0.1.0-rc.6 (resolved from the dsh CLI) |
No separate install needed |
Exa MCP endpoint (mcp.exa.ai/mcp) |
server 3.2.1 (probed 2026-08-14) | Exa-managed; may change without notice |
| MCP protocol version | 2025-06-18 |
Negotiated automatically |
| Node.js | tested on v24.16.0; Node ≥ 22 recommended | dsh itself does not declare an engines range |
| Platform | Windows / macOS / Linux | Config-only bundle; no platform-specific code |
dsh is in developer preview and iterates rapidly. After upgrading dsh, re-run the verification steps from docs/SOLUTIONS.md.
EXA_API_KEY, read from the environment at load time; it is sent to Exa as the x-api-key header and never written to any file by this plugin.MIT. Not an official DeepSeek or Exa product.
Built for DeepSeek Harness by DeepSeek AI — the "everything is a plugin" harness built on Cordis. Powered by:
Thank you to the DeepSeek Harness team and every open-source project this work builds on.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。