Preo · Model Context Protocol
Connect your AI assistant to Preo
This is the Preo MCP server. It lets an AI client — Claude, Cursor, or anything else that speaks the Model Context Protocol — read and act on your event data: editions, products, orders and more. You approve the connection once in Preo and choose exactly what it may do.
That URL is the protocol endpoint, not a web page — paste it into your MCP client. Transport is streamable HTTP, and authorization is OAuth 2.1, so there is no API key to copy anywhere.
How to connect
Add it to your client as a remote MCP server (some clients call this an HTTP or streamable-HTTP server, or a custom connector) using the URL above. The first time the client connects, a browser window opens on Preo, you sign in, and you pick which permissions to hand over. From then on the client holds a token and connects on its own.
Claude Desktop and other clients with a connector UI
- Open the client's settings and look for Connectors, Integrations, or MCP servers.
- Add a custom / remote server and paste
https://mcp.preo.dev/mcp. - Finish the sign-in and approval that opens in your browser.
Clients configured with a JSON file
Cursor (~/.cursor/mcp.json), Claude Code (.mcp.json) and others take the same shape:
{
"mcpServers": {
"preo": {
"type": "http",
"url": "https://mcp.preo.dev/mcp"
}
}
}
Claude Code, from the terminal
claude mcp add --transport http preo https://mcp.preo.dev/mcp
MCP clients differ in where they keep this configuration and what they call it. If the snippets above do not match your version, check your client's own documentation — all it needs from us is the server URL, and every other detail is the client's.
Tools
These are the tools the server can expose. What your client actually sees is narrower: a tool only appears if you granted the permissions it needs and you have at least one event or organisation where it applies. Anything you did not grant is invisible, not merely refused.
Getting started
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_whoami | Who this token acts as, which scopes it was granted, and every organization and edition it can reach with their ids. Call this first — other tools need an edition_id (edt_...) or organization_id (org_...) from here. | — | Read |
Catalogue
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_get_product | Get one product by its id (prd_...), including variants, options, images, categories and pricing. |
catalog.read
|
Read |
| preo_list_editions | List the event editions this token can access. Returns edition ids (edt_...), names, dates, currency and timezone. Call this first to get an edition_id for other tools. |
catalog.read
|
Read |
| preo_list_products | List products in an edition — tickets, merchandise, food and drink. Requires an edition_id from preo_list_editions. Supports a free-text search. |
catalog.read
|
Read |
Sales
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_get_order | Get one order by its id (ord_...), including its payment transactions, the purchased items and the buyer. Get an order id from preo_list_orders. |
commerce.read
|
Read |
| preo_get_refund_request | Get one refund request by its id (refund_...), including its amount, status, reason, the purchase or transaction it refunds and who handled it. Ids come from preo_list_refund_requests. |
commerce.read
|
Read |
| preo_list_orders | List orders placed in an edition. Returns order ids (ord_...), order number, status, type (online / in-person / imported), total amount and the buyer's contact details. Requires an edition_id (edt_...) from preo_whoami or preo_list_editions. `search` matches order number, order id, customer email, customer phone and transaction id. |
commerce.read
|
Read |
| preo_list_refund_requests | List refund requests. Returns refund ids (refund_...), amount, status and the purchase or transaction being refunded. Pass an edition_id (edt_...) to narrow to one edition; without it every accessible edition is included. `status` filters on one of: requested, ready, processing, awaiting_gateway, processed, failed, rejected, invalid. |
commerce.read
|
Read |
Audience
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_get_customer | Get one customer by their id (usr_...), including contact details and their relationships to organizations and editions. Ids come from preo_list_customers, or from the buyer on an order returned by preo_get_order. |
audience.read
|
Read |
| preo_list_campaigns | List email and SMS campaigns targeted at an edition's audience. Returns campaign ids (cmp_...), name, channel, status, schedule and recipient counts. Requires an edition_id (edt_...) from preo_whoami or preo_list_editions. |
audience.campaign
|
Read |
| preo_list_customers | List the customers (buyers) of an edition. Returns customer ids (usr_...), name, email, phone and when they were last seen. Requires an edition_id (edt_...) from preo_whoami or preo_list_editions. `search` matches name, email, phone or customer id. This endpoint always pages at 100 rows, so `limit` only narrows how much you read. |
audience.read
|
Read |
On site & support
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_get_support_conversation | Get one support conversation by its id (tkt_...), including its contact, assignee, labels and linked records. Ids come from preo_list_support_conversations. |
ops.support
|
Read |
| preo_list_support_conversations | List customer-support conversations from the inboxes this token can reach. Returns conversation ids (tkt_...), subject, contact, assignee, priority, status and last activity. Narrow with an edition_id (edt_...) or an organization_id (org_...) from preo_whoami — with neither, every reachable inbox is included. `status` filters on one of: open, pending, resolved. |
ops.support
|
Read |
Event settings
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_list_webhooks | List webhook endpoints — the URLs Preo posts event notifications to. Returns endpoint ids (whe_...), target URL, subscribed events and whether the endpoint is active. Narrow with an edition_id (edt_...) or an organization_id (org_...) from preo_whoami; with neither, every reachable organization's endpoints are returned. |
edition.webhooks
|
Read |
Organisation
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_get_organization | Get one organization's configuration by its id (org_...): name, branding, email settings and, for managing-org operators, the advanced settings. Organization ids come from preo_whoami — there is no separate organization listing tool. |
org.settings
|
Read |
| preo_list_consents | List an organization's consent statements — the terms and opt-ins shown to customers at checkout. Returns consent ids (cns_...), title, type, scope and whether each is enabled and published. Requires an organization_id (org_...) from preo_whoami. |
org.consents
|
Read |
Reporting
| Tool | What it does | Needs | Access |
|---|---|---|---|
| preo_dashboard_summary | Headline sales figures for one edition: total revenue, order count, items sold, average order value, and service and handling fees. Requires an edition_id (edt_...) from preo_whoami or preo_list_editions. Vendor participants have no analytics access and will be refused. |
analytics.read
|
Read |
Permissions
Preo has 33 permissions, the same ones that decide what a person can do in the backoffice. When you approve a client you tick the ones it may use, and they apply everywhere you already have that access — a token cannot reach an event you cannot reach yourself.
Catalogue
What you sell — tickets, merchandise, food and drink.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| catalog.delete | Remove products and categories. | Yes |
| catalog.edit | Create and change products, ticket types and categories. | Yes |
| catalog.import | Import product data in bulk. | Yes |
| catalog.read | See your products, ticket types, categories and prices. | Yes |
Sales
Orders, payments and refunds.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| commerce.import | Import orders that were sold somewhere else. | Yes |
| commerce.read | See orders, purchases and payments. | Yes |
| commerce.refund | Approve or reject refunds. | Yes |
Audience
Ticket holders, segments and campaigns.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| audience.campaign | Create and send campaigns. | Yes |
| audience.edit | Change customer details and segments. | Yes |
| audience.read | See ticket holders and audience segments. | Yes |
On site & support
Scanning at the gate, bar and food sales, the support inbox.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| ops.onsite | Use the on-site tools — bar and food sales, pickup points. | Yes |
| ops.scan | Scan tickets and act on a scanned purchase. | Yes |
| ops.support | Read and answer support conversations. | Yes |
| ops.support_manage | Run the support inbox — assign, close, configure. | Yes |
Event settings
The configuration of a single event edition.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| edition.fees | Change the fees charged on an event. | Yes |
| edition.permissions | Change what individual staff members may do. | Yes |
| edition.settings | Change an event's own settings. | Yes |
| edition.staff | Decide who works on an event. | Yes |
| edition.webhooks | Manage the webhooks that push data to your other systems. | Yes |
Organisation
Everything that spans all of your events.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| org.consents | Manage organisation-wide consent texts, such as terms and notices. | Yes |
| org.editions | Create new events. | Yes |
| org.email | Manage the emails your customers receive. | Yes |
| org.files | Manage uploaded files and images. | Yes |
| org.hosted_stores | Manage your online stores. | Yes |
| org.service_accounts | Create machine accounts and their credentials. | Never |
| org.settings | Change organisation-wide settings. | Yes |
| org.staff | Invite and manage the people in your organisation. | Yes |
Hosted organisations
Only applies if your organisation hosts others, such as vendors.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| managing.billing | Bill the organisations you host. | Yes |
| managing.features | Turn features on and off for the organisations you host. | Yes |
| managing.orgs | Manage the organisations you host. | Yes |
| managing.participants | Decide which organisations take part in an event. | Yes |
Reporting
Dashboards, figures and data exports.
| Permission | What it lets a client do | Grantable |
|---|---|---|
| analytics.export | Export data out of Preo. | Yes |
| analytics.read | See dashboards, sales figures and reports. | Yes |
org.service_accounts
can never be granted to an MCP client, however you approve it. Never handed to an AI client. Minting machine credentials would let a token issue itself another token and step outside the limits you set here.
How authorization works
You approve the connection once, in the Preo backoffice, while signed in as yourself — the client never sees your password and there is no key to paste. On that screen you choose which of the permissions above to hand over, and the resulting token is capped twice: by what you granted, and by your own access at the moment of every call. If your access is reduced later, the token shrinks with it.
You can revoke a connection at any time under Profile → Tokens in the backoffice; the client stops working immediately. Tokens also expire on their own, at which point the client asks you to approve again.