Record or regenerate the mcpc demo GIFs (the README hero docs/images/mcpc-demo.gif and the focused tapes in docs/vhs/) with VHS. Use whenever asked to create, refresh, restyle, shorten, or fix a terminal demo/animation/GIF of mcpc. The tapes drive real mcpc commands; for the authenticated step this skill ALWAYS prompts for a short-lived, low-permission TEST token first (never production). Captures the VHS + mcpc gotchas learned the hard way — read it fully before editing a tape.
npx skills add https://github.com/apify/mcpc --skill record-demo
The tapes in docs/vhs/*.tape are VHS
scripts that drive a real shell session — VHS types each command, runs it
against a live MCP server, captures the terminal, and renders a GIF. The README
hero is docs/images/mcpc-demo.gif, built from docs/vhs/mcpc-demo.tape.
This file is the accumulated know-how. Read all of it before touching a tape
— most rules below were discovered by hitting the wall, and skipping them wastes
whole render cycles (~1–2 min each).
mcpc-demo.tape)A basic-use story across both transports:
mcpc — empty state (no sessions, no profiles)mcpc connect mcp.json:filesystem — local stdio server (auto-names @filesystem)mcpc — session list (now shows the live session)mcpc @filesystem tools-listmcpc @filesystem tools-list --json — JSON output, syntax-highlighted, no jqmcpc connect mcp.apify.com -H "Authorization: Bearer $APIFY_TOKEN" — remote HTTP server (auto-names @apify)mcpc @apify tools-listmcpc @apify tools-get search-actors — inspect one tool's input schemamcpc @apify tools-call search-actors keywords:="web scraper" limit:=310. mcpc @apify close
Ten commands run ~45s; there is no hard 30s cap for this flow.
# comments in the visible script. The commands are self-descriptive.| head, no 2>/dev/null on visible commands. Show real output even iflong — it scrolls naturally. (connect ≈ 86 lines incl. an "Available commands"
list, tools-call search-actors ≈ 56, filesystem tools-list --json ≈ 300.)
clear between steps. Put a single blank-lineEnter before each command (after the first) so it's separated from the
previous output, like a real terminal session.
Type 'export PS1="\[\e[1;38;2;25;230;77m\]$\[\e[0m\] \[\e[1;97m\]"'
Enter
Type "trap 'tput sgr0' DEBUG"
Enter
PS1 is a bold bright-green $, then ends with \[\e[1;97m\] so the typedinput renders bold bright-white.
DEBUG trap runs tput sgr0 before every command so the bold-whiteinput does not bleed into command output.
Type 'export MCPC_HOME_DIR="$(mktemp -d)"'so mcpc shows "No active MCP sessions / No OAuth profiles".
color (256-color, plenty vivid). You only need export FORCE_COLOR=3
(+ COLORTERM=truecolor for exact hex) when a command is piped (mcpc turns
color off when stdout isn't a TTY). The current tapes avoid pipes, so they don't
need it. (The CLI palette lives in src/cli/output.ts, RAINBOW_SATURATION,
bumped to 78% for vividness — that's where the demo colors come from.)
❯, », ▶) break bash promptrendering under VHS and show up as garbage like 92m]. Use $ (or >), styled
with color + bold.
Type quoting: use single quotes around any command containing doublequotes. A \" inside a double-quoted Type breaks VHS's parser. e.g.
Type 'mcpc @apify tools-call search-actors keywords:="web scraper" limit:=3'
and Type 'export PS1="\[\e[…m\]$\[\e[0m\] "'.
Output 1-foo.giffails to parse) and must not be long absolute paths (the parser chokes). Use
short, letter-leading, relative names and run vhs from docs/vhs/.
Screenshot is unreliable (frequently exits 2 even though the GIF renderedfine). Don't depend on it — pull frames from the finished GIF instead:
ffmpeg -y -ss <seconds> -i x.gif -vframes 1 frame.png, then Read the PNG.
encode). Render tapes one at a time — a for loop over several blows the
5-minute command timeout. Extracted frames often land mid-typing; sample a few
timestamps around when output should be on screen.
connects in the hidden setup (so the feature commands run against a ready
session, e.g. tools/scripting/grep), a slow connect lets VHS type ahead; bash
then echoes the buffered commands and runs the clear *after* Show, so the
setup spills into frame. Pattern that works: type the connect(s), then **one
generous Sleep (7–8s) so they finish, then clear, then another Sleep
(~1.5s) before Show**. (Tapes that connect *visibly* as their first command
don't need this — their hidden setup is just fast exports + clear.)
npx-launched stdio servers are too slow here. npx -y <pkg>'s registryround-trip exceeds mcpc's 60s connect handshake, so connect times out
(MCP error -32001). Fixes: pre-install the server (npm i -g <pkg>) and put
the direct binary in mcp.json (e.g. mcp-server-filesystem, starts in
~0.3s — also a cleaner session header), or use npx --prefer-offline -y <pkg>
once the npm cache is warm (~5s; plain npx -y still does the slow registry
check even when cached).
@modelcontextprotocol/server-puppeteer launches Chromium eagerly on startup
and hangs/times out as root in the container. Use
@modelcontextprotocol/server-filesystem instead (14 recognizable tools,
instant). docs/vhs/mcp.json defines the filesystem entry via its global
binary — install it first: npm i -g @modelcontextprotocol/server-filesystem.
low-permission token from a TEST / throwaway account — never production.**
Apify: <https://console.apify.com/settings/integrations>. Tell the user to
revoke it as soon as the recording is done.
APIFY_TOKEN=… vhs mcpc-demo.tape. Thetape references $APIFY_TOKEN (never the literal), typed inside **single
quotes so bash expands it at run time — the value is never on screen, never
in the GIF, never committed**. Always verify a connect frame shows
$APIFY_TOKEN, not the value.
connect auto-names the session: mcp.apify.com → @apify,mcp.json:filesystem → @filesystem. No @name needed.
mcpc connect "https://mcp.apify.com/?tools=search-actors,fetch-actor-details,docs".On a box with no keyring, the bearer-token connect prints
`[keychain] OS keychain unavailable, falling back to file-based credential
storage …`. It is environment-specific (won't appear on a normal desktop
with a keyring) and there is no env var to suppress it — it's a logger.warn
in src/lib/auth/keychain.ts gated only by keychain availability and JSON mode.
A dbus-run-session + gnome-keyring-daemon wrapper does not fix it in this
sandbox (raising the dbus fd limit is blocked). Options: leave it (honest), or add
a targeted 2>/dev/null to just that one connect command.
mcpc --version # the CLI being demoed (npm i -g @apify/mcpc, or build + pnpm link this repo)
vhs --version # brew install vhs (needs ttyd + ffmpeg on PATH)
mcp-server-filesystem # npm i -g @modelcontextprotocol/server-filesystem (the stdio demo server)
Headless + root: VHS drives a Chromium (go-rod auto-downloads it to
~/.cache/rod) that refuses to start without --no-sandbox. If renders fail to
launch Chromium, wrap the binary once:
CHROME=$(find ~/.cache/rod/browser -name chrome -type f | head -1)
mv "$CHROME" "$CHROME-real"
printf '#!/bin/sh\nexec "$(dirname "$0")/chrome-real" --no-sandbox --disable-gpu --disable-dev-shm-usage "$@"\n' > "$CHROME"
chmod +x "$CHROME"
(Run vhs once first to trigger the Chromium download.)
cd docs/vhs
APIFY_TOKEN=… vhs mcpc-demo.tape # real-time; be patient
ffprobe -v error -show_entries format=duration -of csv=p=0 mcpc-demo.gif # check length
ffmpeg -y -ss 12 -i mcpc-demo.gif -vframes 1 /tmp/f.png # spot-check a frame, then Read it
cp mcpc-demo.gif ../images/mcpc-demo.gif # update the README hero
Check each frame class: empty state, stdio connect + session list, tools-list,
JSON, remote connect (token NOT visible), tool-call result, close. Then
revoke the token.
VHS GIFs are large (the hero is ~5 MB raw). Shrink them losslessly-ish with
gifsicle (kornel.ski/lossygif) — --lossy
drops imperceptible inter-frame detail and cuts ~60% off a text-terminal GIF
with no visible quality loss:
# in place; lossy=200 ≈ 60% smaller, text stays crisp (verified by frame diff)
for f in docs/images/mcpc-demo.gif docs/vhs/*.gif; do
[ "$f" = docs/vhs/mcpc-demo.gif ] && continue # ignored raw hero
gifsicle -O3 --lossy=200 -b "$f"
done
After optimizing, re-extract a colored frame (ffmpeg -ss 12 …) and eyeball it —
lossy=200 is the sweet spot; going much higher smears the antialiased text.
When the optimized hero lands on main, bump the README cache-buster
(mcpc-demo.gif?v=N → ?v=N+1): GitHub's camo image proxy caches by full URL,
so a new ?v= is what makes it re-fetch the smaller file instead of serving the
old cached copy.
docs/images/mcpc-demo.gif — the README hero (canonical copy).docs/vhs/*.gif — the per-feature recordings are committed too, so they're easyto find and reuse. .gitignore ignores only docs/vhs/mcpc-demo.gif (the hero's
raw output, since it's committed under docs/images/).
proxy.gif needs a token to record and isn't committed until recorded.| Tape | Records |
| ---- | ------- |
| mcpc-demo.tape | Hero basic-use flow (stdio + remote) → docs/images/mcpc-demo.gif |
| quickstart.tape | Minimal connect → list → call |
| tools.tape | tools-list / tools-get / tools-call, inline JSON, stdin |
| scripting.tape | --json piped through jq (code mode) |
| grep.tape | Dynamic tool discovery with mcpc grep across two sessions (Apify + filesystem) |
| proxy.tape | MCP proxy / AI sandboxing (keeps a bearer token on purpose) |
All focused tapes follow the same conventions as the hero (bold $ prompt,
bold-white commands, no comments, blank-line separation, mktemp home).
quickstart/tools/scripting/grep are token-free (public ?tools= URL);
grep also connects a local filesystem stdio server so it can search across two
sessions. proxy.tape keeps a bearer token because demonstrating that you can
proxy a credentialed session without leaking the token is its entire point (it's
the one focused tape that needs a token to record).
agent-im 会话技能 - 通过 liblib.tv 的 AI 能力生成和编辑图片/视频。覆盖场景包括:生成(文生图、文生视频、图生视频、做动画、画一个xxx、来段xxx)、编辑修改(把xxx换成yyy、去掉xxx、加上xxx、改成xxx、调整xxx、局部修改、改镜头)、风格转换(风格迁移、转绘、换风格)、视频续写延长、复刻视频/TVC/宣传片、短剧/短漫剧生成、音乐MV生成、产品广告/展示片制作、分镜/故事板设计、教育视频/短视频制作。当用户提到 liblib、libtv、上传参考图/视频、查看生成进度时也应触发。关键判断:只要用户的请求涉及 AI 图片或视频的创作、生成、编辑、修改,无论措辞如何(如"画只猫"、"做个海报"、"把纸船换成爱心"、"这个视频帮我改一下"、"帮我复刻这段视频"、"用这首歌做个MV"、"一句话生成短剧"),都必须触发此技能。
This skill should be used when the user asks to "generate video prompts", "create Seedance prompts", "write video descriptions", mentions "Seedance", "seedance", "即梦", "即梦平台", "视频提示词", "视频生成", "AI视频", "短剧", "广告视频", "视频延长", or discusses video prompt engineering, AI video generation, or Seedance 2.0 workflows.
Best practices and techniques for writing effective AI video generation prompts. Covers: Veo, Seedance, Wan, Grok, Kling, Runway, Pika, Sora prompting strategies. Learn: shot types, camera movements, lighting, pacing, style keywords, negative prompts. Use for: improving video quality, getting consistent results, professional video prompts. Triggers: video prompt, how to prompt video, veo prompts, video generation tips, better ai video, video prompt engineering, video prompt guide, video prompt template, ai video tips, video prompt best practices, video prompt examples, cinematography prompts
This skill is a practical, 'use-it-while-debugging' reference for getting a LiveKit + Letta voice agent working reliably.
Download screenshot baselines from the latest CI run and commit them. Use when asked to update, accept, or refresh component screenshot baselines from CI, or after the screenshot-test GitHub Action reports differences. This skill should be run as a subagent.
| Turn vague taste, screenshots, URLs, product notes, or "make it feel like this" references into a grounded DESIGN.md plus an implementation handoff. Use it before prototypes, decks, redesigns, or image remix work when the user needs a reusable visual direction rather than a one-off prompt.
>- Upload local assets (images, mockups, extracted HTML, design markdown) to a Stitch project. ALWAYS use this skill when you need to upload visual assets, HTML pages, or design docs to Stitch, particularly when direct MCP tool calls fail or truncate due to base64 token limits.
This skill helps users automatically extract channel-level and video detail data from a specific YouTube channel via BrowserAct API. Agent should proactively apply this skill when users express needs like extracting channel video data, getting latest or popular videos from a YouTube channel, tracking competitor channel content, extracting video metrics such as views likes comments, retrieving subscriber count and channel info, monitoring posting cadence of a YouTube channel, gathering video data for content strategy analysis, getting earliest videos of a YouTube creator, analyzing engagement signals across a full channel, and downloading structured YouTube video details without manual scraping.
Take apify/record-demo from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm, npx, brew.
Without those the skill loads but fails at the first command.