nilyo
Connect your LinkedIn, WhatsApp, Instagram, Telegram, email and calendar directly to ChatGPT — so it can search, read and act for you.
Что умеет
- 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,
- 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
- 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
Какие данные видит
Нужен ли аккаунт
Не нужен: сервер работает без входа
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.
Как подключить
Как подключить nilyo к Claude
Адрес сервера, который нужно вставить в настройках Claude:
https://nilyo.run.tools
- Откройте Claude (сайт claude.ai или приложение для компьютера).
- Перейдите в Настройки → Коннекторы (в английском интерфейсе: Settings → Connectors).
- Нажмите Добавить пользовательский коннектор (Add custom connector).
- Вставьте адрес сервера, скопированный ниже, в поле URL удалённого MCP-сервера и нажмите Добавить.
- В чате нажмите + → Коннекторы и включите новый коннектор.
Пользовательские коннекторы доступны на тарифах Free, Pro, Max, Team и Enterprise. На Free можно добавить только один. В Team и Enterprise коннектор сначала добавляет владелец организации в Настройки организации → Коннекторы.
Авторизация
После нажатия Добавить откроется окно входа в сервис. Войдите под своим аккаунтом и подтвердите доступ. Пароль Claude не видит.
Как подключить nilyo к ChatGPT
Адрес сервера, который нужно вставить в настройках ChatGPT:
https://nilyo.run.tools
- Откройте ChatGPT в браузере (chatgpt.com). Нужен тариф Plus, Pro, Business, Enterprise или Edu.
- Один раз включите режим разработчика: Настройки → Приложения → Дополнительные настройки → Режим разработчика (Settings → Apps → Advanced settings → Developer mode).
- Откройте Настройки → Коннекторы и нажмите Создать (Create).
- Заполните форму: Название (любое), Описание (одна фраза, что делает сервис), URL MCP-сервера (скопируйте ниже).
- В поле Аутентификация выберите OAuth, если сервис требует вход, иначе Нет. Нажмите Создать.
- В новом чате откройте + → Приложения/Коннекторы и включите коннектор.
Название раздела у OpenAI менялось (Connectors → Apps/Plugins). Если пункт называется иначе, ищите «режим разработчика» в настройках. В рабочих пространствах Business/Enterprise администратор должен разрешить пользовательские коннекторы.
Авторизация
При первом использовании ChatGPT откроет окно входа в сервис. Войдите и подтвердите доступ.
Как подключить nilyo к Cursor
Адрес сервера, который нужно вставить в настройках Cursor:
https://nilyo.run.tools
Быстрый способ: нажмите кнопку Открыть в Cursor ниже, Cursor сам предложит добавить сервер.
Вручную:
- В Cursor откройте Settings → Cursor Settings → MCP и нажмите Add new global MCP server.
- Вставьте JSON, скопированный ниже, в открывшийся файл
~/.cursor/mcp.json(для одного проекта:.cursor/mcp.jsonв корне проекта). - Сохраните файл. Сервер появится в списке MCP; при необходимости пройдите авторизацию по кнопке рядом с ним.
Авторизация
Если сервис требует вход, рядом с сервером в списке MCP появится кнопка авторизации.
Список инструментов сервера (60)
Технические названия из tools/list. Нужны только разработчикам.
| 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. |