FirstReply MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | HTTP port (HTTP mode). | 8080 |
| MCP_ENDPOINT_PATH | No | HTTP endpoint path. | / |
| FIRSTREPLY_API_URL | No | API base URL. | https://api.firstreply.ai |
| FIRSTREPLY_API_TOKEN | Yes | Organization API key (fr_...) used to authenticate against the FirstReply REST API. Sent as Authorization: Bearer. Created in FirstReply under Organization → Development → API Keys. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| organization_listA | List the organizations the authenticated account can access, including ids, names and plans. Use the organizationId in all other tools. |
| organization_getB | Get an organization: name, default language, description, plan, auto-close setting and the custom AI prompts (persona, reply instructions, classification instructions). |
| organization_updateA | Update the settings of an organization. Only provide fields to change. Requires organization admin permission. |
| organization_usageB | Plan and usage of an organization: plan name, trial / active / cancelled state, inbox and member counts against the plan limits. |
| member_listB | List the members of an organization with their profile and permission level. Use member ids to assign conversations. |
| member_getB | Get one organization member by id. |
| member_createA | Add a member to an organization by email address. Requires organization admin permission. |
| member_updateA | Change the permission level of an organization member. Requires organization admin permission. |
| member_deleteA | Remove a member from an organization. Their assigned conversations stay in the organization. Requires organization admin permission. |
| api_key_listA | List the named API keys of an organization (name, masked prefix, created, last used, expiry). Never returns the key values. Requires organization admin permission. |
| api_key_createA | Create a new named API key for an organization. The response contains the plaintext key exactly once: relay it to the user immediately and treat it as a secret; it cannot be retrieved later. Requires organization admin permission. |
| api_key_deleteA | Delete (revoke) an API key of an organization. Integrations using the key stop working immediately, including this MCP server if the key it authenticates with is deleted. Requires organization admin permission. |
| inbox_listA | List the support inboxes of an organization: email, WhatsApp, Messenger, Instagram, LinkedIn, Google Play, App Store and website chat, with their type, name and health. |
| inbox_getB | Get one inbox by id: type, name, connected account or mail server, signature, health and activation state. |
| inbox_statisticsB | Statistics per inbox of an organization (conversation volumes). |
| inbox_refreshA | Fetch new messages from an inbox now instead of waiting for the next scheduled retrieval. |
| inbox_testA | Test the connection of an inbox to its platform (mail server, Meta, Google, Apple, ...) and report the result. |
| conversation_listA | List customer conversations of an organization, highest priority and most recent activity first (by relevance when searching). All filters are optional and combine. Each result carries the subject, status, priority, classification, assignee, contact, language and the last message. |
| conversation_getA | Get a customer conversation by id: subject, status, priority, classification (with the AI's reason and confidence), assignment, contact, language and last message. |
| conversation_threadA | Get a conversation together with all of its messages in one call. Prefer this over conversation_get + conversation_messages when the full history is needed. |
| conversation_messagesA | List the messages of a conversation, newest first. Each message carries sender, recipients, plain text, detected language, a translation into the team's language when they differ, and draft / internal note flags. |
| conversation_replyA | Send a reply to the customer in a conversation, delivered through the conversation's inbox (email, WhatsApp, ...). Sending is irreversible: only call it with a text the user has approved. Set internal=true to add an internal note visible to the team only, or draft=true to store a draft the team can review and send with message_send. |
| conversation_closeC | Close a customer conversation. |
| conversation_readB | Mark an unread conversation as read. |
| conversation_spamA | Mark a conversation as spam, or undo that with spam=false. |
| conversation_updateB | Update a customer conversation: assign it to a member, change priority, status, classification, subject, language, contact or spam flag. Only provide fields to change. |
| conversation_deleteB | Delete a conversation and all of its messages permanently. |
| conversation_statsB | Daily counts of opened and closed conversations of an organization for a date range. |
| conversation_stats_by_memberB | Conversation statistics per organization member for a date range: who handled how many conversations. |
| conversation_metricsB | Support metrics of an organization for a date range: totals and closing rate, first reply times (median, p90, average), AI reply share, sentiment share, closing rate over time, close reasons and closes per member. |
| conversation_totalsC | Current conversation totals of an organization (e.g. open and unread counts). |
| message_getA | Get one message by id: sender, recipients, subject, plain text, detected language, translation, attachments and the draft / internal note flags. |
| message_updateA | Edit a draft or an internal note before it is sent: replace its text, subject, language or translation. Only provide fields to change. Sent messages cannot be edited. |
| message_sendA | Send a draft message to the customer through the conversation's inbox. Irreversible: only call it after the user approved the draft (read it with message_get first). |
| message_deleteB | Delete a message permanently, e.g. a draft or an internal note. |
| contact_listA | List or search the contacts (customers) of an organization: name, email, phone, messaging ids, custom fields and conversation count. |
| contact_getA | Get one contact by id, including custom field values and the number of conversations. |
| contact_createA | Create a contact. Provide at least a name or an email address. |
| contact_updateB | Update a contact. Only provide fields to change. |
| contact_deleteB | Delete a contact permanently. |
| contact_field_listA | List the custom contact fields defined in an organization (key, name, type: 0 = text, 1 = link, 2 = button). Use the keys with contact_create and contact_update. |
| classification_listB | List the classifications of an organization with their automation settings (AI reply, draft, auto close, default assignee, prompt, template). |
| classification_getB | Get one classification by id. |
| classification_createC | Create a classification. |
| classification_updateB | Update a classification. Only provide fields to change. |
| classification_deleteA | Delete a classification. Conversations that use it are moved to reassignTo or left unclassified. Use classification_impact first to see how many conversations and knowledge entries are affected. |
| classification_impactA | Preview what deleting a classification would affect (conversations, knowledge entries). |
| classification_statisticsB | How many conversations fall into each classification of an organization. |
| knowledge_searchA | Search the knowledge base of an organization (full text: words are AND-ed and prefix matched, "quoted phrases", -word to exclude). Omit search to browse all entries. Entries are question / answer pairs (prompt / completion); synced articles are split into chunks that share a source. |
| knowledge_getC | Get one knowledge entry by id. |
| knowledge_createB | Add a knowledge entry the AI can use for replies: a question or topic and its answer. |
| knowledge_updateA | Update a knowledge entry. Only provide fields to change. |
| knowledge_deleteB | Delete a knowledge entry permanently. |
| knowledge_source_listA | List the knowledge sources of an organization (websites, GitHub, Notion, GitBook, ...) with their sync state, last sync time, last error and number of synced entries. |
| knowledge_source_getC | Get one knowledge source by id. |
| knowledge_source_syncA | Start a sync of a knowledge source now. Runs in the background; check knowledge_source_status for the result. |
| knowledge_source_statusB | Sync status of a knowledge source: state (PENDING, SYNCING, SUCCESS, ERROR), last sync time, last error, entry count. |
| ai_draft_replyA | Generate an AI reply draft for a conversation using the organization's configured prompts and knowledge base. Returns the draft without sending it. |
| ai_promptA | Run a free-form prompt through the organization's AI: it answers with the organization's persona and response rules and, unless disabled, the knowledge base entries matching the prompt. Use it to draft texts or answer questions from the knowledge base. Include any conversation context in the prompt itself. |
| ai_translateA | Translate a text into a language, e.g. a reply into the customer's language before conversation_reply. The language of the text is detected first: when it already is the target language the text comes back untouched with translated=false. An empty translation means the translation failed. |
| ai_testA | Simulate an incoming customer message: returns the classification the AI would assign, whether it would be spam, and the reply it would give, without creating a conversation. Useful to check classifications, prompts and knowledge. |
| searchA | Search conversations, contacts, knowledge entries and messages of an organization in one call. Returns the top matches per type with the total count per type. Words are AND-ed and prefix matched. Use "quoted phrases", -word to exclude, and the operators from:, subject:, is:<open|closed|unread|read|assigned|unassigned|ai>, has:<attachment|draft>, before:, after:. |
| template_listB | List or search the reply templates of an organization. A template can have language variants that reference it as parent. |
| template_getA | Get one reply template by id, with its plain text and HTML. |
| template_createC | Create a reply template. |
| template_updateA | Update a reply template. Only provide fields to change. |
| template_deleteB | Delete a reply template permanently. |
| prompt_listA | List or search the saved AI prompts of an organization. Classifications reference a prompt for their AI replies, and ai_prompt can apply one. |
| prompt_getB | Get one saved prompt by id. |
| prompt_createC | Create a saved AI prompt. |
| prompt_updateB | Update a saved prompt. Only provide fields to change. |
| prompt_deleteC | Delete a saved prompt permanently. |
| webhook_listB | List the webhooks of an organization: target URL and subscribed events. |
| webhook_getC | Get one webhook by id. |
| webhook_createA | Create a webhook that POSTs the given events to a URL. Deliveries are signed with a secret: call webhook_rotate_secret to obtain one. |
| webhook_updateA | Update the target URL or events of a webhook. Only provide fields to change. |
| webhook_deleteB | Delete a webhook. The target stops receiving events immediately. |
| webhook_testA | Send a test event to a webhook and report the delivery result (status code, response). |
| webhook_rotate_secretA | Generate a new signing secret for a webhook. The response contains the secret exactly once; the previous secret stops validating immediately. |
| filter_listA | List the saved conversation filters of the authenticated user in an organization, with their criteria and conversation counts. |
| filter_getB | Get one saved conversation filter by id. |
| filter_createB | Save a conversation filter (a named view in the inbox). All criteria are optional and combine. |
| filter_updateA | Update a saved conversation filter. Only provide fields to change; criteria not given keep their value. |
| filter_deleteB | Delete a saved conversation filter. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 84 tools
Tools generally target distinct resource-action pairs, and descriptions clarify overlaps like conversation_reply vs message_send. However, some pairs (conversation_thread vs conversation_get + conversation_messages, search vs knowledge_search) could cause hesitation. Overall mostly distinct.
All tool names follow a consistent snake_case resource_action pattern (e.g., conversation_list, webhook_create, knowledge_source_sync). There are no mixed conventions, making the set predictable and easy to navigate.
84 tools is an extreme mismatch for an MCP server, as the sheer volume will overwhelm an agent's context and decision-making. According to the calibration, 50+ tools merits the lowest score despite the platform's breadth.
Core workflows for conversations, contacts, classifications, templates, prompts, and webhooks have full CRUD. However, key lifecycle operations are missing for inboxes (no create/update/delete) and knowledge sources (no create/update/delete), creating notable dead ends for administrative tasks.