Install any skill in seconds. Free to start, no credit card required.
Get Started Free →What to do when a tool fails, an API hits a rate limit, or a site blocks scraping. Maps every primary tool to its best fallback so a single failure doesn't block the search.
.claude/skills/borski-fallback-and-resilience/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 145% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 9% | 0% |
Tools go down. APIs break. Have a backup plan for every search.
| Primary Tool | When It Fails | Fallback | |-------------|---------------|----------| | Duffel | API error or timeout | Ignav, Google Flights skill, Skiplagged | | Ignav | API error | Duffel, Google Flights skill, Skiplagged | | Google Flights | agent-browser error | Duffel, Ignav, Skiplagged | | Skiplagged | 502/timeout (Cloudflare issues) | Kiwi.com MCP, Duffel, Ignav | | Kiwi.com | Server error | Skiplagged MCP, Duffel | | Seats.aero | API error or stale data | Check airline website directly, use Duffel for GDS inventory | | Southwest | SW rate limiting or bot detection | Wait a few minutes and retry. Use Docker (ghcr.io/borski/sw-fares) if running locally fails. Google Flights skill for SW cash prices as a fast fallback. | | SerpAPI | Rate limit (100/mo free) | Trivago for hotels, web search for destination discovery | | Trivago | Server error | LiteAPI for hotels, SerpAPI Google Hotels | | LiteAPI | Auth error (401) | Trivago MCP, SerpAPI Google Hotels | | Airbnb | Scraping blocked | Suggest user check airbnb.com directly | | AwardWallet | API error | Ask user for their balances directly | | Ferryhopper | Server error | SerpAPI or web search for ferry routes | | Atlas Obscura | Script error | Web search for "unusual things to do in destination]" | | Chase Travel | Login failure or CSRF issues | Use Duffel/Ignav for cash prices. Note that Points Boost and Edit detection are Chase-only. | | Amex Travel | Login failure or form changes | Use Duffel/Ignav for cash prices. Note that IAP fares and FHR/THC detection are Amex-only. | | Deutsche Bahn (db-vendo) | Library error or bahn.de outage | SerpAPI Google Travel Explore, web search for "DB train origin] dest]", or fall back to confirming flight options instead. | | Wikipedia airports | API rate limit (rare) or page missing | Web search "airport name] airlines destinations" returns the same data via Google. | | Fare tool says "no results" | Could be no availability OR no service | Use wikipedia-airports to confirm whether the route is flown at all. If Wikipedia lists the destination as served, fare tools have no availability on that date. If Wikipedia doesn't list it, the route doesn't exist. Saves you from asking the user to retry searches that can never succeed. |
Do not declare an MCP server "not available" from a glance at your tool list — attempt an actual tool call first. The Skiplagged and Kiwi servers need no API keys and are wired into every supported harness config; a session launched from the repo directory has them. If a call genuinely fails, quote the error to the user and then fall back.
And when falling back, never silently substitute ad-hoc browser scraping for the toolkit's sources. Improvised scraping (e.g., driving a browser to Google Flights by hand) produces prices that miss most of the market. If you're ever reduced to it, say so explicitly and label every price from it as low-confidence: "MCP sources were unreachable, so this is a single scraped quote — treat it as a ceiling, not a market price."
Several APIs in the toolkit enforce IP allowlists on the developer key. If you see one of these error signatures, do NOT rabbit-hole on auth or quotas. Suggest the user whitelist their IP first.
| API | Error Signature | Whitelist Page | |---|---|---| | AwardWallet | {"error": "access_denied", "code": "IP_DENIED"} | https://business.awardwallet.com/profile/api | | TripAdvisor | User is not authorized to access this resource with an explicit deny | https://www.tripadvisor.com/developers |
Diagnostic flow when an API call fails with an auth-shaped error on first use:
curl ifconfig.me to get the user's current outbound IP.<their IP> at <provider page>, wait 1-5 min for AWS edge cache propagation, then retry."When Seats.aero returns no results for a route + program combination, that means Seats.aero has not scraped it recently. It does NOT mean the award is unbookable. When a reachable program shows no cached results, search the airline's website directly before declaring awards dead.
These hit websites directly with an undetected browser. Common failure modes:
If docker pull ghcr.io/borski/... fails:
unauthorized: Run docker logout ghcr.io then retry. Or login with a GitHub PAT that has read:packages. Or build locally with docker build -t <tag> skills/<skill>/.--platform linux/amd64 if you're on ARM and getting checksum mismatches.Other measured skills in the registry, with their headline benchmark lift.