Skip to main content
Zeeg runs a remote MCP server, so an AI app you already use — Claude, ChatGPT, Cursor, VS Code, or any other MCP client — can read and act on your Zeeg workspace: check availability, book and reschedule meetings, look up CRM people, read routing form submissions, review AI voice agent calls, and more.
The MCP server is served from our own backend in Germany, the same servers and processing region as the rest of Zeeg.

Server URL

Every MCP client listed below connects to this one URL. There’s nothing to install on our side and no separate account to create — you sign in with your existing Zeeg login.

Connect from your AI app

Go to Settings → Connectors → Add custom connector, paste the server URL, and follow the sign-in prompt.
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_availability and book_meeting need a paid plan (not trial) — the same premium-scope check the public API applies to available-time and booking-creation requests.
  • invite_users and revoke_invitation need a paid plan (not trial), as the users:write scope 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_call and start_outbound_call) need AI minutes in the workspace: an AI minutes subscription or enough AI credit.

Tools

Tool names are snake_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, and start_outbound_call are 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, and start_outbound_call spends 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_route and delete_agent_route are 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 is set_invitee_no_show, because a no-show can start workflows that email the invitee, and so is invite_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_agent and add_agent_route change 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_form and delete_team are 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-server and GET /.well-known/oauth-protected-resource/mcp, both under https://api.zeeg.me.
  • Resource: the protected-resource metadata’s resource is exactly https://api.zeeg.me/mcp.
  • PKCE: required, S256 only. An authorize request with plain, or without code_challenge_method, is refused with invalid_request.
  • Issuer identification (RFC 9207): every authorization response carries iss, equal to the metadata issuer (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 own client_id URL 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:use regardless of what it requests. A token that carries mcp:use is rejected by every /v1 and /v2 REST 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/callback and http://127.0.0.1/callback match 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_guide returns structuredContent described by its outputSchema in tools/list, plus the same JSON as a text block for clients that read only text.
Last modified on November 4, 2026