setlist-mcp
# setlist-mcp
[](https://github.com/chrischall/setlist-mcp/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/setlist-mcp)
[](LICENSE)
MCP server for [setlist.fm](https://www.setlist.fm) — search concert setlists, artists, venues, tours, and cities from Claude via natural language. Mostly read-only (the setlist.fm REST API exposes no write endpoints), plus authenticated "I was there" attendance actions via your logged-in session.
> This project was developed and is maintained by AI (Claude). Use at your own discretion.
## What it does
Exposes 20 tools — 18 read-only over the [setlist.fm REST API](https://api.setlist.fm/docs/1.0/index.html), plus 2 authenticated "I was there" attendance actions:
| Area | Tools |
|------|-------|
| Artists | `setlist_search_artists`, `setlist_get_artist`, `setlist_get_artist_setlists` |
| Setlists | `setlist_search_setlists`, `setlist_get_setlist`, `setlist_get_setlist_version` |
| Venues | `setlist_search_venues`, `setlist_get_venue`, `setlist_get_venue_setlists` |
| Cities & countries | `setlist_search_cities`, `setlist_get_city`, `setlist_search_countries` |
| Users | `setlist_get_user`, `setlist_get_user_attended`, `setlist_get_user_edited` |
| Resolve | `setlist_resolve_concerts` |
| Attendance (authenticated writes) | `setlist_mark_attended`, `setlist_unmark_attended` |
| Utility | `setlist_healthcheck`, `setlist_id_from_url` |
## Setup
Get a free API key (non-commercial use) at [setlist.fm/settings/api](https://www.setlist.fm/settings/api), then add the server to your `.mcp.json`:
```json
{
"mcpServers": {
"setlist": {
"command": "npx",
"args": ["-y", "setlist-mcp"],
"env": {
"SETLIST_API_KEY": "your-api-key-here"
}
}
}
}
```
Optional: `SETLIST_ACCEPT_LANGUAGE` (one of `en, es, fr, de, pt, tr, it, pl`) localizes city/country names.
The attendance tools (`setlist_mark_attended` / `setlist_unmark_attended`) need your logged-in www.setlist.fm session. Either set `SETLIST_SESSION_COOKIE` to the `Cookie` header of a logged-in request, or install [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) (Chrome: load the chrome zip unpacked; Safari isn't available yet — it will ship inside the ContextMint app, which has no public download — so use Chrome for now) and stay signed in to www.setlist.fm — the server lifts the session cookie from your browser on first use. Set `SETLIST_DISABLE_FETCHPROXY=1` to turn the browser fallback off.
ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — [fetchproxy's own README](https://github.com/chrischall/fetchproxy#extension) points to it. Its source is public at [nullnet-app/contextmint-bridge](https://github.com/nullnet-app/contextmint-bridge): build it yourself, or check a release zip against the `.sha256` file published beside it (`shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).
See [skills/setlist/SKILL.md](skills/setlist/SKILL.md) for from-source setup, the full tool reference, and example flows.
## Attribution & terms
Use is governed by the [setlist.fm API terms](https://www.setlist.fm/help/api-terms). In short:
- **Attribute setlist.fm.** Every result carries a `url`; surface it as a *followable* source link (no `nofollow`) wherever the data is shown. The tool descriptions instruct the model to do this, and results pass the `url` through verbatim.
- **Non-commercial only** under a free key — commercial use requires setlist.fm's permission.
- **No persistent caching** — this server makes a live API call per tool invocation and keeps no datastore. Please don't add one.
- **Keep your API key private** — it lives in `SETLIST_API_KEY` (`.env` is gitignored) and never appears in tool output.
## Development
```bash
npm install
npm run build # tsc + esbuild bundle → dist/
npm test # tsc typecheck + vitest
```
For local runs, put `SETLIST_API_KEY=<key>` in a `.env` file (gitignored) next to the project root.
See [CLAUDE.md](CLAUDE.md) for architecture, conventions, and gotchas.
## License
MIT
TDQS
Scored across 20 tools
Each tool maps to a clear entity+action pair (artist, venue, city, country, user, setlist with get/search/batch-resolve/toggle variants), and the write pair mark_attended/unmark_attended is unambiguous. The only mild overlap is between setlist_search_setlists and setlist_resolve_concerts, both of which locate setlists, but their descriptions clearly separate single-search from bulk-batch resolution.
Every tool follows the identical setlist_{verb}_{noun} snake_case pattern (setlist_get_artist, setlist_search_venues, setlist_mark_attended). Verb choice is consistent (get/search/resolve/mark/unmark), making the surface highly predictable.
20 tools is on the heavier side, but the domain legitimately spans six entity types each warranting get/search plus setlist-specific helpers. Each tool earns its place with little redundancy, so it sits just over the comfortable range rather than bloating it.
Coverage is broad: artists, venues, cities, countries, users, and setlists all have retrieval paths, plus write (attended), bulk resolve, URL parsing, and a healthcheck. Minor gaps exist (e.g. no user search endpoint, no direct song-level lookup), but core lifecycle workflows are fully served.