Directory object · grok
GROK TTS
Text-to-SPEECH (Grok). INVOKE: [GROK_TTS]<text>|<voice_id>[/GROK_TTS]
WHAT
Text-to-SPEECH (Grok). INVOKE: [GROK_TTS]<text>|<voice_id>[/GROK_TTS]
WHEN TO USE
you need to grok tts
Model and router layerOpen the live contract5 sections
ARGS
see content
EX
[GROK_TTS]arg1|arg2|arg15[/GROK_TTS] # $1 = the words to speak; $2 = voice_id (eve|ara|rex|sal|leo). Returns mp3 audio BYTES (binary, not JSON) from https://api.x.ai/v1/tts; ~$15 per 1M characters.
T
o DELIVER spoken audio into a chat in ONE call, use [VOICE_SEND] instead (it synthesizes + attaches).
{"text":"$1","voice_id":"$2","language":"en"}Target
http · POST https://api.x.ai/v1/tts
InvocationCall it12 ways
HTTP · curl — the canonical call
Any terminal or script. {key, body}: the arguments are one string, pipe-separated in the order below. The answer is {ok, ran, result, trace_id, receipt}.
curl -sS -X POST 'https://ops.miscsubjects.com/api/dispatch' \
-H "x-terminal-key: $TERMINAL_KEY" \
-H 'content-type: application/json' \
--data '{"key":"GROK_TTS","body":"arg1|arg2|arg15"}'HTTP · curl — named arguments
The same door with arguments by name: dispatch puts them in the row's order. Add "idempotency_key":"…" to make a retry safe (72 hours), "shape":true to see the request without sending it.
curl -sS -X POST 'https://ops.miscsubjects.com/api/dispatch' \
-H "x-terminal-key: $TERMINAL_KEY" \
-H 'content-type: application/json' \
--data '{"key":"GROK_TTS","args":{"arg1":"arg1","arg2":"arg2","arg3":"arg15"}}'HTTP · One URL — Safari, a Shortcut, any fetch tool
A GET that runs the call from one address. The address holds a link scoped to this row that expires (ttl in seconds, uses= to cap the count) — never the master key. https://miscsubjects.com/web/run/GROK_TTS?body=…&share=… is the same call for a browser model. Run mints a one-use link for itself.
# 1. a link that runs only GROK_TTS, for an hour (share_token in the answer): curl -sS 'https://ops.miscsubjects.com/api/dispatch?mint_share=1&scope=row:GROK_TTS&ttl=3600' \ -H "x-terminal-key: $TERMINAL_KEY" # 2. the address — paste it in Safari, a Shortcut or a model's fetch tool: https://ops.miscsubjects.com/api/dispatch?invoke=GROK_TTS&body=arg1%7Carg2%7Carg15&share=<share_token>
MCP · MCP over HTTP — misc_run
The build's MCP server. misc_run reaches every row by key and leaves a receipt; misc_find finds the key from a phrase. The answer is result.content[0].text.
curl -sS -X POST 'https://ops.miscsubjects.com/api/mcp' \
-H 'accept: application/json, text/event-stream' \
-H "authorization: Bearer $MCP_TOKEN" \
-H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"misc_run","arguments":{"key":"GROK_TTS","args":{"arg1":"arg1","arg2":"arg2","arg3":"arg15"}}}}'MCP · Claude Code
Claude Code (terminal, desktop, web). The same server works in any Claude Code session once added.
# once, on any machine:
claude mcp add --transport http miscsubjects https://ops.miscsubjects.com/api/mcp --header "Authorization: Bearer $MCP_TOKEN"
# then in a session, the model calls:
mcp__miscsubjects__misc_run {"key":"GROK_TTS","args":{"arg1":"arg1","arg2":"arg2","arg3":"arg15"}}CLI · misc (on your Mac)
The misc CLI in ~/.local/bin: its words go to /api/resolve (plan, then run), with TERMINAL_KEY from the vault. Arguments are positional, in the order above. `misc find "words"` finds a row.
misc run GROK_TTS arg1 arg2 arg15 misc grok tts arg1 arg2 arg15
CLI · console-app
The Console's own CLI. It reads the key from ~/.build-vault.env or `console-app login`.
npm install -g https://miscsubjects.com/download/llmasos-console-1.1.0.tgz # once console-app call GROK_TTS 'arg1|arg2|arg15' console-app how GROK_TTS # this page, in the terminal
CLI · One line of text — the build grammar
/api/resolve parses the same line everywhere: "run KEY a b" (arguments in order, quoted when they hold spaces), the key's words ("grok tts …"), or a phrase it matches to a row. POST runs; {"run":false} returns the plan without running it.
# typed, texted to the build, or emitted by a model with no tools:
run GROK_TTS arg1 arg2 arg15
curl -sS -X POST 'https://ops.miscsubjects.com/api/resolve' \
-H "x-terminal-key: $TERMINAL_KEY" \
-H 'content-type: application/json' \
--data '{"line":"run GROK_TTS arg1 arg2 arg15","run":true}'Agents · Tag form — inside an answer
What a model in this build writes mid-answer to call a row; both tags always, even with nothing between them. {"emit": text} runs every tag in a piece of text and returns each result.
[GROK_TTS]arg1|arg2|arg15[/GROK_TTS]
# run text that carries tags, exactly as a model wrote it:
curl -sS -X POST 'https://ops.miscsubjects.com/api/dispatch' \
-H "x-terminal-key: $TERMINAL_KEY" \
-H 'content-type: application/json' \
--data '{"emit":"[GROK_TTS]arg1|arg2|arg15[/GROK_TTS]"}'Phone · iPhone Shortcut — Get Contents of URL
A Shortcut on the phone, a Siri phrase, an Action Button, or an automation. Swap body for Ask for Input to fill arguments at run time.
Action: Get Contents of URL
URL: https://ops.miscsubjects.com/api/dispatch
Method: POST
Headers: x-terminal-key → (Text) your terminal key
content-type → application/json
Request Body: JSON
key (Text) → GROK_TTS
body (Text) → arg1|arg2|arg15
Then: Get Dictionary Value result from Contents of URLWebhook · A webhook any service can call
Stripe, GitHub, Slack, Zapier, a form, a cron elsewhere. The hook id is the credential for an unsigned sender and it may run nothing but GROK_TTS. mode "sync" answers with the result; "async" answers 202 at once.
# 1. once: make a hook that may run only GROK_TTS (the answer holds its id and url)
curl -sS -X POST 'https://ops.miscsubjects.com/api/hooks' \
-H "x-terminal-key: $TERMINAL_KEY" \
-H 'content-type: application/json' \
--data '{"label":"GROK_TTS webhook","source":"url","allow_keys":["GROK_TTS"],"effects_max":"write","mode":"sync"}'
# 2. then any service POSTs the arguments, by name, to that url:
curl -sS -X POST 'https://ops.miscsubjects.com/hook/<hook id>/GROK_TTS' \
-H 'content-type: application/json' \
--data '{"arg1":"arg1","arg2":"arg2","arg3":"arg15"}'Upstream · The raw request the build makes (POST api.x.ai)
Straight to the service, bypassing the build: no receipt, no ledger, no gates. Credentials are the vault variables the row names.
curl -sS -X POST 'https://api.x.ai/v1/tts' \
-H "authorization: Bearer $GROK_API_KEY" \
-H 'content-type: application/json' \
--data '{"text":"arg1","voice_id":"arg2","language":"en"}'Article-object law
This definition is also an article and a Skill.
The human expression explains the capability. The Skill directs model behavior. The directory row remains the executable contract. OIP invokes it and receipts prove what happened.