agentCLAWHUBUnverified

setlist-fpx

Query and update setlist.fm from a shell without running the setlist-mcp server — search/read concert setlists, artists, venues, cities, and users via plain curl against the public REST API (an x-api-key header), and toggle "I was there" attendance on a setlist via the authenticated website, using an fpx-captured session cookie. Use when you want setlist.fm data or want to mark/unmark attendance without the MCP, in a script, or on a machine where the MCP isn't installed.

OpenClaw

Rank

62

Safety

84

Downloads

1.7k

Updated

Oct 10, 2026

Version

1.1.8

Source

CLAWHUB

About

What it does, and when to use it.

Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.

Avoid when

  • Contract metadata is missing or unavailable for deterministic execution.

Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing

Public facts

Every fact links back to the source it came from.

Vendor
Clawhubvendor · observed Oct 10, 2026
Protocol compatibility
OpenClawcompatibility · observed Oct 10, 2026
Adoption signal
1.7K downloadsadoption · observed Oct 10, 2026
Latest release
1.1.8release · observed Oct 9, 2026
Handshake status
UNKNOWNsecurity

Install and run

Setup complexity: low.

clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:setlist-fpx
  1. Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:setlist-fpx` in an isolated environment before connecting it to live workloads.
  2. No published capability contract is available yet, so validate auth and request/response behavior manually.
  3. Review the upstream CLAWHUB listing at https://clawhub.ai/chrischall/setlist-fpx before using production credentials.

Contract: missing

curl -s "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/snapshot"

Documentation

CLAWHUB

148,432 characters of source documentation, loaded on request.

Extracted files

5 files captured from the source.

SKILL.md

---
name: setlist-fpx
description: >-
  Query and update setlist.fm from a shell without running the setlist-mcp
  server — search/read concert setlists, artists, venues, cities, and users
  via plain curl against the public REST API (an x-api-key header), and
  toggle "I was there" attendance on a setlist via the authenticated website,
  using an fpx-captured session cookie. Use when you want setlist.fm data or
  want to mark/unmark attendance without the MCP, in a script, or on a
  machine where the MCP isn't installed.
---

# setlist.fm via curl + fpx (no MCP)

setlist.fm is **hybrid**: reads and writes use two different surfaces.

- **Reads** — a documented public REST API (`api.setlist.fm/rest`) keyed by
  an **`x-api-key` header**. Plain `curl`, no browser, no fpx.
- **Writes** — the only mutation setlist.fm offers is the site's "I was
  there" attendance toggle, and it exists **only on the logged-in website**
  (`www.setlist.fm`, server-rendered Apache Wicket), not the REST API. There's
  no login form to script — the credential is your browser's session cookie.
  `fpx` lifts that cookie out of your signed-in tab **once**; every actual
  request afterward is plain `curl` carrying it. No bridge round-trip per call.

This is the same data/actions the `setlist_*` MCP tools expose, reached with
`curl` instead of a running server.

## Part 1 — reads (curl + API key)

### One-time setup

Apply for a free key at <https://www.setlist.fm/settings/api>, non-commercial
use only (see API terms below), then:

```sh
export SETLIST_API_KEY=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

### Core call

```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/artists?artistName=Radiohead' \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
  | jq '.artist[] | {name, mbid, url}'
```

`Accept: application/json` is required — the API serves XML otherwise.
Optional `Accept-Language: en|es|fr|de|pt|tr|it|pl` localizes city/country
names. Standard tier is **~2 req/sec, 1440/day** — a 429 means slow down.

**Dates are `dd-MM-yyyy` on the wire** (NOT ISO) for `date` search params and
`lastUpdated` (`yyyyMMddHHmmss`); `eventDate` comes back the same way in
responses — convert both directions yourself (the MCP does this for you via
`dmyToIso`/`isoToDmy`; a shell one-liner: `date -j -f '%Y-%m-%d' '+%d-%m-%Y'`
on macOS).

The full request catalog (all 15 read endpoints, params, and `jq` projections)
is in `references/rest-api.md`.

### The one rule: chain ids, don't guess them

Every entity is keyed by an id you get from a search: artists by **`mbid`**
(MusicBrainz id), setlists by **`setlistId`**, venues by **`venueId`**,
cities by **`geoId`**. Search first, then feed the id into the matching
`get`/`setlists` endpoint. Got a setlist.fm URL instead of an id? The id is
the trailing hex token before `.html`, e.g.
`.../setlist/.../...-4ba8a766.html` → `4ba8a766` — no fetch needed.

### Attribution (compliance, not optional)

The API terms require a **followable l

_meta.json

{
  "ownerId": "kn700jq4sjtf2anb0rk3ft4p7n856872",
  "slug": "setlist-fpx",
  "version": "1.1.8",
  "publishedAt": 1791588521698
}

references/attendance-write.md

# Attendance write walkthrough (fpx cookie + curl)

Mirrors `setlist-mcp`'s `setlist_mark_attended` / `setlist_unmark_attended`
tools exactly (`src/tools/attendance.ts`, `src/web-client.ts`). There is no
JSON API for this — you're driving the same server-rendered Apache Wicket
page a signed-in browser would.

