libredesk-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@libredesk-mcp list my open conversations"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
libredesk-mcp
A Model Context Protocol server for Libredesk — the open-source omnichannel customer support desk.
Exposes the entire Libredesk REST API (54 endpoints) as MCP tools, generated dynamically from the official OpenAPI spec.
Tools
All Libredesk REST endpoints become tools (54 total), organized by API tag:
Conversations —
create_conversation,get_all_conversations,get_assigned_conversations,get_unassigned_conversations,get_conversation,get_messages,get_message,send_message,retry_message,get_conversation_participants,update_conversation_priority,update_conversation_status,update_conversationtags,update_user_assignee,remove_user_assignee,update_team_assignee,remove_team_assignee,update_conversation_assignee_last_seen,get_view_conversations,get_team_unassigned_conversationsContacts —
get_contacts,get_contact,update_contact,block_contact,get_contact_notes,create_contact_note,delete_contact_noteAgents —
get_agents,get_agent,get_current_agent,create_agent,update_agent,update_agent_availability,delete_agent,generate_api_key,revoke_api_keyTeams —
get_teams,get_team,create_team,update_team,delete_teamStatus & Priority —
get_statuses,get_priorities,create_status,update_status,delete_statusAI —
ai_completion,get_ai_prompts,update_ai_providerSearch —
search_conversations,search_contacts,search_messagesMedia —
media_uploadHealth —
health_check
Related MCP server: Gorgias MCP Server
Setup
1. Get a Libredesk API key
Log in to your Libredesk instance as an agent, open your profile, and generate an API key. You'll get an api_key and api_secret.
2. Add to Claude Code
claude mcp add-json libredesk --scope user '{
"command": "node",
"args": ["/absolute/path/to/libredesk-mcp/dist/index.js"],
"env": {
"LIBREDESK_URL": "http://localhost:9000",
"LIBREDESK_API_KEY": "ak_...",
"LIBREDESK_API_SECRET": "as_..."
}
}'Or once published to npm:
claude mcp add-json libredesk --scope user '{
"command": "npx",
"args": ["-y", "libredesk-mcp"],
"env": {
"LIBREDESK_URL": "http://localhost:9000",
"LIBREDESK_API_KEY": "ak_...",
"LIBREDESK_API_SECRET": "as_..."
}
}'Restart your Claude Code session; you should see libredesk as ✓ Connected in claude mcp list.
3. Other MCP clients
Add to your MCP host's config (Cursor, Claude Desktop, etc.):
{
"mcpServers": {
"libredesk": {
"command": "node",
"args": ["/absolute/path/to/libredesk-mcp/dist/index.js"],
"env": {
"LIBREDESK_URL": "http://localhost:9000",
"LIBREDESK_API_KEY": "ak_...",
"LIBREDESK_API_SECRET": "as_..."
}
}
}
}Environment variables
Variable | Required | Description |
| yes | Base URL of your Libredesk instance, no trailing slash. e.g. |
| yes | Agent API key from the Libredesk admin UI |
| yes | Agent API secret paired with the key |
Authentication uses Libredesk's token scheme: Authorization: token <api_key>:<api_secret>.
How it works
On startup the server reads a bundled copy of Libredesk's OpenAPI spec, walks every operation, and registers it as an MCP tool with:
tool name— derived from the operation'soperationIdby stripping thehandleprefix, splitting camelCase into snake_case, and lowercasing. Consecutive capitals are treated as acronyms (e.g.handleGetAIPrompts→get_ai_prompts,handleGenerateAPIKey→generate_api_key).description— built from the operationsummary,description, HTTP method/path, and tags.inputSchema— flattened from path parameters, query parameters, and the request body's JSON schema (with$refs resolved againstcomponents.schemas).
When a tool is called, the server substitutes path params, builds the query string, sets the auth header, sends the request, and returns the response body verbatim (pretty-printed JSON when applicable) along with the HTTP status line. Errors from Libredesk are returned as-is so you can see why a request was rejected.
Develop
npm install
npm run build # tsc + copy openapi.json into dist/
npm run dev # tsx src/index.ts (live TypeScript)
npm start # node dist/index.jsRefresh the bundled OpenAPI spec:
curl -sL https://docs.libredesk.io/api-reference/openapi.json > src/openapi.json
npm run buildLicense
MIT
Available Tools
54 toolsai_completionC
A I Completion POST /api/v1/ai/completion Tags: AI completions
Inputs: prompt_key (required), content (required).
block_contactB
Block or Unblock Contact PUT /api/v1/contacts/{id}/block Tags: Contacts
Inputs: id (required), enabled (required).
create_agentC
Create Agent POST /api/v1/agents Tags: Agents
Inputs: first_name (required), email (required), roles (required), last_name, +5 more.
create_contact_noteD
Create Contact Note POST /api/v1/contacts/{id}/notes Tags: Contact notes
Inputs: id (required), note (required).
create_conversationC
Create Conversation POST /api/v1/conversations Tags: Conversations
Inputs: subject (required), content (required), inbox_id (required), contact_email (required), +6 more.
create_statusC
Create Conversation Status POST /api/v1/statuses Tags: Status and priority
Inputs: name (required).
create_teamD
Create Team POST /api/v1/teams Tags: Teams
Inputs: name, emoji, conversation_assignment_type, max_auto_assigned_conversations, +3 more.
delete_agentC
Delete Agent DELETE /api/v1/agents/{id} Tags: Agents
Inputs: id (required).
delete_contact_noteC
Delete Contact Note DELETE /api/v1/contacts/{id}/notes/{note_id} Tags: Contact notes
Inputs: id (required), note_id (required).
delete_statusC
Delete Conversation Status DELETE /api/v1/statuses/{id} Tags: Status and priority
Inputs: id (required).
delete_teamC
Delete Team DELETE /api/v1/teams/{id} Tags: Teams
Inputs: id (required).
generate_api_keyD
Generate A P I Key POST /api/v1/agents/{id}/api-key Tags: Agents
Inputs: id (required).
get_agentB
Get Agent GET /api/v1/agents/{id} Tags: Agents
Inputs: id (required).
get_agentsC
Get Agents GET /api/v1/agents Tags: Agents
Inputs: no named parameters.
get_ai_promptsC
Get A I Prompts GET /api/v1/ai/prompts Tags: AI completions
Inputs: no named parameters.
get_all_conversationsC
Get all Conversations GET /api/v1/conversations/all Tags: Conversations
Inputs: page, page_size.
get_assigned_conversationsB
Get Assigned Conversations Get all assigned conversations to current user GET /api/v1/conversations/assigned Tags: Conversations
Inputs: page, page_size.
get_contactC
Get Contact GET /api/v1/contacts/{id} Tags: Contacts
Inputs: id (required).
get_contact_notesC
Get Contact Notes GET /api/v1/contacts/{id}/notes Tags: Contact notes
Inputs: id (required).
get_contactsC
Get Contacts GET /api/v1/contacts Tags: Contacts
Inputs: page, page_size.
get_conversationD
Get Conversation GET /api/v1/conversations/{uuid} Tags: Conversations
Inputs: uuid (required).
get_conversation_participantsC
Get Conversation Participants GET /api/v1/conversations/{uuid}/participants Tags: Conversations
Inputs: uuid (required).
get_current_agentC
Get Current Agent GET /api/v1/agents/me Tags: Agents
Inputs: no named parameters.
get_messageC
Get Message GET /api/v1/conversations/{cuuid}/messages/{uuid} Tags: Conversations
Inputs: cuuid (required), uuid (required).
get_messagesC
Get Messages GET /api/v1/conversations/{uuid}/messages Tags: Conversations
Inputs: uuid (required), page, page_size, private, +1 more.
get_prioritiesC
Get Conversation Priorities GET /api/v1/priorities Tags: Status and priority
Inputs: no named parameters.
get_statusesC
Get Conversation Statuses GET /api/v1/statuses Tags: Status and priority
Inputs: no named parameters.
get_teamC
Get Team GET /api/v1/teams/{id} Tags: Teams
Inputs: id (required).
get_teamsC
Get Teams GET /api/v1/teams Tags: Teams
Inputs: no named parameters.
get_team_unassigned_conversationsA
Get Team Unassigned Conversations Get conversation assigned to team but not assigned to any agent GET /api/v1/teams/{id}/conversations/unassigned Tags: Conversations
Inputs: id (required), page, page_size.
get_unassigned_conversationsA
Get Unassigned Conversations Get all conversations not assigned to any user and team GET /api/v1/conversations/unassigned Tags: Conversations
Inputs: page, page_size.
get_view_conversationsB
Get View Conversations Get conversations for a specific view GET /api/v1/views/{id}/conversations Tags: Conversations
Inputs: id (required), page, page_size.
health_checkA
Health Check GET /health Tags: Health
Inputs: no named parameters.
media_uploadD
Media Upload POST /api/v1/media Tags: Media
Inputs: files.
remove_team_assigneeB
Remove Team Assignee PUT /api/v1/conversations/{uuid}/assignee/team/remove Tags: Conversations
Inputs: uuid (required).
remove_user_assigneeD
Remove User Assignee PUT /api/v1/conversations/{uuid}/assignee/user/remove Tags: Conversations
Inputs: uuid (required).
retry_messageB
Retry Message Retries sending a failed message in the specified conversation. PUT /api/v1/conversations/{cuuid}/messages/{uuid}/retry Tags: Conversations
Inputs: cuuid (required), uuid (required).
revoke_api_keyB
Revoke A P I Key DELETE /api/v1/agents/{id}/api-key Tags: Agents
Inputs: id (required).
search_contactsC
Search Contacts GET /api/v1/contacts/search Tags: Search
Inputs: query (required).
search_conversationsC
Search Conversations GET /api/v1/conversations/search Tags: Search
Inputs: query (required).
search_messagesC
Search Messages GET /api/v1/messages/search Tags: Search
Inputs: query (required).
send_messageC
Send Message POST /api/v1/conversations/{cuuid}/messages Tags: Conversations
Inputs: cuuid (required), message (required), attachments, private, +4 more.
update_agentC
Update Agent PUT /api/v1/agents/{id} Tags: Agents
Inputs: id (required), first_name (required), email (required), roles (required), +6 more.
update_agent_availabilityC
Update Current Agent Availability PUT /api/v1/agents/me/availability Tags: Agents
Inputs: status (required).
update_ai_providerC
Update A I Provider PUT /api/v1/ai/provider Tags: AI completions
Inputs: provider (required), api_key (required).
update_contactC
Update Contact PUT /api/v1/contacts/{id} Tags: Contacts
Inputs: id (required), first_name, last_name, email, +5 more.
update_conversation_assignee_last_seenC
Update Conversation Assignee Last Seen PUT /api/v1/conversations/{uuid}/last-seen Tags: Conversations
Inputs: uuid (required).
update_conversation_priorityC
Update Conversation Priority PUT /api/v1/conversations/{uuid}/priority Tags: Conversations
Inputs: uuid (required), priority (required).
update_conversation_statusC
Update Conversation Status PUT /api/v1/conversations/{uuid}/status Tags: Conversations
Inputs: uuid (required), status (required), snoozed_until.
update_conversationtagsB
Update conversation tags POST /api/v1/conversations/{uuid}/tags Tags: Conversations
Inputs: uuid (required), tags.
update_statusC
Update Conversation Status PUT /api/v1/statuses/{id} Tags: Status and priority
Inputs: id (required), name (required).
update_teamC
Update Team PUT /api/v1/teams/{id} Tags: Teams
Inputs: id (required), name, emoji, conversation_assignment_type, +4 more.
update_team_assigneeC
Update Team Assignee PUT /api/v1/conversations/{uuid}/assignee/team Tags: Conversations
Inputs: uuid (required), assignee_id (required).
update_user_assigneeD
Update User Assignee PUT /api/v1/conversations/{uuid}/assignee/user Tags: Conversations
Inputs: uuid (required), assignee_id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 54 tools
Most tools have distinct resource+action patterns, but there are several conversation retrieval tools (e.g., get_all_conversations, get_assigned_conversations) that could cause confusion if descriptions are not carefully read.
Tool names generally follow a consistent verb_noun pattern in snake_case, though 'update_conversationtags' should be 'update_conversation_tags' and 'media_upload' inverts the usual order, creating minor inconsistencies.
With 54 tools, the count is high but understandable for a full helpdesk platform. It borders on heavy, potentially overwhelming an agent, but each tool corresponds to a distinct operation.
The tool set covers CRUD for agents, contacts, conversations, teams, and statuses, along with search, AI, media, and health—leaving no obvious gaps for the stated domain.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that wraps the TeamDynamix (TDX) REST API, enabling AI-assisted IT service management through natural language. It exposes 41 tools for managing tickets, assets, CMDB, knowledge base articles, and other core TDX domains.4185 npm1MIT
- AlicenseAqualityDmaintenanceAn MCP server that exposes the full Gorgias helpdesk API to AI assistants, enabling ticket management, analytics, and customer operations through natural language.10067 npm2MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for an AI IT helpdesk that exposes 29 tools, 10 resources, and 6 prompts for ticket management, knowledge base search, employee lookup, reporting, and Slack notifications, with a multi-agent conversation pipeline.-
- FlicenseNot gradedqualityCmaintenanceMCP server that exposes OpenVisio's team collaboration API as 15 tools for AI agents, enabling them to read team state, communicate, and manage tickets autonomously.-