Skills Anywhere: one catalog for the SKILL.md files spread across AI tools, loaded on demand through dsh or MCP

Merges Agent Skills from Claude Code, Codex, Cursor, plugin marketplaces and Git into one catalog, served via DeepSeek Harness or MCP, with file/hash checks.

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, run npx 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: check inspects SKILL.md with 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. --resources checks 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_skill returns the SHA-256 of the original file. If you pass a reviewed expected_sha256 in the call and the file has changed since the review, the server refuses to return the instructions. The bundle command generates a file manifest for the entire skill directory, and the corresponding expected_bundle_sha256 can catch cases where “SKILL.md is unchanged but a script changed”.
  • Load receipts: every successful open_skill returns 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 prepare generates 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 apply checks that choice as untrusted input and outputs exactly one of selected, no_match, abstain, stale, or invalid_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. compatibility and allowed-tools are only author declarations; actual runtime requirements and tool permissions are determined by the client.
  • check inspects 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 apply has 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