Agent Sync & Deploy
Import agents from voice platforms, test them with Chanl, and push changes back
Bring agents from VAPI, Retell, and Bland into Chanl for testing and monitoring, then push them back with tools attached. One CLI, every platform.
The Workflow
Your agents live on a voice platform. Chanl sits alongside it -- import the agent config, run scenarios, evaluate quality, then deploy changes (including MCP tools) back to the source platform.
Step 1: Import an agent
Pull a specific agent from your voice platform into Chanl:
chanl agents import --from vapi --agent-id asst_abc123✓ Agent imported from vapi
Name: Customer Support Bot
Chanl ID: agent_7f3a9b2e
Platform: vapi
External ID: asst_abc123
Status: active
Deployment: vapi → asst_abc123 (active)Step 2: Test it
Run a chat session or a full scenario against the imported agent:
chanl chat agent_7f3a9b2e -m "I need to return an order"chanl scenarios run scenario_abc123 --agent agent_7f3a9b2eStep 3: Push MCP tools back
Give your platform agent access to Chanl tools (knowledge base, memory, custom tools):
chanl agents push-mcp agent_7f3a9b2e --to vapi✓ MCP URL pushed to vapi
MCP URL: https://acme.chanl.dev/support-tools
Platform: vapi
External ID: asst_abc123
Status: configuredThe voice platform agent now calls Chanl tools during live conversations.
Import
Pull a single agent from an external platform. Chanl reads the agent config (name, prompt, model, voice settings) and creates a local copy linked to the original.
chanl agents import --from <platform> --agent-id <external-id> [--name <override>]| Option | Required | Description |
|---|---|---|
--from <platform> | Yes | Source platform: vapi, retell, bland |
--agent-id <id> | Yes | The agent's ID on the source platform |
-n, --name <name> | No | Override the imported name |
--json | No | Output as JSON |
Examples
Import from VAPI:
chanl agents import --from vapi --agent-id asst_abc123Import from Retell with a custom name:
chanl agents import --from retell --agent-id ret_xyz789 --name "Billing Bot"✓ Agent imported from retell
Name: Billing Bot
Chanl ID: agent_4e8c1d7a
Platform: retell
External ID: ret_xyz789
Status: activeImport from Bland:
chanl agents import --from bland --agent-id bland_456JSON output for scripting:
chanl agents import --from vapi --agent-id asst_abc123 --json{
"agent": {
"id": "agent_7f3a9b2e",
"name": "Customer Support Bot",
"provider": "vapi",
"providerId": "asst_abc123",
"status": "active",
"deployments": [
{
"orchestrator": "vapi",
"externalId": "asst_abc123",
"status": "active"
}
],
"createdAt": "2026-03-21T14:30:00.000Z"
}
}Sync
Pull the latest config from a specific platform. Unlike import (which targets one agent), sync updates all agents from that platform in your workspace.
chanl agents sync <platform> [--force] [--clean]| Option | Description |
|---|---|
<platform> | Platform to sync from: vapi, bland, twilio |
-f, --force | Force update agents that already exist in Chanl |
--clean | Delete all existing agents for this platform before syncing |
--json | Output as JSON |
Examples
Sync all agents from VAPI:
chanl agents sync vapiSync Results:
Processed: 5
Created: 2
Updated: 3
Details:
Customer Support Bot: updated
Sales Agent: updated
Onboarding Bot: created
Returns Handler: updated
Billing Assistant: createdForce-update agents even if they appear unchanged:
chanl agents sync vapi --forceClean sync -- removes stale agents first, then imports fresh:
chanl agents sync vapi --clean--clean deletes all agents linked to that platform before syncing. Scenario associations and call history tied to those agents will lose their reference. Use --force instead if you only want to refresh configs.
Sync All
Sync agents from every configured platform in one command.
chanl agents sync-all [--force]| Option | Description |
|---|---|
-f, --force | Force update existing agents across all platforms |
--json | Output as JSON |
chanl agents sync-all✓ Sync completed
Processed: 12
Created: 3
Updated: 9This calls the sync endpoint for each platform that has an integration configured in your workspace (Settings > Integrations). Platforms without an API key are skipped.
Publish
Push an agent's configuration from Chanl to an external platform. This either creates a new agent on the platform or updates an existing one.
chanl agents publish <agent-id> --to <platform> [--target <ext-id>] [--with-mcp]| Option | Required | Description |
|---|---|---|
<agent-id> | Yes | The Chanl agent ID to publish |
--to <platform> | Yes | Target platform: vapi, retell, bland |
--target <ext-id> | No | External agent ID to update (omit to create new) |
--with-mcp | No | Include the MCP URL so the platform agent can call Chanl tools |
--json | No | Output as JSON |
Examples
Create a new agent on VAPI from your Chanl config:
chanl agents publish agent_7f3a9b2e --to vapi✓ Agent created on vapi
Action: created
Platform: vapi
External ID: asst_new456
Status: activeUpdate an existing VAPI agent:
chanl agents publish agent_7f3a9b2e --to vapi --target asst_abc123✓ Agent updated on vapi
Action: updated
Platform: vapi
External ID: asst_abc123
Status: activePublish with MCP tools attached:
chanl agents publish agent_7f3a9b2e --to vapi --with-mcp✓ Agent created on vapi
Action: created
Platform: vapi
External ID: asst_new789
Status: active
MCP URL: https://acme.chanl.dev/support-toolsThe --with-mcp flag configures the platform agent to call your Chanl MCP endpoint during conversations, giving it access to your tools, knowledge base, and memory.
Push MCP
Configure an external agent to use Chanl tools without changing any other settings. This writes the MCP endpoint URL into the platform agent's tool/function configuration.
chanl agents push-mcp <agent-id> --to <platform> [--target <ext-id>]| Option | Required | Description |
|---|---|---|
<agent-id> | Yes | The Chanl agent ID (determines which MCP endpoint to use) |
--to <platform> | Yes | Target platform: vapi, retell, bland |
--target <ext-id> | No | External agent ID (omit to use the default linked agent) |
--json | No | Output as JSON |
Examples
Push MCP URL to the linked VAPI agent:
chanl agents push-mcp agent_7f3a9b2e --to vapi✓ MCP URL pushed to vapi
MCP URL: https://acme.chanl.dev/support-tools
Platform: vapi
External ID: asst_abc123
Status: configuredPush to a specific external agent:
chanl agents push-mcp agent_7f3a9b2e --to vapi --target asst_other999After pushing, the platform agent calls Chanl MCP tools during live conversations. Verify with:
chanl mcp test --toolset support-toolsEnd-to-End Example
A complete workflow: import from VAPI, test with scenarios, attach tools, push back.
# 1. Import the agent
chanl agents import --from vapi --agent-id asst_abc123
# 2. Test with an interactive chat
chanl chat agent_7f3a9b2e -m "Hi, I need to cancel my subscription"
# 3. Run a test scenario
chanl scenarios run scenario_cancel_flow --agent agent_7f3a9b2e
# 4. Check results
chanl calls list --agent agent_7f3a9b2e
# 5. Create tools the agent needs
chanl tools create --file lookup-subscription.json
chanl toolsets add-tool --toolset support-tools --tool tool_sub123
# 6. Push MCP tools to the VAPI agent
chanl agents push-mcp agent_7f3a9b2e --to vapi
# 7. Publish any config changes back
chanl agents publish agent_7f3a9b2e --to vapi --target asst_abc123 --with-mcpPlatform Notes
API key: Set in Settings > Integrations > VAPI. Uses your VAPI API key to read and write assistant configs.
What syncs in:
- Assistant name and system prompt
- Model provider and model name
- Voice ID and transcriber settings
- First message and webhook URL
What publishes out:
- System prompt, model, and voice config
- MCP server URL (with
--with-mcp) - Function/tool definitions
Agent ID format: VAPI uses assistant IDs like asst_abc123 or UUIDs.
API key: Set in Settings > Integrations > Retell. Uses your Retell API key.
What syncs in:
- Agent name and prompt
- LLM provider settings
- Voice configuration
What publishes out:
- Prompt and LLM config
- MCP tool endpoint (with
--with-mcp)
Agent ID format: Retell uses IDs like ret_xyz789 or UUIDs.
API key: Set in Settings > Integrations > Bland. Uses your Bland API key.
What syncs in:
- Agent name and task description
- Model and voice settings
- Transfer and pathway config
What publishes out:
- Task description and model config
- MCP tool endpoint (with
--with-mcp)
Agent ID format: Bland uses IDs like bland_456 or UUIDs.
Scripting Examples
Sync and list in one pipeline
chanl agents sync vapi --json | jq '.result.created'
chanl agents list --platform vapiImport multiple agents
for agent_id in asst_abc123 asst_def456 asst_ghi789; do
chanl agents import --from vapi --agent-id "$agent_id"
donePush MCP to all VAPI agents
chanl agents list --platform vapi --json | \
jq -r '.agents[].id' | \
while read agent_id; do
chanl agents push-mcp "$agent_id" --to vapi
doneCI/CD: Sync, test, deploy
- name: Sync and validate agents
run: |
chanl agents sync-all --force --json > sync-result.json
errors=$(jq '.result.errors' sync-result.json)
if [ "$errors" -gt "0" ]; then
echo "Sync had $errors errors"
exit 1
fi
env:
CHANL_API_KEY: ${{ secrets.CHANL_API_KEY }}
CHANL_WORKSPACE_ID: ${{ vars.CHANL_WORKSPACE_ID }}