Introduction¶
The philosophy of DSH is “everything is a plugin”. However, as more components are installed, a practical problem arises: every plugin and MCP server contributes a batch of tool schemas to each model request. The longer the list, the higher the cost of repeated tool prefixes, and the more difficult it becomes for the model to identify the correct target from a long list of tools.
The approach taken by the DeepSeek Harness Tool Palette is the opposite: at the start of each Agent, it includes only a tool_search tool and a set of base tools selected by deployment. The rest of the installed global tools are hidden initially, unlocking only when the model searches for the corresponding capability for subsequent steps. The following sections introduce the specific mechanism, installation method, and usage boundaries of this plugin.
What is this¶
Tool Palette is maintained by lizhecome, with the npm package name @lizhecome/dsh-tool-palette, current version 0.1.0, and license MIT. In a nutshell: it provides progressive tool discovery and per-Agent unlocking for DSH.
It performs two functions:
- Maintain a lean tool panel for each active Agent;
- Expose a
tool_searchtool to the model, allowing searches to preview or unlock the most matching installed tools.
Core Features¶
Parameters for tool_search¶
query: Non-empty capability, action, tool name, or parameter search term;unlock: Defaulttrue; when set tofalse, it only returns matching results without changing the current panel.
Once unlocking takes effect, the visible schema set changes from the next step onward, and unlocked tools enter subsequent steps.
Deterministic Lexical Sorting¶
Matching is a deterministic lexical search, not embeddings, nor does it call an LLM. The sorting order is fixed:
- Exact tool name;
- Name fragments;
- Full description matching;
- Parameter text;
- Single query words.
Default Bundle Configuration¶
The built-in cordis.patch.yml keeps these standard DSH tools visible before any search occurs:
alwaysVisible:
- read
- glob
- grep
- exit_plan_mode
- todo_write
maxResults: 8
maxQueryChars: 400
descriptionMaxChars: 240
tool_search is always included and must not appear again in alwaysVisible. The configured base tool names are validated when an Agent is adopted; missing names will result in an explicit error rather than silently shrinking the panel.
One Reversible Limit per Agent¶
Each active Agent possesses a reversible allow-list restriction. When a sub-Agent unlocks a hidden global tool, it simultaneously relaxes intersecting ancestor restrictions, making that tool reachable; sibling Agents remain isolated and do not gain this tool as a result. Tools registered within an Agent’s own scope are inherently visible within that scope and do not belong to the directory search results.
Lifecycle¶
When the plugin loads, it takes over existing Agents and listens for subsequent agent/created events; when an Agent is destroyed, it cleans up the corresponding state; before plugin unloading or hot reload, all restrictions are lifted, and the original tool panel is restored.
The unlocked state is in-process and advisory: it is not written to Session logs and will be reset after an Agent or plugin is rebuilt.
Code Mode¶
Under Code Mode, the reserved run_code transmission is always visible. Once unlocked, the next generated tools SDK will include this tool; native function calls follow the same panel via standard schemas.
Resources and Security Boundaries¶
The plugin does not initiate network requests, read files, start subprocesses, or store credentials; directory search only checks the separated global schemas of ToolRuntime, with output limited by maxResults and descriptionMaxChars.
It needs to be clear that tool hiding is progressive disclosure, not a permission boundary. Unlocking does not bypass tools/pre-execute, monotonic guards, approval, sandboxing, filesystem watching, deadlines, or the tool’s own validation.
Installation and Activation¶
The repository is private and requires cloning with an authenticated GitHub CLI session, then installing the checkout into a DSH profile:
gh repo clone lizhecome/deepseek-harness-tool-palette
cd deepseek-harness-tool-palette
dsh plugin --profile web add --ignore-workspace-root-check .
--profile web can be replaced with other profiles like headless as needed. The bundle will be appended to the profile’s existing bundles.
Typical Usage¶
First, let’s look at two model request examples given in the README. This sentence instructs the model to find a tool before working, defaulting to unlocking:
Find a tool that can write a file, then create notes.txt.
i.e., find a tool that can write files and create notes.txt.
This sentence only searches without unlocking, corresponding to the unlock: false behavior—returning matches without changing the panel:
Search the installed tools for subagent delegation without unlocking anything.
i.e., only searching for sub-agent delegation capabilities without unlocking any tools.
If you want a minimal panel, override the bundle line in the profile patch:
- id: tool-palette
config:
alwaysVisible: []
maxResults: 6
maxQueryChars: 300
descriptionMaxChars: 180
Applicable Scenarios and Notes¶
Suitable deployments: many plugins and MCP servers installed, dragging a long list of tool schemas with every request; multiple Agents coexisting with isolated tool panels.
Clarify these boundaries before use:
- Search only covers global ToolRuntime schemas; Agent local tools are not in the directory results;
- Unlocking is not persistent and resets after an Agent or plugin is rebuilt;
- The visible schema set changes the model request prefix from the next step onward, meaning KV-cache reuse by the provider can only continue through the preceding common prefix;
- Hiding is not protection; security decisions should still be delegated to existing mechanisms such as guards, approval, sandboxing, etc.;
- The plugin runs with the permissions of the current dsh process; source code and license (MIT) should be checked before installation.
Local Development¶
Local build and verification require Node.js 24 and pnpm 10.15.0:
pnpm install --frozen-lockfile
pnpm run check
npm pack --dry-run
Summary¶
Tool Palette uses a tool_search and fixed-rules lexical sorting to replace “sending all tools with every request” with “base panel + on-demand unlocking”, while maintaining isolation between Agents and a clean lifecycle. DSH deployments with many installed tools are worth trying.
- Community Directory Page: https://www.skillhub.cn/plugins/lizhecome/deepseek-harness-tool-palette
- GitHub Repository: https://github.com/lizhecome/deepseek-harness-tool-palette
skillhub.cn is an independent community directory site with no official affiliation with DeepSeek or High-Flyer.