dutify-hub-mcp

Dutify Hub: доступ к записям встреч, транскриптам и сводкам звонков через ассистента

От сообщества: Добавлен пользователем или импортирован; проверьте владельца перед подключениемРаботаетБез входаГлобальныйБесплатноМожет изменять данные

Что умеет

  • Искать и считать звонки по рабочему пространству
  • Получать ссылки на аудио, видео и превью записи
  • Пересобирать и регенерировать сводку звонка
  • Настраивать предпочитаемую интеграцию и рабочее пространство по умолчанию
  • Смотреть список участников и интеграций рабочего пространства

Какие данные видит

Ассистент работает в рамках рабочего пространства, привязанного к API-ключу Dutify Hub пользователя.

Нужен ли аккаунт

Не нужен: сервер работает без входа

MCP-сервер подключает Dutify Hub — сервис записи встреч, транскриптов и авто-сводок звонков. Ассистент может искать и просматривать звонки, получать ссылки на аудио и видео, пересобирать сводки и отправлять пункты действий в Jira, ClickUp или Airtable. Доступ по API-ключу Hub (dh_live), который отличается от ключей продуктового модуля Dutify PM.

Как подключить

Как подключить dutify-hub-mcp к Claude

Адрес сервера, который нужно вставить в настройках Claude:

https://dutify-hub-mcp--dutify.run.tools

  1. Откройте Claude (сайт claude.ai или приложение для компьютера).
  2. Перейдите в Настройки → Коннекторы (в английском интерфейсе: Settings → Connectors).
  3. Нажмите Добавить пользовательский коннектор (Add custom connector).
  4. Вставьте адрес сервера, скопированный ниже, в поле URL удалённого MCP-сервера и нажмите Добавить.
  5. В чате нажмите + → Коннекторы и включите новый коннектор.

Пользовательские коннекторы доступны на тарифах Free, Pro, Max, Team и Enterprise. На Free можно добавить только один. В Team и Enterprise коннектор сначала добавляет владелец организации в Настройки организации → Коннекторы.

Авторизация

После нажатия Добавить откроется окно входа в сервис. Войдите под своим аккаунтом и подтвердите доступ. Пароль Claude не видит.

Как подключить dutify-hub-mcp к ChatGPT

Адрес сервера, который нужно вставить в настройках ChatGPT:

https://dutify-hub-mcp--dutify.run.tools

  1. Откройте ChatGPT в браузере (chatgpt.com). Нужен тариф Plus, Pro, Business, Enterprise или Edu.
  2. Один раз включите режим разработчика: Настройки → Приложения → Дополнительные настройки → Режим разработчика (Settings → Apps → Advanced settings → Developer mode).
  3. Откройте Настройки → Коннекторы и нажмите Создать (Create).
  4. Заполните форму: Название (любое), Описание (одна фраза, что делает сервис), URL MCP-сервера (скопируйте ниже).
  5. В поле Аутентификация выберите OAuth, если сервис требует вход, иначе Нет. Нажмите Создать.
  6. В новом чате откройте + → Приложения/Коннекторы и включите коннектор.

Название раздела у OpenAI менялось (Connectors → Apps/Plugins). Если пункт называется иначе, ищите «режим разработчика» в настройках. В рабочих пространствах Business/Enterprise администратор должен разрешить пользовательские коннекторы.

Авторизация

При первом использовании ChatGPT откроет окно входа в сервис. Войдите и подтвердите доступ.

Как подключить dutify-hub-mcp к Cursor

Адрес сервера, который нужно вставить в настройках Cursor:

https://dutify-hub-mcp--dutify.run.tools

Быстрый способ: нажмите кнопку Открыть в Cursor ниже, Cursor сам предложит добавить сервер.

Вручную:

  1. В Cursor откройте Settings → Cursor Settings → MCP и нажмите Add new global MCP server.
  2. Вставьте JSON, скопированный ниже, в открывшийся файл ~/.cursor/mcp.json (для одного проекта: .cursor/mcp.json в корне проекта).
  3. Сохраните файл. Сервер появится в списке MCP; при необходимости пройдите авторизацию по кнопке рядом с ним.

Авторизация

Если сервис требует вход, рядом с сервером в списке MCP появится кнопка авторизации.

Список инструментов сервера (36)

Технические названия из tools/list. Нужны только разработчикам.

