Chanl

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.

chanl agents import chat / scenarios chanl agents publish

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_7f3a9b2e

Step 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:       configured

The 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>]
OptionRequiredDescription
--from <platform>YesSource platform: vapi, retell, bland
--agent-id <id>YesThe agent's ID on the source platform
-n, --name <name>NoOverride the imported name
--jsonNoOutput as JSON

Examples

Import from VAPI:

chanl agents import --from vapi --agent-id asst_abc123

Import 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:       active

Import from Bland:

chanl agents import --from bland --agent-id bland_456

JSON 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]
OptionDescription
<platform>Platform to sync from: vapi, bland, twilio
-f, --forceForce update agents that already exist in Chanl
--cleanDelete all existing agents for this platform before syncing
--jsonOutput as JSON

Examples

Sync all agents from VAPI:

chanl agents sync vapi
Sync Results:
  Processed: 5
  Created:   2
  Updated:   3

Details:
  Customer Support Bot: updated
  Sales Agent: updated
  Onboarding Bot: created
  Returns Handler: updated
  Billing Assistant: created

Force-update agents even if they appear unchanged:

chanl agents sync vapi --force

Clean 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]
OptionDescription
-f, --forceForce update existing agents across all platforms
--jsonOutput as JSON
chanl agents sync-all
✓ Sync completed
  Processed: 12
  Created:   3
  Updated:   9

This 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]
OptionRequiredDescription
<agent-id>YesThe Chanl agent ID to publish
--to <platform>YesTarget platform: vapi, retell, bland
--target <ext-id>NoExternal agent ID to update (omit to create new)
--with-mcpNoInclude the MCP URL so the platform agent can call Chanl tools
--jsonNoOutput 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:       active

Update 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:       active

Publish 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-tools

The --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>]
OptionRequiredDescription
<agent-id>YesThe Chanl agent ID (determines which MCP endpoint to use)
--to <platform>YesTarget platform: vapi, retell, bland
--target <ext-id>NoExternal agent ID (omit to use the default linked agent)
--jsonNoOutput 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:       configured

Push to a specific external agent:

chanl agents push-mcp agent_7f3a9b2e --to vapi --target asst_other999

After pushing, the platform agent calls Chanl MCP tools during live conversations. Verify with:

chanl mcp test --toolset support-tools

End-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-mcp

Platform 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 vapi

Import multiple agents

for agent_id in asst_abc123 asst_def456 asst_ghi789; do
  chanl agents import --from vapi --agent-id "$agent_id"
done

Push 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
  done

CI/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 }}

Troubleshooting

Chat

Test imported agents with interactive conversations

MCP Integration

Connect toolsets to voice platforms and AI clients

Tools & Toolsets

Create the tools your agents will use via MCP

Platform: Integrations

Configure platform API keys and webhook settings

On this page