Skip to content
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

WhatEndpointNotes
MCP (signed in)POST /mcpStreamable HTTP, stateless, JSON responses. 401 + WWW-Authenticate without a valid token.
MCP (anonymous)POST /mcp/publicPublic read tools only; rate limited per IP.
Protected resource metadataGET /.well-known/oauth-protected-resource/mcpRFC 9728
Authorization server metadataGET /.well-known/oauth-authorization-serverRFC 8414
Dynamic client registrationPOST /oauth/registerRFC 7591; or use an https client_id (Client ID Metadata Document).
AuthorizeGET /oauth/authorizeCode flow, PKCE S256 required, resource (RFC 8707) required.
TokenPOST /oauth/tokenauthorization_code, refresh_token (rotating; reuse revokes the grant).
RevokePOST /oauth/revokeRFC 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)

ToolWhat it doesNeeds
find_events
city, from, to, styles, type, limit
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
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
country, style, from, to, limit
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
event_id
A festival’s full page: passes, programme by day (workshops and parties), teachers. Takes the festival’s event id.
nothing
read-only
get_profile
handle
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
city
Dance venues listed in a city, with their handles.
nothing
read-only
list_artists
city
Dance teachers, performers and DJs listed in a city, with their styles and handles.
nothing
read-only
whos_going
event_id, festival
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
city
Questions dancers asked about a city’s scene, with the locals’ recommendations.
nothing
read-only
festival_roster
festival
Public roster of a festival’s verified ticket holders (only those who chose to be listed).
nothing
read-only
city_battle_status
limit
The city-vs-city dance video battle: current leaderboard.
nothing
read-only
find_gigs
kind, category
Open gigs on WeDance: roles organizers want filled (teacher, DJ, photographer…) and offers from artists.
nothing
read-only

Tools: Dancers

ToolWhat it doesNeeds
me
no arguments
The signed-in dancer: name, handle, city, styles and levels, role.
me:read
read-only
my_plan
no arguments
The dancer’s plan: dated events they’re going to (soonest first) and festivals in their year plan, with ticket status.
me:read
read-only
my_tickets
no arguments
Festival tickets and passes the dancer holds.
me:read
read-only
my_follows
no arguments
Artists, venues, organizers and dancers the dancer follows.
me:read
read-only
my_referrals
festival
People who bought festival tickets with the dancer’s (or promoter’s) referral code, and the credit earned.
me:read
read-only
view_shared_plan
handle
The plan another dancer shared publicly (by their handle).
me:read
read-only
add_to_plan
kind, id
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
kind, id
Take an event or festival out of the dancer’s plan (tickets stay).
plan:write
destructive
share_my_plan
kind, id, share
Make the dancer visible (or hidden) in an event’s or festival’s “who’s going” list.
plan:write
festival_join
festival
Sign the dancer up for a festival on WeDance (free signup, separate from buying a ticket).
plan:write
buy_ticket
festival, tickets, referral_code
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
festival
Ride shares offered or wanted for a festival.
plan:write
read-only
offer_ride
festival, type, origin_city, date, seats, contact_link
Post a ride share for a festival, visible to other attendees: offering seats or looking for one.
plan:write
list_roommates
festival
Dancers looking for a roommate at a festival, and whether the dancer is looking.
plan:write
read-only
toggle_roommate_search
festival
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
city
Hangouts dancers set up in a city tonight (pre-party dinners, coffee, going together).
social:write
read-only
rsvp_hangout
hangout_id
Toggle the dancer’s RSVP to a hangout (others see who’s coming).
social:write
list_dinners
festival
Group dinners at a festival the dancer can join.
social:write
read-only
join_dinner
dinner_id
Join a group dinner at a festival.
social:write
ask_locals
city, question
Post a public question to a city’s dancers, e.g. “Where’s the best Thursday salsa?”.
social:write
recommend
city, target_type, target_name, text
Publicly recommend a venue or organizer in a city.
social:write
follow
handle, follow
Follow (or unfollow) an artist, venue, organizer or promoter to see their events.
social:write
write_review
target_type, target, rating, text, city
Publish a 1–5 star review with optional text.
social:write
request_private_class
handle, what, message, date, city, guests, budget
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:write
me:read
list_giveaways
city
Active giveaways in a city (tickets, passes) the dancer can enter.
social:write
read-only
enter_giveaway
giveaway_id
Enter the dancer into a giveaway with their account email.
social:write
me:read
city_video_pair
city
The next pair of a city’s dance videos for the monthly vote.
social:write
read-only
vote_city_video
city, winner_video_id, loser_video_id
Vote for the better of two videos from city_video_pair.
social:write
update_my_profile
name, city, styles, role, bio, instagram, website, profile_public
Change the dancer’s own public profile (not a business page): name, city, styles, role, bio, socials, visibility.
social:write
apply_to_gig
gig_id, message, profile
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
no arguments
Gigs the dancer applied to and whether each is pending, accepted or declined.
me:read
read-only
claim_profile
invite_token
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:publish
confirm

Tools: Organizers, artists, promoters, influencers

