MCP Workflows
Platform MCP works best when the client follows a read, plan, change, verify loop.
MCP Workflows
Platform MCP works best when the client follows a read, plan, change, verify loop.
These examples show safe autonomous patterns. They use tool names, not a specific client UI, so you can adapt them to Claude, Cursor, OpenCode, or a custom client.
Workflow Guardrails
Before giving an MCP client write access:
- Give it the smallest preset or exact permissions that fit the job.
- Keep destructive permissions off by default.
- Ask the client to produce a plan before write tools run.
- Require human approval before destructive tools.
- Verify changes with read tools after every write.
- Review MCP Connections → Recent Audit Events after the run.
Audit An Agent Before Launch
Best permissions: Agent Builder plus sources:read, retrieval:read, feedback:read, and conversations:read.
Inventory the agent
Use list_agents, get_agent, get_agent_configuration, and
list_agent_tools.
Check knowledge coverage
Use list_sources, list_ingestion_jobs, and search_knowledge_base with real
customer questions.
Review quality signals
Use list_feedback, list_conversations, and list_conversation_messages.
Test improvements safely
Use chat_playground or test_agent. These are safer than creating real customer
conversations.
Only after the plan is approved should the client use update_agent_prompt, update_agent_model, or update_agent_retrieval_settings.
For agents in the durable platform cohort, chat_playground, chat_with_agent, and test_agent return an additive
turnId and terminal state. They wait for committed output, not an early model finish. cancel_agent_turn accepts
{ agentId, turnId } (agent keys may omit agentId) and explicitly stops that tenant/agent-bound turn. It requires
chat:write, access to the agent and, for saved turns, the corresponding playground or conversation resource.
Cancellation remains available after the cohort is disabled. Disconnecting a tool's HTTP request only detaches;
a cancelled parent Copilot intentionally cancels the child turn it invoked. Known usage is still charged.
Add And Sync Knowledge Sources
Best permissions: Content Manager.
- Use
list_sourcesto avoid duplicates. - Use
create_sourcefor one URL, sitemap, file, or image source. - Use
create_bulk_uploadfor a ZIP upload URL that already exists. - Use
batch_sourcesfor multiple FILE or IMAGE sources. - Use
sync_sourceto queue ingestion or reindex. - Use
list_ingestion_jobsorget_ingestion_jobuntil the job succeeds or fails. - Use
search_knowledge_baseto verify retrieval.
Do not give sources:delete unless the workflow is allowed to remove sources. Source creation and sync only need sources:write.
Operate Conversations
Best permissions: Operator.
Use this when an internal assistant helps support teams triage active conversations.
list_conversationswith status or channel filters.get_conversationandlist_conversation_messagesto understand context.get_end_userandget_end_user_memoryto understand the customer.takeover_conversationwhen a human should respond.send_conversation_messagefor a human-authored text reply in aWEB_TEXTtakeover conversation. Meta-channel replies use their channel-specific inbox flow.assign_conversationorclose_conversationwhen the support flow is complete.
Use set_end_user_memory only for facts the team wants saved for future conversations.
First-party channel-runtime calls recheck their recorded message/checkpoint sources before publishing a reply or replaying a saved result. Newly materialized first-party human and channel AI text/media replies retain those known inputs even after their creator execution retires. Attributed message-page reads and human-reply replays cannot treat the saved copy as an independent fact.
Latest-message previews returned by get_end_user, get_conversation, list_conversations and get_active_conversation also retain their message inputs for first-party channel-runtime calls. A preview whose known sources were deleted is rejected before returning content; a later write cannot reuse preview facts consumed before deletion. Conversations hidden by resource grants and pagination lookahead are not consumed.
The three conversation tools also retain known inputs for the visible customer name, email, phone and language they return. A grant-hidden customer, unreturned metadata or blocking reason is not consumed; changing the current profile does not erase inputs an earlier execution already read.
For first-party channel-runtime calls, the conversation returned by send_conversation_message follows the same visible-field and latest-message source rules. A rejected new reply rolls back its message, counters and audit; hidden customer fields and an old preview replaced by the new reply are not consumed.
The same rules apply to the conversation returned by takeover_conversation, release_conversation, assign_conversation and close_conversation, including retries. A revoked original input or returned fact prevents the state change, assignment-version increment and audit from committing. Existing permission and assignment requirements still apply.
Customer results from create_end_user and update_end_user retain known sources for their returned profile fields too. A revoked returned fact rolls back the mutation and audit. Independently supplied replacements remain possible. Content-free identity/block/unblock controls may return independent current values after an unrelated older read was revoked; those old inputs remain recorded and cannot be reused in a later content write.
SOURCE_CONTENT_REVOKED means an input was confirmed for deletion; do not retry those facts. Collect current facts in a fresh turn instead. Automatic channel history omits known-tainted replies so independent new turns remain available. This does not recall existing copies or certify exhaustive erasure across unrecorded readers or other destinations.
Copilot also rechecks known cleanup before exposing a saved customer action result. A pre-cleanup profile snapshot or approved memory ID can become unavailable with RESOURCE_DENIED even though the original mutation succeeded. Do not repeat that mutation to recover the old facts. Fresh independent results remain accessible. This does not certify physical erasure of Copilot history or exhaustive input lineage.
Native Copilot get_end_user_memory reads retain known channel-message and checkpoint inputs with their original run. Confirmed deletion makes those inputs unavailable, including delayed confirmed customer writes and their retry ancestry after the current memory value changes. Existing grants still apply; a run ID does not grant customer access. Use a fresh turn with independently supplied current facts. These receipts do not establish exhaustive lineage for other Copilot reads, history or outputs, and do not certify physical erasure.
Confirmed Copilot customer writes also retain those known inputs with the memory or profile values they publish. Removing the originating Copilot run, action or thread does not make the copied facts independent. Later first-party reads and delayed writes still reject a known-deleted input, even after the current value changes. An independently supplied replacement, including the same text, remains usable; this is source tracking, not text matching.
Native Copilot get_end_user and list_end_users also retain known inputs behind the profile fields and metadata they return. Customer details retain selected latest-message previews and their known copied-reply ancestry. Unreturned pagination lookahead and conversations hidden by grants are not consumed. An owned active run is required for attributed reads; it never replaces resource authorization.
Native Copilot get_conversation, list_conversations, get_active_conversation and list_conversation_messages retain known returned profile, preview and raw/copied-history inputs too. Only profile fields actually exposed by the conversation result are consumed; hidden profiles, unreturned metadata and pagination lookahead remain independent. A known-deleted input prevents exposure or a later confirmed customer write even after the current profile or preview changes. This does not certify lineage or physical erasure for conversation summaries, titles, tags, saved outputs or other cross-parent copies.
If a known input is confirmed for deletion before Copilot finishes, its terminal publication fails with a content-free RESOURCE_DENIED instead of retaining an answer or caller-supplied error containing those facts. Cancellation still takes precedence. Start a fresh turn with independently supplied current facts; identical text alone is not denied. This completion fence does not erase previously stored replay chunks or certify all persisted Copilot outputs.
Retained replay pages and reconnect also reject known-deleted inputs with RESOURCE_DENIED before exposing their chunks. This does not change a previously successful run into a failed run or repeat its operation. Its content-free run outcome and empty past-the-end replay tail remain readable. Earlier delivery and stored output bytes are not erased by this read fence.
Live answer text is delivered only after its coalesced event passes durable source admission. Pending or rejected admission does not expose that answer text. Existing flush settings still control batching; no new response-length limit is added. This does not recall text already admitted and delivered before a later deletion.
Published native answers retain a message-owned snapshot of their known channel inputs, independent of creator-run retirement. Private message pages, latest/full context and raw managed history omit copied answers whose known inputs were deleted. Pagination continues past suppressed rows, explicit latest limits still select available input, and independently supplied identical text remains readable. This prevents redisclosure; it does not erase retained private bytes or certify unrecorded historical copies and native shared compaction summaries.
Native model turns also retain known original inputs behind saved raw history they actually consume. The binding uses the original active owned run and thread; managed snapshots must match its participant and submitted message. Later deletion fences delayed customer writes, stream/terminal publication and new copied answers, including after creator retirement. Identity-only lookups, unreturned rows and entirely non-text fallback rows do not taint independent work. Unattributed current/historical inputs and physical erasure still require separate proof.
Native shared compaction summaries retain owned known-input manifests independently of the publishing run. A later turn records the prefix it actually adopts; confirmed deletion fences publication, cached model projections, refresh and outbound admission instead of serving a stale fallback. Legacy summaries without provenance are not certified retrospectively: their effective view rebuilds from available source-valid raw history without a total-history cap. Retained summary bytes and unknown historical ancestry are not thereby erased or proven safe.
Private history activity summaries also check their original native run's known inputs before hydration. A known-deleted source or unavailable original execution omits that activity, not independently submitted text or the original run outcome. Exact owner/thread checks and shared read locks serialize projection with deletion and receipt retirement. This does not erase stored events or recall activity delivered earlier.
Dashboard conversation summary/tag saves that started before cleanup of that exact conversation return 409 SOURCE_CONTENT_REVOKED. Refresh before submitting independently new notes. Cleanup and the conditional write serialize under a tenant read barrier; an unrelated conversation for the same customer is not blocked. Fresh edits, including independently supplied identical text, empty-tag clears and content-free assignment controls remain available. This stale-save fence does not certify historical metadata lineage or erase independent copies.
Build Or Update An Agent
Best permissions: Agent Builder.
create_agentwith aBAREBONESorSUPPORTtemplate.update_agent_identityto set name, slug, or template.update_agent_promptfor system instructions.update_agent_modelfor model, temperature, reasoning effort, input token, step, or conversation history defaults.update_agent_builtin_toolsandupdate_agent_channel_settingsfor runtime behavior.create_skillorinstall_skill_recipefor reusable instructions.attach_skill_to_agentandreorder_agent_skills.export_agent_configurationbefore and after changes so the client can show a diff.test_agentorchat_playgroundto verify behavior.
Use import_agent_configuration only after reviewing the sanitized export payload.
Manage External MCP Servers For An Agent
Best permissions: Agent Builder plus access to the target agent.
list_mcp_catalogto inspect supported catalog entries.activate_catalog_mcp_serverto attach an API-key catalog server to an agent.create_custom_mcp_serverfor a private Streamable HTTP or SSE server.test_mcp_serverbefore enabling it for production traffic.update_mcp_serverto change enabled tools or mark the config inactive.
The Platform MCP response returns sanitized config metadata only. It does not return stored secrets.
Manage API Keys Safely
Best permissions: Full Admin normal permissions plus exact API-key permissions.
list_api_keysandget_api_keyto inspect metadata.create_api_keyfor a new service account. CopyoneTimeRawKey; it will not be returned again.update_api_keyto narrow permissions, resource grants, allowed origins, rate limit, or expiry.rotate_api_keywhen ownership changes or a key may be exposed.revoke_api_keyonly withapi_keys:revokeand explicit human approval.
Prefer rotation over creating duplicate long-lived keys.
Review Usage And Cost
Best permissions: Analytics preset.
Use get_usage, get_analytics, and get_billing_summary to answer questions about usage, cost, credits, and subscription state. These tools are read-only and safe for reporting clients.
Voice Operations
Best permissions: voice:read, and voice:write only for diagnostics cleanup. Local settings use agent configuration permissions.
list_voice_modelsandlist_voicesto inspect native options without claiming call readiness.get_agent_configurationto check local voice settings for an agent.update_agent_voice_settingsto save local native overrides without remote sync.list_voice_sessions,get_voice_transcript, andlist_voice_tool_callsfor captions, recording, usage, and settlement diagnostics.clear_voice_tool_callsto clear transient Redis diagnostics.
Destructive Workflow Pattern
Use this pattern for delete_*, archive_skill, revoke_api_key, and deactivate_user tools.
- Read the target resource first.
- Ask the client to summarize impact in plain language.
- Confirm the resource ID with a human.
- Run the destructive tool once.
- Read again to verify the result.
- Check audit events for
mcp.tool.destructive.
Do not grant destructive permissions to broad autonomous clients. Create a separate short-lived key for cleanup runs.
Related Docs
MCP Permissions
Map each workflow to the right preset, exact permissions, and destructive controls.
MCP Client Configs
Connect the MCP client before running these workflows.