{"id":"2c28959b-50f8-4cdd-bf40-0c47a8784649","entityType":"agent","slug":"clawhub-chrischall-setlist","name":"setlist","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-setlist","canonicalPath":"/agent/clawhub-chrischall-setlist","generatedAt":"2026-10-10T10:42:59.494Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:00:25.196Z","emptyReason":null},"description":"Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:setlist","sourceUrl":"https://clawhub.ai/chrischall/setlist","homepage":"https://clawhub.ai/chrischall/skills/setlist","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/setlist","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/setlist","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"setlist technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:00:25.196Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:00:25.196Z","emptyReason":null},"stars":null,"forks":null,"downloads":1669,"packageName":null,"latestVersion":"1.1.8","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:00:25.196Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T05:00:25.196Z","lastCrawledAt":"2026-10-10T05:00:25.196Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T05:00:25.196Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.8","createdAt":"2026-10-09T23:28:51.096Z","changelog":"- Removed the skill-card.md file. - No user-facing functionality or API changes; only documentation/assets adjustment.","fileCount":3,"zipByteSize":5817},{"version":"1.1.7","createdAt":"2026-10-07T13:40:02.640Z","changelog":"- Removed the file: skill-card.md. - No changes to available tools or user-facing features. - Internal documentation/layout is unchanged except for the file removal.","fileCount":3,"zipByteSize":5824},{"version":"1.1.6","createdAt":"2026-10-05T02:48:50.598Z","changelog":"- Removed the file: skill-card.md. - No changes to behavior or functionality; the update only affects documentation files.","fileCount":3,"zipByteSize":5782},{"version":"1.1.5","createdAt":"2026-10-03T01:43:28.528Z","changelog":"- Removed the file skill-card.md from the project. - No user-facing feature changes. - Internal documentation or metadata only.","fileCount":3,"zipByteSize":5741},{"version":"1.1.4","createdAt":"2026-09-28T13:55:56.335Z","changelog":"- Removed the file: skill-card.md - No functional changes to the skill itself; this is a documentation cleanup.","fileCount":3,"zipByteSize":5773},{"version":"1.1.3","createdAt":"2026-09-25T15:51:45.672Z","changelog":"setlist 1.1.3 - Removed the skill-card.md file. - Updated SKILL.md to clarify that attendance-marking tools no longer require a confirmation step; each can be undone by the other. - No user-facing functional changes.","fileCount":3,"zipByteSize":5835},{"version":"1.1.2","createdAt":"2026-09-23T21:46:29.462Z","changelog":"- Added new errored status to the setlist_resolve_concerts batch tool for failed lookups; results now include an errored count and individual errors per unmatched show without interrupting the batch. - Updated documentation for setlist_resolve_concerts to describe the new errored output and handling. - Removed obsolete skill-card.md file.","fileCount":3,"zipByteSize":5795},{"version":"1.1.1","createdAt":"2026-09-23T15:41:18.541Z","changelog":"- Removed the file skill-card.md from the project. - No changes to code or tool functionality. - Documentation and setup instructions remain unchanged.","fileCount":3,"zipByteSize":5855}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:setlist","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:setlist` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/chrischall/setlist before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:42:59.490Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:00:25.196Z","emptyReason":null},"readme":"Skill: setlist\n\nOwner: chrischall\n\nSummary: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n\nTags: latest:1.1.8\n\nVersion history:\n\nv1.1.8 | 2026-10-09T23:28:51.096Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing functionality or API changes; only documentation/assets adjustment.\n\nv1.1.7 | 2026-10-07T13:40:02.640Z | auto\n\n- Removed the file: skill-card.md.\n- No changes to available tools or user-facing features.\n- Internal documentation/layout is unchanged except for the file removal.\n\nv1.1.6 | 2026-10-05T02:48:50.598Z | auto\n\n- Removed the file: skill-card.md.\n- No changes to behavior or functionality; the update only affects documentation files.\n\nv1.1.5 | 2026-10-03T01:43:28.528Z | auto\n\n- Removed the file skill-card.md from the project.\n- No user-facing feature changes.\n- Internal documentation or metadata only.\n\nv1.1.4 | 2026-09-28T13:55:56.335Z | auto\n\n- Removed the file: skill-card.md\n- No functional changes to the skill itself; this is a documentation cleanup.\n\nv1.1.3 | 2026-09-25T15:51:45.672Z | auto\n\nsetlist 1.1.3\n\n- Removed the skill-card.md file.\n- Updated SKILL.md to clarify that attendance-marking tools no longer require a confirmation step; each can be undone by the other.\n- No user-facing functional changes.\n\nv1.1.2 | 2026-09-23T21:46:29.462Z | auto\n\n- Added new errored status to the setlist_resolve_concerts batch tool for failed lookups; results now include an errored count and individual errors per unmatched show without interrupting the batch.\n- Updated documentation for setlist_resolve_concerts to describe the new errored output and handling.\n- Removed obsolete skill-card.md file.\n\nv1.1.1 | 2026-09-23T15:41:18.541Z | auto\n\n- Removed the file skill-card.md from the project.\n- No changes to code or tool functionality.\n- Documentation and setup instructions remain unchanged.\n\nv1.1.0 | 2026-09-20T02:51:53.893Z | auto\n\n- Removed the skill-card.md file from the project.\n- No other functional or user-facing changes.\n\nv1.0.0 | 2026-09-19T11:19:07.245Z | auto\n\nsetlist v1.0.0\n\n- Initial release.\n- All documentation and usage details are in SKILL.md.\n- Removed the redundant skill-card.md file.\n\nv0.11.4 | 2026-09-15T19:24:57.959Z | auto\n\n- Removed the file: skill-card.md.\n- No user-facing changes to features or function.\n- Maintenance update; documentation file cleanup only.\n\nv0.11.3 | 2026-09-14T14:08:41.118Z | auto\n\n- Removed the file: skill-card.md\n- No user-facing features or functionality were changed.\n- No updates were made to code, documentation, or workflow beyond file removal.\n\nv0.11.2 | 2026-09-10T17:52:56.995Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing changes to features or behavior.\n\nv0.11.1 | 2026-09-05T00:51:43.247Z | auto\n\nsetlist 0.11.1\n\n- Added detailed documentation of the new `view: \"compact\" | \"full\"` parameter for search and getter tools, with \"compact\" as the default.\n- Explained how \"compact\" response strips image/avatar URLs without projecting fields; \"full\" returns untouched payload.\n- Noted which tools support the `view` parameter and the reasons for those that do not.\n- Updated SKILL.md accordingly; removed the obsolete skill-card.md file.\n\nv0.11.0 | 2026-09-04T22:22:59.871Z | auto\n\n- Removed the skill-card.md file.\n- No functional or API changes—documentation file removed only.\n\nv0.10.0 | 2026-08-29T13:54:48.034Z | auto\n\n- Removed the file skill-card.md.\n- No functional or user-facing changes.\n- This update is housekeeping only; all usage and setup remain unchanged.\n\nv0.9.9 | 2026-08-28T21:07:58.387Z | auto\n\n- Removed the file: skill-card.md\n- No new features or changes to functionality\n- No updates to documentation except for the file removal\n\nv0.9.8 | 2026-08-28T11:35:31.874Z | auto\n\n- Skill name changed from \"setlist-mcp\" to \"setlist\"\n- Removed redundant or outdated file: skill-card.md\n- Updated references, descriptions, and setup instructions to use the new skill name\n- No changes to functionality or API usage; documentation remains up to date with current commands and API terms\n\nv0.9.7 | 2026-08-09T21:03:32.463Z | auto\n\n- Removed the file: skill-card.md.\n- No changes to core functionality or documentation.\n\nv0.9.6 | 2026-08-06T00:44:08.216Z | auto\n\n- Removed the file: skill-card.md.\n- No functional or user-facing changes; documentation and functionality remain the same.\n\nv0.9.5 | 2026-08-03T04:33:29.265Z | auto\n\n- Removed the file: skill-card.md\n- No changes to core functionality or setup\n- Documentation and usage remain the same\n\nv0.9.4 | 2026-07-30T12:54:52.427Z | auto\n\n- Removed the file skill-card.md.\n- No functional or feature changes; documentation and all tooling remain unchanged.\n\nv0.9.3 | 2026-07-27T02:55:35.593Z | auto\n\n- Improved documentation with detailed setup instructions for both npx and source builds.\n- Clarified tool usage, typical flows, and tips for resolving artists, venues, cities, and dates.\n- Expanded guidelines on setlist.fm attribution and API terms, emphasizing proper usage and linking.\n- Added sections explaining batch resolution, paginated results, stub handling, and interpreting setlist data.\n\nArchive index:\n\nArchive v1.1.8: 3 files, 5817 bytes\n\nFiles: skill-card.md (1951b), SKILL.md (10022b), _meta.json (126b)\n\nFile v1.1.8:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account. Each undoes the other, so neither asks for a\nconfirmation step.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. A concert whose lookup fails upstream comes back with `match: null` and an `error` (counted in `errored`) without sinking the batch. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.8\",\n  \"publishedAt\": 1791588531096\n}\n\nFile v1.1.8:skill-card.md\n\n## Description:\n\nHelps agents look up concert setlists and live-music history through setlist.fm.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMusic fans and researchers use this skill to find songs performed at concerts and explore shows by artist, venue, city, date, or tour. It also offers tools to mark or unmark concerts as attended on a user's account.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Despite read-only wording, attendance tools can change the user's setlist.fm account without a built-in confirmation step.\n\nMitigation: Require explicit user approval before marking or unmarking any concert as attended.\n\nRisk: The integration requires access to a user's setlist.fm API key.\n\nMitigation: Provide the key only to a trusted server and do not expose or share it in responses.\n\nRisk: A free setlist.fm API key is limited to non-commercial use, even though this release has a commercial usage posture.\n\nMitigation: Obtain setlist.fm permission before commercial API use and include source links when presenting results.\n\n## Reference(s):\n\n- [setlist-mcp package](https://www.npmjs.com/package/setlist-mcp)\n- [setlist.fm API key setup](https://www.setlist.fm/settings/api)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown]\n\n**Output Format:** [Markdown with links to setlist.fm results]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Answers may include song lists, show details, and links to the source results.]\n\n## Skill Version(s):\n\n1.1.8 (source: server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.7: 3 files, 5824 bytes\n\nFiles: skill-card.md (1952b), SKILL.md (10022b), _meta.json (126b)\n\nFile v1.1.7:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account. Each undoes the other, so neither asks for a\nconfirmation step.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. A concert whose lookup fails upstream comes back with `match: null` and an `error` (counted in `errored`) without sinking the batch. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.7:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.7\",\n  \"publishedAt\": 1791380402640\n}\n\nFile v1.1.7:skill-card.md\n\n## Description:\n\nHelps agents find concert setlists and live-music history through setlist.fm, with optional attendance updates.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMusic fans and researchers use this skill to find songs played at concerts, explore artists' tours and venue histories, and identify shows by date or location. It can also mark or unmark concerts attended on a user's setlist.fm account.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Attendance tools can change a setlist.fm account despite the skill describing itself as read-only and saying confirmation is unnecessary.\n\nMitigation: Require explicit user approval before marking or unmarking attendance.\n\nRisk: Connecting the server requires sharing a setlist.fm API key with it.\n\nMitigation: Install only if comfortable granting the server access to the API key; do not expose the key in responses.\n\n## Reference(s):\n\n- [Setlist ClawHub release](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist-mcp npm package](https://www.npmjs.com/package/setlist-mcp)\n- [setlist.fm API key settings](https://www.setlist.fm/settings/api)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Configuration instructions, Shell commands]\n\n**Output Format:** [Markdown with setlist.fm links and optional setup snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Setlist results may include song details and links; attendance actions change the user's account.]\n\n## Skill Version(s):\n\n1.1.7 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.6: 3 files, 5782 bytes\n\nFiles: skill-card.md (1884b), SKILL.md (10022b), _meta.json (126b)\n\nFile v1.1.6:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account. Each undoes the other, so neither asks for a\nconfirmation step.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. A concert whose lookup fails upstream comes back with `match: null` and an `error` (counted in `errored`) without sinking the batch. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.6:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.6\",\n  \"publishedAt\": 1791168530598\n}\n\nFile v1.1.6:skill-card.md\n\n## Description:\n\nHelps agents find concert setlists, songs, artists, venues, and live-music history through setlist.fm.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMusic fans and researchers use this skill to look up concert setlists, songs performed, artists, venues, and shows by date or location.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Despite read-only descriptions, attendance tools can change a user's setlist.fm account without an additional confirmation step.\n\nMitigation: Only mark or unmark attendance following an explicit user request; treat these actions as account changes.\n\nRisk: The integration requires access to a setlist.fm API key.\n\nMitigation: Supply the key only to a trusted server and do not expose it in responses.\n\nRisk: A free setlist.fm API key is for non-commercial use; commercial use requires permission.\n\nMitigation: Check setlist.fm's API terms and obtain permission before commercial use.\n\n## Reference(s):\n\n- [Setlist skill on ClawHub](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist-mcp package](https://www.npmjs.com/package/setlist-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown with setlist.fm source links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Live results may have incomplete song lists; show attribution links when presenting setlist.fm data.]\n\n## Skill Version(s):\n\n1.1.6 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.5: 3 files, 5741 bytes\n\nFiles: skill-card.md (1816b), SKILL.md (10022b), _meta.json (126b)\n\nFile v1.1.5:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account. Each undoes the other, so neither asks for a\nconfirmation step.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. A concert whose lookup fails upstream comes back with `match: null` and an `error` (counted in `errored`) without sinking the batch. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1790991808528\n}\n\nFile v1.1.5:skill-card.md\n\n## Description:\n\nHelps agents find concert setlists, artists, venues, and live-music history through setlist.fm.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMusic fans and assistants use this skill to look up songs played at concerts, explore artists and venues, and resolve concerts by date and location. Attendance tools can also change a user's setlist.fm account.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Attendance marking and unmarking change a user's setlist.fm account despite read-only wording.\n\nMitigation: Require explicit user intent before using either attendance tool; do not treat the skill as read-only.\n\nRisk: The integration requires a setlist.fm API key.\n\nMitigation: Provide the key only if comfortable granting the integration access, and do not expose it in responses.\n\n## Reference(s):\n\n- [setlist.fm API terms](https://www.setlist.fm/help/api-terms)\n- [setlist.fm API key settings](https://www.setlist.fm/settings/api)\n- [ClawHub setlist skill](https://clawhub.ai/chrischall/skills/setlist)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Text with source links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results may include setlist.fm attribution links and representative tour setlists clearly distinguished from the requested show.]\n\n## Skill Version(s):\n\n1.1.5 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.4: 3 files, 5773 bytes\n\nFiles: skill-card.md (1863b), SKILL.md (10022b), _meta.json (126b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account. Each undoes the other, so neither asks for a\nconfirmation step.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. A concert whose lookup fails upstream comes back with `match: null` and an `error` (counted in `errored`) without sinking the batch. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1790603756335\n}\n\nFile v1.1.4:skill-card.md\n\n## Description:\n\nHelps agents find concert setlists and live-music history through setlist.fm.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMusic fans and researchers use this skill to find songs performed at concerts and explore artists, venues, tours, and live-performance history.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Attendance tools can change the user's setlist.fm account despite read-only wording and no built-in confirmation step.\n\nMitigation: Require explicit user approval before marking or unmarking attendance.\n\nRisk: The integration needs a setlist.fm API key.\n\nMitigation: Provide the key only to a trusted integration, keep it secret, and do not include it in responses.\n\nRisk: The free setlist.fm API key is for non-commercial use.\n\nMitigation: Obtain setlist.fm permission before using its API commercially and follow its attribution terms.\n\n## Reference(s):\n\n- [Setlist skill on ClawHub](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist.fm API terms](https://www.setlist.fm/help/api-terms)\n- [setlist-mcp package](https://www.npmjs.com/package/setlist-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown with source links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Distinguish exact-show setlists from nearby-tour examples and link to setlist.fm sources.]\n\n## Skill Version(s):\n\n1.1.4 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.3: 3 files, 5835 bytes\n\nFiles: skill-card.md (1951b), SKILL.md (10022b), _meta.json (126b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account. Each undoes the other, so neither asks for a\nconfirmation step.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. A concert whose lookup fails upstream comes back with `match: null` and an `error` (counted in `errored`) without sinking the batch. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1790351505672\n}\n\nFile v1.1.3:skill-card.md\n\n## Description:\n\nHelps agents find concert setlists and live-performance history by artist, venue, tour, city, or date through setlist.fm.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to answer questions about songs performed at concerts and to explore artists, venues, and tour histories.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Despite read-only wording, attendance tools can mark or unmark concerts on the user's setlist.fm account without confirmation.\n\nMitigation: Treat the integration as write-capable and invoke attendance changes only when the user explicitly intends them.\n\nRisk: The connected service requires access to a setlist.fm API key.\n\nMitigation: Provide the key only to an MCP server you trust and do not expose or share it.\n\nRisk: A free setlist.fm API key is for non-commercial use, even though this skill release has a commercial usage posture.\n\nMitigation: Obtain setlist.fm permission before using its API commercially.\n\n## Reference(s):\n\n- [setlist on ClawHub](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist-mcp npm package](https://www.npmjs.com/package/setlist-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown with links to source setlists]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Some shows have no recorded songs; nearby tour setlists are references, not exact show records.]\n\n## Skill Version(s):\n\n1.1.3 (source: server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.2: 3 files, 5795 bytes\n\nFiles: skill-card.md (1957b), SKILL.md (9980b), _meta.json (126b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account and are confirm-gated.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. A concert whose lookup fails upstream comes back with `match: null` and an `error` (counted in `errored`) without sinking the batch. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending, errored}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1790199989462\n}\n\nFile v1.1.2:skill-card.md\n\n## Description:\n\nSetlist helps agents look up concert setlists and live-music history through the setlist.fm MCP server.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users, developers, and music researchers use this skill to find artist, venue, city, tour, date, and user setlist information. It also guides agents through setlist.fm attribution, API-key setup, batching, pagination, and interpretation of live-performance data.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The attendance tools can change the user's setlist.fm account state.\n\nMitigation: Confirm explicit user intent before marking or unmarking attendance.\n\nRisk: The skill requires a setlist.fm API key and MCP server setup before lookups work.\n\nMitigation: Install it only when setlist.fm access is intended, keep SETLIST_API_KEY private, and verify connectivity with the healthcheck tool.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist-mcp npm package](https://www.npmjs.com/package/setlist-mcp)\n- [setlist.fm API key settings](https://www.setlist.fm/settings/api)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with JSON configuration and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires setlist-mcp server registration and SETLIST_API_KEY; setlist.fm results should preserve attribution links.]\n\n## Skill Version(s):\n\n1.1.2 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.1: 3 files, 5855 bytes\n\nFiles: skill-card.md (2318b), SKILL.md (9829b), _meta.json (126b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account and are confirm-gated.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1790178078541\n}\n\nFile v1.1.1:skill-card.md\n\n## Description:\n\nLook up concert setlists and live-music history via setlist.fm for artist, venue, city, date, tour, and show questions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and external users use this skill to connect an agent to setlist.fm data, answer concert setlist questions, resolve artist or venue identifiers, and produce attributed live-music results.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The attendance tools can change a user's setlist.fm account despite some read-only wording.\n\nMitigation: Require explicit confirmation before using mark_attended or unmark_attended and distinguish these account-changing tools from read-only lookups.\n\nRisk: The skill depends on an external MCP package and a private setlist.fm API key.\n\nMitigation: Install setlist-mcp only from a trusted source, keep SETLIST_API_KEY private, and verify the configured server before use.\n\nRisk: setlist.fm data use is subject to non-commercial and no-persistent-caching terms.\n\nMitigation: Follow setlist.fm terms, avoid persistent local datasets, and obtain appropriate permission for commercial use of setlist.fm data.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist-mcp npm package](https://www.npmjs.com/package/setlist-mcp)\n- [setlist-mcp source](https://github.com/chrischall/setlist-mcp)\n- [setlist.fm API key settings](https://www.setlist.fm/settings/api)\n- [setlist.fm API terms](https://www.setlist.fm/help/api-terms)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with inline JSON and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Outputs should include followable setlist.fm attribution links when presenting setlist.fm results.]\n\n## Skill Version(s):\n\n1.1.1 (source: release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.0: 3 files, 5988 bytes\n\nFiles: skill-card.md (2617b), SKILL.md (9829b), _meta.json (126b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account and are confirm-gated.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1789872713893\n}\n\nFile v1.1.0:skill-card.md\n\n## Description:\n\nsetlist helps agents look up concert setlists and live-music history via setlist.fm for artist, venue, city, tour, date, and year questions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to answer live-music questions by finding setlists, artists, venues, tours, cities, and user concert history through a registered setlist.fm MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The setlist.fm API key could be exposed or stored somewhere inappropriate.\n\nMitigation: Store SETLIST_API_KEY only in trusted MCP configuration or environment storage, and do not include the key in prompts, logs, or shared outputs.\n\nRisk: Attendance tools can change the user's setlist.fm account when marking or unmarking shows.\n\nMitigation: Require explicit confirmation before using attendance tools and verify the target setlist before submitting the action.\n\nRisk: setlist.fm terms include attribution, non-commercial API-key limits, and restrictions on persistent caching.\n\nMitigation: Cite returned setlist.fm source URLs, avoid building local persistent copies, and confirm permission before commercial use of setlist.fm API data.\n\nRisk: Live setlist data can be incomplete, ambiguous, or point-in-time.\n\nMitigation: Disambiguate with artist, date, city, and venue when possible, skip empty stub setlists unless relevant, and label tour-reference results as representative rather than exact-show data.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist-mcp npm package](https://www.npmjs.com/package/setlist-mcp)\n- [setlist.fm API key settings](https://www.setlist.fm/settings/api)\n- [setlist.fm API terms](https://www.setlist.fm/help/api-terms)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON configuration examples and MCP tool usage instructions]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires setlist-mcp registration and SETLIST_API_KEY; setlist.fm results should include source URLs.]\n\n## Skill Version(s):\n\n1.1.0 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.0: 3 files, 5826 bytes\n\nFiles: skill-card.md (2207b), SKILL.md (9829b), _meta.json (126b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account and are confirm-gated.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-match setlists in one call (with `songCount`/`hasSongs` + a `{matched, stubs, tourReferenced, unmatched, pending}` summary). When a show is an empty stub but the act toured a repeating set, the result also includes a **`tourReference`** — a populated, representative setlist from the *same tour* on a nearby date (with `songs` + its own `url`), clearly labeled as a reference, **not** the exact show (pass `tourFallback: false` to skip). Calls are paced to setlist.fm's rate limit; if a batch can't finish in time the rest come back `pending: true` — re-call with just those. For more than 24 shows, chunk into batches of ≤24.\n\n### Venues\n- **`setlist_search_venues`** — find venues by `name` and/or location.\n- **`setlist_get_venue`** — get a venue by `venueId`.\n- **`setlist_get_venue_setlists`** — setlists performed at a venue, paginated via `p`.\n\n### Cities & countries\n- **`setlist_search_cities`** — find cities by `name`/location; returns each city's `geoId`.\n- **`setlist_get_city`** — get a city by `geoId`.\n- **`setlist_search_countries`** — list all supported countries and their codes.\n\n### Users\n- **`setlist_get_user`** — a user's public profile by `userId`.\n- **`setlist_get_user_attended`** — concerts a user marked as attended.\n- **`setlist_get_user_edited`** — setlists a user has created or edited.\n\n### Utility\n- **`setlist_healthcheck`** — verify the API key works and the API is reachable.\n\n## Response shape (`view`)\n\nFifteen tools take `view: \"compact\" | \"full\"` — every search and every getter\nabove, from `setlist_search_artists` through `setlist_get_user_edited` — and\n**`compact` is the default**. The slim rung arrives without being asked for,\nbecause an efficiency a caller has to know about and request is one that\nusually is not requested.\n\n**Compact strips image and avatar URLs, and claims no field projection.** These\ntools hand setlist.fm's payload back close to verbatim, and this repo holds no\ncaptured fixture or documented field list for those endpoints — so nothing here\ncan honestly say which of setlist.fm's fields matter and which are noise.\nStripping media needs no such knowledge and is subtractive, so it cannot lose a\nfield nobody knew about; an invented field list would risk returning a record\nwith holes in it that still reads like a verified answer. Expect the same\nrecord minus the picture URLs, not a named field set.\n\nNote what this does **not** touch: a setlist's `url` is not a media URL, and it\nis the link setlist.fm's API terms require you to show — it survives BOTH rungs,\nand `tests/view.test.ts` pins that. Compact is not a reason to drop attribution.\n\nIn practice that leaves compact with little to remove: none of the setlist.fm\npayloads captured in this repo carry a media key at all, so today the two rungs\nare usually the same bytes. The rung is there so that a field arriving later\nwith a picture in it is stripped by default, rather than after somebody notices.\n\n`view: \"full\"` returns setlist.fm's payload untouched. There is **no `raw`\nrung**: `full` already IS the untouched payload, so a third value could only\nalias it.\n\nThe other five tools take no `view`, each for its own reason:\n\n- **`setlist_resolve_concerts`** already answers in its own shape. It builds\n  the `{matched, stubs, tourReferenced, unmatched, pending}` summary and the\n  per-show rows itself, unconditionally — that projection IS the tool's output,\n  not a slimmed copy of an upstream payload, so there is no fatter version to\n  offer. A `view` here would be a parameter that decides nothing.\n- **`setlist_id_from_url`** parses an id out of a URL string. No network call,\n  no payload, nothing to project.\n- **`setlist_mark_attended` and `setlist_unmark_attended`** are writes. A\n  write's response is a receipt — a status, an id — with nothing to strip and\n  everything to keep.\n- **`setlist_healthcheck`** answers whether the API key works and the API is\n  reachable.\n\n## Typical flows\n\n- **\"What did Radiohead play at their last show?\"** → `setlist_search_artists` (Radiohead → mbid) → `setlist_get_artist_setlists` (latest) → `setlist_get_setlist` for the song list.\n- **\"Setlists at Red Rocks in 2023\"** → `setlist_search_venues` (Red Rocks → venueId) → `setlist_search_setlists` with `venueId` + `year: 2023`.\n- **\"Phish on 2023-08-07\"** → `setlist_search_setlists` with `artistName: \"Phish\"`, `date: \"2023-08-07\"`.\n\n## Attribution & API terms\n\nsetlist.fm's [API terms](https://www.setlist.fm/help/api-terms) bind anyone using this data. When you present setlist.fm results to a user:\n\n- **Always cite the source.** Each setlist/artist/venue result includes a `url` — show it as a real, clickable link to setlist.fm (e.g. \"Source: [The Beatles setlist on setlist.fm](https://www.setlist.fm/...)\"). The terms require a *followable* link — never a `nofollow`. If a particular result has no `url`, link to https://www.setlist.fm instead.\n- **Non-commercial use only.** A free API key covers non-commercial use; commercial use needs setlist.fm's permission.\n- **Live data, not a datastore.** The terms forbid persistent caching — this server fetches fresh on every call and you should treat results as point-in-time, not build a local copy.\n- **Don't expose or share the API key.** It's read from `SETLIST_API_KEY` and never appears in results.\n\n## Interpreting setlist data\n\n- Songs live in `sets.set[]`; each set may have an `encore` number (1 = first encore) and a `name` (e.g. an acoustic set or a full album).\n- Each `song` may carry: `tape: true` (a pre-recorded intro/outro — not actually performed live), `cover` (the original artist when it's a cover), `with` (a guest performer), and `info` (a note like \"acoustic\" or \"first time live\"). Surface these when relevant rather than dropping them.\n\n## Notes\n\n- **Stub setlists:** every setlist result carries `songCount` / `setCount` / `hasSongs`. A page can exist with no songs logged (`hasSongs: false`) — skip those without a second `get_setlist` call.\n- **Disambiguate by location:** `artistName` + `date` can return shows in multiple cities. Add `cityName`/`cityId` or `venueName`/`venueId` to pin the right one (e.g. TSO on a date plays both Charlotte and Orlando).\n- **All performers at a venue/festival on a day:** call `setlist_search_setlists` with `venueName` (or `venueId`) + `date` and **no** artist.\n- IDs chain: `search_*` tools return the `mbid` / `setlistId` / `venueId` / `geoId` you feed into the `get_*` tools.\n- **All dates are ISO `yyyy-MM-dd`** — both the `date`/`lastUpdated` inputs and every `eventDate` in the output. (The server translates to/from setlist.fm's native `dd-MM-yyyy` internally.)\n- Results are paginated; pass `p` (1-based) to page through large result sets.\n- setlist.fm rate-limits the standard tier (~2 req/sec); a 429 is retried once.\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1789816747245\n}\n\nFile v1.0.0:skill-card.md\n\n## Description:\n\nsetlist helps agents look up concert setlists and live-music history via setlist.fm for artists, venues, cities, tours, and dates.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to answer questions about concerts, tours, venue histories, and performed songs by routing requests through a configured setlist.fm MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The SETLIST_API_KEY credential could be exposed if copied into prompts, logs, or shared configuration.\n\nMitigation: Store the key only in the intended MCP environment or local configuration, and do not include it in user-facing output.\n\nRisk: The attendance tools can mark or unmark concerts on the connected setlist.fm account.\n\nMitigation: Use attendance tools only after the user explicitly confirms that account change.\n\nRisk: setlist.fm API terms restrict free API-key usage and require source attribution for displayed results.\n\nMitigation: Confirm appropriate setlist.fm permission for commercial use and include followable setlist.fm source links in answers.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/setlist)\n- [setlist-mcp npm package](https://www.npmjs.com/package/setlist-mcp)\n- [setlist.fm API key settings](https://www.setlist.fm/settings/api)\n- [setlist.fm API terms](https://www.setlist.fm/help/api-terms)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown and text guidance with inline JSON and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Outputs should cite setlist.fm result URLs when presenting setlist data.]\n\n## Skill Version(s):\n\n1.0.0 (source: release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: setlist Owner: chrischall Summary: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played ","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"git clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"git clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: setlist\ndescription: Look up concert setlists and live-music history via setlist.fm. Use when the user asks what songs an artist played at a show, their tour setlists, what was performed at a venue or on a date, or wants to find concerts by artist, venue, city, or year. Triggers on phrases like \"what did Radiohead play at...\", \"Phish setlist for...\", \"shows at Red Rocks\", \"what songs were played on this tour\", or any request about concert setlists, gigs, tours, or live performances. Requires setlist-mcp installed and the setlist server registered (see Setup below).\n---\n\n# setlist-mcp\n\nMCP server for setlist.fm — search concert setlists, artists, venues, and tours via natural language. Read-only (setlist.fm has no write API).\n\n- **npm:** [npmjs.com/package/setlist-mcp](https://www.npmjs.com/package/setlist-mcp)\n- **Source:** [github.com/chrischall/setlist-mcp](https://github.com/chrischall/setlist-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"setlist-mcp\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/setlist-mcp\ncd setlist-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"setlist\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/setlist-mcp/dist/index.js\"],\n      \"env\": {\n        \"SETLIST_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `SETLIST_API_KEY=<value>`.\n\n### Getting your API key\n\nApply for a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api) — you'll need a setlist.fm account. The key is sent as the `x-api-key` header on every request.\n\nOptional: set `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) to localize city/country names.\n\n## Tools\n\nAll tools are prefixed `setlist_`. Everything below is read-only; the two\nattendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) write to\nyour setlist.fm account. Each undoes the other, so neither asks for a\nconfirmation step.\n\n### Artists\n- **`setlist_search_artists`** — find artists by `artistName` or `artistMbid`; returns each artist's MusicBrainz ID (`mbid`).\n- **`setlist_get_artist`** — get an artist by `mbid`.\n- **`setlist_get_artist_setlists`** — an artist's setlists (most recent first), by `mbid`, paginated via `p`.\n\n### Setlists\n- **`setlist_search_setlists`** — search by any mix of artist, venue, city, country, tour, `date` (ISO yyyy-MM-dd), or `year`.\n- **`setlist_get_setlist`** — a setlist (with full song list) by `setlistId`.\n- **`setlist_get_setlist_version`** — a specific historical version by `versionId`.\n\n### Batch\n- **`setlist_resolve_concerts`** — resolve up to **24** `{artist, date, city?, venue?}` to their best-m"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"setlist\",\n  \"version\": \"1.1.8\",\n  \"publishedAt\": 1791588531096\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps agents look up concert setlists and live-music history through setlist.fm.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMusic fans and researchers use this skill to find songs performed at concerts and explore shows by artist, venue, city, date, or tour. It also offers tools to mark or unmark concerts as attended on a user's account.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Despite read-only wording, attendance tools can change the user's setlist.fm account without a built-in confirmation step.\n\nMitigation: Require explicit user approval before marking or unmarking any concert as attended.\n\nRisk: The integration requires access to a user's setlist.fm API key.\n\nMitigation: Provide the key only to a trusted server and do not expose or share it in responses.\n\nRisk: A free setlist.fm API key is limited to non-commercial use, even though this release has a commercial usage posture.\n\nMitigation: Obtain setlist.fm permission before commercial API use and include source links when presenting results.\n\n## Reference(s):\n\n- [setlist-mcp package](https://www.npmjs.com/package/setlist-mcp)\n- [setlist.fm API key setup](https://www.setlist.fm/settings/api)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown]\n\n**Output Format:** [Markdown with links to setlist.fm results]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Answers may include song lists, show details, and links to the source results.]\n\n## Skill Version(s):\n\n1.1.8 (source: server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1281,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:00:25.196Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:00:25.196Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:42:59.494Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}