The MCP server is served from our own backend in Germany, the same servers and processing region as the rest of Zeeg.
Server URL
Connect from your AI app
- Claude (claude.ai)
- Claude Code
- ChatGPT
- Cursor
- VS Code
Go to Settings → Connectors → Add custom connector, paste the server URL, and follow the sign-in prompt.
Sign-in and consent
The first tool call opens your browser to Zeeg. If you’re not signed in, you’ll see sign-in and create-account buttons; sign in or sign up, and you’re sent straight back to finish connecting. You’ll then see a Zeeg-branded consent page naming the app, the redirect it will use, the workspace you’re connecting, and what it will be able to do. Approve it, and the app acts with your own dashboard permissions — a member sees what they see in the dashboard, an admin sees the whole workspace. It can’t do anything you can’t already do yourself. If you belong to more than one workspace, the consent page lists them all. The workspace you’re signed in to is always included; tick any others the app should reach. The app then acts in each ticked workspace as your own user there, with that workspace’s plan and your permissions in it. To change them later, open Workspaces on the app’s row under Connected apps, in the workspace you connected it from. Manage or revoke a connection any time from Settings → Connected apps, which also shows every tool call the app has made. An app you ticked another workspace for is listed in that workspace too; disconnecting it there removes only that workspace.Plan requirement
MCP access needs a trial or paid Zeeg plan. On a free plan, every tool returns a plain error explaining that MCP needs a paid plan or an active trial, with a link to billing — never a bare 401 or 403. Some tools need more than base access:find_available_times,diagnose_availabilityandbook_meetingneed a paid plan (not trial) — the same premium-scope check the public API applies to available-time and booking-creation requests.invite_usersandrevoke_invitationneed a paid plan (not trial), as theusers:writescope does on the public API: an accepted invitation adds a paid seat.- The voice agent tools (
list_voice_agents,get_voice_agent,list_voice_agent_options,create_voice_agent,update_voice_agent,add_agent_route,update_agent_route,delete_agent_route,list_agent_calls,get_agent_callandstart_outbound_call) need AI minutes in the workspace: an AI minutes subscription or enough AI credit.
Tools
Tool names aresnake_case; every tool declares a title and whether it’s read-only or destructive, which AI apps use to decide when to ask you before calling it.
Every tool takes an optional
workspaceId, one of the ids get_me lists under workspaces. Without it, a tool acts in the workspace the app was connected from. A workspace that wasn’t ticked on the consent page returns an error, and so does one you’ve since left. Every JSON result names the workspace it acted in, and the plan requirements above apply per workspace.
upsert_crm_records takes objectType (person, company or a custom-object slug) and a list of up to 50 records. Each record has values and optionally id, email or domain. A failed record does not stop the others: the result lists created, updated and failed counts and, for each record, its status, name, link and error. For example, to reassign 30 people to one owner, call it once with 30 records, each { "id": "<person id>", "values": { "contactOwnerMemberId": "<member id from get_me>" } }.
search_crm and get_booking results carry a link straight to the record in your dashboard; so do list_voice_agents, get_voice_agent, list_agent_calls and get_agent_call.
Safety
- Confirmation before it matters.
book_meeting,cancel_booking,reschedule_booking,hand_over_booking, andstart_outbound_callare marked destructive, so a well-behaved AI app confirms with you before calling them — booking, cancelling, moving, handing over and calling all have a real-world effect, andstart_outbound_callspends AI minutes.update_schedule,add_time_off,upsert_crm_records,update_note,delete_note,set_event_type_active,update_event_type,replace_event_type_questions,update_event_type_notifications,update_routing_form,replace_routing_form_questions,replace_routing_form_routes,update_team,remove_team_member,revoke_invitation,update_voice_agent,update_agent_routeanddelete_agent_routeare marked destructive too, because they overwrite or remove what’s already there, take a booking page or form offline, break a shared link or change what a voice agent says on live calls. So isset_invitee_no_show, because a no-show can start workflows that email the invitee, and so isinvite_users, because an invitation email cannot be called back.add_note,create_single_use_link,create_event_type,duplicate_event_type,create_routing_form,duplicate_routing_form,create_team,add_team_member,create_voice_agentandadd_agent_routechange data without being marked destructive, since they only add; their descriptions still ask the AI app to confirm with you, because a new scheduling page, form, voice agent or route goes live.delete_event_type,delete_routing_formanddelete_teamare marked destructive and say in their description what is lost for good: a deleted routing form takes every submission with it, and a deleted scheduling page takes the voice agent routes that book it. Each asks the AI app to confirm with you by name first, and to turn a page or form off instead when you only want it offline. - Text from outside your workspace is marked as data, not instructions. Booking answers, notes, and routing form submissions are written by invitees and form respondents. The server labels this content and tells the connected AI app never to treat it as instructions — a booking answer that says “ignore your previous instructions” stays inert.
- Every tool call is logged. Which app, which tool, what it touched, and whether it succeeded — visible to you (and, for admins, the whole workspace) at Settings → Connected apps. Arguments and results aren’t stored, only what happened.
- Lean output by default. Tool results return what the task needs — a list of bookings, for instance, doesn’t include phone numbers or form answers unless the app explicitly asks for them.
Data processing
Once you approve a connection, tool results — booking details, CRM records, form answers, and so on — are sent to the AI provider behind the app you connected (Anthropic for Claude, OpenAI for ChatGPT, and so on). That’s the same as pasting the data into that app yourself. Zeeg’s own processing and hosting stay in Germany, unchanged by connecting an AI app.For OAuth client builders
The MCP server implements the MCP authorization spec on top of our existing Passport OAuth:- Discovery:
GET /.well-known/oauth-authorization-serverandGET /.well-known/oauth-protected-resource/mcp, both underhttps://api.zeeg.me. - Resource: the protected-resource metadata’s
resourceis exactlyhttps://api.zeeg.me/mcp. - PKCE: required,
S256only. An authorize request withplain, or withoutcode_challenge_method, is refused withinvalid_request. - Issuer identification (RFC 9207): every authorization response carries
iss, equal to the metadataissuer(authorization_response_iss_parameter_supported: true). - Dynamic client registration:
POST /oauth/register, open to any redirect host — the consent page names the redirect host and marks the app unverified unless it’s on our first-party allowlist, so don’t rely on registration itself as a trust signal. - Client ID metadata documents (CIMD): also supported (
client_id_metadata_document_supported: true), and preferred over DCR for a high-traffic client — the metadata is fetched from the client’s ownclient_idURL instead of registering a new row per connection. - Client type: public clients only —
token_endpoint_auth_methods_supported: ["none"]. There’s no client-secret flow. - Scope: every MCP client is pinned to
mcp:useregardless of what it requests. A token that carriesmcp:useis rejected by every/v1and/v2REST route, and a normal API token is rejected by the MCP endpoint — the two token types don’t cross over. - Token lifetimes: access tokens expire after 1 hour; refresh tokens after 30 days and rotate on use — reusing a spent refresh token returns
invalid_grant. - Loopback redirects:
http://localhost/callbackandhttp://127.0.0.1/callbackmatch on any port, for local tools like Claude Code. - Token endpoint: accepts
application/x-www-form-urlencoded, per the OAuth spec. - Tool results: every tool except
get_zeeg_guidereturnsstructuredContentdescribed by itsoutputSchemaintools/list, plus the same JSON as a text block for clients that read only text.