Prereqs: `SETLIST_API_KEY` set (Part 1) and `COOKIE`/`UA` captured per
`SKILL.md` Part 2.

## Step 0 — resolve the setlist's canonical URL

You need the setlist's public page path. Either you already have a
setlist.fm URL (skip to step 1), or resolve it via the API using the
`setlistId`:

```sh
SETLIST_ID=63de4613
META=$(curl -s "https://api.setlist.fm/rest/1.0/setlist/$SETLIST_ID" \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json')
URL=$(echo "$META" | jq -r '.url')          # e.g. https://www.setlist.fm/setlist/.../...-4ba8a766.html
PATH_ONLY=$(echo "$URL" | sed -E 's#https?://[^/]+##')   # /setlist/.../...-4ba8a766.html
```

## Step 1 — fetch the page, authenticated

```sh
HTML=$(curl -s "https://www.setlist.fm$PATH_ONLY" \
  -H "Cookie: $COOKIE" -H "User-Agent: $UA")
```

**Check you're actually signed in** before going further — a logged-out page
links to sign-in instead of showing the attendance control:

```sh
echo "$HTML" | grep -qE 'href="/(signin|login)\b' && echo "SESSION EXPIRED — re-capture the cookie" >&2
```

## Step 2 — find the attendance control

The control is an `<a>` tag with a `wicketAjaxGet('...')` onclick and a
`title` of either:

- `"Add this setlist to your attended shows."` → **not** currently attended
- `"Remove this setlist from your attended shows."` → **currently** attended

Extract both the per-render AJAX URL and the current state with `perl`
(installed on macOS by default). For each `<a>` tag, check for
`wicketAjaxGet(...)` and `title="..."` independently within the same
800-char window — same as `src/tools/attendance.ts`'s `parseAttendance()` —
rather than requiring `title=` to appear before `onclick=`, since real
markup doesn't guarantee that ordering. Entity-decode the URL the same way
`decodeEntities()` does: `&amp;` plus numeric character references
(`&#x..;` hex and `&#..;` decimal), which a plain grep would mangle:

```sh
read -r AJAX_URL CURRENTLY_ATTENDED < <(
  echo "$HTML" | perl -0777 -ne '
    while (/<a\b(.{0,800})/gs) {
      my $seg = $1;
      next unless $seg =~ /wicketAjaxGet\(\s*[\x27"]([^\x27"]+)[\x27"]/;
      my $url = $1;
      next unless $seg =~ /title="([^"]*attended shows[^"]*)"/;
      my $attended = $1 =~ /remove/i ? 1 : 0;
      $url =~ s/&amp;/&/g;
      $url =~ s/&#x([0-9a-fA-F]+);/chr(hex($1))/ge;
      $url =~ s/&#(\d+);/chr($1)/ge;
      print "$url $attended\n";
      last;
    }
  '
)
```

If `$AJAX_URL` is empty: the control genuinely isn't on the page (rare — a
layout change, or you hit a bot-rate-limit page) — re-check step 1's
logged-out test first, since that's the far more common cause.

## Step 3 — decide: no-op, dry-run, or toggle

```sh
DESIRED=1

references/rest-api.md

# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.

---

## Artists

### 1. Search artists

```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/artists' \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
  --get --data-urlencode 'artistName=Radiohead' --data-urlencode 'sort=relevance' \
  | jq '.artist[] | {name, mbid, url}'
```
Params: `artistName`, `artistMbid`, `sort` (`sortName` default | `relevance`), `p` (page, default 1).

### 2. Get artist by mbid

```sh
curl -s "https://api.setlist.fm/rest/1.0/artist/$MBID" \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' | jq
```

### 3. Artist's setlists (most recent first)

```sh
curl -s "https://api.setlist.fm/rest/1.0/artist/$MBID/setlists?p=1" \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
  | jq '.setlist[] | {id, eventDate, venue: .venue.name, city: .venue.city.name, songCount, hasSongs}'
```
`songCount`/`setCount`/`hasSongs` are annotations the MCP adds by walking the
response locally (not native API fields) — derive them yourself if you need
them: `songCount = ([.sets.set[].song[]?] | length)`.

---

## Setlists

### 4. Search setlists

Provide at least one filter. `date` is `dd-MM-yyyy` (NOT ISO); `lastUpdated`
is `yyyyMMddHHmmss` UTC.

```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/setlists' \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
  --get \
  --data-urlencode 'artistName=Radiohead' \
  --data-urlencode 'date=28-08-2025' \
  --data-urlencode 'cityName=Charlotte' \
  | jq '.setlist[] | {id, url, venue: .venue.name, eventDate}'
