# ai.kontato/kontato

> Give your AI agents a WhatsApp number and a voice: they message you and call you.

- name: ai.kontato/kontato
- version: 1.1.0
- connection class: R2 (oauth_consent_once)
- trust: 83/100 flags: no-repository
- quality: 70/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/ai.kontato%2Fkontato
- tools: https://api.protogrid.dev/v1/servers/ai.kontato%2Fkontato/tools

**An agent can connect after a one-time OAuth consent by a human.** Remote endpoint behind OAuth 2. Tokens stay with the agent; the registry only exposes the authorization metadata.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "kontato": {
      "type": "http",
      "url": "https://api.kontato.ai/mcp"
    }
  }
}
```


## Trust

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

## Quality 70/100 (needs work)

### protocol: n/a (weight 25)

- n/a `protocol.modern`, `protocol.stateless`, `protocol.transport`, `protocol.list_ttl`: no remote answered a protocol handshake (not probed yet, unreachable, or local-only)

### authorization: 83 (weight 15)

- pass `auth.prm`: Protected Resource Metadata (RFC 9728) published
- pass `auth.as_metadata`: authorization server metadata reachable
- warn `auth.cimd`: only Dynamic Client Registration, deprecated in 2026-07-28 in favour of CIMD
- 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`: 13 of 13 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: list_schedules (destructiveHint, idempotentHint); schedule (idempotentHint); cancel_schedule (idempotentHint); …
- pass `tools.token_cost`: about 3,342 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 13 tool changes in 30 days
- fail `stability.rug_pull`: 9 tools kept their name but changed most of their description in 30 days; review before trusting them

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

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

