Crisp MCP server for AI agents

Live

WEBSITE TOKEN (BASIC AUTH)

LIVE CHAT

Customer Support

Crisp gives your agent live chat support on your website: list and read conversations, reply as an operator, assign and resolve chats, manage contact profiles and events, and read helpdesk articles and analytics.

  • Per-user credentials: each call uses the actual user's credentials, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Crisp
agent · Acme Q3
Run
Which live chats are still unresolved this morning?
S
crisp_list_conversations
102ms
Support agent
7 conversations are unresolved. 3 ask about refund timing, and 2 have waited over an hour with no operator assigned.
Sources: Crisp inbox, 7 conversations
crisp
7 conversations
18:29
Message Claude...

Tools your support agent reaches for on Crisp, scoped per user.

CALL ANY TOOL
50 tools for live chat in Crisp: list and read conversations and messages, send replies, assign, route, and resolve chats, manage contact profiles, data, and events, read helpdesk pages, and generate analytics.
crisp_add_people_event
Add people event
Record an event on a contact's timeline, for example a purchase or signup. Returns an empty data object on success. Use crisp_list_people_events to read the timeline back.
Parameters
Name
Type
Required
Description
people_id
string
Required
People profile identifier from crisp_list_people_profiles or crisp_get_conversation (people_id). Crisp also accepts the contact's email address in place of the identifier. Example: 3b6f2a10-7c9d-4e1a-8f55-0a1b2c3d4e5f.
text
string
Required
Short description of the event. Example: Upgraded to Pro plan.
website_id
string
Required
Identifier of the Crisp website (workspace) to act on. Find it in the Crisp app under Settings > Workspace Settings > Setup Instructions, or call crisp_get_website on a known id. Example: 8c042840-1ecb-4cd5-a6a1-b3ac4a3ad8d6.
color
string
Optional
Color label for the event in the Crisp UI. One of: `red`, `orange`, `yellow`, `green`, `blue`, `purple`, `pink`, `brown`, `grey`, `black`.
data
object
Optional
Extra key-value data for the event. Example: {"plan": "pro"}.
crisp_assign_conversation_routing
Assign conversation routing
crisp_create_conversation
Create conversation
crisp_delete_conversation
Delete conversation
crisp_generate_analytics
Generate analytics
crisp_get_availability_status
Get availability status
crisp_get_conversation
Get conversation
crisp_get_conversation_participants
Get conversation participants
crisp_get_conversation_routing
Get conversation routing
crisp_get_helpdesk
Get helpdesk
crisp_get_inbox
Get inbox
crisp_get_message
Get message
crisp_get_people_data
Get people data
crisp_get_people_stats
Get people stats
crisp_get_people_subscription
Get people subscription
crisp_get_website
Get website
crisp_list_conversation_events
List conversation events
crisp_list_conversation_files
List conversation files
crisp_list_helpdesk_locales
List helpdesk locales
crisp_list_inboxes
List inboxes
crisp_list_operator_availabilities
List operator availabilities
crisp_list_operators
List operators
crisp_list_people_events
List people events
crisp_list_teams
List teams
crisp_mark_messages_read
Read mark messages
crisp_send_message
Send message
crisp_update_conversation_inbox
Update conversation inbox
crisp_update_conversation_meta
Update conversation meta
crisp_update_message
Update message
crisp_update_people_profile
Update people profile

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Crisp tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["crisp"], toolNames: [
    "crisp_list_conversations",
    "crisp_list_messages",
    "crisp_send_message"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Reply to unresolved chats that ask about refund timing" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["crisp"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Reply to unresolved chats that ask about refund timing" }],
  tools,
});

// Execute the tool call with the user's vaulted Crisp website token (basic auth)
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["crisp"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Reply to unresolved chats that ask about refund timing" }],
  tools,
});

// Tool call runs with the user's vaulted Crisp website token (basic auth)
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["crisp"] }, pageSize: 100,
});

const agent = new Agent({
  name: "support_agent",
  model: "gemini-2.5-pro",
  instruction: "Crisp tools scoped to this user",
  tools,
});

await agent.run("Reply to unresolved chats that ask about refund timing");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Crisp tool. Click to copy, paste into your agent, done.
Conversations
Copy the prompt
Copied
List unresolved conversations from the last 24 hours.
Copy the prompt
Copied
Reply to the latest chat from jane@acme.com with our refund timeline.
Copy the prompt
Copied
Mark the Globex conversation as resolved.
Routing and operators
Copy the prompt
Copied
Assign the oldest unassigned chat to Maria.
Copy the prompt
Copied
Show which operators are available right now.
Copy the prompt
Copied
Move this conversation to the Billing inbox.
Contacts and insights
Copy the prompt
Copied
Look up the contact profile for alex@globex.com.
Copy the prompt
Copied
Record a Purchased Pro event on Priya Shah's timeline.
Copy the prompt
Copied
How many visitors are on the website right now?
SEE HOW AUTH WORKS
Each user connects their own Crisp website token once, and Scalekit sends it with every call. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Crisp
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Crisp
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Crisp
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Crisp
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other customer support connectors.
Support and Ops Teams
Support triage agent
Fetches new Zendesk tickets, classifies them by type and urgency, searches the Notion knowledge base for an answer, and routes what it cannot resolve to Slack. Every call runs on the support agent's own delegated OAuth.
Support and Ops Teams
Support ticket automation agent
Fetches new Zendesk tickets, drafts a reply from Notion knowledge base articles, digests what it cannot answer to Slack, and archives the rest, acting as the support agent rather than a shared API key.
Test other agents
See the same per-user auth pattern across other customer support connectors.
SUPPORT
Support triage agent
Classify new Zendesk tickets, search the Notion knowledge base for an answer, and route what it cannot resolve to Slack.
SUPPORT
Support ticket automation (Google ADK)
Fetch, annotate, and archive Zendesk tickets with Notion context, digesting anything it cannot answer to Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Crisp website token looks fine in a demo. In production every reply and status change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Crisp today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Crisp as the user or through a shared website token?
As the user. Each user connects their own Crisp website token once, and Scalekit sends it with every call. Audit logs attribute every reply and conversation change to that user, not a shared service account.
Where are the Crisp credentials stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Crisp?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the conversation and contact read tools without crisp_send_message or crisp_delete_conversation, which permanently removes a conversation and its messages. Scalekit also enforces scope checks before every API call.
What happens when Crisp access is turned off?
Disable the connection in the Scalekit dashboard and the next tool call fails closed with a clear error. Other tenants are unaffected, and the change is logged.
Can the agent use our Crisp helpdesk articles?
Yes. crisp_list_helpdesk_pages lists published helpdesk pages for a locale, and crisp_get_helpdesk_page_entity resolves one page, so an agent can find the right article before it replies in a conversation.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""crisp"": {
""url"": ""https://mcp.scalekit.com/crisp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.crisp]
url = ""https://mcp.scalekit.com/crisp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""crisp"": {
""url"": ""https://mcp.scalekit.com/crisp"",
""type"": ""http""
}
}
}