duvoai avatar

Duvo MCP

duvoai/duvo-website-2026

Connects Claude to Duvo's governed execution platform for retail and CPG operations. Exposes tools for running supplier onboarding, purchase order handling, invoice matching, inventory replenishment, price updates, and master data workflows as durable cases with approval gates and audit trails. Useful when you need an agent to execute multi-step operational work across ERP systems, supplier portals, and internal tools without building your own orchestration layer. Requires API credentials provisioned after technical demo or pilot approval. Duvo runs the actual write operations after human review, so this isn't just read-only data access or suggestion generation.

tools
80
auth
Secret needed
transport
HTTP
last updated
May 24, 2026

Install

From registry metadata
$ npx add-mcp https://api.duvo.ai/v1/mcp --name duvo --header 'Authorization: Bearer ${API_TOKEN}'

Run in your terminal. add-mcp asks which agents to add it to, then asks for each value it needs. Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http duvo https://api.duvo.ai/v1/mcp --header 'Authorization: YOUR_AUTHORIZATION'

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 80 tools

Verified live against the running server on Nov 6, 2026.

listAgentMemoryFilesList the memory files stored for an agent.1 params

List the memory files stored for an agent.

Parameters* required
agent_id*string
The agent's unique identifier
getAgentMemoryFileGet the contents of a single memory file for an agent.2 params

Get the contents of a single memory file for an agent.

Parameters* required
agent_id*string
The agent's unique identifier
path*string
Relative path to the memory file, e.g. notes.md or context/customer.md
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.

List 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.

No parameters. Call it with no arguments.

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 a...9 params

Create 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 a...

Parameters* required
agent_id*string
The agent's unique identifier
cronvalue
dayvalue
day_of_monthvalue
enabled*boolean
frequency*string
one of every_5_minutes · every_15_minutes · hourly · daily · workday · weekly
recurringvalue
timevalue
timezone*string
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 rev...10 params

Update 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 rev...

Parameters* required
agent_id*string
The agent's unique identifier
cronvalue
dayvalue
day_of_monthvalue
enabledboolean
frequencystring
one of every_5_minutes · every_15_minutes · hourly · daily · workday · weekly
recurringvalue
schedule_id*string
The schedule's unique identifier
timevalue
timezonestring
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 a...2 params

Delete 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 a...

Parameters* required
agent_id*string
The agent's unique identifier
schedule_id*string
The schedule's unique identifier
getTeamGet a team by ID. The caller must be scoped to the requested team.1 params

Get a team by ID. The caller must be scoped to the requested team.

Parameters* required
team_idstring
Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span mu...
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...4 params

Start 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...

