dsh-mcp-market
The front door to MCP for DeepSeek Harness. Search a verified catalog of MCP servers and get the exact cordis.yml row that wires one into the official @deepseek-ai/dsh-mcp-client bridge.
- Stars
- 0
- Language
- JavaScript
- Created
- Sep 3, 2026
- Updated
- Sep 3, 2026
Introduction
dsh-mcp-market
The front door to MCP for DeepSeek Harness. Search a verified catalog of MCP servers and get the exact
cordis.ymlrow that wires one into the official@deepseek-ai/dsh-mcp-clientbridge — in one step.
DeepSeek Harness is an all-plugin Cordis agent harness. Plugins bring the tools. The official MCP bridge already knows how to talk to any MCP server — but someone still has to tell you which server to run and what exact config makes it work.
That someone is dsh-mcp-market.
- 📦 A verified catalog — every entry is probed against the live npm registry by
scripts/build-catalog.mjs; packages that 404 are dropped, versions are pinned to what actually exists. No hand-written guesses. - 🔌 A one-tool plugin — load
dsh-mcp-marketand the agent itself can search the catalog and read the wiring for any server (mcp_market_search). - 🧩 A zero-config CLI —
dsh-mcp-market add githubappends the exact row to your overlaymcp-servers.cordis.yml, idempotently.
Why this exists
| Layer | What ships it | Status |
|---|---|---|
| MCP protocol servers | @modelcontextprotocol/server-* + community | ✅ thousands exist |
| MCP → dsh tool bridge | @deepseek-ai/dsh-mcp-client | ✅ official |
| Discovery + verified config | dsh-mcp-market | 🟩 this project |
The bridge is per-server configuration: a cordis.yml row with the right package name, the right version, the right env keys. Get any of those wrong and the tool silently never appears. The ecosystem had a bridge but no front door — that gap is what this plugin fills.
Install
As a harness plugin (declared in package.json of the harness app or installed via the plugin manager):
npm install dsh-mcp-market
It is a Cordis plugin and registers exactly one tool. Add it to your cordis.yml:
plugins:
mcp-market:
# optional: default result limit for the search tool (1-10)
# config:
# defaultLimit: 5
Requires the same peer set as the official bridge:
@deepseek-ai/dsh-toolsand@deepseek-ai/cordis. ESM-only ("type": "module"), Node ≥ 20.
The CLI is also available standalone without touching the harness:
npx dsh-mcp-market search github
npx dsh-mcp-market add github --out mcp-servers.cordis.yml
Usage
As a harness tool
Once the plugin is loaded, the agent can run mcp_market_search with a free-text query, an optional category, and an optional limit. The result is a ranked list of matching servers, each with:
- package + pinned version,
- env keys the server expects,
- the exact
cordis.ymlrow to copy.
Example (what the agent sees when asked "add a search tool"):
mcp_market_search(query="github")
1. github — GitHub MCP server (@modelcontextprotocol/server-github@2025.4.8)
env: GITHUB_TOKEN (Personal access token; repo + read:org scopes)
category: dev
Wire it in:
```yaml
- id: github
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: github
transport: stdio
command: npx
args: ['-y', '@modelcontextprotocol/server-github@2025.4.8']
env:
GITHUB_TOKEN: !!js process.env.GITHUB_TOKEN
```
From the CLI
dsh-mcp-market <command>
Commands:
search <query> Search the catalog
add <id> [--out file] Append a server's cordis.yml row to an overlay file
(idempotent — never duplicates). Default out:
mcp-servers.cordis.yml
ls [--category cat] List all servers (optionally filtered)
categories List available categories
$ dsh-mcp-market search postgres
# postgres — Postgres MCP server (@modelcontextprotocol/server-postgres@0.6.2)
$ dsh-mcp-market add memory
# appending managed block to mcp-servers.cordis.yml
$ cat mcp-servers.cordis.yml
- id: memory
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: memory
transport: stdio
command: npx
args: ['-y', '@modelcontextprotocol/server-memory@0.6.2']
env: {}
The overlay file is meant to be !included or merged into the harness cordis.yml alongside the official bridge's own rows. Rows added by the CLI are wrapped in a # --- dsh-mcp-market managed block --- marker; re-running add on the same id is a no-op.
The catalog
catalog/catalog.json currently ships 17 verified servers (all probed against npm):
| id | package | tags |
|---|---|---|
filesystem | @modelcontextprotocol/server-filesystem | official, files |
memory | @modelcontextprotocol/server-memory | official, memory |
sequential-thinking | @modelcontextprotocol/server-sequential-thinking | official, thinking |
everything | @modelcontextprotocol/server-everything | official, demo |
github | @modelcontextprotocol/server-github | official, dev |
slack | @modelcontextprotocol/server-slack | official, chat |
postgres | @modelcontextprotocol/server-postgres | official, db |
brave-search | @modelcontextprotocol/server-brave-search | official, search |
google-maps | @modelcontextprotocol/server-google-maps | official, geo |
pdf | @modelcontextprotocol/server-pdf | official, files |
gdrive | @modelcontextprotocol/server-gdrive | official, files |
puppeteer | @modelcontextprotocol/server-puppeteer | official, browser |
playwright | @playwright/mcp | browser |
puppeteer-mcp-server | puppeteer-mcp-server | browser |
figma | figma-developer-mcp | design |
tavily | tavily-mcp | search |
firecrawl | firecrawl-mcp | scrape |
Regenerating the catalog
The catalog is generated, not curated:
npm run catalog # scripts/build-catalog.mjs → probes npm, writes catalog/catalog.json
To add a candidate, extend the CANDIDATES array in scripts/build-catalog.mjs and re-run. The script resolves the live latest version, fetches description/homepage, and drops any package that 404s on the registry — the shipped catalog only ever contains installable servers.
Development
npm install
npm run typecheck # tsc --noEmit
npm run test # build + node --test tests/market.test.mjs (9 cases)
npm run catalog # regenerate catalog/catalog.json from live npm data
The test suite pins the important contracts:
- every catalog entry parses and has a unique id,
searchCatalogranks by id > package > tags > description (githubquery → github server first),- an empty query with no category returns
[](browse is reserved forls), buildRowemits exactly the format the official@deepseek-ai/dsh-mcp-clientconsumes,parseCatalogrejects structurally invalid payloads.
Project layout
dsh-mcp-market/
├── src/
│ ├── index.ts # Cordis plugin entry: name / inject / apply
│ ├── tool.ts # mcp_market_search tool registration (defineTool)
│ ├── catalog.ts # catalog URL resolution + structural parsing
│ ├── search.ts # tokenizer + ranked search + categories
│ ├── snippet.ts # cordis.yml row + install command builders
│ └── types.ts # public types
├── cli/index.mjs # search / add / ls / categories
├── scripts/build-catalog.mjs # live npm probe → catalog/catalog.json
├── catalog/catalog.json # generated, committed
└── tests/market.test.mjs # 9 contract tests (node:test)
License
MIT © 2026 LeonxLJX — see LICENSE.