# PyAI Voice AI (npm · @pyai/mcp)

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

- Trust score: 71/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `api.pyai.com`: 38/100, [markdown](https://verifymcp.io/servers/atomsai-pyai/api.md), [page](https://verifymcp.io/servers/atomsai-pyai/api)
- npm · `@pyai/mcp`: 71/100 (this document), [markdown](https://verifymcp.io/servers/atomsai-pyai/pyai-mcp.md), [page](https://verifymcp.io/servers/atomsai-pyai/pyai-mcp)

## Channel facts

- Registry: `npm`
- Package: `@pyai/mcp`
- Version: `0.3.3`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

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

## 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.

### Claude

```bash
claude mcp add atomsai-pyai -- npx -y @pyai/mcp
```

### Cursor

```json
{
  "mcpServers": {
    "atomsai-pyai": {
      "command": "npx",
      "args": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "atomsai-pyai": {
      "command": "npx",
      "args": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
```

### Codex

```bash
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
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add atomsai-pyai --command npx --arg -y --arg @pyai/mcp
```

### Hermes

```yaml
mcp_servers:
  atomsai-pyai:
    command: "npx"
    args: ["-y", "@pyai/mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "atomsai-pyai": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add atomsai-pyai -t stdio -c npx -a -y @pyai/mcp
```

### Other

```json
{
  "mcpServers": {
    "atomsai-pyai": {
      "command": "npx",
      "args": [
        "-y",
        "@pyai/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 71, +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.

### 2026-09-18 (score 70, +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.

### 2026-09-16 (score 69, +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.

### 2026-09-13 (score 68, +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.

### 2026-09-11 (score 67, +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.

### 2026-09-09 (score 66, +16)

- [security regression] Tool safety: pass → unverified
- [security improvement] 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.
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional improvement] Stability: unverified → 0.03
- [functional] Package version: 0.3.0 → 0.3.3
- [functional] Package version: 0.3.0 → 0.3.2

### 2026-09-08 (score 50)

First indexed and scored.

## MCP tools (44)

### `create_sandbox_key` (~80 tokens)

Create Sandbox Key

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.

Input parameters:

- `label` (string): Optional label (e.g. your app name) shown in the PyAI console.

### `get_started` (~61 tokens)

Get Started

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.

### `whoami` (~53 tokens)

Who Am I

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.

### `list_models` (~20 tokens)

List Models

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

### `list_voices` (~81 tokens)

List Voices

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

Input parameters:

- `gender` (string): Filter by voice gender (e.g. female, male).
- `region` (string): Filter by accent/region (e.g. en_us, en_gb).

### `synthesize_speech` (~132 tokens)

Synthesize Speech

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.

Input parameters:

- `input` (string, required): Text to synthesize.
- `model` (string): Defaults to pyai-speak.
- `output_path` (string): Absolute file path to write the audio to.
- `response_format` (string): Defaults to wav.
- `voice` (string): Voice id from list_voices. Omit for the account default.

### `create_transcription_job` (~159 tokens)

Create Transcription Job

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

Input parameters:

- `audio_url` (string, required): https URL of the audio to transcribe.
- `call_direction` (string)
- `call_id` (string): Stable id for the post-call Recap. Defaults to the job id.
- `channel` (boolean): Dual-channel (stereo) per-channel speakers.
- `customer_name` (string)
- `diarize` (boolean): Single-track speaker diarization.
- `model` (string)
- `output_formats` (array): Defaults to [json].
- `pack_id` (string): Optional Recap pack (default sales_outbound).

### `get_transcription_job` (~38 tokens)

Get Transcription Job

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

Input parameters:

- `job_id` (string, required): The job_id from create_transcription_job.

### `configure_amd` (~143 tokens)

Configure AMD

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.

Input parameters:

- `aggressiveness` (number): Operating point 0-1 (default 0.25).
- `webhook_url` (string): https URL to POST amd.call.completed events to.

### `list_amd_calls` (~106 tokens)

List AMD Calls

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.

Input parameters:

- `limit` (number): Max results (1-100, default 20).
- `session_label` (string): Filter by the opaque connect-URL/TwiML tag.

### `get_amd_call` (~57 tokens)

Get AMD Call

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

Input parameters:

- `call_id` (string, required): The call id the decision was recorded under.

### `enable_recap` (~99 tokens)

Enable Recap

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.

Input parameters:

- `default_pack_id` (string): Defaults to sales_outbound.
- `enabled` (boolean): Defaults to true.
- `webhook_url` (string): https URL for recap.complete events.

### `create_recap` (~103 tokens)

Create Recap

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.

Input parameters:

- `call_direction` (string)
- `call_id` (string, required): Stable id you will read back.
- `customer_name` (string)
- `pack_id` (string)
- `utterances` (array, required)

### `get_recap` (~82 tokens)

Get Recap

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).

Input parameters:

- `call_id` (string, required): The call_id passed to create_recap or the Hear job.

### `list_recap_calls` (~59 tokens)

List Recap Calls

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

Input parameters:

- `limit` (number): Max results (1-100, default 20).
- `status` (string)

### `list_agents` (~19 tokens)

List Agents

List saved voice Agent profiles before creating or changing one.

### `create_agent` (~61 tokens)

Create Agent

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

Input parameters:

- `body` (object, required): Writable agent fields. On update, present fields are set, `null` clears, absent fields are untouched.

### `get_agent` (~40 tokens)

Get Agent

Read a saved voice Agent profile and its current configuration.

Input parameters:

- `id` (string, required): Agent id, e.g. `agent_7f3a…`.

### `update_agent` (~60 tokens)

Update Agent

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

Input parameters:

- `body` (object, required): Writable agent fields. On update, present fields are set, `null` clears, absent fields are untouched.
- `id` (string, required)

### `set_agent_tools` (~42 tokens)

Set Agent Tools

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

Input parameters:

- `body` (array, required)
- `id` (string, required)

### `set_agent_knowledge` (~39 tokens)

Set Agent Knowledge

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

Input parameters:

- `body` (array, required)
- `id` (string, required)

### `get_trace_config` (~35 tokens)

Get Trace Config

Inspect Trace call-compliance configuration.

Input parameters:

- `agent_id` (string): Agent to read config for; omit for the org default.

### `configure_trace` (~48 tokens)

Configure Trace

Configure Trace compliance monitoring for the selected workspace.

Input parameters:

- `body` (object, required): Per-agent Trace config (spec §5.1). May be wrapped as { agent_id, config } or sent raw.

### `list_trace_rule_packs` (~21 tokens)

List Trace Rule Packs

Discover available Trace compliance rule packs before enabling monitoring.

### `create_trace_rule_pack` (~43 tokens)

Create Trace Rule Pack

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

Input parameters:

- `body` (object, required): An authored rule pack in the Trace DSL (rule_pack_schema.json).

### `list_trace_interactions` (~48 tokens)

List Trace Interactions

Find monitored calls and interactions for compliance review.

Input parameters:

- `agent_id` (string)
- `cursor` (string)
- `limit` (integer)
- `verdict` (string)

### `get_trace_interaction` (~29 tokens)

Get Trace Interaction

Read one monitored interaction and its compliance evidence.

Input parameters:

- `id` (string, required): The call_id.

### `list_trace_findings` (~71 tokens)

List Trace Findings

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

Input parameters:

- `action` (string)
- `check_id` (string)
- `cursor` (string)
- `interaction_id` (string)
- `limit` (integer)
- `severity` (string)

### `list_trace_violations` (~56 tokens)

List Trace Violations

List Trace rule violations for compliance review.

Input parameters:

- `cursor` (string)
- `interaction_id` (string)
- `limit` (integer)
- `rule_id` (string)
- `severity` (string)

### `get_trace_exposure` (~31 tokens)

Get Trace Exposure

Read aggregate compliance exposure for the workspace.

Input parameters:

- `window_days` (integer): Trailing window in days.

### `get_recap_config` (~20 tokens)

Get Recap Config

Read Recap summarization configuration before changing it.

### `get_cast_capabilities` (~22 tokens)

Get Cast Capabilities

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

### `direct_cast_script` (~31 tokens)

Direct Cast Script

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

Input parameters:

- `body` (object, required)

### `render_cast` (~53 tokens)

Render Cast

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.

Input parameters:

- `body` (object, required)

### `list_transcription_jobs` (~61 tokens)

List Transcription Jobs

Find existing audio processing and transcription jobs before submitting duplicates.

Input parameters:

- `cursor` (string): Opaque token from a previous page's `next_cursor`. Omit for the first page.
- `limit` (integer): Max items to return (1-100).

### `discover_tools` (~71 tokens)

Discover Tools

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.

Input parameters:

- `query` (string): Product name or task, e.g. “translate audio”, “voice agent”, “TTS”.

### `get_dub_capabilities` (~24 tokens)

Get Dub Capabilities

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

### `create_dub` (~81 tokens)

Create Dub

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.

Input parameters:

- `source_lang` (string, required): Source language from get_dub_capabilities.
- `source_url` (string, required)
- `target_lang` (string, required): Target language from get_dub_capabilities.

### `get_dub_job` (~46 tokens)

Dubbing

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

Input parameters:

- `job_id` (string, required): The ID returned by the original submission; do not invent one.

### `get_dub_audio` (~51 tokens)

Get Dub Audio

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

Input parameters:

- `job_id` (string, required): The ID returned by the original submission; do not invent one.

### `get_cast_render` (~42 tokens)

Get Cast Render

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

Input parameters:

- `job_id` (string, required): The ID returned by the original submission; do not invent one.

### `get_cast_audio` (~40 tokens)

Get Cast Audio

Retrieve completed Cast narration as playable audio or a download.

Input parameters:

- `job_id` (string, required): The ID returned by the original submission; do not invent one.

### `preview_cast_line` (~67 tokens)

Preview Cast Line

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

Input parameters:

- `emotion` (string, required): Supported emotion.
- `intensity` (required)
- `text` (string, required): Narration text.
- `voice` (string, required): A supported Cast voice.

### `transcribe_audio` (~79 tokens)

Transcribe Audio

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

Input parameters:

- `audio_base64` (string, required): Base64-encoded audio bytes, without a data: prefix.
- `filename` (string, required)
- `language` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/atomsai-pyai/pyai-mcp#diagnostics

## Score history

- 2026-09-20: 71
- 2026-09-19: 70
- 2026-09-18: 70
- 2026-09-17: 69
- 2026-09-16: 69
- 2026-09-15: 68
- 2026-09-14: 68
- 2026-09-13: 68
- 2026-09-12: 67
- 2026-09-11: 67
- 2026-09-10: 66
- 2026-09-09: 66
- 2026-09-08: 50

## 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.

## Links

- npm package: https://www.npmjs.com/package/@pyai/mcp
- Socket report: https://socket.dev/npm/package/@pyai/mcp
- Website: https://pyai.com/mcp
- Changelog RSS feed: https://verifymcp.io/servers/atomsai-pyai/pyai-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/atomsai-pyai/pyai-mcp.json
- HTML version of this page: https://verifymcp.io/servers/atomsai-pyai/pyai-mcp
