AI voice calling CLI and MCP server for agents using Guzli.
Project description
Guzli CLI — AI voice calling and MCP server for agents
Guzli CLI is an open-source Python command-line interface and local Model Context Protocol (MCP) server for AI voice calling. It connects AI agents to Guzli so they can place one-off phone calls, launch outbound calling campaigns, manage phone-number pools and voices, inspect call results, and work with inbox conversations through structured CLI commands or MCP tools.
Use guzli call to call one person or as many as 1,000 recipients. Quick tasks
and larger voice campaigns use the same tested workflow, so an agent can order
food, reroute a delivery, confirm appointments, or contact a list of customers
without learning separate calling APIs.
Calls are real and may be billable. Use
--dry-runor MCPdry_run=trueto validate recipients, number-pool selection, and voice configuration before dialing.
Features
- AI phone calls from the command line: place a one-off outbound call with
one
guzli callcommand. - MCP server for AI agents: expose typed calling, campaign, result, number, voice, and conversation tools to any MCP-compatible agent host.
- One recipient or 1,000: use repeatable
--toarguments or a recipients file without switching workflows. - Structured automation: return machine-readable JSON, stable identifiers, request metadata, and typed errors for reliable agent workflows.
- Existing number-pool selection: list, inspect, select, and save a default pool without creating new telephony resources implicitly.
- Campaign and call-result inspection: inspect runs, attempts, recordings, performance, and structured post-call extraction results.
- Shared CLI and MCP implementation: both interfaces call the same Python services and Guzli public API instead of duplicating orchestration logic.
- No added CLI telemetry: commands, prompts, phone numbers, transcripts, tokens, and profiles are not collected by the CLI itself.
Common AI calling use cases
- Make a one-off operational call, such as ordering food or rerouting a package.
- Confirm appointments, reservations, deliveries, or service windows.
- Launch an outbound voice campaign for dozens or hundreds of recipients.
- Give each call instructions, an opening message, an objective, and structured post-call fields to extract.
- Let an AI agent discover number pools and voice profiles before placing calls.
- Inspect campaign runs and call outcomes before retrying interrupted work.
- Read Guzli inbox conversations and send agent replies.
Installation
Python 3.10 or newer is required.
# CLI only
pipx install guzli-cli
# CLI plus MCP server
pipx install 'guzli-cli[mcp]'
# Alternative: install with uv
uv tool install 'guzli-cli[mcp]'
For development from a source checkout:
python -m venv .venv
.venv/bin/pip install -e '.[dev,mcp]'
.venv/bin/pytest
This repository is licensed under Apache-2.0. Release artifacts are published to PyPI from GitHub Actions using short-lived trusted-publishing credentials.
Authentication and configuration
The recommended setup is a persistent named profile:
guzli auth login
guzli auth status
guzli auth list
guzli auth use staging
Profiles live at ~/.guzli/config.json with restricted permissions. You can
also configure:
export GUZLI_API_BASE_URL='https://gateway.guzli.com'
export GUZLI_API_KEY='your_workspace_api_key'
export GUZLI_AGENT_ID='your_agent_id'
export GUZLI_ORGANIZATION_ID='your_organization_id'
export GUZLI_NUMBER_POOL_ID='your_default_pool_id' # optional
Resolution order is command-line flag, environment variable, stored profile, then built-in default. OAuth bearer sessions are supported for user-only admin routes. Ordinary routes accept either API-key or bearer auth, and agent replies support identity-signing API keys.
The CLI adds no telemetry of its own. It does not send command text, prompts, phone numbers, transcripts, tokens, or profile contents anywhere except as required by the Guzli API operation the user invokes.
Make an AI phone call from the CLI
call is the short, canonical entry point for quick work:
guzli call \
--to +12025550123 \
--message 'Hi, I am calling about a delivery.' \
--instructions 'Ask FedEx to reroute package 123 to the saved alternate address.'
The descriptive long form is identical:
guzli campaigns launch \
--to +12025550126 \
--to +12025550127 \
--instructions 'Confirm each appointment for Thursday.'
Use --recipients-file recipients.txt for larger batches. Recipients are
validated as E.164, deduplicated, and limited to 1,000. --name is optional.
These commands create real, potentially billable external calls by default. Resolve and validate without mutations first when appropriate:
guzli call --to +12025550126 --instructions 'Order one large cheese pizza.' --dry-run
Useful options include --message, --instructions, --objective,
--voice-profile-id, --voice-id, --number-pool-id, --from,
--extraction-file, --no-run, and --no-activate. Run guzli call --help
for the complete surface.
Number-pool selection
Campaign Launch only uses existing number pools; it never creates one implicitly. Resolution is:
--number-pool-idGUZLI_NUMBER_POOL_ID- saved default on the selected CLI profile
- the existing pool containing
--from <E.164> - the only eligible active pool
If more than one pool is eligible, the command stops and shows the choices.
guzli numbers pool list --is-active on
guzli numbers pool get <pool_id>
guzli numbers pool use <pool_id> # save on the active profile
guzli auth status # displays the saved pool
Intentional fast-launch compliance
Campaign Launch intentionally configures and approves a streamlined US support-call profile so agents can make quick operational calls. Defaults are advisory mode, automated-voice and recording disclosures off, spoken opt-out on, quiet-hours enforcement off, and consent not required. Use the standalone compliance commands for campaigns that need a different posture.
Inspect the outcome
Every launch returns structured JSON including launch_id, state, recipient
count, campaign ID, pool ID and selection source, voice-profile ID, readiness,
and run response.
guzli campaigns runs <campaign_id>
guzli campaigns run-get <campaign_id> <run_id>
guzli campaigns run-cancel <campaign_id> <run_id>
guzli calls list <campaign_id> --campaign-run-id <run_id>
guzli calls get <campaign_id> <attempt_id>
guzli campaigns results list <campaign_id>
guzli campaigns results get <campaign_id> <result_id>
Launch is not atomically idempotent. If a request is interrupted, inspect its campaign and run before retrying.
Connect AI agents with the Guzli MCP server
Install the mcp extra, authenticate once, and configure the stdio server in
your agent host:
{
"mcpServers": {
"guzli": {
"command": "guzli-mcp",
"env": {
"GUZLI_PROFILE": "default"
}
}
}
}
The server exposes typed, structured tools:
launch_callslist_number_pools,get_number_pool,list_phone_numberslist_voice_profilesget_campaign,list_campaign_runslist_calls,get_call,get_call_resultlist_conversations,get_conversation,send_agent_reply
Tool annotations identify reads and side effects. launch_calls is marked
destructive and non-idempotent because it may place real, billable calls. The
server calls shared Python workflows directly; it does not shell out to the
CLI. guzli://capabilities reports non-secret local configuration readiness.
Campaign, inbox, and telephony commands
# Inbox
guzli conversations list --status active --limit 20
guzli conversations get <conversation_id>
guzli agent-replies send <conversation_id> 'Thanks—I can help with that.'
# Campaign management
guzli campaigns list
guzli campaigns preview --config-file campaign.json
guzli campaigns create --config-file campaign.json
guzli campaigns readiness <campaign_id>
guzli campaigns archive <campaign_id>
# Compliance diagnostics
guzli campaigns compliance preview <campaign_id> --config-file audience.json
guzli campaigns compliance preflight <campaign_id>
# Voice profiles and pools
guzli voice-profiles get <profile_id>
guzli voice-profiles update <profile_id> --config-json '{"name":"Support"}'
guzli voice-profiles set-default <profile_id>
guzli voice-profiles usage --window-days 30
guzli numbers pool update <pool_id> --config-json '{"strategy":"sticky"}'
Place global options before the command. For stable automation output and structured errors, use:
guzli --output json campaigns list
Development and release boundaries
- The CLI is intentionally a client of existing public engine APIs. No engine changes are required for Campaign Launch or MCP.
- Live-call tests are excluded from the default suite.
- PyPI releases are built from GitHub releases by the trusted-publishing workflow; maintainers should follow RELEASING.md.
- See CONTRIBUTING.md and SECURITY.md before contributing or reporting a vulnerability.
Detailed endpoint and payload notes live in references/api.md.
Frequently asked questions
Can an AI agent make a one-off phone call with Guzli CLI?
Yes. guzli call is designed for quick operational calls such as confirming an
appointment, ordering food, or contacting a delivery provider. The agent passes
the recipient and instructions, while Guzli handles the voice campaign workflow.
Does Guzli CLI support bulk outbound calling?
Yes. The same command supports one to 1,000 recipients through repeated --to
arguments, comma-separated numbers, or --recipients-file. Recipients are
validated and deduplicated before launch.
What is the Guzli MCP server?
guzli-mcp is a local stdio Model Context Protocol server that exposes Guzli
operations as typed tools. MCP-compatible AI agents can launch calls, discover
number pools and voices, inspect campaign results, and handle conversations
without parsing terminal output.
Do the CLI and MCP server require changes to the Guzli engine?
No. Both clients use the existing public Guzli API. The hosted engine remains responsible for authorization, readiness, compliance enforcement, provider capabilities, and call execution.
Can I preview configuration without placing a call?
Yes. Pass --dry-run to guzli call or set dry_run=true when using the MCP
launch_calls tool. Dry runs resolve and validate configuration without
creating a campaign or dialing recipients.
Is Guzli CLI open source?
Yes. The CLI, MCP server, agent skill, and documentation are licensed under Apache-2.0. The separately hosted Guzli engine and service are not included in this repository.
License
Licensed under the Apache License 2.0. The Guzli name and hosted service are not granted under the code license beyond customary descriptive use.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file guzli_cli-0.2.0.tar.gz.
File metadata
- Download URL: guzli_cli-0.2.0.tar.gz
- Upload date:
- Size: 66.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0832ee746fb56c695d7c1525f09b2ef46522b41eb3d0a1515a4f089caf57cc6
|
|
| MD5 |
5845f5fb6ed8409cb563a37919ed13d8
|
|
| BLAKE2b-256 |
92ebdda8533132e019ae45743aedfd5d8edcdb2b557e590ff1410faffce35ccf
|
File details
Details for the file guzli_cli-0.2.0-py3-none-any.whl.
File metadata
- Download URL: guzli_cli-0.2.0-py3-none-any.whl
- Upload date:
- Size: 79.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e65dfcceee866ea891a4639e3c52fcfaa53f80831d2e40cd26608cca40fe4df
|
|
| MD5 |
f7db329983edf7bbec676813137a1ac6
|
|
| BLAKE2b-256 |
1b60c32c8c800beba5da737a81ab97351ca285745f169fa15c711d3cb123d33e
|