FreeTicket MCP Server
FreeTicket MCP Server exposes FreeTicket’s public B2C ticketing and authenticated B2B/admin operations as MCP tools.
Discover published events, fetch event details by slug, and check live ticket availability by date/ticket type (
public_events_*).Create general-admission B2C orders, return a Mercado Pago checkout link, retrieve order status, and resend ticket QR/email (
public_orders_*,public_tickets_resend).Manage events, dates, lineup/artists, ticket types, presales, sales, refunds, transfers, check-in, access close, memberships, discounts, webhooks, venues, staff, reports, settlements, and exports.
Manage content and community: posts, comments, channels, moderation, bans, meetups, videos/series/lives, digital products/courses, website/profile, ticket templates, and box-office QR codes.
With admin credentials, administer workspaces, users, plans, feature flags, impersonation, audit logs, and read CRM campaigns/audience/quota.
Connect via remote Streamable HTTP with OAuth or API-key auth, with optional adaptive UI views for lists and reports.
Provides tools for creating orders that generate a Mercado Pago checkout URL for payment processing, allowing AI agents to initiate payment flows in the FreeTicket platform.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@FreeTicket MCP Server list upcoming events"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@freeticket/mcp
FreeTicket's official MCP (Model Context Protocol) server. It exposes the B2B domain — events, dates, sales, tickets, memberships, venues, staff, reports — as tools to any MCP client (Claude Code, Claude Desktop, claude.ai).
Same contract and same session as the ft CLI: if you have run ft login, the
MCP is already authenticated with nothing to configure (it reads
~/.freeticket/config.json).
Install as a Claude plugin
The repo is a Claude Code plugin and its own marketplace. The plugin wires
the remote server (https://mcp.appfreeticket.com/mcp, declared in
.mcp.json) and ships four skills.
/plugin marketplace add AppFreeticket/freeticket-mcp
/plugin install freeticket@freeticketOr in one step (Claude Code 2.1.275+):
/plugin install freeticket --marketplace AppFreeticket/freeticket-mcp.
Authentication is OAuth — the same embedded authorization server claude.ai
uses (see below): Claude Code discovers it from the 401 +
WWW-Authenticate (RFC 9728) and registers itself (RFC 7591). Run /mcp,
pick freeticket, and sign in with your FreeTicket account in the browser. No
API key or header goes in the plugin.
Skill | What it does |
| Venue → event → dates → ticket types → optional member presale and lineup → publish now or schedule. |
| Live attendance, access-close record, capacity vs. sold, revenue, stuck payments, attendee export and settlement status for one date. |
| Reported comments, member posts awaiting review, bans and meetup RSVP requests, one approved action at a time. |
| Create or edit a course or downloadable product (modules, lessons, quizzes, drip) keeping lesson ids, then publish. |
Files: .claude-plugin/plugin.json (version kept
equal to package.json by src/plugin.test.ts),
.claude-plugin/marketplace.json (plugin
source: "./", the repo root), .mcp.json and skills/. Check
them with claude plugin validate .. None of them is published to npm
(files is dist only).
Local stdio instead of the remote server (CI, headless, or a pinned build): add it yourself rather than through the plugin —
claude mcp add --env FT_API_KEY=ft_live_... --transport stdio freeticket \
-- npx -y @freeticket/mcp(subject to the npm caveat below). If you also keep the plugin enabled, toggle
its freeticket server off in /mcp so the tools are not listed twice.
Related MCP server: thinker-mcp
Use (Claude Code / Claude Desktop)
{
"mcpServers": {
"freeticket": {
"command": "npx",
"args": ["-y", "@freeticket/mcp"]
// No env: uses the `ft login` session. For CI or headless:
// "env": { "FT_API_KEY": "ft_live_...", "FT_WORKSPACE_ID": "ws_..." }
}
}
}⚠️
@freeticket/mcpis not published on npm yet, so this stdio entry does not work today —npxcannot resolve the package. Use the remote server below until it ships.
Config precedence: env > ~/.freeticket/config.json > default. Variables:
FT_API_URL (base, without /api/v1), FT_API_KEY, FT_WORKSPACE_ID,
FT_ADMIN_SESSION (enables the admin_* tools of the superadmin contract
/api/admin).
Remote use over URL (HTTP)
Beyond stdio, the server runs over Streamable HTTP so it can be added as a
connector by URL (claude.ai, remote Claude Code, curl) with nothing installed
locally. It is live at https://mcp.appfreeticket.com/mcp.
freeticket-mcp-http # listens on :3333 (PORT to change it)It is stateless: every request carries its own credentials and the server builds per-session isolated clients (it never reads disk), so one process serves many workspaces without crossing sessions. Endpoints:
Endpoint | Auth | Tools |
| Bearer (OAuth token or raw API key) |
|
| none |
|
Connecting from claude.ai (Add custom connector)
The server ships an embedded OAuth 2.1 authorization server — that is the only thing claude.ai knows how to speak (it cannot send API keys or custom headers). Steps:
claude.ai → Settings → Connectors → Add custom connector.
Remote MCP server URL:
https://mcp.appfreeticket.com/mcp. Client ID and Secret: leave empty (it uses dynamic client registration, RFC 7591).Connecting opens the consent page: the "Continue with FreeTicket" button signs you into free-admin with your usual account and asks for approval (device flow, RFC 8628 — the same backend as
ft login). No keys to paste, and no workspace to pick: the connection reaches every workspace your account does. Under "Advanced options" there is still the manual form (an API key for CI, the superadmin cookie for theadmin_*tools, and a workspace field if you want this connection tied to a single tenant).Credentials are sealed (AES-256-GCM,
MCP_TOKEN_SECRET) inside the issued token — the server persists nothing: no database, multi-tenant safe.
The full standard flow: RFC 9728/8414 discovery → /register → /authorize
(PKCE S256) → /token (with refresh). FT_OAUTH_ISSUER delegates all of it to
an external AS (for instance, once free-admin publishes its own).
Direct auth (curl, your own clients)
curl -X POST http://localhost:3333/mcp \
-H 'authorization: Bearer ft_live_...' \ # raw API key
-H 'x-workspace-id: ws_...' \ # optional — pins it to one workspace
-H 'x-admin-session: <cookie>' \ # optional — enables admin_*
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'Deploying on Vercel
The repo already carries vercel.json + api/server.ts (the same logic as the
binary, as a Vercel Function):
vercel # preview
vercel env add MCP_TOKEN_SECRET production # openssl rand -hex 32
vercel --prodEnv on Vercel: MCP_TOKEN_SECRET (required — without it tokens die on every
cold start), FT_API_URL (optional, defaults to production), MCP_PUBLIC_URL
(optional — derived from the Host header). The resulting connector URL is
https://<project>.vercel.app/mcp.
Domain verification (OpenAI plugin directory)
The submission portal issues a token and fetches it back as plain text from
/.well-known/openai-apps-challenge. The server hands back whatever is in
OPENAI_APPS_CHALLENGE, trimmed:
vercel env add OPENAI_APPS_CHALLENGE production # paste the portal's token
vercel --prod
curl https://mcp.appfreeticket.com/.well-known/openai-apps-challengeThe token belongs to the deployment, not to the repo — a committed one is a verification anybody can serve from a fork. Unset, the path answers 404 and names the variable rather than inventing a value that would pass and prove nothing.
Tools
B2B /api/v1 (one tool = one contract operation). Destructive writes
(*_delete, *_refund, *_cancel, and every operation the contract flags
x-ft-destructive, such as sales_abandon, event_dates_access_close_sign,
content_channels_archive or content_members_ban) carry destructiveHint
and ask for confirmation.
Domain | Reads | Writes |
Session |
|
|
Events |
|
|
Lineup |
|
|
Tickets |
|
|
Presales |
|
|
Sales |
|
|
Door |
|
|
Event viewers (read-only stats) |
|
|
Memberships |
|
|
Commercial |
|
|
Reports |
| — |
Settlements |
| — |
Credentials |
| — |
Exports |
| — |
Landing waitlist |
|
|
Landing merch store |
| — (placing and paying an order needs the buyer's ID document and the card widget) |
Members area (headless SSO) |
|
|
Content |
|
|
Community channels |
|
|
Community moderation |
|
|
Community meetups |
|
|
Digital products and courses |
|
|
Videos, series and lives (Mux) |
|
|
Website and profile |
|
|
Ticket templates |
|
|
Box-office QR codes |
|
|
Minting and revoking credentials (ft api-keys, ft admin tokens) is left out
of the MCP on purpose: an agent lists credentials to audit them, it does not
issue them. The customer_* tools are for enterprise integrations: they need an
enterprise service API key and the buyer's session token
(X-Customer-Session). The exchange that issues that token is not a tool
either — it mints third-party sessions.
settlements_document and settlements_proof return a signed URL with a
5-minute TTL, not the file: the API answers 302, and following the redirect
would drop the whole PDF into the model's context.
🔒 = the result carries a secret: the stream key of a live (streamKey,
broadcast rights in the organization's name; only content_lives_create and
content_lives_reset_key return it) or the code/URL of a master QR (opens the
sale flow, cannot be rotated). The descriptions tell the agent not to echo it
into the chat or docs unless the human explicitly asks. The server does not
log or store tool results: the value only lives in the client's transcript.
Videos cannot be uploaded through the API (the Mux upload needs a browser).
The content tools list what is published without the playback id; to play
anything you need content_playback_token (30 min live, 1 h video), and
memberOnly content additionally requires a buyer session with a membership.
Public B2C /api/public (no credentials — a buyer's agent):
Domain | Tools |
Discovery |
|
Checkout |
|
Post-sale |
|
The public_* tools are always registered (anonymous). The agent never
touches the payment: public_orders_create returns the Mercado Pago link for
the human to pay. Checkout scope: general admission (not seated, not
members-only).
Superadmin /api/admin (only with FT_ADMIN_SESSION):
Domain | Tools |
Session / audit |
|
Workspaces |
|
Users |
|
Platform plans |
|
Feature flags |
|
CRM master (reads only) |
|
Launching, advancing or stopping batches and cancelling CRM campaigns is not
exposed: those operations send real email and WhatsApp to buyers. The contract
marks them x-ft-mcp: { expose: false } and src/coverage.test.ts fails if a
tool calls them. Use the CLI (ft admin crm) or the panel.
UI in the host (MCP Apps)
The server implements the io.modelcontextprotocol/ui extension
(MCP Apps, spec
2026-01-26), so lists and reports do not arrive as a wall of JSON: the host
draws them.
Resource:
ui://freeticket/view.html, mimeTypetext/html;profile=mcp-app.Tools with a view point at it through
_meta.ui.resourceUri; the result also travels instructuredContentso the view can read it.A single view picks the render from the shape of the payload: array → table (currency formatting, status pills, horizontal scroll), object → KPI tiles.
The HTML is self-contained: no external scripts, no fetch, no remote fonts. It declares
csp: {}— it asks for no network, so the host's deny-by-default sandbox has nothing to block.The brand is ours, the theme is the host's. The view adopts the host's CSS variables (
hostContext.styles.variables) to blend into the chat, but only those in the extension's contract (--color-*,--font-*): the FreeTicket logo and brand accent are not overridable. On a theme change it setsdata-themeandcolor-scheme, otherwiselight-dark()would follow the OS and the view would render light inside a dark chat.It listens only to the frame that mounted it (
event.source), reports its height withui/notifications/size-changed, formats currency in the host's locale, and answersui/resource-teardownso unmounting is clean.Hosts without the extension (or terminal clients) ignore
_metaand see the same text as always: nothing breaks.
49 tools with a view (v0.20.0) — every list and every report. Details
(*_get) and writes deliberately have none: a lone object or a delete
acknowledgement gains nothing from a table, and drawing one suggests there is
data where there is not. src/ui.test.ts mounts the real view in jsdom and
fails if a new list registers without _meta.ui, if the host manages to
override the branding, or if an API payload renders unescaped.
Support and privacy
Support: soporte@freeticket.us, or open an issue at AppFreeticket/freeticket-mcp.
Privacy policy: appfreeticket.com/legal/privacidad. The server is stateless: it keeps no log or store of tool results.
Development
pnpm install
pnpm generate # regenerates src/client/, src/admin-client/ and src/public-client/ from the specs
pnpm dev # runs the server over stdio
pnpm typecheck && pnpm testContracts this build targets: B2B 1.36.0, superadmin 1.8.0, public
0.10.1. All three are served by free-admin and are the only source of
truth, on separate semver lineages. To propagate a backend change, use the
contract-sync agent from the
ai-native umbrella — and check for
drift first: what free-admin serves today may already be ahead of the numbers
above.
MIT.
Available Tools
6 toolspublic_events_availabilityA
Stock en vivo por fecha y tipo de ticket (GET /public/events/{slug}/availability). Consultar antes de armar una orden.
Inputs: slug (required).
public_events_getA
Detalle público de un evento por slug (GET /public/events/{slug}).
Inputs: slug (required).
public_events_listA
Catálogo público de eventos publicados (GET /public/events). Descubrimiento B2C, sin login.
Inputs: q, to, city, from, +3 more.
public_orders_createA
Crea una orden B2C y devuelve el link de pago de Mercado Pago (POST /public/orders). El agente NUNCA procesa el pago: entrega la checkoutUrl al comprador para que pague. Solo admisión general (no numerado / no members-only) de un mismo organizador. Consultá el stock con public_events_availability antes.
Inputs: items (required), buyerName (required), buyerEmail (required), buyerPhone.
public_orders_getA
Estado de una orden B2C — pending | paid | expired | cancelled — y los tickets al pagar (GET /public/orders/{id}).
Inputs: id (required).
public_tickets_resendA
Reenvía el QR/email de un ticket al correo del comprador (POST /public/tickets/{code}/resend). Rate-limited; el email va siempre al correo original de la compra.
Inputs: code (required), email.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool targets a distinct resource-action pair (events availability, events detail, events list, orders create, orders get, tickets resend) with no functional overlap.
All tools follow a consistent 'public_{resource}_{action}' pattern using snake_case, making it predictable for an agent.
With 6 tools, the server is well-scoped for B2C event browsing and order management, covering the essential workflows without bloat.
The set covers the main user journey (browse, check stock, create order, check status, resend ticket) but lacks a cancel order tool, which is a minor gap.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for eventos event management platform, enabling AI assistants to manage events and tickets via API integration. Supports authentication, ticket CRUD operations, and listing with pagination.1MIT

thinker-mcpofficial
FlicenseNot gradedqualityDmaintenanceMCP server for thinker-ci, exposing tickets, CI/CD pipelines, project management data, and AI-agent sessions as tools and resources for Claude Code and other MCP clients.-- FlicenseNot gradedqualityCmaintenanceExposes ChatATP Studio's backend API as MCP tools over Streamable HTTP, enabling clients to manage agents, knowledge bases, MCP connections, HTTP APIs, LLM providers, messaging platforms, and teams with forwarded authorization.-
- AlicenseNot gradedqualityNot gradedmaintenanceTurns any OpenAPI/Swagger or REST API into callable MCP tools for Claude, ChatGPT, Copilot, and Cursor, with secure authentication and role-based access control.19 npm2AGPL 3.0