Free, keyless Agent Skills for search, scraping, papers and YouTube: take them

# ai# llm# python# opensource
Free, keyless Agent Skills for search, scraping, papers and YouTube: take themDanil Galeev

Wikimedia answers requests that carry an empty or generic User-Agent with HTTP 403. So when an...

Wikimedia answers requests that carry an empty or generic User-Agent with HTTP 403. So when an agent's fetch tool sends one, "summarise this Wikipedia article" ends right there:

$ curl -s -o /dev/null -w "%{http_code}\n" -A "" https://en.wikipedia.org/api/rest_v1/page/summary/Ada_Lovelace
403
Enter fullscreen mode Exit fullscreen mode

Claude Code's tracker has bug reports about its fetch tool getting 403 on Wikipedia and npm, both closed as "not planned". Paid search and scraping APIs with keys exist for exactly this kind of gap. For Telegram, the libraries need an account and API credentials.

The cheapest workaround is the agent writing its own curl with a header, or a line about it in AGENTS.md. That fixes the header. It doesn't give the agent tested parsing, rate limits that hold across runs, or a reliable way to say "this site blocked me, stop", and the next session re-derives the rest of the API from memory. I wanted that part written once and tested, so I started zedxter/utility-belt: an open-source, MIT-licensed collection of Agent Skills that needs no API keys. A skill is a folder with instructions and scripts; the agent reads its one-line description at startup and loads the rest only when a task matches.

TL;DR: 20 skills, each a SKILL.md plus a Python script that uv run starts with no setup. Any agent that reads the SKILL.md format and can run shell commands with network access can use them, and they're yours to take and change. Install with the skills CLI: npx skills add zedxter/utility-belt.

GitHub logo zedxter / utility-belt

Open-source Agent Skills (SKILL.md) for Claude Code, Codex, Cursor and other AI agents

utility-belt

An open-source collection of Agent Skills for AI coding agents — Claude Code, Codex, Cursor, Gemini CLI, OpenCode and any other agent that understands the SKILL.md format.

Each skill is a folder with a SKILL.md (instructions + metadata) and, where useful, scripts/ and references/. Agents load the skill's description at startup and read the full instructions only when the task matches, so the collection costs almost nothing in context until a skill is actually needed.

All skills are cross-platform (macOS, Linux, Windows): the scripts are plain Python with inline dependency metadata, no shell-specific code, UTF-8 output everywhere.

Skills

Skill What it does
youtube-search Searches YouTube without an API key and returns title, channel, publish date, view count, duration and URL. Sort by date/views, filter by period, duration, min views, channel. Triggers when the user wants to find videos on a topic or needs a video to summarise but
…

What's in it

The web, without paid scraping APIs

  • web-search: DuckDuckGo, Bing, Brave and others through the unofficial ddgs library (best effort; your own SearXNG is the stable option). --read 3 also fetches the top results.
  • web-extract: a page or PDF as clean Markdown, with a Wayback Machine fallback when the page is gone or blocked.
  • web-crawl, web-scrape, web-browse: a whole docs site into one file, repeated records into CSV, and a real Chromium you drive step by step.
  • wayback: what a URL said on a given date, every capture in a period, and Save Page Now.

Video and audio

  • youtube-search, youtube-transcript and youtube-audio cover search, captions and saving the audio.
  • transcribe-audio: local faster-whisper for videos without captions, voice memos and podcast episodes.
  • podcast-search: Apple's public search API plus the show's own RSS feed.

Reading sources properly

  • scholar-search: arXiv, Crossref, Europe PMC, PubMed and bioRxiv, merged into one record per paper.
  • cite-check: checks a reference list or a .bib against doi.org, Crossref, arXiv and PubMed.
  • wiki-lookup: Wikipedia in any language plus Wikidata, with revision ids for citing.
  • hackernews, telegram-channel: HN search and comment trees; public Telegram channels without an account.

Making things

  • human-writing: drafts and reviews prose; every claim has to trace to a source, and a linter flags machine-sounding patterns before you publish.
  • pdf-typeset: Markdown or JSON to a checked PDF through Typst.
  • anki-deck: Anki decks you can rebuild without duplicating cards.

There's also weather: forecast, past weather back to 1940, and air quality, from Open-Meteo.

Three rules every skill follows

