DeepSeek Harness Plugin

labmimors/dsh-mcp-lens

Stars ★ 9 Downloads (30d) 903 Category Development & Runtime Added 2026-08-15 npm dsh-mcp-lens

Progressive-disclosure MCP gateway that searches large remote catalogs through `mcp_search`, then invokes exact schemas through `mcp_call` with lazy connections and bounded caches.

Install

# from npm (prebuilt)

dsh plugin --profile web add dsh-mcp-lens

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:labmimors/dsh-mcp-lens

Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).

README

English | 简体中文

verify

1,000 MCP tools. Two interfaces. Exact schemas when you need them.

MCP Lens routes a 1,000-tool catalog through search and call; the component fixture uses 1,114 bytes of standing MCP definitions

Install · Try the 1,000-tool calculator · See product tests

Large tool catalogs take up room before the model starts solving your task. MCP Lens keeps the standing MCP definitions small, finds relevant tools across servers, and preserves the returned data needed by the next call.

MCP Lens gives DeepSeek Harness two model-facing tools:

  1. mcp_search finds relevant tools and returns their exact input schemas.
  2. mcp_call calls a specific server/tool and returns its result, including structured data.

The two tool definitions occupy 1,114 bytes of JSON, regardless of catalog size. In the 1,000-tool component fixture, the direct client's definitions occupy 647,962 bytes. Remote schemas enter the conversation when search returns them. Connections open on demand, and repeated searches reuse the catalog index.

The latest version also fixes multi-step workflows: a customer ID returned alongside a text summary stays visible, so the model can use it to look up the customer's order. The tested data flows improved from 10/12 to 12/12. Read the September 10 results.

This works well for dozens to thousands of tools spread across MCP servers. Search adds a step; for a few tools used on nearly every request, the official direct MCP client is simpler.

Install

Use Node.js ^22.19.0 || >=24.0.0 and Harness 0.1.2-rc.1. As of September 10, 2026, Harness's npm latest and next tags point to this version.

Build Lens rc.10 from the main branch below. The published npm package is still rc.9, which targets Harness 0.1.0-rc.6.

npm install -g @deepseek-ai/dsh@0.1.2-rc.1
git clone https://github.com/labmimors/dsh-mcp-lens.git
cd dsh-mcp-lens
npm ci --ignore-scripts
npm run build
npm pack --ignore-scripts
dsh plugin --profile web add ./dsh-mcp-lens-0.1.0-rc.10.tgz

dsh plugin uses pnpm. If pnpm is missing from PATH, replace the last command with:

npm exec --yes --package=pnpm@10.20.0 -- dsh plugin --profile web add ./dsh-mcp-lens-0.1.0-rc.10.tgz

If you are keeping an existing Harness 0.1.0-rc.6 installation, use dsh plugin --profile web add dsh-mcp-lens@0.1.0-rc.9.

Connect your first MCP server

The plugin starts with no servers. Open ~/.dsh/profiles/web/cordis.patch.yml, or $DSH_HOME/profiles/web/cordis.patch.yml if you set DSH_HOME.

Replace an empty [] with this block. If the file already has other entries, append it as another top-level item; if it already has an mcp-lens item, replace that item's config.

- id: mcp-lens
  config:
    servers:
      - name: mcp-docs
        transport: streamable-http
        url: https://modelcontextprotocol.io/mcp

    cachePath: !!js dshHomePath('mcp-lens/catalog.json')
    allowTools:
      - mcp-docs/search_model_context_protocol
      - mcp-docs/query_docs_filesystem_model_context_protocol
    denyTools: ['mcp-docs/submit_feedback']

This connects the official MCP documentation server and enables its two read-only query tools. The server needs no API key; Harness uses the model provider you have configured.

Check the configuration and start Harness:

dsh --profile web --dump-config
dsh --profile web

Then ask:

Use the official MCP documentation server to explain when an MCP client should use Streamable HTTP.

Ask normal questions. The model uses mcp_search and mcp_call as needed.

