Install and deploy Claude Code skills from URLs with minimal interaction. Use this skill whenever a user provides a URL to a skill and wants to install it, deploy it, import it, or add it. Trigger on phrases like "install this skill", "import skill from", "deploy skill", "add this skill", or any message containing a GitHub URL pointing to a skill directory or a .skill file URL. Also trigger when users say "get this skill" or paste a URL and say something like "use this" or "set this up".
Install Claude Code skills from URLs in one step. The user gives you a URL, you handle the rest.
https://github.com/org/repo/tree/main/skills/my-skillhttps://github.com/org/repo/blob/main/skills/my-skill/SKILL.md.skill file URL — a direct link to a .skill zip file.skill file path — a path on disk to a .skill zipEvery Bash tool call requires a user confirmation. The entire deployment — discovery, download, directory creation, and validation — must happen in a single Bash command so the user only confirms once. This is the core UX requirement of this skill.
Determine the URL type and extract owner, repo, branch, and path from the URL mentally — no Bash call required.
https://github.com/{owner}/{repo}/tree/{branch}/{path}https://github.com/{owner}/{repo}/blob/{branch}/{path} — walk up to the directory containing SKILL.md.skill file — a zip archive to download and extractCombine discovery, directory creation, downloading, and validation into one chained shell command. Wrap everything in bash -c '...' to avoid zsh compatibility issues.
For GitHub URLs, use the recursive tree API to discover all files in one API call, then download each:
bash -c 'OWNER="owner" REPO="repo" BRANCH="main" SPATH="skills/my-skill" DEST="$HOME/.claude/skills/my-skill" && mkdir -p "$DEST" && gh api "repos/$OWNER/$REPO/git/trees/$BRANCH?recursive=1" --jq ".tree[] | select(.path | startswith(\"$SPATH/\")) | select(.type==\"blob\") | .path" | while read -r fpath; do rel="${fpath#$SPATH/}"; dir="$(dirname "$rel")"; [ "$dir" != "." ] && mkdir -p "$DEST/$dir"; gh api "repos/$OWNER/$REPO/contents/$fpath" --jq ".content" | base64 -d > "$DEST/$rel" && echo " $rel"; done && if [ -f "$DEST/SKILL.md" ] && head -1 "$DEST/SKILL.md" | grep -q "^---"; then echo "Installed: my-skill → $DEST ($(find "$DEST" -type f | wc -l | tr -d " ") files)"; else echo "Warning: SKILL.md missing or invalid frontmatter"; fi'
Key details about this pattern:
bash -c '...' ensures bash compatibility regardless of the user's shellgit/trees/BRANCH?recursive=1) discovers ALL files in a single API call — no need to recurse into subdirectories manuallyselect(.path | startswith(...)) to get only files under the skill's pathdirname + mkdir -p creates subdirectories as neededFor .skill zip files:
bash -c 'curl -L -o /tmp/skill.zip "{url}" && unzip -o /tmp/skill.zip -d ~/.claude/skills/ && echo "Installed"'
Install to: ~/.claude/skills/{skill-name}/
The skill name comes from the directory name in the source repo (for GitHub URLs) or the top-level directory inside the zip (for .skill files).
If the skill already exists at that location, tell the user and ask whether to overwrite before proceeding — this is the only question you should ever ask.
After the single command completes, report:
Keep the output concise. The whole point of this skill is speed and minimal friction.
main: The URL parser handles any branch name in the tree/blob URL format.gh CLI not available: Fall back to curl with the GitHub raw content API (raw.githubusercontent.com). This won't need authentication for public repos.gh CLI handles auth automatically if the user is logged in. If it fails, suggest gh auth login.