Skip to main content
Glama
vivernet

Chatwoot MCP Server

by vivernet

Chatwoot MCP Server

Model Context Protocol (MCP) server for Chatwoot API integration. Enables AI assistants to manage customer conversations, messages, and contacts in Chatwoot.

Features

  • Conversations Management: List, filter, and retrieve conversation details

  • Message Operations: Read message history and send new messages

  • Type-Safe: Built with TypeScript using OpenAPI-generated types

  • Flexible Auth: Supports both API token (recommended) and JWT authentication

Related MCP server: @indica-facil/mcp-chatwoot

Tools Provided

Conversations

  • chatwoot_list_conversations - List conversations with filtering (status, assignee, inbox)

  • chatwoot_get_conversation - Get detailed info for a specific conversation

Messages

  • chatwoot_list_messages - List all messages in a conversation

  • chatwoot_create_message - Send a message or create an internal note

Installation

npm install
npm run build

Configuration

The simplest method using your Chatwoot API token (no expiration).

Get your API token:

  1. Log in to your Chatwoot account

  2. Click your avatar → Profile Settings

  3. Scroll to bottom → Copy your "Access Token"

Configure .env:

CHATWOOT_BASE_URL="https://your-chatwoot-instance.com"
CHATWOOT_API_TOKEN="your_api_token_here"

Alternative: JWT Authentication

Use email/password if API tokens don't work on your instance (requires password for token refresh).

CHATWOOT_BASE_URL="https://your-chatwoot-instance.com"
CHATWOOT_EMAIL="your@email.com"
CHATWOOT_PASSWORD="your_password"

Note: JWT tokens expire and require the password for auto-refresh.

Important for Self-Hosted Instances

If using nginx as reverse proxy (e.g., CapRover), add this to nginx config to support API tokens:

server {
    ...
    underscores_in_headers on;  # Required for api_access_token header
    ...
}

Usage

Running the Server

npm start

Development Mode (with auto-reload)

npm run dev

Using with Claude Code

claude mcp add chatwoot \
  -e CHATWOOT_BASE_URL="https://your-instance.com" \
  -e CHATWOOT_API_TOKEN="your_token" \
  -- node /path/to/chatwoot-mcp-server/dist/index.js

Using with Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "chatwoot": {
      "command": "node",
      "args": ["/path/to/chatwoot-mcp-server/dist/index.js"],
      "env": {
        "CHATWOOT_BASE_URL": "https://your-chatwoot-instance.com",
        "CHATWOOT_API_TOKEN": "your_api_token"
      }
    }
  }
}

Example Queries

Once connected, you can ask Claude things like:

  • "Show me all open conversations in account 3"

  • "What are the details of conversation #123?"

  • "List all messages in conversation #456"

  • "Send a reply to conversation #789 saying 'Thank you for contacting us!'"

  • "Add an internal note to conversation #101 about the customer's issue"

Testing

Run integration tests:

npm test

Watch mode:

npm run test:watch

Project Structure

chatwoot-mcp-server/
├── src/
│   ├── index.ts                  # Main server entry point
│   ├── constants.ts              # Shared constants
│   ├── chatwoot-types.ts         # Generated OpenAPI types
│   ├── services/
│   │   ├── chatwoot-client.ts    # API client with auth
│   │   ├── chatwoot-auth.ts      # JWT authentication
│   │   ├── token-cache.ts        # JWT token caching
│   │   └── error-handler.ts      # Error handling utilities
│   ├── schemas/
│   │   └── common.ts             # Shared Zod schemas
│   └── tools/
│       ├── conversations.ts      # Conversation tools
│       └── messages.ts           # Message tools
├── test/                         # Integration tests
├── swagger.json                  # Chatwoot OpenAPI spec
└── package.json

Development

Regenerating Types

If the Chatwoot API changes, regenerate types:

npm run generate-types

Adding New Tools

  1. Create a new file in src/tools/

  2. Define Zod schemas for input validation

  3. Implement the tool function

  4. Register the tool in src/index.ts

Building

npm run build

Builds TypeScript to JavaScript in the dist/ directory.

Troubleshooting

API Token Returns 401

If using a self-hosted instance with nginx, ensure underscores_in_headers on; is set in your nginx config. This is required because api_access_token contains underscores.

JWT Tokens Expire

If using JWT authentication, tokens expire (typically after 2 weeks). Keep CHATWOOT_PASSWORD in .env for automatic refresh, or switch to API token authentication.

