Distro Skills is a registry: every skill published there lives as a story with its canonical SKILL.md tucked inside a fenced code block. Getting one into your own Claude has always meant a small amount of clerical work – find the story, pull the markdown, extract the block, make a folder, zip it, upload it through Settings.
distro-skill-adder collapses that into a sentence. Ask Claude to get a named skill from Distro Skills and it finds the story, extracts the SKILL.md, shows you what it found, and hands back a .skill file with a Save skill button attached. One click installs it.
It's the mirror image of distro-skill-publish: that one puts skills onto the registry, this one takes them off.
What you'll need
The Distro Reader MCP or the Distro Publisher MCP connected to your Claude. Either one exposes the two tools the skill uses – distro_content_list and distro_content_to_markdown. If neither is connected, the skill says so and stops rather than improvising.
What it does
- Reads a skill name out of your request, however you phrase it – kebab-case identifier, story title, or an informal reference like "the email ingest one"
- Searches Distro Skills (publication 114) and matches on the canonical
name:field first, falling back to title and preview matching - Extracts the SKILL.md from the story's fenced block with a regex that tolerates both three- and four-backtick fences, since Distro's editor normalizes fence width based on what's inside
- Shows you a confirmation card – name, title, description excerpt, size, source URL – before anything gets packaged, so a wrong match gets caught before it becomes an install
- Stages the file in a correctly named folder and packages it with skill-creator's
package_skill.py - Presents the
.skillfile so Claude Desktop's native Save skill button appears - Handles the awkward cases: no match found (it lists what's actually there), multiple matches (it asks), malformed frontmatter (it stops), a story in the older canonical-body-only format (it falls back gracefully)
Install the skill
Ask Claude:
"Please fetch the distro-skill-adder skill from Distro Skills and give me a
.skillfile I can install."
Claude will pull this story, extract the SKILL.md from the fenced block below, and package it as distro-skill-adder.skill. The file will appear in your chat with a Save skill button – click it to install directly. That registers the skill with your Claude app so it shows up in your skills list and triggers on matching requests.
Requires the Distro Reader or Distro Publisher MCP connected so Claude can pull the story. Distro Skills is a public newslode, so no subscription is needed.
There's a chicken-and-egg problem here, of course: fetching this skill the easy way requires the skill you're trying to install. If you don't have it yet, use one of the paths below.
Claude Code users: you have a direct path – ask Claude to drop the unzipped folder into ~/.claude/skills/distro-skill-adder/ and restart the session. No packaging step needed.
No Distro MCP connected? Copy the SKILL.md contents from the fenced block below into a file called SKILL.md inside a folder called distro-skill-adder, zip it (folder as zip root), and upload through Settings → Capabilities → Skills → Upload skill.
The skill source
This is the canonical SKILL.md:
---
name: distro-skill-adder
description: Use this skill whenever the user asks to install, add, fetch, pull, or get a Claude skill from the Distro Skills newslode. Triggers on phrases like "install the [name] skill from Distro Skills", "please get the [name] skill from the Distro Skills newslode and install it", "add the [name] skill", "fetch the [name] skill", or any request pairing install/add/fetch/get/save with a skill name and Distro Skills (or just a skill name when the conversation context makes Distro Skills the obvious source). Pulls the named skill from publication ID 114, extracts its canonical SKILL.md from the fenced code block, packages it as a .skill file, and presents it so Claude Desktop's native Save skill button appears for one-click install. Apply this skill eagerly — if the user mentions installing or adding a Claude skill and doesn't specify a source, assume Distro Skills and proceed. Better to propose the right skill and have the user correct you than to ask clarifying questions when the intent is clear.
---
# Distro skill-adder skill
Fetch a named Claude skill from the Distro Skills newslode (publication ID 114), extract the canonical SKILL.md, package it as a `.skill` file, and present it to the user so Claude Desktop surfaces its native **Save skill** button for one-click install.
## Scope
This skill pulls ONLY from Distro Skills (pub 114). If the user asks to install from a different Distro newslode, decline and explain this skill is specifically for the Distro Skills registry — they can use `distro_content_to_markdown` directly on any other story if they have a specific source in mind.
## Prerequisites
The user's Claude must have the **Distro Reader MCP** or **Distro Publisher MCP** connected. Both expose `distro_content_list` and `distro_content_to_markdown`, which are the two tools this skill needs. If neither is connected, tell the user that and stop — don't try to work around it.
## Workflow
### Step 1 — Identify the requested skill
Read the user's message to extract the skill name. Names are kebab-case identifiers (e.g., `brads-voice`, `distro-email-ingest`, `distro-link-post`, `distro-skill-publish`). Users may also refer to skills by their story title ("Brad's voice skill") or informally ("the email ingest one"). Normalize to the kebab-case `name:` as used in the skill's frontmatter.
If the request is ambiguous (the user just says "install a skill" with no name), ask which one. Offer to list what's on Distro Skills via `distro_content_list` filtered to pub 114.
### Step 2 — Find the matching story on Distro Skills
Call `distro_content_list` with `publicationId: 114` and a generous `limit` (20 is fine). Scan the returned articles for one whose title or body matches the requested skill name.
Match priority:
1. Exact match on the kebab-case `name:` in the story body (most reliable — that's the canonical identifier)
2. Fuzzy match on title (e.g., "brads-voice" → "Brad's voice skill")
3. Substring match on title or preview
If zero matches: tell the user the skill isn't on Distro Skills. Offer to list what is available.
If multiple matches: show the user each candidate with its title, preview, and contentId. Ask which one to install.
If exactly one match: proceed to Step 3.
### Step 3 — Fetch the story and show a summary for confirmation
Call `distro_content_to_markdown` with the matched `contentId`. Extract the canonical SKILL.md from the first fenced code block using this regex:
```python
import re
FENCE = re.compile(r"^(`{3,})(markdown)?\n(.*?)\n\1\s*quot;, re.DOTALL | re.MULTILINE)
match = FENCE.search(story_body)
skill_md = match.group(3)
```
The fence may be three or four backticks depending on whether the SKILL.md contains inner triple-backtick blocks — Distro's Tiptap converter normalizes based on inner content. The regex tolerates both widths.
Parse the frontmatter to extract `name:` and `description:` fields. Then show the user a summary BEFORE packaging:
```
Skill found on Distro Skills:
**Name:** <kebab-case name from frontmatter>
**Title:** <story title>
**Description:** <first sentence or two of the description field>
**Size:** <N> lines, <N> characters
**Source:** https://app.distro.media/stories/<contentId>
Ready to package this as a .skill file for install?
```
Wait for user confirmation. Do not skip this step even if the install request was unambiguous — the summary is a safety check that lets the user catch wrong matches before a file gets installed.
### Step 4 — Stage and package
After confirmation, stage the SKILL.md in a properly-named folder:
```bash
mkdir -p /home/claude/<skill-name>
```
Write the extracted SKILL.md verbatim to `/home/claude/<skill-name>/SKILL.md`. The folder name MUST match the frontmatter `name:` field — this is how Claude Desktop identifies the skill and how the Save skill button decides whether it's a new install or an update.
Then package with `skill-creator`'s `package_skill.py`. Copy the scripts into a writable location first (the skill-creator mount is read-only):
```bash
mkdir -p /home/claude/scripts
touch /home/claude/scripts/__init__.py
cp /mnt/skills/examples/skill-creator/scripts/package_skill.py /home/claude/scripts/
cp /mnt/skills/examples/skill-creator/scripts/utils.py /home/claude/scripts/
cp /mnt/skills/examples/skill-creator/scripts/quick_validate.py /home/claude/scripts/
cd /home/claude && python -m scripts.package_skill <skill-name>
```
This produces `/home/claude/<skill-name>.skill`. Move it to `/mnt/user-data/outputs/` and present it via `present_files`.
### Step 5 — Present the .skill file and next steps
Call `present_files` with the path to the `.skill` file. The file will render in chat with a **Save skill** button.
Tell the user briefly:
- The skill file is ready
- Click **Save skill** to install directly; if it's already installed, the UI will offer to update
- If a new install, the skill will show up in Settings → Capabilities → Skills and will trigger based on its description
- No need to restart — the skill is active on the next matching request
Do not claim the skill is "installed" before the user clicks Save skill. The skill's job ends at presenting the file; the install is the user's click.
## Edge cases
### Skill not found
If the user requests a skill that isn't on Distro Skills, do not fabricate or approximate. Tell them plainly the skill isn't there, list what is available (via `distro_content_list` on pub 114), and let them decide.
### Fence extraction fails
If the regex returns no match, the story may not be in the unified format (an older canonical-body-only story, for instance). Fall back to treating the entire story body as the SKILL.md IF it starts with `---\n` YAML frontmatter. If that also fails, tell the user the story doesn't appear to be in an installable format and stop — don't try to reconstruct it.
### Malformed frontmatter
Before packaging, verify the extracted content starts with `---\n`, has a closing `---\n`, and contains at least `name:` and `description:` fields. If validation fails, flag it to the user and stop.
### User wants to install from a non-Distro-Skills source
Decline and explain: this skill is specifically for the Distro Skills registry. For ad-hoc installs from other newslodes or arbitrary URLs, the user can ask Claude to do it manually without this skill.
## Examples
### Example 1 — standard install
**User:** "Please get the brads-voice skill from Distro Skills newslode and install it."
**Claude:**
1. `distro_content_list(publicationId: 114, limit: 20)` → finds story 831 "Brad's voice skill"
2. `distro_content_to_markdown(contentId: 831)` → gets story body
3. Regex-extracts SKILL.md from the fenced block
4. Shows summary: name `brads-voice`, title "Brad's voice skill", description excerpt, size, source URL
5. User confirms
6. Stages `/home/claude/brads-voice/SKILL.md`, packages with `package_skill.py`
7. Presents `/mnt/user-data/outputs/brads-voice.skill` via `present_files`
8. Tells user: click Save skill to install
### Example 2 — ambiguous name
**User:** "Install the email skill from Distro Skills."
**Claude:** `distro_content_list` returns exactly one match (`distro-email-ingest`) — proceeds with that one, noting the match in the summary. If there were multiple, Claude would ask which.
### Example 3 — skill not found
**User:** "Install the meeting-notes skill from Distro Skills."
**Claude:** Lists what's on Distro Skills (brads-voice, distro-email-ingest, distro-link-post, distro-skill-publish) and tells the user the meeting-notes skill isn't among them.
## Distro tool quirks to remember
- `distro_content_list` with `publicationId: 114` is the right call — private newslodes need `publication_list` to discover, but `content_list` works fine once you have the ID.
- `distro_content_to_markdown` returns the body with HTML-to-markdown conversion already applied; the fenced code block survives the round-trip but its backtick count may normalize (3 or 4, depending on inner content).
- The `package_skill.py` script from skill-creator lives at `/mnt/skills/examples/skill-creator/scripts/`, which is read-only. Copy the scripts (`package_skill.py`, `utils.py`, `quick_validate.py`) into `/home/claude/scripts/` and run with `python -m scripts.package_skill <folder-name>`.
## When not to use this skill
- **Publishing a skill to Distro** — use `distro-skill-publish` instead.
- **Installing a skill from a local file or uploaded zip** — just run `package_skill.py` on it directly; no Distro fetch needed.
- **Installing from a non-Distro-Skills newslode** — out of scope; this skill is specifically for the Distro Skills registry at pub 114.
- **"Activating" or "toggling" an already-installed skill** — that's a Settings UI action, not something this skill does.
When to use
- You want a skill that's published on Distro Skills installed in your own Claude
- Someone tells you a skill name and you want it without hunting through the newslode
- You're rebuilding a Claude setup and want to pull several skills back down
When not to use
- Publishing a skill to Distro – that's
distro-skill-publish - Installing from a local file or an uploaded zip – run
package_skill.pyon it directly, no Distro fetch involved - Installing from a newslode other than Distro Skills – out of scope by design; ask Claude to do it manually
- Turning an already-installed skill on or off – that's a Settings UI action
Feedback
This is v1.0.0. Edge cases or suggestions → reply or ping Brad Keoun.