A plain script with its dependencies inline. Each script declares what it needs in a PEP 723 header, so uv run installs it on first use. Six of the skills use only the standard library. There's no server to run and nothing to configure for Docker or MCP.

The trade-off: dependencies are version ranges, not a lock file, so the agent installs current releases without anyone reviewing them. For the yt-dlp skills that's deliberate: YouTube changes often, and old yt-dlp releases stop working (uv run --refresh picks up a new one). If you'd rather pin, uv lock --script locks a script. transcribe-audio is the one skill that downloads a large file on its own (Whisper models, 78 MB and up), and it asks first.

An exit code the agent can act on. Every script prints one error: line with a hint, and in the search and lookup skills the common codes mean the same thing: 1 is "nothing found", 2 is bad input, 4 is "blocked or rate-limited, stop", 6 is a network error worth one retry later, 7 is an unexpected failure. An unhandled error exits 7, not 1, so an agent can't mistake a bug for an empty result; a CI check makes sure every script catches it. Other codes are skill-specific (in pdf-typeset, 1 means the PDF was written but its checks found problems); each SKILL.md has its table.

Nothing agent-specific in a skill's instructions. No agent product names, no agent tool names like WebFetch, no install paths in SKILL.md. (The one exception is in code: a few web scripts look for the web-extract skill in each agent's skills folder.) Claude Code, Codex, Cursor, Gemini CLI and OpenCode read the same format; the installer copies the folders into each agent's skills directory. A CI check greps every skill for violations.

Rate limits and licences