Parameters* required
provider*string
Native OAuth provider key, not the integration type. Use oauth_provider_key from listIntegrations (for example, google_gmail for integration type gmail, google_sheets for googlesheets, or microsoft...
reconnect_instance_idstring
When set, the OAuth flow will update the existing connection in place rather than creating a new one.
return_urlstring
Where to send the user's browser after OAuth completes.
team_idstring
Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span mu...
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`.9 params

Start 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`.

Parameters* required
custom_integration_idstring
Optional ID of a custom integration this connection should be associated with.
integration_typestring
Optional catalog integration type (e.g. `netsuite`, `asana`). When it names a known MCP OAuth catalog integration and `mcp_server_url` matches that integration's registered server, the connection i...
mcp_server_url*string
URL of the MCP server requiring OAuth.
name*string
Human-readable name to display for the connection.
oauth_client_idstring
OAuth client ID of a client the user registered on the authorization server themselves (e.g. a NetSuite Integration record). Takes precedence over preregistered credentials and Dynamic Client Regis...
oauth_client_secretstring
Client secret for `oauth_client_id`. Omit for public clients (PKCE-only).
reconnect_instance_idstring
When set, the OAuth flow will update the existing connection in place rather than creating a new one.
return_urlstring
Where to send the user's browser after consent completes. Accepts an absolute URL on a domain Duvo allows, or a path relative to the Duvo frontend (e.g. `/integrations/slack`).
team_idstring
Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span mu...
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`. Perf...1 params

Probe 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`. Perf...

Parameters* required
mcp_server_url*string
URL of the MCP server to probe for OAuth support.
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 chan...4 params

List 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 chan...

Parameters* required
after_idstring
Keyset cursor for reading the whole 'automation' scope: the id of the last dashboard you received; returns the page after it in (created_at, id) order. Use this instead of 'offset' when reading eve...
limitinteger
Number of results per page (1-100, default 20)default: 20
offsetinteger
Number of results to skipdefault: 0
scopestring
Which dashboards to return: 'created' (yours, the default), 'team' (published to your whole team by a teammate), 'shared' (shared with you individually by a teammate), or 'automation' (owned by one...one of created · shared · team · automationdefault: created
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 s...4 params

Create 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 s...

Parameters* required
connection_idsarray
message*string
permissionstring
one of view · edit
visibilitystring
one of private · team
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.1 params

Get 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.

Parameters* required
artifactId*string
getPulseDashboardHtmlServe a Duvo Pulse dashboard's rendered HTML document (text/html, not JSON). 404 until the first generation turn has produced HTML.1 params

Serve a Duvo Pulse dashboard's rendered HTML document (text/html, not JSON). 404 until the first generation turn has produced HTML.

Parameters* required
artifactId*string
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.2 params

Render 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.

Parameters* required
artifactId*string
themestring
one of light · darkdefault: light
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.2 params

Render 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.

Parameters* required
artifactId*string
themestring
one of light · darkdefault: light
updatePulseDashboardUpdate a Duvo Pulse dashboard's settings — rename it. Only the creator can update it.2 params

Update a Duvo Pulse dashboard's settings — rename it. Only the creator can update it.

Parameters* required
artifactId*string
title*string
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...3 params

Publish (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...

Parameters* required
artifactId*string
permissionstring
one of view · edit
visibility*string
one of private · team · organization
deletePulseDashboardDelete a Duvo Pulse dashboard. Only the creator can delete it.1 params

Delete a Duvo Pulse dashboard. Only the creator can delete it.

Parameters* required
artifactId*string
duplicatePulseDashboardDuplicate a Duvo Pulse dashboard, producing an idle clone of the current rendered dashboard. The conversation history, shares, and connections are not copied.1 params

Duplicate a Duvo Pulse dashboard, producing an idle clone of the current rendered dashboard. The conversation history, shares, and connections are not copied.

Parameters* required
artifactId*string
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 /artifac...5 params

Send 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 /artifac...

Parameters* required
artifactId*string
attachmentsarray
Attachments to hand the agent, uploaded beforehand via the upload-urls endpoint (max 5)
from_revision_idstring
message*string
selected_elementobject
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_...4 params

Issue 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_...

Parameters* required
artifactId*string
filename*string
Name of the file being attached, without any path segments
mime_type*string
MIME type of the file, e.g. text/html or image/png
size_bytes*integer
Size of the file in bytes (max 25MB)
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).2 params

Mint 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).

Parameters* required
artifactId*string
attachmentId*string
The attachment to mint a download URL for
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.1 params

Trigger 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.

Parameters* required
artifactId*string
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.2 params

Stop 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.

Parameters* required
artifactId*string
partial_textstring
The assistant text streamed so far, kept in the conversation as the partial reply. Omit when calling from an API client without streaming state.
listPulseDashboardConnectionsList the connections (data sources) attached to a Duvo Pulse dashboard (requires edit access).1 params

List the connections (data sources) attached to a Duvo Pulse dashboard (requires edit access).

Parameters* required
artifactId*string
attachPulseDashboardConnectionAttach one of your connections (data sources) to a Duvo Pulse dashboard so the agent can use its tools (requires edit access).2 params

Attach one of your connections (data sources) to a Duvo Pulse dashboard so the agent can use its tools (requires edit access).

Parameters* required
artifactId*string
connection_id*string
detachPulseDashboardConnectionDetach a connection (data source) from a Duvo Pulse dashboard (requires edit access).2 params

Detach a connection (data source) from a Duvo Pulse dashboard (requires edit access).

Parameters* required
artifactId*string
connectionId*string
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.3 params

Answer 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.

Parameters* required
answers*object
artifactId*string
toolCallId*string
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 b...3 params

List 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 b...

Parameters* required
artifactId*string
beforestring
Message id cursor: return the page of messages immediately older than this message. Omit for the most recent page.
limitinteger
Maximum number of messages to return (1-500, default 50).
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.4 params

List 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.

Parameters* required
artifactId*string
limitinteger
Maximum number of comment threads to return (1-200, default 50).
offsetinteger
Number of comment threads to skip, for paging.
statusstring
Return only threads in this state: `open` for threads not yet marked complete, `complete` for those that are. Omit for both. `total` and `open_total` always count the whole set, so a filtered page...one of open · 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.4 params

Start 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.

Parameters* required
artifactId*string
body*string
elementobject
revision_idstring
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.3 params

Reply 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.

Parameters* required
artifactId*string
body*string
commentId*string
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.3 params

Mark 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.

Parameters* required
artifactId*string
commentId*string
resolved*boolean
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.2 params

Delete 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.

Parameters* required
artifactId*string
commentId*string
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.1 params

List the version history of a Duvo Pulse dashboard, newest first (requires edit access). Use the version id with the restore and version-render endpoints.

Parameters* required
artifactId*string
getPulseDashboardVersionHtmlServe a specific version's rendered HTML document for a Duvo Pulse dashboard (text/html, requires edit access).2 params

Serve a specific version's rendered HTML document for a Duvo Pulse dashboard (text/html, requires edit access).

Parameters* required
artifactId*string
revisionId*string
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.2 params

Restore 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.

Parameters* required
artifactId*string
revisionId*string
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.

Create 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.

No parameters. Call it with no arguments.

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.2 params

Get 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.

Parameters* required
path*string
Path where the file will be uploaded (e.g. /workspace/data.csv)
sandbox_id*string
The sandbox's unique identifier
listSandboxFilesList files in a sandbox directory.2 params

List files in a sandbox directory.

Parameters* required
pathstring
Directory to list files from (defaults to /workspace)default: /workspace
sandbox_id*string
The sandbox's unique identifier
uploadSandboxFileUpload a file directly to the sandbox. Maximum file size is 10MB. For larger files, use POST /v2/sandboxes/:sandbox_id/upload-urls.1 params

Upload a file directly to the sandbox. Maximum file size is 10MB. For larger files, use POST /v2/sandboxes/:sandbox_id/upload-urls.

Parameters* required
sandbox_id*string
The sandbox's unique identifier
getRunEvaluationGet the latest evaluation analysis for a specific agent run (Run).2 params

Get the latest evaluation analysis for a specific agent run (Run).

Parameters* required
agentId*string
The agent's unique identifier (Agent ID)
runId*string
The run's unique identifier (Run ID)
getEvalScoresAggregate evaluation counts and flag distribution for an Assignment's Jobs since the given timestamp.4 params

Aggregate evaluation counts and flag distribution for an Assignment's Jobs since the given timestamp.

Parameters* required
agentId*string
The agent's unique identifier (Assignment ID)
revision_idstring
Target a specific Assignment revision instead of the live revision. Only honoured when scope='custom' — non-custom scopes aggregate across all revisions. Defaults to the live revision when omitted.
scopestring
When 'custom', only counts Jobs scored against the target revision's custom rubrics, and only `custom__*` rubric flags. Defaults to 'all' (platform + custom rubrics).one of all · custom
since*string
ISO 8601 timestamp; only Jobs evaluated after this are counted
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.2 params

List 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.

Parameters* required
agentId*string
The agent's unique identifier (Assignment ID)
build_idstring
Return rubrics for this specific build (the revision a Run ran against). Defaults to the agent's live build when omitted.
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 li...5 params

Add 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 li...

Parameters* required
agentId*string
The agent's unique identifier (Assignment ID)
build_idstring
Add the rubric to this build (revision). Defaults to the agent's live build when omitted.
description*string
A 1-2 sentence Pass condition phrased as a question.
selected_automation_revision_idvalue
The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic r...
title*string
Short, human-readable Pass/Fail rubric title.
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. Defa...4 params

Replace 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. Defa...

Parameters* required
agentId*string
The agent's unique identifier (Assignment ID)
build_idstring
Replace the custom rubrics on this build (revision). Defaults to the agent's live build when omitted.
rubrics*array
The complete custom rubric set for the build. Replaces every existing custom rubric; pass an empty array to clear them.
selected_automation_revision_idvalue
The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic r...
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.5 params

Edit 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.

Parameters* required
agentId*string
The agent's unique identifier (Assignment ID)
descriptionstring
A 1-2 sentence Pass condition phrased as a question.
rubricId*string
The custom rubric's unique identifier
selected_automation_revision_idvalue
The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic r...
titlestring
Short, human-readable Pass/Fail rubric title.
deleteEvalRubricRemove a single Agent-specific evaluation rubric. Future Runs on the build are no longer scored against it.3 params

Remove a single Agent-specific evaluation rubric. Future Runs on the build are no longer scored against it.

Parameters* required
agentId*string
The agent's unique identifier (Assignment ID)
rubricId*string
The custom rubric's unique identifier
selected_automation_revision_idvalue
The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic r...
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`.1 params

List 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`.

Parameters* required
agent_id*string
The agent's unique identifier
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.1 params

List 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.

Parameters* required
agent_id*string
The agent's unique identifier
listAgentCaseTriggersList the case triggers configured for an agent. Each trigger automatically dispatches the agent to run cases added to a queue.1 params

List the case triggers configured for an agent. Each trigger automatically dispatches the agent to run cases added to a queue.

Parameters* required
agent_id*string
The agent's unique identifier
previewAgentCaseTriggerConflictsPreview which other agents would conflict with this agent's case trigger if it pointed at the given queue. Does not modify the trigger.2 params

Preview which other agents would conflict with this agent's case trigger if it pointed at the given queue. Does not modify the trigger.

Parameters* required
agent_id*string
The agent's unique identifier
case_queue_id*string
The queue to check for conflicts against
getAgentCaseTriggerRetrieve a single case trigger by id.2 params

Retrieve a single case trigger by id.

Parameters* required
agent_id*string
The agent's unique identifier
trigger_id*string
The case trigger's unique identifier
createAgentCaseTriggerCreate a case trigger for an agent. An agent may have at most one case trigger; this returns 409 if one already exists.4 params

Create a case trigger for an agent. An agent may have at most one case trigger; this returns 409 if one already exists.

Parameters* required
agent_id*string
The agent's unique identifier
case_queue_id*string
Queue whose new cases should trigger this agent
concurrencyvalue
Concurrency cap for the target queue. The cap is queue-wide, so this affects every Agent working the queue, not just this trigger. Only 1 (run cases one at a time) or null (reset the whole queue's...
enabled*boolean
Whether the trigger is active. Disabled triggers do not dispatch runs.
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.5 params

Update 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.

Parameters* required
agent_id*string
The agent's unique identifier
case_queue_idstring
Queue whose new cases should trigger this agent
concurrencyvalue
Concurrency cap for the trigger's queue. The cap is queue-wide, so this affects every Agent working the queue, not just this trigger. Only 1 (run cases one at a time) or null (reset the whole queue...
enabledboolean
Whether the trigger is active. Disabled triggers do not dispatch runs.
trigger_id*string
The case trigger's unique identifier
deleteAgentCaseTriggerDelete a case trigger. Only the trigger creator or a builder/admin can delete it.2 params

Delete a case trigger. Only the trigger creator or a builder/admin can delete it.

Parameters* required
agent_id*string
The agent's unique identifier
trigger_id*string
The case trigger's unique identifier
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).1 params

List 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).

