MCP Server Builder
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
Package a script tool under ~/.config/agenvoy/tools/script/ into a tar.gz and publish to pkg.agenvoy.com registry.
$ npx skills add agenvoy/Agenvoy --skill extension-upload -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install agenvoy/Agenvoy extension-upload --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/agenvoy/Agenvoy.git skills-src && mkdir -p .claude/skills && cp -r skills-src/extensions/skills/extension-upload .claude/skills/extension-upload && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "extension-upload" agent skill from https://github.com/agenvoy/Agenvoy/tree/master/extensions/skills/extension-upload into .claude/skills/extension-upload/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extension-upload", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/agenvoy/Agenvoy/tree/master/extensions/skills/extension-uploadType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add agenvoy/Agenvoy --skill extension-upload -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install agenvoy/Agenvoy extension-upload --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agenvoy/Agenvoy.git skills-src && mkdir -p .agents/skills && cp -r skills-src/extensions/skills/extension-upload .agents/skills/extension-upload && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "extension-upload" agent skill from https://github.com/agenvoy/Agenvoy/tree/master/extensions/skills/extension-upload into .agents/skills/extension-upload/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extension-upload", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agenvoy/Agenvoy --skill extension-upload -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install agenvoy/Agenvoy extension-upload --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agenvoy/Agenvoy.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/extensions/skills/extension-upload .cursor/skills/extension-upload && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "extension-upload" agent skill from https://github.com/agenvoy/Agenvoy/tree/master/extensions/skills/extension-upload into .cursor/skills/extension-upload/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extension-upload", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/agenvoy/Agenvoy.git --path extensions/skills/extension-upload--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add agenvoy/Agenvoy --skill extension-upload -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install agenvoy/Agenvoy extension-upload --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agenvoy/Agenvoy.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/extensions/skills/extension-upload .gemini/skills/extension-upload && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "extension-upload" agent skill from https://github.com/agenvoy/Agenvoy/tree/master/extensions/skills/extension-upload into .gemini/skills/extension-upload/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extension-upload", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install agenvoy/Agenvoy extension-uploadInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add agenvoy/Agenvoy --skill extension-upload -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/agenvoy/Agenvoy.git skills-src && mkdir -p .github/skills && cp -r skills-src/extensions/skills/extension-upload .github/skills/extension-upload && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "extension-upload" agent skill from https://github.com/agenvoy/Agenvoy/tree/master/extensions/skills/extension-upload into .github/skills/extension-upload/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extension-upload", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agenvoy/Agenvoy --skill extension-upload -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install agenvoy/Agenvoy extension-upload --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agenvoy/Agenvoy.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/extensions/skills/extension-upload .opencode/skills/extension-upload && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "extension-upload" agent skill from https://github.com/agenvoy/Agenvoy/tree/master/extensions/skills/extension-upload into .opencode/skills/extension-upload/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extension-upload", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
extension-uploadPackage a script tool under ~/.config/agenvoy/tools/script/ into a tar.gz and publish to pkg.agenvoy.com registry.
Extension Upload is an agent skill from agenvoy/Agenvoy. Package a script tool under ~/.config/agenvoy/tools/script/ into a tar.gz and publish to pkg.agenvoy.com registry. Keyword picker, dep/key detection, config-stored email (ask + lowercase + persist), ask version, email verification gate, multipart upload with downgrade/unique guards.
Its SKILL.md is about 6.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows. It works with Model Context Protocol. The repository describes itself as: Self-hosted 24/7 personal AI agent that runs on your own machine — memory, schedules, tools and credentials stay local. Single Go binary with MCP. The licence is AGPL-3.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c7ba3b0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
nodegitpython3From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
pkg.agenvoy.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Extension Upload loads about 6.1k tokens when it runs. Until then it costs about 75 tokens; SKILL.md has 2,235 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from agenvoy/Agenvoy at commit c7ba3b0, republished under its AGPL-3.0 licence (© agenvoy). 2,235 words, ~6,085 tokens.
.claude/skills/extension-upload/SKILL.md (or your agent's skills folder).本 Skill 為 Agenvoy 內部最佳化版本,依 Agenvoy 的執行環境撰寫(
run_command的 CWD、~/.config/agenvoy/skills/.system/安裝位置、edit_skill/schedules/find_edit_tool等工具、subagent 與排程的觸發路徑),不保證適配其他 AI harness。
Packages an Agenvoy script tool directory into a marketplace tarball and uploads it to pkg.agenvoy.com. The source root is fixed at ~/.config/agenvoy/tools/script/. If the user provides a keyword (e.g. yt), only matching subdirectories are listed.
keyword (optional): substring filter (case-insensitive) over subdirectories under ~/.config/agenvoy/tools/script/. Examples: yt, dlp, tts.
/extension-upload) → list ALL subdirectories for the user to pick; do not ask for a keywordextension_dir (picker)Fixed source root:
SCRIPT_ROOT=~/.config/agenvoy/tools/scriptfind_files(mode=list) lists all first-level subdirectories under SCRIPT_ROOT (non-recursive). Skip names starting with . or _.
Branch by input:
| Has keyword? | Candidate set |
|---|---|
| No | All subdirectories |
| Yes | Subdirectories whose name (lowercased) contains keyword (lowercased) |
Branch by candidate count:
| Count | Action |
|---|---|
| 0 | Abort. With keyword: "No directory matching <keyword> under SCRIPT_ROOT". Without keyword: "SCRIPT_ROOT is empty — create a script tool first using edit_tool(mode=write)" |
| 1 | Use that directory as extension_dir directly; report "auto-selected <basename>" |
| ≥ 2 | ask_user singleSelect listing all candidates; user picks one as extension_dir |
extension_dir is the absolute path <SCRIPT_ROOT>/<basename>, used by every step below.
Note: this skill only packages script tools (fixed
type: "script"). Packaging api tools requires a separate skill. The worker does not acceptmcptype.
find_files(mode=list, recursive=true) enumerates every file under extension_dir (relative paths).
Collect into raw_files, excluding:
.DS_Store, Thumbs.db, .git**.tar, *.tar.gz, *.tgz, *.zipmanifest.json (this skill will regenerate it)read_files reads (if present):
tool.json (required — if missing, abort with "tool.json missing in <extension_dir>, refuse to package")script.{js,py,sh} / *.js / *.py / *.shCheck root-level files under extension_dir. Abort immediately on any violation:
| Rule | Condition |
|---|---|
| tool.json must exist | extension_dir/tool.json exists and is a regular file |
| script mutual exclusion | script.py and script.js must not coexist (both present → abort) |
Abort message:
❌ Structure check failed: script.py and script.js cannot coexist (keep only one).Fixed type: "script" (this skill only packages tools under ~/.config/agenvoy/tools/script/).
For type: script:
| Rule | Condition |
|---|---|
| script must exist | script.py or script.js must exist (exactly one); both missing → abort |
Abort message:
❌ Structure check failed: type:script requires script.py or script.js.Verify the script can be parsed by its interpreter so consumers don't install something that immediately crashes. Any failure aborts and prints the stderr.
Branch on the script file confirmed in §2.5:
script.py:python3 -m py_compile <extension_dir>/script.pyscript.js:node --check <extension_dir>/script.jsexit code ≠ 0 → abort:
❌ Health check failed: script cannot be parsed by the interpreter.
<first line of stderr>Note: only syntax-level. Top-level code is not executed; import errors / runtime errors / missing API keys are not checked. The author must test runtime behavior before packaging.
dependence and api_key_nameScan every script file for these patterns to extract binaries:
spawn("X" / exec("X" / execSync("X" / spawnSync("X"subprocess.run(["X" / subprocess.Popen(["X" / os.system("X " / shell=True + "X "Exclude:
cd, echo, test, [, export, set, shift, pwd, true, falsenode, python, python3, bash, sh, /usr/bin/envls, cat, head, tail, mkdir, cp, mv, rm, grep, sed, awk, find, jq, which, date, git (almost always present; not counted as a dependence)What remains (e.g. yt-dlp, ffmpeg, imagemagick, pandoc, tesseract) is the dependence candidate set.
Scan every script file for these patterns to extract key names:
find-generic-password -s agenvoy -a ([A-Z][A-Z0-9_]*_API_KEY)secret-tool lookup service agenvoy account ([A-Z][A-Z0-9_]*_API_KEY)process\.env\.([A-Z][A-Z0-9_]*_API_KEY)os\.environ\[["']([A-Z][A-Z0-9_]*_API_KEY)["']\]os\.environ\.get\(["']([A-Z][A-Z0-9_]*_API_KEY)["']\$([A-Z][A-Z0-9_]*_API_KEY) (shell scripts)Dedupe and sort all hits.
Call ask_user. Put the detection list in the detail field (hint-style subtitle); keep question short:
{
"questions": [
{
"question": "Are the detections above correct?",
"detail": "dependence: [yt-dlp, ffmpeg]\napi_key_name: []",
"options": ["Yes, continue", "No, let me edit dependence", "No, let me edit api_key_name", "No, edit both"]
}
]
}detail is multi-line hint text; question is the short prompt. The popup renders detail with hint style (subtitle) and question with bold (title). Never stuff detail content into question — they will render together and become unreadable.
name and summary from tool.jsontool.json is the source of truth for these fields:
manifest.name = tool.json::name verbatimmanifest.summary = first line of tool.json::description, truncated to 120 charsIf either fails §6 validation (name pattern / summary length), §6 handles it with ask_user.
Pre-read <extension_dir>/manifest.json if it exists and use its version as the default; otherwise default to 1.0.0.
ask_user (single free-text):
Enter version (semver `MAJOR.MINOR.PATCH`, e.g. 1.0.0; blank = use default <default>):
default: <existing manifest version or 1.0.0>Reply handling:
| Reply | Action |
|---|---|
| Blank / whitespace-only / empty | Use default as manifest.version — not an error, do not re-prompt |
Matches ^\d+\.\d+\.\d+$ | Accept as-is |
Anything else (incl. v prefix, pre-release like 1.0.0-beta, build metadata +sha, etc.) | Re-prompt; abort after 3 attempts with "version format invalid, upload cancelled" |
Never treat blank as an error — a deliberate blank means "use default".
read_files("~/.config/agenvoy/config.json") → parse JSON → check email field:
ask_user (single free-text):
First publish needs a marketplace registry email (stored in ~/.config/agenvoy/config.json, reused next time):Validate against ^[^@\s]+@[^@\s]+\.[^@\s]+$:
read_files → edit_file(mode=patch) to persist "email": "<lowercased>" into config.json (worker normalizes to lowercase, client must match)The entire username / git config user.name chain is gone — marketplace identity uses email only. The manifest uses the email field (not author); its value is the lowercased pure email string.
Assemble the candidate manifest:
{
"name": "<tool.json::name>",
"type": "script",
"version": "<from §4.5>",
"summary": "<first line of tool.json::description, truncated to 120>",
"email": "<§5.1/5.2 registry email, lowercased>",
"dependence": <confirmed in §3>,
"api_key_name": <confirmed in §3>,
"files": <raw_files from §1>
}Validate field by field; any failure triggers ask_user to fix that field:
| Field | Condition |
|---|---|
name | non-empty, matches ^[a-z0-9][a-z0-9_-]*$ |
type | ∈ {api, script} (worker rejects mcp) |
version | strict semver ^\d+\.\d+\.\d+$ (no pre-release suffix) |
summary | non-empty, ≤ 120 chars |
email | non-empty, matches ^[^@\s]+@[^@\s]+\.[^@\s]+$ (already guaranteed by §5) |
dependence | array, elements non-empty (empty array OK) |
api_key_name | array, each element matches [A-Z][A-Z0-9_]*_API_KEY (empty array OK) |
files | array, length ≥ 1, must include tool.json |
Re-validate after each fix; only proceed once everything passes.
Fixed output directory: ~/.config/agenvoy/tools/.extension/.package/ — not $HOME/Downloads, not ~/.config/agenvoy/download/, not the current work dir, not the source dir.
Fixed filename format: <name>@<version>.tar.gz (e.g. yt-dlp-info@1.0.0.tar.gz).
edit_file(mode=write):
<extension_dir>/manifest.jsonrun_command:
mkdir -p ~/.config/agenvoy/tools/.extension/.packagetar --no-xattrs -czf ~/.config/agenvoy/tools/.extension/.package/<name>@<version>.tar.gz -C <extension_dir>/.. <basename(extension_dir)>/Where <basename> is the last segment of extension_dir (e.g. yt_dlp_youtube_downloader).
--no-xattrs: mandatory. macOS bsdtar tries to read xattrs (e.g. com.apple.quarantine) by default; the sandbox can't read them and prints "Operation not permitted" warnings. Marketplace packages shouldn't carry OS-local metadata anyway.-C <parent>: points to the parent so the tarball stores <basename>/<file>... rather than absolute paths.run_command returns a merged stdout+stderr string to the LLM. The LLM cannot see the exit code by itself, and must not guess from stderr substrings like "not permitted" / "error" / "warning". tar can print xattr/ACL warnings yet still exit 0 with a valid tarball.
The only reliable check:
ls -l ~/.config/agenvoy/tools/.extension/.package/<name>@<version>.tar.gz| ls result | Verdict |
|---|---|
| File exists, size > 0 bytes | Packaging succeeded. Record the size, proceed to §8. Ignore every stderr warning from the tar step. |
No such file or directory or size 0 | Actually failed. Print the tar stderr to the user and abort. |
Do not branch on "stderr contains a warning → failure". A tarball on disk = success.
If tar is blocked, tell the user:
⚠️ tar is blocked. Check whether it is listed under denied_command in ~/.agenvoy/config.json.Fixed endpoint: https://pkg.agenvoy.com/upload — it is not configurable.
manifest.email is the registration email (pure email string); keep it for the §9 report. read_files <extension_dir>/manifest.json to obtain the full JSON string for fields.manifest below (the worker will JSON.parse(manifest) and re-validate).
Call http_request. All four fields are required (url / method / content_type / body); missing any one of them and the worker returns multipart parse failed:
{
"url": "https://pkg.agenvoy.com/upload",
"method": "POST",
"content_type": "multipart",
"body": {
"fields": {
"manifest": "<full JSON string written in §7>"
},
"files": [
{
"name": "tar",
"path": "~/.config/agenvoy/tools/.extension/.package/<name>@<version>.tar.gz",
"content_type": "application/gzip"
}
]
}
}Do not simplify the payload:
content_type: "multipart" (defaults to json, worker won't see multipart, fails)body (must contain both fields and files)files[] (manifest is a text field, goes under fields.manifest)fields (tar is binary, goes under files[].path and is read from disk by the handler)Response is the http_request envelope: {status_code, headers, body}. status_code is the only branching signal — do not guess from the body string.
| status_code | Expected body | Action |
|---|---|---|
| 202 | {"ok":false,"error":"verification_sent","email":"...","ttl_seconds":60} | Proceed to §8.2 |
| 400 | schema error | Abort, print the error in the body |
| 413 | tar_too_large | Abort |
| 502 | email_send_failed | Abort |
| Other | Shouldn't happen on first POST without a code (always expect 202) | Abort, print the raw body |
ask_user (single free-text):
A verification code was sent to <email> (valid 60s). Enter the 6-digit code:If blank or not 6 digits → re-prompt up to 3 times; abort with "verification code format invalid, upload cancelled".
Collect the code with ask_user; guessing / pre-fill / popupSecret are not substitutes — the code is not a secret, expires in 60s, and plaintext echo helps the user paste it correctly.
Call http_request — same four-field structure as §8.1, only difference is fields now also has code:
{
"url": "https://pkg.agenvoy.com/upload",
"method": "POST",
"content_type": "multipart",
"body": {
"fields": {
"manifest": "<same as 8.1>",
"code": "<6-digit code>"
},
"files": [
{
"name": "tar",
"path": "<same as 8.1>",
"content_type": "application/gzip"
}
]
}
}| status_code | Action |
|---|---|
| 200 | Success — parse body for r2_key / sha256 / size_bytes, proceed to §9 |
| 401 | verification_failed (wrong / expired) → loop back to §8.2; abort after 3 retries |
| 409 | version_already_exists or type_mismatch → abort, print body existing info, ask user to bump version or align type |
| 422 | downgrade_not_allowed → abort, print body latest, ask user to bump version |
| 413 | tar_too_large → abort |
| 5xx | internal / email_send_failed → abort, print raw body |
| Other | Abort, print raw body |
Success (§8.3 returned 200):
✅ packaged & published
- manifest: <extension_dir>/manifest.json
- tarball: ~/.config/agenvoy/tools/.extension/.package/<name>@<version>.tar.gz
- size: <bytes>
- registry: pkg.agenvoy.com
- r2_key: <body.r2_key>
- sha256: <body.sha256>size was captured by ls in §7.5 — do not re-run.
Upload-stage failure (§8.1 / §8.2 / §8.3) → show ✅ packaged plus ❌ publish failed with the worker error; the local tarball stays in .package/ so the user can fix and retry.
§7.5 disk-verify failure (tarball missing or size 0) → show ❌ packaging failed with the tar stderr; do not proceed to §8.
email; it must come from config.json (and §5.1 ask_user + edit_file(mode=patch) if missing)git config user.name / git config user.email; marketplace identity uses only the config registry emailauthor field in the manifest; the worker expects email (a pure email string, not <name> (<email>))<safe-author> / <email-local> prefix; the filename is just <name>@<version>.tar.gz with no prefixdependence / api_key_name that weren't detected in the scripts; the user can add them in §3, but the LLM must not embellishmanifest.json itself in the files array (the marketplace client fetches the manifest separately)-C <parent> in §7 — the tarball would contain absolute paths otherwise--no-xattrs in §7 — macOS sandbox can't read xattrs and would flood warningsls -l <tarball> is the only success checkrun_command returns merged stdout+stderr and the LLM has no exit code — disk state is the source of truth✅ packaged and ❌ publish failed while stopping at the packaging step — that's a contradiction; once §7.5 passes, packaging succeeded and §8 must run~/Downloads, ~/.config/agenvoy/download/, the source dir, tmp, or any path from ask_user; the output location is fixed at ~/.config/agenvoy/tools/.extension/.package/<safe-author>- / <email-local>- to the filename; fixed <name>@<version>.tar.gzzip for tar.gz (the marketplace only accepts tar.gz)1.0, v1.0.0, 1.0.0-beta etc.extension_dir; the source root is fixed at ~/.config/agenvoy/tools/script/ — do not scan .extension/ / api/ / anywhere elseask_user — list all subdirectories directly (the user explicitly wants to browse everything)type:script; §2 type is fixedpy_compile / node --check in §2.7 with "run the whole script" — top-level reads on stdin would hangname and summary in §4 come from tool.json; §6 handles the validation fallbackversion in the main flow — do not hardcode 1.0.0 or rely on §6 fallbackv prefix, pre-release suffix, or build metadata (+sha) in §4.5; strict ^\d+\.\d+\.\d+$https://pkg.agenvoy.com/upload; staging / custom domains are not optionspopupSecret to collect the code in §8.2; the code is not a secret, expires in 60s, plaintext echo helps the user paste itrun_command with curl / wget; uploads must use http_request with content_type=multipart, binary read from files[].pathhttp_request payload — all four fields (url/method/content_type/body) are required, and body must contain both fields and filescontent_type: "multipart" (defaults to json, worker won't see multipart)files[] (it's a text field, goes under fields.manifest); never put tar bytes into fields (binary goes under files[].path and the handler reads from disk)status_code; use the http_request envelope status_code as the only branch signal</content>
</invoke>
© agenvoy, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in extensions/skills/extension-upload of agenvoy/Agenvoy.
Open the folder on GitHubat commit c7ba3b0
Extension Upload next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Extension Upload this skillagenvoy/Agenvoy | 439 | — | ~6.1k | Automated safety check: Pass | AGPL-3.0 | |
| MCP Server Builderanthropics/skills | 180k | 63 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 4 repos | ~1.2k | Automated safety check: Pass | MIT | |
| MCP Integration for Pluginsanthropics/claude-plugins-official | 38k | 11 repos | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| MemPalace Memory SearchMemPalace/mempalace | 60k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Crush Configurationcharmbracelet/crush | 29k | — | ~3.7k | Automated safety check: Pass | Custom licence |
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
anthropics/claude-plugins-official
Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.
MemPalace/mempalace
Mines project files and conversation exports into a local, searchable memory palace and recalls past work by semantic search through the mempalace CLI.
charmbracelet/crush
Explains how to configure the Crush coding agent with crushrc or crush.json, covering providers, models, LSPs, MCP servers, hooks, permissions and config precedence.
mksglu/context-mode
Routes large command, file, API and browser output through context-mode tools so only the needed result enters the agent's context, instead of dumping it via Bash.
agenvoy/Agenvoy
建立並排程定時觸發的 skill。所有新增定時/週期任務、提醒、排程通知的請求必須走此 skill,禁止直接呼叫 schedules(mode=write)(那是 skill 已存在時的時間綁定工具,不該作為新建排程的入口)。
agenvoy/Agenvoy
Create, edit, improve, or audit AgentSkills. An agent skill from agenvoy/Agenvoy.
agenvoy/Agenvoy
Install an Agenvoy extension from pkg.agenvoy.com registry (browse/pick) or local tarball into ~/.config/agenvoy/tools/.extension/<type/<name@<version/.
Works with
Categories
Package a script tool under ~/.config/agenvoy/tools/script/ into a tar.gz and publish to pkg.agenvoy.com registry. Extension Upload is an agent skill from agenvoy/Agenvoy.com registry.
Extension Upload fits situations like: agent Workflows work in your project.
Run `npx skills add agenvoy/Agenvoy --skill extension-upload -a claude-code`. Or copy the skill folder (extensions/skills/extension-upload in agenvoy/Agenvoy) into .claude/skills/extension-upload in your project. Claude Code loads it when a task matches its description.
Run `npx skills add agenvoy/Agenvoy --skill extension-upload -a codex`. Or copy the skill folder (extensions/skills/extension-upload in agenvoy/Agenvoy) into .agents/skills/extension-upload in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add agenvoy/Agenvoy --skill extension-upload -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/extension-upload, .gemini/skills/extension-upload, .github/skills/extension-upload and .opencode/skills/extension-upload in your project.
Going by SKILL.md and its folder, Extension Upload needs the command-line tools its instructions call (node, git and python3). Our summary lists: Python 3.
SKILL.md names 1 domain. In commands or code: pkg.agenvoy.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Extension Upload is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.1k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Extension Upload: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), MCP Integration for Plugins (anthropics/claude-plugins-official, 38k stars) and MemPalace Memory Search (MemPalace/mempalace, 60k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
agenvoy (a GitHub organization) maintains it in agenvoy/Agenvoy, which has 439 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 10, 2026.
Source: agenvoy/Agenvoy on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.