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.svg" alt="Measured on agentmods" 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.01602 | $0.01602 |
| Opus 5 | $0.00801 | $0.00801 |
| Sonnet 5 | $0.00320 | $0.00320 |
| Haiku 4.5 | $0.00160 | $0.00160 |
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 6d 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.
How it starts
The opening of the file, as written. The whole thing — 109 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[], confirm |
{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. - 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_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.
- 6d 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 2d ago), licensed MIT. It adds 1,602 tokens to every session, about $0.0080 per session on Opus 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
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.
codex AGENTS.md
AGENTS.md instructions for openai/codex, covering rust/codex-rs, the codex-core crate, code review rules, crate api surface and model visible context.
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).
vscode oss-third-party-notices.instructions.md
Instructions for microsoft/vscode, covering vs code oss third-party-notices pipeline, architecture, pipeline flow in ci, applying the notice (cutover) and fallback chain (never fail the build).
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.
spec-kit AGENTS.md
AGENTS.md instructions for github/spec-kit, covering agents.md, about spec kit and specify, quickstart — add a new integration in 5 steps, integration architecture and integrationmanifest — file tracking.