Userport
Userport is customer support and outbound messaging for SaaS founders.
Что умеет
- Userport Workspaces: Every workspace this account can reach, with its handle and the current state of its inbox: how many conversations are open, unread, snoozed, closed and spam, plus how email is se
- Userport Conversations: List or search a workspace's conversations, one view at a time. Returns a short summary per thread — who wrote, the subject, a preview, whether it is unread and whether it is s
- Userport Conversation: Read one conversation end to end: the contact, every message as plain text with markup stripped, and whether a reply can be delivered right now. Read this before replying — the
Какие данные видит
Нужен ли аккаунт
Не нужен: сервер работает без входа
Userport is customer support and outbound messaging for SaaS founders. A chat widget on your site or app, one inbox for chat and email, a help center on your own domain, and onboarding or lifecycle messages by chat or email — all on one record per customer.
Как подключить
Как подключить Userport к Claude
Адрес сервера, который нужно вставить в настройках Claude:
https://userport--userport.run.tools
- Откройте Claude (сайт claude.ai или приложение для компьютера).
- Перейдите в Настройки → Коннекторы (в английском интерфейсе: Settings → Connectors).
- Нажмите Добавить пользовательский коннектор (Add custom connector).
- Вставьте адрес сервера, скопированный ниже, в поле URL удалённого MCP-сервера и нажмите Добавить.
- В чате нажмите + → Коннекторы и включите новый коннектор.
Пользовательские коннекторы доступны на тарифах Free, Pro, Max, Team и Enterprise. На Free можно добавить только один. В Team и Enterprise коннектор сначала добавляет владелец организации в Настройки организации → Коннекторы.
Авторизация
После нажатия Добавить откроется окно входа в сервис. Войдите под своим аккаунтом и подтвердите доступ. Пароль Claude не видит.
Как подключить Userport к ChatGPT
Адрес сервера, который нужно вставить в настройках ChatGPT:
https://userport--userport.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 откроет окно входа в сервис. Войдите и подтвердите доступ.
Как подключить Userport к Cursor
Адрес сервера, который нужно вставить в настройках Cursor:
https://userport--userport.run.tools
Быстрый способ: нажмите кнопку Открыть в Cursor ниже, Cursor сам предложит добавить сервер.
Вручную:
- В Cursor откройте Settings → Cursor Settings → MCP и нажмите Add new global MCP server.
- Вставьте JSON, скопированный ниже, в открывшийся файл
~/.cursor/mcp.json(для одного проекта:.cursor/mcp.jsonв корне проекта). - Сохраните файл. Сервер появится в списке MCP; при необходимости пройдите авторизацию по кнопке рядом с ним.
Авторизация
Если сервис требует вход, рядом с сервером в списке MCP появится кнопка авторизации.
Список инструментов сервера (8)
Технические названия из tools/list. Нужны только разработчикам.
| userport_workspaces | Every workspace this account can reach, with its handle and the current state of its inbox: how many conversations are open, unread, snoozed, closed and spam, plus how email is set up. Call this first — every other tool takes a workspace handle, and handles cannot be guessed. |
| userport_conversations | List or search a workspace's conversations, one view at a time. Returns a short summary per thread — who wrote, the subject, a preview, whether it is unread and whether it is still `awaiting_reply` — plus the count in every view. `awaiting_reply` is the triage field: a thread can be open because nobody closed it and still have been answered. Search covers subjects, the last message preview, and contact names and addresses, not full message bodies. Page with the returned `cursor`. |
| userport_conversation | Read one conversation end to end: the contact, every message as plain text with markup stripped, and whether a reply can be delivered right now. Read this before replying — the list only carries a preview. Messages come newest last; page backwards with `before` when `has_more` is true. A body cut to fit is flagged `truncated`. |
| userport_outbound | Read a workspace's outbound: `view=sequences` (multi-step drips), `view=messages` (standalone one-off sends), or `view=options` (what can be targeted, written and waited on). Without `id` each view is a list; with `id` it returns that one in full, in the same shape userport_outbound_manage takes back — so reading, editing the array and sending it is the way to change a sequence. Bodies are a 160-character preview unless you pass `include=content`, which returns them verbatim for editing. **Call `view=options` before composing any audience rule**: property slugs, tag ids and subscription ids are per-account and a rule built on a guessed slug validates and then matches nobody. |
| userport_outbound_report | Results for one sequence, one standalone message, or the whole workspace, optionally between `since` and `until`. `detail=overview` is who entered, completed, exited and converted plus 30-day deliverability; `detail=steps` is the per-step funnel — reached, sent, delivered, opened, clicked, replied, skipped and where people dropped; `deliveries` and `events` are the raw rows. `preflight` is what a sequence must fix before it can go live and `simulate` walks one contact through it — both write nothing. Counts are distinct people; `rate_basis` says which denominator a rate used (`delivered` on email, `sent` on chat, which has no provider acknowledgement); `ctor` is click-to-open, not clicks over sends. Enrollment counts are lifetime even inside a range — a cursor has no history. |
| userport_reply | Send a message to a customer — either into an existing conversation (`conversation`) or as a new email thread to an address (`email` + `subject`). THIS SENDS IMMEDIATELY: there is no draft, no outbox and no undo, and the recipient is a real person. Read the thread with userport_conversation first, check `can_reply`, and only send text the operator has seen and approved. Requires the write permission. Pass close:true to file the thread once answered. |
| userport_conversation_state | Close, reopen, snooze, flag as spam, or mark a conversation read or unread. Requires the write permission. Closing is the normal end of an answered thread — it reopens by itself if the contact writes back. Nothing here sends anything to the customer; use userport_reply for that. |
| userport_outbound_manage | Author outbound. `action=save` writes a whole document — with `id` it replaces that sequence or message, without one it creates a draft; read it back from userport_outbound first and edit the array you were given, because a save replaces everything and a step missing from `steps` is retired with everyone waiting at it re-pointed. Step identity is `node_id`, never position. Send `contents` (a list of {locale, subject, body, format}), never `content`. `action=state` moves draft/paused → live → paused → stopped; going live needs the preflight clean, every warning listed in `acknowledged`, and the sequence's exact name in `confirm_name`. `action=test` sends one step to your own verified address and nowhere else. `duplicate` and `delete` do what they say. `action=cancel` stops the chat→email fallbacks already queued but not yet sent — pausing or stopping does not, because those are state and this is mail waiting out its five minutes. **Saving never sends anything** — only state=live does. |