Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

PyAI Voice AI

NPM · @PYAI/MCP · 2 COMPONENTS · SCANNED SEP 20

Speech, transcription, voice agents, Trace, Recap, dubbing and narration with browser OAuth.

+3 this week 71 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 96 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency19
  • Repository check failed: the declared repository URL returned HTTP 404. See how to fix → View diagnostics → Fail
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 7 days ago).Pass
  • Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability84
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Tool/resource definitions use about 2744 tokens (~59/item across 46 items; 44 tools + 2 resources), lean.Pass
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management40
  • Stability observed for 12 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage86
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 58% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 44 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 46 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the PyAI Voice AI MCP server?

PyAI Voice AI runs locally as an npm package, launched with npx -y @pyai/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @pyai/mcp

# add to Claude Code
claude mcp add atomsai-pyai -- npx -y @pyai/mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "atomsai-pyai": {
      "command": "npx",
      "args": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "atomsai-pyai": {
      "command": "npx",
      "args": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add atomsai-pyai -- npx -y @pyai/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "atomsai-pyai": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@pyai/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add atomsai-pyai --command npx --arg -y --arg @pyai/mcp
# ~/.hermes/config.yaml
mcp_servers:
  atomsai-pyai:
    command: "npx"
    args: ["-y", "@pyai/mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "atomsai-pyai": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add atomsai-pyai -t stdio -c npx -a -y @pyai/mcp
// mcp.json
{
  "mcpServers": {
    "atomsai-pyai": {
      "command": "npx",
      "args": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 9 Sept 26 +16
    • Tool safety: pass → unverified security
    • Malware scan: unverified → pass security
    • Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • Schema quality: 100 → unverified functional
    • Stability: unverified → 0.03 functional
    • Package version: 0.3.0 → 0.3.3 functional
    • Package version: 0.3.0 → 0.3.2 functional
  • 8 Sept 26 50

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/@pyai/mcp@0.3.3

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 96 packages
Packages resolved 96
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 44 exposed · ~2,604 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
configure_amd ~143

Set the PyAI AMD (answering-machine detection) operating point + webhook (POST /v1/amd/config). `aggressiveness` is one dial 0-1: near 0 is human-safe (never hang up on a person), near 1 fires 'machine' fast. The realtime detection itself is a Twilio Media Streams WebSocket (wss /v1/amd/stream), a one-line-TwiML drop-in, not an MCP tool.

NameTypeReqDescription
aggressivenessnumberOperating point 0-1 (default 0.25).
webhook_urlstringhttps URL to POST amd.call.completed events to.

No output schema declared.

No examples provided.

configure_trace ~48

Configure Trace compliance monitoring for the selected workspace.

NameTypeReqDescription
bodyobjectyesPer-agent Trace config (spec §5.1). May be wrapped as { agent_id, config } or sent raw.

No output schema declared.

No examples provided.

create_agent ~61

Create a reusable voice Agent profile: persona, greeting, voice, language, tools and knowledge. Does not place a call.

NameTypeReqDescription
bodyobjectyesWritable agent fields. On update, present fields are set, `null` clears, absent fields are untouched.

No output schema declared.

No examples provided.

create_dub ~81

Submit an audio URL for translation and dubbing. Consumes usage. Keep job_id and poll get_dub_job; do not submit again after a timeout.

NameTypeReqDescription
source_langstringyesSource language from get_dub_capabilities.
source_urlstringyes
target_langstringyesTarget language from get_dub_capabilities.

No output schema declared.

No examples provided.

create_recap ~103

Submit speaker-labelled utterances and get a recap.call (POST /v1/recap/calls/{call_id}). Poll with get_recap. Prefer this over a DIY LLM summary. Requires recap:read and Recap enabled.

NameTypeReqDescription
call_directionstring
call_idstringyesStable id you will read back.
customer_namestring
pack_idstring
utterancesarrayyes

No output schema declared.

No examples provided.

create_sandbox_key ~80

Create a NEW isolated sandbox only when the user asks to try PyAI without an account. Local stdio only. Adopts the key privately for this session; never returns the secret. Prefer pyai login to use an existing workspace.

NameTypeReqDescription
labelstringOptional label (e.g. your app name) shown in the PyAI console.

No output schema declared.

No examples provided.

create_trace_rule_pack ~43

Create a workspace Trace compliance rule pack. This creates persistent configuration.

NameTypeReqDescription
bodyobjectyesAn authored rule pack in the Trace DSL (rule_pack_schema.json).

No output schema declared.

No examples provided.

create_transcription_job ~159

Submit an async speech-to-text job for an audio URL (https). Returns a job_id; poll with get_transcription_job. Supports diarization.

NameTypeReqDescription
audio_urlstringyeshttps URL of the audio to transcribe.
call_directionstring
call_idstringStable id for the post-call Recap. Defaults to the job id.
channelbooleanDual-channel (stereo) per-channel speakers.
customer_namestring
diarizebooleanSingle-track speaker diarization.
modelstring
output_formatsarrayDefaults to [json].
pack_idstringOptional Recap pack (default sales_outbound).

No output schema declared.

No examples provided.

direct_cast_script ~31

Turn a narration script into directed Cast lines before rendering. Consumes usage.

NameTypeReqDescription
bodyobjectyes

No output schema declared.

No examples provided.

discover_tools ~71

Find the right PyAI tools and a short recipe for a use case: speech, STT, voice agents, compliance, summaries, dubbing or narration. No credentials or usage.

NameTypeReqDescription
querystringProduct name or task, e.g. “translate audio”, “voice agent”, “TTS”.

No output schema declared.

No examples provided.

enable_recap ~99

Enable Recap for the key's org (PUT /v1/recap/config). Sandbox keys already mint with Recap on; call this to set a webhook or pack, or to enable Recap on a signup/live key. Requires recap:configure.

NameTypeReqDescription
default_pack_idstringDefaults to sales_outbound.
enabledbooleanDefaults to true.
webhook_urlstringhttps URL for recap.complete events.

No output schema declared.

No examples provided.

get_agent ~40

Read a saved voice Agent profile and its current configuration.

NameTypeReqDescription
idstringyesAgent id, e.g. `agent_7f3a…`.

No output schema declared.

No examples provided.

get_amd_call ~57

Get one PyAI AMD decision by call id (GET /v1/amd/calls/{id}): who/what answered, with the reason.

NameTypeReqDescription
call_idstringyesThe call id the decision was recorded under.

No output schema declared.

No examples provided.

get_cast_audio ~40

Retrieve completed Cast narration as playable audio or a download.

NameTypeReqDescription
job_idstringyesThe ID returned by the original submission; do not invent one.

No output schema declared.

No examples provided.

get_cast_capabilities ~22

Discover Cast voices, emotions, formats and supported rendering capabilities.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_cast_render ~42

Check a durable Cast render job. Preserve the original job ID.

NameTypeReqDescription
job_idstringyesThe ID returned by the original submission; do not invent one.

No output schema declared.

No examples provided.

get_dub_audio ~51

Retrieve completed dubbed audio as a playable result or download. Call only when get_dub_job reports done.

NameTypeReqDescription
job_idstringyesThe ID returned by the original submission; do not invent one.

No output schema declared.

No examples provided.

get_dub_capabilities ~24

Read currently supported Dub input and output languages before submitting a translation.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_dub_job ~46

Check a submitted Dub job. Poll pending/processing states without resubmitting.

NameTypeReqDescription
job_idstringyesThe ID returned by the original submission; do not invent one.

No output schema declared.

No examples provided.

get_recap ~82

Read one Recap by call id (GET /v1/recap/calls/{call_id}). When complete, `record` is recap.record.v1 (tldr, summary, action_items, disposition, next_steps, talk_ratio, signals, fields).

NameTypeReqDescription
call_idstringyesThe call_id passed to create_recap or the Hear job.

No output schema declared.

No examples provided.

get_recap_config ~20

Read Recap summarization configuration before changing it.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_started ~61

Return a concise, correct quickstart for building with PyAI (auth, SDK install, TTS/STT/realtime snippets, error handling). No key or network needed, read this before writing PyAI code so you use the right endpoints and the official SDK.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_trace_config ~35

Inspect Trace call-compliance configuration.

NameTypeReqDescription
agent_idstringAgent to read config for; omit for the org default.

No output schema declared.

No examples provided.

get_trace_exposure ~31

Read aggregate compliance exposure for the workspace.

NameTypeReqDescription
window_daysintegerTrailing window in days.

No output schema declared.

No examples provided.

get_trace_interaction ~29

Read one monitored interaction and its compliance evidence.

NameTypeReqDescription
idstringyesThe call_id.

No output schema declared.

No examples provided.

get_transcription_job ~38

Get the status + result of a transcription job by id.

NameTypeReqDescription
job_idstringyesThe job_id from create_transcription_job.

No output schema declared.

No examples provided.

list_agents ~19

List saved voice Agent profiles before creating or changing one.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_amd_calls ~106

List recent PyAI AMD decisions (GET /v1/amd/calls). Each carries answered_by (human/voicemail/ivr/screening/sit_invalid/…), answered_by_twilio (Twilio's enum, for routing parity), confidence, decision_ms, and the word-level reason.

NameTypeReqDescription
limitnumberMax results (1-100, default 20).
session_labelstringFilter by the opaque connect-URL/TwiML tag.

No output schema declared.

No examples provided.

list_models ~20

List the available PyAI models (catalog). No arguments.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_recap_calls ~59

List recent Recap records (GET /v1/recap/calls). Requires recap:read and Recap enabled.

NameTypeReqDescription
limitnumberMax results (1-100, default 20).
statusstring

No output schema declared.

No examples provided.

list_trace_findings ~71

Find compliance findings with source evidence. Findings are signals for review, not legal conclusions.

NameTypeReqDescription
actionstring
check_idstring
cursorstring
interaction_idstring
limitinteger
severitystring

No output schema declared.

No examples provided.

list_trace_interactions ~48

Find monitored calls and interactions for compliance review.

NameTypeReqDescription
agent_idstring
cursorstring
limitinteger
verdictstring

No output schema declared.

No examples provided.

list_trace_rule_packs ~21

Discover available Trace compliance rule packs before enabling monitoring.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_trace_violations ~56

List Trace rule violations for compliance review.

NameTypeReqDescription
cursorstring
interaction_idstring
limitinteger
rule_idstring
severitystring

No output schema declared.

No examples provided.

list_transcription_jobs ~61

Find existing audio processing and transcription jobs before submitting duplicates.

NameTypeReqDescription
cursorstringOpaque token from a previous page's `next_cursor`. Omit for the first page.
limitintegerMax items to return (1-100).

No output schema declared.

No examples provided.

list_voices ~81

List PyAI stock + cloned voices. Optionally filter by gender or region. Use a returned voice id as the `voice` for synthesize_speech.

NameTypeReqDescription
genderstringFilter by voice gender (e.g. female, male).
regionstringFilter by accent/region (e.g. en_us, en_gb).

No output schema declared.

No examples provided.

preview_cast_line ~67

Generate one directed Cast line. Consumes usage. Check get_cast_capabilities for supported voice, emotion and intensity.

NameTypeReqDescription
emotionstringyesSupported emotion.
intensityyes
textstringyesNarration text.
voicestringyesA supported Cast voice.

No output schema declared.

No examples provided.

render_cast ~53

Submit script text or a directed, multi-line Cast narration render. Returns a job; preserve its ID and poll with get_cast_render. Consumes usage; do not resubmit on timeout.

NameTypeReqDescription
bodyobjectyes

No output schema declared.

No examples provided.

set_agent_knowledge ~39

Replace the knowledge bases bound to an Agent. Read its existing bindings first.

NameTypeReqDescription
bodyarrayyes
idstringyes

No output schema declared.

No examples provided.

set_agent_tools ~42

Replace the tools bound to an Agent. Read the current Agent first; this replaces its bindings.

NameTypeReqDescription
bodyarrayyes
idstringyes

No output schema declared.

No examples provided.

synthesize_speech ~132

Text-to-speech. Synthesizes `input` with `voice` and writes the audio to `output_path`. Returns the file path and byte count. Note: consumes sandbox usage quota, for writing app code, prefer get_started over running this.

NameTypeReqDescription
inputstringyesText to synthesize.
modelstringDefaults to pyai-speak.
output_pathstringAbsolute file path to write the audio to.
response_formatstringDefaults to wav.
voicestringVoice id from list_voices. Omit for the account default.

No output schema declared.

No examples provided.

transcribe_audio ~79

Transcribe a small audio attachment supplied as base64 (up to 8 MiB decoded). For large or hosted recordings, use create_transcription_job. Consumes usage.

NameTypeReqDescription
audio_base64stringyesBase64-encoded audio bytes, without a data: prefix.
filenamestringyes
languagestring

No output schema declared.

No examples provided.

update_agent ~60

Update a voice Agent profile. Read it first and change only user-requested fields.

NameTypeReqDescription
bodyobjectyesWritable agent fields. On update, present fields are set, `null` clears, absent fields are untouched.
idstringyes

No output schema declared.

No examples provided.

whoami ~53

Introspect the active key (GET /v1/me): org, environment (test/live), granted scopes, and rate-limit/credit posture. Use it to self-diagnose a 401/403/402.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

Common questions

What is the PyAI Voice AI MCP server?

PyAI Voice AI is an MCP server listed in the public MCP registry as io.github.atomsai/pyai. Speech, transcription, voice agents, Trace, Recap, dubbing and narration with browser OAuth. This page covers its npm package (@pyai/mcp).

Is the PyAI Voice AI MCP server safe to use?

PyAI Voice AI scores 71 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the PyAI Voice AI MCP server expose?

PyAI Voice AI exposes 44 tools: create_sandbox_key, get_started, whoami, list_models, list_voices, and 39 more. Their descriptions and schemas cost roughly 2,604 tokens of context every time the server is loaded.

Is the PyAI Voice AI MCP server still maintained?

PyAI Voice AI is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the PyAI Voice AI MCP server under?

PyAI Voice AI declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.