{"serverId":"mcp-registry/io.github.opencallportal/open-call-portals","tools":[{"name":"get_opportunity","fixed":{"name":"get_opportunity","description":"Look up one opportunity by its exact public UI reference (for example DJ-3128) before making any claim about it. Returns only an active, non-deleted, non-membership, non-partner public listing and its allowedResponderRoles. State only fields in the live result; missing means not provided. Never invent volume, frequency, or competition.","inputSchema":{"type":"object","required":["reference"],"properties":{"reference":{"type":"string","description":"Exact public UI reference."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":154,"tokensAfter":154},{"name":"get_platform_schema","fixed":{"name":"get_platform_schema","description":"Returns the Open Call Portals discovery contract: portal IDs, field value options, MCP server details, and read-only search metadata. Call this first for autodiscovery before filtering searches.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":81,"tokensAfter":81},{"name":"prepare_listing_form","fixed":{"name":"prepare_listing_form","description":"Validate a versioned, allowlisted listing-form prefill and return the canonical create-form URL. It supports every mounted form advertised by get_platform_schema (39 portal forms plus live events); the exact portal-specific fields, posting roles, and value shapes are declared in this tool's schema. This is a no-write handoff: it never creates a draft, sends email, verifies a code, or publishes. Do not include email addresses, verification codes, tokens, session IDs, credentials, contact data, or","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"schema","detail":"Root set to {\"type\":\"object\",\"properties\":{…}}."},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":22369,"tokensAfter":166},{"name":"search_availability","fixed":{"name":"search_availability","description":"Use this first for buyer-side requests to find, hire, or book talent, crew, suppliers, or services: 'I need a live band in St Kilda', 'find a DJ near Amsterdam', or 'event crew for hire'. For 'I need a live band in St Kilda', use portalId='lb-availability' and location='St Kilda'. Location hierarchy allows broader Melbourne availability to match St Kilda and labels it as a parent-area match. Do NOT use this when the speaker is the talent seeking work, e.g. 'I am a DJ looking for gigs/work'; use ","inputSchema":{"type":"object","properties":{"to":{"type":"string","description":"ISO date YYYY-MM-DD."},"from":{"type":"string","description":"ISO date YYYY-MM-DD."},"type":{"type":"string","description":"Optional exact canonical subtype override only; do not synthesize it from role nouns. Query recognizes aliases including Fourth Spaces sessions such as 'analogue-listening'. Generic words such as event, session, gig, opportunity, booking, or job are ignored."},"genre":{"type":"string","description":"Optional exact canonical override only; omit it rather than guessing from the request."},"limit":{"type":"number","description":"Max results (default 20, max 100)."},"query":{"type":"string","description":"Pass the user's complete original natural-language request. Prefer query-only rather than guessing portalId, genre, or type, e.g. 'I need a live band in St Kilda', 'find a music bingo host', or 'analog listening session in Amsterdam'. Portal-scoped genre/category and subtype aliases are normalized."},"location":{"type":"string","description":"Suburb/town/city/region/country. Hierarchical matching includes relevant parent areas and child locations."},"portalId":{"type":"string","description":"Optional exact canonical supply override only. Do not infer or guess this from a role phrase; omit it and let query resolve the vertical. When explicitly supplied, map DJ to 'dj-availability' and live band/band to 'lb-availability'. Do not put gig, opportunity, needed, wanted, or booking in this field. Available IDs include: dj-availability | lb-availability | cc-availability | comedian-availability | artist-professional-availability | ec-availability | solopreneur-availability | dance-acts-availability | gh-availability | casting-crew-availability | and more."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":647,"tokensAfter":647},{"name":"search_live_events","fixed":{"name":"search_live_events","description":"Use when the user asks to find, show, attend, watch, visit, or buy tickets for an event or session—not when they need to hire talent. For example, 'find an analogue listening session in Melbourne' uses this tool; 'analogue listening sessions looking for organisers' uses search_open_calls. Search first-party upcoming live events submitted directly to the Open Call Portals Live Events Map. Includes DJ sets, live bands, comedy nights, and more with geo coordinates (lat/lng), ticketing info, source ","inputSchema":{"type":"object","properties":{"to":{"type":"string","description":"ISO date YYYY-MM-DD — events on or before this date."},"from":{"type":"string","description":"ISO date YYYY-MM-DD — events on or after this date."},"type":{"type":"string","description":"Optional exact canonical override only. Omit it when the format is expressed naturally in query. Canonical examples include dj, live-band, comedian, dance-act, snooker-tournament, and analog-listening. Do not infer type from genre: 'techno events' means genre='techno' with type omitted."},"genre":{"type":"string","description":"Optional exact canonical override only; omit when inferred from query. Comma-separated canonical genres, e.g. 'house,techno,drum-bass'."},"limit":{"type":"number","description":"Max results (default 20, max 100)."},"query":{"type":"string","description":"Pass the complete original natural-language event discovery request, e.g. 'techno events in Amsterdam tonight'. Prefer query-only rather than guessing type or genre; the server maps phrases to authoritative live-event values."},"location":{"type":"string","description":"City, venue name, or country substring, e.g. 'london', 'chicago', 'uk'."},"ticketed":{"enum":["yes","no","tbc"],"type":"string","description":"Filter by ticket availability: 'yes' (ticketed), 'no' (free/open), 'tbc' (unknown)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":529,"tokensAfter":529},{"name":"search_open_calls","fixed":{"name":"search_open_calls","description":"Use this when talent, crew, suppliers, or service providers are looking for posted work: gigs, jobs, opportunities, vacancies, slots, bookings, wanted/needed listings, or open calls. Treat those words as search intent—not as genre/type filters. For example, 'DJ gig Amsterdam', 'DJ opportunity in Amsterdam', 'DJ needed listings Amsterdam', and 'I am a DJ looking for work in Amsterdam' all use search_open_calls with portalId='dj' and location='Amsterdam'. Explicit wording such as 'post/find/search","inputSchema":{"type":"object","properties":{"to":{"type":"string","description":"ISO date YYYY-MM-DD — only listings closing on or before this date."},"from":{"type":"string","description":"ISO date YYYY-MM-DD — only listings closing on or after this date."},"type":{"type":"string","description":"Optional exact canonical override only; do not synthesize it from role nouns. Use only a known subtype such as 'open-decks', 'supporting-act', 'music-bingo-night', or the Fourth Spaces session 'analogue-listening'. Never pass generic intent words such as event, session, gig, opportunity, needed, job, booking, or open call."},"genre":{"type":"string","description":"Optional exact canonical override only; do not guess it from the request. Comma-separated, e.g. 'house,techno'. Values are portal-scoped: genres, art forms, produce categories, liquor styles, and business specialties are matched only inside the relevant vertical. Common spelling and punctuation variants are normalized."},"limit":{"type":"number","description":"Max results (default 20, max 100)."},"query":{"type":"string","description":"Pass the user's complete original natural-language request. Prefer query-only rather than guessing portalId, genre, or type, e.g. 'I am a DJ looking for work in Amsterdam' or 'DJ gig Amsterdam'. The server extracts safe portal-scoped role, location, genre/category, and subtype aliases across every active vertical. Examples include 'Texas Holdem poker', 'music bingo game host', and 'analog listening sessions'."},"format":{"enum":["json","markdown"],"type":"string","description":"'markdown' returns paste-ready text. 'json' (default) returns structured data."},"location":{"type":"string","description":"Place only: suburb/town/city/region/country, e.g. 'St Kilda', 'Amsterdam', 'UK'. Location matching follows the hierarchy: a St Kilda request can include broader Melbourne listings, and a Melbourne request includes listings in child locations."},"portalId":{"type":"string","description":"Optional exact canonical override only. Do not infer or guess this from a role phrase; omit it and let query resolve the vertical. When explicitly supplied, map DJ/disc jockey/deejay to 'dj'; live band/band to 'lb'. Do not put words such as gig, opportunity, needed, wanted, job, or booking here. Supported IDs (omit for all): dj | lb | cc | fs | ec | darts | casting | cue-sports | golf-society | liquor-supply | solopreneur | artist | gh | comedian | demo | poker | bowling | local-produce | coworking | dance-acts"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":852,"tokensAfter":852}],"toolsChanged":6,"tokensSaved":22203,"todo":[{"tool":"prepare_response_form","params":["fields","version"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}