- tools: 13, about 3,342 tokens to load them all
- tool set hash: 10e5947cc3dcc7668fef57a81edc9a13
- tools last changed: 2026-10-05T01:11:22.130Z
- badge: [![protogrid quality](https://protogrid.dev/badge/ai.kontato/kontato.svg)](https://protogrid.dev/servers/ai.kontato/kontato)
- 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-05 `list_recipients` added
  - Lists the numbers this account may message besides the owner, with their status ("authorized" or "pending").
- 2026-10-05 `authorize_recipient` added
  - Asks a phone number for permission to receive messages from this account. By default an account only messages its OWNER; any other number must be authorized: Kontato sends an invite on WhatsApp and the person must reply SIM (yes). Until then, `send`/`reply` to that number are refused. Use it once per person (e.g. a colleague who should get alerts).
- 2026-10-05 `get_call` added
  - Returns the state of a call placed with `call`. While running, state is "queued", "ringing", "in_progress" or "processing". When state is "finished", read: outcome ("answered", "no_instruction", "decide_later", "completed", "voicemail", "no_answer", "busy", "interrupted", "timed_out"), answer (what the owner said, in one sentence), chosen_option (ask mode), summary (conversation mode) and transcript. Act on the answer after the call; the voice assistant never executes anything.
- 2026-10-05 `call` added
  - Places a phone call to the account OWNER (the person who verified their number), spoken by Kontato's voice assistant on your behalf. Use it when something deserves the owner's attention now, or when you need a decision and they are away from the screen. Modes: "notify" reads a message and asks if they have any instruction; "ask" asks a question (up to 4 options) and confirms the answer; "conversation" is a brainstorm of up to 10 minutes and returns a structured summary (decisions, requirements, open questions, next steps). The call is ASYNC: this tool returns a call_id immediately; then call `get_call` every ~10 seconds until state is "finished". Calls only go to the owner's verified number (never to third parties) and there is a daily limit. Write `message` in the owner's language; the call is spoken in `language` (default pt-BR).
- 2026-10-05 `status` changed (description, inputSchema) **meaning changed**
  - before: Mostra o estado da conta Kontato: ativa ou nao, numero-ponte, e os schedules (rotinas) ja registrados. Use para honrar a regra turn-based: antes de dizer que algo sera entregue "todo dia", confirme aqui se existe um schedule ativo.
  - after: Shows the Kontato account state: active or not, bridge number, and the schedules already registered. Use it to honor the turn-based rule: before saying something will be delivered "every day", confirm here that an active schedule exists.
- 2026-10-05 `list_messages` changed (description, inputSchema) **meaning changed**
  - before: Lista o historico de mensagens do numero-ponte (recebidas e enviadas), mais recentes primeiro. Use para decidir a quem responder com `reply`.
  - after: Lists the message history of the bridge number (received and sent), newest first. Use it to decide whom to answer with `reply`.
- 2026-10-05 `reply` changed (description, inputSchema) **meaning changed**
  - before: Responde a um numero especifico que mandou mensagem para o numero-ponte. Igual a `send`, mas "to" e OBRIGATORIO. Responder a quem te escreveu (reply-ratio alto) e mais seguro que cold outbound.
  - after: Replies to a specific number that messaged the bridge number. Same as `send`, but "to" is REQUIRED. Replying to whoever wrote to you is safer than cold outbound.
- 2026-10-05 `send` changed (description, inputSchema) **meaning changed**
  - before: Envia uma mensagem de WhatsApp pelo numero-ponte do Kontato. CASO SEGURO: se OMITIR "to", entrega no WhatsApp do PROPRIO DONO (self-notification). JANELA DE 24H: e resolvida AUTOMATICAMENTE pelo servidor — mande so "message"; se a janela do WhatsApp estiver fechada, o Kontato embrulha o texto num template aprovado e entrega mesmo assim (a resposta volta com via="template"). NAO pergunte ao dono sobre janela nem sobre template; nunca peca para ele "mandar oi" antes. REGRA TURN-BASED: voce nao executa trabalho no futuro; se pedirem algo recorrente ("todo dia me manda X"), faca a entrega de HOJE agora e oriente a registrar um schedule, nunca prometa entrega futura.
  - after: Sends a WhatsApp message through Kontato's bridge number. SAFE CASE: if you OMIT "to", it is delivered to the OWNER's own WhatsApp (self-notification). Other numbers must be AUTHORIZED first with `authorize_recipient` (the person replies SIM/yes on WhatsApp); otherwise the send is refused with recipient_not_authorized. 24-HOUR WINDOW: handled AUTOMATICALLY by the server; just send "message". If the WhatsApp window is closed, Kontato wraps the text in an approved template and delivers it anyway (the response comes back with via="template"). Do NOT ask the owner about the window or templates; never ask them to "say hi" first. TURN-BASED RULE: you do not run work in the future; if asked for something recurring ("send me X every day"), deliver TODAY's now and register a `schedule`; never promise a future delivery.
- 2026-10-05 `cancel_schedule` changed (description, inputSchema) **meaning changed**
  - before: Cancela uma entrega agendada pelo seu schedule_id (obtido em `list_schedules` ou `schedule`).
  - after: Cancels a scheduled delivery by its schedule_id (from `list_schedules` or `schedule`).
- 2026-10-05 `list_schedules` changed (description, inputSchema) **meaning changed**
  - before: Lista as entregas agendadas (recorrentes/unicas) desta conta, com proximo disparo.
  - after: Lists the scheduled deliveries (recurring or one-time) of this account, with the next run.

Full history: https://api.protogrid.dev/v1/servers/ai.kontato%2Fkontato/changes

## Remotes

- https://api.kontato.ai/mcp (streamable-http, auth oauth2, reachable true, uptime30d 1)

## Packages

_none_

## Tools (13)

- `authorize_recipient`: Asks a phone number for permission to receive messages from this account. By default an account only messages its OWNER; any other number must be authorized: Kontato sends an invite on WhatsApp and the person must reply SIM (yes). Until then, `send`/`reply` to that number are refused. Use it once per person (e.g. a colleague who should get alerts).
- `call`: Places a phone call to the account OWNER (the person who verified their number), spoken by Kontato's voice assistant on your behalf. Use it when something deserves the owner's attention now, or when you need a decision and they are away from the screen. Modes: "notify" reads a message and asks if they have any instruction; "ask" asks a question (up to 4 options) and confirms the answer; "conversation" is a brainstorm of up to 10 minutes and returns a structured summary (decisions, requirements, open questions, next steps). The call is ASYNC: this tool returns a call_id immediately; then call `get_call` every ~10 seconds until state is "finished". Calls only go to the owner's verified number (never to third parties) and there is a daily limit. Write `message` in the owner's language; the call is spoken in `language` (default pt-BR).
- `cancel_schedule`: Cancels a scheduled delivery by its schedule_id (from `list_schedules` or `schedule`).
- `get_call`: Returns the state of a call placed with `call`. While running, state is "queued", "ringing", "in_progress" or "processing". When state is "finished", read: outcome ("answered", "no_instruction", "decide_later", "completed", "voicemail", "no_answer", "busy", "interrupted", "timed_out"), answer (what the owner said, in one sentence), chosen_option (ask mode), summary (conversation mode) and transcript. Act on the answer after the call; the voice assistant never executes anything.
- `list_messages`: Lists the message history of the bridge number (received and sent), newest first. Use it to decide whom to answer with `reply`.
- `list_recipients`: Lists the numbers this account may message besides the owner, with their status ("authorized" or "pending").
- `list_schedules`: Lists the scheduled deliveries (recurring or one-time) of this account, with the next run.
- `provision`: ACTIVATES the Kontato account for the given phone: creates it only if it does not exist yet; if it exists, reuses the SAME account (calling it with an existing account is normal and expected: it works like a login). IDEMPOTENT BY PHONE: safe to call again in any session or after a restart (the user never has to handle an api_key). If the response has verification_required=false (number already verified), do NOT ask for an OTP: call `send` or `call` directly. Pass owner_phone (international format, digits only, e.g. 5511999998888) to enable the safe self-notification case: you deliver to the owner's own WhatsApp and phone. Returns whatsapp_bridge_number (Kontato's shared number that sends, never the owner's personal number).
- `reply`: Replies to a specific number that messaged the bridge number. Same as `send`, but "to" is REQUIRED. Replying to whoever wrote to you is safer than cold outbound.
- `schedule`: Registers a recurring or one-time delivery in the Kontato scheduler. At the scheduled time, Kontato runs the `prompt` as a full agent (with web search) and delivers the result to the owner's WhatsApp. USE THIS for "send me X every day": you do not need to stay online or promise future work; the scheduler fires on its own. The `prompt` must be self-contained (e.g. "Find today's top financial market news and deliver a short summary").
- `send`: Sends a WhatsApp message through Kontato's bridge number. SAFE CASE: if you OMIT "to", it is delivered to the OWNER's own WhatsApp (self-notification). Other numbers must be AUTHORIZED first with `authorize_recipient` (the person replies SIM/yes on WhatsApp); otherwise the send is refused with recipient_not_authorized. 24-HOUR WINDOW: handled AUTOMATICALLY by the server; just send "message". If the WhatsApp window is closed, Kontato wraps the text in an approved template and delivers it anyway (the response comes back with via="template"). Do NOT ask the owner about the window or templates; never ask them to "say hi" first. TURN-BASED RULE: you do not run work in the future; if asked for something recurring ("send me X every day"), deliver TODAY's now and register a `schedule`; never promise a future delivery.
- `status`: Shows the Kontato account state: active or not, bridge number, and the schedules already registered. Use it to honor the turn-based rule: before saying something will be delivered "every day", confirm here that an active schedule exists.
- `verify_number`: Confirms the owner number with the 6-digit OTP that arrived on their WhatsApp after `provision`. REQUIRED before sending, scheduling or calling: until verified, `send`/`reply`/`schedule`/`call` return 403 owner_not_verified. If the code expired or failed too many times, call again after requesting a new one (resend).