Tech Stack

  • TypeScript - Type-safe development

  • openapi-fetch - Type-safe API client

  • openapi-typescript - Generate types from OpenAPI spec

  • Zod - Runtime input validation

  • @modelcontextprotocol/sdk - MCP server framework

  • Vitest - Testing framework

License

MIT

Contributing

Contributions are welcome! Additional tools that could be added:

  • Contact management (create, update, search)

  • Team and agent operations

  • Inbox configuration

  • Labels and custom attributes

  • Reports and analytics

  • Bulk operations


Fork: local build for github.com/vivernet/chatwoot-mcp

This copy is a fork of chatwoot-mcp-server@1.0.0 (see UPSTREAM.md), run from source instead of via npx, with one added tool.

Changes in this fork

  • New tool chatwoot_toggle_status — changes a conversation status (open / resolved / pending / snoozed), including optional snoozed_until (Unix timestamp in seconds) for scheduled snooze. Implemented in dist/tools/conversations.js + registered in dist/index.js; uses the stock Chatwoot POST /api/v1/accounts/{account_id}/conversations/{conversation_id}/toggle_status endpoint (already present in the generated OpenAPI types).

  • Version bumped to 1.1.0; start script runs node dist/index.js.

Running locally (no npx)

node dist/index.js

Needs the same env vars as upstream: CHATWOOT_BASE_URL plus either CHATWOOT_API_TOKEN or CHATWOOT_EMAIL/CHATWOOT_PASSWORD.

Smoke test

python3 tests/mcp_smoke.py        # stub HTTP backend, no real Chatwoot needed

Hermes Agent wiring

Hermes config.yaml → mcp_servers.chatwoot:

mcp_servers:
  chatwoot:
    command: node
    args: ["/absolute/path/to/chatwoot-mcp-server/dist/index.js"]
    env:
      CHATWOOT_BASE_URL: ${env:CHATWOOT_BASE_URL}
      CHATWOOT_EMAIL: ${env:CHATWOOT_EMAIL}
      CHATWOOT_PASSWORD: ${env:CHATWOOT_PASSWORD}

Companion approval plugin (guards chatwoot_create_message and chatwoot_toggle_status behind the human-approval gate): see the chatwoot-approval Hermes plugin.

Available Tools

5 tools
chatwoot_create_messageCreate Message in ConversationA

Create a new message in a Chatwoot conversation.

This tool sends a message in an existing conversation. Can be used for outgoing messages to customers or private internal notes.

Args:

  • account_id (number): The numeric ID of the Chatwoot account (required)

  • conversation_id (number): The ID of the conversation (required)

  • content (string): The message content (required)

  • message_type (string): Type of message - "outgoing" or "incoming" (default: "outgoing")

  • private (boolean): Whether this is a private internal note (default: false)

Returns: Created message details including ID and confirmation

Examples:

  • Send a reply: { account_id: 1, conversation_id: 123, content: "Thank you for contacting us!" }

  • Add internal note: { account_id: 1, conversation_id: 123, content: "Customer called for follow-up", private: true }

NameRequiredDescriptionDefault
contentYesThe message content
privateNoWhether the message is private (internal note)
account_idYesThe numeric ID of the account
message_typeNoThe type of messageoutgoing
conversation_idYesThe ID of the conversation

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true. The description adds that messages reach customers externally or stay as internal notes, which is real behavioral context, but it never warns that retries may duplicate messages (non-idempotent) and does not disclose permission requirements or whether a sent message can later be edited or deleted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and the Args/Returns/Examples structure is easy to scan. There is some redundancy since the Args block repeats schema descriptions verbatim, costing lines without adding information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description helpfully includes a Returns line covering the created message ID and confirmation, and it covers every input with examples. Remaining gaps are edge behavior: error cases (e.g., nonexistent conversation_id) and whether the account/conversation must be accessible to the caller's token.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented in the schema, including the message_type enum and the private flag. The description's Args block largely restates those same definitions; the only added value is the paired worked examples, which is baseline-level supplementation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create a new message in a Chatwoot conversation") plus the key subtype distinction (outgoing customer message vs. private internal note). This clearly separates it from the read-oriented siblings such as chatwoot_list_messages and chatwoot_get_conversation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"This tool sends a message in an existing conversation" establishes the precondition and the two usage modes, and the two examples make the outgoing-vs-private-note choice concrete. It never states when not to use it (e.g., use chatwoot_list_messages to read existing messages instead), so it falls short of explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chatwoot_get_conversationGet Chatwoot Conversation DetailsA
Read-onlyIdempotent

Get detailed information about a specific Chatwoot conversation.

