Skip to main content
Glama
libredesk-mcp

libredesk-mcp

by metanmai

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_conversations

  • Contacts — get_contacts, get_contact, update_contact, block_contact, get_contact_notes, create_contact_note, delete_contact_note

  • Agents — get_agents, get_agent, get_current_agent, create_agent, update_agent, update_agent_availability, delete_agent, generate_api_key, revoke_api_key

  • Teams — get_teams, get_team, create_team, update_team, delete_team

  • Status & Priority — get_statuses, get_priorities, create_status, update_status, delete_status

  • AI — ai_completion, get_ai_prompts, update_ai_provider

  • Search — search_conversations, search_contacts, search_messages

  • Media — media_upload

  • Health — 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

LIBREDESK_URL

yes

Base URL of your Libredesk instance, no trailing slash. e.g. http://localhost:9000

LIBREDESK_API_KEY

yes

Agent API key from the Libredesk admin UI

LIBREDESK_API_SECRET

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's operationId by stripping the handle prefix, 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 operation summary, description, HTTP method/path, and tags.

  • inputSchema — flattened from path parameters, query parameters, and the request body's JSON schema (with $refs resolved against components.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.js

Refresh the bundled OpenAPI spec:

curl -sL https://docs.libredesk.io/api-reference/openapi.json > src/openapi.json
npm run build

License

MIT

Available Tools

54 tools
ai_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

    C2.7/5.0

    Scored across 54 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count3/5

    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.

    Completeness5/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      An 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.
      41
      85 npm
      1
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      An MCP server that exposes the full Gorgias helpdesk API to AI assistants, enabling ticket management, analytics, and customer operations through natural language.
      100
      67 npm
      2
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      MCP 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.
      -