Borrowing it
Nothing to install: this file belongs to chrischall/skill-mcp. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/chrischall/skill-mcp/main/CLAUDE.mdgit clone --depth 1 https://github.com/chrischall/skill-mcpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/instructions/chrischall/skill-mcp/claude-md)<a href="https://agentmods.dev/instructions/chrischall/skill-mcp/claude-md"><img src="https://agentmods.dev/badge/instructions/chrischall/skill-mcp/claude-md/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/instructions/chrischall/skill-mcp/claude-md"><img src="https://agentmods.dev/badge/instructions/chrischall/skill-mcp/claude-md.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.01924 | $0.01924 |
| Opus 5.5 | $0.00770 | $0.00770 |
| Sonnet 5.5 | $0.00385 | $0.00385 |
| Haiku 4.5 | $0.00192 | $0.00192 |
Grade A, and why
skill-mcp CLAUDE.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 20d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
Copies of this mod
1 near-identical copy found in the catalogue:
- skill-mcp AGENTS.md — 95% identical, 125 lines differ
How it starts
The opening of the file, as written. The whole thing — 124 lines — stays where its author put it; the contents beside it link to each section on GitHub.
CLAUDE.md — skill-mcp
Guidance for Claude working in this repo. Fleet-wide conventions (the
auto-review ladder, the merge policy, release-please rules) live in
~/.claude/CLAUDE.md and chrischall/workflows — deliberately NOT restated
here. What follows is true of this repo and nowhere else.
TL;DR
An MCP server that serves a directory of Agent Skills: it lists them, hands out their instructions and bundled files, and runs only the scripts a skill declares AND the owner granted. A generic adapter — the skills are content it reads, and the same build serves whatever it is pointed at.
Two ways it runs, and they have OPPOSITE defaults (below): standalone at your own terminal, or hosted on mcp-host as a registration.
npm test # typecheck (tsc -p tsconfig.tests.json) THEN vitest
npm run build # tsc + esbuild bundle -> dist/
npm test typechecks first on purpose: vitest transpiles with esbuild and
never runs tsc, so a type error in a test file passes every suite and then
fails CI.
The tool surface
Four tools, and they are the whole contract (src/tools/skills.ts).
| tool | takes | returns |
|---|---|---|
skill_list |
— | every skill: name, description, source, file count, which scripts may run |
skill_load |
name |
SKILL.md verbatim + a manifest of bundled files. Referenced files are NOT inlined |
skill_file |
name, paths[] |
one entry per path, in request order: text, or base64 + media type, or that path's own error |
skill_run |
name, script, args[], confirmToken |
{exitCode, stdout, stderr, truncated, durationMs} |
Skills are also projected as MCP prompts and resources
(skill://<name>/<path>, src/prompts.ts). That projection is a second door,
never the only one — everything reachable there is reachable through the tools.
Load-bearing invariants (tested — don't weaken)
- A skill is named by its DIRECTORY, never by its frontmatter
(
src/discovery.ts). Aname:that disagrees is reported asname-mismatchand otherwise ignored, and a directory whose own name is not addressable is skipped rather than renamed by its content. This is not tidiness: the owner's grant is keyed by skill name, so a bundle that could choose its name could claim its neighbour's name and be handed the neighbour's script AND the neighbour's environment. A real duplicate refuses BOTH sides and names every contributing directory. - The grant can only ever NARROW (
src/grant.ts).MCP_SKILL_RUNis a JSON array of{skill, script, env?}; a row naming a script the skill did not declare grants nothing, and a row naming a variable the script did not ask for grants nothing. The widest this adapter is ever is the declaration itself. Keyed onbasename(skill.dir)— the second line under the rule above — and the map key is NUL-separated, written as the\0ESCAPE. Never a literal NUL byte in source: it makes git treat the file as binary, which is how this module once shipped asBin 5859 -> 6511 byteswith no reviewable diff. - An absent grant means opposite things in the two modes (
src/config.ts). Hosted, it is the EMPTY grant — there is a registration behind that child and §7 of mcp-host's design says empty by default. Standalone there is no registration and no owner but the person at the terminal, so the declaration stands. "Hosted" is detected from any runner-INJECTED marker (MCP_SKILLS_PATH,MCP_HOST_METER_FILE,MCP_DATA_DIR,MCP_BLOB_BASE_URL), not fromSKILLS_DIRalone — a registration's plainenvcan carrySKILLS_DIR, and keying on it put the hosted case on the fail-OPEN default. That heuristic may only ever move the default closed. - Neither the grant nor the env allowlist is a credential boundary — never
describe them as one. A script runs as this server's uid. They decide what a
well-behaved script is HANDED; isolation from a hostile script is the tier's
job (distinct uid /
hidepid=2/ non-dumpable). - The exec-time environment block is wiped at boot (
src/scrub-environ.ts, first thing insrc/index.ts, chrischall/fleet-audit#244). Without it a script reads every credential in the registration from/proc/<ppid>/environ, which is the ORIGINALexecveblock, notprocess.env. Every variable is re-homed (assigned to itself, sosetenvcopies it to the heap) BEFORE the block is zeroed through/proc/self/mem— reverse that order andgetenvreads zeros. It never throws and the server always boots; a refusal is a stderr line, and HOSTED it also refuses everyskill_runand listsenviron-unscrubbedinskill_list(src/deps.ts) unless the owner setsMCP_SKILL_ALLOW_UNSCRUBBED=1. Standalone stays open.tests/scrub-environ.test.tsproves it against a real kernel on Linux CI (skipped on macOS). - Every path is checked twice, on the STRING and on the resolved real path
(
src/paths.ts). No leading/, no./..segment, no backslash, no percent escape, no NUL; thenrealpathand a containment check against the skill's own realpath'd directory; thenlstat, which must report a regular file. A read is not less dangerous than an execution here — the slot sits beside other skills and the child's$HOME. - Reads are BOUNDED, never read-whole-then-slice (
src/read-capped.ts). A hosted child gets RLIMIT_DATA 256 MiB and a bundle may be far larger, soreadFilefollowed by a slice bounds the frame and kills the server.statfor the real size, then read at mostmaxBytes + 1— the one extra byte is what decidestruncatedwithout a second syscall. - Caps are stated, not discovered.
MAX_SKILLS32,MAX_FILES_PER_SKILL2000,MAX_DIRS_PER_SKILL2000,MAX_SKILL_MD_BYTES256 KiB,MAX_FRONTMATTER_BYTES64 KiB,MAX_FILE_BYTES1 MiB,MAX_FILE_PATHS8 andMAX_BATCH_BYTES4 MiB for oneskill_filecall,MAX_STREAM_BYTES1 MiB andMAX_TIMEOUT_MS300 s for a run,MAX_RESOURCES500. A batch's total is decided fromstatBEFORE a byte is read, summingmin(size, MAX_FILE_BYTES)— the bytes that would actually be served — so the answer cannot depend on the order the caller listed paths in. - A truncation is REPORTED, never silent — per entry for
skill_file, so a batch says which of its reads was cut.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 20d ago Changed · +2 lines · +70 tokens per session ffae7ab997a6
- 1mo ago Changed · +13 lines · +252 tokens per session 638361fab629
- 2mo ago First seen · 109 lines · 1,602 tokens per session scan A 2cab1b7d74a8
skill-mcp CLAUDE.md is an instructions file published in the GitHub repository chrischall/skill-mcp (0 stars, last pushed yesterday), licensed MIT. It adds 1,924 tokens to every session, about $0.0077 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other instructions, from other repositories
vscode buildNext.instructions.md
Working notes and architecture documentation for the new esbuild-based build system in build/next. Use when making changes to the new build pipeline (transpile/bundle commands, NLS plugin, source-map handling, resource copying, or self-hosting watch tasks).
next.js AGENTS.md
AGENTS.md instructions for vercel/next.js, covering next.js development guide, codebase structure, monorepo overview, core package: packages/next and other important packages.
vscode oss-third-party-notices.instructions.md
Instructions for microsoft/vscode, covering vs code oss third-party-notices pipeline, architecture, pipeline flow in ci, cache eligibility and rollout and applying the notice (cutover).
langchain AGENTS.md
AGENTS.md instructions for langchain-ai/langchain, covering global development guidelines for the langchain monorepo, corridor security analysis, project architecture and context, monorepo structure and development tools & commands.
vscode copilot-instructions.md
Copilot instructions for microsoft/vscode, covering vs code copilot instructions, project overview, root folders, core architecture (src/ folder) and built-in extensions (extensions/ folder).
deno copilot-instructions.md
Copilot instructions for denoland/deno, covering deno development guide for github copilot, network access, high level overview, key directories and key files to understand first.