inboxmcpDocs

inboxMCP documentation

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.

MCP server URLhttps://inbox-mcp.com/mcp
50tools
3 daysfree trial, no card
$10per connected account / month
45–75 sbetween LinkedIn actions

Get started

  1. Add the server to your AI app. Paste the URL above as a remote MCP server (see AI apps).
  2. Sign in and choose permissions. Your app opens our sign-in page: enter your email, click the link we send, then allow what the app may do. Reading is on by default; sending is opt-in.
  3. Connect an account from the chat. Ask "connect my LinkedIn" (or WhatsApp, Telegram, Instagram). The assistant calls 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.
  4. Ask away. "Who hasn't had a reply from me this week?", "Find product designers in Paris", "Send a connection request to Ada with a short note", "Reply to Sam on WhatsApp". Call inbox_status anytime to see what's left today on an account.

AI apps

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.

ClaudeOAuth · recommended
  1. Open your connector settings. In Claude, go to Settings → Connectors → Add custom connector.
  2. Name it inboxMCP and paste your URL. Use the endpoint above as the remote MCP server URL.
  3. Connect and choose your permissions. Sign in, pick a LinkedIn account, and approve the actions Claude can use.
Claude guide ↗
Claude CodeOAuth · recommended

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>"
ChatGPTOAuth
  1. Turn on developer mode. In ChatGPT, open Settings → Apps & Connectors → Advanced settings and enable developer mode.
  2. Create a connector with your URL. Choose Create, name it inboxMCP, and paste the endpoint above with OAuth.
  3. Connect and choose your permissions. Sign in, pick a LinkedIn account, and approve the actions ChatGPT can use.
CodexOAuth · recommended

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>" }
GrokOAuth
  1. Open connectors. In Grok, go to Connectors → Add connector → Other.
  2. Add a remote MCP server. Paste the endpoint above as the server URL.
  3. Connect and choose your permissions. Sign in, pick a LinkedIn account, and approve the actions Grok can use.
Grok guide ↗
Grok BotOAuth
  1. Ask Grok Bot to add the server. In chat, say: Add a custom MCP server called inboxMCP at the endpoint above. Then choose Add it.
  2. Authorize the connection. Choose Authorize on the connect card, sign in, pick a LinkedIn account, and approve the actions Grok Bot can use.
  3. Use it in chat. Attach inboxMCP with @ when you want Grok Bot to work with LinkedIn.
MuseOAuth
  1. Ask Muse to connect. Paste your endpoint into the MCP connection settings, or ask Muse to connect to it.
  2. Approve the connection. Sign in, pick a LinkedIn account, and approve the actions Muse can use.
HermesOAuth · recommended

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: oauth
mcp_servers:
  inboxmcp:
    url: "https://inbox-mcp.com/mcp"
    headers:
      Authorization: "Bearer <API_KEY>"
Hermes guide ↗
OpenClawOAuth · recommended

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>"
        }
      }
    }
  }
}
OpenClaw guide ↗
CursorAPI key

Add the server to your MCP configuration (~/.cursor/mcp.json).

{
  "mcpServers": {
    "inboxmcp": {
      "url": "https://inbox-mcp.com/mcp",
      "headers": {
        "Authorization": "Bearer <API_KEY>"
      }
    }
  }
}
WindsurfAPI key

Copy this into your MCP server configuration.

{
  "mcpServers": {
    "inboxmcp": {
      "serverUrl": "https://inbox-mcp.com/mcp",
      "headers": {
        "Authorization": "Bearer <API_KEY>"
      }
    }
  }
}
VS CodeAPI 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>"
      }
    }
  }
}
Custom MCPOAuth or API key

Any client that supports remote MCP servers over Streamable HTTP can connect.

  1. Add a remote MCP server. In your client's MCP settings, add a server named inboxMCP with the endpoint above.
  2. Sign in with OAuth, or send an API key. Clients with MCP OAuth find the sign-in automatically. Otherwise, send your key as an Authorization: Bearer header, as in the config below, or paste the endpoint with your key appended (…/mcp/<API_KEY>).
{
  "mcpServers": {
    "inboxmcp": {
      "type": "http",
      "url": "https://inbox-mcp.com/mcp",
      "headers": {
        "Authorization": "Bearer <API_KEY>"
      }
    }
  }
}

Tools

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.

50 tools

Inbox6

inbox_list_accountsList connected accountsRead

The 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.

Permission: noneLimit: no provider call
inbox_list_chatsList conversationsRead

