Appearance
Custom MCP
A Custom MCP server gives your sales assistant extra tools, which it calls during a conversation, for example to look up an order in your own system. The same server can also receive automations: calls the platform makes by itself, with no AI involved, such as sending each finished conversation to your CRM or telling it when a client writes to a manager.
At a glance
| Question | Answer |
|---|---|
| What you enter | MCP Name, MCP URL, and optional Custom Headers (usually authentication); a server that asks for a sign-in shows a Sign in with … button instead |
| What the assistant gets | The tools you tick and save under Custom MCP Tools |
| What the platform sends by itself | Send conversations to MCP (finished conversations) and Notify MCP when a client writes to a manager (client messages while a manager has the chat) |
| Who can change the automations | Any user of the account |
| Where it lives | Integrations → pick the agent → MCP Providers → Custom MCP (app.mychatbot.app/integration) |
Connect a server
Open Integrations (app.mychatbot.app/integration) and pick the agent in the agent dropdown in the header.
Under the MCP Providers category, select the Custom MCP card ("Connect custom MCP servers").
Fill in the form:
Field What to enter MCP Name Any name you will recognise, for example the system behind the server MCP URL The server's MCP endpoint, for example https://mcp.example.com/mcpCustom Headers Click Add Header for each header the server needs, typically an API key or AuthorizationheaderClick Save Changes. You'll see "Custom MCP connected successfully!". If the form asks you to sign in instead, see Servers that ask you to sign in.
The server is linked to the agent that was selected in the dropdown at that moment. To use it with another agent, switch the dropdown and connect it there too.
You can connect several servers to one agent. Each shows as a pill tab at the top of the panel, followed by + Add Custom MCP to add another.
Change a connected server's headers
A server's tab shows its MCP Name, MCP URL and the Custom Headers it sends: "Saved values stay hidden. Type over one to replace it, or remove the row to stop sending it." Change, add or remove headers, for example when a key is rotated, and click Save headers. The new headers are tried on the server first and saved only if it accepts them: "Headers saved. Tools available: N". If the server refuses them, its reason is shown and nothing changes. Your ticked tools and the automations below stay as they were.
Servers that ask you to sign in
Some services host their MCP server behind a sign-in with your account at that service instead of an API key, for example Calendly at https://mcp.calendly.com. Headers can't connect these servers.
- Fill in MCP Name and MCP URL as above and click Save Changes. Use a name no other server on this account has. The platform always tries your headers first; a server that accepts them connects as usual.
- If the server asks for a sign-in instead, the form says "This server asks you to sign in to calendly.com instead of using headers." Click Sign in with calendly.com.
- A window opens on the service's own sign-in page. Sign in there and allow access. The window closes by itself and you'll see "Custom MCP connected successfully!". Until then the form says "Finish signing in in the window that opened." If you change your mind, click Cancel sign-in.
- All the server's tools are now ticked under Custom MCP Tools, and the assistant can use them straight away. Untick the ones it should not use and click Save Changes.
If your browser blocks the window, the sign-in opens in this tab instead. Once you've signed in, it brings you back to Integrations by itself; if it fails, the page says "Sign-in didn't finish: …" and has a Back to Integrations button.
Untick the tools customers should not trigger
Signing in gives the assistant the access that service grants, and some services grant more than reading. Calendly's sign-in covers both reading and changing scheduling data, so a customer-facing assistant could cancel events or change availability while those tools are ticked.
The top of the server's tab then shows "Signed in to calendly.com." You can still add custom headers to a server you signed in to; they are sent along with the sign-in, except an Authorization header, which the sign-in replaces.
To use the same server with another agent, switch the agent dropdown, enter exactly the same name and URL, click Save Changes, then Sign in with calendly.com. It is added to that agent straight away, without signing in again; a window may flash open and close. It is the same server on both agents: the tools you tick, its headers and its sign-in apply to every agent it is connected to, so changing them on one agent changes them on all of them.
Reconnect
A sign-in can stop working, for example when you remove MyChatBot's access in your account settings at the service. The server's tab then says "The sign-in to calendly.com has expired. Reconnect to keep using this server's tools." and the assistant can't use its tools until you sign in again.
- Click Reconnect at the top of the server's tab.
- Complete the sign-in in the window that opens (or in this tab, if your browser blocks the window). While it is open, Cancel sign-in stops waiting for it.
You'll see "Reconnected to calendly.com". Your ticked tools and the automations below stay as they were. Sign in again does the same while the sign-in still works. Whichever account you sign in with is the one every agent using this server works with.
Choose the tools
Once connected, the server's tools are listed under Custom MCP Tools.
- Tick the tools you want to use.
- Click Save Changes. You'll see "Tools saved". If nothing is ticked, you'll see "Pick at least one tool" instead.
The counter next to the title reads "{{count}} tools enabled". Only tools that are ticked and saved exist for the assistant, and only those can be picked for the automations below.
Automations for this agent
"The platform calls these tools on your MCP server by itself, without the AI agent. Most agents don't need them."
The Automations for this agent block appears below the server tabs, but only when the agent has at least one Custom MCP linked. It belongs to the agent, not to one server: its tool dropdowns list the ticked tools from all servers linked to the agent, shown as tool — server. If two servers expose a tool with the same name, it is listed once.
Each automation is a bordered card, collapsed by default. Its header shows the title, what the automation does, when to use it, a Read the guide link to its section of this page, and the on/off switch. The switch works while the card is collapsed. Click the header to show the settings. The block's own Read the guide link opens this section.
Most agents need neither automation. The tools you tick above already let the assistant call your server during a chat. Leave both switches off unless your own system has to receive something while the assistant is not answering, as described for each automation below.
Any user of the account can change these settings.
Moved from Agent configuration
These settings used to be in Agent configuration → Toolkit and are now here. Settings you saved there carried over unchanged.
Send conversations to MCP
"When a conversation goes quiet, the platform sends it (transcript and client details) to a tool on your MCP server, e.g. to log it in your CRM."
After a conversation goes quiet, the platform sends it to the tool you choose, one call per conversation. A typical use is a CRM that stores every conversation as an activity.
When to use it. The card says: "Use it if your own system must keep every conversation. Don't turn it on if you only want the AI agent to call tools during the chat."
- Use it when your CRM or helpdesk must keep a record of each conversation, including the ones a manager answered without the assistant, and your MCP server has a tool that stores one.
- Don't use it when you only want the assistant to look things up or create records during the chat. Ticking the tools under Custom MCP Tools is enough for that.
- Don't use it when your server has no tool meant to receive a whole conversation. The platform would call whichever tool you pick with every finished conversation.
Set it up.
- Click the card's header. It opens with Tool, Advanced and Save. If no tool of this agent's MCP servers is ticked, it shows "Connect an MCP server to this agent to send conversations to it." instead.
- Pick the tool in Tool. There is no default tool: the dropdown starts at "Select a tool".
- Click Save, then turn the switch on. Saving or turning the switch on without a tool shows "Select a tool first".
Everything else has a working default and sits under Advanced. A configuration saved before you could choose the tool, with no tool stored, keeps sending to a tool named send_session.
What a conversation is. A chat is split wherever it was silent for at least Conversation ends after silence (minutes) (under Advanced). The default is 60 minutes and the minimum is 5. Leave the field empty to use the default. A conversation is sent about one minute after its silence period ends; the check runs every minute.
Which conversations are sent. Send conversations answered by (under Advanced) has three options:
| Option | Conversations sent |
|---|---|
| AI agent only | Only the AI agent answered the client |
| Live manager only | Only a live manager answered the client |
| AI agent and live manager | Both answered, typically an escalation |
A new configuration starts with all three ticked. If none is saved, for example in an older configuration or when you untick all three, only Live manager only and AI agent and live manager are sent, and the form shows those two ticked. Conversations where nobody answered the client are never sent. Spam chats are skipped.
No history replay. Turning the switch on does not send old conversations. Only conversations after the first time it was turned on are sent.
What is in the transcript. {{conversation.transcript}} holds one line per message, in the form Name: "text":
text
Olena Kovalenko: "Good afternoon"
AI agent: "Good afternoon! How can I help?"
Ivan: "I'll take it from here"- The client is shown by name, otherwise as "Client".
- The AI is shown as the value of Agent name in the transcript (default "AI agent").
- A manager is shown by name, otherwise as "Live agent".
- Messages with only media appear as
[attachment]. - Service events and deleted messages are left out.
- Very long conversations keep the newest messages and start with a line such as
[12 earlier messages omitted].
Placeholders. These are the values you can use in tool arguments. In the app, hover a placeholder to see a short description of it.
| Placeholder | Description |
|---|---|
conversation.id | Conversation id, stable per conversation: <chat id>-<unix start>. A receiver can upsert on it. |
conversation.start | First message of the conversation, RFC3339 UTC |
conversation.end | Last message of the conversation, RFC3339 UTC |
conversation.answered_by | Who answered: 1 AI agent, 2 manager, 3 both (renamed by Values sent for 'answered by') |
conversation.manager_names | Managers who answered, comma-separated |
conversation.transcript | The conversation, one signed message per line |
conversation.message_count | Number of messages in the conversation |
client.first_name | Client first name |
client.last_name | Client last name |
client.full_name | Client full name |
client.email | Client email |
client.phone | Client phone |
chat.id | Chat id |
chat.channel | Channel the chat is on (telegram, instagram, ...) |
account.id | Account id |
agent.id | Agent id |
Older placeholder names. Templates saved with the earlier {{session.*}} names keep working and send the same values, but the app no longer lists those names. Use the new ones in new templates:
| Earlier name | Same value as |
|---|---|
session.id | conversation.id |
session.start | conversation.start |
session.end | conversation.end |
session.mode | conversation.answered_by |
session.live_agent_name | conversation.manager_names |
session.transcript | conversation.transcript |
session.message_count | conversation.message_count |
Automatic values by field name. A tool field you leave empty is filled automatically when its name is one of these:
| Tool field name | Value |
|---|---|
conversation_id, session_id, sessionid | conversation.id |
conversation_start, session_start, sessionstart | conversation.start |
conversation_end, session_end, sessionend | conversation.end |
answered_by, session_mode, sessionmode | conversation.answered_by |
manager_names, live_agent_name, liveagentname | conversation.manager_names |
transcript | conversation.transcript |
first_name, firstname | client.first_name |
last_name, lastname | client.last_name |
email, emailaddress1 | client.email |
phone, phone_number, telephone1 | client.phone |
Advanced. Click Advanced under the tool for:
| Setting | What it does |
|---|---|
| Conversation ends after silence (minutes) | How long a chat must be silent before the conversation counts as finished. See What a conversation is. |
| Send conversations answered by | Which conversations are sent. See the options above. |
| Tool arguments | Which value goes into each field of the tool. Shown once a tool is picked. See Tool arguments. |
| Agent name in the transcript | How AI messages are signed in the transcript. Default "AI agent". |
| Values sent for 'answered by' | Rename the values 1, 2 and 3, for example to your CRM's option codes. Leave a value empty to send the number. |
| Fixed arguments (JSON) | A JSON object "Sent as-is for tool fields that have no template and no automatic value." |
| Dry run: build the conversations but do not call the tool | Builds each conversation without sending it. Read the warning below first. |
| Preview on a chat | Shows what the saved settings would send for one chat. See Test it. |
Click Save. You'll see "Settings for sending conversations saved".
Delivery.
- Conversations of one chat go out in order. A conversation that fails holds back the later conversations of that chat.
- If your server refuses the call (the tool returns an error), the conversation is retried up to 5 times.
- If your server can't be reached or doesn't answer in time, the conversation is retried for about 4 days. The waits between attempts are 1 min, 5 min, 15 min, 1 h, and then every 4 h.
- After the last attempt the conversation is skipped for good, and the chat moves on to its next conversation.
- In rare cases a conversation arrives twice, so your receiver should upsert on
conversation.id.
Dry run marks conversations as handled
Conversations built during a dry run count as done. They are not resent when you turn dry run off. To check what would be sent, use Preview on a chat instead, and keep dry run on only briefly.
Notify MCP when a client writes to a manager
"When a client sends a message in a conversation handed to a manager, the platform calls a tool on the agent's MCP server with that message. The agent itself does not run while a manager has the chat."
While a chat is handed to a manager (the assistant is paused for that chat), every new client message triggers one call to the tool you choose. Use it to tell your system that the client answered, for example to reopen a ticket. The assistant can't make this call itself, because it isn't running in that chat. To set up how chats are handed to managers, see Handoff Control.
When to use it. The card says: "Use it if a manager works the chat in your own system and must see new client messages there."
- Use it when your managers answer handed-over chats from a ticket or CRM system, and that system has to learn that the client wrote again.
- Don't use it when your managers answer in the MyChatBot app itself. They already see the client's messages there.
- Don't use it to get messages while the assistant is answering. It only fires while a chat is handed to a manager; for whole conversations, use Send conversations to MCP.
Channels. All messaging channels that record client messages: Messenger, Instagram, Telegram (bot and account), WhatsApp (including WhatsApp groups), Viber, TikTok, SMS, and the website widgets, plus social comments routed to a manager. Spam chats are skipped.
Tool. Click the card's header to open it. There is no default tool. The Tool dropdown starts at "Select a tool", and turning the switch on without a tool shows "Select a tool first". The argument panel, Tool arguments, appears below it once a tool is chosen.
Placeholders.
| Placeholder | Description |
|---|---|
message.id | Id of the client's message, stable and unique within the chat. Receivers should dedupe on it. |
message.text | Text of the client's message |
message.sent_at | When the message arrived, RFC3339 UTC |
message.attachments | Attachment URLs, comma-separated |
chat.id | Chat id |
chat.channel | Channel the chat is on (telegram, instagram, ...) |
chat.client_id | The client's id on the channel |
client.first_name | Client first name |
client.last_name | Client last name |
client.full_name | Client full name |
client.email | Client email |
client.phone | Client phone |
manager.name | The lead's manager |
account.id | Account id |
agent.id | Agent id |
tool_result.<tool>.<path> | A field of the latest result of a tool the agent called in this chat |
Values from earlier tool results. tool_result lets you send back something the assistant received before the handoff. For example, if the assistant called create_manager_request earlier in the chat and it returned:
json
{"request": {"id": "R-1"}}then the template {{tool_result.create_manager_request.request.id}} sends R-1. The value comes from the latest result of that tool in the chat. If the tool was never called there, or the path doesn't exist, the field is left out. In the placeholder chips there is one chip per tool: clicking it inserts the prefix (tool_result.create_manager_request.) and you type the path.
Automatic values by field name.
| Tool field name | Value |
|---|---|
message_id | message.id |
text, message_text, message | message.text |
sent_at | message.sent_at |
chat_id | chat.id |
channel | chat.channel |
account_id | account.id |
Advanced. Click Advanced for Fixed arguments (JSON), Dry run: build the call but do not send it and Preview on a chat. Messages that arrive during a dry run are never sent later.
Click Save. You'll see "Notification settings saved".
Delivery.
- Only an unreachable server is retried: 3 attempts in total, the second after 30 s and the third after 2 more minutes.
- If the tool returns an error, the call is not retried.
- Changing or turning off the settings also applies to messages still waiting to be sent.
Tool arguments
Both automations use the same argument panel, Tool arguments: "Map each tool field to a template. Click a placeholder to insert it into the selected field. Fields left empty are filled automatically when their name is recognised."
- Each field of the tool is one row. Required fields are marked
*. - Click into a row, then click a placeholder chip to insert it. If no field is focused you'll see "Click into a field first, then pick a placeholder."
- A row left empty shows its automatic value greyed out, for example
auto: {{conversation.id}}.
Template syntax. Write placeholders as {{key}}, for example {{client.full_name}} or Chat {{chat.id}} on {{chat.channel}}.
- A template that is exactly one placeholder keeps the value's type: a number stays a number.
- A template that mixes text and placeholders is sent as a string.
- A template that renders empty leaves the field out of the call.
Which value wins. For each tool field, in this order:
- Your template in that row.
- The automatic value matched by the field name (shown greyed as
auto: {{…}}). - Fixed arguments (JSON), for top-level fields only.
Nested fields. A field inside an object is a dot path, for example contact.phone, up to 3 levels deep. A field that is itself an object or an array can't be templated.
Warnings. An amber row reading "is not a field of this tool any more" means the server no longer has that field. Click Remove to drop it. Problems the server reports about the tool itself show as "Tool <tool> is unavailable: <error>".
Test it
- Connect the server, tick the tools, and click Save Changes. Check that the counter shows the tools you expect.
- Ask the assistant something that should use one of the tools, in a test chat or on a connected channel, and check that your server received the call.
- Configure an automation and click Save. Preview uses the saved settings, so always save first.
- In the same card, click Advanced. Under Preview on a chat, enter a Chat ID and click Preview. Nothing is sent.
- For Send conversations to MCP, you see each conversation of that chat since sending was turned on, marked "Will be sent", "Still open", or "Not sent (not selected in 'answered by')", with the arguments it would send. If the chat has none, you see "No conversations in this chat since sending was turned on."
- For Notify MCP when a client writes to a manager, you see the call for the chat's latest client message.
- "Left empty: …" lists tool fields that would be sent without a value.
- Turn the automation on and watch your server's logs for the first real call. Use dry run only if you understand what it does to conversations (see the warning above).
From Claude or Codex
The Sales Platform MCP can connect a server too. custom_mcp_create connects one by its https URL, unless the URL carries a key (a query or a long code in its path): add that server here. If the server needs headers, it is saved with no tools on: add them on its tab here and click Save headers (see Change a connected server's headers). If it asks for a sign-in, nothing is saved: connect it here with Sign in with … (see Servers that ask you to sign in). integration_verify checks the server with its stored headers or sign-in. custom_mcp_set_tools chooses its tools. Header values and sign-ins are never passed through those tools: they are entered only on this page.
Limits and troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| No Automations for this agent block | No Custom MCP is linked to the selected agent | Add a server for that agent, or switch the dropdown to the agent that has one |
| Tool dropdown is empty or the switch is disabled | No tools are ticked and saved on any linked server | Tick tools on a server tab, then click Save Changes |
| "Select a tool first" when you click Save or turn the switch on | No tool is picked in the card's Tool dropdown | Open the card, pick a tool, and click Save |
| "Tool send_session is unavailable: …" in Send conversations to MCP | The configuration was saved before the tool could be chosen, so it uses send_session, and your server has no tool by that name | Pick your own tool in Tool and click Save |
| The mapping was saved but nothing arrives | Settings saved while the switch is off are not checked against the tool. The checks run when you turn it on. | Turn the switch on and fix the errors it reports |
| A required tool field arrives empty | Required fields are marked *, but saving does not enforce them | Check "Left empty: …" in Preview on a chat and map those fields |
| Amber "is not a field of this tool any more" | The server changed the tool's fields | Click Remove on the row, or tick and save the tools again on the server tab |
| Old conversations were never sent | Send conversations to MCP only sends conversations after it was first turned on | This is by design; there is no replay |
| Conversations stopped after a dry run | Conversations built during a dry run count as sent | This is by design; those conversations are not resent |
| You can't see why a call failed | Delivery errors are not shown in the app | Check your server's logs. Contact support with the chat id. |
| "The sign-in to … has expired" on a server's tab, or "Couldn't load this server's tools" pointing to Reconnect | The service no longer accepts the sign-in | Click Reconnect on the server's tab and sign in again. Ticked tools and automations are kept. |
| "Couldn't load this server's tools" with "If the server needs a key or a login, add it under Custom Headers above and save." | The server refused the headers it was sent | Fix the headers on the server's tab and click Save headers, then Try again (see Change a connected server's headers) |
| "Couldn't connect the server: …" and no Sign in with … button | The server refused your headers and does not offer a sign-in the platform can use | Add the headers the server asks for under Custom Headers. If the service has no API key option, contact support. |
| "Couldn't sign in: another MCP server of this account already has this name" | Another server on this account uses that MCP Name (a blank name is saved as "Custom MCP") | Pick another MCP Name and try again |
| "Sign-in was cancelled." | You clicked Cancel sign-in, or left the page before the sign-in finished | Start the sign-in again: Sign in with … in the form, or Reconnect on the server's tab |
| The form keeps saying "Finish signing in in the window that opened." after you closed that window | The form cannot tell a closed sign-in window from one that is still open | Click Cancel sign-in, then start the sign-in again |
| "The sign-in wasn't finished in time. Start it again." | The sign-in was not finished within 10 minutes | Start the sign-in again: Sign in with … in the form, or Reconnect on the server's tab |
| "Sign-in didn't finish: this sign-in has expired or was already used" | The sign-in ran in this tab (your browser blocked the window) and wasn't finished within 10 minutes, or the page was reloaded | Click Back to Integrations and start the sign-in again |
See also
- Integrations overview: how integrations are connected per assistant
- Assistant configuration: the rest of the assistant's tools and settings
- Handoff Control: when a chat is handed to a manager, which is what triggers client-reply notifications
- Custom connectors: connectors for agents on the Agents Platform, a different product from this Sales Platform integration
