Peertube
magnus919/agent-skills
Browse PeerTube federated video from the terminal — instance stats, latest videos, video detail, comment threads, channels, accounts, instance-local search, and OAuth2 login with per-instance token…
A skill your agent uses when wiring code to a real YouTube channel: user OAuth 2.0, resumable videos.insert uploads, editing metadata after publish, pulling views/watch time/retention/traffic from…
$ npx skills add ericrisco/rsc-harness --skill youtube-api -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness youtube-api --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/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/youtube-api .claude/skills/youtube-api && 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 "youtube-api" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/youtube-api into .claude/skills/youtube-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "youtube-api", 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/ericrisco/rsc-harness/tree/main/skills/youtube-apiType 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 ericrisco/rsc-harness --skill youtube-api -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness youtube-api --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/youtube-api .agents/skills/youtube-api && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "youtube-api" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/youtube-api into .agents/skills/youtube-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "youtube-api", 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 ericrisco/rsc-harness --skill youtube-api -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness youtube-api --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/youtube-api .cursor/skills/youtube-api && 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 "youtube-api" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/youtube-api into .cursor/skills/youtube-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "youtube-api", 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/ericrisco/rsc-harness.git --path skills/youtube-api--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 ericrisco/rsc-harness --skill youtube-api -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness youtube-api --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/youtube-api .gemini/skills/youtube-api && 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 "youtube-api" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/youtube-api into .gemini/skills/youtube-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "youtube-api", 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 ericrisco/rsc-harness youtube-apiInstalls 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 ericrisco/rsc-harness --skill youtube-api -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/youtube-api .github/skills/youtube-api && 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 "youtube-api" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/youtube-api into .github/skills/youtube-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "youtube-api", 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 ericrisco/rsc-harness --skill youtube-api -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness youtube-api --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/youtube-api .opencode/skills/youtube-api && 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 "youtube-api" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/youtube-api into .opencode/skills/youtube-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "youtube-api", 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.
youtube-apiA skill your agent uses when wiring code to a real YouTube channel: user OAuth 2.0, resumable videos.insert uploads, editing metadata after publish, pulling views/watch time/retention/traffic from…
Youtube API is an agent skill from ericrisco/rsc-harness. Use when wiring code to a real YouTube channel: user OAuth 2.0, resumable videos.insert uploads, editing metadata after publish, pulling views/watch time/retention/traffic from the Analytics API v2 into a dated 02-DOCS/wiki/youtube/ feedback log. NOT what to publish or how to title and thumbnail it (that is youtube-strategy / youtube-packaging).
Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/analytics-queries.md`).
It sits in Backend & APIs, covering OAuth and OpenID Connect. It works with YouTube. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 92fde8f. 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 1 file in scripts/ (Shell), which the agent can run.
From 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:
googleapis.comdevelopers.google.comyoutubeanalytics.googleapis.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
CLIENT_SECRETFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Youtube API loads about 4k tokens when it runs, and up to ~7.2k if it reads all its reference files. Until then it costs about 90 tokens; SKILL.md has 1,307 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 ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 1,307 words, ~3,958 tokens.
.claude/skills/youtube-api/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.You own the wire: authenticate to a YouTube channel, upload and edit videos, pull the numbers, and write those numbers into the wiki as a durable feedback log. You do not decide what to make or how to title it — that is the strategy/packaging family. Deliver clean transport and a queryable log; let the siblings interpret.
YouTube has two separate APIs and you will touch both:
https://www.googleapis.com/youtube/v3 — the write side: videos.insert (upload), videos.update (edit metadata), thumbnails.set. Default quota: a shared 10,000 units/day pool plus separate per-day caps of ~100 uploads and ~100 search.list calls (see §7).https://youtubeanalytics.googleapis.com/v2/reports — the read side: views, watch time, retention, traffic sources. Separate scopes, separate quota.Auth is user OAuth 2.0, not a service account. A human owns the channel; you act on their behalf with a refresh token. A service account cannot own a YouTube channel — if you reach for one, stop. (Service-account Google auth for Gmail/Drive/Sheets is google-workspace, a different model.)
Route elsewhere when the job is not transport:
| You actually want | Go to |
|---|---|
| What videos to make / niche / cadence / growth plan | ../youtube-strategy/SKILL.md |
| Video ideas, hooks, a topic backlog | ../youtube-ideation/SKILL.md |
| Title + thumbnail packaging, CTR copy, A/B framing | ../youtube-packaging/SKILL.md |
| The thumbnail image itself | ../youtube-thumbnails/SKILL.md |
| Render/produce the actual video file in code | ../remotion-video/SKILL.md |
| Post one asset across many networks at once | ../social-publisher/SKILL.md |
| Wrap an arbitrary REST provider with OAuth + retries | ../api-connector-builder/SKILL.md |
| Chain upload → Notion row → Slack across tools | ../automation-flows/SKILL.md |
| Service-account auth to Gmail/Drive/Sheets | ../google-workspace/SKILL.md |
| Generic wiki structure and conventions | ../knowledge-ops/SKILL.md |
A checklist, because each missing step produces a distinct, confusing error later:
403 ... has not been used in project on the other.Scope table — request only what the job needs:
| Scope | Grants | Use for |
|---|---|---|
https://www.googleapis.com/auth/youtube.upload | Upload videos | videos.insert |
https://www.googleapis.com/auth/youtube.force-ssl | Manage/edit/delete | videos.update, thumbnails.set |
https://www.googleapis.com/auth/yt-analytics.readonly | Read performance | Analytics reports |
https://www.googleapis.com/auth/yt-analytics-monetary.readonly | Read revenue metrics | only if you pull estimatedRevenue etc. |
Bad → Good on scopes:
Bad: scopes = ["https://www.googleapis.com/auth/youtube"] # full account control
Good: scopes = ["https://www.googleapis.com/auth/youtube.upload",
"https://www.googleapis.com/auth/youtube.force-ssl",
"https://www.googleapis.com/auth/yt-analytics.readonly"]Full GCP + consent-screen walkthrough, Desktop-vs-Web choice, and unauthorized_client / access_denied / redirect-URI troubleshooting live in references/oauth-setup.md.
Build both service clients from one set of OAuth credentials.
# python: google-api-python-client + google-auth-oauthlib
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
import json, os
from google.oauth2.credentials import Credentials
SCOPES = ["https://www.googleapis.com/auth/youtube.upload",
"https://www.googleapis.com/auth/youtube.force-ssl",
"https://www.googleapis.com/auth/yt-analytics.readonly"]
TOKEN = "token.json" # gitignored — holds the refresh_token
def creds():
c = Credentials.from_authorized_user_file(TOKEN, SCOPES) if os.path.exists(TOKEN) else None
if not c or not c.valid:
if c and c.expired and c.refresh_token:
c.refresh(Request()) # silent renewal — needs "In production" app
else:
c = InstalledAppFlow.from_client_secrets_file(
"client_secret.json", SCOPES).run_local_server(port=0)
with open(TOKEN, "w") as f:
f.write(c.to_json())
return c
c = creds()
data = build("youtube", "v3", credentials=c)
yta = build("youtubeAnalytics", "v2", credentials=c)// node: googleapis + google-auth-library
import { google } from "googleapis";
import fs from "node:fs";
const oauth2 = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
oauth2.setCredentials(JSON.parse(fs.readFileSync("token.json", "utf8"))); // { refresh_token, ... }
oauth2.on("tokens", (t) => { // persist the refreshed token
if (t.refresh_token) fs.writeFileSync("token.json", JSON.stringify(t));
});
const data = google.youtube({ version: "v3", auth: oauth2 });
const yta = google.youtubeAnalytics({ version: "v2", auth: oauth2 });Rule: persist the refresh token, never a bare access_token. Access tokens expire in ~1 hour; the credential object refreshes itself. A hardcoded access_token=... literal is a guaranteed 401 within the hour — and is exactly what verify.sh flags.
Decision: any file over a few MB → use the resumable protocol. A plain multipart POST drops the whole upload on one network hiccup; resumable survives it.
The protocol is two steps:
uploadType=resumable and the metadata body. The response Location header is your session URL.Content-Range: bytes */*; the server returns the byte offset already received, and you resume from there.The client libraries do this for you via a media-upload helper:
from googleapiclient.http import MediaFileUpload
body = {
"snippet": {"title": "Ep. 14", "description": "...", "tags": ["x", "y"], "categoryId": "27"},
"status": {"privacyStatus": "private", "publishAt": "2026-06-10T15:00:00Z",
"selfDeclaredMadeForKids": False},
}
media = MediaFileUpload("ep14.mp4", chunksize=8 * 1024 * 1024, resumable=True)
req = data.videos().insert(part="snippet,status", body=body, media_body=media)
resp = None
while resp is None:
status, resp = req.next_chunk() # resumes automatically on a transient drop
video_id = resp["id"]
data.thumbnails().set(videoId=video_id, media_body=MediaFileUpload("ep14.jpg")).execute()Throttle the upload count, not the unit spend: videos.insert has its own cap of ~100 uploads/day, so uploadLimitExceeded (429) hits while the 10k unit pool still looks untouched. Space automated uploads out and back off on 429 — figures and citation in §7.
videos.update does read-modify-write semantics on whole parts. The trap: any field you omit inside a part you send gets cleared.
# Bad: wipes description and tags because they aren't in the body
data.videos().update(part="snippet",
body={"id": vid, "snippet": {"title": "New title", "categoryId": "27"}}).execute()
# Good: fetch the current snippet, change one field, send it back whole
cur = data.videos().list(part="snippet", id=vid).execute()["items"][0]["snippet"]
cur["title"] = "New title"
data.videos().update(part="snippet", body={"id": vid, "snippet": cur}).execute()categoryId is required when you send a snippet part — another reason to read-modify-write. An update costs ~50 units.
Every report is GET /v2/reports?ids=channel==MINE&startDate=&endDate=&metrics=...&dimensions=...&filters=.... Four recipes cover the loop:
# (a) Channel KPIs over a date range
yta.reports().query(ids="channel==MINE", startDate="2026-05-01", endDate="2026-05-31",
metrics="views,estimatedMinutesWatched,averageViewDuration,averageViewPercentage"
).execute()
# (b) Per-video KPIs
yta.reports().query(ids="channel==MINE", startDate="2026-05-01", endDate="2026-05-31",
metrics="views,estimatedMinutesWatched,averageViewPercentage",
filters="video==VIDEO_ID").execute()
# (c) Audience-retention curve for one video
yta.reports().query(ids="channel==MINE", startDate="2026-05-01", endDate="2026-05-31",
metrics="audienceWatchRatio,relativeRetentionPerformance",
dimensions="elapsedVideoTimeRatio", filters="video==VIDEO_ID").execute()
# (d) Traffic sources
yta.reports().query(ids="channel==MINE", startDate="2026-05-01", endDate="2026-05-31",
metrics="views,estimatedMinutesWatched",
dimensions="insightTrafficSourceType").execute()Notes that save an afternoon:
elapsedVideoTimeRatio runs 0.0–1.0 (playback position); audienceWatchRatio is the absolute retention at that point. Plot one against the other to find the drop-off.insightTrafficSourceType values include YT_SEARCH, SUGGESTED, BROWSE, EXT_URL, NOTIFICATION, PLAYLIST, END_SCREEN, NO_LINK_EMBEDDED.impressions, impressionClickThroughRate) are content-owner-report metrics, not reliably available on a plain channel query. If the API returns nothing for them, fall back to the value Studio shows — do not block the pull.Full metric+dimension catalog and copy-paste bodies for geography, device, and subscribed-status reports are in references/analytics-queries.md.
A pull that prints to stdout and vanishes is wasted. Every pull appends a dated entry under 02-DOCS/wiki/youtube/ so the channel's numbers become queryable history that the strategy/packaging siblings can read.
02-DOCS/wiki/youtube/
index.md # rolling pointer to latest snapshot + open questions
channel-2026-05-31.md # dated channel snapshot (one per pull)
videos/<VIDEO_ID>.md # per-video running log, newest entry on topPer-pull entry template (OKF v0.1: non-empty type + the domain keys siblings parse):
---
type: youtube-metrics
title: Channel snapshot 2026-05-31
description: Channel KPIs, traffic and retention for 2026-05-01..2026-05-31.
tags: [youtube, channel-snapshot]
timestamp: 2026-05-31T00:00:00Z
date: 2026-05-31
range: 2026-05-01..2026-05-31
channel: MINE
source: youtube-analytics-api-v2
---
## KPIs
views: 41,233 | watch_min: 88,140 | avg_view_pct: 38.2% | avg_view_dur: 0:04:11
## Traffic (top 3)
BROWSE 44% · SUGGESTED 31% · YT_SEARCH 12%
## Retention
Sharp drop 0.00→0.06 (intro), recovers, second dip ~0.55.
## What changed since last pull
avg_view_pct +2.1pts; SUGGESTED share up 6pts after the Ep.13 packaging change.Rule: append, never overwrite. The feedback log is the value — overwriting yesterday's snapshot destroys the trend the siblings need. 02-DOCS/wiki/ is an OKF v0.1 bundle: keep the domain keys (date, range, channel, source) the siblings parse, add type/timestamp alongside them, use standard markdown links (never [[wikilinks]]), and leave the reserved index.md frontmatter-free. Exact file tree, naming, per-video log shape, and how siblings read the log: references/wiki-schema.md.
| Call | Cost / allocation |
|---|---|
videos.insert (upload) | own daily cap: ~100 uploads/day, not 10k-pool units |
search.list | own daily cap: ~100 calls/day |
write: videos.update, thumbnails.set | ~50 units (from the 10k pool) |
*.list read | 1–5 units (from the 10k pool) |
Analytics reports.query | (separate Analytics quota) |
Per the official docs (Last updated 2026-06-01 UTC, https://developers.google.com/youtube/v3/getting-started; per-method costs at https://developers.google.com/youtube/v3/determine_quota_cost), a project's default allocation is "100 search.list calls, 100 videos.insert calls, and 10,000 units per day combined for all other endpoints." All quotas reset at midnight Pacific. This is a change from the older single-pool model where videos.insert cost ~1,600 units — confirm the live figure on the quota-cost page before relying on it, since Google notes the allocation "is subject to change."
On 403 quotaExceeded / rateLimitExceeded or 429: exponential backoff with jitter, then stop for the day on a hard quota cap — retrying a daily-quota 403 in a tight loop just burns the next day too.
Error → cause map:
| Symptom | Cause | Fix |
|---|---|---|
| Refresh token dies after ~7 days | App still in "Testing" | Publish consent screen to "In production" |
unauthorized_client | Consent/client misconfig or wrong client type | Re-check OAuth client + authorized scopes |
403 insufficient permissions | Missing scope | Add the right scope, re-consent |
uploadLimitExceeded (429) | Hit the ~100 videos.insert/day cap (separate from the 10k unit pool) | Throttle upload count, back off |
Empty impressions/CTR | Not a content-owner channel query | Read it from Studio |
403 ... API has not been used | Other API not enabled | Enable both Data v3 and Analytics v2 |
| Anti-pattern | Why it bites | Do instead |
|---|---|---|
Commit client_secret.json / token.json with refresh_token | Leaks full channel control to anyone with repo read | Gitignore both; load from env/secret store |
Request full auth/youtube scope | Grants total account control; fails review | Least set: youtube.upload + youtube.force-ssl + yt-analytics.readonly |
Hardcode an access_token | Dead in ~1 hour | Persist the refresh token; use a refreshable credential |
videos.update with a partial part | Omitted fields get wiped | Read-modify-write the whole part |
| Plain multipart upload for a big file | One drop kills the whole upload | Resumable protocol with chunked PUT |
| Treat the 10k unit pool as the upload budget | Uploads use a separate ~100/day call cap, so uploadLimitExceeded 429 hits with the pool untouched | Throttle upload count against the ~100/day cap |
| Overwrite yesterday's wiki snapshot | Destroys the trend the siblings read | Append a new dated entry every pull |
| Leave the app in "Testing" | Token silently dies in 7 days | Publish to "In production" |
© ericrisco, 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 6 other files (scripts, references) in skills/youtube-api of ericrisco/rsc-harness.
Open the folder on GitHubat commit 92fde8f
Youtube API 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 |
|---|---|---|---|---|---|---|
| Youtube API this skillericrisco/rsc-harness | 156 | — | ~4k | Automated safety check: Pass | MIT | |
| Peertubemagnus919/agent-skills | 111 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Add OAuth Providersuperdesigndev/treg | 4.5k | — | ~2.5k | Automated safety check: Pass | Custom licence | |
| Setupdaiki-beppu/youtube-automation | 169 | — | ~1.3k | Automated safety check: Pass | Custom licence | |
| YoutubeCraftOS-dev/CraftBot | 392 | 1 repos | ~3.7k | Automated safety check: Pass | MIT | |
| Int Youtubeevolution-foundation/evo-nexus | 544 | — | ~568 | Automated safety check: Notes | Custom licence |
magnus919/agent-skills
Browse PeerTube federated video from the terminal — instance stats, latest videos, video detail, comment threads, channels, accounts, instance-local search, and OAuth2 login with per-instance token…
superdesigndev/treg
Add a provider to treg's OAuth registry (the ones treg holds its own approved app for).
daiki-beppu/youtube-automation
A skill your agent uses when ツール導入と GCP / OAuth の設定、新規 YouTube チャンネル開設、既存チャンネル取り込み、config 再生成、または YouTube 側設定同期を行うとき。「セットアップして」「環境構築」「新チャンネル」「既存チャンネル」「チャンネル取り込み」「config…
CraftOS-dev/CraftBot
YouTube Data API integration with managed OAuth. An agent skill from CraftOS-dev/CraftBot.
evolution-foundation/evo-nexus
Query YouTube Data API v3 — channel stats, recent videos, top videos, comments.
AgriciDaniel/claude-blog
Google API integration for blog performance: PageSpeed Insights, CrUX Core Web Vitals with 25-week history, Search Console performance, URL Inspection, Indexing API, GA4 organic traffic, NLP entity…
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Works with
Categories
A skill your agent uses when wiring code to a real YouTube channel: user OAuth 2.0, resumable videos.insert uploads, editing metadata after publish, pulling views/watch time/retention/traffic from…. Youtube API is an agent skill from ericrisco/rsc-harness.insert uploads, editing metadata after publish, pulling views/watch time/retention/traffic from the Analytics API v2 into a dated 02-DOCS/wiki/youtube/ feedback log.
Youtube API fits situations like: wiring code to a real YouTube channel: user OAuth 2.0; resumable videos.insert uploads; editing metadata after publish; pulling views/watch time/retention/traffic from the Analytics API v2 into a dated 02-DOCS/wiki/youtube/ feedback log.
Run `npx skills add ericrisco/rsc-harness --skill youtube-api -a claude-code`. Or copy the skill folder (skills/youtube-api in ericrisco/rsc-harness) into .claude/skills/youtube-api in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill youtube-api -a codex`. Or copy the skill folder (skills/youtube-api in ericrisco/rsc-harness) into .agents/skills/youtube-api 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 ericrisco/rsc-harness --skill youtube-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/youtube-api, .gemini/skills/youtube-api, .github/skills/youtube-api and .opencode/skills/youtube-api in your project.
Going by SKILL.md and its folder, Youtube API needs a shell for the scripts in its folder and credentials named CLIENT_SECRET. Our summary lists: Python 3; A Bash shell; A credential in CLIENT_SECRET.
SKILL.md names 3 domains. In commands or code: googleapis.com, developers.google.com and youtubeanalytics.googleapis.com; the agent is likely to contact these 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Youtube API is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Youtube API: Peertube (magnus919/agent-skills, 111 stars), Add OAuth Provider (superdesigndev/treg, 4.5k stars), Setup (daiki-beppu/youtube-automation, 169 stars) and Youtube (CraftOS-dev/CraftBot, 392 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.