This tool retrieves full details for a single conversation including contact info, assignee, labels, and custom attributes.

Args:

  • account_id (number): The numeric ID of the Chatwoot account (required)

  • conversation_id (number): The ID of the conversation to retrieve (required)

  • response_format (string): Output format - "markdown" or "json" (default: "markdown")

Returns: Full conversation details including:

  • Status, inbox, and metadata

  • Complete contact information

  • Assignee details

  • Labels and custom attributes

  • Message statistics

Examples:

  • Get conversation details: { account_id: 1, conversation_id: 123 }

NameRequiredDescriptionDefault
account_idYesThe numeric ID of the account
conversation_idYesThe ID of the conversation
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, and openWorld, so the safety profile is handled. The description adds genuine context beyond that by enumerating what the response contains (contact info, assignee, labels, custom attributes, message statistics), which helps the agent decide whether one call suffices.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by sharply organized sections. There is mild redundancy in restating Args and Returns that the schema and annotations partly cover, but nothing is padded with filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, describing the returned fields is the right use of space, and the description does that. It stops short of covering error behavior or what happens for a nonexistent conversation ID, but otherwise an agent has what it needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented in the schema, including the response_format enum. The Args block restates them without adding format, constraint, or failure-mode detail, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about a specific Chatwoot conversation') and implicitly contrasts with chatwoot_list_conversations by scoping to a single conversation with full details. An agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'a specific conversation' implies when to use it versus the list sibling, but there is no explicit when-to-use/when-not guidance, no prerequisites, and no named alternatives such as chatwoot_list_messages for message data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chatwoot_list_conversationsList Chatwoot ConversationsA
Read-onlyIdempotent

List conversations from a Chatwoot account with filtering options.

This tool retrieves conversations from Chatwoot, allowing you to filter by status, assignee, and inbox. Supports pagination for large result sets.

Args:

  • account_id (number): The numeric ID of the Chatwoot account (required)

  • page (number): Page number for pagination, starts at 1 (default: 1)

  • status (string): Filter by conversation status - "open", "resolved", "pending", "snoozed", or "all" (default: "open")

  • assignee_type (string): Filter by assignee - "me", "unassigned", or "all" (optional)

  • inbox_id (number): Filter by specific inbox ID (optional)

  • response_format (string): Output format - "markdown" or "json" (default: "markdown")

Returns: A list of conversations with details including:

  • Conversation ID, status, and inbox

  • Contact information (name, email)

  • Assignee details

  • Message count and unread count

  • Last activity timestamp

Examples:

  • List all open conversations: { account_id: 1, status: "open" }

  • List unassigned conversations: { account_id: 1, assignee_type: "unassigned" }

  • List conversations in specific inbox: { account_id: 1, inbox_id: 5 }

NameRequiredDescriptionDefault
pageNoPage number for pagination (starts at 1)
statusNoFilter conversations by statusopen
inbox_idNoFilter conversations by inbox ID
account_idYesThe numeric ID of the account
assignee_typeNoFilter by assignee type
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive and open-world. The description adds genuinely useful behavioral detail beyond that: the default status filter is 'open' (easy to miss and materially affects results), pagination is supported, and the returned fields are enumerated. It does not mention page size or total-count behavior, which keeps it at 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then Args/Returns/Examples in a predictable structure. The Args section duplicates every field already fully described in the schema, which is avoidable bloat, but the Returns and Examples sections earn their space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description steps in with a useful summary of returned fields (ID, status, inbox, contact, assignee, counts, timestamp). Pagination metadata and page size are the remaining unknowns, but nothing an agent needs to call it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with enums on status, assignee_type and response_format, so the schema already carries all parameter semantics. The Args block largely restates the schema, adding only example value combinations, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List conversations from a Chatwoot account') with the scope of filtering options. It is clearly distinguishable from siblings like chatwoot_get_conversation and chatwoot_list_messages by resource, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The filtering narrative plus three concrete examples ('List unassigned conversations', 'List conversations in specific inbox') give clear context for when to use it. No explicit when-not-to-use guidance or contrast with chatwoot_get_conversation, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chatwoot_list_messagesList Messages in ConversationA
Read-onlyIdempotent

List all messages in a Chatwoot conversation.

This tool retrieves all messages from a specific conversation, including message content, sender information, timestamps, and attachments.

Args:

  • account_id (number): The numeric ID of the Chatwoot account (required)

  • conversation_id (number): The ID of the conversation (required)

  • response_format (string): Output format - "markdown" or "json" (default: "markdown")

