AI Avatar Video
aiskillstore/marketplace
Create AI avatar and talking head videos via inference.sh CLI.
Shared helper that routes ALL paid media generation (FAL image/video, ElevenLabs music) through the GooseWorks proxies so every call bills the Ads agent — never a provider SDK's default host.
$ npx skills add gooseworks-ai/goose-skills --skill media-proxy -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install gooseworks-ai/goose-skills media-proxy --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/gooseworks-ai/goose-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/ads/capabilities/media-proxy .claude/skills/media-proxy && 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 "media-proxy" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/media-proxy into .claude/skills/media-proxy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media-proxy", 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/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/media-proxyType 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 gooseworks-ai/goose-skills --skill media-proxy -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install gooseworks-ai/goose-skills media-proxy --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/ads/capabilities/media-proxy .agents/skills/media-proxy && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "media-proxy" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/media-proxy into .agents/skills/media-proxy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media-proxy", 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 gooseworks-ai/goose-skills --skill media-proxy -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install gooseworks-ai/goose-skills media-proxy --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/ads/capabilities/media-proxy .cursor/skills/media-proxy && 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 "media-proxy" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/media-proxy into .cursor/skills/media-proxy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media-proxy", 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/gooseworks-ai/goose-skills.git --path skills/ads/capabilities/media-proxy--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 gooseworks-ai/goose-skills --skill media-proxy -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install gooseworks-ai/goose-skills media-proxy --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/ads/capabilities/media-proxy .gemini/skills/media-proxy && 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 "media-proxy" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/media-proxy into .gemini/skills/media-proxy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media-proxy", 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 gooseworks-ai/goose-skills media-proxyInstalls 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 gooseworks-ai/goose-skills --skill media-proxy -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/ads/capabilities/media-proxy .github/skills/media-proxy && 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 "media-proxy" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/media-proxy into .github/skills/media-proxy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media-proxy", 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 gooseworks-ai/goose-skills --skill media-proxy -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install gooseworks-ai/goose-skills media-proxy --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/ads/capabilities/media-proxy .opencode/skills/media-proxy && 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 "media-proxy" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/media-proxy into .opencode/skills/media-proxy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media-proxy", 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.
media-proxyShared helper that routes ALL paid media generation (FAL image/video, ElevenLabs music) through the GooseWorks proxies so every call bills the Ads agent — never a provider SDK's default host.
Media Proxy is an agent skill from gooseworks-ai/goose-skills. Shared helper that routes ALL paid media generation (FAL image/video, ElevenLabs music) through the GooseWorks proxies so every call bills the Ads agent — never a provider SDK's default host. Host-swaps the FAL queue URLs, loads the agent token from the sandbox env (GWMEDIAPROXYTOKEN) or ~/.gooseworks/credentials.json, and returns the result CDN URL. Every video-ad media capability imports this; templates never call a provider directly.
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts (for example `scripts/media_proxy.py`, `scripts/resume.py` and `skill.meta.json`).
It sits in Media & Creative, covering Text to speech and voice and Paid advertising. It works with ElevenLabs. The repository describes itself as: Library of Growth & GTM skills + data APIs for Claude Code, Codex, Cursor to run ads, social, content, lead gen, seo and data scraping. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit c650c6d. 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.
Ships 2 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GW_MEDIA_PROXY_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Media Proxy loads about 3.3k tokens when it runs. Until then it costs about 114 tokens; SKILL.md has 1,516 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); the scripts in this folder are not scanned.
The full file from gooseworks-ai/goose-skills at commit c650c6d, republished under its MIT licence (© gooseworks-ai). 1,516 words, ~3,309 tokens.
.claude/skills/media-proxy/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.The foundation capability for paid media in the video-ad pipeline. It fixes the
auth-path conflict where engine scripts called FAL/ElevenLabs directly (billing
the wrong account): all paid calls now go through
<api_base>/api/internal/{fal-proxy,elevenlabs-proxy} with ?token=&agent_id=, which
bills the Ads agent.
A FAL submit BILLS immediately, but the local backend can blip during a multi-minute render. Two built-in protections (automatic for every capability that imports this):
Poll-through-outage — _fal_run's poll loop re-attaches to the same status/result
URL through connection refused / timeout blips instead of crashing.
Persist + resume — each submit's request_id + poll URLs are written to
~/.gooseworks/pending-fal-jobs/. If the poller still dies, re-attach instead of
re-firing (re-firing double-bills): resume_fal(request_id) in Python, or the CLI:
resume.py --list # resumable (submitted, unfinished) jobs
resume.py --request-id <id> --out final.mp4 # poll to completion + downloadresume_fal NEVER re-submits, so it can't double-charge.
Poll timeout never resubmits (GOOSE-3729) — polling gives up after
default_poll_timeout(model): 1800s for video / lipsync / audio-driven models,
600s for images (GW_FAL_POLL_TIMEOUT_S overrides; timeout_s= per call). A timeout
raises FalPollTimeout carrying .request_id + .model_path — the job is still
running and already paid for. Re-attach with resume_fal(e.request_id); never call
fal_generate* again for it (a veed/fabric lipsync once finished 26s after a 600s
poller quit, and the retry paid for a second identical job).
Proxy dedupe back-stop — the fal proxy returns the already-running job for an
identical submit (same agent + model + body) within 30 min, so an accidental
resubmit re-attaches instead of paying twice (response header x-gw-deduped: 1).
For a deliberate re-roll of the same input (want a new take), pass
new_take=True (fal_generate(..., new_take=True) / fal_generate_video(...)),
which sends x-gw-no-dedupe: 1 (raw HTTP callers: that header or ?dedupe=0).
Pass input_digest= for any piece you save as an ingredient, so a resumed run
never pays twice. The body-match dedupe above breaks after a sandbox restart: the
resumed run re-uploads its inputs (voiceover, stills) and gets NEW urls, so the body
differs. fal_generate*(..., input_digest=d) sends x-gw-input-digest: d; the proxy
then dedupes on (agent + model + digest) for 24 h and returns the job you already
paid for. Use the same stable digest you save with media_upload (see below). If
that job's result has since expired at fal, the poll fails: retry once with
new_take=True.
When fal refuses a request on policy grounds, _fal_run (and so fal_generate*) raises
FalPolicyRejection, a RuntimeError subclass, so old except RuntimeError handlers
still work. Policy grounds means a likeness of a real person ("likenesses of real people",
"real person", "public figure"), content_policy_violation, partner_validation_failed, or
NSFW / safety checker.
Every body shape is read. fal's detail as a list of {msg, type, loc, ctx}, a dict
or a string; a top-level type/code/error; the GooseWorks MCP wrapper
{"error": {"code": "provider_validation_failed", "status": 422, "detail": <fal body>}};
and a failed job_get reply {"status": "failed", "error": "fal returned HTTP 422 for the result.", "result": {"detail": <fal body>}} (fal reports most failed generations as
COMPLETED plus a 422 on the result). Before this, a body with both msg and type kept
the message and lost the type, so the rejection looked like a generic error.
When it counts as policy. An explicit policy code (content_policy_violation,
partner_validation_failed, content_blocked) at any status, or a policy phrase
(likeness, public figure, usage guidelines, risk control, moderation, blocked for safety,
NSFW, flagged by the safety checker) on an explicit 4xx that is not 408 or 429. Input
errors such as "Could not detect a real person's face" or "enable_safety_checker cannot be
disabled" are not policy. A rejection on a 5xx, 408 or 429 is surfaced but never
recorded.
What it carries: reason (the provider's words), kind (likeness |
partner_validation | content_policy | nsfw), error_type, request_id,
http_status, stage, charged and charge_note. charged is False for an explicit
provider 4xx: the GooseWorks proxy debits only a successful response and releases the
hold on a 4xx (read from the proxy code, not yet confirmed on a real rejection). It is
None (unknown) for a job that failed after it was accepted.
The exact request is recorded in ~/.gooseworks/rejected-fal-requests/<key>.json,
next to pending-fal-jobs/ (GW_FAL_REJECTIONS_DIR overrides). The key is a digest of
the model plus the canonical JSON payload (sorted keys), and also of input_digest when
one is passed.
An identical request is refused before any network call, with the same exception
and from_ledger=True: "surface, do not retry: this exact request was already rejected
by the provider for ...; change the inputs (image, prompt, model) to try again".
new_take=True does not bypass it: a re-roll of a rejected payload is still the same
payload. Any change to the prompt, an image, the seed or the model is a new request and
is sent.
Inputs re-uploaded each run get new URLs, so the payload digest never matches twice.
Pass input_digest= over the inputs' content, as create-creator-takes-h3/run_takes.py
and render-street-interview/single_gen.py do. The ledger then matches on that too.
refuse_if_rejected(model, input_digest=d) checks before you upload anything.
A caller's input_digest is a permanent refusal key. It must cover EVERY input that is
sent: the prompt, every setting (duration, resolution, aspect ratio, audio, seed) and the
content of every input file. Simplest: input_digest(model, payload) over the real payload
with each uploaded URL replaced by {"sha256": <file hash>}. Leave an input out and a run
that changed only that input (a new, acceptable image) is refused.
Exit code: scripts exit with POLICY_EXIT (3). The MCP relay also exits 3; the relay
prints [mcp-relay], a rejection prints "surface, do not retry".
Non-policy errors (an unreadable image URL, a bad duration) stay a plain RuntimeError
with the provider's message and type, and are never recorded.
Every refusal names its record: the ledger file and whether it matched the exact
payload or the caller's input_digest.
Clearing a record is a user-approved action. Only when the user explicitly approves, e.g. because the provider changed its policy:
python3 media_proxy.py rejections # list recorded rejections (key, model, reason, request id)
python3 media_proxy.py forget <key> # clear one record (all its keys); USER-APPROVED ONLYforget_rejection(key) does the same in Python. It only ever deletes ledger records: it
takes the 32-hex key (or that record's filename or path inside the ledger directory) and
refuses anything else, such as another .json file or a file without a keys field.
Agents never clear a record on their own to get a retry through.
from media_proxy import fal_generate, fal_generate_video, eleven_music, download
# image (nano-banana / gpt-image / etc.) — inputs must be PUBLIC urls
img = fal_generate("fal-ai/nano-banana/edit",
{"prompt": p, "image_urls": [product_url], "aspect_ratio": "9:16"})
# video i2v (kling / seedance / veo)
vid = fal_generate_video("fal-ai/kling-video/v3/pro/image-to-video",
{"prompt": p, "image_url": keyframe_url, "duration": "10"})
# music bed
eleven_music(prompt, 10500, "music.mp3", force_instrumental=True)input_digest(model, args) = sha256 of the canonical JSON {"model", "args"} (sorted
keys, no whitespace), first 32 hex chars. Pass it with the MCP media_upload of the
result (plus an ingredient_key such as vo/scene-03); on a resume, media_list { ingredient_key } returns the saved file and its digest, and the file is reused only
when the digest of the args you would send now is the same.
from media_proxy import input_digest, eleven_tts, fal_generate_video
args = {"text": line, "voice_id": vid, "model_id": "eleven_v3"}
digest = input_digest("elevenlabs/tts", args)
# FAL job: hash the STABLE identities of its inputs, not their urls, and send the
# same digest with the submit so a resumed run re-attaches instead of re-paying.
lip_digest = input_digest("veed/fabric-1.0", {"image": "still/scene-03:" + still_digest,
"audio": "vo/scene-03:" + digest})
clip = fal_generate_video("veed/fabric-1.0", {"image_url": still_url, "audio_url": vo_url},
input_digest=lip_digest)Hash only what determines the output. Swap any expiring input URL (presigned / proxy) for that input's own ingredient_key + digest first, or the digest never matches.
?token=&agent_id= from ~/.gooseworks/credentials.json
(written by the GooseWorks CLI). In a GooseWorks cloud sandbox
(coworker chat) the env wins instead: GW_MEDIA_PROXY_TOKEN (a per-session token that
already binds agent/org/user) + GW_API_BASE; GW_PROJECT_ID attributes spend.status_url/response_url on
queue.fal.run; the helper rewrites them to the proxy base (keeps the path). Never
poll queue.fal.run directly (401 + burns credits).media_upload (its returned url) and
passes THAT url in, or call fal_upload(path), which puts the file on the fal CDN
through the fal-storage-proxy (free, verified 2026-09-28) and returns its public url.*.fal.media url is a real public URL — everything else is behind
the proxy.A session that only has the GooseWorks MCP connector (a chat app, or a terminal where
the GooseWorks CLI is not signed in) has neither GW_MEDIA_PROXY_TOKEN (the cloud sandbox's)
nor ~/.gooseworks/credentials.json, so scripts cannot reach the proxies over HTTP. Then every paid call is relayed through the agent:
working/mcp-requests/<kind>-<hash>.json
and exits with code 3, printing what to do.data_post { provider: "fal", path: <model>, body, project_id }, then
job_get { job_id } until complete; save result.output (fal's JSON).data_post { provider: "elevenlabs", ... }; save the reply
(it carries download_url).media_upload { scope: "video_project", ... } with the bytes of
local_file; save { "url": <its url> }.save_result_to and re-runs the same command. The script finds
the result and continues; the next paid call relays the same way.data_post returns a provider_validation_failed error, or job_get
returns status: failed, the agent saves that error JSON (the whole job_get reply) as
the result instead. The script then reports it: a policy rejection raises
FalPolicyRejection and is recorded, like the HTTP path. Any saved error is moved aside
to <name>.error.json, so a re-run makes the call again instead of re-reading it (the
ledger still refuses a recorded policy rejection).Set GW_PROJECT_ID (required: every call is billed to that video project, the same
attribution the HTTP proxy records) and GW_BRAND_ID (for uploads). The MCP tools bill
through the same server proxy code, so price and project attribution are identical.
GW_MEDIA_VIA=mcp forces the relay (e.g. the CLI login points at another environment);
GW_MEDIA_VIA=proxy forces HTTP.
create-image-fal, create-video-fal, create-music-elevenlabs.goose-video orchestrator hosts local inputs (MCP upload → presign) before calling these.© gooseworks-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts) in skills/ads/capabilities/media-proxy of gooseworks-ai/goose-skills.
Open the folder on GitHubat commit c650c6d
Media Proxy 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 |
|---|---|---|---|---|---|---|
| Media Proxy this skillgooseworks-ai/goose-skills | 1.2k | — | ~3.3k | Automated safety check: Pass | MIT | |
| AI Avatar Videoaiskillstore/marketplace | 433 | 1 repos | ~2.4k | Automated safety check: Pass | None | |
| Musictadaspetra/loop | 296 | 2 repos | ~827 | Automated safety check: Pass | MIT | |
| Sound Effectstadaspetra/loop | 296 | 2 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Elevenlabs Transcribeqdhenry/Claude-Command-Suite | 1.3k | — | ~1.5k | Automated safety check: Notes | None | |
| Dubbingelevenlabs/skills | 482 | — | ~3.3k | Automated safety check: Pass | MIT |
aiskillstore/marketplace
Create AI avatar and talking head videos via inference.sh CLI.
tadaspetra/loop
Generate music using ElevenLabs Music API. An agent skill from tadaspetra/loop.
tadaspetra/loop
Generate sound effects from text descriptions using ElevenLabs.
qdhenry/Claude-Command-Suite
Transcribes audio/video files using ElevenLabs Scribe v2 API.
elevenlabs/skills
Dub audio and video into other languages using the ElevenLabs Dubbing API (dubbingv2), preserving the original speakers' voices.
trpc-group/trpc-agent-go
ElevenLabs text-to-speech with mac-style say UX. An agent skill from trpc-group/trpc-agent-go.
gooseworks-ai/goose-skills
Scrape and search Reddit posts using Apify. An agent skill from gooseworks-ai/goose-skills.
gooseworks-ai/goose-skills
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent.
gooseworks-ai/goose-skills
Replace an existing video's opening with a supplied clip or free kinetic text hook while retaining and verifying every original body frame, audio, captions and ending.
gooseworks-ai/goose-skills
Scrape blog posts via RSS feeds (free, no API key) with Apify fallback for JS-heavy sites.
gooseworks-ai/goose-skills
Find leads by scraping engagers from a competitor's top LinkedIn posts.
gooseworks-ai/goose-skills
Assemble a ChatGPT chat-reveal video ad from a thread + timeline JSON — one continuous Playwright recording of a ChatGPT mobile chat (user types with the iOS keyboard up → taps send → keyboard…
Works with
Categories
Shared helper that routes ALL paid media generation (FAL image/video, ElevenLabs music) through the GooseWorks proxies so every call bills the Ads agent — never a provider SDK's default host. Media Proxy is an agent skill from gooseworks-ai/goose-skills. Shared helper that routes ALL paid media generation (FAL image/video, ElevenLabs music) through the GooseWorks proxies so every call bills the Ads agent — never a provider SDK's default host.
Media Proxy fits situations like: tasks that involve Text to speech and voice; tasks that involve Paid advertising.
Run `npx skills add gooseworks-ai/goose-skills --skill media-proxy -a claude-code`. Or copy the skill folder (skills/ads/capabilities/media-proxy in gooseworks-ai/goose-skills) into .claude/skills/media-proxy in your project. Claude Code loads it when a task matches its description.
Run `npx skills add gooseworks-ai/goose-skills --skill media-proxy -a codex`. Or copy the skill folder (skills/ads/capabilities/media-proxy in gooseworks-ai/goose-skills) into .agents/skills/media-proxy 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 gooseworks-ai/goose-skills --skill media-proxy -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/media-proxy, .gemini/skills/media-proxy, .github/skills/media-proxy and .opencode/skills/media-proxy in your project.
Going by SKILL.md and its folder, Media Proxy needs Python for the scripts in its folder, the command-line tools its instructions call (python3) and credentials named GW_MEDIA_PROXY_TOKEN. Our summary lists: Python 3; A credential in GW_MEDIA_PROXY_TOKEN.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Media Proxy is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k 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 Media Proxy: AI Avatar Video (aiskillstore/marketplace, 433 stars), Music (tadaspetra/loop, 296 stars), Sound Effects (tadaspetra/loop, 296 stars) and Elevenlabs Transcribe (qdhenry/Claude-Command-Suite, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
gooseworks-ai (a GitHub organization) maintains it in gooseworks-ai/goose-skills, which has 1,240 GitHub stars. The repository holds 273 skills in this directory. The repository was last updated on October 8, 2026.
Source: gooseworks-ai/goose-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.