dutify-hub-mcp

Bridges an AI agent to Dutify Hub — meetings, call recordings, transcripts and summaries.

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

Что умеет

  • Whoami: Verify the API key with a fresh Hub workspace listing and return its bound workspace. Requires workspaces:read. Does not require X-Dutify-Workspace.
  • List Accounts: List 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
  • Find My Workspace: Return 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-Dutif

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

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

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

Bridges an AI agent to Dutify Hub — meetings, call recordings, transcripts and summaries.

Workspace settings, integrations, members, signed audio/video URLs, sending call action items onward to Jira/ClickUp/Airtable, and Lens chat.

Authentication: send your Dutify Hub API key (dh_live_…) as the X-API-Key header. Hub keys are NOT interchangeable with the PM keys used by dutify/dutify-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.