```
Other params: `artistMbid`, `venueName`, `venueId`, `cityId`, `state`,
`stateCode`, `countryCode`, `tourName`, `year`, `p`. Omit the artist and pass
`venueName`/`venueId` + `date` to list every performer at a venue that day.

### 5. Get setlist by id

```sh
curl -s "https://api.setlist.fm/rest/1.0/setlist/$SETLIST_ID" \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' | jq
```
Songs live in `.sets.set[].song[]`; a `set` may have `encore` (1 = first
encore) and `name` (e.g. an acoustic set). A `song` may carry `tape: true`
(pre-recorded, not performed), `cover` (original artist), `with` (guest), and
`info` (a note like "acoustic").

### 6. Get a specific historical version

```sh
curl -s "https://api.setlist.fm/rest/1.0/setlist/version/$VERSION_ID" \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' | jq
```

---

## Venues

### 7. Search venues

```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/venues' \
  -H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
  --get --data-urlencode 'name=The Fillmore' --data-ur

skill-card.md

## Description:

Guides agents in searching and reading setlist.fm concert data with its REST API and updating a user's attendance through an authenticated browser session, without running an MCP server.

This skill is ready for commercial/non-commercial use.

## Publisher:

[chrischall](https://clawhub.ai/user/chrischall)

### License/Terms of Use:

MIT-0

## Use Case:

Developers and other setlist.fm users can use this skill to look up artists, setlists, venues, cities, and users from a shell, or mark and unmark their attendance at a show. The free setlist.fm API key is restricted to non-commercial use under the site's API terms.

### Deployment Geography for Use:

Global

## Known Risks and Mitigations:

Risk: A captured setlist.fm session cookie can enable account actions if disclosed.

Mitigation: Treat the cookie like a password; keep it out of logs, shell history, commits, and shared transcripts, and use the bridge only if you trust it with your session.

Risk: Blindly toggling attendance can undo the intended state.

Mitigation: Check the current state, dry-run before sending the toggle, and re-fetch the page to verify the result.

## Reference(s):

- [setlist-fpx release on ClawHub](https://clawhub.ai/chrischall/skills/setlist-fpx)
- [setlist.fm API key and terms](https://www.setlist.fm/settings/api)
- [REST API read endpoints](references/rest-api.md)
- [Attendance update walkthrough](references/attendance-write.md)
- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)

## Skill Output:

**Output Type(s):** [Guidance, Shell commands, Configuration instructions]

**Output Format:** [Markdown with shell command examples]

**Output Parameters:** [1D]

**Other Properties Related to Output:** [REST reads require an API key; attendance changes require an authenticated setlist.fm session and confirmation of the current state.]

## Skill Version(s):

1.1.8 (source: ClawHub release evidence)

## Ethical Considerations:

Users 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.
Github ReposUpdated 13h agoRank 70

AionUi

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!

MCPOPENCLAW
Github ReposUpdated 6mo agoRank 70

activepieces

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

OPENCLAW
Github ReposUpdated 6mo agoRank 70

cherry-studio

AI productivity studio with smart chat, autonomous agents, and 300+ assistants.

MCPOPENCLAW
Github ReposUpdated 7mo agoRank 70

CopilotKit

The Frontend for Agents & Generative UI. React + Angular

OPENCLAW

Machine-readable data

The same record, as JSON, for agents and crawlers.

{
  "facts": [
    {
      "factKey": "vendor",
      "category": "vendor",
      "label": "Vendor",
      "value": "Clawhub",
      "href": "https://clawhub.ai/chrischall/skills/setlist-fpx",
      "sourceUrl": "https://clawhub.ai/chrischall/skills/setlist-fpx",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-10T04:36:06.054Z",
      "isPublic": true
    },
    {
      "factKey": "protocols",
      "category": "compatibility",
      "label": "Protocol compatibility",
      "value": "OpenClaw",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/contract",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/contract",
      "sourceType": "contract",
      "confidence": "medium",
      "observedAt": "2026-10-10T04:36:06.054Z",
      "isPublic": true
    },
    {
      "factKey": "traction",
      "category": "adoption",
      "label": "Adoption signal",
      "value": "1.7K downloads",
      "href": "https://clawhub.ai/chrischall/setlist-fpx",
      "sourceUrl": "https://clawhub.ai/chrischall/setlist-fpx",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-10T04:36:06.054Z",
      "isPublic": true
    },
    {
      "factKey": "latest_release",
      "category": "release",
      "label": "Latest release",
      "value": "1.1.8",
      "href": "https://clawhub.ai/chrischall/setlist-fpx",
      "sourceUrl": "https://clawhub.ai/chrischall/setlist-fpx",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-10-09T23:28:41.698Z",
      "isPublic": true
    },
    {
      "factKey": "handshake_status",
      "category": "security",
      "label": "Handshake status",
      "value": "UNKNOWN",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/trust",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/trust",
      "sourceType": "trust",
      "confidence": "medium",
      "observedAt": null,
      "isPublic": true
    }
  ],
  "events": [
    {
      "eventType": "release",
      "title": "Release 1.1.8",
      "description": "- Removed the redundant file skill-card.md; no user-facing or functional changes. - No changes to feature set or documentation. - Version update for housekeeping and file cleanup.",
      "href": "https://clawhub.ai/chrischall/setlist-fpx",
      "sourceUrl": "https://clawhub.ai/chrischall/setlist-fpx",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-10-09T23:28:41.698Z",
      "isPublic": true
    }
  ]
}

Record generated Oct 10, 2026.

Sponsored

Ads related to setlist-fpx and adjacent AI workflows.