ToolWhat it doesNeeds
my_profiles
no arguments
The business pages (organizer, venue, artist, promoter) this app may act for, with the dancer’s role on each.
business:read
read-only
my_events
profile
Events of my pages: upcoming, drafts, past and archived, each with what it still lacks.
business:read
read-only
get_my_event
event_id
An event of my pages in editable form (local date and times, line-up handles, prices, agenda, published state, missing details).
business:read
read-only
inbox
no arguments
What needs me across my pages (drafts, missing details, flyers, booking requests, invites, join requests) and the next 14 days.
business:read
read-only
create_event
profile, name, type, date, start_time, end_time, end_date, city, venue_handle, venue_name, venue_address, artists, styles, description, cover, ticket_url, price, agenda
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
event_id, name, type, date, start_time, end_time, end_date, city, venue_handle, venue_name, venue_address, artists, styles, description, cover, ticket_url, price, agenda
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:write
confirm (when public)
publish_event
event_id, published
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:publish
confirm
duplicate_event
event_id, weeks
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:write
confirm (when public)
archive_event
event_id, whole_series
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:write
destructive
add_profile_from_instagram
instagram, type, name
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
city, from, to, styles, limit
Venues in a city that fit a date: who hosts which music on that weekday, whether they’re free, rooms and capacity.
business:read
read-only
find_lineup
query, type
Search WeDance pages by name or handle for a line-up or venue.
business:read
read-only
invite_artist
event_id, handle
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:publish
confirm
flyer_options
event_id, post_id
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:read
read-only
make_flyer
event_id, look_id, look_description, post_id
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
event_id, feelings, post_id
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
flyer_id, notes
Repaint a finished flyer with a change, e.g. “bigger date, less red”. Poll flyer_status with the batch_id.
business:write
flyer_status
batch_id
The flyers of a painting batch: painting, ready (with image URL), failed. Poll every 20–30 s until none is painting.
business:read
read-only
write_captions
event_id, language
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
event_id
Add WeDance’s suggested content plan for an event (announcement, line-up posts, reminders with dates), then return the plan.
business:write
inquiries
profile
Booking requests people sent to one of my pages (newest first), with their contact details.
business:read
read-only
mark_inquiry
profile, inquiry_id, status
Record that a booking request was answered or declined (the answer itself goes by email to the person).
business:write
team
profile
Who runs one of my pages and their roles; owners also see pending join requests.
business:read
read-only
decide_join_request
profile, request_id, approve, role
Let someone join one of my pages’ team (or decline). Owners only. Preview → confirm.
business:publish
confirm
set_member_role
profile, dancer_id, role, title
Make a team member owner or editor of one of my pages. Owners only. Preview → confirm.
business:publish
confirm
my_festivals
no arguments
Festivals the dancer organizes on WeDance (for event_insights).
business:read
read-only
event_insights
festival
The style and level mix of a festival’s attendees (aggregates only).
business:read
read-only
update_business_profile
profile, name, bio, city, styles, photo, address, influencer
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:publish
confirm
list_spaces
profile
The bookable rooms of one of my venue pages (ids for set_availability).
business:read
read-only
set_availability
space_id, slots
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
profile
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:read
read-only
respond_invite
profile, invite_token, decisions, participation, message
Approve or turn down suggested changes for my page, and confirm or decline a line-up invite (invite_token from inbox). Preview → confirm.
business:publish
confirm
profile_schedule
handle, days
Upcoming events a venue hosts, an organizer runs or an artist plays (artists: "my gigs").
business:read
read-only
post_gig_offer
kind, category, title, poster_name, poster_type, location, styles, when, compensation, deadline, contact_url
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:publish
me:read
confirm
promoter_roster
handle
Artists a promoter page represents.
business:read
read-only
recurring_series
profile, name, type, date, start_time, end_time, city, venue_handle, venue_name, venue_address, artists, styles, description, cover, ticket_url, price, agenda, every, until, count, skip, month_week, published
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:write
confirm (when public)
publish_series
series_id, published
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:publish
confirm
attendees
event_id, csv
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:read
read-only
gig_applications
gig_id
Gigs I (or my pages) posted, each with the artists who applied: message, page, email, status.
business:read
read-only
decide_gig_application
application_id, decision
Accept or decline an artist’s application to my gig; they get an email. Preview → confirm.
business:publish
confirm
my_link
event_id, profile
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
profile, event_id
Per tracked link (promoter page + event): visits, sign-ups, plan adds and tickets, plus totals. Optionally one page or one event.
business:read
read-only
promoter_dashboard
profile
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:read
read-only
event_link_results
event_id
For an event of my pages: every promoter’s tracked link and what it brought (visits, sign-ups, plan adds, tickets).
business:read
read-only
promo_kit
event_id, profile, language, paint_if_missing
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
event_id, profile, prize, description, sponsor_name, ends_on
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
event_id, status
Giveaways promoters and influencers proposed for events of my pages (all, or one event), with their status.
business:read
read-only
decide_giveaway_proposal
proposal_id, approve, ends_on, note
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:publish
confirm

Tools: Admin

ToolWhat it doesNeeds
admin_pending_claims
no arguments
Claims and reclaims of pages waiting for an admin decision.
admin
read-only
admin_pending_videos
city
Submitted city videos waiting for moderation.
admin
read-only

Resources and prompts

  • wedance://city/{slug}/events, wedance://event/{id}, wedance://profile/{handle}
  • Prompts: plan_my_weekend, prepare_festival_trip; with business scopes also promote_my_event, weekly_class_update.

Try it

bash
npx @modelcontextprotocol/inspector --cli https://2026.wedance.vip/mcp/public --method tools/list

Code: server/mcp (tools, server), server/oauth (authorization server). Design: docs/proposals/2026-10-18-mcp-server.md.