dsh-skills-anywhere (Skills Anywhere) gathers the Agent Skills (SKILL.md files) scattered across the directories of various AI coding tools into a single catalog, and serves it in two ways: as a skill provider for DeepSeek Harness (dsh), or as a local stdio MCP server. It also provides a set of verification tools: it checks that skill files are well-formed, verifies content hashes at load time, and records whether a given set of instructions actually reached the agent.
The problem it addresses
Claude Code, Codex, Cursor, Gemini CLI, Windsurf, Kiro, Goose, and other clients each read skills from their own project-level and user-level directories, so the same skill often ends up copied several times. Skills Anywhere reads these directories in place without copying anything. It aggregates the following sources:
- Predefined directories for each agent: project-level and user-level paths; the full list is in
src/agents.ts. To see which of these directories actually exist on your machine, runnpx dsh-skills-anywhere agents. - Claude Code plugin marketplaces:
~/.claude/plugins/marketplaces/*/plugins/*/skills/*. - Git sources: you can specify a repository, subdirectory, branch, tag, or commit. A local checkout is maintained, the resolved commit is recorded in
lock.json, and by default it syncs in the background every 6 hours.
Name conflicts are resolved deterministically. Entries are first ranked by source priority (project-level 250, user-level 550, Claude plugins 580, Git sources 700; lower values win). Symlinks pointing to the same file, and entries whose contents are byte-for-byte identical, are merged. Entries with the same name but different contents are renamed with a prefix, for example discord-access and telegram-access. The doctor command lists every repair, skip, and rename, with the reason for each.
Inside dsh and over MCP
Inside dsh, it attaches an additional provider to the built-in ctx.skills registry, so the model’s existing skill tool and /name invocations can see more skills. With many skills, attaching every skill summary to every request would take up a lot of context, so it applies a “catalog budget”: by default, only the top 50 ranked skills are listed in the catalog the model sees. The remaining skills stay out of the catalog but can still be invoked with /name, or found through find_skills (keyword search) and open_skill (load by name). Skills whose authors set disable-model-invocation: true in the frontmatter are still refused by open_skill, matching the behavior of the built-in skill tool.
Outside dsh, dsh-skills-anywhere mcp starts a local stdio MCP server with three tools, list_skills, find_skills, and open_skill, and also exposes each skill as a skill://<name> resource. It supports both the older initialization flow and the opening handshake of protocol version 2026-07-28; the repository tests four SDK configurations and the installed npm package over real subprocess connections.
Verify before loading
- File checks:
checkinspectsSKILL.mdwith the same parser the provider uses, reports automatic fixes and hidden characters (invisible characters or characters that change text direction), and outputs JSON that includes file hashes.--resourceschecks that files referenced by local Markdown links exist. The repository also provides a GitHub Action that can post the check results as PR comments. - Hash-pinned loading: MCP
open_skillreturns the SHA-256 of the original file. If you pass a reviewedexpected_sha256in the call and the file has changed since the review, the server refuses to return the instructions. Thebundlecommand generates a file manifest for the entire skill directory, and the correspondingexpected_bundle_sha256can catch cases where “SKILL.mdis unchanged but a script changed”. - Load receipts: every successful
open_skillreturns a receipt identifying the instruction text actually delivered, the original file, and the optional directory bundle. The receipt can be attached to a tool span and reviewed together with the task result. - Skill selection review (new in 0.16.0):
route preparegenerates up to 8 openable candidate skills for a task, each with its source, path, and content hash. After a classifier, an LLM, or a person writes down a choice,route applychecks that choice as untrusted input and outputs exactly one ofselected,no_match,abstain,stale, orinvalid_input. The whole process loads nothing, executes nothing, and makes no network access.
How to try it
It requires Node.js 22.19+ or 24+, and Git sources also need git. Start by seeing which skills can be discovered on your machine:
npx dsh-skills-anywhere list
npx dsh-skills-anywhere add anthropics/skills # add a Git source
npx dsh-skills-anywhere@0.16.0 check path/to/SKILL.md --resources --json
Install it into DeepSeek Harness (requires 0.1.5-rc.1 or later):
dsh plugin --profile web add dsh-skills-anywhere
Connect it to Claude Code as an MCP server (see the README for Cursor and Codex configuration):
claude mcp add skills-anywhere -- npx -y dsh-skills-anywhere mcp
If you’d rather not install anything, the interactive demo on Hugging Face lets you inspect name-conflict handling, adjust the catalog budget, and compare catalog listings in a sample workspace. Uploaded files are processed only locally in the browser.
Limitations
- A receipt proves only that the instructions were delivered, not that the agent followed them, and it has nothing to do with access control.
compatibilityandallowed-toolsare only author declarations; actual runtime requirements and tool permissions are determined by the client. checkinspects only local Markdown links. It does not analyze dependencies described in the body text, and it does not execute skills. A bundle digest covers only the files inside that directory; external dependencies need separate review, and files may also be modified after loading.- The default 0.7 confidence threshold in
route applyhas not been calibrated; set it using held-out results from your own decision-maker. - A Git source that has never synced successfully contributes no skills; when a sync fails, the existing checkout is kept.
- The authors’ small published experiment does not support the idea that loading skills improves results. In 27 Qwen3-8B attempts across three engineering configurations, comparing no skill, direct delivery and MCP delivery, no direct-delivery or MCP attempt fully solved the task; in the final configuration, the no-skill condition fully solved 2 of its 3 attempts.
- The current version is 0.16.0 (2026-09-28), MIT-licensed. The npm package name is
dsh-skills-anywhere, and GitHub Releases include the same tarball.
Links
- Source code: github.com/noteflowai/dsh-skills-anywhere (Chinese README)
- Releases: GitHub Releases
- Interactive demo: Hugging Face Space
- Documentation: Checks and the GitHub Action · Hash-pinned loading · Load receipts · MCP compatibility matrix
- Skill delivery experiment log: noteflowai.github.io/evalarc/skill-impact
- Related specifications: Agent Skills · Model Context Protocol · DeepSeek Harness



