inboxMCP is a hosted MCP server that lets any AI app that speaks MCP (Claude, ChatGPT, Cursor and more) use your LinkedIn, WhatsApp, Telegram and Instagram accounts safely. Your assistant reads and answers your messages on each of them. On LinkedIn it also finds people, views profiles, sends invitations and posts. We pace every action and keep each account within safe limits so it isn't flagged as a bot. The limits section explains exactly how.
connect_account and gives you a link; you log in in your browser (your password never goes through the chat). Your first account starts your 3-day free trial. You can also connect from the dashboard.inbox_status anytime to see what's left today on an account.Apps with OAuth sign you in on our page. Apps without it use an API key, created on the API keys page and sent as Authorization: Bearer <key>. A key belongs to one connected account.
Add the server, then authenticate in Claude Code with /mcp. Prefer a key? Use the second command.
claude mcp add --transport http inboxmcp \ https://inbox-mcp.com/mcp
claude mcp add --transport http inboxmcp \ https://inbox-mcp.com/mcp \ --header "Authorization: Bearer <API_KEY>"
Add the server, then sign in with codex mcp login. Prefer a key? Add the TOML to ~/.codex/config.toml instead.
codex mcp add inboxmcp --url https://inbox-mcp.com/mcp codex mcp login inboxmcp
[mcp_servers.inboxmcp]
url = "https://inbox-mcp.com/mcp"
http_headers = { "Authorization" = "Bearer <API_KEY>" }Add the server to ~/.hermes/config.yaml, sign in with hermes mcp login inboxmcp, then run /reload-mcp in your chat. Prefer a key? Use the second block instead.
mcp_servers:
inboxmcp:
url: "https://inbox-mcp.com/mcp"
auth: oauthmcp_servers:
inboxmcp:
url: "https://inbox-mcp.com/mcp"
headers:
Authorization: "Bearer <API_KEY>"Add the server, then sign in with openclaw mcp login. Prefer a key? Put the JSON in ~/.openclaw/openclaw.json instead.
openclaw mcp set inboxmcp '{"url":"https://inbox-mcp.com/mcp","transport":"streamable-http","auth":"oauth"}'
openclaw mcp login inboxmcp{
"mcp": {
"servers": {
"inboxmcp": {
"url": "https://inbox-mcp.com/mcp",
"transport": "streamable-http",
"headers": {
"Authorization": "Bearer <API_KEY>"
}
}
}
}
}Add the server to your MCP configuration (~/.cursor/mcp.json).
{
"mcpServers": {
"inboxmcp": {
"url": "https://inbox-mcp.com/mcp",
"headers": {
"Authorization": "Bearer <API_KEY>"
}
}
}
}Copy this into your MCP server configuration.
{
"mcpServers": {
"inboxmcp": {
"serverUrl": "https://inbox-mcp.com/mcp",
"headers": {
"Authorization": "Bearer <API_KEY>"
}
}
}
}Add an HTTP server in your workspace MCP configuration (.vscode/mcp.json).
{
"servers": {
"inboxmcp": {
"type": "http",
"url": "https://inbox-mcp.com/mcp",
"headers": {
"Authorization": "Bearer <API_KEY>"
}
}
}
}Any client that supports remote MCP servers over Streamable HTTP can connect.
{
"mcpServers": {
"inboxmcp": {
"type": "http",
"url": "https://inbox-mcp.com/mcp",
"headers": {
"Authorization": "Bearer <API_KEY>"
}
}
}
}Exactly what your AI app receives from tools/list. Write tools send or change something on your account: good assistants show you the text before sending. The inbox_* tools work with every provider (pass account when you have several); linkedin_* tools are LinkedIn only. The whatsapp_*, telegram_* and instagram_* tools are listed once such an account is connected (your app may need to refresh its tool list). Every call to the provider counts against the limit shown.
inbox_list_accountsList connected accountsReadThe LinkedIn, WhatsApp, Telegram and Instagram accounts this connection can use, with their account_id, provider, name and status. Pass account_id as `account` to the inbox_* and provider tools (linkedin_*, whatsapp_*, telegram_*, instagram_*) when more than one is connected.
inbox_list_chatsList conversationsReadConversations across every connected inbox (LinkedIn, WhatsApp, Telegram, Instagram), merged and sorted most recent first; account or provider narrows it. Use unread=true to triage. Each item has chat_id, its account_id and provider (pass account_id as account to inbox_get_messages / inbox_send_message when several accounts are connected), and person_id for 1-to-1 chats. Accounts that can't be read right now are listed in skipped, with what to do.
| account | string | Only this account (account_id from inbox_list_accounts); default: every connected account, merged |
| provider | "linkedin" | "whatsapp" | "telegram" | "instagram" | Only this provider's accounts |
| unread | boolean | Only conversations with unread messages |
| limit | integer | (default 20, 1–50) |
| cursor | string | next_cursor from a previous call |
| fresh | boolean | Bypass the 1h cache (costs a provider call) (default false) |
inbox_get_messagesRead a conversationReadMessages in one conversation, most recent first. 'from' is 'me' (the account owner) or 'them'.
| account | string | account_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected. |
| chat_idrequired | string | |
| limit | integer | (default 30, 1–100) |
| cursor | string | |
| fresh | boolean | (default false) |
inbox_send_messageSend a messageWriteReply in an existing conversation, on any connected provider. Plain text. Show the user the exact text before calling this.
| account | string | account_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected. |
| chat_idrequired | string | |
| textrequired | string | (max 8000 chars) |
inbox_start_chatStart a new conversationWriteMessage someone you have no conversation with yet. `to`: on LinkedIn the person_id (1st-degree connections; for InMail use linkedin_start_chat), on WhatsApp a phone number with country code, on Telegram the user id, on Instagram the user id. New conversations have a low daily limit, especially on WhatsApp, where cold messages get new accounts banned. Show the user the exact text before calling this.
| account | string | account_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected. |
| torequired | string | Recipient: person_id, phone number (WhatsApp) or user id |
| textrequired | string | (max 8000 chars) |
inbox_mark_readMark conversation as readWriteMarks a conversation read (or unread), on any connected provider.
| account | string | account_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected. |
| chat_idrequired | string | |
| read | boolean | (default true) |
linkedin_list_chatsList LinkedIn conversationsReadConversations in the LinkedIn inbox, most recent first. Use unread=true to triage. Returns chat_id values for linkedin_get_messages / linkedin_send_message and person_id for 1-to-1 chats. With several LinkedIn accounts, lists them all merged (each item has its account_id: pass it as account to the other linkedin_* tools); account narrows to one.
| account | string | Only this account (account_id from inbox_list_accounts); default: every connected LinkedIn account, merged |
| unread | boolean | Only conversations with unread messages |
| limit | integer | (default 20, 1–50) |
| cursor | string | next_cursor from a previous call |
| fresh | boolean | Bypass the 1h cache (costs a LinkedIn call) (default false) |
linkedin_get_messagesRead a LinkedIn conversationReadMessages in one conversation, most recent first. 'from' is 'me' (the account owner) or 'them'.
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
| chat_idrequired | string | |
| limit | integer | (default 30, 1–100) |
| cursor | string | |
| fresh | boolean | (default false) |
linkedin_send_messageSend a LinkedIn messageWriteReply in an existing conversation. Plain text. Show the user the exact text before calling this.
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
| chat_idrequired | string | |
| textrequired | string | (max 8000 chars) |
linkedin_start_chatStart a new LinkedIn conversationWriteMessage someone you are connected with (1st degree). For others, set inmail=true (needs a LinkedIn premium plan with InMail credits). Get the person_id from linkedin_search_people or linkedin_get_profile.
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
| person_idrequired | string | LinkedIn user id of the recipient |
| textrequired | string | (max 8000 chars) |
| inmail | boolean | (default false) |
| subject | string | InMail subject (max 200 chars) |
linkedin_mark_readMark LinkedIn conversation as readWriteMarks a conversation read (or unread).
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
| chat_idrequired | string | |
| read | boolean | (default true) |
linkedin_search_peopleSearch people on LinkedInReadSearch LinkedIn members by keywords, or paste a LinkedIn people-search URL copied from the browser (keeps all its filters). Each page costs one LinkedIn search. Returns person_id values for other tools.
| keywords | string | (max 200 chars) |
| url | string (uri) | A LinkedIn people-search URL |
| network_distance | 1 | 2 | 3[] | 1 = connections, 2 = 2nd degree, 3 = 3rd+ |
| limit | integer | (default 10, 1–25) |
| cursor | string | |
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
linkedin_get_profileGet a LinkedIn profileReadFull profile by person_id or public identifier (the part after linkedin.com/in/). Counts as a profile view on LinkedIn.
| personrequired | string | person_id or public identifier |
| fresh | boolean | (default false) |
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
linkedin_send_invitationSend a connection requestWriteInvite someone to connect, optionally with a note (max 300 characters, 200 on free LinkedIn accounts, which can add a note to about 15 invitations a week). Limited per day and per week, and LinkedIn actions are spaced about a minute apart; check linkedin_status first.
| person_idrequired | string | |
| note | string | (max 300 chars) |
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
linkedin_list_invitationsList connection requestsReadPending invitations you sent or received.
| direction | "sent" | "received" | (default "received") |
| limit | integer | (default 20, 1–50) |
| cursor | string | |
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
linkedin_create_postPublish a LinkedIn postWritePublish a text post on the account's feed. A link can be appended; LinkedIn builds the preview from the first URL in the text. Public and irreversible from here: confirm the final text with the user first.
| textrequired | string | (max 3000 chars) |
| link | string (uri) | |
| visibility | "anyone" | "relations_only" | (default "anyone") |
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
linkedin_schedule_outreachSchedule paced LinkedIn messagesWriteQueue up to 50 messages or invitations. They are sent one by one with random gaps of a minute or more, respecting daily limits. An invitation's text is its note (max 300 characters, 200 on free LinkedIn accounts). Returns a job_id; poll with linkedin_get_job. Confirm the list with the user first.
| itemsrequired | object[] | (max 50 items) |
| items[].kindrequired | "message" | "invitation" | |
| items[].chat_id | string | for kind=message: existing conversation |
| items[].person_id | string | for kind=invitation, or kind=message to start a new conversation |
| items[].textrequired | string | (max 3000 chars) |
| min_gap_seconds | integer | (default 120, 60–3600) |
| account | string | account_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected. |
linkedin_get_jobCheck an outreach jobReadProgress and per-item results of a job from linkedin_schedule_outreach.
| job_idrequired | string |
whatsapp_list_chatsList WhatsApp chatsReadWhatsApp chats (1-to-1 and groups), most recent first. Use unread=true to triage. Returns chat_id values for whatsapp_get_messages / whatsapp_send_message, and person_id (the contact's WhatsApp id, <digits>@s.whatsapp.net) for 1-to-1 chats; for a group's members use whatsapp_list_group_members. With several WhatsApp accounts, lists them all merged (each item has its account_id: pass it as account to the other whatsapp_* tools); account narrows to one.
| account | string | Only this account (account_id from inbox_list_accounts); default: every connected WhatsApp account, merged |
| unread | boolean | Only conversations with unread messages |
| limit | integer | (default 20, 1–50) |
| cursor | string | next_cursor from a previous call |
| fresh | boolean | Bypass the 1h cache (costs a WhatsApp call) (default false) |
whatsapp_get_messagesRead a WhatsApp chatReadMessages in one WhatsApp chat, most recent first. 'from' is 'me' (the account owner) or 'them'. message_id values work with whatsapp_react.
| account | string | account_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected. |
| chat_idrequired | string | |
| limit | integer | (default 30, 1–100) |
| cursor | string | |
| fresh | boolean | (default false) |
whatsapp_send_messageSend a WhatsApp messageWriteReply in an existing WhatsApp chat (1-to-1 or group). Plain text. WhatsApp actions are spaced 10–20 s apart. Show the user the exact text before calling this.
| account | string | account_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected. |
| chat_idrequired | string | |
| textrequired | string | (max 8000 chars) |
whatsapp_start_chatStart a new WhatsApp chatWriteMessage a phone number you have no WhatsApp chat with yet. phone: international format with its country code, like +33 6 12 34 56 78. WhatsApp bans accounts that send cold messages (new accounts after 2–3), so only message people who expect it; at most 10 new chats a day. Show the user the exact text before calling this.
| account | string | account_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected. |
| phonerequired | string | Phone number with its country code, like +33 6 12 34 56 78 |
| textrequired | string | (max 8000 chars) |
whatsapp_mark_readMark WhatsApp chat as readWriteMarks a WhatsApp chat read (or unread).
| account | string | account_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected. |
| chat_idrequired | string | |
| read | boolean | (default true) |
whatsapp_reactReact to a WhatsApp messageWriteAdd an emoji reaction to a message (message_id from whatsapp_get_messages). Any emoji works; a new reaction replaces yours.
| account | string | account_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected. |
| chat_idrequired | string | |
| message_idrequired | string | |
| reactionrequired | string | One emoji, like 👍 (max 16 chars) |
whatsapp_get_profileGet a WhatsApp profileReadA WhatsApp user's profile: name, username, phone when WhatsApp shares it, bio, followers and picture. Counts as a profile view.
| account | string | account_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected. |
| user_idrequired | string | The contact's WhatsApp id (a chat's person_id, <digits>@s.whatsapp.net) or phone number with country code |
| fresh | boolean | (default false) |
whatsapp_list_group_membersList WhatsApp group membersReadMembers of a WhatsApp group chat (chat_id from whatsapp_list_chats), with their user_id for whatsapp_get_profile and their phone number. Group chats only.
| account | string | account_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected. |
| chat_idrequired | string | |
| limit | integer | (default 50, 1–100) |
| cursor | string | next_cursor from a previous call |
telegram_list_chatsList Telegram chatsReadTelegram chats (private chats and groups), most recent first. Use unread=true to triage. Returns chat_id values for telegram_get_messages / telegram_send_message, and person_id (the contact's Telegram user id) for private chats; for a group's members use telegram_list_group_members. With several Telegram accounts, lists them all merged (each item has its account_id: pass it as account to the other telegram_* tools); account narrows to one.
| account | string | Only this account (account_id from inbox_list_accounts); default: every connected Telegram account, merged |
| unread | boolean | Only conversations with unread messages |
| limit | integer | (default 20, 1–50) |
| cursor | string | next_cursor from a previous call |
| fresh | boolean | Bypass the 1h cache (costs a Telegram call) (default false) |
telegram_get_messagesRead a Telegram chatReadMessages in one Telegram chat, most recent first. 'from' is 'me' (the account owner) or 'them'. message_id values work with telegram_react.
| account | string | account_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected. |
| chat_idrequired | string | |
| limit | integer | (default 30, 1–100) |
| cursor | string | |
| fresh | boolean | (default false) |
telegram_send_messageSend a Telegram messageWriteReply in an existing Telegram chat (private or group). Plain text. Show the user the exact text before calling this.
| account | string | account_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected. |
| chat_idrequired | string | |
| textrequired | string | (max 8000 chars) |
telegram_start_chatStart a new Telegram chatWriteMessage a Telegram user you have no chat with yet, by numeric user id (a chat's person_id, or a member from telegram_list_group_members). Telegram restricts accounts that message many strangers, so only message people who expect it; at most 10 new chats a day. Show the user the exact text before calling this.
| account | string | account_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected. |
| user_idrequired | string | Telegram user id of the recipient |
| textrequired | string | (max 8000 chars) |
telegram_mark_readMark Telegram chat as readWriteMarks a Telegram chat read (or unread).
| account | string | account_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected. |
| chat_idrequired | string | |
| read | boolean | (default true) |
telegram_reactReact to a Telegram messageWriteAdd an emoji reaction to a message (message_id from telegram_get_messages). Telegram accepts only its standard reaction emojis (👍 ❤️ 🔥 🎉 😁 👏 …); others fail.
| account | string | account_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected. |
| chat_idrequired | string | |
| message_idrequired | string | |
| reactionrequired | string | One emoji, like 👍 (max 16 chars) |
telegram_get_profileGet a Telegram profileReadA Telegram user's profile: name, username, phone when Telegram shares it, bio, followers and picture. Counts as a profile view.
| account | string | account_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected. |
| user_idrequired | string | Telegram user id (a chat's person_id or a group member's user_id) |
| fresh | boolean | (default false) |
telegram_list_group_membersList Telegram group membersReadMembers of a Telegram group chat (chat_id from telegram_list_chats), with their user_id for telegram_get_profile. Group chats only.
| account | string | account_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected. |
| chat_idrequired | string | |
| limit | integer | (default 50, 1–100) |
| cursor | string | next_cursor from a previous call |
instagram_list_chatsList Instagram conversationsReadInstagram direct messages, most recent first. Use unread=true to triage. Returns chat_id values for instagram_get_messages / instagram_send_message, and person_id (the contact's Instagram user id) for 1-to-1 chats. With several Instagram accounts, lists them all merged (each item has its account_id: pass it as account to the other instagram_* tools); account narrows to one.
| account | string | Only this account (account_id from inbox_list_accounts); default: every connected Instagram account, merged |
| unread | boolean | Only conversations with unread messages |
| limit | integer | (default 20, 1–50) |
| cursor | string | next_cursor from a previous call |
| fresh | boolean | Bypass the 1h cache (costs a Instagram call) (default false) |
instagram_get_messagesRead an Instagram conversationReadMessages in one Instagram conversation, most recent first. 'from' is 'me' (the account owner) or 'them'. message_id values work with instagram_react.
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| chat_idrequired | string | |
| limit | integer | (default 30, 1–100) |
| cursor | string | |
| fresh | boolean | (default false) |
instagram_send_messageSend an Instagram messageWriteReply in an existing Instagram direct conversation. Plain text. Show the user the exact text before calling this.
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| chat_idrequired | string | |
| textrequired | string | (max 8000 chars) |
instagram_start_chatStart a new Instagram conversationWriteSend a direct message to an Instagram user you have no conversation with yet, by user id (a chat's person_id, or from instagram_get_profile). Messages to people who don't follow the account land in their message requests, and Instagram restricts accounts that message many strangers: only message people who expect it; at most 10 new conversations a day. Show the user the exact text before calling this.
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| user_idrequired | string | Instagram user id of the recipient |
| textrequired | string | (max 8000 chars) |
instagram_mark_readMark Instagram conversation as readWriteMarks an Instagram conversation read (or unread).
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| chat_idrequired | string | |
| read | boolean | (default true) |
instagram_reactReact to a Instagram messageWriteAdd an emoji reaction to a message (message_id from instagram_get_messages). Instagram keeps one reaction per person: a new one replaces yours.
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| chat_idrequired | string | |
| message_idrequired | string | |
| reactionrequired | string | One emoji, like 👍 (max 16 chars) |
instagram_get_profileGet a Instagram profileReadA Instagram user's profile: name, username, phone when Instagram shares it, bio, followers and picture. Counts as a profile view.
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| user_idrequired | string | Instagram user id (a chat's person_id) or username |
| fresh | boolean | (default false) |
instagram_list_postsList Instagram postsReadPosts of an Instagram user, most recent first: the account's own by default, or someone else's with user_id. Returns caption, link, date, likes and comments.
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| user_id | string | Instagram user id or username; default: the account's own posts |
| limit | integer | (default 10, 1–50) |
| cursor | string | next_cursor from a previous call |
instagram_create_postPublish an Instagram postWritePublish a photo on the account's Instagram feed: image_url is an https link to a JPEG, PNG or WebP (at most 8 MB), text is the caption. Public and irreversible from here: confirm the image and the caption with the user first.
| account | string | account_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected. |
| image_urlrequired | string (uri) | https link to the image |
| text | string | Caption (default "", max 2200 chars) |
linkedin_statusLinkedIn account status and limitsReadCall before planning several LinkedIn actions. Says whether the account can act now (blocked_reason), how many actions are left today (profile_views → linkedin_get_profile, searches → linkedin_search_people, messages → linkedin_send_message, new_conversations → linkedin_start_chat, invitations → linkedin_send_invitation, posts → linkedin_create_post; invitations also have a weekly limit), and ready_in_seconds for each: the wait before that action can run. Reading the inbox has a high limit and is not listed. No account or a disconnected one: use linkedin_connect_account. Plan or seats: use inboxmcp_billing. For WhatsApp, Telegram and Instagram accounts, use inbox_status.
| account | string | account_id from inbox_list_accounts; default: the first LinkedIn account |
inbox_statusAccount status and limitsReadStatus and limits of one connected account, any provider (LinkedIn, WhatsApp, Telegram, Instagram). Call before planning several actions. Says whether the account can act now (blocked_reason), how many actions are left today (messages → *_send_message, new_conversations → *_start_chat, profile_views → *_get_profile, posts → linkedin_create_post / instagram_create_post; on LinkedIn also searches and invitations), and ready_in_seconds for each. Reading has a high limit and is not listed. No account or a disconnected one: use connect_account. Plan or seats: use inboxmcp_billing.
| account | string | account_id from inbox_list_accounts. Needed only when several accounts are connected. |
connect_accountConnect an accountReadGet a link for the user to connect a LinkedIn, WhatsApp, Telegram or Instagram account, or to reconnect one that was logged out. Before giving the link, tell the user what the result says about the free trial or price. They log in on our connect page in their browser (LinkedIn and Instagram: their login; WhatsApp and Telegram: scan a QR code). Never ask for passwords or codes in the chat. The link works for 30 minutes. Afterwards, call inbox_list_accounts to confirm.
| providerrequired | "linkedin" | "whatsapp" | "telegram" | "instagram" | Which network to connect |
| mode | "auto" | "new" | "reconnect" | auto: reconnect the current account if it needs it, otherwise add one if none is connected. new: add another account. reconnect: log the current account back in. (default "auto") |
| account | string | account_id from inbox_list_accounts: the one to reconnect, when several of this network are connected |
linkedin_connect_accountConnect a LinkedIn accountReadGet a link for the user to connect a LinkedIn account, or to reconnect one LinkedIn logged out. Before giving the link, tell the user what the result says about the free trial or price. They log in to LinkedIn in their browser on our connect page (never ask for their LinkedIn password or codes in the chat). The link works for 30 minutes. Afterwards, call linkedin_status to confirm.
| mode | "auto" | "new" | "reconnect" | auto: reconnect the current account if it needs it, otherwise add one if none is connected. new: add another account. reconnect: log the current account back in. (default "auto") |
inboxmcp_billingPlan and billingReadThe user's inbox MCP plan: free trial (3 days, starts when the first account is connected) or subscription ($10/month per connected account, any provider), with a link to our billing page to subscribe, update their card, get invoices, or cancel (payment happens on Stripe, in their browser). The link works for 30 minutes. Use it when the tools say the trial or subscription ended.
searchSearch LinkedIn peopleReadSearch LinkedIn people by keywords. Returns ids usable with fetch.
| queryrequired | string |
fetchFetch a LinkedIn recordReadFetch a full record by id from search: person:<id> or chat:<id>.
| idrequired | string |
Limits follow Unipile's recommendations for each provider and protect your accounts from being restricted. They are per connected account and shared by every app and API key using it. The table below is LinkedIn's; WhatsApp, Telegram and Instagram have their own.
retry_after_seconds, never queued. To send several messages or invitations, use linkedin_schedule_outreach.fresh: true to force a live read.| Action | Per day | Per week | Paced | Tools |
|---|---|---|---|---|
| Reads (inbox, invitations, group members, posts list) | 3000 | — | 0.3 s | inbox_list_chats, inbox_get_messages, linkedin_list_chats, linkedin_get_messages, linkedin_list_invitations, whatsapp_list_chats, whatsapp_get_messages, whatsapp_list_group_members, telegram_list_chats, telegram_get_messages, telegram_list_group_members, instagram_list_chats, instagram_get_messages, instagram_list_posts |
| Inbox updates (mark read, reactions) | 500 | — | 1 s | inbox_mark_read, linkedin_mark_read, whatsapp_mark_read, whatsapp_react, telegram_mark_read, telegram_react, instagram_mark_read, instagram_react |
| Profile views | 80 | — | 45–75 s | linkedin_get_profile, whatsapp_get_profile, telegram_get_profile, instagram_get_profile, fetch |
| Searches (pages) | 40 | — | 45–75 s | linkedin_search_people, search |
| Messages | 75 | — | 45–75 s | inbox_send_message, linkedin_send_message, whatsapp_send_message, telegram_send_message, instagram_send_message |
| New conversations | 25 | — | 45–75 s | inbox_start_chat, linkedin_start_chat, whatsapp_start_chat, telegram_start_chat, instagram_start_chat |
| Invitations | 25 · Premium 80 | 150 · Premium 200 15 with a note (free accounts) | 45–75 s | linkedin_send_invitation |
| Posts | 3 | — | 45–75 s | linkedin_create_post, instagram_create_post |
Invitation notes: up to 300 characters on Premium, 200 on free accounts. Search pages return up to 25 people.
Unipile publishes guidance for WhatsApp only (several hundred messages a day, 10 to 20 seconds apart, very few new conversations on a new account). We stay well below it, and apply similar conservative limits to Telegram and Instagram, which publish none. Searches and invitations are LinkedIn only.
| Per day | Telegram | ||
|---|---|---|---|
| Reads (inbox, invitations, group members, posts list) | 3000 | 3000 | 3000 |
| Inbox updates (mark read, reactions) | 500 | 500 | 500 |
| Profile views | 50 | 50 | 50 |
| Messages | 100 | 100 | 50 |
| New conversations | 10 | 10 | 10 |
| Posts | — | — | 3 |
| Spacing | 10–20 s | 10–20 s | 10–20 s |
inboxmcp_billing. Unpaid connected accounts are removed 12 hours later; you can connect again anytime.inboxmcp_billing gives you a link (valid 30 minutes) to our billing page; payment, card, invoices and cancellation happen on Stripe. Each account gets one free trial, whatever the email.Chosen on the consent page (OAuth) or when creating an API key. Revoke an app anytime from Connected apps.
| Permission | Allows | Tools |
|---|---|---|
Read your messages linkedin:messages | View conversations and messages in your connected accounts. | inbox_list_chats, inbox_get_messages, linkedin_list_chats, linkedin_get_messages, whatsapp_list_chats, whatsapp_get_messages, whatsapp_list_group_members, telegram_list_chats, telegram_get_messages, telegram_list_group_members, instagram_list_chats, instagram_get_messages |
View profiles linkedin:profiles | Read the profiles and posts of people on your connected accounts. | linkedin_get_profile, linkedin_list_invitations, whatsapp_get_profile, telegram_get_profile, instagram_get_profile, instagram_list_posts, fetch |
Search LinkedIn linkedin:search | Find people and explore your LinkedIn network. | linkedin_search_people, search |
Send messages & invitations linkedin:send | Send messages from your connected accounts, and LinkedIn invitations. | inbox_send_message, inbox_start_chat, inbox_mark_read, linkedin_send_message, linkedin_start_chat, linkedin_mark_read, linkedin_send_invitation, linkedin_create_post, linkedin_schedule_outreach, whatsapp_send_message, whatsapp_start_chat, whatsapp_mark_read, whatsapp_react, telegram_send_message, telegram_start_chat, telegram_mark_read, telegram_react, instagram_send_message, instagram_start_chat, instagram_mark_read, instagram_react, instagram_create_post |
Tools never throw. A refused call returns isError: true with one plain sentence your assistant can read to you, plus a code and, when waiting helps, retry_after_seconds.
| gap | Too soon after the previous action on this account (human pace) or this minute's cap. Wait retry_after_seconds. |
| limit | Daily or weekly limit reached, the action isn't available on this provider, or an invitation note is too long. Resets at midnight UTC / Monday. |
| cooldown | The provider rate-limited the account; actions resume after the time given. |
| plan | Free trial ended or subscription inactive. inboxmcp_billing gives a subscribe link. |
| account | The account needs a new login. connect_account gives a reconnect link. |
| no_account | No account connected yet. connect_account gives a link. |
| permission | This app or API key isn't allowed that action. Reconnect the app with the permission, or use another key. |
| trial_limit · seat_limit · plan_inactive | connect_account can't add an account now (the trial includes one account per app, account cap, or no active plan). |
inboxMCP is a remote MCP server with OAuth 2.1 (PKCE, refresh tokens, dynamic registration and client ID metadata documents). Most apps only need the server URL.
| POST /mcp | MCP server (Streamable HTTP). Auth: OAuth 2.1 access token or an API key, as Authorization: Bearer … |
| GET /.well-known/oauth-protected-resource | Which authorization server protects /mcp (clients discover OAuth here). |
| GET /.well-known/oauth-authorization-server | OAuth 2.1 metadata: endpoints, scopes, PKCE. |
| GET /authorize | Sign-in and consent page: pick the account and the permissions. |
| POST /oauth/token | Token endpoint (authorization code with PKCE, refresh tokens). |
| POST /oauth/register | Dynamic client registration, for clients without a client ID metadata document. |