The Front MCP connector routes your AI agent's tool calls to Front's own MCP server through Scalekit. Each user signs in to Front once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 25 tools.
- Tools
- 25
- What they doRead · write · destructive
- 16 · 8 · 116 read8 write1 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Front MCP connection
In AgentKit > Connections, create a Front MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Front, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'frontmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Front MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'frontmcp_get_my_identity',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "frontmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Front MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="frontmcp_get_my_identity",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolfrontmcp_get_attachmentGet a specific attachment on a message or comment.Read-onlyGet Attachment
Get a specific attachment on a message or comment. Returns attachment metadata (filename, contentType, size) plus a short-lived downloadUrl.
Inputs
attachmentIdstringrequired- Public attachment link ID (fil_xxx), as returned by read_message.
frontmcp_get_my_identityGet the calling agent's own identity: public ID, name, alias, and whether the caller is human.Read-onlyGet My Identity
Get the calling agent's own identity: public ID, name, alias, and whether the caller is human. Takes no arguments.
Inputs
This tool takes no inputs.
frontmcp_list_channelsList channels accessible to the authenticated user.Read-onlyList Channels
List channels accessible to the authenticated user. Filter by name, address, type, or inbox. Use this tool to discover channels before calling tools that require a channel ID.
Inputs
account_statusesstring- Optional filter by channel account status.
inbox_idsstring- Optional filter by inbox IDs. Prefer this instead of putting inbox names in name_query.
limitstring- Maximum number of results (default 25, max 50)
name_querystring- Optional channel display name or address keywords. Use this only for the channel identity itself.
offsetstring- Offset for pagination (default 0). Use with limit to paginate through results.
typesstring- Optional filter by channel type (for example email, chat, sms).
frontmcp_list_draftsList in-flight draft messages authored by the authenticated teammate.Read-onlyList Drafts
List in-flight draft messages authored by the authenticated teammate.
Inputs
limitinteger- Maximum number of drafts to return (default 50, max 200).
frontmcp_list_inboxesList inboxes accessible to the authenticated user.Read-onlyList Inboxes
List inboxes accessible to the authenticated user.
Inputs
access_modestring- Optional filter by inbox access mode.
ai_enabledstring- Optional filter by Front AI status.
business_hours_enabledstring- Optional filter by business hours status.
circle_idsstring- Optional filter by teammate group IDs who have access to the inbox.
global_rules_enabledstring- Optional filter by company rules status.
limitstring- Maximum number of results (default 25, max 50)
name_querystring- Optional inbox name keywords. Use this only for the inbox name itself.
offsetstring- Offset for pagination (default 0). Use with limit to paginate through results.
teammate_idsstring- Optional filter by teammate IDs who have access to the inbox.
ticketing_enabledstring- Optional filter by ticketing status.
frontmcp_list_statusesList the company's ticket statuses.Read-onlyList Statuses
List the company's ticket statuses. Returns an empty list when ticketing is not enabled for the company.
Inputs
limitstring- Maximum number of results (default 50, max 100)
name_querystring- Optional ticket status name keywords. Use this only for the status name itself.
offsetstring- Offset for pagination (default 0). Use with limit to paginate through results.
frontmcp_list_teammatesList teammates in the workspace.Read-onlyList Teammates
List teammates in the workspace.
Inputs
limitstring- Maximum number of results (default 10, max 25)
name_querystring- Name or email keywords to search for (for example "alex" or "alex@"). Use this only for teammate identity, not for workspace, status, or relationship intent.
offsetstring- Offset for pagination (default 0). Use with limit to paginate through results.
statusesstring- Filter by account status. Defaults to active statuses (active, pending, pending_email). Include "blocked" to see deactivated teammates.
frontmcp_list_teamsList teams in the workspace.Read-onlyList Teams
List teams in the workspace.
Inputs
limitstring- Maximum number of results (default 10, max 25)
name_querystring- Optional team name or alias keywords. Use this only for the team name or alias.
offsetstring- Offset for pagination (default 0). Use with limit to paginate through results.
frontmcp_read_accountRead an account (company) record.Read-onlyRead Account
Read an account (company) record.
Inputs
account_idstringrequired- The account to read, identified by its private numeric ID or its public ID (acc_xxx).
frontmcp_read_contactRead a contact record.Read-onlyRead Contact
Read a contact record.
Inputs
contactIdstringrequired- Public contact card ID (crd_xxx).
frontmcp_read_conversationRead a conversation: its header (subject, status, assigneeId, assigneeName, assigneeAlias, inboxes (each with id and name), tagIds, ticketIds, ticketStatus, scheduledReminders, updatedAt) plus a paginated, newest-first timeline of messages, comments, and activity entries under `entries`.Read-onlyRead Conversation
Read a conversation: its header (subject, status, assigneeId, assigneeName, assigneeAlias, inboxes (each with id and name), tagIds, ticketIds, ticketStatus, scheduledReminders, updatedAt) plus a paginated, newest-first timeline of messages, comments, and activity entries under `entries`. Pass `entries.nextCursor` back as `cursor` to fetch older entries, and stop when `entries.hasMore` is false. Active drafts and customFields are included on the first page only (both fields are omitted once a `cursor` is supplied).
Inputs
conversationIdstringrequired- Public conversation ID (cnv_xxx).
cursorstring- Pagination cursor for timeline entries.
limitinteger- Maximum entries to return (default 50, max 200).
frontmcp_read_messageFetch a single message by ID with full content.Read-onlyRead Message
Fetch a single message by ID with full content. Returns the message body (quoted replies stripped for clarity), recipients (from/to/cc/bcc), attachments, author, draft status, and delivery error type if applicable.
Inputs
messageIdstringrequired- The message ID to read (msg_xxx format).
frontmcp_search_accountsSearch accounts (companies) by name.Read-onlySearch Accounts
Search accounts (companies) by name.
Inputs
limitstring- Maximum number of results (default 10, max 25)
name_querystring- Optional account name keywords. Use this only for the account name itself.
offsetstring- Offset for pagination (default 0). Use with limit to paginate through results.
frontmcp_search_contactsSearch contacts by name or email.Read-onlySearch Contacts
Search contacts by name or email.
Inputs
querystringrequired- Search query for contacts (name, email, or handle).
cursorstring- Pagination cursor returned by a previous call.
frontmcp_search_conversationsSearch conversations by query and/or filters.Read-onlySearch Conversations
Search conversations by query and/or filters. Use the `filters` object to narrow by inbox, assignee, team, tags, status, or an absolute date range (after/before). `query` is optional when at least one filter is provided, so filters alone can list an inbox or a teammate's conversations.
Inputs
cursorstring- Pagination cursor returned by a previous call.
filtersobject- Optional filter set to narrow results.
querystring- Full-text search query for conversations. Optional when at least one filter is provided.
scopestring- Restricts which conversations are searched (default "my_conversations"). "my_conversations": conversations assigned to you, in your private inboxes, or in shared inboxes you participate in. "my_workspace": every conversation in your workspace. "all_inboxes": every conversation you can access (broadest). Results echo the scope actually applied as resolvedScope.one of
my_conversationsmy_workspaceall_inboxesdefaultmy_conversations
frontmcp_add_commentAdd an internal comment to a conversation.WriteAdd Comment
Add an internal comment to a conversation.
Inputs
bodystringrequired- Comment body text. Teammate @mentions in the body are resolved automatically.
conversationIdstringrequired- Public conversation ID (cnv_xxx) to comment on.
frontmcp_assign_conversationAssign a conversation to a teammate or team.WriteAssign Conversation
Assign a conversation to a teammate or team.
Inputs
assigneeIdstringrequired- Public teammate ID (tea_xxx) to assign to, or null to unassign.
conversationIdstringrequired- Public conversation ID (cnv_xxx) to assign.
frontmcp_create_draftCreate a draft for an existing conversation or a new outbound conversation.WriteCreate Draft
Create a draft for an existing conversation or a new outbound conversation. Provide conversationId to draft a reply on an existing conversation. Omit conversationId and provide channelId to create a draft for a new outbound conversation; to[] and subject are optional. The body is HTML by default; set bodyFormat to send markdown or plain text instead.
Inputs
bodystringrequired- Draft body. Interpreted per bodyFormat — HTML by default (use <br> or <p> tags for line breaks).
bccarray- BCC recipients for a new outbound conversation (email channels).
bodyFormatstring- How body is interpreted (default html): "html" is used as-is; "markdown" and "plain" are converted to HTML for you ("plain" preserves line breaks and escapes HTML characters).one of
htmlmarkdownplain ccarray- CC recipients for a new outbound conversation (email channels).
channelIdstring- Channel to draft from (cha_xxx). Required for a new conversation (conversationId omitted); optional when replying to an existing conversation, where it overrides the conversation's default channel. If the user has not specified a channel for a new conversation, ask which to send from before choosing; prefer a personal channel. Use list_channels to discover available channels.
conversationIdstring- Public conversation ID (cnv_xxx) to draft a reply for. Omit to create a draft for a new outbound conversation (requires channelId).
inReplyToMessageIdstring- Message ID to draft a reply to; defaults to the latest message.
replyAllboolean- Reply to all original recipients (default true).
sharedboolean- Share the draft with all conversation participants after creation. AI teammates must share drafts — the draft is always shared and passing false is rejected. For human callers it defaults to false (a private draft).
subjectstring- Subject line for a new outbound conversation (email channels). Optional.
toarray- Recipients for a new outbound conversation, as the channel's handle type (email address, phone number, etc.). Optional — the draft can be addressed later.
frontmcp_move_conversationMove a conversation to a different inbox.WriteMove Conversation
Move a conversation to a different inbox. Replaces the conversation's current inbox association with the destination inbox — this is not additive. Provide the destination inbox ID (inb_xxx) from list_inboxes.
Inputs
conversationIdstringrequired- Public conversation ID (cnv_xxx) to move.
inboxIdstringrequired- Destination inbox ID (inb_xxx), as returned by list_inboxes.
frontmcp_send_messageSend a draft message created via create_draft (queues it for delivery).WriteSend Message
Send a draft message created via create_draft (queues it for delivery). Works for both reply drafts and new conversation drafts.
Inputs
draftIdstringrequired- Draft ID to send (msg_xxx), as returned by create_draft. The draft must be in compose state (not scheduled or already being sent), owned by the authenticated teammate, and have at least one recipient.
frontmcp_tag_conversationAdd or remove tags on a conversation.WriteTag Conversation
Add or remove tags on a conversation.
Inputs
conversationIdstringrequired- Public conversation ID (cnv_xxx).
addTagsarray- Tag IDs (tag_xxx) to add.
removeTagsarray- Tag IDs (tag_xxx) to remove.
frontmcp_update_conversation_statusUpdate a conversation's status.WriteUpdate Conversation Status
Update a conversation's status. Provide exactly one of `status`, `statusId`, or `snoozeUntil`. Use `status` ("archived" / "open") to archive or reopen from the requester's point of view, matching the Front "Archive" / "Move to inbox" buttons: if the requester is the conversation's assignee (or it lives in their private inbox), the change is global — everyone with access sees the new status; if the requester is not the assignee on a shared conversation, only their personal view changes. Setting `status: "open"` on a snoozed conversation cancels its reminder. Use `statusId` (a ticket-status, sts_xxx, from list_statuses) to set the ticket status on a ticketing-enabled inbox — this also updates the conversation's open/archived state to match the status category. Setting a ticket status requires ticketing to be enabled. Use `snoozeUntil` (ISO-8601) to snooze the conversation until a given time; all snoozes also auto-cancel when an inbound message arrives.
Inputs
conversationIdstringrequired- Public conversation ID (cnv_xxx).
snoozeUntilstring- ISO-8601 timestamp to snooze the conversation until (e.g. 2024-01-15T09:00:00Z): it archives now and reopens then. A snooze auto-cancels when an inbound message arrives. Provide exactly one of status, statusId, or snoozeUntil.
statusstring- "archived" removes the conversation from the requester's open inbox; "open" returns it. Whether other teammates see the change depends on whether the requester is the assignee — see the tool description. Provide either status or statusId, not both.one of
openarchived statusIdstring- Ticket-status ID (sts_xxx), as returned by list_statuses. Sets the ticket status; the conversation's open/archived state follows the status category. Requires ticketing to be enabled for the company. Provide exactly one of status, statusId, or snoozeUntil.
frontmcp_update_draftUpdate the body, subject, or recipients of an existing draft.WriteUpdate Draft
Update the body, subject, or recipients of an existing draft. Pass the version from read_message for conflict detection — the call fails if the draft changed since you read it. Omitted fields are left unchanged; providing to/cc/bcc replaces that recipient list. Use takeOver:true to claim a draft you do not own.
Inputs
draftIdstringrequired- Public draft message ID (msg_xxx) to update, from list_drafts or read_message.
versionstringrequired- Opaque version token from read_message.draftVersion. Used for conflict detection; the call fails with a conflict error if the draft changed since you read it.
bccarray- Replace the BCC recipients. Omit to leave BCC unchanged; pass [] to clear it.
bodystring- New draft body (interpreted per bodyFormat; HTML by default). Omit to leave the body unchanged.
bodyFormatstring- How body is interpreted (default html): "html" is used as-is; "markdown" and "plain" are converted to HTML.one of
htmlmarkdownplain ccarray- Replace the CC recipients. Omit to leave CC unchanged; pass [] to clear it.
channelIdstring- Override the sending channel (cha_xxx). Omit to keep the draft's current channel.
subjectstring- New subject (email channels). Omit to leave the subject unchanged.
takeOverboolean- If true and you are not the draft owner, claim authorship before editing. Omit (or set false) to enforce owner-only access — the call returns an error if you are not the current owner. No-op if you already own the draft.
toarray- Replace the TO recipients (channel handles). Omit to leave TO unchanged; pass [] to clear it.
frontmcp_delete_draftDiscard an unsent draft owned by the authenticated teammate.DestructiveDelete Draft
Discard an unsent draft owned by the authenticated teammate. Pass the version from read_message for conflict detection — the call fails if the draft changed since you read it. Owner-only: the call returns an error if the draft belongs to another teammate.
Inputs
draftIdstringrequired- Public draft message ID (msg_xxx) to delete, from list_drafts or read_message.
versionstringrequired- Opaque version token from read_message.draftVersion. Used for conflict detection; the call fails with a conflict error if the draft changed since you read it.
No tools match.