Agent skill

External API Change

by GuyTeichman in GuyTeichman/RNAlysis

Workflow for fixing or changing RNAlysis code that talks to an EXTERNAL WEB SERVICE — UniProt, Ensembl, PANTHER, PhylomeDB, OrthoInspector, KEGG, or GO.

MITAuto-check passedResearch & Science

Install External API Change

skills CLI
$ npx skills add GuyTeichman/RNAlysis --skill external-api-change -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install GuyTeichman/RNAlysis external-api-change --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/GuyTeichman/RNAlysis.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/external-api-change .claude/skills/external-api-change && rm -rf skills-src

Use ~/.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/

Facts

Skill name
external-api-change
GitHub stars
140
Token cost
~1.8k tokens
SKILL.md length
938 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

Workflow for fixing or changing RNAlysis code that talks to an EXTERNAL WEB SERVICE — UniProt, Ensembl, PANTHER, PhylomeDB, OrthoInspector, KEGG, or GO.

  • Works in 4 steps: Confirm the service's REAL current… → Preserve the io.py scaffolding; degrade… → Capture a real payload as a test… → …
  • Asked to capture a fixture for an external API
  • SKILL.md covers When to use this vs. skip it, Step 1 — Confirm the service's…, Step 2 — Preserve the io.py… and Step 3 — Capture a real…, plus 2 more sections
  • Calls python and pytest; reaches rest.uniprot.org

What it does

External API Change is an agent skill from GuyTeichman/RNAlysis. Workflow for fixing or changing RNAlysis code that talks to an EXTERNAL WEB SERVICE — UniProt, Ensembl, PANTHER, PhylomeDB, OrthoInspector, KEGG, or GO. Use before touching rnalysis/utils/io.py or its callers (enrichment.py, enrichmentrunner.py, ontology.py) to fix a broken/changed API, handle a format change, or add a new call to one of these services. Also use when asked to "capture a fixture for an external API", "the GO/UniProt/Ensembl/PANTHER/KEGG/ PhylomeDB/OrthoInspector integration broke", or "mock an…

Its SKILL.md is about 1.8k 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 Research & Science, covering Bioinformatics. It works with Ensembl and UniProt. The repository describes itself as: Analyze your RNA sequencing data without writing a single line of code. The licence is MIT.

When your agent uses it

  • Asked to capture a fixture for an external API
  • The GO/UniProt/Ensembl/PANTHER/KEGG/ PhylomeDB/OrthoInspector integration broke
  • Mock an external service in a test

Example prompts

  • “capture a fixture for an external API”
  • “mock an external service in a test”
  • “/external-api-change”

Requirements

  • Python 3

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Confirm the service's REAL current behavior before writing any code
  2. Preserve the io.py scaffolding; degrade gracefully
  3. Capture a real payload as a test fixture, then mock it
  4. Know your CI network tier

What it can do on your machine

Read from SKILL.md and the folder at commit 0c70cc2. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • python
    • pytest

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • rest.uniprot.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

External API Change loads about 1.8k tokens when it runs. Until then it costs about 168 tokens; SKILL.md has 938 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~168
When it runs · the whole SKILL.md, loaded when a task matches
~1.8k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from GuyTeichman/RNAlysis at commit 0c70cc2, republished under its MIT licence (© GuyTeichman). 938 words, ~1,840 tokens.

