Developers
MCP server reference
One MCP server for dancers, organizers, artists, promoters and influencers. Every tool is a thin adapter over the same tRPC procedures the web app uses, so permissions and validation are identical.
Endpoints
| What | Endpoint | Notes |
|---|---|---|
| MCP (signed in) | POST /mcp | Streamable HTTP, stateless, JSON responses. 401 + WWW-Authenticate without a valid token. |
| MCP (anonymous) | POST /mcp/public | Public read tools only; rate limited per IP. |
| Protected resource metadata | GET /.well-known/oauth-protected-resource/mcp | RFC 9728 |
| Authorization server metadata | GET /.well-known/oauth-authorization-server | RFC 8414 |
| Dynamic client registration | POST /oauth/register | RFC 7591; or use an https client_id (Client ID Metadata Document). |
| Authorize | GET /oauth/authorize | Code flow, PKCE S256 required, resource (RFC 8707) required. |
| Token | POST /oauth/token | authorization_code, refresh_token (rotating; reuse revokes the grant). |
| Revoke | POST /oauth/revoke | RFC 7009 |
Rules every tool follows
- Dynamic list. tools/list returns only what the token’s scopes allow; business tools also need at least one business page ticked on the consent screen.
- Enforced in tRPC, not only here. Each procedure declares its scope (
server/trpc/scopes.ts, default deny), and the profile helpers check the granted pages. - Two-step publishing. Tools marked “confirm” return a preview and a
confirm_token(10 minutes, single use, bound to the connection, the tool and the arguments). Call again with it after the user agrees. - User text is data. Free text written by people comes as
{"untrusted_text": …}inside a<wedance-data>block. - No payments. Ticket tools return a Stripe checkout link the person opens.
- Async flyers. make_flyer, flyer_variants and fix_flyer return a batch_id; poll flyer_status. promo_kit paints the first flyer of an event only when it has none.
- Tracked links. my_link gives a promoter page one link per event (
?via=<code>, QR at/api/qr/<code>.svg). Visits, sign-ups, plan adds and tickets through it show in my_results and, for the organizer, event_link_results. - Attendees respect privacy. attendees counts everyone but names only dancers who made their going public; never emails.
- Audited and rate limited. Every call is logged (input hash, never the input) and limited per connection; anonymous calls per IP.
Scopes
me:read- Your name, city and styles, what’s in your plan, your tickets and who you follow.
plan:write- Add or remove events, say whether you’re going, join festivals, offer rides and look for roommates. Ticket purchases only ever return a payment link you open yourself.
social:write- Ask the locals, recommend places, RSVP to hangouts, join dinners, follow pages, write reviews, enter giveaways, vote on city videos and send booking requests.
business:read- For the pages you pick below: events, inbox, booking requests, team and insights.
business:write- Create and edit draft events, make flyers and captions, plan posts and set availability. Nothing goes public with this alone.
business:publish- Publish events, edit live pages, invite artists, answer invites and change your team. The app shows you a preview and asks again before each one.
business:publish ⊃ business:write ⊃ business:read. admin exists only for WeDance admins on an allowlisted app and is never offered publicly.
Tools: Everyone (no sign-in)
| Tool | What it does | Needs |
|---|---|---|
find_events | Upcoming and ongoing dance events (parties, classes, workshops, festivals) in a city, soonest first. Filter by date range, styles or type. Times come with the local wall-clock time. | nothing read-only |
get_event | Everything about one event: description, line-up, venue, prices, ticket link, programme. Accepts the id or the slug from its URL. | nothing read-only |
find_festivals | Upcoming dance festivals, congresses and weekenders worldwide, soonest first, with how many dancers plan to go. Use planType + planId with add_to_plan. | nothing read-only |
get_festival | A festival’s full page: passes, programme by day (workshops and parties), teachers. Takes the festival’s event id. | nothing read-only |
get_profile | A public WeDance page by handle: an artist, venue, organizer or promoter (bio, styles, city, socials, rooms), or a dancer. | nothing read-only |
list_venues | Dance venues listed in a city, with their handles. | nothing read-only |
list_artists | Dance teachers, performers and DJs listed in a city, with their styles and handles. | nothing read-only |
whos_going | Dancers who said they’re going to an event (if they made it public), or verified ticket holders of a festival. | nothing read-only |
ask_locals_feed | Questions dancers asked about a city’s scene, with the locals’ recommendations. | nothing read-only |
festival_roster | Public roster of a festival’s verified ticket holders (only those who chose to be listed). | nothing read-only |
city_battle_status | The city-vs-city dance video battle: current leaderboard. | nothing read-only |
find_gigs | Open gigs on WeDance: roles organizers want filled (teacher, DJ, photographer…) and offers from artists. | nothing read-only |
Tools: Dancers
| Tool | What it does | Needs |
|---|---|---|
me | The signed-in dancer: name, handle, city, styles and levels, role. | me:readread-only |
my_plan | The dancer’s plan: dated events they’re going to (soonest first) and festivals in their year plan, with ticket status. | me:readread-only |
my_tickets | Festival tickets and passes the dancer holds. | me:readread-only |
my_follows | Artists, venues, organizers and dancers the dancer follows. | me:readread-only |
my_referrals | People who bought festival tickets with the dancer’s (or promoter’s) referral code, and the credit earned. | me:readread-only |
view_shared_plan | The plan another dancer shared publicly (by their handle). | me:readread-only |
add_to_plan | Mark that the dancer is going: an event (by id) or a festival (planId from find_festivals). Private unless share_my_plan makes it visible. | plan:write |
remove_from_plan | Take an event or festival out of the dancer’s plan (tickets stay). | plan:writedestructive |
share_my_plan | Make the dancer visible (or hidden) in an event’s or festival’s “who’s going” list. | plan:write |
festival_join | Sign the dancer up for a festival on WeDance (free signup, separate from buying a ticket). | plan:write |
buy_ticket | Start a festival ticket purchase. Returns a Stripe checkout link the user opens and pays themselves. Nothing is charged by this tool. | plan:write |
list_rides | Ride shares offered or wanted for a festival. | plan:writeread-only |
offer_ride | Post a ride share for a festival, visible to other attendees: offering seats or looking for one. | plan:write |
list_roommates | Dancers looking for a roommate at a festival, and whether the dancer is looking. | plan:writeread-only |
toggle_roommate_search | Toggle whether the dancer is listed as looking for a roommate at a festival. Check list_roommates first: this flips the current state. | plan:write |
hangouts_tonight | Hangouts dancers set up in a city tonight (pre-party dinners, coffee, going together). | social:writeread-only |
rsvp_hangout | Toggle the dancer’s RSVP to a hangout (others see who’s coming). | social:write |
list_dinners | Group dinners at a festival the dancer can join. | social:writeread-only |
join_dinner | Join a group dinner at a festival. | social:write |
ask_locals | Post a public question to a city’s dancers, e.g. “Where’s the best Thursday salsa?”. | social:write |
recommend | Publicly recommend a venue or organizer in a city. | social:write |
follow | Follow (or unfollow) an artist, venue, organizer or promoter to see their events. | social:write |
write_review | Publish a 1–5 star review with optional text. | social:write |
request_private_class | Ask an artist or venue for a private class, workshop, show or event. Their team gets an email with the dancer’s name and email to reply to. | social:writeme:read |
list_giveaways | Active giveaways in a city (tickets, passes) the dancer can enter. | social:writeread-only |
enter_giveaway | Enter the dancer into a giveaway with their account email. | social:writeme:read |
city_video_pair | The next pair of a city’s dance videos for the monthly vote. | social:writeread-only |
vote_city_video | Vote for the better of two videos from city_video_pair. | social:write |
update_my_profile | Change the dancer’s own public profile (not a business page): name, city, styles, role, bio, socials, visibility. | social:write |
apply_to_gig | Apply to a gig role (find_gigs, kind "role"): a short message about yourself, optionally as one of your artist pages. The poster gets an email with the message and your account email to reply to. | social:write |
my_gig_applications | Gigs the dancer applied to and whether each is pending, accepted or declined. | me:readread-only |
claim_profile | Become the owner of a page nobody runs yet, using the invite link an organizer sent (invite_token = end of /confirm/<token>). Preview → confirm. | business:publishconfirm |
Tools: Organizers, artists, promoters, influencers
| Tool | What it does | Needs |
|---|---|---|
my_profiles | The business pages (organizer, venue, artist, promoter) this app may act for, with the dancer’s role on each. | business:readread-only |
my_events | Events of my pages: upcoming, drafts, past and archived, each with what it still lacks. | business:readread-only |
get_my_event | An event of my pages in editable form (local date and times, line-up handles, prices, agenda, published state, missing details). | business:readread-only |
inbox | What needs me across my pages (drafts, missing details, flyers, booking requests, invites, join requests) and the next 14 days. | business:readread-only |
create_event | Create an event for one of my pages as a DRAFT (not public). Times are local to the city. Publish it later with publish_event. | business:write |
update_event | Change fields of an event of my pages; fields left out stay as they are. Editing a live (published) event changes a public page, so it needs business:publish and runs as preview → confirm. | business:writeconfirm (when public) |
publish_event | Make a draft event public on WeDance (or take it back to draft). Runs as preview → confirm: show the preview, then call again with confirm_token. | business:publishconfirm |
duplicate_event | Copy an event to the next 1–12 weeks at the same local time (weekly classes, parties). Copies keep its published state, so repeating a live event publishes the copies (preview → confirm). | business:writeconfirm (when public) |
archive_event | Take an event off WeDance (it can be restored as a draft from the web app). For a synced weekly event, whole_series also archives the dates to come. | business:writedestructive |
add_profile_from_instagram | Someone for a line-up or venue who isn’t on WeDance yet: creates an unclaimed page from their Instagram handle (or returns the page that already links it). | business:write |
suggest_venues | Venues in a city that fit a date: who hosts which music on that weekday, whether they’re free, rooms and capacity. | business:readread-only |
find_lineup | Search WeDance pages by name or handle for a line-up or venue. | business:readread-only |
invite_artist | Put an artist in an event’s line-up and invite them to confirm: if someone runs their page they get an email, otherwise you get a link to send them. Preview → confirm. | business:publishconfirm |
flyer_options | For an event’s flyer: the lines that go on it, saved looks (styles) of the page, the kept flyer and what changed since. | business:readread-only |
make_flyer | Start painting a flyer for an event in a saved look (look_id from flyer_options) or a described one. Takes about a minute: poll flyer_status with the batch_id. | business:write |
flyer_variants | Paint four different flyer directions for an event from 1–3 feelings (e.g. "elegant", "wild"). Poll flyer_status with the batch_id. | business:write |
fix_flyer | Repaint a finished flyer with a change, e.g. “bigger date, less red”. Poll flyer_status with the batch_id. | business:write |
flyer_status | The flyers of a painting batch: painting, ready (with image URL), failed. Poll every 20–30 s until none is painting. | business:readread-only |
write_captions | Write captions for every post of an event’s content plan that has none yet, then return the plan with captions. | business:write |
plan_posts | Add WeDance’s suggested content plan for an event (announcement, line-up posts, reminders with dates), then return the plan. | business:write |
inquiries | Booking requests people sent to one of my pages (newest first), with their contact details. | business:readread-only |
mark_inquiry | Record that a booking request was answered or declined (the answer itself goes by email to the person). | business:write |
team | Who runs one of my pages and their roles; owners also see pending join requests. | business:readread-only |
decide_join_request | Let someone join one of my pages’ team (or decline). Owners only. Preview → confirm. | business:publishconfirm |
set_member_role | Make a team member owner or editor of one of my pages. Owners only. Preview → confirm. | business:publishconfirm |
my_festivals | Festivals the dancer organizes on WeDance (for event_insights). | business:readread-only |
event_insights | The style and level mix of a festival’s attendees (aggregates only). | business:readread-only |
update_business_profile | Change one of my public pages (artist, venue, organizer, promoter): name, bio, city, styles, photo, address, and for a promoter page the influencer flag. Preview → confirm. | business:publishconfirm |
list_spaces | The bookable rooms of one of my venue pages (ids for set_availability). | business:readread-only |
set_availability | Replace the weekly time slots when a venue room can be booked. Note: availability exists for venue rooms (list_spaces), not for artists. | business:write |
my_invites | Changes organizers suggested for one of my pages (photos, videos, names) waiting for approval. Line-up invites for my pages are in inbox (each with an invite_token). | business:readread-only |
respond_invite | Approve or turn down suggested changes for my page, and confirm or decline a line-up invite (invite_token from inbox). Preview → confirm. | business:publishconfirm |
profile_schedule | Upcoming events a venue hosts, an organizer runs or an artist plays (artists: "my gigs"). | business:readread-only |
post_gig_offer | Publish a gig on WeDance: a role you want filled (kind "role") or a service you offer (kind "offer"). Contact goes to the dancer’s account email. Preview → confirm. | business:publishme:readconfirm |
promoter_roster | Artists a promoter page represents. | business:readread-only |
recurring_series | Create every date of a recurring event in one call: weekly classes, a party every second week, a social on the nth weekday of the month. Give the first date, the rule and an end (until or count); skip holidays with skip. Each date becomes its own event in one series (fix one date later with update_event). Drafts by default; published: true needs business:publish and runs as preview (the list of dates) → confirm. | business:writeconfirm (when public) |
publish_series | Publish (or take back to draft) every date still to come of a series (seriesId from recurring_series or my_events). Preview (the dates) → confirm. | business:publishconfirm |
attendees | Who added an event of my pages to their plan, signed up or bought a ticket. Counts always include everyone; names only for dancers who made their going public. csv: true adds a CSV of the named list. | business:readread-only |
gig_applications | Gigs I (or my pages) posted, each with the artists who applied: message, page, email, status. | business:readread-only |
decide_gig_application | Accept or decline an artist’s application to my gig; they get an email. Preview → confirm. | business:publishconfirm |
my_link | My personal link to a published event for one of my promoter pages, with a QR code (SVG and PNG URLs). Visits, sign-ups, plan adds and tickets through it count in my_results. The same link every time. | business:read |
my_results | Per tracked link (promoter page + event): visits, sign-ups, plan adds and tickets, plus totals. Optionally one page or one event. | business:readread-only |
promoter_dashboard | One promoter page at a glance: totals, the events it promotes (upcoming and past, each with results), roster size, its giveaway proposals, and whether it is an influencer. | business:readread-only |
event_link_results | For an event of my pages: every promoter’s tracked link and what it brought (visits, sign-ups, plan adds, tickets). | business:readread-only |
promo_kit | Everything to promote a published event: the flyer (story 9:16 and feed 4:5 URLs), a caption in the event’s languages, hashtags, and for a promoter page its tracked link and QR code. If the event has no flyer at all, one is painted (about a minute; poll flyer_status or call again). The event’s own team can use any of their pages (no tracked link then). | business:read |
propose_giveaway | Propose a giveaway for a published event (e.g. "2 full passes") from one of my pages. Nothing goes public: the event’s organizer approves it, then it runs on WeDance in the event’s city and points at the event through my tracked link. | business:write |
giveaway_proposals | Giveaways promoters and influencers proposed for events of my pages (all, or one event), with their status. | business:readread-only |
decide_giveaway_proposal | Approve a proposed giveaway for my event (it goes live on WeDance in the event’s city until ends_on or the event’s start) or decline it. Preview → confirm. | business:publishconfirm |
Tools: Admin
| Tool | What it does | Needs |
|---|---|---|
admin_pending_claims | Claims and reclaims of pages waiting for an admin decision. | adminread-only |
admin_pending_videos | Submitted city videos waiting for moderation. | adminread-only |
Resources and prompts
wedance://city/{slug}/events,wedance://event/{id},wedance://profile/{handle}- Prompts:
plan_my_weekend,prepare_festival_trip; with business scopes alsopromote_my_event,weekly_class_update.
Try it
bash
npx @modelcontextprotocol/inspector --cli https://2026.wedance.vip/mcp/public --method tools/listCode: server/mcp (tools, server), server/oauth (authorization server). Design: docs/proposals/2026-10-18-mcp-server.md.