Connect AI agents with MCP
Let Claude, ChatGPT, Gemini, Grok, Cursor and other AI agents look up businesses on Nola, and manage your own bookings and clients after you sign in.
Nola runs a Model Context Protocol (MCP) server, so AI agents can work with it directly. Anyone's agent can look up published businesses, services, prices and open times. Your own agent can sign in as you and read your calendar and clients, and, if you allow it, book, reschedule and cancel, and change resources, services, weekly hours and pricing rules.
It works with any agent that supports remote MCP servers over Streamable HTTP, including Claude, ChatGPT, Gemini, Grok, Cursor, VS Code, Microsoft Copilot Studio, Perplexity and Mistral Le Chat.
Two addresses
| Address | Use it for | Sign-in |
|---|---|---|
https://getnola.co/api/mcp/provider | Your own business: calendar, clients, bookings | Required. The agent opens a Nola sign-in page |
https://getnola.co/api/mcp | Public lookups: businesses, services, prices, open times, help | None. An API key adds your business tools |
Both addresses are shown with a Copy button under Settings → Integrations → AI agents (MCP).
Connect your agent
Claude
- In Claude, add a custom connector and paste
https://getnola.co/api/mcp/provideras the URL. - Click Connect. A Nola sign-in page opens.
- Sign in with your Nola account and approve access.
In Claude Code, run this and then use /mcp to sign in:
claude mcp add --transport http nola https://getnola.co/api/mcp/provider
ChatGPT
- Turn on developer mode and create a new app (connector) with the URL
https://getnola.co/api/mcp/provider. - Choose OAuth as the authentication and save.
- Sign in with your Nola account when ChatGPT asks.
ChatGPT deep research uses the public search and fetch tools, which need no sign-in.
Cursor, VS Code and Gemini CLI
Add the server to the client's MCP configuration and sign in when the client prompts you.
Cursor (mcp.json):
{ "mcpServers": { "nola": { "url": "https://getnola.co/api/mcp/provider" } } }
VS Code (.vscode/mcp.json):
{ "servers": { "nola": { "type": "http", "url": "https://getnola.co/api/mcp/provider" } } }
Gemini CLI (settings.json):
{ "mcpServers": { "nola": { "httpUrl": "https://getnola.co/api/mcp/provider" } } }
Copilot Studio, Perplexity, Mistral Le Chat and other apps
Add a remote MCP server with the URL https://getnola.co/api/mcp/provider and pick OAuth. The app registers itself with Nola's sign-in automatically.
Agents that cannot sign in: Grok API, OpenAI Responses API, n8n
Some agents can only send a fixed token. Create an API key with the scopes the agent needs and send it as a bearer token to https://getnola.co/api/mcp.
API keys need the Business or Enterprise plan. On other plans the agent's requests with a key are refused; signing in as yourself (OAuth) works on every plan.
xAI Grok API:
{ "type": "mcp", "server_url": "https://getnola.co/api/mcp", "server_label": "nola", "authorization": "nola_live_…" }
OpenAI Responses API:
{ "type": "mcp", "server_label": "nola", "server_url": "https://getnola.co/api/mcp", "authorization": "nola_live_…", "require_approval": "always" }
Anthropic Messages API (MCP connector):
{ "type": "url", "name": "nola", "url": "https://getnola.co/api/mcp", "authorization_token": "nola_live_…" }
What a signed-in agent can do
The agent gets the same access as your role in the business. A receptionist's agent can manage bookings and clients but not settings; an accountant's agent sees neither the calendar nor clients. Staff limited to their own resources see only those bookings, and staff without money access do not see prices. With an API key, the key's scopes decide instead.
If you belong to more than one business, the agent works in the first one by default. Ask it to call get_business_overview, which lists your businesses, and to pass the business slug as workspace.
Reading
| Tool | What it does |
|---|---|
get_business_overview | Timezone, currency, upcoming bookings, pending confirmations, services and whether agents may make changes |
list_bookings | Bookings between two dates, filtered by status or a search on client, service and notes |
get_booking | One booking with client, service, resources, notes and payment status |
list_business_services | Your services, including inactive ones on request |
list_resources | Courts, rooms, staff and equipment |
list_availability_slots | Availability slots with capacity and places booked |
get_weekly_hours | Weekly opening hours |
get_booking_rules | Lead times, buffers, cancellation window and fees |
list_clients | Clients, newest first, or a search by name, email or phone |
get_client | One client with first and last name, notes, tags and recent bookings |
list_class_sessions | Classes between two dates with instructor, room, places left and waitlist size |
get_class_roster | One class with the people booked and whether each has checked in |
Making changes
| Tool | What it does |
|---|---|
create_booking | Books a service for a client. Checks capacity, rules, blocked times and resource availability, like a booking made in the app |
update_resource | Changes a resource's name, open and close times, slot interval or whether it is active |
update_service | Changes a service's name, duration, price, or whether it can be booked |
set_weekly_hours | Sets weekly hours for the business, or for one service |
list_pricing_rules | Lists pricing rules, including prices per hour and per 15 minutes |
create_pricing_rule | Adds a pricing rule. Price per hour and Price per 15 min scale with the booking |
update_pricing_rule | Changes a pricing rule |
reschedule_booking | Moves a booking. The client is notified |
cancel_booking | Cancels a booking. The client is notified, the time is freed and the waitlist is offered the slot |
create_client | Adds a client by firstName and lastName, or by a single name that is split on its last space. If one with the same email exists, it is returned instead |
update_client | Changes a client's firstName, lastName (or a full name), email, phone, notes or tags. Only the fields you pass change |
create_availability_slot | Opens a bookable slot, optionally for one service |
book_class_session | Adds a client to a class. Their membership or pack is used when it covers the class; otherwise they pay at the desk. Asking twice for the same client returns the place they already have |
Importing data
The business owner's agent can bring data over from another system, the same way the copilot importer does. Only the owner, signed in: staff and API keys don't get these tools. The agent sends the table as CSV text.
| Tool | What it does |
|---|---|
import_start | Starts an import of one kind of data (members, memberships, packs, visits, family links, bookings, standing bookings, booking history or class attendees) and suggests which column is which |
import_dry_run | Checks every row without importing and lists each row that can't be imported, with the reason |
import_commit | Imports the rows that passed. Asks for a confirmation first |
import_undo | Undoes an import, except anything used since. Asks for a confirmation first |
Allow AI agents to make changes
Agents can only read your business until the owner allows changes:
- Open Settings → Integrations and find AI agents (MCP).
- Turn on the switch next to Allow AI agents to make changes.
While it is off, the tools for making changes are hidden from agents. Only the business owner can change the switch. The owner and Manager roles can open Settings → Integrations and see the section, but managers can't turn the switch on. Team members limited to some locations, resources or their own calendar don't see the page.
Every change an agent makes is recorded in the audit log with the person (or the API key's creator) and a note that it came through MCP.
Confirmations
reschedule_booking, cancel_booking, update_resource, update_service, set_weekly_hours, create_pricing_rule, update_pricing_rule, import_commit and import_undo never act on the first call. They return a preview of the change and a confirmation token. The agent should show you the preview; only when it calls again with the same details and the token does the change happen. A token is valid for 5 minutes and only for that exact change.
create_booking accepts an idempotencyKey. If the agent repeats a call with the same key within 24 hours, Nola returns the first booking instead of making a second one.
What anyone's agent can look up
Without signing in, agents can use these tools for businesses with a published booking page:
| Tool | What it does |
|---|---|
search | Searches businesses, services and help pages. Returns ids for fetch |
fetch | Returns the full text of a search result |
list_providers | Businesses in the public directory (on demo.getnola.co, the demo businesses) |
get_provider | One published business by slug |
list_services | A business's active services with duration, price and booking link |
check_availability | Open times for a service. A class with scheduled sessions returns those sessions. Other services return scheduled slots, tee times, or free start times per court, room or coach. A time is not free when a booking, a class or a standing booking already holds it |
get_pricing | Price, currency and duration of one service |
search_help | Searches this help center in English, Estonian or Russian |
Customers finish booking and paying on the booking page link the agent returns.
Times and time zones
All times are ISO 8601 with a time zone offset, for example 2026-10-01T09:00:00+03:00. Times without an offset are refused, so an agent never books the wrong hour by accident. get_business_overview and check_availability return your business time zone.
Limits
| What | Limit |
|---|---|
| Requests without sign-in | 120 a minute per network address, short bursts up to 60 |
| Requests from a signed-in agent or API key | 600 a minute, short bursts up to 120 |
| Changes per business | 30 a minute, short bursts up to 10 |
Above a limit, Nola answers with status 429 and a Retry-After header.
For developers
- Protocol: MCP 2026-07-28 over Streamable HTTP. Clients on the 2025 protocol versions are served too. The server keeps no sessions.
- Sign-in: OAuth 2.1 with PKCE. The endpoint answers
401with aWWW-Authenticateheader that points to/.well-known/oauth-protected-resource/api/mcp/provider. Clients register with Client ID Metadata Documents or Dynamic Client Registration. Scopes:openid profile email. - Errors come back as tool results with
isError: trueand a readable reason, so the agent can correct itself. - Requests from browser pages on other sites are refused.
| Address | What it holds |
|---|---|
/.well-known/mcp/server-card.json | Server card: name, addresses, sign-in and the full tool list |
/.well-known/mcp | A shorter manifest with both addresses and tool names |
/.well-known/oauth-protected-resource/api/mcp/provider | OAuth protected resource metadata |
/llms.txt, /llms-full.txt | Plain-text summaries for crawlers, including the MCP addresses |
/openapi.json | The REST API description |
In browsers that support WebMCP (navigator.modelContext), Nola pages also register a few tools for the browser's built-in assistant: list_industries, list_plans, search_help, list_providers, get_provider and navigate (public pages only). list_plans returns plan names and what each includes, without prices while Nola shares its prices on request.
Related
Was this page helpful?
Still stuck?
Ask the AI Copilot inside Nola, or send a request to the Nola team. A person answers within one working day.