# oruk Speech

> Hosted speech-to-text + speech emotion/tone analysis for agents. No install; trial keys built in.

- name: ai.oruk/speech
- version: 1.0.1
- connection class: R0 (autonomous)
- trust: 79/100 flags: no-repository
- quality: 94/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/ai.oruk%2Fspeech
- tools: https://api.protogrid.dev/v1/servers/ai.oruk%2Fspeech/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "speech": {
      "type": "http",
      "url": "https://oruk.ai/mcp",
      "headers": {
        "Authorization": "Bearer ${SPEECH_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${SPEECH_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 99
- freshness: 85
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-98% ~updated-44d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 94/100 (strong)

### protocol: 100 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- pass `protocol.list_ttl`: tool list is cacheable (ttlMs 300000)

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 86 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 8 of 8 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: oruk_plan_hume_migration (idempotentHint); oruk_check_usage (idempotentHint); oruk_get_started (idempotentHint); …
- pass `tools.token_cost`: about 2,739 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 1 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 8, about 2,739 tokens to load them all
- tool set hash: 3a7dfcbe370483374b5f46256d2b3ffc
- tools last changed: 2026-10-07T06:17:15.288Z
- badge: [![protogrid quality](https://protogrid.dev/badge/ai.oruk/speech.svg)](https://protogrid.dev/servers/ai.oruk/speech)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-07 `oruk_plan_hume_migration` added
  - Return bounded planning guidance from redacted enums and counts only. No key is needed. Never send source, paths, audio, credentials or provider responses. This does not inspect customer code, generate or apply a patch, run inference, validate score equivalence or complete a migration; the separate local planner performs source-bound proposal work.

Full history: https://api.protogrid.dev/v1/servers/ai.oruk%2Fspeech/changes

## Remotes

- https://oruk.ai/mcp (streamable-http, auth none, reachable true, uptime30d 0.9830508)

## Packages

_none_

## Tools (8)

- `oruk_analyze_speech`: Transcribe English audio AND score how it was said in one call: transcript, tagged transcript, selected scores from 15 emotion and 16 speaking-style labels, and time-local segments. Use this when the user cares about both the words and the delivery — meetings, support calls, interviews, voice notes. Accepts wav/flac/mp3/m4a/ogg/webm. Up to 30 MB via audio_url or 8 MiB decoded via audio_base64; up to 60 minutes of English speech. Returns compact summaries by default. For words only use oruk_transcribe_audio; for tone only use oruk_analyze_tone.
- `oruk_analyze_tone`: Score how speech sounds without transcribing it: selected emotion (happy, frustrated, worried, …) and speaking-style (sarcastic, confident, hesitant, warm, …) scores per acoustic segment. Runs the Resonance encoder and affect head only — the transcription decoder is never invoked, so nothing is transcribed and it consumes the same subscription audio minutes as unified analysis. Use this when the user asks about mood, delivery, sentiment, sarcasm, or emotional dynamics in audio. Up to 30 MB via audio_url or 8 MiB decoded via audio_base64; up to 60 minutes of English speech. Labels use model-specific thresholds; the highest-scoring emotion is returned if none passes, and styles can be empty. Outputs describe delivery, not probabilities of inner state. Need the words too? Use oruk_analyze_speech.
- `oruk_check_usage`: Verify that an Oruk API key works and report the subscription, remaining audio minutes, and recent API usage. Use this after setup or to diagnose access and usage limits. Requires the Authorization header from your MCP config or a temporary api_key.
- `oruk_create_trial_key`: Mint a real, temporary oruk API key with no account required: 3 requests, expires in 30 minutes, spends from a capped shared budget. Use this when no Authorization header is configured and the user wants to try transcription or tone analysis right now. Pass the returned key as the api_key argument of the audio tools. Share the signup link with the user so they can keep using oruk afterwards (7-day free trial on self-serve plans).
- `oruk_get_started`: Quickstart for the oruk Speech API and this MCP server: how to get an API key, per-client MCP configuration snippets, SDK install commands, and an optional routing rule the user can add to their agent instructions. No API key required. Use this when setting oruk up for the first time or when the user asks how oruk works.
- `oruk_list_models`: List oruk’s speech models with lifecycle, current subscription plans, and explicitly labeled legacy reference rates, the five API tasks, the 15 emotion and 16 speaking-style labels, and audio limits. No API key required. Use this to choose a model, estimate cost before analyzing long audio, or see which labels exist.
- `oruk_plan_hume_migration`: Return bounded planning guidance from redacted enums and counts only. No key is needed. Never send source, paths, audio, credentials or provider responses. This does not inspect customer code, generate or apply a patch, run inference, validate score equivalence or complete a migration; the separate local planner performs source-bound proposal work.
- `oruk_transcribe_audio`: Transcribe prerecorded English audio to text with time-ordered segments and word timings. Use this when only the words matter. Accepts wav/flac/mp3/m4a/ogg/webm. Up to 30 MB via audio_url or 8 MiB decoded via audio_base64; up to 60 minutes of English speech. Does not score emotion or tone — use oruk_analyze_speech for transcript + tone together, or oruk_analyze_tone for tone alone.