Download SKILL.mdSave it as .claude/skills/external-api-change/SKILL.md (or your agent's skills folder).
name
external-api-change
description
Workflow for fixing or changing RNAlysis code that talks to an EXTERNAL WEB SERVICE — UniProt, Ensembl, PANTHER, PhylomeDB, OrthoInspector, KEGG, or GO. Use before touching rnalysis/utils/io.py or its callers (enrichment.py, enrichment_runner.py, ontology.py) to fix a broken/changed API, handle a format change, or add a new call to one of these services. Also use when asked to "capture a fixture for an external API", "the GO/UniProt/Ensembl/PANTHER/KEGG/ PhylomeDB/OrthoInspector integration broke", or "mock an external service in a test". Skip for CLI-tool integrations (kallisto, bowtie2, R) — those are a different fragile area, not this one.

Changing code that talks to an external web service

This is, by the project's own account, the most fragile part of the codebase (see CLAUDE.md gotchas and .claude/context.md fragile spots #1). UniProt, Ensembl, PANTHER, PhylomeDB, OrthoInspector, KEGG, and GO change response formats, rename fields, and go down without notice — all outside RNAlysis' control. The relevant code lives in rnalysis/utils/io.py (async aiohttp + tenacity retries + aiolimiter rate limiting + response caches) and its callers: enrichment.py, utils/enrichment_runner.py, utils/ontology.py.

Real precedents worth knowing before you start: OrthoInspector relocated its whole API to api.bigest-icube.fr; Ensembl silently dropped cross-division ortholog data (worm→human now returns nothing); PANTHER can return an empty HTTP 200 body instead of an error. None of these were visible from reading old code — each needed a live check.

This is TDD like everything else in the repo, with one twist: step 1 happens before you write any test, because you cannot write an honest test against a service whose current behavior you haven't confirmed.


When to use this vs. skip it

Use this skill for any change to code that issues a request to one of the six services above, or adds a new one. Skip it for CLI-tool bridges (kallisto/bowtie2/cutadapt/R) — those have their own fragility (see CLAUDE.md's R/permissions gotcha and .claude/workflows.md's R-bridge workflow) but aren't a web-API problem.


Step 1 — Confirm the service's REAL current behavior before writing any code

Do not trust the existing code, your training data, or memory of "how this API works" — these services change often enough that stale assumptions are the #1 way this class of fix goes wrong. Before touching io.py or its callers:

  • Hit the endpoint live (curl / browser / a throwaway Python snippet) and read the actual response — status code, headers, body shape, field names.
  • Or use the research skill to investigate and record what you found.
  • If network access isn't available in your environment, say so explicitly and get a human (or an agent with network access) to confirm before coding against assumptions.

Write down what you found (in the PR description at minimum) — the next person debugging this service needs that evidence trail, not just the resulting diff.

Step 2 — Preserve the io.py scaffolding; degrade gracefully

Keep the existing resilience layers intact while you fix the specific breakage:

  • tenacity retry decorators around the request.
  • aiolimiter rate limiting (services like UniProt idmapping throttle hard; CI already hits this — see the CI note below).
  • The response caches (don't bypass them while debugging and then forget to restore them).

A changed or dead service must never crash the app. If the new response shape can't be parsed, fail toward an empty/partial result with a clear, user-facing message — not an unhandled exception. This is a non-programmer-facing GUI (per CLAUDE.md); a stack trace is not an acceptable failure mode for "PANTHER is down today."

Step 3 — Capture a real payload as a test fixture, then mock it

Tests must never depend on the live service (flaky by construction, and CI's network tier is narrow — see below). Capture one:

bash
python packaging/snapshot_api_payload.py https://rest.uniprot.org/idmapping/status/abc123
python packaging/snapshot_api_payload.py https://api.example.org/search \
    --param query=BRCA1 --header "Accept: application/json" \
    --out tests/test_files/example_search_response.json

This provider-neutral helper does a plain GET and writes the raw response body byte-for-byte to tests/test_files/ (default) or --out, deriving a filename from the URL when you don't name one. Run python packaging/snapshot_api_payload.py --help for the full option list. It makes a real live request — run it locally/by hand where you have network, not in a sandboxed or offline environment. It does not itself write or run any test; it only produces the fixture file.

Then write the test in the matching tests/test_*.py (test_io.py for most of these) mocking the HTTP layer against that fixture. The repo's established convention is requests_mock for synchronous requests calls (see the many with requests_mock.Mocker() as m: blocks already in tests/test_io.py) — match whichever HTTP client (requests vs aiohttp) the code under test actually uses, and mock at that layer.

Red → green → refactor from here as usual: write the failing test against the captured fixture, make it pass, clean up, run the module's test file.

Show full SKILL.md (280 more words)Show less

Step 4 — Know your CI network tier

Read tests/conftest.py and .github/workflows/build_ci.yml if you need the exact current rules; as of this writing:

  • tests/conftest.py auto-assigns test_io.py to the integration_net tier (network/web-API tests), a leaf tier under the integration umbrella marker. A test elsewhere gets the same tier automatically if it carries a skipif whose reason mentions "available" (the live-network tests scattered through test_enrichment.py etc.).
  • build_ci.yml runs the integration_net tier on exactly one matrix cell — ubuntu-latest / Python 3.13 — out of the full 3 OS × 3 Python matrix; the other 8 cells skip that step outright (the comment in the workflow explains why: avoiding 9x redundant load on rate-limited services). A network-tier red is a 1-of-1 failure, not a 1-of-9 flake — don't wave it off as "just one matrix cell."
  • Run it locally with pytest -m integration_net tests/test_io.py if you have network access; otherwise say plainly in the PR that you could not run it (per CLAUDE.md rule 1).

Definition of done

  • You confirmed the service's current real behavior (Step 1) and said how (live hit, or the research skill), not just re-read the old code.
  • io.py's retry/rate-limit/cache scaffolding is intact; a broken/changed/down service degrades to an empty or partial result with a clear message, never an uncaught crash.
  • A real captured payload lives under tests/test_files/ (via snapshot_api_payload.py or equivalent) and the test mocks against it — no test in the suite depends on the live service to pass.
  • Relevant tests pass locally; you ran integration_net if you had network, and said so plainly if you didn't.
  • If this also changes a public API signature or the GUI reflection contract, that's a second, separate risk — see CLAUDE.md rule 3 (plan-first) before combining the two.

© GuyTeichman, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/external-api-change of GuyTeichman/RNAlysis.

Open the folder on GitHubat commit 0c70cc2

Compare with similar skills

External API Change 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.

External API Change compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
External API Change this skillGuyTeichman/RNAlysis140—~1.8kAutomated safety check: PassMIT
Ggetdavila7/claude-code-templates32k11 repos~6.3kAutomated safety check: PassMIT
Bulkrna Geneid MappingTianGzlab/OmicsClaw161—~1kAutomated safety check: PassMIT
Tooluniverse Phylogeneticswu-yc/LabClaw1.1k2 repos~4.2kAutomated safety check: PassNone
Tooluniverse Rnaseq Deseq2wu-yc/LabClaw1.1k2 repos~4.5kAutomated safety check: PassNone
Ggetaipoch/medical-research-skills2k—~816Automated safety check: PassMIT

Similar skills

  • Gget

    davila7/claude-code-templates

    CLI/Python toolkit for rapid bioinformatics queries. An agent skill from davila7/claude-code-templates.

    32k GitHub starsUsed in 11 repos~6.3k tokens
    Research & ScienceAuto-check passed
  • Bulkrna Geneid Mapping

    TianGzlab/OmicsClaw

    Load when converting gene identifiers between Ensembl, Entrez, and HGNC symbol in a bulk RNA-seq count matrix.

    161 GitHub stars~1k tokensUpdated 2 mo ago
    Research & ScienceAuto-check passed
  • Production-ready phylogenetics and sequence analysis skill for alignment processing, tree analysis, and evolutionary metrics.

    1.1k GitHub starsUsed in 2 repos~4.2k tokens
    Research & ScienceAuto-check passed
  • Production-ready RNA-seq differential expression analysis using PyDESeq2.

    1.1k GitHub starsUsed in 2 repos~4.5k tokens
    Research & ScienceAuto-check passed
  • Gget

    aipoch/medical-research-skills

    Unified CLI/Python interface for querying genomic, proteomic, structure, and expression data across 20+ bioinformatics databases; use when you need fast, scriptable retrieval by gene/protein IDs or…

    2k GitHub stars~816 tokensUpdated 20 days ago
    Research & ScienceAuto-check passed
  • Bioservices Multi Database

    jaechang-hits/SciAgent-Skills

    Unified Python interface to 40+ bioinformatics web services: UniProt proteins, KEGG pathways, ChEMBL/ChEBI/PubChem, BLAST, cross-database ID mapping, GO annotations, PPI.

    370 GitHub starsUsed in 1 repo~6.1k tokens
    Research & ScienceAuto-check passed

More from GuyTeichman/RNAlysis

  • Gui Screenshots

    GuyTeichman/RNAlysis

    Capture and attach RNAlysis GUI screenshots to a PR whenever a change makes a VISIBLE difference to a GUI dialog.

    140 GitHub stars~2k tokensUpdated 9 days ago
    Auto-check passed
  • Safe Optimization

    GuyTeichman/RNAlysis

    Make RNAlysis code faster while proving the output does not change.

    140 GitHub stars~2.8k tokensUpdated 9 days ago
    Auto-check passed

Works with

Questions about External API Change

What does External API Change do?

Workflow for fixing or changing RNAlysis code that talks to an EXTERNAL WEB SERVICE — UniProt, Ensembl, PANTHER, PhylomeDB, OrthoInspector, KEGG, or GO. External API Change is an agent skill from GuyTeichman/RNAlysis. Workflow for fixing or changing RNAlysis code that talks to an EXTERNAL WEB SERVICE — UniProt, Ensembl, PANTHER, PhylomeDB, OrthoInspector, KEGG, or GO.

When should I use External API Change?

External API Change fits situations like: asked to capture a fixture for an external API; the GO/UniProt/Ensembl/PANTHER/KEGG/ PhylomeDB/OrthoInspector integration broke; mock an external service in a test.

How do I install External API Change in Claude Code?

Run `npx skills add GuyTeichman/RNAlysis --skill external-api-change -a claude-code`. Or copy the skill folder (.claude/skills/external-api-change in GuyTeichman/RNAlysis) into .claude/skills/external-api-change in your project. Claude Code loads it when a task matches its description.

How do I install External API Change in Codex?

Run `npx skills add GuyTeichman/RNAlysis --skill external-api-change -a codex`. Or copy the skill folder (.claude/skills/external-api-change in GuyTeichman/RNAlysis) into .agents/skills/external-api-change in your project. Codex loads it when a task matches its description.

Can I use External API Change in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add GuyTeichman/RNAlysis --skill external-api-change -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/external-api-change, .gemini/skills/external-api-change, .github/skills/external-api-change and .opencode/skills/external-api-change in your project.

What does External API Change need to run?

Going by SKILL.md and its folder, External API Change needs the command-line tools its instructions call (python and pytest). Our summary lists: Python 3.

Does External API Change access the network?

SKILL.md names 1 domain. In commands or code: rest.uniprot.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is External API Change safe to install?

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.

What licence does External API Change use?

External API Change is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does External API Change use?

About 1.8k tokens (SKILL.md is roughly 7.4k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to External API Change?

Skills that share tags, products or a category with External API Change: Gget (davila7/claude-code-templates, 32k stars), Bulkrna Geneid Mapping (TianGzlab/OmicsClaw, 161 stars), Tooluniverse Phylogenetics (wu-yc/LabClaw, 1.1k stars) and Tooluniverse Rnaseq Deseq2 (wu-yc/LabClaw, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains External API Change?

GuyTeichman (a GitHub user) maintains it in GuyTeichman/RNAlysis, which has 140 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on September 28, 2026.

Source: GuyTeichman/RNAlysis on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.