Conversations 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.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringOnly this account (account_id from inbox_list_accounts); default: every connected account, merged
provider"linkedin" | "whatsapp" | "telegram" | "instagram"Only this provider's accounts
unreadbooleanOnly conversations with unread messages
limitinteger (default 20, 1–50)
cursorstringnext_cursor from a previous call
freshbooleanBypass the 1h cache (costs a provider call) (default false)
inbox_get_messagesRead a conversationRead

Messages in one conversation, most recent first. 'from' is 'me' (the account owner) or 'them'.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected.
chat_idrequiredstring
limitinteger (default 30, 1–100)
cursorstring
freshboolean (default false)
inbox_send_messageSend a messageWrite

Reply in an existing conversation, on any connected provider. Plain text. Show the user the exact text before calling this.

Permission: Send messagesLimit: Messages
accountstringaccount_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected.
chat_idrequiredstring
textrequiredstring (max 8000 chars)
inbox_start_chatStart a new conversationWrite

Message 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.

Permission: Send messagesLimit: New conversations
accountstringaccount_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected.
torequiredstringRecipient: person_id, phone number (WhatsApp) or user id
textrequiredstring (max 8000 chars)
inbox_mark_readMark conversation as readWrite

Marks a conversation read (or unread), on any connected provider.

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id from inbox_list_accounts (a listed chat's account_id). Needed only when several accounts are connected.
chat_idrequiredstring
readboolean (default true)

LinkedIn12

linkedin_list_chatsList LinkedIn conversationsRead

Conversations 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.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringOnly this account (account_id from inbox_list_accounts); default: every connected LinkedIn account, merged
unreadbooleanOnly conversations with unread messages
limitinteger (default 20, 1–50)
cursorstringnext_cursor from a previous call
freshbooleanBypass the 1h cache (costs a LinkedIn call) (default false)
linkedin_get_messagesRead a LinkedIn conversationRead

Messages in one conversation, most recent first. 'from' is 'me' (the account owner) or 'them'.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected.
chat_idrequiredstring
limitinteger (default 30, 1–100)
cursorstring
freshboolean (default false)
linkedin_send_messageSend a LinkedIn messageWrite

Reply in an existing conversation. Plain text. Show the user the exact text before calling this.

Permission: Send messagesLimit: Messages
accountstringaccount_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected.
chat_idrequiredstring
textrequiredstring (max 8000 chars)
linkedin_start_chatStart a new LinkedIn conversationWrite

Message 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.

Permission: Send messagesLimit: New conversations
accountstringaccount_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected.
person_idrequiredstringLinkedIn user id of the recipient
textrequiredstring (max 8000 chars)
inmailboolean (default false)
subjectstringInMail subject (max 200 chars)
linkedin_mark_readMark LinkedIn conversation as readWrite

Marks a conversation read (or unread).

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id of a LinkedIn account from inbox_list_accounts (a listed chat's account_id). Needed only when several LinkedIn accounts are connected.
chat_idrequiredstring
readboolean (default true)
linkedin_search_peopleSearch people on LinkedInRead

Search 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.

Permission: SearchLimit: Searches (pages)
keywordsstring (max 200 chars)
urlstring (uri)A LinkedIn people-search URL
network_distance1 | 2 | 3[]1 = connections, 2 = 2nd degree, 3 = 3rd+
limitinteger (default 10, 1–25)
cursorstring
accountstringaccount_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 profileRead

Full profile by person_id or public identifier (the part after linkedin.com/in/). Counts as a profile view on LinkedIn.

Permission: ProfilesLimit: Profile views
personrequiredstringperson_id or public identifier
freshboolean (default false)
accountstringaccount_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 requestWrite

Invite 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.

Permission: Send messagesLimit: Invitations
person_idrequiredstring
notestring (max 300 chars)
accountstringaccount_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 requestsRead

Pending invitations you sent or received.

Permission: ProfilesLimit: Reads (inbox, invitations, group members, posts list)
direction"sent" | "received" (default "received")
limitinteger (default 20, 1–50)
cursorstring
accountstringaccount_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 postWrite

Publish 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.

Permission: Send messagesLimit: Posts
textrequiredstring (max 3000 chars)
linkstring (uri)
visibility"anyone" | "relations_only" (default "anyone")
accountstringaccount_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 messagesWrite

Queue 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.

Permission: Send messagesLimit: Each item uses its own limit
itemsrequiredobject[] (max 50 items)
items[].kindrequired"message" | "invitation"
items[].chat_idstringfor kind=message: existing conversation
items[].person_idstringfor kind=invitation, or kind=message to start a new conversation
items[].textrequiredstring (max 3000 chars)
min_gap_secondsinteger (default 120, 60–3600)
accountstringaccount_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 jobRead

Progress and per-item results of a job from linkedin_schedule_outreach.

Permission: noneLimit: no provider call
job_idrequiredstring

WhatsApp8

whatsapp_list_chatsList WhatsApp chatsRead

WhatsApp 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.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringOnly this account (account_id from inbox_list_accounts); default: every connected WhatsApp account, merged
unreadbooleanOnly conversations with unread messages
limitinteger (default 20, 1–50)
cursorstringnext_cursor from a previous call
freshbooleanBypass the 1h cache (costs a WhatsApp call) (default false)
whatsapp_get_messagesRead a WhatsApp chatRead

Messages in one WhatsApp chat, most recent first. 'from' is 'me' (the account owner) or 'them'. message_id values work with whatsapp_react.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected.
chat_idrequiredstring
limitinteger (default 30, 1–100)
cursorstring
freshboolean (default false)
whatsapp_send_messageSend a WhatsApp messageWrite

Reply 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.

Permission: Send messagesLimit: Messages
accountstringaccount_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected.
chat_idrequiredstring
textrequiredstring (max 8000 chars)
whatsapp_start_chatStart a new WhatsApp chatWrite

Message 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.

Permission: Send messagesLimit: New conversations
accountstringaccount_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected.
phonerequiredstringPhone number with its country code, like +33 6 12 34 56 78
textrequiredstring (max 8000 chars)
whatsapp_mark_readMark WhatsApp chat as readWrite

Marks a WhatsApp chat read (or unread).

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected.
chat_idrequiredstring
readboolean (default true)
whatsapp_reactReact to a WhatsApp messageWrite

Add an emoji reaction to a message (message_id from whatsapp_get_messages). Any emoji works; a new reaction replaces yours.

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected.
chat_idrequiredstring
message_idrequiredstring
reactionrequiredstringOne emoji, like 👍 (max 16 chars)
whatsapp_get_profileGet a WhatsApp profileRead

A WhatsApp user's profile: name, username, phone when WhatsApp shares it, bio, followers and picture. Counts as a profile view.

Permission: ProfilesLimit: Profile views
accountstringaccount_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected.
user_idrequiredstringThe contact's WhatsApp id (a chat's person_id, <digits>@s.whatsapp.net) or phone number with country code
freshboolean (default false)
whatsapp_list_group_membersList WhatsApp group membersRead

Members 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.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id of a WhatsApp account from inbox_list_accounts (a listed chat's account_id). Needed only when several WhatsApp accounts are connected.
chat_idrequiredstring
limitinteger (default 50, 1–100)
cursorstringnext_cursor from a previous call

Telegram8

telegram_list_chatsList Telegram chatsRead

Telegram 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.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringOnly this account (account_id from inbox_list_accounts); default: every connected Telegram account, merged
unreadbooleanOnly conversations with unread messages
limitinteger (default 20, 1–50)
cursorstringnext_cursor from a previous call
freshbooleanBypass the 1h cache (costs a Telegram call) (default false)
telegram_get_messagesRead a Telegram chatRead

Messages in one Telegram chat, most recent first. 'from' is 'me' (the account owner) or 'them'. message_id values work with telegram_react.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected.
chat_idrequiredstring
limitinteger (default 30, 1–100)
cursorstring
freshboolean (default false)
telegram_send_messageSend a Telegram messageWrite

Reply in an existing Telegram chat (private or group). Plain text. Show the user the exact text before calling this.

Permission: Send messagesLimit: Messages
accountstringaccount_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected.
chat_idrequiredstring
textrequiredstring (max 8000 chars)
telegram_start_chatStart a new Telegram chatWrite

Message 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.

Permission: Send messagesLimit: New conversations
accountstringaccount_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected.
user_idrequiredstringTelegram user id of the recipient
textrequiredstring (max 8000 chars)
telegram_mark_readMark Telegram chat as readWrite

Marks a Telegram chat read (or unread).

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected.
chat_idrequiredstring
readboolean (default true)
telegram_reactReact to a Telegram messageWrite

Add an emoji reaction to a message (message_id from telegram_get_messages). Telegram accepts only its standard reaction emojis (👍 ❤️ 🔥 🎉 😁 👏 …); others fail.

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected.
chat_idrequiredstring
message_idrequiredstring
reactionrequiredstringOne emoji, like 👍 (max 16 chars)
telegram_get_profileGet a Telegram profileRead

A Telegram user's profile: name, username, phone when Telegram shares it, bio, followers and picture. Counts as a profile view.

Permission: ProfilesLimit: Profile views
accountstringaccount_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected.
user_idrequiredstringTelegram user id (a chat's person_id or a group member's user_id)
freshboolean (default false)
telegram_list_group_membersList Telegram group membersRead

Members of a Telegram group chat (chat_id from telegram_list_chats), with their user_id for telegram_get_profile. Group chats only.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id of a Telegram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Telegram accounts are connected.
chat_idrequiredstring
limitinteger (default 50, 1–100)
cursorstringnext_cursor from a previous call

Instagram9

instagram_list_chatsList Instagram conversationsRead

Instagram 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.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringOnly this account (account_id from inbox_list_accounts); default: every connected Instagram account, merged
unreadbooleanOnly conversations with unread messages
limitinteger (default 20, 1–50)
cursorstringnext_cursor from a previous call
freshbooleanBypass the 1h cache (costs a Instagram call) (default false)
instagram_get_messagesRead an Instagram conversationRead

Messages in one Instagram conversation, most recent first. 'from' is 'me' (the account owner) or 'them'. message_id values work with instagram_react.

Permission: Read messagesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
chat_idrequiredstring
limitinteger (default 30, 1–100)
cursorstring
freshboolean (default false)
instagram_send_messageSend an Instagram messageWrite

Reply in an existing Instagram direct conversation. Plain text. Show the user the exact text before calling this.

Permission: Send messagesLimit: Messages
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
chat_idrequiredstring
textrequiredstring (max 8000 chars)
instagram_start_chatStart a new Instagram conversationWrite

Send 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.

Permission: Send messagesLimit: New conversations
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
user_idrequiredstringInstagram user id of the recipient
textrequiredstring (max 8000 chars)
instagram_mark_readMark Instagram conversation as readWrite

Marks an Instagram conversation read (or unread).

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
chat_idrequiredstring
readboolean (default true)
instagram_reactReact to a Instagram messageWrite

Add an emoji reaction to a message (message_id from instagram_get_messages). Instagram keeps one reaction per person: a new one replaces yours.

Permission: Send messagesLimit: Inbox updates (mark read, reactions)
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
chat_idrequiredstring
message_idrequiredstring
reactionrequiredstringOne emoji, like 👍 (max 16 chars)
instagram_get_profileGet a Instagram profileRead

A Instagram user's profile: name, username, phone when Instagram shares it, bio, followers and picture. Counts as a profile view.

Permission: ProfilesLimit: Profile views
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
user_idrequiredstringInstagram user id (a chat's person_id) or username
freshboolean (default false)
instagram_list_postsList Instagram postsRead

Posts 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.

Permission: ProfilesLimit: Reads (inbox, invitations, group members, posts list)
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
user_idstringInstagram user id or username; default: the account's own posts
limitinteger (default 10, 1–50)
cursorstringnext_cursor from a previous call
instagram_create_postPublish an Instagram postWrite

Publish 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.

Permission: Send messagesLimit: Posts
accountstringaccount_id of a Instagram account from inbox_list_accounts (a listed chat's account_id). Needed only when several Instagram accounts are connected.
image_urlrequiredstring (uri)https link to the image
textstringCaption (default "", max 2200 chars)

Account & plan5

linkedin_statusLinkedIn account status and limitsRead

Call 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.

Permission: noneLimit: no provider call
accountstringaccount_id from inbox_list_accounts; default: the first LinkedIn account
inbox_statusAccount status and limitsRead

Status 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.

Permission: noneLimit: no provider call
accountstringaccount_id from inbox_list_accounts. Needed only when several accounts are connected.
connect_accountConnect an accountRead

Get 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.

Permission: noneLimit: no provider call
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")
accountstringaccount_id from inbox_list_accounts: the one to reconnect, when several of this network are connected
linkedin_connect_accountConnect a LinkedIn accountRead

Get 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.

Permission: noneLimit: no provider call
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 billingRead

The 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.

Permission: noneLimit: no provider call

ChatGPT deep research2

fetchFetch a LinkedIn recordRead

Fetch a full record by id from search: person:<id> or chat:<id>.

Permission: ProfilesLimit: Profile views
idrequiredstring

Limits

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.

  • Human pace. Profile views, searches, messages, new conversations, invitations and posts are spaced 45–75 seconds apart at random on LinkedIn (10–20 s on the others), across all tools. A call that comes too soon is refused with retry_after_seconds, never queued. To send several messages or invitations, use linkedin_schedule_outreach.
  • Per minute. At most 10 calls a minute per account in total, plus each action's own per-minute cap.
  • Resets. Daily limits reset at midnight UTC; weekly limits on Monday at 00:00 UTC.
  • If the provider pushes back. After a rate-limit answer the account cools down for at least 5 minutes (30 when the provider itself asked). Calls during a cooldown are refused with the time left.
  • Cached reads are free. Reads answered from cache don't count. Pass fresh: true to force a live read.
  • Free vs Premium LinkedIn. Invitation limits depend on the LinkedIn account type, detected when you connect.
ActionPer dayPer weekPacedTools
Reads (inbox, invitations, group members, posts list)3000—0.3 sinbox_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 sinbox_mark_read, linkedin_mark_read, whatsapp_mark_read, whatsapp_react, telegram_mark_read, telegram_react, instagram_mark_read, instagram_react
Profile views80—45–75 slinkedin_get_profile, whatsapp_get_profile, telegram_get_profile, instagram_get_profile, fetch
Searches (pages)40—45–75 slinkedin_search_people, search
Messages75—45–75 sinbox_send_message, linkedin_send_message, whatsapp_send_message, telegram_send_message, instagram_send_message
New conversations25—45–75 sinbox_start_chat, linkedin_start_chat, whatsapp_start_chat, telegram_start_chat, instagram_start_chat
Invitations25 · Premium 80150 · Premium 200
15 with a note (free accounts)
45–75 slinkedin_send_invitation
Posts3—45–75 slinkedin_create_post, instagram_create_post

Invitation notes: up to 300 characters on Premium, 200 on free accounts. Search pages return up to 25 people.

WhatsApp, Telegram and Instagram

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 dayWhatsAppTelegramInstagram
Reads (inbox, invitations, group members, posts list)300030003000
Inbox updates (mark read, reactions)500500500
Profile views505050
Messages10010050
New conversations101010
Posts——3
Spacing10–20 s10–20 s10–20 s

Free trial & pricing

  • 3-day free trial with full limits and 1 connected account per app (one LinkedIn, one WhatsApp…). It starts when you connect your first account. No card needed, and nothing is charged automatically.
  • $10 per month per connected account. One price for every provider, no tiers. Connecting or removing an account updates the price, prorated. Up to 50 accounts.
  • Reminders. We email you the day before the trial ends, and when it has ended.
  • After the trial, the tools pause until you subscribe; they explain why and point to inboxmcp_billing. Unpaid connected accounts are removed 12 hours later; you can connect again anytime.
  • Pay from the chat or the dashboard. 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.
  • Failed payment? Everything keeps working while Stripe retries; update your card to avoid a pause.

Permissions

Chosen on the consent page (OAuth) or when creating an API key. Revoke an app anytime from Connected apps.

PermissionAllowsTools
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

Errors

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.

gapToo soon after the previous action on this account (human pace) or this minute's cap. Wait retry_after_seconds.
limitDaily or weekly limit reached, the action isn't available on this provider, or an invitation note is too long. Resets at midnight UTC / Monday.
cooldownThe provider rate-limited the account; actions resume after the time given.
planFree trial ended or subscription inactive. inboxmcp_billing gives a subscribe link.
accountThe account needs a new login. connect_account gives a reconnect link.
no_accountNo account connected yet. connect_account gives a link.
permissionThis app or API key isn't allowed that action. Reconnect the app with the permission, or use another key.
trial_limit · seat_limit · plan_inactiveconnect_account can't add an account now (the trial includes one account per app, account cap, or no active plan).

Endpoints & auth

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 /mcpMCP server (Streamable HTTP). Auth: OAuth 2.1 access token or an API key, as Authorization: Bearer …
GET /.well-known/oauth-protected-resourceWhich authorization server protects /mcp (clients discover OAuth here).
GET /.well-known/oauth-authorization-serverOAuth 2.1 metadata: endpoints, scopes, PKCE.
GET /authorizeSign-in and consent page: pick the account and the permissions.
POST /oauth/tokenToken endpoint (authorization code with PKCE, refresh tokens).
POST /oauth/registerDynamic client registration, for clients without a client ID metadata document.