Returns: List of messages with:

  • Message ID and content

  • Message type (incoming/outgoing)

  • Sender information (name, type)

  • Timestamp

  • Attachment information

  • Private flag (for internal notes)

Examples:

  • List all messages: { account_id: 1, conversation_id: 123 }

NameRequiredDescriptionDefault
account_idYesThe numeric ID of the account
conversation_idYesThe ID of the conversation
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context by listing the returned message fields, including sender information, attachments, timestamps, and private-note flags, though it does not discuss pagination or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with Args, Returns, and Examples sections, and the main purpose is front-loaded. However, the Args section largely duplicates the fully documented schema, and the Returns section is somewhat verbose for a simple read operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with complete schema coverage and annotations, the description gives sufficient context about inputs and returned fields. The absence of pagination or volume-limit details is a minor gap, but it is otherwise complete enough for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented in the schema. The description repeats the arguments and clarifies the response_format options, but adds little meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: "List all messages in a Chatwoot conversation." It clearly distinguishes this from message creation and conversation-level retrieval by focusing on messages within a specific conversation, though it does not explicitly name sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied by "retrieves all messages from a specific conversation" and an example is provided. However, there is no explicit guidance on when to use this instead of sibling tools such as chatwoot_get_conversation or chatwoot_create_message, and no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chatwoot_toggle_statusChange Conversation StatusA
Destructive

Change the status of a Chatwoot conversation (open/resolved/pending/snoozed).

This tool updates the conversation status. Use "snoozed" together with snoozed_until to schedule a reopen.

Args:

  • account_id (number): The numeric ID of the Chatwoot account (required)

  • conversation_id (number): The ID of the conversation (required)

  • status (string): Target status: open, resolved, pending or snoozed (required)

  • snoozed_until (number): Optional Unix timestamp (seconds) when a snoozed conversation reopens

NameRequiredDescriptionDefault
statusYesTarget conversation status: open, resolved, pending or snoozed
account_idYesThe numeric ID of the account
snoozed_untilNoWhen status is snoozed, Unix timestamp (seconds) to reopen the conversation; omit to snooze until the next customer reply
conversation_idYesThe ID of the conversation

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is carried by structured data. The description adds the snoozed/snoozed_until interaction, but says nothing about what the destructive behavior actually entails — whether resolving notifies the customer, whether the change is reversible, or what is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded correctly in one sentence. But the second sentence ('This tool updates the conversation status') is pure restatement, and the Args section duplicates a schema that is already fully documented, so a meaningful share of the text does not earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent mutation with no output schema, an agent still lacks the side effects of each status transition and the shape of the response. Parameter coverage is complete, so this is adequate but with a clear gap around mutation consequences.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The Args block largely restates the schema; notably it omits the schema's useful nuance that snoozing without snoozed_until lasts until the next customer reply, so it adds no meaning beyond the schema and slightly loses some.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Change the status of a Chatwoot conversation') and enumerates the four target statuses. The mutation framing makes it trivially distinguishable from the list/get/create-message siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is the pairing rule 'use snoozed together with snoozed_until to schedule a reopen', which is genuinely useful. There is no when-to-use vs. alternatives, no prerequisite/permission context, and no statement of when not to use it (e.g., vs. merely reading or replying to a conversation).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv1.1.0
    • First observedchatwoot_create_message
    • First observedchatwoot_get_conversation
    • First observedchatwoot_list_conversations
    • First observedchatwoot_list_messages
    • First observedchatwoot_toggle_status

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: listing conversations, getting one conversation, changing status, listing messages, and creating a message. The list/get and message read/write pairs are cleanly separated by scope and action.

Naming Consistency5/5

All tools use the same chatwoot_ prefix and snake_case verb_noun pattern. The convention is predictable throughout, with only minor semantic looseness in 'toggle_status' since it sets rather than toggles.

Tool Count5/5

Five tools is a compact, well-scoped set for conversation-centric Chatwoot workflows. Each tool earns its place without redundancy or excessive surface area.

Completeness3/5

The core conversation read/reply/status workflow is covered, but notable Chatwoot operations are absent: creating conversations, assigning agents, managing labels, and listing contacts or inboxes. These gaps will limit common support workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Exposes the full Chatwoot API as 129 tools for AI assistants, enabling account, contact, conversation, message, inbox, team, report, help center, automation, and custom attribute management, plus exclusive Kanban and scheduled message features.
    5 npm
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Provides AI assistants with read-only access to Chatwoot analytics and operational data, including conversations, agents, inboxes, teams, CSAT, and real-time metrics.
    30
    1
    MIT