skill-mcp: Instructions file for Claude Code

CLAUDE.md

skill-mcp CLAUDE.md is an instructions file for Claude Code from chrischall/skill-mcp. It costs 1,924 tokens per session, scanned A, original, MIT.

Repository instructions for the skill-mcp project. They describe an MCP server that lists agent skills, provides their instructions and files, and runs approved skill scripts.

In plain words
What is it for?
Understanding the server's tools and operating modes, following its build and test commands, and avoiding changes that weaken its documented invariants.
Why use it?
They give a coding agent the project-specific rules and tested assumptions needed to modify or review the repository safely.

Instructions file for Claude Code

Written for Claude Code: the file is CLAUDE.md. Also seen: reads .claude/ paths; mentions CLAUDE.md.

This is chrischall/skill-mcp's own configuration. It tells Claude Code how to work on skill-mcp itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything skill-mcp configures →

Reuse

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.

Copy the file
curl -O https://raw.githubusercontent.com/chrischall/skill-mcp/main/CLAUDE.md
Clone the repo
git clone --depth 1 https://github.com/chrischall/skill-mcp

Made for: Claude Code.

Wrote 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.

agentmods badge for skill-mcp CLAUDE.md

README.md
[![agentmods](https://agentmods.dev/badge/instructions/chrischall/skill-mcp/claude-md/github.svg)](https://agentmods.dev/instructions/chrischall/skill-mcp/claude-md)
Your own site
<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.

agentmods 80×15 button for skill-mcp CLAUDE.md

Your own site · 80×15
<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>
Per session 1,924 This file is loaded in full into every session.
When invoked 1,924 The same file — it is already loaded in full.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 20d ago against content hash ffae7ab997a6, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

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.

Origin

Copies of this mod

1 near-identical copy found in the catalogue:

CLAUDE.md · 124 lines

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). A name: that disagrees is reported as name-mismatch and 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_RUN is 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 on basename(skill.dir) — the second line under the rule above — and the map key is NUL-separated, written as the \0 ESCAPE. Never a literal NUL byte in source: it makes git treat the file as binary, which is how this module once shipped as Bin 5859 -> 6511 bytes with 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 from SKILLS_DIR alone — a registration's plain env can carry SKILLS_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 in src/index.ts, chrischall/fleet-audit#244). Without it a script reads every credential in the registration from /proc/<ppid>/environ, which is the ORIGINAL execve block, not process.env. Every variable is re-homed (assigned to itself, so setenv copies it to the heap) BEFORE the block is zeroed through /proc/self/mem — reverse that order and getenv reads zeros. It never throws and the server always boots; a refusal is a stderr line, and HOSTED it also refuses every skill_run and lists environ-unscrubbed in skill_list (src/deps.ts) unless the owner sets MCP_SKILL_ALLOW_UNSCRUBBED=1. Standalone stays open. tests/scrub-environ.test.ts proves 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; then realpath and a containment check against the skill's own realpath'd directory; then lstat, 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, so readFile followed by a slice bounds the frame and kills the server. stat for the real size, then read at most maxBytes + 1 — the one extra byte is what decides truncated without a second syscall.
  • Caps are stated, not discovered. MAX_SKILLS 32, MAX_FILES_PER_SKILL 2000, MAX_DIRS_PER_SKILL 2000, MAX_SKILL_MD_BYTES 256 KiB, MAX_FRONTMATTER_BYTES 64 KiB, MAX_FILE_BYTES 1 MiB, MAX_FILE_PATHS 8 and MAX_BATCH_BYTES 4 MiB for one skill_file call, MAX_STREAM_BYTES 1 MiB and MAX_TIMEOUT_MS 300 s for a run, MAX_RESOURCES 500. A batch's total is decided from stat BEFORE a byte is read, summing min(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.

Read the full file on GitHub · 124 lines

Changes

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.

  1. 20d ago Changed · +2 lines · +70 tokens per session ffae7ab997a6
  2. 1mo ago Changed · +13 lines · +252 tokens per session 638361fab629
  3. 2mo ago First seen · 109 lines · 1,602 tokens per session scan A 2cab1b7d74a8

Subscribe to this mod's changes

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.

Related

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).

microsoft/vscode · 9,715 tokens

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.

vercel/next.js · 7,461 tokens

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).

microsoft/vscode · 5,262 tokens

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.

langchain-ai/langchain · 4,680 tokens

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).

microsoft/vscode · 2,750 tokens

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.

denoland/deno · 3,077 tokens