whoamiVerify the API key with a fresh Hub workspace listing and return its bound workspace. Requires workspaces:read. Does not require X-Dutify-Workspace.
list_accountsList the accounts configured for this MCP session. Returns one entry per account with `name` (the label the caller passes as the `account` tool argument) and `workspace` (the workspace UUID or name declared for that account). API keys are never returned. In single-account mode (X-API-Key with optional X-Dutify-Workspace) returns a single entry with name="default". In multi-account mode (X-Dutify-Accounts header) returns every configured account. Call this first when you do not know which account names are available.
find_my_workspaceReturn the workspace this API key is bound to from Hub's filtered workspace listing. Requires only workspaces:read; no integration or member probes. Cached for five minutes. X-Dutify-Workspace is optional; workspace tools discover it automatically.
list_workspacesList the workspace visible to this API key. IMPORTANT: an API key is bound to EXACTLY ONE of these workspaces; only that one will accept requests. You cannot switch between workspaces within a session — to act on a different workspace, the user must provision a separate API key for it. The `bound` field on each entry indicates whether it matches the X-Dutify-Workspace header currently in effect (null when the header isn't set).
get_workspaceGet details for the bound workspace (the one this API key was provisioned for). Hub does not currently expose a single-workspace GET, so this returns the matching entry from the user's workspaces list. Requires workspaces:read scope.
list_membersList all members of the bound workspace. Each entry includes user UUID, email, name, role, and join timestamp. Useful for "tag this person", "summarize who said what in the last call", etc. Requires members:read scope.
get_custom_promptGet the workspace's custom prompt — house-style instructions that, together with each participant's own per-call prompt, notes and note template, form the instruction set their version of the summary, key points, action items and enhanced notes is generated from (task generation too). Returns { customPrompt: string | null }. Requires workspace-settings:read scope.
set_custom_promptUpdate the workspace's custom prompt. Pass null or empty string to clear it. Takes effect on the next recording processed, or on regenerate_summary for an existing one; existing recordings are not re-analysed automatically. Requires workspace-settings:write scope.
get_preferred_integrationGet the workspace's preferred integration target — which task system new actions are routed to by default (Jira, ClickUp, Airtable, PM, etc.). Requires workspace-settings:read scope.
set_preferred_integrationSet the workspace's preferred integration target. The value should be the integration system name returned by `list_integrations` (e.g. "JIRA", "CLICKUP", "AIRTABLE", "PM"). Requires workspace-settings:write scope.
get_default_workspaceGet the user's "default workspace" — where new calendar events without an explicit assignment get routed. Returns { workspaceId: uuid | null }. Requires user-settings:read scope.
set_default_workspaceSet the user's "default workspace" to the workspace this API key is bound to (future calendar events without an explicit workspace will route here). To clear the default entirely, pass { clear: true }. The MCP fills the workspace UUID from the bound workspace automatically — agents do not need to (and cannot) target a different workspace from this key. Requires user-settings:write scope.
list_integrationsList all integrations connected to the bound workspace. Returns one entry per connected toolkit (Slack, Jira, ClickUp, Airtable, Notion, Gmail, GCal, GitHub, etc.) with system name, connection status, last sync time, and any vendor metadata. Useful for choosing which `setPreferredIntegration` value is valid, or for reporting connection health to the user. Requires integrations:read scope.
get_recording_progressGet the processing progress of a recording. Returns an integer 0-100 — useful for polling after a `reprocess_recording` call. Requires recordings:read scope.
regenerate_summaryRe-run the analysis for the CALLER's own version of the summary, key points, action items and (when they have notes) enhanced notes, against the existing transcript and using their CURRENT instruction set (workspace prompt, per-call prompt, notes and note template). Other participants' versions are never touched. Cheaper than `reprocess_recording`. Returns the new summary text. Requires recordings:write scope.
reprocess_recordingRe-run the FULL pipeline on a recording: transcription + summary + key points + action items. Slower and more expensive than `regenerate_summary`. Use when a fresh transcription would meaningfully improve the result (different language detection, speaker diarization fix, etc.). Returns the updated recording DTO. Requires recordings:write scope.
get_audio_urlGenerate a short-lived signed URL to download the recording's audio (typically MP3 or WAV). The URL is valid for `expiryMinutes` minutes (default 30, max enforced by Hub). The agent should NOT cache the URL — request a fresh one each time the audio is needed. Requires recordings:read scope.
get_media_urlLike `get_audio_url` but returns the full media (video + audio) when the recording has a video track. Falls back to audio-only when there isn't one. Same expiry semantics. Requires recordings:read scope.
get_preview_urlGet a signed URL for the recording's preview thumbnail (a still image or short looping clip). Useful for embedding a card. Same expiry semantics. Requires recordings:read scope.
list_callsPage through all calls the actor user can see (their own + any explicitly shared). Returns a list of UserCallDTO. Pagination is page+size; sort order is most-recent first. Requires recordings:read scope.
count_callsReturn the total number of calls visible to the actor user. Use to plan pagination. Requires recordings:read scope.
get_callFetch a single call by ID. Returns the full UserCallDTO. Field map (the DTO is deeply nested): - top-level `id` (integer) — what /usercall/{id} expects, what list/search return - top-level `clickupList`/`jiraProjectId`/`airtableBaseId`/`airtableTableId` — populated when this call has been pushed to that vendor - top-level `summaryApplied`/`actionItemsApplied`/etc. (bool) — has the summary/etc. been pushed? - `call.id` (integer) — INTERNAL Zoom/Meet/Teams call id, NOT for /usercall/{id} paths - `call.callUuid` (string) — what `send_call_to_jira/clickup/airtable` want as `callUUID` - `call.attendees` (string, often "") — NOT a structured array - `call.recordings[i].id` (integer) — recording id for /recording/{id}/audio-url etc. - `call.recordings[i].summary`/`keyPoints`/`actionItems`/`enhancedNotes` — markdown STRINGS, not arrays; the CALLER's own version (generated from their workspace prompt, per-call prompt, notes and note template), never another participant's - `call.recordings[i].userNotes` — only the caller's own desktop notes, null otherwise Requires recordings:read scope.
search_callsFree-text search across call name, description, attendees, and recording transcript content. Returns paginated UserCallDTO results. Requires recordings:read scope.
count_search_callsCount of calls matching a search query. Pair with `search_calls` for paginated UIs. Requires recordings:read scope.
delete_callDelete a call by ID. Hard-deletes both the UserCall metadata and the underlying recording media. NOT REVERSIBLE — use with care. Requires recordings:write scope.
send_call_to_jiraPush a call's extracted tasks into one or more Jira projects under the same cloud. Hub fans the action items out across the listed projects. Requires recordings:write scope AND a Jira integration on the workspace (see `list_integrations`). IMPORTANT: returns boolean — `true` means Hub ACCEPTED the request, NOT that it actually landed in Jira. The vendor push happens async and silently fails on bad cloudId/project/expired tokens. To confirm landing, call `get_call` again and check that `jiraProjectId` is populated.
send_call_to_clickupPush a call's extracted tasks into a ClickUp list. Requires recordings:write scope AND a ClickUp integration on the workspace. Same return-shape caveat as `send_call_to_jira` — boolean response = "request accepted", not "actually pushed".
send_call_to_airtablePush a call's extracted tasks into Airtable rows under one base + one or more tables. Requires recordings:write scope AND an Airtable integration on the workspace. Same return-shape caveat as `send_call_to_jira` — boolean response = "request accepted", not "actually pushed".
list_calendar_eventsList the actor user's calendar events in a date range. Use this to find the eventId or seriesMasterId a prompt should attach to. Each event includes subject, start/end, whether a recording bot is subscribed, and any eventCustomPrompt / seriesCustomPrompt already set. Requires calendar:read scope.
set_event_custom_promptSet the custom prompt for ONE calendar occurrence. For a series occurrence it is applied TOGETHER with the series prompt (and the workspace prompt), not instead of them; for a one-off meeting it is the meeting's only per-call prompt. Takes effect the next time that meeting is processed. Requires recordings:write scope.
clear_event_custom_promptRemove one occurrence's own prompt. The series prompt, if any, keeps applying on its own — nothing 'falls back', the series prompt was already in use. Requires recordings:write scope.
set_series_custom_promptSet the custom prompt for an entire recurring series. Applies to every occurrence, IN ADDITION to any occurrence-specific prompt set with set_event_custom_prompt (both are applied when both are set). Requires recordings:write scope.
clear_series_custom_promptRemove a series' custom prompt. Each occurrence keeps only its own prompt, if it has one. Never clear a series prompt to 'avoid a conflict' with an occurrence prompt: there is no conflict, both apply, and clearing it drops instructions every other occurrence relies on. Requires recordings:write scope.
set_call_custom_promptSet the custom prompt on an already-recorded call, by its integer call id. This is the right tool for meetings that never had a calendar event (ad-hoc desktop or bot recordings), and for re-analysing a call differently. It is the CALLER's own prompt: it shapes only their version of the summary, key points, action items and enhanced notes. Stored only — follow it with regenerate_summary to rebuild that version. Requires recordings:write scope.
clear_call_custom_promptRemove the caller's own per-call prompt. Their next regenerate_summary uses their instruction set without a per-call prompt. Requires recordings:write scope.
lens_chatRun a Lens chat query against the workspace's knowledge (recordings, calls, transcripts, integrated SaaS data). Returns the synthesized answer as a string. Pass `lastMessage` (the new user turn) and optionally `history` (prior turns). For multi-turn conversations the agent SHOULD pass an accumulating history so Lens can resolve references like "the last call we discussed". Calls can take 15-30s on synthesis-heavy queries; the MCP timeout is generous to allow this. Requires lens:chat scope.