Every script that calls a public API directly sends User-Agent: utility-belt-<skill>/1.0 (+https://github.com/zedxter/utility-belt) and keeps to the source's published limits. arXiv gets at most one request every three seconds, NCBI three a second, and HN Search stays under its 10,000 requests an hour. Only scholar-search's arXiv spacing holds across parallel runs on the same machine; the other limits are kept within one run. For Wikipedia, wiki-lookup sends that User-Agent and makes one request at a time, which is the fix for the 403:

$ uv run scripts/wiki.py summary "Ada Lovelace"
# Ada Lovelace
English mathematician (1815–1852)

Augusta Ada King, Countess of Lovelace, also known as Ada Lovelace, was an English
mathematician and writer chiefly known for work on Charles Babbage's proposed
mechanical general-purpose computer, the analytical engine. ...
Enter fullscreen mode Exit fullscreen mode

(Text from Wikipedia, CC BY-SA 4.0. Commands like this one run from the skill's folder, for example ~/.claude/skills/wiki-lookup/ after installing for Claude Code.)

The web skills are a different case. Ordinary sites don't publish an API, and some turn away non-browser clients by their TLS handshake, so web-extract impersonates a browser's handshake to get past that filter. It sends its own User-Agent, stops at CAPTCHAs and bot challenges with exit 4, and is meant for pages you could open in your own browser. web-crawl honours robots.txt.

Some access is unofficial, and that's your call to make: youtube-audio and youtube-transcript go through yt-dlp and an unofficial captions library, and web-search reads search engines' result pages. Your own SearXNG and the official APIs are the options that stay within the platforms' terms. Everything these skills fetch also lands in the agent's context, so the web, wayback, Telegram, HN and Wikipedia skills tell the agent to treat that content as data and never follow instructions in it. For web-browse, a profile without your real logins is the safer default.

Licences are part of the rules too. Open-Meteo's free tier is non-commercial, so weather says so and credits the data. Dependencies can't be GPL or AGPL, a policy that keeps the default install clean for anyone who vendors or redistributes the skills. That cost real work once, because yt-dlp[default] pulls in mutagen, which is GPL, only to embed cover art. youtube-audio now embeds covers with ffmpeg instead.

Review and tests

The ten skills added most recently each went through at least two independent reviews before merging, usually one on the code and one on the spec and the docs. Every pull request's reviews found real bugs. A few:

  • The first version of cite-check marked fabricated references as verified: a real DOI with an invented title, invented co-authors, Nature Communications cited as Nature. It now compares title words, the first author and the venue strictly (abbreviated journal names still match), and every one of those cases is a regression test. When in doubt it says MISMATCH rather than VERIFIED, at the cost of some false alarms on preprints and renamed venues.
  • In anki-deck, an image reference like ![](/etc/hostname) packed that file into the deck. Media now has to be an image, audio or video file inside the input's own folder (or a folder given with --media).
  • weather -33.87,151.21 failed: the argument parser read the minus sign as an option, which broke the whole southern hemisphere.
  • hackernews decoded HTML entities twice, so &amp;region=us in a link came out as ®ion=us.

Here is cite-check given a real DOI pasted under the wrong paper:

$ uv run scripts/cite_check.py --doi 10.1038/nature14539 \
    --title "Attention is all you need" --author "Vaswani, Ashish" --year 2017
MISMATCH     ref1
  cited:   Attention is all you need
  found:   Deep learning
           Lecun et al. · Nature · 2015  https://doi.org/10.1038/nature14539
  differs: doi: cited 10.1038/nature14539 · found 10.1038/nature14539 (resolves to a different work)
  differs: title: cited Attention is all you need · found Deep learning
  ...
Enter fullscreen mode Exit fullscreen mode

The DOI exists, but it belongs to LeCun's "Deep learning", so the reference is flagged instead of passing.

Then the tests: 569 test functions across 20 suites, run in CI on every pull request. The offline tests for youtube-search and youtube-transcript cover only input parsing and error handling, and the live check can't tell their breakage from a block, so a real regression in fetching would show up as "blocked". They are offline on purpose, against local HTTP servers and canned API answers. The real sources get a separate check: a weekly workflow runs a live command for 15 of the skills and keeps a single GitHub issue open while something is broken. Exits 4 and 6 go in their own section, "blocked or unreachable from the runner", because YouTube often bot-checks GitHub's runners for transcripts and downloads.

That points at a real limit. The video and scraping skills assume a home or office connection. From cloud agents and other datacenter IPs, YouTube and some sites block them much of the time, and the scripts say so with exit 4.

The description is a routing rule

An agent decides whether to open a skill from its description alone, so that line gets tested like code. Each of the ten newest skills has trigger evals: about a dozen prompts that must load it or are near misses that must not, run once each on Claude Code and on Codex.

scholar-search is the clearest example. The first description listed what the skill searches. With it, Claude answered "What are the most cited papers on graph neural networks?" from memory, with citation counts it hadn't checked, and called Unpaywall directly when asked for a free full-text PDF of a DOI. After the description was changed to lead with "Use whenever an answer should name real scholarly papers instead of recalling them from memory", both prompts loaded the skill and the near misses still didn't: 12 of 12, from 10. One run per prompt on the same twelve prompts that showed the problem is a small, non-held-out sample: it shows those two failures fixed, not routing improved in general. Codex scored 11 of 12 both times. Its miss was a near miss: asked to check the references in a refs.bib, it opened scholar-search, read that the task belongs to cite-check, and went looking for that skill.

Try it

npx skills add zedxter/utility-belt                         # pick skills and agents interactively
npx skills add zedxter/utility-belt --all -a claude-code    # everything, for one agent
Enter fullscreen mode Exit fullscreen mode

Each installed skill adds its description to every session, so picking the ones you need beats installing all twenty. Most scripts need nothing but uv. youtube-audio also needs ffmpeg, web-browse needs Playwright's Chromium, and web-crawl and web-scrape need web-extract installed next to them. Each skill's compatibility field lists what it needs.

Then ask your agent for something it used to fail at: the transcript of a YouTube talk, the HN thread about a library you're evaluating, whether the references in a draft exist, last July's weather in a city you're moving to.

Contribute

The twenty skills cover the failures written up in the repo's issues. Yours are probably different. CONTRIBUTING.md has the checklist: a description written as a routing rule, the shared exit codes, no GPL imports, a User-Agent and the source's limits. From a clone of the repo, one command checks most of it:

git clone https://github.com/zedxter/utility-belt && cd utility-belt
python3 test/ops.py validate        # spec, frontmatter, size, agent neutrality, licences
python3 test/ops.py test <skill>    # your skill's offline tests with exactly CI's dependencies
python3 test/ops.py probe <skill>   # your skill against its real source
Enter fullscreen mode Exit fullscreen mode

Take it

All of it is open source under MIT: take the skills, use them in your own setup, fork them, change them. The repository is github.com/zedxter/utility-belt.

Suggestions of any kind are welcome. If there's a free API your agent keeps fumbling, open an issue with the endpoint and what goes wrong; that's how many of these started. And if the collection saves you a few failed fetches, a star on the repo makes my day.