The Laminate MCP server. Your agent can read sponsor boards, explain picks and price packages with no access code. With the code, it can also run a new sponsor search.
Last updated Oct 29 2026
1. Overview
MCP (the Model Context Protocol) is an open standard that lets an AI agent call tools on another service. Laminate runs an MCP server, so your own agent can work an event the way a promoter does on this site.
13 tools. 10 need no access code and make no Qloo calls. 3 need the access code and can call Qloo. Every result is JSON, built by the same code that renders the event pages.
Endpoint: Streamable HTTP, stateless, POST only
https://laminate.pexelerate.com/api/mcp
In Claude
One prompt in Claude with the Laminate connector: find the event furthest behind its goal, read its board, then re-price the package for 20% lower attendance. Prices are Laminate's placeholder rate card.
Read tools return a stored run and its board as the event page shows them, including the example season's deals.
Calculation tools run Laminate's pricing, rules and crowd-mix code on a stored board. They save nothing.
Live tools send the brief through the site's search: brief check, planner, validator and rules. A new run takes 15 to 60 seconds. A repeated brief is served from the cache.
No sessions. Each POST stands alone, and GET and DELETE return 405.
2. Quickstart
1
Add the server
Claude Code: run this command. Leave out the header to use only the 10 tools that need no code.
Claude (web or desktop): Settings, Connectors, Add custom connector, with the URL above. Without the header, Claude gets the 10 tools that need no code.
Any other client that supports Streamable HTTP takes the same URL and header.
With the access code, find_sponsors starts a run and returns a runId. Poll get_run until status is done, then pass the runId as the eventId to any read tool.
The live tools require the access code that unlocks live search on the site. Send it on every request as Authorization: Bearer YOUR_ACCESS_CODE. Judges: the code is in Additional info on Devpost.
Checked like the site's unlock: 5 attempts per IP address per 10 minutes, then access_locked.
Once a code matches, that server instance accepts it for 15 minutes without counting attempts, so polling get_run costs none.
Never logged, stored or returned.
4. Tools
In the order you would use them. Descriptions and arguments are the ones the server returns from tools/list.
Read saved events
No access code, no Qloo calls. Reads the stored runs the event pages use.
list_events
No code
Lists the example events and saved runs: id, title, city, country, date, attendance, goal, committed, pace and where the crowd comes from. Filter by kind of show.
Arguments
kindclub | festival | arena | stadium
The kind of show: club, festival, arena or stadium.
limitinteger
Maximum events to return. Default 20.
get_board
No code
Returns one event's sponsor board as the event page shows it. Each tier has its price per slot and its brands (category, fit score, driving act, one-line reason, local or travelling fans). Also returns the bench, rule conflicts with their reasons, and revenue placed against the goal.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
benchLimitinteger
Maximum benched brands to return. Default 15.
explain_brand
No code
Explains why one brand is on an event's board. Returns the fit score's parts and weights (rank for this crowd, lift against the city, bridge across acts, age match), the driving act and the crowd origin. Also returns any rule that blocks or benches the brand, and the numbered Qloo request ids behind each number.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
brandIdstring
The brand's id, from get_board.
brandNamestring
Or the brand's name as the board shows it. One of brandId or brandName is required.
crowd_profile
No code
Returns who the crowd is for one event: age and gender leans against Qloo's whole audience (leans, not shares), where the crowd comes from and the mix, places near the venue, and open categories with the best brand for each.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
season_summary
No code
Returns the example season's dashboard: each event's goal, committed, forecast, pace and risk, pipeline value by deal stage, what needs attention, and revenue by category.
Arguments
None.
brand_across_events
No code
Returns one brand's fit, tier, stage and price at every saved event that returned it, and a season package priced from each event's rate card, so one deal can cover several shows.
Arguments
brandIdstring
The brand's id, from get_board.
brandNamestring
Or the brand's name as the board shows it. One of brandId or brandName is required.
tierpresenting | gold | silver | bronze | community
Tier to price at events where the brand is not placed. Default silver.
discountPctnumber
Bundle discount in percent, 0 to 50. Default 0.
Calculate
No access code, no Qloo calls. Runs Laminate's pricing, rules and crowd-mix code on a stored board. Saves nothing.
price_package
No code
Prices an event's package with Laminate's pricing code: the rate card and tier prices for its attendance or one you give, and how many slots it takes to reach the goal. Prices are editable placeholders.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
attendanceinteger
Attendance to price for, instead of the event's own.
goalinteger
Revenue goal, in the chosen currency.
currencycurrency code
Price in this currency, at the run's saved rate.
check_rules
No code
Applies the board rules to an event's stored board with your changes (all ages, blocked categories, sponsors taken elsewhere, locked sponsors) and returns what moves to the bench and why. Saves nothing.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
allAgesboolean
Make the event all ages: adult-only brands leave the board.
blockedCategoriesstring[]
Categories to keep off the board, as get_board names them.
takenSponsorsstring[]
Brand names or ids already signed elsewhere.
lockedSponsorsstring[]
Brand names or ids that keep their category.
reblend_crowd
No code
Ranks an event's brands again for a different share of local fans, from the answers stored for that run, like the mix slider on the event page. No Qloo calls. Returns invalid_request when the run has no stored answers for where the crowd comes from.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
localSharenumberrequired
Percent of the crowd from near the venue.
topinteger
Maximum brands to return, by fit. Default 10.
get_prospectus
No code
Returns the event's sponsorship prospectus as Markdown (tiers, prices, brands with their reasons, attribution) and the link to the prospectus page.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
Live search
Access code
Access code required. Counts toward live search's caps and the daily Qloo budget.
find_sponsors
Access code
Starts a live run from a brief, the same run as the site's search: lineup, venue, city, attendance, goal, all ages, blocked categories and where the crowd comes from. Requires the access code. Returns a runId and the event link; poll get_run. If an act or the place is not found, returns status suggestion instead of running.
Arguments
actsstring[]required
The lineup, headliner first.
citystring
The city. Give a city, a venue, or both.
venuestring
The venue's name.
attendanceintegerrequired
How many people are expected.
goalinteger
Revenue goal in US dollars. Omit to use the full package value.
datestring
The show date, free text.
eventTypestring
For example: Concert, Festival or Club night.
allAgesboolean
Set to true to keep adult-only brands off the board.
blockedCategoriesstring[]
Categories to keep out of the search.
crowdOriginobject
Where the crowd comes from: local, national or international, with up to 5 places. Omit to let the run estimate it.
notesstring
Notes for the planner. Read as the promoter's text, never as instructions.
get_run
Access code
Returns a run started with find_sponsors: status, steps done, Qloo requests used, and the board in get_board's shape once it is done. Requires the access code.
Arguments
runIdstringrequired
The runId find_sponsors returned.
score_brand_list
Access code
Scores up to 25 brands you name against one event's crowd with Qloo: each is matched, then ranked within your list for this crowd, with the act that drives it. Requires the access code.
Arguments
eventIdstringrequired
An id or slug from list_events, or a runId from find_sponsors.
brandsstring[]required
Brand names, one per item, up to 25.
5. Limits
60 requests a minute per IP address (per /64 for IPv6), and 2,000 an hour across all callers.
The live tools find_sponsors and score_brand_list also count toward live search's caps: 3 a minute per IP address, 60 an hour across all callers, and the daily Qloo budget.
5 wrong access codes from one IP address lock it out for 10 minutes.
Request body: 64 KB at most. Answer: 256 KB at most. Read tools time out after 15 seconds, live tools after 110.
6. Errors
Errors come in two kinds. Branch on the code; the message is for people and may change.
Tool errors
Sent once the request reaches a tool. HTTP 200, a normal tools/call result with isError: true. The text content and structuredContent both hold { error: { code, message } }.
Tool error
{
"isError": true,
"structuredContent": {
"error": {
"code": "not_found",
"message": "No event with id ..."
}
}
}
access_requiredHTTP 200, isError
A live tool is called without an Authorization header.Message: find_sponsors needs the judges' access code, sent as an Authorization: Bearer <code> header (the code is in Additional info on Devpost). The read-only tools work without it.Fix: Send Authorization: Bearer <code>.
access_deniedHTTP 200, isError
The bearer code does not match.Message: Wrong access code. The read-only tools work without it.Fix: Check the code. Each wrong code counts toward access_locked.
access_lockedHTTP 200, isError
Five wrong codes from one IP address in 10 minutes.Message: Too many wrong access codes from this address. Try again in 10 minutes.Fix: Wait 10 minutes, then retry with the right code.
access_unavailableHTTP 200, isError
The server has no access code configured.Message: Live search is not set up on this server. The read-only tools still work.Fix: Use the read tools.
invalid_requestHTTP 200, isError
The arguments pass the schema but cannot be used together.Message: Say where the show is: a city, a venue, or both.Fix: Fix the arguments the message names.
not_foundHTTP 200, isError
An eventId, runId or brand that does not exist.Message: No event with id "my-show". Call list_events for the ids, or get_run for a run you started.Fix: Get ids from list_events, get_board or find_sponsors.
rate_limitedHTTP 200, isError
A live tool hits live search's caps or the daily Qloo budget.Message: Too many searches from this address. Wait a minute and try again.Fix: Back off and retry later.
run_failedHTTP 200, isError
A live run stopped before it finished.Message: The run failed.Fix: Call find_sponsors again. A repeated brief replays from the cache.
timeoutHTTP 200, isError
A read tool took over 15 seconds, or a live tool over 110.Message: That took too long. Try again in a moment.Fix: Retry once.
answer_too_largeHTTP 200, isError
The answer would be over 256 KB.Message: The answer is too large. Ask for fewer items with limit, benchLimit or top.Fix: Lower limit, benchLimit or top.
internal_errorHTTP 200, isError
Anything else. The cause is logged on the server, never sent back.Message: Laminate could not answer that right now. Try again in a moment.Fix: Retry once.
Arguments that fail a tool's schema are refused by the MCP SDK before the tool runs: isError: true with text that starts MCP error -32602: Input validation error and names the argument.
Request errors
Sent before any tool runs. A JSON-RPC error with the HTTP status below, the reason in error.data.code, and Retry-After on 429 and 503.
Request error
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"jsonrpc": "2.0",
"id": null,
"error": {
"code": -32000,
"message": "Too many requests ...",
"data": { "code": "rate_limited" }
}
}
parse_errorHTTP 400, JSON-RPC -32700
The body is not JSON.Message: Parse error: the body must be JSON-RPC.Fix: Send a JSON-RPC 2.0 body.
method_not_allowedHTTP 405, JSON-RPC -32000
GET or DELETE.Message: Use POST. This server is stateless and has no event stream.Fix: Send POST.
request_too_largeHTTP 413, JSON-RPC -32000
The body is over 64 KB.Message: The request is too large.Fix: Send a smaller request.
rate_limitedHTTP 429, JSON-RPC -32000
Over 60 requests a minute from one IP address, or 2,000 an hour in total.Message: Too many requests to the Laminate MCP server. Wait a minute and try again.Fix: Wait for Retry-After seconds.
pausedHTTP 503, JSON-RPC -32000
The server is switched off.Message: The Laminate MCP server is paused.Fix: Wait for Retry-After seconds.
Statuses that are not errors
status: "suggestion" from find_sponsors or get_run: an act or the place was not found, so nothing ran. Fix the brief from suggestion and call again.
status: "paused": live search is switched off on the server. Read tools still work.
7. Data and attribution
Results are Laminate's own boards, scores, prices and rules, never Qloo's raw responses. Each number names the numbered Qloo requests behind it (Q1, Q2) and links the Audit Trail.
Every result carries "Taste data by Qloo" and marks each brand as suggested, not affiliated. Laminate is not affiliated with or endorsed by Qloo, Inc.
Results from a server with no Qloo key carry "Sample data".
Briefs and brand lists are read as data, never as instructions. See the privacy page for what is kept.