Configuration

Set servers, cachePath, and the tools you want in allowTools. Patterns match server/tool, with * as a wildcard. denyTools overrides allowTools; an empty allow list enables no tools.

Each Cordis patch replaces the item's whole config, so include all custom settings you want to keep.

- id: mcp-lens
  config:
    servers:
      - name: local
        transport: stdio
        command: node
        args: ['/absolute/path/to/mcp-server.mjs']
        cwd: /absolute/path/to/project

    cachePath: !!js dshHomePath('mcp-lens/catalog.json')
    allowTools: ['local/search_*', 'local/read_*']
    denyTools: ['local/delete_*']

Replace the command, paths, and tool patterns with those of your MCP server.

- id: mcp-lens
  config:
    servers:
      - name: knowledge
        transport: streamable-http
        url: https://mcp.example.com/rpc
        headers:
          Authorization: !!js '`Bearer ${process.env.MCP_TOKEN}`'
        cacheNamespace: knowledge-acme-readonly

    cachePath: !!js dshHomePath('mcp-lens/catalog.json')
    allowTools: ['knowledge/read_*', 'knowledge/search_*']
    denyTools: ['*/delete_*', '*/destroy_*']

cacheNamespace identifies the account and permission scope, without containing a credential. Change it when the account or scope changes. Without it, an authenticated server's catalog stays in memory and is fetched again after restart.

Field Default Purpose
catalogTtlMs 86400000 Refresh a catalog after 24 hours
idleDisconnectMs 300000 Close an idle connection after 5 minutes
connectTimeoutMs 30000 Connection timeout
callTimeoutMs 60000 Tool-call timeout
discoveryTimeoutMs 30000 Timeout for the full catalog discovery
maxDiscoveryPages 1000 Pages per discovery
maxToolsPerServer 10000 Tools per server
maxBytesPerTool 1048576 Metadata bytes per tool
maxTotalCatalogBytes 67108864 Total catalog/cache bytes
maxHttpResponseBytes 16777216 HTTP response bytes
maxCursorBytes 4096 Pagination cursor bytes
searchLimitDefault 5 Default search results
searchLimitMax 10 Maximum search results

The defaults are also in cordis.patch.yml.

A failed refresh keeps the previous usable catalog, and one unavailable server does not hide results from other servers. Lens supports MCP Tools over stdio and Streamable HTTP. OAuth, Resources, Prompts, Elicitation, and task-based execution are not currently implemented.

Latest tests

The latest change makes structured results visible to the model, including identifiers needed by later calls.

Test Result
Automated tests 178 passed
Three Codex model tasks with 16 synthetic tools Lens 3/3; official direct client 2/3
Data workflows across 16- and 1,000-tool catalogs 12/12 after the fix; 10/12 before
Lens tool definitions 2 schemas, 1,114 B

The model tasks ran in Codex through real Harness ToolRuntime and MCP servers. See Product tests for the tasks, results, and reproduction commands.

Earlier experiment: DeepSeek V4 Flash pilot, August 14, 2026.

Try it on your catalog

Open the schema calculator, load the 1,000-tool sample or paste your exported tool definitions, and compare the standing schema size. Use Copy share link, Copy Markdown, or Download card to share your measurements with teammates. Calculation runs in your browser; the share link contains the numeric result.

Have a query that misses the right tool? Send a minimal search example so we can reproduce it. You can also browse MCP Lens in the DSH Directory.

Development

Run these commands from the source checkout:

npm ci
npm run verify
npm run bench -- --output benchmark.json
npm run verify:dsh-install
npm run verify:dsh-profile

verify runs type checking, tests, and the build. The install checks use local MCP fixtures and temporary Harness profiles. If Corepack is unavailable, run the profile check through npm exec --yes --package=corepack@0.35.0 -- npm run verify:dsh-profile.

See Contributing for exact Harness versions, test commands, and the schema-size GitHub Action.

Schema calculator · Support · Security · MIT license

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Community comments

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.