@paxalabs/mcp
OfficialThis server lets an agent synthesize and play speech, process audio/documents, translate text, and manage Paxa voices/account through Paxa Labs APIs.
Speak short text aloud, queue long-form reading, control the shared playback queue (status/pause/resume/skip/clear), and play local audio files.
Generate speech audio files (mp3/opus/wav), including long scripts, optional SRT/VTT subtitles, and voice/model/speed/language controls.
Design and refine draft voices; save/rename/delete designed voices; list voices and models.
Translate text (to Thai in the provided schema) with context, glossary, formality, instructions, and term-preservation controls.
OCR local PDFs/images to Markdown or structured blocks; extract typed fields from documents using a custom schema.
Transcribe local audio/video to text, with optional speaker labels, word timings, subtitles, pause detection, and vocabulary pinning.
Record one microphone turn and return its transcript.
Send feedback tied to request IDs; check account credits, plan, and rate limits.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@paxalabs/mcpOCR this PDF and read the text aloud in English."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@paxalabs/mcp
Official MCP server for the Paxa Labs API: Thai, English, and Mandarin Chinese speech AI for your agent, including local audio playback, plus transcription, translation, and document reading across languages.
An agent connected to this server can speak out loud through your machine's speakers, read long content aloud as a managed playback queue, save speech to audio files, listen for a spoken reply, transcribe recordings with subtitles, translate between 15 languages, read PDFs and images with OCR, and extract typed fields from documents.
Beta. The tool set is complete and tested end to end, but tool names and behavior may still change before 1.0 as feedback comes in. Report problems at https://github.com/paxalabs/mcp/issues.
Quick start
You need a Paxa API key from paxalabs.com. New accounts include free credits.
Claude Code
claude mcp add paxa -e PAXA_API_KEY=pxa_your_key_here -- npx -y @paxalabs/mcpClaude Desktop, Cursor, and other MCP clients
Add to your client's MCP configuration (for Claude Desktop:
claude_desktop_config.json):
{
"mcpServers": {
"paxa": {
"command": "npx",
"args": ["-y", "@paxalabs/mcp"],
"env": {
"PAXA_API_KEY": "pxa_your_key_here"
}
}
}
}One click for Cursor or VS Code: the buttons install the same entry
into ~/.cursor/mcp.json or VS Code's MCP settings. Then replace
pxa_your_key_here in the paxa entry with your key.
Related MCP server: kokoro-tts
Tools
Tool | What it does | Credits |
| Synthesize a short line and play it through the speakers, blocking until done | 10 per 1000 chars (12.5 in a designed voice) |
| Read long content aloud: auto-chunks, synthesizes ahead while playing, returns immediately | 10 per 1000 chars (12.5 in a designed voice) |
| Control the shared audio queue: | free |
| Play a local audio file through the speakers | free |
| Synthesize speech to an audio file (mp3, opus, wav, raw pcm, or mulaw and alaw for phone lines, with | 10 per 1000 chars (12.5 with subtitles or in a designed voice, 15 with both) |
| Make a new voice from a written description and play the line it speaks | 5 per call |
| Change a draft voice in words, such as "a little lower and slower", and play its new line | 5 per call |
| Save a draft as one of your voices, with an id the speech tools accept | free |
| Rename one of your designed voices; the id and sound stay | free |
| Delete one of your designed voices and free its slot | free |
| Translate into any of 15 languages from any of them, with formality, glossary, style examples, alternative renderings, and context controls | 25 per 1000 chars per rendering |
| OCR a local PDF, PNG, JPEG, or WebP (Thai, English, Simplified Chinese, and more, mixed pages too) into Markdown or structured blocks | 6.5 per page |
| Fill a schema of typed fields (Thai IDs, dates, amounts, banks, line items) from a local PDF or image; every value is printed in the document or null with the reason | 13 per page (19.5 for schemas over 50 fields) |
| Record one spoken turn from the microphone and return its transcript; the API detects when the user stops talking | 12.5 per minute listened |
| Rate an output or report a problem to the Paxa team, tied to the request ids the tools print | free |
| Transcribe a local recording or video (Thai, English, Mandarin, other languages, mixed) to text, with optional speaker labels, word timings, srt or vtt subtitles, and a list of pauses to cut | 8.33 per minute |
| Your designed voices and slots, then the TTS voice roster with character notes | free |
| Available models, limits, and pricing | free |
| Credit balance, plan, and rate limits | free |
All audio flows through one ordered queue, so sounds never overlap: speak
lines slip in ahead of queued long-form segments, and queue_speech keeps a
book or article flowing gap-free by synthesizing the next segment while the
current one plays.
With a streaming-capable player installed (see below), speech starts on the first bytes from the API instead of after the full download: about 0.3 s to the first word regardless of length, versus 0.7 s for a short line and 2.5 s for a long paragraph when buffered.
Voice mode for Claude Code
Three pieces turn Claude Code into something you can walk away from: it talks when it has news, and it calls you when it needs you.
1. Install the server (Quick start above).
2. Tell Claude when to talk. Add this to ~/.claude/CLAUDE.md, or to
one project's CLAUDE.md:
## Voice
I have the Paxa MCP server (tools: speak, queue_speech, control_playback).
I am often away from the screen, so use voice like this:
- At the end of a turn where you did real work, call speak with a one or
two sentence summary before writing the final message: what you did,
what is next, and anything you need from me.
- When you need a decision from me, speak the question too.
- Keep it short and conversational. Never read code, file paths, logs, or
long lists aloud. Those stay in text.
- Do not speak for quick back-and-forth or trivial answers.
- If I ask to hear something long, use queue_speech.
- Speak in the language I write in.3. Get told when Claude needs you. When Claude Code waits for a
permission or an answer, the model is not running, so it cannot call
speak. Claude Code fires a hook at those moments instead, and paxa say
turns the hook into a spoken phrase such as "Permission needed." Put
the paxa command on your PATH:
npm install -g @paxalabs/mcpThen add to ~/.claude/settings.json:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt|idle_prompt|agent_needs_input",
"hooks": [{ "type": "command", "command": "paxa say" }]
}
]
}
}paxa say takes the key from PAXA_API_KEY, or from the paxa entry in
~/.claude.json when that is unset, so step 1 is all the setup it needs.
A Stop hook configured the same way speaks "Done." at the end of every
turn.
The built-in phrases are synthesized once per voice and kept in your
user cache directory (~/Library/Caches/paxa/say on macOS,
~/.cache/paxa/say on Linux, %LOCALAPPDATA%\paxa\cache\say on
Windows). After that first play, which costs well under one credit, a
notification plays from disk: no network round trip and no credits.
To change the words, write your own text in the hook command and add
--cache so it gets the same treatment. One entry per event, since the
matcher picks the event:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [{ "type": "command", "command": "paxa say --cache \"Hey, need your OK\"" }]
},
{
"matcher": "idle_prompt|agent_needs_input",
"hooks": [{ "type": "command", "command": "paxa say --cache --voice cookie \"Your turn\"" }]
}
]
}
}Without --cache, nothing you type or pipe into paxa say is written to
disk, and messages carried inside a hook payload never are.
On macOS the built-in afplay needs about half a second just to start
and stop, which is most of the delay you hear on a short phrase. With
brew install mpg123 (or ffmpeg) installed, cached phrases play
through that instead: mpg123 starts in about 50 ms, ffplay in about 300 ms.
paxa say also works on its own:
paxa say "Build finished"
paxa say --voice cookie "Deploy is live"If your editor or desktop app was not launched from a terminal, its PATH
may not include your node bin directory, and the hook will fail silently.
Use the absolute path to paxa in the hook command if that happens.
Speech models
Speech runs on Paxa TTS Flash v2 by default: 50 voices that each speak
Thai, English, and Mandarin Chinese, and every voice reads direction tags
written into the text, such as [whispering], [laughs],
[speaking slowly, close to the microphone], a weighted blend like
[happy:0.7+sad:0.3], or <emph> and <whisper> marks. Pause tags add
silence where they stand: [short pause], [pause], [long pause], or an
exact [pause 300ms] up to 500 ms. Nothing in brackets is spoken, tag
characters bill as text, and a tag the model cannot do is refused before
any charge. The directions guide
lists every sound and rule.
temperature (0 to 2, default 0.5) sets how much a reading varies from one
request to the next. Use 0 when a line must match the takes around it, such
as one sentence regenerated inside a finished voiceover.
Pass model: "paxa-tts-flash-v1" on a call, or set PAXA_TTS_MODEL, only
for v1's legacy features: four Thai voices with regional accents (Isan,
Northern, Southern), the fixed emotion tags on khanomchan and kaprao,
or one of the eight voices v2 does not carry (donut, toast, padthai, yoyo,
somtam, larb, khaosoi, roti). Same price and limits on both.
Design your own voice
When no catalog voice fits, describe the one you want. design_voice turns
one or two sentences (who is speaking, how they sound, where it will be
heard, and the language they speak) into a voice and plays the line it
speaks. refine_voice takes one change at a time, such as "a little lower
and slower", and the rest of the voice stays; earlier drafts stay usable,
so you can go back to one. save_voice keeps the draft you like
under an id (voice_...) that speak, queue_speech, and
text_to_speech accept on Paxa TTS Flash v2; set it as
PAXA_DEFAULT_VOICE to make it the default. Each design or change costs 5
credits, saving is free, and speech in a designed voice costs 1.25x. Your
plan sets how many voices you keep (Free 1, Starter 3, Standard 10, Pro
50); list_voices shows them with the slots in use, rename_voice
renames one, and delete_voice frees one. The voice description guide
has examples.
Content creation
Three things creators asked for, each the local half of an API call:
Transcribe a video. Give
transcribe_audioan mp4, mov, mkv, or most other containers; ffmpeg pulls the sound track out locally and the API transcribes it. Addpauses_over: 0.7and the result lists every silence longer than that with its start and end, the dead air to cut. Ask forsave: ["srt"]and the captions come back too.Voiceover with captions that match.
text_to_speechwithsubtitles: "srt"(or"vtt") writes a caption file next to the audio, timed from the synthesized words. Cues break at sentence punctuation, at pauses, and at the line budget, never inside a word, and Thai lines end where the writer put a space. A Chinese character takes two columns of the line budget, so Mandarin lines hold 16 characters by default. Timed synthesis bills 1.25x.Long narration to one file. Scripts past 5,000 characters are split at paragraphs and sentences, synthesized part by part, and joined into a single file, captions offset to match.
ffmpeg is the one requirement for video input and for joining mp3, opus, or
wav parts (brew install ffmpeg on macOS). Raw pcm, mulaw, and alaw parts
join without it, and everything else works without it too.
Translation
translate writes any of 15 languages from any other: Thai, English,
Chinese (Simplified), Japanese, Korean, Arabic, French, German, Hindi,
Indonesian, Malay, Portuguese, Russian, Spanish, and Vietnamese. target is
required; the source is detected per segment, so mixed-language text works,
and source pins it when detection is wrong. Formality, borrowed words,
glossaries, and style examples follow the target, and alternatives (up
to 5) returns extra renderings, each billed as another pass over the text.
Send a whole glossary: terms that do not appear in the text are dropped
before billing, and the result says how many were sent.
Listening
listen turns the microphone into an answer. Ask a question with speak,
call listen, and the user's spoken reply comes back as text as soon as
they stop talking: Paxa's realtime transcription detects the end of the
turn, so nothing has to guess at silence. The audio goes straight to the
API and is never written to disk. A few seconds of listening costs well
under one credit (12.5 credits per minute, silence included).
It needs a command-line recorder, which stock macOS and Windows do not
ship: brew install ffmpeg or brew install sox on macOS; sox on Windows
(or ffmpeg with PAXA_MIC set to the DirectShow device name); ffmpeg,
sox, parecord, or arecord on Linux. It also needs Node 22 or newer,
and the app that launched the server (Terminal, VS Code, Claude Desktop)
must have microphone permission. PAXA_MIC picks a device when the
system default is not the one you want. To check recognition without a
microphone, node scripts/listen-file.mjs recording.mp3 feeds a file
through the same session.
Environment variables
Variable | Required | Default | Purpose |
| yes | Your API key. The server starts without it, but every tool that calls the API then fails with setup instructions the agent can relay | |
| no | working directory | Where |
| no |
| Speech model for every call that does not pick one. v2 has 50 voices that each speak Thai, English, and Mandarin, and all read direction tags. |
| no |
| Voice used when a tool call does not pick one: a catalog voice from |
| no | Keyword pinning for | |
| no |
| Speaking rate used when a call does not pick one, 0.5 to 1.5. Pitch is preserved and the price is the same; 1.2 to 1.3 suits long reads |
| no | system default | Microphone device for |
| no | A text file with one term per line ( | |
| no |
| API origin override |
To pin a different list per project, set the vocabulary variables in a
project-scope server entry (Claude Code's project scope, .cursor/mcp.json,
.vscode/mcp.json). On each call the tool takes the call's own terms first,
then the configured ones, deduplicated and cut at the API's limit of 50, and
reports how many it pinned.
Playback support
Platform | File player | Streaming player | Pause/resume |
macOS |
|
| yes |
Linux |
|
| yes |
Windows |
|
| no |
Streaming needs a player that reads from stdin. On macOS, brew install mpg123 (the quickest to start) or ffmpeg enables it; without one,
speech still plays through afplay after the download completes. If no player is found at all, speech
tools report it clearly and text_to_speech still works.
Claude Desktop extension
Each release on GitHub ships a .mcpb bundle. Download it, open it with
Claude Desktop, and enter your API key in the extension settings. The bundle
carries its own copy of the server and its dependencies, so it works without
Node.js or npm on the machine.
Development
pnpm install
pnpm build # compile to dist/
pnpm typecheck
pnpm mcpb # build release/paxalabs-mcp-<version>.mcpb for Claude Desktop
# live smoke test (spends a few credits, plays audio out loud)
PAXA_API_KEY=pxa_... TEST_OUT_DIR=/tmp/paxa-out node scripts/e2e.mjsAvailable Tools
19 toolscontrol_playbackPlayback controlA
Inspect and control the shared audio queue that speak, queue_speech, play_audio, and the voice design tools play through. status reports what is playing, what is queued, and any synthesis failures. pause holds playback until resume or clear, and audio queued meanwhile waits; pause is not supported on Windows, where skip or clear stops playback instead. skip drops the current segment and is refused when nothing is playing. clear stops playback and discards every queued segment, which must be queued again to be heard; audio files already written stay on disk. Free (no API call).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses traits the annotations cannot: queue scope is shared across sibling tools, pause is unsupported on Windows, skip is refused when idle, clear destroys queued segments that must be re-queued, and already-written files survive on disk. Also notes it is free (no API call). It does not say what status returns in detail or whether an output payload exists beyond the failure reporting mention.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, then walks the actions efficiently. Dense but every clause carries information; it is a single run-on paragraph, so slight readability cost versus a bulleted action list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-param control tool with no output schema, the description covers shared-state implications, per-action effects, platform caveats, irreversibility of clear, and cost — nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single action enum, so the description carries the full burden and does it: all five enum values (status, pause, resume, skip, clear) are given concrete semantics, side effects, and failure conditions, far beyond the bare enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('the shared audio queue') and verb ('inspect and control'), and explicitly ties it to the siblings that feed that queue (speak, queue_speech, play_audio, voice design tools). An agent can tell immediately that this governs playback state rather than producing audio itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each of the five actions is given a when-to-use condition: status to inspect, pause to hold (with the Windows exception steering to skip/clear), skip to drop the current segment (refused when nothing plays), clear to discard the queue. The alternatives and their selection conditions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_voiceDelete a designed voiceADestructiveIdempotent
Delete one of the account's designed voices and free its slot. The id is the voice_ id list_voices shows; it is looked up first, so an id the account does not have is answered without deleting anything, and catalog voices cannot be deleted. Cannot be undone: every later request in the voice fails, and designing again does not bring the same sound back. Use it only when the user asks to delete that voice; to change only its name, use rename_voice. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The designed voice's id (voice_...), from list_voices or save_voice |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real substance beyond them: the id is validated before deletion so a bad id is a no-op, catalog voices are refused, the deletion is irreversible, subsequent voice requests fail, and re-designing does not restore the sound. That is precisely the consequence information an agent needs before calling a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The irreversible consequence and the id semantics are front-loaded and every clause carries information an agent cannot get from structured fields. The trailing 'Free.' is a useful cost note but reads as an abrupt fragment, and the sentence is long enough that a reader must hold several conditions at once.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, single-parameter tool with no output schema, the description covers side effects, failure modes, and irreversibility thoroughly. It does not describe what a successful call returns (confirmation payload, freed slot info), which is the one gap left given there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already documented as 'voice_... from list_voices or save_voice', so the schema does most of the work. The description still adds value by explaining the lookup-first validation behavior tied to that id and by reinforcing the voice_ prefix convention, though it adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one of the account's designed voices') plus the side effect ('free its slot'), which immediately separates it from siblings like rename_voice or refine_voice. The scope limit ('catalog voices cannot be deleted') further pins down exactly what object class it operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('Use it only when the user asks to delete that voice') and names the alternative for the adjacent intent ('to change only its name, use rename_voice'). The preconditions (id must come from list_voices, catalog voices excluded) are also stated, so an agent can route without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_voiceDesign a new voiceA
Make a new voice from a written description and play the line it speaks through this machine's speakers. Use it when the user wants a voice the catalog does not have. Describe who is speaking and how they sound in one or two sentences: age, gender, role, pitch and texture, pace and manner, where it will be heard, and the language it speaks (a designed voice speaks one language: the one the description names, otherwise the one it is written in), such as "A calm Bangkok pharmacist in her thirties who explains dosages slowly and kindly, speaking Thai". Leave out real people's names, sound effects, and what the voice should say. The result is a draft, not yet a voice: refine_voice changes it, save_voice keeps it. Costs 5 credits per call, the line included; a retry designs again and is charged again.
| Name | Required | Description | Default |
|---|---|---|---|
| play | No | Play the voice's line out loud (default true). The line is saved to a file either way. | |
| description | Yes | Who the voice is and how it sounds, in English, Thai, or Chinese, up to 1000 characters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide the generic mutation profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false), and the description adds the material facts an agent needs: 5 credits per call with retries charged again, the result is an unsaved draft, and the line is written to a file even when play is off.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and trigger are front-loaded, and the cost/draft caveats close the text. The middle guidance paragraph is dense and slightly run-on, but each sentence carries actionable content rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (a draft voice, a spoken line, a saved audio file) and what the follow-up moves are. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely enriches the description parameter by enumerating the facets to include (age, gender, role, pitch and texture, pace, listening context, language) and supplies a worked example plus the one-language rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — making a new voice from a written description — and immediately adds the observable side effect of playing the line through the machine's speakers. This clearly separates it from list_voices, refine_voice, and save_voice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger ('when the user wants a voice the catalog does not have') and explicit alternatives in the sibling set: refine_voice changes the draft, save_voice keeps it. It also states what to exclude (real people's names, sound effects, the spoken content).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_fieldsExtract fields from a documentA
Extract typed fields from a local PDF, PNG, JPEG, or WebP document (up to 20 pages and 10 MiB) with Paxa Document Extraction. You write a schema of fields; every value returned is text printed in the document, read as the field's type, or null with the reason. Nothing is inferred or looked up. Built for Thai documents (receipts, tax invoices, forms, IDs) and fine on English ones. Use ocr_document instead for a document's full text. Returns a status line, the fields as JSON (null where a value is not printed), then the missing, unverified, truncated, and assumed fields. Costs 13 credits per page for a schema of up to 50 leaf fields and 19.5 per page for 51 to 100; the page reading and the evidence spans cost nothing extra. A schema the API refuses costs nothing and names the field and reason. The schema parameter summarizes the dialect; https://paxalabs.com/docs/extraction has every type and key.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | Yes | Prefer the most specific type for each field: a specific type verifies the printed value (a date must parse, a thai_id must pass its check digit, a bank must be a real bank) and returns a normalized form, while "string" only copies text. Give each field a short "description" of what it is on the page. Example: {"fields":{"seller":{"type":"string","required":true,"description":"Shop name as printed at the top"},"total":{"type":"number","required":true},"issued_on":{"type":"date"},"tax_id":{"type":"thai_id"},"items":{"type":"array","max_items":10,"items":{"type":"object","fields":{"name":{"type":"string"},"amount":{"type":"number"}}}}}}. Shape: {"fields": {name: definition, ...}}. A definition has "type", optional "required" (boolean), optional "description" (up to 200 chars, the one piece of prose the model reads: put the field's meaning there, e.g. "Seller name as printed at the top"), plus the keys its type offers. Leaf types: string (pattern, min_length, max_length), integer and number (min, max, decimals), date (returned as YYYY-MM-DD; min, max, not_future, year: recent|strict|be|ce), time, enum (values 1 to 50, aliases, strict; the only field that may be a judgment, such as the kind of document), id (digits, check: none|thai_mod11|luhn), thai_id, email, phone (format e164|national), postal_code, province, bank, insurer, card_scheme, payment_method, legal_form, currency, unit (closed sets with a format key), amount_words. Containers: object (fields) and array (items: a leaf or an object, and a required max_items 1 to 200; no array inside an array). At most 3 containers below the root. Names are 1 to 64 letters, digits, and underscores. The leaf count is every leaf once plus each array's leaves once per element it is sized for, up to 100. Full reference for every type and its keys, with worked examples: https://paxalabs.com/docs/extraction (Markdown at https://paxalabs.com/docs/extraction.md). | |
| file_path | Yes | Path to a local PDF, PNG, JPEG, or WebP file | |
| output_path | No | Save the full JSON response here. Relative paths resolve against PAXA_OUTPUT_DIR (or the working directory). An existing file is never overwritten. | |
| include_pages | No | Also return each page's text as Markdown, the reading the fields came from. Free. | |
| include_evidence | No | Also return, per field path, the printed span the value was read from. Free. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: page and file-size limits, no inference or lookup, the return structure, credit costs, free evidence spans, and the fact that a refused schema costs nothing. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loads the core purpose and alternative. Most sentences earn their place by covering limits, return behavior, cost, and schema guidance, though the final schema-reference sentence is somewhat redundant with the schema field.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex nested schema and no output schema, the description completes the picture by explaining what is returned, how nulls work, what extra outputs exist, and what the tool costs. An agent has enough context to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already carries the main parameter documentation, including the detailed schema dialect and the free flags. The description adds some cost context around leaf counts but does not meaningfully extend parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Extract typed fields from a local PDF, PNG, JPEG, or WebP document.' It distinguishes the tool from its sibling by explicitly naming ocr_document for full-text extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use and when-not-to-use guidance: use this for typed fields, and use ocr_document instead for a document's full text. It also frames the tool as built for Thai documents and fine for English ones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountAccount and creditsARead-onlyIdempotent
Show the API key's account, read from the API on each call: credit balance, spending cap, plan, and rate limits. Call it before a large paid job, or after a call fails for credits or a rate limit; prices per model are in list_models. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety bar is low; the description still adds real behavioral context by noting the data is read live from the API on each call (not cached) and that the call is free. It does not discuss auth failure modes or rate limiting of the endpoint itself, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads what the tool returns, the second the decision rule for calling it. Every clause carries information — no restatement of the title or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the burden of describing the return payload, and it does so by naming the four returned properties. Combined with the usage trigger and the live-read note, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document beyond the input schema's empty object. Baseline 4 applies; the description correctly implies no arguments are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Show') and resource (the API key's account), then enumerates exactly what is returned: credit balance, spending cap, plan, rate limits. It is clearly distinguishable from siblings like list_models, which the description explicitly assigns to per-model pricing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering conditions — before a large paid job, or after a failure due to credits or rate limits — and routes pricing questions to list_models. Both when-to-use and the alternative are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listenListen to the microphoneA
Record one spoken turn from this machine's microphone and return its transcript (Thai, English, Mandarin Chinese, or another language, code-switching included). Paxa's realtime transcription detects when the user starts and stops talking, so the call returns as soon as the turn ends; the audio goes straight to the API and nothing is written to disk. Waits for any speech this server is playing to finish first. Use it after speak when you asked the user a question and want their spoken answer; for a recording already on disk, use transcribe_audio instead. Returns an empty transcript when nobody spoke within wait_seconds. Costs 12.5 credits per minute of audio sent, silence included (a few seconds of listening costs well under one credit). Needs a microphone recorder on this machine (ffmpeg or sox; parecord or arecord on Linux) and Node 22 or newer; the host app must have microphone permission.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | "verbatim" (default) keeps fillers and false starts; "clean" drops them | |
| language | No | The language the speech is expected in, as a BCP 47 tag such as "th", "en", or "zh". A hint, not a filter: other languages are still written as spoken. Omit to auto-detect; set it when detection picks the wrong language. | |
| convention | No | "spoken" (default) writes numbers as said; "written" uses numerals. Only Thai is respelled. | |
| vocabulary | No | Keyword pinning, as in transcribe_audio. Added to any configured PAXA_VOCABULARY terms. | |
| max_seconds | No | Stop and return whatever was heard after this many seconds (default 30) | |
| wait_seconds | No | Give up when nobody has started speaking after this many seconds (default 15) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: states nothing is written to disk, that it returns an empty transcript on silence, that it waits for ongoing playback, and gives concrete cost (12.5 credits/min, silence included). It also discloses hard prerequisites (ffmpeg/sox, Node 22+, host microphone permission), which are exactly the failure modes an agent must anticipate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then edge cases, cost, and prerequisites — every sentence carries information an agent needs. It is on the long side at six sentences, but no single clause is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter, side-effecting, hardware-dependent capture tool with no output schema, the description covers return shape (transcript or empty), timing semantics, cost, prerequisites, and sibling routing. An agent has everything needed to call it correctly or decide not to.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is well documented in-schema, so the baseline is 3. The description only adds behavioral meaning for wait_seconds ('Returns an empty transcript when nobody spoke within wait_seconds'), leaving style, convention, vocabulary, language and max_seconds entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Record one spoken turn from this machine's microphone and return its transcript,' including supported languages. It also positively distinguishes itself from transcribe_audio (disk files) so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit invocation context ('after speak when you asked the user a question and want their spoken answer') and an explicit exclusion with a named alternative ('for a recording already on disk, use transcribe_audio instead'). The sequencing constraint ('waits for any speech this server is playing to finish first') further clarifies when it is safe to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsList modelsARead-onlyIdempotent
List the available Paxa models (speech, transcription, realtime transcription, translation, OCR, and extraction) with their limits and credit pricing, and the languages translate writes. Call it to check a limit or a price before a large job; voices are in list_voices, and the credit balance in get_account. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive, open-world call. The description adds useful non-annotation context: the models are free to list and the response includes limits, pricing, and supported translation languages. It does not discuss latency or pagination, but those are minor for a zero-parameter listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main action and scope, then adds usage guidance and sibling routing. Every sentence earns its place, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description fully covers what the tool returns, when to use it, its cost, and the relevant alternative tools. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. Per the baseline for zero-parameter tools, a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List the available Paxa models'. It enumerates the model categories and returned data (limits, credit pricing, translate languages), making clear how this differs from list_voices and get_account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call it: to check a limit or price before a large job. It also routes the agent to list_voices for voices and get_account for credit balance, covering the relevant alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voicesList voicesARead-onlyIdempotent
List the Paxa TTS voices in one response (no paging): recommended voices first, the account's designed voices with their slots, then the catalog roster per model with ids, names, gender, language, and character notes. Call it when the user asks what voices exist or wants a different one, and before save_voice to see free slots; pass an id from it as voice to speak, queue_speech, or text_to_speech. The default voice needs no lookup. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description still adds real value beyond that: no paging in a single response, the ordering of the returned groups, the fields surfaced per voice, and that the call is free. It stops short of size limits or failure modes, keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: what is returned and in what order, when to call it and what to feed the id into, then the default-voice exception and cost. Purpose is front-loaded and no clause is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must convey return shape, and it does: recommended voices, designed voices with slots, and per-model catalog entries with ids, names, gender, language, and character notes. That is sufficient for an agent to call it, parse it, and route the id onward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema carries nothing an agent must interpret and the baseline is 4. The description correctly notes that filtering/selection happens downstream by passing an id from the result rather than through any input argument.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (Paxa TTS voices) with scope clarified as a single non-paged response. It further distinguishes the content from a generic list by naming the ordering: recommended, account-designed voices with slots, then catalog roster per model.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit triggers: user asks what voices exist or wants a different one, and before save_voice to check free slots. It also closes the loop by naming what to do with the result (pass an id to speak, queue_speech, or text_to_speech) and states the negative case: the default voice needs no lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ocr_documentOCR a documentARead-onlyIdempotent
Run Paxa OCR on a local PDF, PNG, JPEG, or WebP file and return its content as GitHub-flavored Markdown (or structured blocks). Reads Thai, English, Simplified Chinese, and other languages as printed, pages that mix them included, with no language setting; text set in two columns reads column by column. output "structured" returns typed blocks as JSON instead of Markdown. Use extract_fields instead for specific values (a total, a date, an ID number) checked and typed against a schema. Up to 50 pages and 10 MiB per file. Costs 6.5 credits per page.
| Name | Required | Description | Default |
|---|---|---|---|
| output | No | "markdown" (default) returns prose; "structured" returns typed blocks as JSON | |
| file_path | Yes | Path to a local PDF, PNG, JPEG, or WebP file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: page/size limits (50 pages, 10 MiB), credit cost per page (6.5), automatic multi-language handling with no language setting, and two-column reading order. These are exactly the operational facts an agent needs before invoking a billed, open-world tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and output format, then language behavior, then the output-mode choice, then the sibling alternative, and finally limits and cost. Dense but every sentence carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing return values and does so (Markdown prose vs typed JSON blocks). Limits, cost, and language behavior round out a complete picture for a two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in structured form; the description's note on output="structured" largely restates the enum description. The added meaning (two-column reading, no language setting) is behavioral rather than parameter-level, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — run Paxa OCR on a local PDF/PNG/JPEG/WebP file — and names the exact return format (GitHub-flavored Markdown or structured blocks). It also explicitly distinguishes itself from the sibling extract_fields, so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative explicitly ("Use extract_fields instead for specific values (a total, a date, an ID number) checked and typed against a schema") and gives the condition that selects it. It also states when to pick output="structured" versus default markdown, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_audioPlay an audio fileA
Play a local audio file through this machine's speakers, for example a file produced earlier by text_to_speech. Waits for the audio playing now, plays ahead of queued long-form speech, and blocks until the file ends; control_playback skip or clear stops it early. Fails without playing when the file is missing, is not a playable format, or no audio player is installed; raw pcm, mulaw, and alaw files have no header and cannot be played. To say new text, use speak instead. Free (no API call).
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Path to a local audio file (mp3, wav, opus, ogg, flac, m4a, aac, aiff, caf), absolute or relative to the server's working directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing ordering semantics (waits for current playback, plays ahead of queued long-form speech), blocking behavior until the file ends, early-stop mechanism, and three distinct failure conditions that cause it to fail without playing. It does not describe the return value or what a successful block/skip outcome looks like, which is a minor remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the speaker target, then layers ordering, failure, and sibling routing. Dense but nearly waste-free; the middle sentence packs three playback-ordering claims into one clause, which costs some readability but not correctness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, non-destructive tool with no output schema, the description covers everything an agent needs: what plays where, ordering relative to other speech, blocking behavior, escape hatch, failure modes, and the explicit note that it is free (no API call).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the format list and path resolution rules are already documented. The description nevertheless adds real constraint information not in the schema: raw pcm, mulaw, and alaw files have no header and cannot be played, which narrows the effective domain of file_path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Play a local audio file through this machine's speakers') plus the provenance of typical inputs ('a file produced earlier by text_to_speech'). It also explicitly distinguishes itself from the sibling 'speak' for producing new speech, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives and the conditions that select them: use 'speak' to say new text, use 'control_playback' with skip/clear to stop early. It also warns that headerless raw pcm/mulaw/alaw cannot be played, which is a concrete when-not-to-use rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queue_speechQueue long-form speechA
Read long content aloud (stories, articles, books). Splits the text into segments, synthesizes ahead while playing, and returns at once with the segment count and the estimated credits; segments play in order after anything already queued. There is no handle: control_playback monitors and controls the whole queue. Use speak instead for one short line that should play now and wait, and text_to_speech for a file without playback. Costs 10 credits per 1000 characters, 12.5 in a designed voice (voice_...). Direction tags (paxa-tts-flash-v2, every voice): words in square brackets written into the text set the delivery from that point on, in English, Thai, or Chinese, e.g. [whispering], [speaking slowly, close to the microphone], [sad:0.5], or a blend [happy:0.7+sad:0.3]; [neutral] returns to the voice's own delivery. Sounds such as [laughs], [sighs], [gasps] play where written; [um] and [hmm] are spoken; ... and ... mark a span. [short pause], [pause], and [long pause] add silence after the word before them, and [pause 300ms] an exact length up to 500 ms. Nothing in brackets is spoken, tag characters bill as text, and a tag the model cannot do is refused before any charge. On paxa-tts-flash-v1 only khanomchan and kaprao read tags, from a fixed emotion list, and no voice reads pause tags.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to read aloud, Thai, English, or Mandarin Chinese | |
| model | No | "paxa-tts-flash-v2" (default) has 50 voices that each speak Thai, English, and Mandarin, and every one reads direction tags written into the text. Pick "paxa-tts-flash-v1" only for its legacy features: regional Thai accents (Isan, Northern, Southern), the fixed emotion tags on khanomchan and kaprao, or one of the eight voices v2 does not carry (donut, toast, padthai, yoyo, somtam, larb, khaosoi, roti). Same price and limits. | |
| speed | No | Speaking rate from 0.5 to 1.5 as a multiplier on the voice's design speed (1 is as designed; 1.2 to 1.3 suits long reads). Pitch is preserved and the price is the same. Defaults to PAXA_DEFAULT_SPEED when set. | |
| voice | No | Voice id from list_voices (default "foithong"), or a designed voice's id (voice_...) from save_voice, which speaks only on paxa-tts-flash-v2. Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one. | |
| language | No | How codes, digits, and symbols are read: "th", "en", or "zh". Words keep the language of their script. Default "auto" works it out from the text; set it when a code such as AB2039 should be spelled in a particular language. | |
| temperature | No | How much the reading (pacing, pauses, breaths, melody) varies from one request to the next, 0 to 2, rounded to the nearest 0.1 (default 0.5). 0 gives the most repeatable reading, such as a line regenerated to match the rest of a voiceover; higher values vary more. Read by paxa-tts-flash-v2; v1 refuses any value but 0.5. Same price. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses queueing semantics, immediate return behavior, pricing (10 credits per 1000 characters, 12.5 for designed voices), tag billing, and that unsupported tags are refused before any charge. It also documents model-specific tag behavior and limitations, which is substantial behavioral context for a non-idempotent, open-world tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, queue behavior, and alternatives, and nearly every sentence carries useful information. It is long and dense because of the tag syntax and model-specific rules, which are justified, but the structure could be easier to scan with clearer separation between tag documentation and core tool behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex TTS tool with no output schema, the description covers the important behavior: what is returned immediately, how queueing works, how playback is controlled, pricing, and tag handling. The annotations already provide safety metadata, and the description fills in the operational details an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains how direction tags embedded in the text parameter are interpreted, ties the voice parameter to designed-voice pricing, and notes v1 limitations. It does not fully elaborate every parameter such as speed or temperature, but the schema already does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a precise verb and resource ('Read long content aloud') and explains the core behavior: segmentation, ahead-of-play synthesis, immediate return with segment count and estimated credits, and ordered queueing after existing items. It also distinguishes this tool from siblings by explicitly naming speak and text_to_speech as alternatives for different use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says when to use this tool versus alternatives: use speak for a short line that should play now and wait, and text_to_speech for a file without playback. It also explains the lack of a handle and points to control_playback for monitoring and controlling the whole queue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refine_voiceRefine a draft voiceA
Change a draft voice in words and play its new line. The instruction says what to change, such as "a little lower and slower" or "warmer, and older"; the rest of the voice stays, so change one quality at a time. Each call returns a new draft handle and the earlier handles keep their versions, so the user can go back to one. save_voice keeps the draft the user picks. Refining never changes a voice already saved: saving a refined draft makes another voice, and rename_voice changes only a name. Costs 5 credits per call, the line included; a retry refines again and is charged again.
| Name | Required | Description | Default |
|---|---|---|---|
| play | No | Play the voice's line out loud (default true). The line is saved to a file either way. | |
| draft | Yes | A draft handle that design_voice or refine_voice printed (such as "draft-2"), or a draft string from the Paxa console. | |
| instruction | Yes | What to change about the voice, up to 500 characters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-readonly, non-destructive, non-idempotent; the description adds the material behavior: every call mints a new draft handle while prior handles retain their versions, saved voices are never altered, and each call costs 5 credits with retries charged again. That credit/versioning disclosure is exactly what an agent needs to avoid surprise costs or lost work.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the instruction semantics, then versioning, then alternatives and cost. Every sentence carries distinct information, but the closing sentence is dense enough that it reads as two obligations (cost plus retry billing) compressed into one, and the sibling differentiation slightly overlaps with usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly fills the gap by stating the return value ('a new draft handle') and the state model across calls. For a 3-parameter, non-idempotent, billed mutation, nothing an agent needs in order to call it correctly and safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above it by explaining what 'instruction' means in practice ('a little lower and slower', 'warmer, and older') and constraining it to a single quality change. The 'play its new line' phrasing also gives context for the play flag, though it doesn't restate the default or the file-saving behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a draft voice in words and play its new line') and immediately distinguishes it from design_voice, save_voice, and rename_voice. An agent can tell this is the iterative-refinement step rather than the create/save/rename steps without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use semantics ('change one quality at a time', with example instructions) and explicit routing to alternatives: save_voice keeps the draft the user picks, rename_voice only changes a name, and refining never mutates a saved voice. Exclusions and handoffs are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_voiceRename a designed voiceAIdempotent
Rename one of the account's designed voices, given its voice_ id from list_voices or save_voice. The id and the sound stay the same, so anything that uses the id keeps working. The new name takes 1 to 60 characters, and a catalog voice's name is refused. To change how a voice sounds, refine a draft and save it as a new voice; to remove one, use delete_voice. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The designed voice's id (voice_...), from list_voices or save_voice | |
| name | Yes | The new name, up to 60 characters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the id and audio are unchanged so existing references keep working (reinforcing idempotentHint), catalog voice names are refused, and the call is free. It does not describe failure behavior for an unknown or deleted id, which is the remaining gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, with the core action and its non-destructive guarantee front-loaded and the alternative tools demoted to the end. Every clause carries either a constraint or a routing decision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Two required string params, full schema coverage, no output schema — the description supplies the id source, name constraints, an error case, cost, and sibling routing. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3 baseline applies, and the description earns above it by explaining that name collisions with a catalog voice are rejected and by tying id to its origin tools. Length bounds are restated from the schema rather than expanded, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Rename one of the account's designed voices") plus the identifier convention (voice_ id from list_voices or save_voice). It is clearly distinguishable from sibling mutations like refine_voice, save_voice, and delete_voice, which are each named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: to change how a voice sounds, use refine + save as a new voice; to remove one, use delete_voice. It also names the source of the id and flags the catalog-voice name exclusion, so both the positive case and the alternatives are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_voiceSave a designed voiceAIdempotent
Save a draft from design_voice or refine_voice as one of the account's voices, and get its id (voice_...), which speak, queue_speech, and text_to_speech accept as voice on paxa-tts-flash-v2, for this account only. Save only the draft the user picked. Saving the same draft again returns the same voice and uses no slot. A saved voice's sound never changes: design a new voice for a different sound. The plan sets how many voices the account keeps (Free 1, Starter 3, Standard 10, Pro 50); list_voices shows the slots in use. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A name for the voice, up to 60 characters (default: the name the design gave it). A catalog voice's name is refused. | |
| draft | Yes | A draft handle that design_voice or refine_voice printed (such as "draft-2"), or a draft string from the Paxa console. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains that re-saving the same draft returns the same voice and consumes no slot (reinforcing idempotentHint), that a saved voice's sound is immutable, that voices are account-scoped, and that plan tier limits quantity. It also discloses the returned id format and which tools accept it, which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the action, output, and downstream usage land in the first sentence, then idempotency, immutability, and quota follow. The trailing 'Free.' fragment is a stray artifact that slightly hurts polish but costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description specifies the return value (voice_... id) and its consumers, and covers quota behavior, idempotency, and immutability. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, but the description adds that the draft handle originates from design_voice/refine_voice output or the Paxa console and that the resulting voice id is consumed by speak, queue_speech, and text_to_speech on paxa-tts-flash-v2. That is meaningful cross-tool semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (save) and resource (a draft from design_voice/refine_voice), plus the output (a voice id). It explicitly names the sibling tools that produce the input, distinguishing it from design_voice and refine_voice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context: save drafts produced by design_voice or refine_voice, save only the draft the user picked, and design a new voice if a different sound is wanted. It also points to list_voices for slot visibility and names the plan tiers that cap saving, so exclusions and alternatives are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_feedbackSend feedback to PaxaA
Report a wrong or poor output, an API problem, or a platform issue to the Paxa Labs team, tied to the request ids the other tools print ("Request id: ..."). A rating alone on at least one request id is a complete report. For a wrong output, add an example with the exact input, the output received, and the output expected. Returns the report's id once it is filed. Free, no credits. Use it when the user says an output was wrong, or asks to report a problem; do not file reports the user did not ask for.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | "model" for a wrong or poor output, "api" when the API misbehaved, "platform" for dashboard, billing, or docs, else "other" | |
| rating | No | Judgment of the output the request ids name | |
| example | No | A worked case: the exact input, the output received, and the output expected | |
| message | No | What happened and what was expected, plain text or Markdown | |
| request_ids | No | Up to 20 request ids from earlier tool results, or a live session's connection id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing cost ('Free, no credits'), a return value ('Returns the report's id once it is filed'), and the dependency on request ids printed by other tools. It does not address what happens if the same report is filed twice, which matters given idempotentHint=false, but the rest of the behavioral picture is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool is for, then the minimum report, then the richer case, then cost and return. Five dense sentences with no filler and no repetition of schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with a nested payload and no output schema, the description covers the prerequisite (request ids from prior results), the minimum acceptable call, the escalation path for wrong outputs, cost, and the return value. Nothing an agent needs in order to file a correct report is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema alone earns a 3. The description still adds real meaning: it explains where request_ids come from ('the request ids the other tools print ("Request id: ...")'), defines the minimum viable payload ('A rating alone on at least one request id is a complete report'), and specifies how to populate the nested example object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Report a wrong or poor output, an API problem, or a platform issue to the Paxa Labs team' — and enumerates the report kinds. That makes it unmistakably distinct from every sibling, which are all voice/speech/media tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both directions explicitly: 'Use it when the user says an output was wrong, or asks to report a problem; do not file reports the user did not ask for.' No plausible alternative tool exists here, so the absence of a named sibling is not a gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
speakSpeak out loudA
Synthesize a short line with Paxa TTS and play it through this machine's speakers. Blocks until playback finishes. Waits for the currently playing audio but jumps ahead of queued long-form segments. For long content use queue_speech. Costs 10 credits per 1000 characters, 12.5 in a designed voice (voice_...). Direction tags (paxa-tts-flash-v2, every voice): words in square brackets written into the text set the delivery from that point on, in English, Thai, or Chinese, e.g. [whispering], [speaking slowly, close to the microphone], [sad:0.5], or a blend [happy:0.7+sad:0.3]; [neutral] returns to the voice's own delivery. Sounds such as [laughs], [sighs], [gasps] play where written; [um] and [hmm] are spoken; ... and ... mark a span. [short pause], [pause], and [long pause] add silence after the word before them, and [pause 300ms] an exact length up to 500 ms. Nothing in brackets is spoken, tag characters bill as text, and a tag the model cannot do is refused before any charge. On paxa-tts-flash-v1 only khanomchan and kaprao read tags, from a fixed emotion list, and no voice reads pause tags.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to speak, Thai, English, or Mandarin Chinese, up to 2000 characters | |
| model | No | "paxa-tts-flash-v2" (default) has 50 voices that each speak Thai, English, and Mandarin, and every one reads direction tags written into the text. Pick "paxa-tts-flash-v1" only for its legacy features: regional Thai accents (Isan, Northern, Southern), the fixed emotion tags on khanomchan and kaprao, or one of the eight voices v2 does not carry (donut, toast, padthai, yoyo, somtam, larb, khaosoi, roti). Same price and limits. | |
| speed | No | Speaking rate from 0.5 to 1.5 as a multiplier on the voice's design speed (1 is as designed; 1.2 to 1.3 suits long reads). Pitch is preserved and the price is the same. Defaults to PAXA_DEFAULT_SPEED when set. | |
| voice | No | Voice id from list_voices (default "foithong"), or a designed voice's id (voice_...) from save_voice, which speaks only on paxa-tts-flash-v2. Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one. | |
| language | No | How codes, digits, and symbols are read: "th", "en", or "zh". Words keep the language of their script. Default "auto" works it out from the text; set it when a code such as AB2039 should be spelled in a particular language. | |
| temperature | No | How much the reading (pacing, pauses, breaths, melody) varies from one request to the next, 0 to 2, rounded to the nearest 0.1 (default 0.5). 0 gives the most repeatable reading, such as a line regenerated to match the rest of a voiceover; higher values vary more. Read by paxa-tts-flash-v2; v1 refuses any value but 0.5. Same price. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic read/write profile; the description adds the details an agent actually needs: it blocks until playback finishes, it preempts queued long-form segments, and it costs 10 credits per 1000 characters (12.5 in a designed voice). It also discloses that invalid tags are refused before any charge and that tag characters bill as text — exactly the kind of cost/failure semantics annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly — action, blocking behavior, and cost precede the long tag tutorial. The tag section is dense and occupies over half the text, but it is load-bearing information about how the required text parameter is interpreted and is not documented elsewhere. It would read better split into labeled sub-sections rather than one block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no output schema, the description covers cost, latency/blocking, queue interaction, model tradeoffs, and tag syntax thoroughly. The one meaningful omission is how to interrupt or stop playback once this blocking call is running, despite control_playback being a sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: the cost premium tied to a 'voice_...' designed voice, the fact that designed voices only work on v2, and the full direction-tag grammar for the text field including pause lengths and the model-specific tag support. The v1/v2 tag restriction is genuine added semantic weight not present in the model enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Synthesize a short line with Paxa TTS and play it through this machine's speakers') and immediately scopes it as short-form output. It explicitly names the sibling it is not (queue_speech for long content), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For long content use queue_speech' gives one explicit alternative with a clear selection condition, and the queue-priority sentence ('waits for currently playing audio but jumps ahead of queued long-form segments') further informs when this tool is the right choice. It does not differentiate from text_to_speech or play_audio, nor mention control_playback for stopping, so the routing picture is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_to_speechText to speech (file only)ADestructive
Synthesize speech with Paxa TTS and save it as an audio file without playing it: voiceovers, narration, audiobooks, phone prompts. To hear speech instead, use speak (a short line) or queue_speech (long reads); play_audio plays a saved file later. The file goes to output_path, replacing a file already there, or to a new timestamped name in PAXA_OUTPUT_DIR. Text beyond 5000 characters is split at paragraphs and sentences and the parts are joined into one file (mp3, opus, and wav need ffmpeg for that). With subtitles set, an srt or vtt caption file that matches the voice word for word is written next to the audio. Costs 10 credits per 1000 characters, 12.5 with subtitles, 12.5 in a designed voice (voice_...), 15 with both; every format and sample rate costs the same. Direction tags (paxa-tts-flash-v2, every voice): words in square brackets written into the text set the delivery from that point on, in English, Thai, or Chinese, e.g. [whispering], [speaking slowly, close to the microphone], [sad:0.5], or a blend [happy:0.7+sad:0.3]; [neutral] returns to the voice's own delivery. Sounds such as [laughs], [sighs], [gasps] play where written; [um] and [hmm] are spoken; ... and ... mark a span. [short pause], [pause], and [long pause] add silence after the word before them, and [pause 300ms] an exact length up to 500 ms. Nothing in brackets is spoken, tag characters bill as text, and a tag the model cannot do is refused before any charge. On paxa-tts-flash-v1 only khanomchan and kaprao read tags, from a fixed emotion list, and no voice reads pause tags.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to synthesize, Thai, English, or Mandarin Chinese, up to 200000 characters | |
| model | No | "paxa-tts-flash-v2" (default) has 50 voices that each speak Thai, English, and Mandarin, and every one reads direction tags written into the text. Pick "paxa-tts-flash-v1" only for its legacy features: regional Thai accents (Isan, Northern, Southern), the fixed emotion tags on khanomchan and kaprao, or one of the eight voices v2 does not carry (donut, toast, padthai, yoyo, somtam, larb, khaosoi, roti). Same price and limits. | |
| speed | No | Speaking rate from 0.5 to 1.5 as a multiplier on the voice's design speed (1 is as designed; 1.2 to 1.3 suits long reads). Pitch is preserved and the price is the same. Defaults to PAXA_DEFAULT_SPEED when set. | |
| voice | No | Voice id from list_voices (default "foithong"), or a designed voice's id (voice_...) from save_voice, which speaks only on paxa-tts-flash-v2. Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one. | |
| format | No | Audio format (default "mp3"). opus is the smallest, wav is uncompressed 16-bit with a header, pcm is the same samples raw (little-endian mono, no header) for voice agents and audio pipelines, and mulaw and alaw are G.711 at 8000 Hz with no header, for phone lines (paxa-tts-flash-v2 only). | |
| language | No | How codes, digits, and symbols are read: "th", "en", or "zh". Words keep the language of their script. Default "auto" works it out from the text; set it when a code such as AB2039 should be spelled in a particular language. | |
| subtitles | No | Also write a caption file (same name as the audio, .srt or .vtt) timed from the synthesized words: cues break at sentence punctuation, at pauses, and at the line budget, never inside a word, Thai included. Bills 1.25x, 1.5x in a designed voice. | |
| output_path | No | Where to save the file. Relative paths resolve against PAXA_OUTPUT_DIR (or the working directory). | |
| sample_rate | No | Sample rate of pcm or wav in Hz (default 24000): 8000, 16000, 22050, 24000, 32000, 44100, 48000 on paxa-tts-flash-v2; paxa-tts-flash-v1 serves 24000 only. Other formats have a fixed rate (8000 for mulaw and alaw). | |
| temperature | No | How much the reading (pacing, pauses, breaths, melody) varies from one request to the next, 0 to 2, rounded to the nearest 0.1 (default 0.5). 0 gives the most repeatable reading, such as a line regenerated to match the rest of a voiceover; higher values vary more. Read by paxa-tts-flash-v2; v1 refuses any value but 0.5. Same price. | |
| subtitle_line_chars | No | Columns per subtitle line, 10 to 120 (default 60, or 32 when the words are mostly Chinese, Japanese, or Korean). A Chinese, Japanese, or Korean character or full-width punctuation mark takes two columns and Thai marks above and below a consonant take none, so one figure fills about the same width in every script. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write, destructive, open-world, non-idempotent behavior; the description adds substantive context: existing files are replaced, long text is split and rejoined, ffmpeg is needed for some formats, costs vary by subtitles/voice, and unsupported tags are refused before charge. These details go well beyond the structured hints and do not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most important information is front-loaded: what the tool does and which siblings to use instead. However, the description is a very dense single block, with some voice-recommendation and legacy-model detail that could be trimmed or structured more clearly for fast scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter tool with no output schema, the description covers the critical missing context: output file behavior, overwrite semantics, splitting of long text, format dependencies, subtitles, pricing, and tag syntax. An agent has enough information to call the tool correctly and anticipate side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: direction-tag syntax and behavior, pause tags, cost implications, output-path replacement, and subtitle generation. It does not individually restate every parameter (speed, temperature, sample_rate, language rely mainly on schema descriptions), so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Synthesize speech ... save it as an audio file without playing it') and explicitly distinguishes this file-only tool from its siblings speak, queue_speech, and play_audio. An agent can identify the exact operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool ('without playing it: voiceovers, narration, audiobooks, phone prompts') and names the alternatives for hearing speech now or later. It also gives the key selection criterion: file output versus playback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_audioTranscribe a recordingA
Transcribe a local recording or video of speech in Thai, English, Mandarin Chinese, or another language, code-switching included (mp3, wav, flac, ogg, m4a, aac, webm; or mp4, mov, mkv, avi and other video files, whose sound track is extracted locally with ffmpeg; up to 60 minutes and 25 MiB) with Paxa STT. The transcript comes back inline, so nothing needs to be read from disk afterwards; optionally it is also saved as txt, json (with word timings and segments), srt, or vtt, named after the recording. Existing files are never overwritten. Detects the language and can label speakers; nothing is translated. For one live answer from the microphone, use listen instead. Terms configured in PAXA_VOCABULARY or PAXA_VOCABULARY_FILE are pinned on every call. Costs 8.33 credits per minute of audio (0.1 minimum); subtitles and word timings cost nothing extra. Long recordings take minutes to process.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Files to write, named after the recording: txt (the transcript), json (text, words with timings, segments, usage), srt or vtt (subtitles rendered by the API). Omit to write nothing. | |
| style | No | "verbatim" (default) keeps fillers and false starts; "clean" drops them | |
| language | No | The language the speech is expected in, as a BCP 47 tag such as "th", "en", or "zh". A hint, not a filter: other languages are still written as spoken. Omit to auto-detect; set it when detection picks the wrong language. | |
| file_path | Yes | Path to a local recording (mp3, wav, flac, ogg, m4a, aac, webm) or video (mp4, mov, mkv, avi, and more) | |
| convention | No | "spoken" (default) writes numbers and dates as they were said; "written" uses numerals. Only Thai is respelled; other languages read the same under both. | |
| output_dir | No | Where to write the files. Defaults to the recording's own folder. A relative path resolves against PAXA_OUTPUT_DIR (or the working directory). | |
| timestamps | No | Also return word-level timings inline as JSON (can be long). The json file always has them. | |
| vocabulary | No | Keyword pinning: terms the recording likely contains, spelled the way they should appear in the transcript (product names, people, places, jargon; in any language). Up to 50 terms of 50 characters. They bias recognition and are never inserted. Added to any terms configured in PAXA_VOCABULARY or PAXA_VOCABULARY_FILE. | |
| diarization | No | Label speakers, for recordings under 9 minutes. The transcript is then returned as one line per turn, and subtitle cues never cross a speaker change. | |
| pauses_over | No | List every silence between words at least this many seconds long, with its start and end: the dead air to cut when editing. 0.7 suits speech; 1.5 finds only the long gaps. Free (uses the word timings). | |
| subtitle_line_chars | No | Columns per subtitle line, 10 to 120 (default 60, or 32 when the words are mostly Chinese, Japanese, or Korean). A Chinese, Japanese, or Korean character or full-width punctuation mark takes two columns and Thai marks above and below a consonant take none, so one figure fills about the same width in every script. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses that transcripts come back inline, optional files are named after the recording and never overwrite existing files, nothing is translated, speaker labeling is available, and long recordings take minutes. It also covers vocabulary pinning and exact credit costs, which are important behavioral traits for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loads the core purpose, supported inputs, output behavior, alternative tool, vocabulary behavior, and cost. It is appropriately detailed for a complex 11-parameter tool, though the first sentence is heavily parenthetical and could be easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description explains the inline return and optional file outputs, including formats and file-naming behavior. For a complex transcription tool, it covers the key constraints, costs, limits, alternatives, and side effects an agent needs before invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters well. The description adds useful operational context around file saving, overwrite behavior, vocabulary environment configuration, detection hints, and cost, but does not need to restate every parameter's semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb/resource pair, 'Transcribe a local recording or video of speech', and details supported languages, code-switching, file formats, duration, and size limits. It clearly distinguishes this from live microphone use by naming the sibling tool listen.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes live microphone use to listen instead and gives practical conditions for local files, including supported formats, a 60-minute limit, and 25 MiB maximum. It also notes that language can be auto-detected but should be set when detection is wrong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
translateTranslate textARead-onlyIdempotent
Translate text into any of 15 languages, from any of them, with Paxa Translate: Thai (th), English (en), Chinese (zh), Japanese (ja), Korean (ko), Arabic (ar), French (fr), German (de), Hindi (hi), Indonesian (id), Malay (ms), Portuguese (pt), Russian (ru), Spanish (es), Vietnamese (vi). The source language is detected per segment, so mixed-language text works; a segment already in the target language comes back unchanged. Accepts one string or up to 200 segments that share context, and returns each translation (numbered for segments) with its detected source language, any review flag, and the credits used. For text in a PDF or image, run ocr_document first. Costs 25 credits per 1000 text characters per rendering (minimum 2 credits), so 1000 characters cost 25 credits, or 50 with alternatives 2; instructions, context, examples, do_not_translate strings, and glossary terms bill at 8 per 1000.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to translate: one string, or an array of segments translated together | |
| format | No | Treat input as plain text, Markdown, or HTML; only the prose of Markdown and HTML is translated, links, code, and tags come back untouched | |
| source | No | Pin the source language only when detection gets it wrong (default "auto", detected per segment). Must differ from target. | |
| target | Yes | The language to write, as its code (see the description). Chinese ("zh") is written in Simplified characters. | |
| context | No | Background that conditions the translation without being translated: the surrounding document, the domain, the audience | |
| examples | No | Style examples: source sentences with their preferred translations, whose tone and phrasing the translation follows. Up to 100 pairs. | |
| glossary | No | Term pairs the translation must use, applied in context (inflected and placed grammatically). Send the whole glossary: terms whose source does not appear in the text are dropped before the request runs and never billed. | |
| formality | No | "auto" (default) matches the tone of the source; "formal" writes the target language's polite written register (polite particles in Thai, the polite form of address where a language has one); "casual" writes conversational language between peers. | |
| alternatives | No | Renderings per segment, best first (default 1). Each one bills the text again and counts against the 20,000-character text limit. | |
| instructions | No | Free-form direction for the translator: tone, audience, house rules, terminology. Style only. | |
| borrowed_words | No | How to render borrowed words: "auto" (default) uses the established form in the target language, "transliterate" writes them in the target script, "preserve" keeps technical terms and proper nouns in their original script | |
| do_not_translate | No | Strings that must appear in the translation exactly as written |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description goes well past them: per-segment language detection, target-language segments returned unchanged, exact credit math (25/1000 chars, 2-credit minimum, alternatives double it, supporting fields at 8/1000), dropped glossary terms are never billed, and the return payload including review flag and credits used.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then cost — a sensible order with no filler sentences. The one deduction is the inline list of 15 language codes, which duplicates the target enum already in the schema and lengthens the definition without adding selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with no output schema, the description still describes the response shape (numbered translations, detected source language, review flag, credits) and explains the cost model, which is the main risk an agent faces when calling it. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds billing semantics not present in the schema: alternatives each re-bill the text and count against the character limit, and instructions/context/examples/do_not_translate/glossary bill at 8 per 1000. That materially changes how an agent would size a request.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A concrete verb and resource (translate text) with an explicit scope: 15 named languages, any direction, string or up to 200 segments. It also routes away from a sibling by naming ocr_document for PDF/image input, so an agent can identify this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real when-to guidance: pin source 'only when detection gets it wrong', send the whole glossary rather than filtering, run ocr_document first for PDFs/images, and use context/examples for conditioning rather than translating them. It stops short of contrasting with speech siblings like text_to_speech, but the translation-vs-OCR boundary is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.2- Changed
listen2 fields changed- changed
Input schema / properties / convention / descriptionPrevious value: -"\"spoken\" (default) writes numbers as said; \"written\" uses numerals"New value: +"\"spoken\" (default) writes numbers as said; \"written\" uses numerals. Only Thai is respelled." - changed
Input schema / properties / language / descriptionPrevious value: -"Language hint as a BCP 47 tag such as \"th\" or \"en\". Omit to auto-detect."New value: +"The language the speech is expected in, as a BCP 47 tag such as \"th\", \"en\", or \"zh\". A hint, not a filter: other languages are still written as spoken. Omit to auto-detect; set it when detection picks the wrong language."
- Changed
play_audio1 field changed- changed
Input schema / properties / file_path / descriptionPrevious value: -"Path to a local audio file (mp3, wav, opus, ogg, flac, m4a, aac)"New value: +"Path to a local audio file (mp3, wav, opus, ogg, flac, m4a, aac, aiff, caf), absolute or relative to the server's working directory"
- Changed
queue_speech1 field changed- added
Input schema / properties / temperatureAdded value: +{ + "description": "How much the reading (pacing, pauses, breaths, melody) varies from one request to the next, 0 to 2, rounded to the nearest 0.1 (default 0.5). 0 gives the most repeatable reading, such as a line regenerated to match the rest of a voiceover; higher values vary more. Read by paxa-tts-flash-v2; v1 refuses any value but 0.5. Same price.", + "maximum": 2, + "minimum": 0, + "type": "number" +}
- Changed
speak1 field changed- added
Input schema / properties / temperatureAdded value: +{ + "description": "How much the reading (pacing, pauses, breaths, melody) varies from one request to the next, 0 to 2, rounded to the nearest 0.1 (default 0.5). 0 gives the most repeatable reading, such as a line regenerated to match the rest of a voiceover; higher values vary more. Read by paxa-tts-flash-v2; v1 refuses any value but 0.5. Same price.", + "maximum": 2, + "minimum": 0, + "type": "number" +}
- Changed
text_to_speech5 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Audio format (default \"mp3\")"New value: +"Audio format (default \"mp3\"). opus is the smallest, wav is uncompressed 16-bit with a header, pcm is the same samples raw (little-endian mono, no header) for voice agents and audio pipelines, and mulaw and alaw are G.711 at 8000 Hz with no header, for phone lines (paxa-tts-flash-v2 only)." - changed
Input schema / properties / format / enumPrevious value: -[ - "mp3", - "opus", - "wav" -]New value: +[ + "mp3", + "opus", + "wav", + "pcm", + "mulaw", + "alaw" +] - added
Input schema / properties / sample_rateAdded value: +{ + "description": "Sample rate of pcm or wav in Hz (default 24000): 8000, 16000, 22050, 24000, 32000, 44100, 48000 on paxa-tts-flash-v2; paxa-tts-flash-v1 serves 24000 only. Other formats have a fixed rate (8000 for mulaw and alaw).", + "enum": [ + 8000, + 16000, + 22050, + 24000, + 32000, + 44100, + 48000 + ], + "type": "number" +} - changed
Input schema / properties / subtitle_line_chars / descriptionPrevious value: -"Characters per caption line, 10 to 120 (default 60). Thai marks above and below consonants are not counted."New value: +"Columns per subtitle line, 10 to 120 (default 60, or 32 when the words are mostly Chinese, Japanese, or Korean). A Chinese, Japanese, or Korean character or full-width punctuation mark takes two columns and Thai marks above and below a consonant take none, so one figure fills about the same width in every script." - added
Input schema / properties / temperatureAdded value: +{ + "description": "How much the reading (pacing, pauses, breaths, melody) varies from one request to the next, 0 to 2, rounded to the nearest 0.1 (default 0.5). 0 gives the most repeatable reading, such as a line regenerated to match the rest of a voiceover; higher values vary more. Read by paxa-tts-flash-v2; v1 refuses any value but 0.5. Same price.", + "maximum": 2, + "minimum": 0, + "type": "number" +}
- Changed
transcribe_audio4 fields changed- changed
Input schema / properties / convention / descriptionPrevious value: -"\"spoken\" (default) writes numbers and dates as they were said; \"written\" uses numerals"New value: +"\"spoken\" (default) writes numbers and dates as they were said; \"written\" uses numerals. Only Thai is respelled; other languages read the same under both." - changed
Input schema / properties / language / descriptionPrevious value: -"Language hint as a BCP 47 tag such as \"th\" or \"en\". Omit to auto-detect."New value: +"The language the speech is expected in, as a BCP 47 tag such as \"th\", \"en\", or \"zh\". A hint, not a filter: other languages are still written as spoken. Omit to auto-detect; set it when detection picks the wrong language." - changed
Input schema / properties / subtitle_line_chars / descriptionPrevious value: -"Characters per subtitle line, 10 to 120 (default 60). Thai marks above and below consonants are not counted."New value: +"Columns per subtitle line, 10 to 120 (default 60, or 32 when the words are mostly Chinese, Japanese, or Korean). A Chinese, Japanese, or Korean character or full-width punctuation mark takes two columns and Thai marks above and below a consonant take none, so one figure fills about the same width in every script." - changed
Input schema / properties / vocabulary / descriptionPrevious value: -"Keyword pinning: terms the recording likely contains, spelled the way they should appear in the transcript (product names, people, places, jargon; Thai or English). Up to 50 terms of 50 characters. They bias recognition and are never inserted. Added to any terms configured in PAXA_VOCABULARY or PAXA_VOCABULARY_FILE."New value: +"Keyword pinning: terms the recording likely contains, spelled the way they should appear in the transcript (product names, people, places, jargon; in any language). Up to 50 terms of 50 characters. They bias recognition and are never inserted. Added to any terms configured in PAXA_VOCABULARY or PAXA_VOCABULARY_FILE."
- Added
translate - Removed
translate_to_thai
8 tool updates
v0.1.1- Added
delete_voice - Added
design_voice - Changed
queue_speech1 field changed- changed
Input schema / properties / voice / descriptionPrevious value: -"Voice id from list_voices (default \"foithong\"). Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."New value: +"Voice id from list_voices (default \"foithong\"), or a designed voice's id (voice_...) from save_voice, which speaks only on paxa-tts-flash-v2. Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."
- Added
refine_voice - Added
rename_voice - Added
save_voice - Changed
speak1 field changed- changed
Input schema / properties / voice / descriptionPrevious value: -"Voice id from list_voices (default \"foithong\"). Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."New value: +"Voice id from list_voices (default \"foithong\"), or a designed voice's id (voice_...) from save_voice, which speaks only on paxa-tts-flash-v2. Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."
- Changed
text_to_speech2 fields changed- changed
Input schema / properties / subtitles / descriptionPrevious value: -"Also write a caption file (same name as the audio, .srt or .vtt) timed from the synthesized words: cues break at sentence punctuation, at pauses, and at the line budget, never inside a word, Thai included. Bills 1.25x."New value: +"Also write a caption file (same name as the audio, .srt or .vtt) timed from the synthesized words: cues break at sentence punctuation, at pauses, and at the line budget, never inside a word, Thai included. Bills 1.25x, 1.5x in a designed voice." - changed
Input schema / properties / voice / descriptionPrevious value: -"Voice id from list_voices (default \"foithong\"). Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."New value: +"Voice id from list_voices (default \"foithong\"), or a designed voice's id (voice_...) from save_voice, which speaks only on paxa-tts-flash-v2. Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."
7 tool updates
v0.1.0- Added
extract_fields - Added
listen - Changed
queue_speech5 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "How codes, digits, and symbols are read: \"th\", \"en\", or \"zh\". Words keep the language of their script. Default \"auto\" works it out from the text; set it when a code such as AB2039 should be spelled in a particular language.", + "enum": [ + "auto", + "th", + "en", + "zh" + ], + "type": "string" +} - added
Input schema / properties / modelAdded value: +{ + "description": "\"paxa-tts-flash-v2\" (default) has 50 voices that each speak Thai, English, and Mandarin, and every one reads direction tags written into the text. Pick \"paxa-tts-flash-v1\" only for its legacy features: regional Thai accents (Isan, Northern, Southern), the fixed emotion tags on khanomchan and kaprao, or one of the eight voices v2 does not carry (donut, toast, padthai, yoyo, somtam, larb, khaosoi, roti). Same price and limits.", + "enum": [ + "paxa-tts-flash-v2", + "paxa-tts-flash-v1" + ], + "type": "string" +} - added
Input schema / properties / speedAdded value: +{ + "description": "Speaking rate from 0.5 to 1.5 as a multiplier on the voice's design speed (1 is as designed; 1.2 to 1.3 suits long reads). Pitch is preserved and the price is the same. Defaults to PAXA_DEFAULT_SPEED when set.", + "maximum": 1.5, + "minimum": 0.5, + "type": "number" +} - changed
Input schema / properties / text / descriptionPrevious value: -"Text to read aloud, Thai or English"New value: +"Text to read aloud, Thai, English, or Mandarin Chinese" - changed
Input schema / properties / voice / descriptionPrevious value: -"Voice id from list_voices (default \"nomyen\")"New value: +"Voice id from list_voices (default \"foithong\"). Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."
- Added
send_feedback - Changed
speak5 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "How codes, digits, and symbols are read: \"th\", \"en\", or \"zh\". Words keep the language of their script. Default \"auto\" works it out from the text; set it when a code such as AB2039 should be spelled in a particular language.", + "enum": [ + "auto", + "th", + "en", + "zh" + ], + "type": "string" +} - added
Input schema / properties / modelAdded value: +{ + "description": "\"paxa-tts-flash-v2\" (default) has 50 voices that each speak Thai, English, and Mandarin, and every one reads direction tags written into the text. Pick \"paxa-tts-flash-v1\" only for its legacy features: regional Thai accents (Isan, Northern, Southern), the fixed emotion tags on khanomchan and kaprao, or one of the eight voices v2 does not carry (donut, toast, padthai, yoyo, somtam, larb, khaosoi, roti). Same price and limits.", + "enum": [ + "paxa-tts-flash-v2", + "paxa-tts-flash-v1" + ], + "type": "string" +} - added
Input schema / properties / speedAdded value: +{ + "description": "Speaking rate from 0.5 to 1.5 as a multiplier on the voice's design speed (1 is as designed; 1.2 to 1.3 suits long reads). Pitch is preserved and the price is the same. Defaults to PAXA_DEFAULT_SPEED when set.", + "maximum": 1.5, + "minimum": 0.5, + "type": "number" +} - changed
Input schema / properties / text / descriptionPrevious value: -"Text to speak, Thai or English, up to 2000 characters"New value: +"Text to speak, Thai, English, or Mandarin Chinese, up to 2000 characters" - changed
Input schema / properties / voice / descriptionPrevious value: -"Voice id from list_voices (default \"nomyen\")"New value: +"Voice id from list_voices (default \"foithong\"). Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."
- Changed
text_to_speech8 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "How codes, digits, and symbols are read: \"th\", \"en\", or \"zh\". Words keep the language of their script. Default \"auto\" works it out from the text; set it when a code such as AB2039 should be spelled in a particular language.", + "enum": [ + "auto", + "th", + "en", + "zh" + ], + "type": "string" +} - added
Input schema / properties / modelAdded value: +{ + "description": "\"paxa-tts-flash-v2\" (default) has 50 voices that each speak Thai, English, and Mandarin, and every one reads direction tags written into the text. Pick \"paxa-tts-flash-v1\" only for its legacy features: regional Thai accents (Isan, Northern, Southern), the fixed emotion tags on khanomchan and kaprao, or one of the eight voices v2 does not carry (donut, toast, padthai, yoyo, somtam, larb, khaosoi, roti). Same price and limits.", + "enum": [ + "paxa-tts-flash-v2", + "paxa-tts-flash-v1" + ], + "type": "string" +} - added
Input schema / properties / speedAdded value: +{ + "description": "Speaking rate from 0.5 to 1.5 as a multiplier on the voice's design speed (1 is as designed; 1.2 to 1.3 suits long reads). Pitch is preserved and the price is the same. Defaults to PAXA_DEFAULT_SPEED when set.", + "maximum": 1.5, + "minimum": 0.5, + "type": "number" +} - added
Input schema / properties / subtitle_line_charsAdded value: +{ + "description": "Characters per caption line, 10 to 120 (default 60). Thai marks above and below consonants are not counted.", + "maximum": 120, + "minimum": 10, + "type": "integer" +} - added
Input schema / properties / subtitlesAdded value: +{ + "description": "Also write a caption file (same name as the audio, .srt or .vtt) timed from the synthesized words: cues break at sentence punctuation, at pauses, and at the line budget, never inside a word, Thai included. Bills 1.25x.", + "enum": [ + "srt", + "vtt" + ], + "type": "string" +} - changed
Input schema / properties / text / descriptionPrevious value: -"Text to synthesize, up to 5000 characters"New value: +"Text to synthesize, Thai, English, or Mandarin Chinese, up to 200000 characters" - changed
Input schema / properties / text / maxLengthPrevious value: -5000New value: +200000 - changed
Input schema / properties / voice / descriptionPrevious value: -"Voice id from list_voices (default \"nomyen\")"New value: +"Voice id from list_voices (default \"foithong\"). Recommended for general use: foithong (female) and massaman (male); khanomkrok (male), sanaechan (female), and nomyen (female) are also good. On paxa-tts-flash-v2 (the default) every voice speaks Thai, English, and Mandarin Chinese, so choose by character and purpose from list_voices rather than by language. On paxa-tts-flash-v1 each voice is built around one language and reads the others with an accent (English voices there: donut, cookie, toast, latte, espresso, mocha), four Thai voices carry a regional accent, and khanomchan and kaprao read the fixed emotion tag set. Follow the user's preference when they have one."
- Added
transcribe_audio
10 tool updates
v0.1.0-beta.3- First observed
control_playback - First observed
get_account - First observed
list_models - First observed
list_voices - First observed
ocr_document - First observed
play_audio - First observed
queue_speech - First observed
speak - First observed
text_to_speech - First observed
translate_to_thai
TDQS
Scored across 19 tools
The audio surface is crowded (speak, queue_speech, text_to_speech, play_audio) but each description explicitly states its boundary and cross-references the alternatives, so an agent can tell them apart. Similarly ocr_document vs extract_fields and transcribe_audio vs listen are cleanly split by output type and source. No two tools appear to do the same thing.
Most names follow a verb_noun or verb_target pattern (queue_speech, design_voice, refine_voice, delete_voice, list_voices, transcribe_audio, send_feedback, extract_fields). A handful are bare verbs (speak, listen, translate) or noun-first (ocr_document), which are readable but break strict pattern regularity. Overall predictable with minor deviations.
19 tools span six real capability areas (TTS, playback control, voice design, STT, OCR/extraction, translation) plus account/meta, so the count reflects genuine breadth rather than padding. It is on the heavy side and the voice-design cluster (design/refine/save/rename/delete/list) accounts for six, but each earns its place.
Full lifecycle coverage for voices (design, refine, save, rename, delete, list) and for speech (synthesize to speech/file, queue, play, control), plus transcription, OCR, extraction, translation, pricing/model lookup, and feedback. Minor gaps exist around managing generated files on disk (no list/delete of saved audio) and no per-request cancellation beyond queue-level clear.
Maintenance
Related MCP Connectors
Hosted speech-to-text + speech emotion/tone analysis for agents. No install; trial keys built in.
Audio for your agent: transcribe, speak, translate, summarise, plus sound effects and music.
Transcribe, subtitle, dub and lip-sync media; create speech, voices, images and thumbnails.
Generate English and Chinese speech, split long text, track batch jobs, and download audio.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables text-to-speech conversion with smart language detection (using Google TTS for Chinese) and audio file playback with playback controls for Claude Desktop.2MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to generate high-quality speech with 54+ voices in multiple languages via MCP tools.19Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents and applications to send audio notifications with text-to-speech, message streaming, agent-to-agent conversations, and web push notifications through a persistent message store and MCP integration.101 npm1MIT
- AlicenseNot gradedqualityCmaintenanceEnables agents to generate TTS audio, verify it with independent ASR, measure quality against gates, escalate retries, and receive structured QC reports to improve text.1MIT