目录 / nilyo
nilyo
Connect your LinkedIn, WhatsApp, Instagram, Telegram, email and calendar directly to ChatGPT — so it can search, read and act for you. Reach the right people. Search LinkedIn, find out who you already know at a company, turn a profile link into a conversation, or follow up on WhatsApp. Say “Send Julien a WhatsApp saying I’m running late” and it’s done. Never miss a reply. Use scheduled ChatGPT tasks to check your LinkedIn, WhatsApp and email, summarize what came in, flag conversations that still need an answer and draft the replies for you to review. One agent, all your channels. Research someone on LinkedIn, check your previous emails with them, follow up on WhatsApp, reply to a LinkedIn comment or check your calendar — without leaving the conversation. Catch up on any inbox. Search your LinkedIn network. Read a WhatsApp conversation. Find an email attachment. Check what you last said to someone before replying. Your agent gets the context and account access it needs to actually get things done. No browser automation. No tab switching. Just structured access to your accounts, directly from your agent.
接入信息
- 传输形态
- http
- 鉴权方式
- 鉴权未知
- 端点
https://nilyo.run.tools
{
"mcpServers": {
"nilyo": {
"url": "https://nilyo.run.tools"
}
}
}
能力清单
| 工具 | 说明 |
|---|---|
| agent_capability_guide | Return Nilyo's agent workflow recipes and chaining rules. Use when you need to know how to turn a LinkedIn URL/name into a provider user ID, how to find a chat before replying, how to resolve LinkedIn search parameter IDs, or how to combine several account providers. |
| list_connected_accounts | List the user's own accounts connected to Nilyo with provider, owner display name, identifier (LinkedIn public id, phone, email), connection status and reconnection hints. Use when the user asks what is connected, when several accounts of one provider exist and the user names one ("with Julia's LinkedIn"), or after a choose_account result. Nilyo never guesses between accounts: pick the entry matching what the user said and pass its unipile_account_id as account_id to the action tool. |
| linkedin_get_profile | Get a LinkedIn person's full profile from a LinkedIn provider user ID, public identifier, or linkedin.com/in/... URL using the user's own account. This is the preferred resolver before an action when the user supplied only a profile URL. The result contains the stable user id needed by linkedin_start_conversation and linkedin_send_invitation. Optional sections can retrieve experience, skills, interests and other profile details. |
| linkedin_search_people | Search LinkedIn Classic people with the user's own LinkedIn account. Use to find a person/provider user ID from a name, title, employer, location, industry, keywords or network distance. When the next requested action is message/invitation, take the chosen result's id and pass it to the action tool; never pass a profile URL directly to an action requiring user_id. Some filters require IDs; resolve them first with linkedin_get_search_parameters. |
| linkedin_sales_navigator_search_people | Search LinkedIn Sales Navigator leads using the user's own Sales Navigator-capable LinkedIn account. Use for advanced prospecting intent such as lead lists, seniority, years of experience, current/past company, geography, function and saved-search criteria. Resolve human filter names to LinkedIn IDs with linkedin_get_search_parameters(product='sales_navigator') when necessary. |
| linkedin_recruiter_search_people | Search LinkedIn Recruiter candidates using the user's Recruiter-capable account. Use for candidate sourcing, recruiting projects/talent pools and Recruiter-specific filters. Resolve filter IDs with linkedin_get_search_parameters(product='recruiter') when necessary. |
| linkedin_search_from_url | Run a native LinkedIn search from a LinkedIn search URL. Use when the user pastes a linkedin.com/search/results/... URL, Sales Navigator search URL or Recruiter search URL and wants the same filters/results available to the agent. |
| linkedin_get_search_parameters | Resolve human LinkedIn filter values such as a location, company, industry, job function, relation, project, saved search or Sales Navigator list into the provider parameter IDs required by LinkedIn search endpoints. Typical sequence: call this with type + query, then pass the chosen returned id into linkedin_search_people / Sales Navigator / Recruiter search. |
| linkedin_search_companies | Search LinkedIn companies from the user's own account. Use to find a company ID/profile before looking for employees, checking network relationships or performing a people search scoped to that company. |
| linkedin_get_company | Get a LinkedIn company profile by numeric/provider company ID. Use after linkedin_search_companies when full company data is needed. |
| linkedin_search_posts | Search LinkedIn posts using the user's own account. Use to find a post before reading comments, checking reactions or replying. Returns post IDs required by comment/reaction tools. |
| linkedin_search_jobs | Search LinkedIn jobs with the user's own account. Use for job discovery by keywords, title, company, location, seniority, employment status or workplace type. |
| linkedin_list_my_connections | List/search the LinkedIn connections of the account owner. Use for questions such as 'who do I know at this company?', 'find Sarah in my network', introductions, relationship mapping and connection-aware prospecting. This reads the user's personal network rather than a company page. |
| linkedin_list_user_relations | List a LinkedIn user's visible relations by provider user ID. Use when network graph context is requested for a known profile. |
| linkedin_list_followers | List followers of the account owner or a known LinkedIn user. Use user_id='me' for the connected account owner. |
| linkedin_list_following | List LinkedIn users followed by the connected account owner. Prefer user_id='me'; provider availability may restrict following data for other users. |
| linkedin_list_invitations | List pending LinkedIn connection/relation requests sent or received by the account owner. Use before accepting/refusing a received invitation or withdrawing a sent invitation so you have the required request_id. |
| linkedin_send_invitation | Send a LinkedIn connection/relation request from the user's own account. Requires a provider user_id, not a profile URL. If the user supplied a URL or name, FIRST call linkedin_get_profile or linkedin_search_people and use the returned id. Include a note only when explicitly requested or clearly provided by the user. |
| linkedin_accept_invitation | Accept a received LinkedIn connection request. Requires request_id from linkedin_list_invitations(type='received'). |
| linkedin_cancel_or_refuse_invitation | Withdraw a sent LinkedIn invitation or refuse a received invitation. First list the relevant invitations to obtain request_id unless it is already known. |
| linkedin_list_user_posts | List posts authored by the connected LinkedIn user or a known provider user ID. Use to locate a recent post and obtain its post_id before reading comments/reactions or replying. |
| linkedin_get_post | Get a LinkedIn post by Nilyo/Unipile post_id. Use when you already know a post_id and need full post context. |
| linkedin_create_post | Publish a LinkedIn post from the user's own account, optionally on a managed company page using post_as. This is a public side effect; use only after the user has clearly approved the final content and target identity. |
| linkedin_list_post_comments | List comments on a LinkedIn post. Requires post_id from search/list/get post. Use before deciding which comments need a reply. |
| linkedin_comment_on_post | Publish a comment/reply on a LinkedIn post on behalf of the user. Requires post_id. Use after reading the post/comments and only when the user has asked to publish the final reply. |
| linkedin_list_post_reactions | List people/reactions on a LinkedIn post. Use for engagement analysis or to identify who reacted. |
| linkedin_react_to_post | Add a LinkedIn reaction to a post on behalf of the user. Use a supported LinkedIn reaction value and only when the user's intent to react is clear. |
| linkedin_list_managed_company_pages | List LinkedIn company pages managed by the connected user. Use before publishing as a company page so you can resolve the required post_as company ID. |
| linkedin_get_inmail_credits | Get LinkedIn InMail credit information for the connected account. Use when the user asks whether an InMail can be sent or how many credits remain. |
| linkedin_list_conversations | List LinkedIn private conversations. By default only the Classic primary inbox (CLASSIC_PRIMARY); pass inbox_ids from linkedin_list_inboxes to read other inboxes (archived, spam, Sales Navigator, Recruiter, company pages). Inboxes are read one after another to respect LinkedIn rate limits; unreadable ones are reported with `unavailable` instead of failing. Preserve inbox_id and chat.id. Use before linkedin_read_conversation when chat_id is unknown. |
| linkedin_read_conversation | Read a LinkedIn private conversation plus recent messages. Use before replying so the agent understands prior context, commitments and tone. |
| linkedin_send_message | Send a message in an EXISTING LinkedIn chat. Requires chat_id, normally obtained from linkedin_list_conversations. Use only when the user has clearly asked to send/approved the final text. |
| linkedin_start_conversation | Start a new LinkedIn conversation and send a message. Requires the stable LinkedIn provider user_id. IMPORTANT: if the user gives a LinkedIn URL, name or search criteria, first call linkedin_get_profile or linkedin_search_people, extract the returned user id, then call this tool. Do not put a LinkedIn URL into linkedin_user_id. |
| linkedin_react_to_message | Add a reaction to a specific LinkedIn message. Requires chat_id and message_id, normally discovered by reading the conversation. |
| whatsapp_list_conversations | List WhatsApp chats from the user's own connected WhatsApp account. Use to find a chat_id before reading or sending when the user identifies a conversation by person/name rather than ID. |
| whatsapp_read_conversation | Read a WhatsApp chat and recent message history. Use for context, summaries, follow-up detection and cross-channel workflows before sending a reply. |
| whatsapp_send_message | Send a WhatsApp message in an existing chat from the user's own account. If chat_id is unknown, call whatsapp_list_conversations first. Use only after the final message is explicitly requested/approved. |
| instagram_list_conversations | List Instagram DM conversations from the user's own account. Use to locate a chat before reading/replying. |
| instagram_read_conversation | Read an Instagram DM conversation and recent messages for context, lead qualification or follow-up workflows. |
| instagram_send_message | Send an Instagram DM in an existing conversation from the user's own account. Locate chat_id first if necessary and only send after clear user approval. |
| email_list_messages | List email messages from the user's connected Gmail, Microsoft/Outlook OR generic IMAP mailbox. This is especially useful for IMAP mailboxes not covered by native agent connectors, and for cross-channel workflows that combine email context with LinkedIn/WhatsApp/Instagram. Use to find email_id before opening a message. For totals use email_list_folders (folder.total_count); IMAP pages are capped at 50 and listed live, keep limit small (20). |
| email_read_message | Read a specific email including body/headers from Gmail, Microsoft/Outlook or IMAP. Use after email_list_messages and before a contextual reply or cross-channel decision. |
| email_send | Send or reply to an email from the user's connected Gmail, Microsoft/Outlook or IMAP account. Use reply_to_message_id for a true reply when available. Only send after the user has clearly requested/approved the final recipients and content. |
| linkedin_list_comment_replies | List replies under one exact LinkedIn comment. Chain: resolve post -> post.id -> list comments -> comment.id -> replies. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| linkedin_reply_to_comment | Reply DIRECTLY to one exact LinkedIn comment, not create a new top-level comment. Required chain from human reference: resolve post -> post.id -> list comments -> comment.id -> optionally read replies -> reply. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| whatsapp_list_contacts | List WhatsApp contacts so a human name/phone can be resolved to an exact provider user identity before starting a new chat. Reuse the returned provider user ID; do not pass display name as whatsapp_user_id. |
| whatsapp_start_conversation | Start a new 1-to-1 WhatsApp chat and send the first message. Resolve/verify recipient first with whatsapp_list_contacts or WhatsApp profile/number lookup. whatsapp_user_id must be provider identity, never a contact display name. |
| email_list_folders | List Gmail labels, Outlook folders or IMAP folders. Returned folder.id is required by folder-specific operations. For IMAP this is normally the first step before listing messages. Mailbox folder/label ID: Exact Gmail label, Outlook folder or IMAP folder id. Obtain with: email_list_folders -> folder.id Never pass: human folder name such as Inbox when an ID is required. |
| email_get_folder | Get one exact Gmail/Outlook/IMAP folder. Resolve folder name -> folder.id first. Mailbox folder/label ID: Exact Gmail label, Outlook folder or IMAP folder id. Obtain with: email_list_folders -> folder.id Never pass: human folder name such as Inbox when an ID is required. |
| email_list_folder_messages | List messages inside one exact folder. Especially for IMAP: list folders -> select folder.id -> list messages -> email.id -> read/action. Dates: after/before are ISO 8601 UTC datetimes (YYYY-MM-DDTHH:MM:SS.sssZ); for "today" use after=start of the user's day. Counting: an empty page is not "zero emails" unless no filter was applied; for totals use folder.total_count/unread_count from email_list_folders instead of listing. IMAP pages are capped at 50 live messages; keep limit small (20) to avoid runtime timeouts. Mailbox folder/label ID: Exact Gmail label, Outlook folder or IMAP folder id. Obtain with: email_list_folders -> folder.id Never pass: human folder name such as Inbox when an ID is required. Email provider ID: Exact email ID returned by Nilyo/Unipile for the connected mailbox. On IMAP (and Exchange over IMAP) the ID encodes folder + UID: it CHANGES when the email is moved or a draft is updated; always reuse the id returned by the last operation. Obtain with: email_list_messages or email_list_folder_messages -> email.id; the id returned by email_move_or_label / email_update_draft after a change Never pass: RFC Message-ID unless a tool explicitly documents it, subject, an email_id captured before a move/update on IMAP. |
| email_get_thread | Retrieve full email thread by exact thread_id. Obtain thread_id from email list/read response; do not substitute subject/email_id. Email thread ID: Exact thread/conversation id returned by the email provider when available. Obtain with: email list/read result -> thread_id Never pass: email_id unless equal according to returned data. |
| email_mark_read | Mark one exact email read. Resolve human email reference -> email_id first. Email provider ID: Exact email ID returned by Nilyo/Unipile for the connected mailbox. On IMAP (and Exchange over IMAP) the ID encodes folder + UID: it CHANGES when the email is moved or a draft is updated; always reuse the id returned by the last operation. Obtain with: email_list_messages or email_list_folder_messages -> email.id; the id returned by email_move_or_label / email_update_draft after a change Never pass: RFC Message-ID unless a tool explicitly documents it, subject, an email_id captured before a move/update on IMAP. |
| email_mark_unread | Mark one exact email unread. Resolve email_id first. Email provider ID: Exact email ID returned by Nilyo/Unipile for the connected mailbox. On IMAP (and Exchange over IMAP) the ID encodes folder + UID: it CHANGES when the email is moved or a draft is updated; always reuse the id returned by the last operation. Obtain with: email_list_messages or email_list_folder_messages -> email.id; the id returned by email_move_or_label / email_update_draft after a change Never pass: RFC Message-ID unless a tool explicitly documents it, subject, an email_id captured before a move/update on IMAP. |
| email_move_or_label | Move/label one exact email. The result is the email after the change: on IMAP its id CHANGES (folder+UID), so reuse result.id for any follow-up. Resolve email_id independently, then resolve every human folder name to folder.id. Never put 'Inbox'/'Archive' strings in folders_ids unless the provider actually returned those strings as IDs. Email provider ID: Exact email ID returned by Nilyo/Unipile for the connected mailbox. On IMAP (and Exchange over IMAP) the ID encodes folder + UID: it CHANGES when the email is moved or a draft is updated; always reuse the id returned by the last operation. Obtain with: email_list_messages or email_list_folder_messages -> email.id; the id returned by email_move_or_label / email_update_draft after a change Never pass: RFC Message-ID unless a tool explicitly documents it, subject, an email_id captured before a move/update on IMAP. Mailbox folder/label ID: Exact Gmail label, Outlook folder or IMAP folder id. Obtain with: email_list_folders -> folder.id Never pass: human folder name such as Inbox when an ID is required. |
| email_trash | Trash one exact email. Resolve email_id first; destructive mailbox action. Email provider ID: Exact email ID returned by Nilyo/Unipile for the connected mailbox. On IMAP (and Exchange over IMAP) the ID encodes folder + UID: it CHANGES when the email is moved or a draft is updated; always reuse the id returned by the last operation. Obtain with: email_list_messages or email_list_folder_messages -> email.id; the id returned by email_move_or_label / email_update_draft after a change Never pass: RFC Message-ID unless a tool explicitly documents it, subject, an email_id captured before a move/update on IMAP. |
| email_create_folder | Create a mailbox folder/label. parent_id, when supplied, must be an exact existing folder ID resolved from email_list_folders; it is not a parent folder display name. |
| email_update_folder | Rename/move one existing folder. Resolve folder_id first; parent_id is also an exact folder ID when supplied. Mailbox folder/label ID: Exact Gmail label, Outlook folder or IMAP folder id. Obtain with: email_list_folders -> folder.id Never pass: human folder name such as Inbox when an ID is required. |
| email_delete_folder | Delete one exact mailbox folder/label. Resolve folder_id first and verify target; destructive. Mailbox folder/label ID: Exact Gmail label, Outlook folder or IMAP folder id. Obtain with: email_list_folders -> folder.id Never pass: human folder name such as Inbox when an ID is required. |
| email_list_drafts | List email drafts. Returned draft.id is the draft_id for get/update/send/delete. draft_id is not email_id or subject. |
| email_get_draft | Get one exact draft. draft_id must come from email_list_drafts or email_create_draft; never use subject/email_id. |
| email_create_draft | Create an email draft without sending. If replying, first read the source email and use the provider-appropriate reply_to_message_id (IMAP may use RFC822 Message-ID). |
| email_update_draft | Update an exact existing draft. On IMAP the updated draft gets a NEW draft.id (returned in the result); use it for email_send_draft. without sending. Resolve/read draft first when preserving recipients/content matters. |
| email_send_draft | Send one exact existing draft. Resolve draft_id and inspect final recipients/content first when not already explicitly approved; this creates a real external send. |
| email_delete_draft | Discard one exact draft. draft_id comes from draft list/create; destructive. |
| email_list_contacts | List Gmail/Microsoft contacts to resolve a human recipient name to an email address before composing. Generic IMAP normally has no provider contact directory; use mailbox context instead. |
| linkedin_list_contracts | List LinkedIn premium contracts available on the user's account. Returned contract.id is the ONLY value to pass as contract_id to linkedin_select_contract. contract_id is distinct from inbox_id. LinkedIn premium contract ID: Exact Sales Navigator/Recruiter contract id. Obtain with: linkedin_list_contracts -> contract.id Never pass: inbox_id, product name. Inbox ID: Provider inbox/product inbox identifier. LinkedIn Classic may use CLASSIC; premium products expose their own inbox IDs. Obtain with: linkedin_list_inboxes -> inbox.id Never pass: contract_id unless returned as the inbox id, guessing SALES_NAVIGATOR or RECRUITER. |
| linkedin_select_contract | Select a LinkedIn Sales Navigator/Recruiter premium contract. First call linkedin_list_contracts and reuse exact contract.id. Do not pass product name or inbox_id. LinkedIn premium contract ID: Exact Sales Navigator/Recruiter contract id. Obtain with: linkedin_list_contracts -> contract.id Never pass: inbox_id, product name. |
| linkedin_list_job_postings | List LinkedIn job postings OWNED by the user's account. Use this to resolve job_posting_id for management/budget operations. This differs from linkedin_search_jobs, which discovers jobs across LinkedIn. |
| linkedin_get_job_posting | Get one job posting owned by the user's LinkedIn account. job_posting_id MUST come from linkedin_list_job_postings, not a title/company or an unrelated discovery result. LinkedIn job ID: Exact LinkedIn job/job-posting ID returned by the corresponding search/list endpoint. Obtain with: linkedin_search_jobs -> result.id for discovery; linkedin_list_job_postings -> result.id for jobs owned by the account Never pass: job title, company ID. |
| social_update_post | Edit an existing supported social post. Resolve the exact post first, then reuse post.id. Never infer an ID from post text or author. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. |
| social_delete_post | Delete an exact supported social post. Resolve/verify post_id first. Destructive: explicit deletion intent required. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. |
| social_update_comment | Edit an existing comment. Required chain when starting from human text: resolve post -> post.id -> list comments -> comment.id -> edit. post_id and comment_id are different ID namespaces. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| social_delete_comment | Delete one exact comment. Resolve post_id then comment_id; never use comment text as ID. Destructive. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| social_list_comment_reactions | List detailed reactions on an exact comment. First resolve post_id, then list comments and select comment.id. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| social_react_to_comment | React to one exact comment. Resolve post -> comment before acting. Do not confuse post_id and comment_id. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| social_remove_comment_reaction | Remove the user's reaction from one exact comment. Resolve post_id/comment_id first. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| social_remove_post_reaction | Remove the user's reaction from one exact post. Resolve post_id first; never use post URL/text unless another resolver explicitly converts it. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. |
| message_get | Get one exact message. BOTH chat_id and message_id are required because V2 message identity is contextual to its chat. If starting from a person/topic, resolve chat first, list messages, then reuse both IDs. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| message_mark_read | Mark one exact message read. Resolve chat_id then message_id; do not pass person/user ID as chat_id. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| message_edit | Edit one previously sent message where supported. Recommended chain: resolve chat -> list messages -> message_get -> edit. Keep exact chat_id + message_id pair. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| message_delete | Delete one exact message. Resolve and verify chat/message first; destructive. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| message_forward | Forward an existing message to another EXISTING chat. Resolve source chat + message and destination chat independently. target_chat_id is a chat ID, never recipient user_id/name. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| message_list_reactions | List detailed reactions on one exact message. Preserve its chat_id + message_id pair. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| message_add_reaction | Add an emoji reaction to one exact WhatsApp, Instagram, Telegram or LinkedIn message (e.g. 👍, ❤️). Resolve chat/message first; keep chat_id + message_id paired. Use message_remove_reaction to withdraw it. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| message_remove_reaction | Remove the user's reaction from one exact message. Resolve chat/message first. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. Message ID: Exact message id inside a specific chat. In V2 always keep chat_id together with message_id because providers may only guarantee uniqueness inside the chat. Obtain with: provider read/list conversation messages -> message.id Never pass: message text, chat_id, message ID without its chat context for mutation tools. |
| chat_list_participants | List members of an exact group/multi-party chat. Resolve chat_id first. Returned participant user IDs can be reused for membership operations; they are NOT chat IDs. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. |
| chat_add_participant | Add an exact provider user to an exact group chat. Resolve chat_id independently from user_id. For LinkedIn user references, URL/name -> profile resolver -> profile.id. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. LinkedIn system user ID: Stable LinkedIn/Unipile user id, commonly ACo... for Classic profiles. Obtain with: linkedin_get_profile_from_url(profile_url) -> result.id; linkedin_get_profile(user_id_or_public_identifier) -> result.id; linkedin_search_people(...) -> selected result.id Never pass: full linkedin.com/in/... URL, person name, company ID. |
| chat_remove_participant | Remove an exact provider user from an exact group chat. Inspect participants first when identity is ambiguous. chat_id and user_id are separate. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. |
| chat_update | Update mutable metadata of an exact chat. Resolve chat_id first; do not use person/user ID. Pass only fields explicitly requested. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. |
| chat_delete | Delete/remove one exact chat where supported. Resolve/verify chat_id first; destructive. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. |
| email_get_attachment | Retrieve one exact attachment from Gmail, Outlook/Microsoft or IMAP. Required chain: resolve/list email -> email_id -> read email -> attachment.id -> retrieve. Filename is NOT attachment_id. Email provider ID: Exact email ID returned by Nilyo/Unipile for the connected mailbox. On IMAP (and Exchange over IMAP) the ID encodes folder + UID: it CHANGES when the email is moved or a draft is updated; always reuse the id returned by the last operation. Obtain with: email_list_messages or email_list_folder_messages -> email.id; the id returned by email_move_or_label / email_update_draft after a change Never pass: RFC Message-ID unless a tool explicitly documents it, subject, an email_id captured before a move/update on IMAP. Attachment ID: Exact attachment id returned inside a specific email/message. Obtain with: read the parent email/message first -> attachment.id Never pass: filename, URL. |
| linkedin_get_my_profile | Get the profile of the owner of the connected LinkedIn account. Use for 'my LinkedIn profile', identity/context, or before actions that need the account owner's provider user ID. |
| linkedin_visit_profile | Report a LinkedIn profile visit using notify_visit_token returned by the resolved profile. The token is provider-issued and must not be replaced with user_id, profile URL or public identifier. |
| linkedin_update_my_profile | Update supported fields of the user's own LinkedIn profile. Only pass fields explicitly requested by the user; provider support varies by field. |
| linkedin_remove_connection | Remove an existing LinkedIn relation/connection. Resolve the exact provider user_id first. This changes the user's network and requires explicit intent. |
| linkedin_follow_user | Follow a LinkedIn user from the connected personal account. Resolve the exact provider user_id first. |
| linkedin_unfollow_user | Unfollow a LinkedIn user from the connected account. Resolve the exact provider user_id first. |
| linkedin_endorse_skill | Endorse one skill on a LinkedIn relation. Resolve member_id first, fetch that profile with linkedin_skills, and reuse the exact returned endorsement skill_id; never pass a skill name. |
| linkedin_get_job_posting_budget | Get budget/pricing information for a LinkedIn Classic job posting owned by the connected account. Resolve job_id with linkedin_list_job_postings first. |
| linkedin_list_inboxes | List LinkedIn messaging inboxes for Classic, Sales Navigator and Recruiter. Use before listing inbox chats or starting Sales Navigator/Recruiter conversations; premium products require the appropriate primary inbox. |
| linkedin_list_inbox_chats | List chats from a specific LinkedIn inbox. Prefer this over generic chat listing for LinkedIn V2 and premium Sales Navigator/Recruiter inboxes. Get inbox_id from linkedin_list_inboxes. |
| linkedin_start_conversation_from_inbox | Start a LinkedIn Classic, Sales Navigator or Recruiter conversation from an explicit inbox. Resolve recipient user IDs first and obtain inbox_id with linkedin_list_inboxes. For Sales Navigator include the required subject in specifics; Recruiter may require subject and signature. Supports one-to-one or group recipients and attachments. |
| messaging_find_chat_by_user | Find the existing one-to-one chat for a known LinkedIn, WhatsApp, Instagram or Telegram provider user ID. Use after resolving the user; user_id is not chat_id. |
| messaging_list_chats | List chats for WhatsApp, Instagram or Telegram. Exposes V2 pagination and filters: type, before/after, archived and unread. LinkedIn requires inbox-specific listing. |
| messaging_list_messages | List messages in a known chat with full V2 filters/pagination. Message IDs are scoped to their chat: keep chat_id for any later get/edit/delete/forward/reaction action. |
| messaging_send_message | Send a message in an existing LinkedIn, WhatsApp, Instagram or Telegram chat. Supports text, base64 file attachments and provider-specific options. Locate/read the chat first if chat_id is not already known. This is a real external send action. |
| messaging_start_chat | Start a new WhatsApp, Instagram or Telegram one-to-one/group chat by sending its first message. Resolve users_ids first. A string starts 1-to-1; an array requests a group. LinkedIn requires the inbox-specific start tool. |
| messaging_set_chat_state | Update supported chat state such as read/unread, archive/pin, label or mute metadata. Only send fields explicitly requested. |
| messaging_set_presence | Set the connected messaging account presence where the provider supports it (LinkedIn Classic, WhatsApp, Telegram). Use only for an explicit presence request. |
| messaging_set_composing | Publish a typing or voice-recording composing signal in a known chat where supported (LinkedIn Classic and WhatsApp). This is ephemeral provider state; use only when an agent workflow explicitly needs it. |
| whatsapp_is_number_registered | Check whether a phone number corresponds to a WhatsApp user/account before starting outreach or resolving a WhatsApp recipient. Pass the number in international form. |
| whatsapp_get_profile | Retrieve a WhatsApp user profile by provider user ID or supported phone-number identifier. Use to resolve/verify the recipient before a new chat. |
| instagram_get_my_profile | Get the profile of the owner of the connected Instagram account. |
| instagram_get_profile | Get an Instagram user profile by provider user ID/username where supported. Use before follow/unfollow or identity-sensitive actions. |
| instagram_update_my_profile | Update supported fields on the user's own Instagram profile. Only pass fields explicitly requested; availability is provider-dependent. |
| instagram_list_followers | List followers of the connected Instagram account or a known Instagram user where supported. |
| instagram_list_following | List Instagram accounts followed by the connected account/user where supported. |
| calendar_list_calendars | List calendars for the connected Google or Microsoft account. Use the returned calendar.id before listing, creating or updating events; never pass a calendar display name as calendar_id. |
| calendar_create_calendar | Create a calendar in the selected Google or Microsoft account. Use only when the user explicitly asks for a new calendar, not merely an event. |
| calendar_get_calendar | Get one calendar by the exact ID returned by calendar_list_calendars. Calendar ID: Exact Google/Microsoft calendar id. Obtain with: calendar_list -> calendar.id Never pass: calendar display name. |
| calendar_update_calendar | Update explicit fields on an existing calendar. Resolve calendar_id first and pass only changes requested by the user. |
| calendar_delete_calendar | Delete one exact calendar. This is destructive: resolve and confirm the calendar before deleting it; never infer calendar_id from its display name. |
| calendar_list_events | List or search events inside one resolved calendar. Use this to obtain event.id before reading, updating or deleting an event. |
| calendar_create_event | Create an event in one resolved calendar. Require an explicit title, attendees array, start and end; preserve timezone and all-day semantics instead of guessing them. |
| calendar_get_event | Get one event using both its exact parent calendar_id and event_id. Never identify an event only by title or date. |
| calendar_update_event | Update explicit fields on a resolved event. Keep event_id paired with the parent calendar_id and do not blindly retry after an ambiguous failure. |
| calendar_delete_event | Delete one resolved calendar event. Confirm the intended event and preserve its parent calendar_id; this removes it only from the connected account's calendar. |
| calendar_rsvp_event | Accept, tentatively accept or decline an invitation for the connected account only. Resolve the event first; Outlook organizers cannot RSVP and declining can remove the event from their calendar. |
| calendar_cancel_event | Cancel an event organized by the connected account and notify attendees. This differs from deleting an event only from the user's calendar; confirm the exact event before cancellation. |
| calendar_restore_event | Restore an event previously cancelled by the connected organizer. Available only for Google Calendar while Google still retains the cancelled event; report the provider error for Outlook without substituting another action. |
| agent_id_guide | Return the authoritative Nilyo ID semantics guide. Use this when unsure whether a tool needs a LinkedIn system user ID, public identifier, request ID, post/comment/chat/message ID, inbox/contract ID, email/thread/folder/attachment ID, calendar/event ID or recruiting/list ID. The guide explains exactly which previous tool produces each ID and which lookalike values must NOT be passed. |
| linkedin_get_profile_from_url | Resolve a full LinkedIn person profile URL into the real LinkedIn profile and stable system user ID required by downstream actions. Example: https://www.linkedin.com/in/john-doe-123/?trk=foo -> extract ONLY 'john-doe-123' from the /in/{public_identifier}/ pathname, ignore query parameters/fragments/trailing slash, call Get User Profile, and return the profile including result.id. Use result.id for connection requests, new conversations and other actions requiring user_id. Never pass the full URL to those action tools. LinkedIn system user ID: Stable LinkedIn/Unipile user id, commonly ACo... for Classic profiles. Obtain with: linkedin_get_profile_from_url(profile_url) -> result.id; linkedin_get_profile(user_id_or_public_identifier) -> result.id; linkedin_search_people(...) -> selected result.id Never pass: full linkedin.com/in/... URL, person name, company ID. LinkedIn public identifier: Slug after /in/ in a LinkedIn profile URL. Example https://www.linkedin.com/in/john-doe/?trk=x -> john-doe. Obtain with: extract only pathname segment immediately after /in/; ignore query string, fragment and trailing slash Never pass: full URL, ACo system ID when a public identifier is specifically required. |
| linkedin_resolve_person | Resolve a human description (name, role, employer, location keywords) to LinkedIn people and their stable system IDs before an action. Use when the user says 'message Sarah at Acme' or 'connect with the CTO of X' rather than providing an ID. If multiple plausible results remain, show/disambiguate them before any write. LinkedIn system user ID: Stable LinkedIn/Unipile user id, commonly ACo... for Classic profiles. Obtain with: linkedin_get_profile_from_url(profile_url) -> result.id; linkedin_get_profile(user_id_or_public_identifier) -> result.id; linkedin_search_people(...) -> selected result.id Never pass: full linkedin.com/in/... URL, person name, company ID. |
| linkedin_resolve_company | Resolve a human company name to LinkedIn company results and exact company IDs. Use before employee searches, company profile reads or company mentions. LinkedIn company mentions require the numeric company ID; the slug from /company/google/ is not sufficient. LinkedIn company ID: Provider numeric/company ID. For mentions LinkedIn requires numeric company ID, not the company URL slug. Obtain with: linkedin_search_companies -> selected result.id; linkedin_get_company after resolving a company Never pass: linkedin.com/company/google URL, company slug such as google, company name. |
| linkedin_resolve_my_post | Resolve a user's description such as 'my latest post' into exact post IDs before comments/reactions/edit/delete. Returns the account owner's posts; choose the matching post and reuse result.id. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. |
| social_resolve_comment | List comments for an already-resolved post so the agent can map a human reference such as 'the comment from Sarah' to exact comment_id before replying/reacting/editing/deleting. First resolve post_id. Post ID: Exact provider/Unipile post id; LinkedIn commonly uses a preformatted/base64-style post ID. Obtain with: linkedin_search_posts -> result.id; linkedin_list_user_posts -> result.id; instagram_list_user_posts -> result.id Never pass: post text, author user ID, URL unless a resolver tool explicitly accepts it. Comment ID: Exact comment id scoped to the identified post. Obtain with: linkedin_list_post_comments(post_id) -> comment.id; instagram_list_post_comments(post_id) -> comment.id Never pass: comment text, post_id. |
| message_resolve_chat | List/search conversations so a human recipient/topic can be mapped to exact chat_id before reading/replying or resolving message_id. Do not use a person name as chat_id. For LinkedIn use linkedin_list_inboxes then linkedin_list_inbox_chats because account-wide chat listing is not supported. Chat ID: Exact provider chat/conversation ID. LinkedIn chat IDs may also be visible in /messaging/thread/{chat_id}/ URLs. Obtain with: provider list conversations/inbox chats -> chat.id Never pass: person name, user_id, message_id. |
| email_resolve_message | Search/list email candidates so a human reference such as sender, recipient, subject or date can be mapped to exact email_id before read/reply/trash/move/attachment operations. For generic IMAP, if account-wide listing is unavailable, use email_list_folders then email_list_folder_messages instead. Email provider ID: Exact email ID returned by Nilyo/Unipile for the connected mailbox. On IMAP (and Exchange over IMAP) the ID encodes folder + UID: it CHANGES when the email is moved or a draft is updated; always reuse the id returned by the last operation. Obtain with: email_list_messages or email_list_folder_messages -> email.id; the id returned by email_move_or_label / email_update_draft after a change Never pass: RFC Message-ID unless a tool explicitly documents it, subject, an email_id captured before a move/update on IMAP. Email reply reference: For Gmail/Outlook normally use the provider email id. For generic IMAP, reply_to_message_id may be the RFC822 Message-ID returned in the email data. Obtain with: email_read_message -> inspect id and provider/RFC Message-ID fields Never pass: subject, sender email address. Email thread ID: Exact thread/conversation id returned by the email provider when available. Obtain with: email list/read result -> thread_id Never pass: email_id unless equal according to returned data. |
| email_resolve_folder | List mailbox folders/labels to map human names such as Inbox, Archive, Junk or a custom folder to exact folder_id before moving/labeling or listing folder messages. This is especially important for IMAP. Mailbox folder/label ID: Exact Gmail label, Outlook folder or IMAP folder id. Obtain with: email_list_folders -> folder.id Never pass: human folder name such as Inbox when an ID is required. |
| linkedin_classic_list_job_applicants | List applicants for a LinkedIn Classic job owned by the connected account. Resolve the exact Classic job_id first. Filters are passed as V2 applicant filters (for example ratings/experience) and must use provider enums/IDs rather than guessed display values. |
| linkedin_classic_get_job_applicant | Get one applicant to a LinkedIn Classic job. Required chain: owned Classic job -> job_id -> list applicants -> applicant.id -> this tool. |
| linkedin_classic_get_applicant_resume | Download/retrieve the resume of one applicant to a LinkedIn Classic job. Never infer applicant_id from name; list applicants first and reuse exact applicant.id. |
| linkedin_recruiter_list_applicants | List applicants from a LinkedIn Recruiter Hiring Project talent pool. Resolve project_id first. Recruiter applicants are project-scoped; never substitute a Classic job_id for project_id. |
| linkedin_recruiter_get_applicant | Get one Recruiter applicant. Required chain: list/select Hiring Project -> project.id -> list applicants -> applicant.id. applicant_id is scoped to the selected project context. |
| linkedin_recruiter_get_applicant_resume | Retrieve a Recruiter applicant resume. Resolve exact project_id and applicant_id first; never use candidate name or LinkedIn URL as applicant_id. |
| linkedin_verify_company_member_email | Start LinkedIn company-member identity verification when a job/company action fails with insufficient permissions. Resolve company_id first and submit the actual verification email. Preserve the returned challenge_id for linkedin_submit_company_member_otp. |
| linkedin_submit_company_member_otp | Complete LinkedIn company-member verification. Reuse the same email and exact challenge_id returned by linkedin_verify_company_member_email, and submit only the real user-provided code; never invent or loop over codes. |
| message_send_voice_note | Send an audio attachment as a native/playable voice note where the connected provider supports it (notably WhatsApp/Telegram). Resolve chat_id first. Provide base64 content + exact MIME type/filename. Do not send the same voice note repeatedly after an uncertain timeout; read chat state first. |
| message_send_native_media | Send one media/file attachment using the provider's native rendering mode where supported. Resolve chat_id first. Useful for inline image/video/native media; for WhatsApp multiple attachments may become separate provider messages, so this tool intentionally sends one attachment per call for predictable behavior. |
| webhook_list_available_events | List realtime Unipile V2 event types Nilyo can subscribe an agent to, plus the common event envelope. Use this before creating a destination if the user's requested trigger is ambiguous. |
| webhook_get_setup_guide | Get runtime-specific instructions for receiving Unipile realtime events in n8n, OpenClaw, Hermes, Make or a generic agent. Use BEFORE creating the webhook when the user has not yet produced a public receiver URL. |
| webhook_create_destination | Create a realtime event destination for this Nilyo user. Nilyo uses its global Unipile control-plane key server-side but ALWAYS restricts the Unipile endpoint to account IDs owned by this authenticated user. By default matching future accounts are automatically added. For n8n use its Test URL first, validate with a Development/Mock event, then update to Production URL. |
| webhook_list_destinations | List webhook destinations created by this Nilyo user. These are control-plane records; realtime traffic flows directly Unipile -> destination, not through Nilyo. |
| webhook_get_destination | Get one Nilyo-owned webhook destination and its configured events/provider/account selection. |
| webhook_update_destination | Update a webhook destination URL, events or provider/account selection. Common n8n chain: create with Test URL -> receive mock event -> update same destination to Production URL. Nilyo recomputes authorized account_ids server-side. |
| webhook_delete_destination | Delete an Nilyo-owned Unipile webhook endpoint. This stops future realtime delivery to that destination; require explicit user intent. |
| webhook_get_delivery_logs | Inspect recent Unipile webhook delivery conversations for this destination. Use when an agent/n8n receiver did not wake or a test event was not observed. This is preferred to guessing whether delivery occurred. |
| webhook_test_destination | Return the exact test procedure for a destination. In a Unipile Development Application, use Mock accounts/Test & Debug to generate a real fake event, then inspect webhook_get_delivery_logs and the target runtime. Nilyo does not fabricate provider event payloads because the Unipile mock event is the source of truth. |
| account_connect | Get a secure connection (or reconnection) link for one of the user's provider accounts: LinkedIn, WhatsApp, Instagram, Telegram, Google/Gmail, Microsoft/Outlook or generic IMAP email. Use when the user asks to connect/add/reconnect an account, or after a connect_account/reconnect_account result. Pass account_id only to re-authenticate an existing disconnected account (from list_connected_accounts). For WhatsApp and Telegram prefer whatsapp_connect / telegram_connect, which show the QR code directly in the conversation; this tool is the browser fallback. Never ask the user for provider passwords; the link opens the provider's own authentication. |
| whatsapp_connect | Connect or reconnect the user's WhatsApp account directly in the conversation without leaving the agent. Default mode returns a QR code image to scan from WhatsApp > Linked devices; with phone_number it returns a pairing code to type on the phone instead (useful when the QR image cannot be displayed). Then poll account_connection_status until connected. Requires an active trial/subscription and a free WhatsApp slot on the plan; otherwise the result explains the upgrade. Use account_id to re-authenticate an existing disconnected WhatsApp account. |
| telegram_connect | Connect or reconnect the user's Telegram account directly in the conversation: returns a QR code image to scan from Telegram > Settings > Devices > Link Desktop Device, then poll account_connection_status until connected. Accounts protected by a Telegram cloud password (2FA) must use the browser link returned by account_connect instead. Use account_id to re-authenticate an existing disconnected Telegram account. |
| imap_connect | Connect a generic IMAP/SMTP mailbox directly from the conversation with the mailbox credentials (alternative to the account_connect browser link, which is preferred when the user does not want to type a password in the chat). Nilyo forwards the credentials once to the connection service and never stores them. Start with user + password only (servers are auto-detected); if the result says the IMAP or SMTP configuration is invalid, ask the user for the servers (e.g. OVH: imap ssl0.ovh.net:993 ssl, smtp ssl0.ovh.net:465 ssl; Gmail/Microsoft mailboxes should use the Google/Outlook connection instead). Use account_id to re-authenticate an existing disconnected IMAP account. |
| account_connection_status | Check an in-conversation WhatsApp/Telegram connection started with whatsapp_connect or telegram_connect. Returns pending (with the current QR code image or pairing code, refreshed when it changed), connected, expired or failed. Poll every 10-20 seconds until the status is connected, then retry the user's original request. Omit intent_id to check the most recent attempt. |
| account_list_attention | List the user's connected accounts that currently need re-authentication (status disconnected) so the agent can proactively offer to reconnect them before a request fails. Returns an empty list when everything is healthy. |
| account_get_subscription | Show the user's Nilyo plan, trial/subscription status, account limits, team seats and members, plus the available billing actions (subscribe, upgrade, add seats, invite). Use when the user asks about their plan, trial, price, seats, team, why an action is blocked, or before proposing an upgrade. Never exposes payment details. |
| account_start_subscription | Return Stripe Checkout links (one-click hosted payment, no need to visit the website) to start or restore the paid subscription when the user is on trial, the trial expired or the subscription lapsed. Use after a subscribe result or when the user asks to subscribe/pay/upgrade before having a subscription. If the user already has an active Stripe subscription, use account_change_plan instead. Present monthly and annual options; default to the current plan unless the user chose another one. |
| account_change_plan | Change the user's plan (Personal, Personal Plus, Team) or billing interval. During the trial the choice is free and applies immediately. With an active Stripe subscription the change is prorated immediately on the saved payment method: FIRST call without confirm to get the price and the explanation (and a one-click Stripe confirmation link), show them to the user, and only call again with confirm=true after explicit approval. Use when a second account of a provider needs Personal Plus, when the user wants Team for colleagues, or asks to switch monthly/annual. |
| team_invite_member | Invite a colleague to the user's Team workspace by email. Each member gets a separate login, isolated provider Scope and their own connected accounts; the team only centralizes billing and seats. Only team owners/admins can invite. When no seat is free, the result explains how to add a paid seat (team_add_seats). If the user is not on Team, propose account_change_plan(plan='team'). |
| team_add_seats | Add (or reduce) paid extra seats on the Team subscription so more colleagues can be invited. Billing owner only; prorated immediately on the saved payment method. FIRST call without confirm to get the price and a one-click Stripe confirmation link, then call with confirm=true after the user approves. extra_seats is the ADDED number of seats relative to the current paid extra seats (use 1 to add one seat). |
| messaging_resolve_recipient | Turn a person's name, nickname, phone number or handle into the exact WhatsApp/Instagram/Telegram recipient BEFORE sending: searches the user's 1-to-1 chats (ranked by most recent exchange) and contacts. Returns resolved (one clear match: send immediately with the recommended next tool, no extra confirmation needed when the user already gave the message), ambiguous (several people: ask which one, most recent conversation first) or not_found. Use for 'send a WhatsApp to Julien', 'reply to Marie on Instagram', 'message +33 6…'. Never pass a name as chat_id or user_id. |
| messaging_send_to_contact | One-step send for voice-style requests: 'send a WhatsApp to Julien saying I'm 10 minutes late'. Resolves the recipient like messaging_resolve_recipient and sends the text ONLY when exactly one person matches (existing conversation or contact). When several people match, nothing is sent and the candidates are returned so you can ask the user which one. The user must have stated the message content; do not invent it. |
| feedback_report_bug | Report a bug to the Nilyo team as a tracked issue. Use after a tool failed unexpectedly (TOOL_FAILED, wrong or empty result, broken flow) and the user agrees to report it; also when the user says 'ça ne marche pas' / 'report this'. Include the exact error code and details from the failing result so engineers can reproduce. Never include credentials, message bodies or third-party personal data. Ask the user for consent first (user_consent=true). |
| feedback_request_feature | Send a feature request or improvement idea to the Nilyo team as a tracked issue: a missing action, provider or capability, a workflow that needs too many steps, a confusing result. Use when the user asks for something Nilyo cannot do yet, or explicitly wants to suggest an improvement, and agrees to send it. Describe the user's goal and why current tools fall short. Ask the user for consent first (user_consent=true). |
提交举报 / 纠错
侵权举报经核验成立后,我们会即时下线该条目并删除已存的内容副本。