Parameters* required
agentId*string
The agent's unique identifier
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...5 params

Create 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...

Parameters* required
agentId*string
The agent's unique identifier
enabledboolean
Whether the trigger is active. Defaults to true.default: true
filter_configobject
Integration-specific filter config (e.g. sender/subject filters). Shape comes from the integration's filter schema. Replaces the trigger's current config, so send the whole object — except on an @m...
integration_slug*string
Integration slug the trigger fires for (e.g. `gmail`, `outlook`, `linear-native`, `google-drive`).
trigger_type*string
Trigger type within the integration (e.g. `email_received`). Discover valid values via the trigger types endpoint. Integrations that enumerate their trigger types (Microsoft Teams, Google Drive, Go...
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.2 params

Permanently 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.

Parameters* required
agentId*string
The agent's unique identifier
triggerId*string
The trigger to delete
listAgentTriggerTypesList the trigger types available for an agent, grouped by integration. Use the returned `integration_slug` and `trigger_type` values when creating a trigger.1 params

List the trigger types available for an agent, grouped by integration. Use the returned `integration_slug` and `trigger_type` values when creating a trigger.

Parameters* required
agentId*string
The agent's unique identifier
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 bou...8 params

Create 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 bou...

Parameters* required
agent_id*string
The agent's unique identifier
channel_id*string
Slack channel ID to watch, e.g. `C0123ABCD`.
channel_name*string
Slack channel name shown in Duvo, without the leading `#`, e.g. `support-inbox`.
integration_instance_idstring
Specific bound Slack connection to run the trigger off. Omit to use your own connection, or pass one returned by the bound-workspaces endpoint.
is_privateboolean
Whether the channel is private. Defaults to false. Private channels require the Duvo Slack app to be invited to the channel.
match_rule*value
Which channel messages fire the trigger: `{"kind":"all"}` for every message, or `{"kind":"contains","values":["invoice"]}` to match keywords.
slack_team_idstring
Slack workspace (team) ID the channel belongs to, e.g. `T0123ABCD`. Defaults to the team's default installed workspace. Discover the workspaces an agent can use with the bound-workspaces endpoint.
trigger_type*string
Trigger type. Only `slack_channel_message` (a message posted in a Slack channel) is supported here.
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.1 params

List 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.

Parameters* required
agent_id*string
The agent's unique identifier
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;...6 params

Update 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;...

Parameters* required
channel_idstring
New Slack channel ID to watch. Omit to leave unchanged.
channel_namestring
New Slack channel name, without the leading `#`.
enabledboolean
Set to false to pause the trigger without deleting it, or true to resume it. Resuming requires the connection the trigger uses to still be available on the agent.
is_privateboolean
Whether the channel is private.
match_rulevalue
Which channel messages fire the trigger: `{"kind":"all"}` for every message, or `{"kind":"contains","values":["invoice"]}` to match keywords.
trigger_id*string
The Slack channel trigger's unique identifier
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`.2 params

List 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`.

Parameters* required
agent_id*string
The agent's unique identifier
build_id*string
The agent build (revision) whose bound connections to list
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.1 params

Permanently 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.

Parameters* required
trigger_id*string
The Slack channel trigger's unique identifier
acceptRevisionGenerationAccept the reviewed generated configuration and complete the builder run. The saved draft is not activated.3 params

Accept the reviewed generated configuration and complete the builder run. The saved draft is not activated.

Parameters* required
build_id*string
The revision identifier.
builder_run_id*string
The builder run returned by generation or status, belonging to this revision.
expected_started_at*value
Copy started_at from the status being reviewed. Each prompt has its own builder run ID; stale review identities return 409.
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.10 params

Generate 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.

Parameters* required
build_id*string
Source revision to generate or refine.
conversationarray
Optional voice conversation transcript
draft_file_idstring
Temporary source file for this AOP draft. It is not kept on the Agent.
draft_file_idsarray
Temporary source files for this AOP draft, in attachment order. They are not kept on the Agent.
insight_indexnumber
Optional insight index for context
previous_build_idstring
Previous build ID for sandbox reuse
process_idstring
Optional process ID for context
prompt*value
Instructions for generating or refining this agent or code step.
run_idstring
Optional run ID for context
selected_automation_revision_idvalue
The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic r...
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, or if a draft revision still has an active builder run.3 params

Promote 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, or if a draft revision still has an active builder run.

Parameters* required
build_id*string
The build's unique identifier
revision_descriptionvalue
Optional description for the promoted revision. Pass null to clear an existing description.
revision_namestring
Optional display name to set on the promoted revision.
resumeBuilderRunResume a builder run that is waiting for user input2 params

Resume a builder run that is waiting for user input

Parameters* required
answers*object
Answers keyed by the exact question text in pending_user_questions.questions.
builder_run_id*string
The builder run waiting for answers.
cancelBuilderRunCancel a running builder run and pause its sandbox2 params

Cancel a running builder run and pause its sandbox

Parameters* required
builder_run_id*string
The builder run identifier.
status*string
Cancel an in-progress generation; review-pending changes must be declined instead.
createRevisionCreate a new revision for an existing agent.8 params

Create a new revision for an existing agent.

Parameters* required
agent_id*string
The agent's unique identifier
configvalue
Build configuration. An agent step takes the latest agent schema (legacy v1 agent configs are not accepted); a code step takes a code-step config. Omit it to get the step family's default first build.
handover_optionsvalue
Code steps only. The targets the program may request, and whether it must. Null clears them; omit to inherit the source build's. Mutually exclusive with handover_to.
handover_target_idsvalue
Agent IDs that this agent can hand work off to, used exactly as sent; an empty list means none. Send null or omit it to use the agents the AOP mentions with <DUVO:AGENT> tags. Targets are never cop...
handover_tovalue
The single agent or code step to run after this one completes ("Handover to"). Mutually exclusive with handover_target_ids.
name*string
Build name
selected_automation_revision_idvalue
The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic r...
source_build_idstring
Build ID to copy integrations and queue links from. A numbered revision copied this way is recorded as the new build's parent.
declineRevisionGenerationDiscard generated changes by restoring checkpoint_config and completing the builder run. The saved draft is not activated.3 params

Discard generated changes by restoring checkpoint_config and completing the builder run. The saved draft is not activated.

Parameters* required
build_id*string
The revision identifier.
builder_run_id*string
The builder run returned by generation or status, belonging to this revision.
expected_started_at*value
Copy started_at from the status being reviewed. Each prompt has its own builder run ID; stale review identities return 409.
getRevisionGet a revision by ID.2 params

Get a revision by ID.

Parameters* required
agent_id*string
The agent's unique identifier
build_id*string
The build's unique identifier
getBuilderRunGet the status of a builder run1 params

Get the status of a builder run

Parameters* required
builder_run_id*string
The builder run identifier.
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`.5 params

Read 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`.

Parameters* required
agent_id*string
The agent's unique identifier
build_id*string
The revision's unique identifier
lengthinteger
Characters to return (1-50000, default 40000). Repeat with a higher offset until offset plus the returned length reaches total_chars.default: 40000
offsetinteger
Character offset to start reading from (default 0)
section*string
`input` is an agent step's AOP text; `source` is a code step's program.one of input · source
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.5 params

List 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.

Parameters* required
agent_id*string
The agent's unique identifier
configstring
`full` (default) embeds each revision's config. `light` sets `config` to null and reports its sizes, hash and models in `config_summary`; read the AOP or program text with getRevisionBody. Use `lig...one of light · full
limitinteger
Number of revisions per page (1-100, default 20)default: 20
offsetinteger
Number of revisions to skip
statusstring
Only revisions with this status. `live` returns the active revision, wherever it falls in the history.one of draft · live · historic
updateRevisionUpdate a revision's configuration, name, description, or handover targets. Returns the updated revision.8 params

Update a revision's configuration, name, description, or handover targets. Returns the updated revision.

Parameters* required
build_id*string
The build's unique identifier
configobject
Build configuration object
handoverOptionsvalue
Code steps only. The targets the program may request, and whether it must. Null clears them; omit to leave unchanged. Mutually exclusive with handoverTo in one request.
handoverTargetIdsvalue
Agent IDs that this agent can hand over work to, used exactly as sent; an empty list clears them. Send null to use the agents the AOP mentions with <DUVO:AGENT> tags. Omit it to leave the targets a...
handoverTovalue
The single agent or code step to run after this one completes ("Handover to"). Null clears it; omit to leave it unchanged. Mutually exclusive with @-mention handovers in the AOP.
revision_descriptionvalue
Optional user-defined description for this revision. Pass null to clear.
revision_namevalue
Optional user-defined name for this revision. Pass null to clear.
selected_automation_revision_idvalue
The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic r...
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.8 params

Duplicate 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.

Parameters* required
agent_id*string
The ID of the agent to duplicate
include_aopboolean
Copy the agent's operating procedure (AOP) and its handover targets. Defaults to true.
include_connectionsboolean
Copy connected accounts (Connections) and their selected tools. Defaults to true.
include_logins_secretsboolean
Copy saved Logins and Secrets. Defaults to true.
include_memoryboolean
Copy what the agent has learned so far (its Memory). Defaults to false. Memory can only be copied from the Duvo app — requesting it here returns an error.
include_pluginsboolean
Copy installed plugins. Defaults to true.
include_queueboolean
Copy the assigned Queue. Defaults to true.
include_skills_filesboolean
Copy attached Skills and Files. Defaults to true.
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.1 params

Get 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.

Parameters* required
agent_id*string
The agent's unique identifier

Sponsors

Readme

Details

Repository
github.com/duvoai/duvo-website-2026
Website
www.duvo.ai
Transport
HTTP
Auth
Required
Registry
MCP registry, active
Resources
16
Tools verified
Nov 6, 2026