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

User-approved phone calls, speech, transcription and voice agents with PyAI OAuth.

−2 this week 72 Trust /100

Last scanned (9 hours ago)

Scores higher than 42% of npm servers

Category AI and Machine Learning

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 Security81
  • No malware found by supply-chain analysis.Pass
  • CVE check failed: a known high-severity CVE affects @modelcontextprotocol/sdk 1.30.0, a direct dependency. A fixed version is available. View diagnostics → Fail
  • No install/post-install scripts declared.Pass
  • 30 of 93 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 23 days ago).Pass
  • Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability83
  • 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 3763 tokens (~63/item across 59 items; 57 tools + 2 resources), lean.Pass
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
  • Stability observed for 26 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
  • 57% 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 57 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 59 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
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.

  • 5 Nov 26 −2
    • Stability: pass → 0.87 functional
  • 30 Oct 26 0
    • Stability: 0.97 → pass security
  • 29 Oct 26 +1

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

  • 28 Oct 26 −1
    • GHSA-f897-62hf-6gxq affects this package: high ▼ security
    • Stability: pass → 0.93 functional
  • 25 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 24 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Schema quality: 2744 → 3763 ▼ functional
    • Package version: 0.3.3 → 0.5.1 functional
  • 21 Oct 26 0
    • CVE-2026-111768 affects this package: high ▼ security
    • CVE-2026-111767 affects this package: high ▼ security
    • CVE-2026-111769 affects this package: high ▼ security
    • CVE-2026-111771 affects this package: high ▼ security
  • 16 Oct 26 0
    • Stability: 0.97 → pass security
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 5 Nov 2026 · Analysed npm/@pyai/mcp@0.5.1

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 →

Vulnerabilities 6 findings
ID CVE Severity Vector Fix available
GHSA-22jm-h49p-29qw CVE-2026-111767 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:L yes
GHSA-46jr-4wx8-v453 CVE-2026-111768 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H yes
GHSA-6prh-2h8m-c8cw CVE-2026-111769 medium CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N yes
GHSA-6qxp-vccf-f47h CVE-2026-104850 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N yes
GHSA-f897-62hf-6gxq high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H yes
GHSA-rvq5-wwqv-78pq CVE-2026-111771 medium CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N yes

Background: What a vulnerability scan can and cannot prove →

Dependencies 93 packages
Packages resolved 93
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 57 exposed · ~3,551 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
calls_get ~45

Read the current state of an outbound call by returned ID. dispatch_unknown needs inspection, not another call. Recap and Omni recordings are separate resources.

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

calls_list ~28

List outbound calls and normalized network outcomes before retrying a dispatch.

NameTypeReqDescription
limitinteger––

No output schema declared.

No examples provided.

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
aggressivenessnumber–Operating point 0-1 (default 0.25).
webhook_urlstring–https 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 ~95

Fetch audio from the user-authorized HTTPS source URL and start a translation and dubbing job. Accesses an external source and 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
labelstring–Optional 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_idstring–Stable id for the post-call Recap. Defaults to the job id.
channelboolean–Dual-channel (stereo) per-channel speakers.
customer_namestring––
diarizeboolean–Single-track speaker diarization.
modelstring––
output_formatsarray–Defaults to [json].
pack_idstring–Optional 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 ~92

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
querystring–Product name or task, e.g. “translate audio”, “voice agent”, “TTS”.
taskstring–Alias for query. If both are supplied, they must match after trimming.

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_idstring–Defaults to sales_outbound.
enabledboolean–Defaults to true.
webhook_urlstring–https 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 ~66

Retrieve the status and available results of an existing dubbing job by job_id. This read does not start or repeat a 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_idstring–Agent 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_daysinteger–Trailing 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
limitnumber–Max results (1-100, default 20).
session_labelstring–Filter 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
limitnumber–Max 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
cursorstring–Opaque token from a previous page's `next_cursor`. Omit for the first page.
limitinteger–Max 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
genderstring–Filter by voice gender (e.g. female, male).
regionstring–Filter by accent/region (e.g. en_us, en_gb).

No output schema declared.

No examples provided.

omni_get_call ~59

Read an Omni session's transcript, recording availability and summary. For outbound calls use artifacts.omni_call_id from calls_get.

NameTypeReqDescription
call_idstringyesStable opaque PyAI-owned call identifier. Use it unchanged across every Omni call sub-resource.

No output schema declared.

No examples provided.

omni_get_recording ~84

Get the canonical authenticated recording resource URL. Requires response=url. This URL is not public playable audio; recording must have been enabled.

NameTypeReqDescription
call_idstringyesStable opaque PyAI-owned call identifier. Use it unchanged across every Omni call sub-resource.
responsestringyesSet to `url` to return the canonical authenticated PyAI recording resource as JSON.

No output schema declared.

No examples provided.

omni_get_summary ~54

Read the structured summary for an Omni call when generated; a missing summary is not an empty result.

NameTypeReqDescription
call_idstringyesStable opaque PyAI-owned call identifier. Use it unchanged across every Omni call sub-resource.

No output schema declared.

No examples provided.

omni_get_transcript ~46

Read the complete Omni call transcript through the authenticated API.

NameTypeReqDescription
call_idstringyesStable opaque PyAI-owned call identifier. Use it unchanged across every Omni call sub-resource.

No output schema declared.

No examples provided.

omni_list_calls ~66

List Omni sessions, including inbound calls. Filter by session_label and preserve each returned call_id.

NameTypeReqDescription
cursorstring–Pass the previous page's `next_cursor`.
limitinteger––
session_labelstring–Only calls connected with this opaque session tag.

No output schema declared.

No examples provided.

openapi_get ~85

Fetch live API operation discovery with a SHA-256 digest. Supply path and method for one operation and its referenced schemas, or include_document=true for the entire contract. Pin sha256 to detect contract drift. No API key required.

NameTypeReqDescription
include_documentboolean––
methodstring––
pathstring––
sha256string––

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.
intensity–yes–
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.
modelstring–Defaults to pyai-speak.
output_pathstring–Absolute file path to write the audio to.
response_formatstring–Defaults to wav.
voicestring–Voice id from list_voices. Omit for the account default.

No output schema declared.

No examples provided.

telephony_bind_number ~50

Bind an owned number to an Agent using body.agent_id; null unassigns. Read existing bindings first. Changes inbound routing.

NameTypeReqDescription
bodyobjectyes–
idstringyes–

No output schema declared.

No examples provided.

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
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. User-approved phone calls, speech, transcription and voice agents with PyAI OAuth. This page covers its npm package (@pyai/mcp).

Is the PyAI Voice AI MCP server safe to use?

PyAI Voice AI scores 72 out of 100 on VerifyMCP. We recorded 6 known advisories against it as of 5 November 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 57 tools: openapi_get, create_sandbox_key, get_started, whoami, list_models, and 52 more. Their descriptions and schemas cost roughly 3,551 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 5 November 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.