Governed retail, FMCG, and CPG operational tools: runs, cases, approvals, audit-ready execution.
Connect Remote server
claude mcp add --transport http duvo https://api.duvo.ai/v1/mcp --header "Authorization: Bearer <YOUR_API_KEY>"
{
"mcpServers": {
"duvo": {
"url": "https://api.duvo.ai/v1/mcp",
"headers": {
"Authorization": "Bearer <YOUR_API_KEY>"
}
}
}
}
{
"servers": {
"duvo": {
"type": "http",
"url": "https://api.duvo.ai/v1/mcp",
"headers": {
"Authorization": "Bearer <YOUR_API_KEY>"
}
}
}
}
Settings > Connectors > Add custom connector
URL: https://api.duvo.ai/v1/mcp
Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.
Tools 80 found in our last check
listAgentMemoryFilesList the memory files stored for an agent.
getAgentMemoryFileGet the contents of a single memory file for an agent.
listPluginCatalogList plugins that can be referenced by name in a build's plugins array. Builds may also reference any public GitHub repository URL (https://github.com/owner/repo) as a plugin; those are not enumerated here.
createScheduleCreate a schedule for an agent. The schedule fires against the agent's live build. The authenticated user owns the schedule. On a team with revisions, a repeating schedule for an Agent in an automation joins that automation's revisions: one matching a schedule the automation alr…
updateScheduleUpdate fields on an existing schedule. Only supplied fields are changed; omitted fields retain their current values. Owners may update their own schedules; team superadmins may update any schedule on agents in the current team. A schedule that belongs to an automation with revis…
deleteScheduleDelete a schedule. Owners may delete their own schedules; team superadmins may delete any schedule on agents in the current team. Deleting a schedule that belongs to an automation with revisions stops it for its owner at once; the automation's revisions keep the schedule for any…
getTeamGet a team by ID. The caller must be scoped to the requested team.
startNativeOAuthStart an OAuth-based connection with a native provider (Gmail, Google Sheets, Outlook, etc.). The provider path parameter is the native OAuth provider key from listIntegrations, not the integration type. Returns an authorization URL that must be opened in a browser by a human en…
authorizeMcpOAuthStart an OAuth-based connection with a remote MCP server using Dynamic Client Registration. Returns an authorization URL the user must open in a browser; once they grant consent, Duvo creates the matching connection and redirects the browser to the optional `returnUrl`.
checkMcpOAuthProbe an MCP server URL to discover whether it supports OAuth Dynamic Client Registration. Returns the authorization endpoint and required scopes when supported. Useful as a precursor to `/v2/teams/:team_id/connections/oauth/mcp/start` or `/v2/teams/:team_id/connections`. Perfor…
listPulseDashboardsList your Duvo Pulse dashboards (live, agent-generated visualizations of your Duvo data). Ordered most recently updated first, except scope=automation, which is ordered by creation time (then id) so the whole scope can be read with the after_id cursor without a concurrent change…
createPulseDashboardCreate a new Duvo Pulse dashboard from a natural-language prompt (e.g. 'open cases by queue this week') and dispatch the first generation turn. Generation is asynchronous — poll GET /artifacts/{artifactId} until status is completed. The dashboard is private to you unless you set…
getPulseDashboardGet a Duvo Pulse dashboard's metadata and generation status. When status is completed and html_code_present is true, fetch the rendered HTML from GET /artifacts/{artifactId}/render; the conversation is served by GET /artifacts/{artifactId}/messages.
getPulseDashboardHtmlServe a Duvo Pulse dashboard's rendered HTML document (text/html, not JSON). 404 until the first generation turn has produced HTML.
getPulseDashboardPdfRender a Duvo Pulse dashboard to a PDF document (application/pdf, not JSON). 404 until the first generation turn has produced HTML; 409 for an openui dashboard, whose substrate this exporter cannot render.
exportPulseDashboardHtmlRender a Duvo Pulse dashboard to a self-contained static HTML snapshot (text/html, data baked in). 404 until the first generation turn has produced HTML; 409 for an openui dashboard, whose substrate this exporter cannot render.
updatePulseDashboardUpdate a Duvo Pulse dashboard's settings — rename it. Only the creator can update it.
publishPulseDashboardPublish (share) a Duvo Pulse dashboard to your whole team or your whole organization, or revert it to private (creator only). When publishing, set permission to 'view' (teammates see the dashboard) or 'edit' (teammates can also iterate on it); organization-wide viewers outside t…
deletePulseDashboardDelete a Duvo Pulse dashboard. Only the creator can delete it.
duplicatePulseDashboardDuplicate a Duvo Pulse dashboard, producing an idle clone of the current rendered dashboard. The conversation history, shares, and connections are not copied.
sendPulseDashboardMessageSend an instruction to iterate on a Duvo Pulse dashboard (e.g. 'make it a bar chart', 'filter to last 14 days'). The creator can always iterate; teammates can too when the Pulse is published to the team with edit access. The agent regenerates asynchronously — poll GET /artifacts…
createPulseDashboardAttachmentUploadUrlIssue a presigned upload URL for a file to attach to a Duvo Pulse dashboard message (e.g. an HTML dashboard to copy, or a screenshot to match). POST the file bytes to the returned upload_url as multipart form data under the field name 'file', then pass the returned attachment_id…
getPulseDashboardAttachmentDownloadUrlMint a short-lived presigned URL to download or preview a file attached to a Duvo Pulse dashboard message. Returns 404 once the dashboard's sandbox has expired and the file is gone (about 12 hours).
refreshPulseDashboardTrigger an on-demand data refresh of a Duvo Pulse dashboard. The dashboard regenerates its connection-sourced values in the background — poll GET /artifacts/{artifactId} for status.
stopPulseDashboardMessageStop an in-flight Duvo Pulse generation turn. Requires edit access to the dashboard. Flips the dashboard to 'interrupted' and keeps any streamed-so-far reply; stopping when nothing is generating is a successful no-op.
listPulseDashboardConnectionsList the connections (data sources) attached to a Duvo Pulse dashboard (requires edit access).
attachPulseDashboardConnectionAttach one of your connections (data sources) to a Duvo Pulse dashboard so the agent can use its tools (requires edit access).
detachPulseDashboardConnectionDetach a connection (data source) from a Duvo Pulse dashboard (requires edit access).
answerPulseDashboardQuestionAnswer a pending question the Duvo Pulse agent asked and resume the paused run (creator or team editors). Use the toolCallId from the dashboard's message transcript.
listPulseDashboardMessagesList the chat transcript of a Duvo Pulse dashboard's live version (requires edit access). Returns the most recent page by default, oldest first within the page; pass `before` (a message id from a previous page) to walk back through older messages. Messages from other version bra…
listPulseDashboardCommentsList the comment threads on a Duvo Pulse dashboard (requires view access). Each thread carries its author, the dashboard element it is pinned to, its replies oldest-first, and whether it has been marked complete.
createPulseDashboardCommentStart a comment thread on a Duvo Pulse dashboard (requires view access). Pass `element` — captured from the dashboard canvas — to pin the thread to one element; omit it for a comment on the dashboard as a whole.
createPulseDashboardCommentReplyReply to a comment thread on a Duvo Pulse dashboard (requires view access). `commentId` must be a thread root; threads are one level deep. A thread already marked complete still accepts replies and stays complete.
setPulseDashboardCommentResolutionMark a Duvo Pulse dashboard comment thread complete, or reopen it (requires view access). Pass the target state in `resolved`; the call is idempotent, and the response carries the thread with `resolved_at` and `resolved_by` set or cleared.
deletePulseDashboardCommentDelete a comment or reply on a Duvo Pulse dashboard. Allowed for the comment's author and for the dashboard's creator. Deleting a thread root keeps its replies, rendered under a deleted opening comment.
listPulseDashboardVersionsList the version history of a Duvo Pulse dashboard, newest first (requires edit access). Use the version id with the restore and version-render endpoints.
getPulseDashboardVersionHtmlServe a specific version's rendered HTML document for a Duvo Pulse dashboard (text/html, requires edit access).
restorePulseDashboardVersionRestore a previous version of a Duvo Pulse dashboard, making it live again (requires edit access). Non-destructive — it moves the head pointer to the chosen version.
createSandboxCreate a new sandbox for file uploads. The returned sandbox_id can be passed to POST /v2/teams/:team_id/runs to stage data for a run.
createSandboxUploadUrlGet a presigned URL for uploading a file into a sandbox. Use for files larger than 10MB; smaller files can be uploaded directly via POST /v2/sandboxes/:sandbox_id/files.
listSandboxFilesList files in a sandbox directory.
uploadSandboxFileUpload a file directly to the sandbox. Maximum file size is 10MB. For larger files, use POST /v2/sandboxes/:sandbox_id/upload-urls.
getRunEvaluationGet the latest evaluation analysis for a specific agent run (Run).
getEvalScoresAggregate evaluation counts and flag distribution for an Assignment's Jobs since the given timestamp.
getEvalRubricsList the evaluation rubrics a Run is scored against: the platform default rubrics plus the Agent-specific rubrics for a build. Defaults to the Agent's live build; pass build_id to target the revision a specific Run ran against.
createEvalRubricAdd one Agent-specific evaluation rubric to a build. A build may hold at most 5 custom rubrics by default (25 on teams with the newer rubric generator enabled); this fails with 409 once the build's ceiling is reached, and the error message states it. Defaults to the Agent's live…
replaceEvalRubricsReplace a build's entire Agent-specific evaluation rubric set in one call (at most 5 rubrics by default, 25 on teams with the newer rubric generator enabled). Existing custom rubrics are removed and the supplied list becomes the new set; pass an empty array to clear them. Defaul…
updateEvalRubricEdit a single Agent-specific evaluation rubric's title and/or description. The edit produces a NEW rubric (with a new id and slug) so previously scored Runs stay attributed to the original criterion; the response contains the new rubric.
deleteEvalRubricRemove a single Agent-specific evaluation rubric. Future Runs on the build are no longer scored against it.
listAgentSchedulesList the schedules you own on an agent. Returns only your own schedules, whoever you are. Callers with an elevated team role can read every member's schedules on the agent, including who created each one, via `GET /agents/{agent_id}/schedules/all`.
listAllAgentSchedulesList every team member's schedules on an agent, including who created each one. Requires an elevated team role; callers without one receive 403 and should use `GET /agents/{agent_id}/schedules`, which returns only the schedules they own.
listAgentCaseTriggersList the case triggers configured for an agent. Each trigger automatically dispatches the agent to run cases added to a queue.
previewAgentCaseTriggerConflictsPreview which other agents would conflict with this agent's case trigger if it pointed at the given queue. Does not modify the trigger.
getAgentCaseTriggerRetrieve a single case trigger by id.
createAgentCaseTriggerCreate a case trigger for an agent. An agent may have at most one case trigger; this returns 409 if one already exists.
updateAgentCaseTriggerUpdate fields on a case trigger. Only the trigger creator or a builder/admin can disable an enabled trigger or change its queue, and only a builder/admin can change queue concurrency.
deleteAgentCaseTriggerDelete a case trigger. Only the trigger creator or a builder/admin can delete it.
listAgentTriggersList the trigger definitions the authenticated user owns on an agent (Agent in the Duvo UI). Triggers start a Run automatically when an external event fires (e.g. an email arrives or a Linear issue is created).
upsertAgentTriggerCreate or update the authenticated user's trigger for an integration on an agent. The integration must already be connected to the agent (its OAuth connection set up in the Duvo dashboard). Set `enabled: false` to pause a trigger without deleting it. An agent holds one trigger p…
deleteAgentTriggerPermanently delete one of your own event triggers on an agent. The agent stops starting Runs for that event and the trigger's filter config is lost. To keep the trigger but stop it firing, upsert it with `enabled: false` instead.
listAgentTriggerTypesList the trigger types available for an agent, grouped by integration. Use the returned `integration_slug` and `trigger_type` values when creating a trigger.
createAgentSlackTriggerCreate a Slack channel trigger on an agent (Agent in the Duvo UI): the agent starts a Run whenever a matching message is posted in the channel. An agent can carry one trigger per channel, so call this once per channel. The Slack workspace must be installed for the team AND bound…
listAgentSlackTriggersList the Slack channel triggers you own on an agent (Agent in the Duvo UI), oldest first. Each trigger's `filter_config` carries the watched `channelId`, `channelName`, Slack `workspaceId`, and `matchRule`. Capped at 100 triggers per agent.
updateSlackTriggerUpdate a Slack channel trigger you own — repoint it at another channel, change which messages match, or pause and resume it with `enabled`. Only the supplied fields change. Resuming a paused trigger requires the Slack connection it runs off to still be available on the agent; ch…
listAgentSlackBoundWorkspacesList the Slack workspaces bound to an agent build that you can create channel triggers for. Creating a Slack channel trigger for any other workspace is rejected, so start here to pick a valid `slack_team_id` and `integration_instance_id`.
deleteSlackTriggerPermanently delete a Slack channel trigger you own. The agent stops starting Runs for that channel. To keep the trigger but stop it firing, update it with `enabled: false` instead.
acceptRevisionGenerationAccept the reviewed generated configuration and complete the builder run. The saved draft is not activated.
generateRevisionGenerate agent instructions or code into a saved draft. Poll the returned builder run, answer questions if requested, then accept or decline the reviewed checkpoint. This never activates the revision.
promoteRevisionPromote a draft or historic revision to the live version. The live revision is the one used by triggers and new runs. Fails if the revision is already live, if a draft revision still has an active builder run, or with 409 if the agent's automation runs as the team and the revisi…
resumeBuilderRunResume a builder run that is waiting for user input
cancelBuilderRunCancel a running builder run and pause its sandbox
createRevisionCreate a new revision for an existing agent.
declineRevisionGenerationDiscard generated changes by restoring checkpoint_config and completing the builder run. The saved draft is not activated.
getRevisionGet a revision by ID.
getBuilderRunGet the status of a builder run
getRevisionBodyRead one section of a revision's config as plain text, in character ranges: the AOP (`input`) or the code-step program (`source`). Use it instead of getRevision when the text is large; listAgents with `config=light` reports each agent's `input_chars` and `source_chars`.
listAgentRevisionsList revisions for an agent. Pass `config=light` to leave each revision's config out of the page and get its sizes instead; read the AOP with getRevisionBody.
updateRevisionUpdate a revision's configuration, name, description, or handover targets. Returns the updated revision.
duplicateAgentDuplicate an existing agent into a new agent named "Copy of <name>", carrying over its configuration. Use the include_* flags in the (optional) body to control what is copied; all default on except memory. Requires the Lead Builder team role or above.
getAgentGet an agent by ID. The response carries no revision config: use listAgentRevisions and getRevision for a revision, and getRevisionBody to read a large AOP in character ranges.
Headers
| Name | Description |
|---|---|
AuthorizationRequired, secret | Bearer token for an approved Duvo workspace. |
Details
| Endpoint | https://api.duvo.ai/v1/mcp (Streamable HTTP) |
| First published | 24 May 2026 |
| Last updated | 24 May 2026 |
| Registry name | io.github.duvoai/duvo |
More security servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
