- Sign in with OAuth — for Claude, ChatGPT and any MCP app that supports it. You paste the URL, sign in to Keebai, pick the company and approve permission groups. There is no token to create or copy.
- A Personal Access Token — for clients without OAuth, scripts, and servers that run unattended.
Endpoint
GET and DELETE on this path return 405.
Connect with OAuth
Claude
claude.ai, Claude Desktop and Claude Code.
ChatGPT
As a custom MCP server.
Other MCP apps
Cursor, VS Code, Gemini CLI and the rest.
accounts.keebai.com in your browser, and keeps its tokens fresh on its own. Each person connects with their own account, and what they can approve is limited by their Keebai role.
You can see and disconnect every connected app in the portal under Developers › Connected apps (Desarrolladores › Apps conectadas). Building your own client? See the OAuth reference.
Connect with a Personal Access Token
Use a token when the client cannot sign in with OAuth, or when nobody is there to sign in.The
Accept header must list both application/json and text/event-stream. Streamable HTTP negotiates between them per response, and a client that offers only one gets a protocol error.Scopes are enforced per tool, not per connection
This is the one behaviour that surprises people:1
Every tool is always listed
tools/list returns every tool regardless of what your token can do. The catalogue is not filtered by scope.2
The check happens on call
tools/call verifies the scope for that specific tool.3
A missing scope is a tool error, not an HTTP error
You get
200 OK with a tool result carrying isError: true. The agent sees the failure and can explain it; your transport does not break.Least privilege
The whole scope catalogue is on the Scopes page. Over OAuth you approve groups rather than single scopes; with a token you can be as precise as you like. Some useful shapes for an agent:Read-only agent
Answers questions about your data, changes nothing.
knowledge:read, knowledge:query, contacts:read, crm:customers:read, crm:tickets:read, crm:tasks:read, crm:notes:read.Support agent
Reads context, replies on WhatsApp, and logs what it did.
knowledge:query, contacts:read, messages:send, crm:tickets:read, crm:tickets:write, crm:notes:write.CRM operator, no deletes
Full read/write across the pipeline with destruction left out.All
crm:*:read and crm:*:write, contacts:read, contacts:write.Sales agent
Answers questions about the catalog and past purchases, and nothing else.
ecommerce:products:read, ecommerce:sales:read, contacts:read.Knowledge maintainer
Keeps the knowledge base in step with an external source.
knowledge:read, knowledge:write, knowledge:delete, knowledge:assign.Loyalty concierge
Answers “how many points do I have” over WhatsApp. Reads balances, changes nothing.
loyalty:read, contacts:read, messages:send.Booking agent
Finds an open slot and books it. Cancelling stays out, so it can never free someone else’s appointment.
scheduling:branches:read, scheduling:services:read, scheduling:professionals:read, scheduling:availability:read, scheduling:appointments:create, scheduling:appointments:confirm.What is not exposed
Everything else in the REST surface has a matching tool.
Operational notes
- The MCP endpoint is not rate limited. The 300/minute and 1000/day caps apply to the REST API; tool calls do not consume them. An agent in a loop can generate a lot of upstream traffic, so put your own ceiling on it.
- Every tool call is audited with the tool name, the token, the outcome, and the latency, the same way REST calls are.
- Tools are stateless. Nothing carries over between calls — every tool takes the ids it needs as arguments.
- Errors arrive as text, not as structured problems. A failed call returns
isError: truewith the message flattened into a string; the HTTP status codes documented for REST do not reach the agent.
Next steps
Connect with Claude
Add Keebai as a connector and sign in.
Tool catalogue
Every tool with its required scope.
OAuth reference
Endpoints and errors for your own client.
Create a token
Mint a PAT and pick its scopes.