# Rinkel MCP by usefulapi (remote · rinkel.usefulapi.io)

Read Rinkel calls, voicemails, contacts and numbers; add call notes, edit contacts, block numbers.

- Trust score: 63/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-25

## Components

- remote · `rinkel.usefulapi.io`: 63/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-rinkel/rinkel.md), [page](https://verifymcp.io/servers/io-usefulapi-rinkel/rinkel)

## Channel facts

- Endpoint: `https://rinkel.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.3`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-25.

- **Endpoint Security**: 78/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 82/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3532 tokens (~130/item across 27 items; 27 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 97/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 91% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 28 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the Rinkel MCP by usefulapi server?

Rinkel MCP by usefulapi is a hosted endpoint at https://rinkel.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-rinkel 'https://rinkel.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-rinkel": {
      "url": "https://rinkel.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-rinkel": {
      "type": "http",
      "url": "https://rinkel.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-rinkel]
url = "https://rinkel.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-rinkel": {
      "type": "remote",
      "url": "https://rinkel.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-rinkel --url 'https://rinkel.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-rinkel:
    url: "https://rinkel.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-rinkel": {
      "Transport": "http",
      "Url": "https://rinkel.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-rinkel -t streamable-http -u 'https://rinkel.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-rinkel": {
      "type": "http",
      "url": "https://rinkel.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

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

### 2026-10-25 (score 63, +1)

- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.0.0 → 1.0.3

### 2026-10-24 (score 62)

First indexed and scored.

## MCP tools (27)

### `rinkel_list_calls` (~554 tokens)

List calls

List call detail records (inbound and outbound calls) with date, direction, status (ANSWERED, MISSED, VOICEMAIL, ANSWERING_SERVICE), duration, external and internal number, the users involved, notes, and (when the account has Rinkel AI insights) the AI summary and sentiment. Use for 'who called today', 'which calls did we miss this week', 'calls longer than 5 minutes'. Newest first by default. Rinkel API: GET /call-detail-records.

Input parameters:

- `contact` (string): Only calls with this contact (id).
- `contact_lookup` (boolean): Include the matching contact in each record.
- `date_preset` (string): A relative period. It overrides start_date and end_date.
- `directions` (array): Only these directions.
- `duration_preset` (array): Duration buckets in minutes ('30-0' = 30 minutes or more). Overrides min/max duration.
- `end_date` (string): Only calls on or before this date (yyyy-mm-dd = end of that day UTC, or an ISO date-time with timezone).
- `external_number` (string): Only calls with this external (caller or callee) number.
- `filter` (string): Free-text search over calls.
- `has_insights` (boolean): Only calls that have AI insights.
- `has_notes` (boolean): Only calls that have (true) or lack (false) notes.
- `has_transcription` (boolean): Only calls that have a transcription.
- `include_details` (boolean): Include insights and notes in each record.
- `internal_numbers` (array): Only calls on these internal (Rinkel) numbers, as listed by rinkel_list_numbers.
- `is_anonymous` (boolean): Only calls from a hidden number (true) or not (false).
- `max_duration_seconds` (integer): Maximum duration in seconds (ignored with duration_preset).
- `min_duration_seconds` (integer): Minimum duration in seconds (ignored with duration_preset).
- `page` (integer): Page number (default 1).
- `per_page` (integer): Items per page (default 10, max 50).
- `sentiments` (array): Only calls with this AI-insights sentiment.
- `sort` (string): Sort field (default date).
- `sort_order` (string): Sort order (default DESC).
- `start_date` (string): Only calls on or after this date (yyyy-mm-dd, or an ISO date-time with timezone). Sent as a Unix timestamp.
- `statuses` (array): Only these call outcomes.
- `user_ids` (array): Only calls handled by these user ids (rinkel_list_users).

### `rinkel_get_call` (~82 tokens)

Get a call

Get one call detail record by its Rinkel id (the `id` field of rinkel_list_calls): numbers, users, status, duration, notes, voicemail and call-recording ids, AI insights. Rinkel API: GET /call-detail-records/{id}.

Input parameters:

- `call_record_id` (string, required): The call detail record id (`id`).

### `rinkel_get_call_by_network_id` (~88 tokens)

Get a call by network call id

Get one call detail record by its network `callId` (the id Rinkel sends in webhook events), optionally with insights and notes. Rinkel API: GET /call-detail-records/by-call-id/{callId}.

Input parameters:

- `include_details` (boolean): Include insights and notes.
- `network_call_id` (string, required): The network call id (`callId` field).

### `rinkel_get_call_transcription` (~86 tokens)

Get a call transcription

Get the raw transcription of a call by its network `callId` (needs Rinkel AI insights on the account; 404 when the call has none). Rinkel API: GET /call-detail-records/by-call-id/{callId}/transcription.

Input parameters:

- `network_call_id` (string, required): The network call id (`callId` field of the call record).

### `rinkel_get_call_recording_url` (~98 tokens)

Get a call recording URL

Get a temporary URL (valid 3 hours) to stream or download a call recording. The id is `callRecording.id` of a call record. Append `download` as a query parameter to the URL to download instead of stream. Rinkel API: GET /call-recordings/{id}/stream.

Input parameters:

- `call_recording_id` (string, required): The call recording id (`callRecording.id` of a call record).

### `rinkel_list_voicemails` (~359 tokens)

List voicemails

List voicemail messages (call records with status VOICEMAIL): caller, date, duration, whether new, and the voicemail id. Newest first. With is_new=true Rinkel ignores every other filter and returns only unplayed voicemails. Rinkel API: GET /voicemails.

Input parameters:

- `contact_lookup` (boolean): Include the matching contact in each record.
- `date_preset` (string): A relative period (overrides start_date and end_date).
- `end_date` (string): Only calls on or before this date (yyyy-mm-dd = end of that day UTC, or an ISO date-time with timezone).
- `external_number` (string): Only calls with this external (caller or callee) number.
- `filter` (string): Free-text search over calls.
- `has_notes` (boolean): Only calls that have (true) or lack (false) notes.
- `internal_numbers` (array): Only calls on these internal (Rinkel) numbers, as listed by rinkel_list_numbers.
- `is_anonymous` (boolean): Only calls from a hidden number (true) or not (false).
- `is_new` (boolean): Only unplayed voicemails (true). All other filters are ignored then.
- `page` (integer): Page number (default 1).
- `per_page` (integer): Items per page (default 10, max 50).
- `sort_order` (string): Sort order by date (default DESC).
- `start_date` (string): Only calls on or after this date (yyyy-mm-dd, or an ISO date-time with timezone). Sent as a Unix timestamp.
- `topics` (array): Only voicemails with these AI topic ids.

### `rinkel_count_new_voicemails` (~37 tokens)

Count new voicemails

Number of voicemails that have not been played yet. Rinkel API: GET /voicemails/new-count.

### `rinkel_get_voicemail_url` (~74 tokens)

Get a voicemail URL

Get a temporary URL (valid 3 hours) to stream or download a voicemail. The id is `voicemail.id` of a call or voicemail record. Rinkel API: GET /voicemails/{id}/stream.

Input parameters:

- `voicemail_id` (string, required): The voicemail id (`voicemail.id`).

### `rinkel_list_contacts` (~109 tokens)

List contacts

List the contacts shared with everyone in the account (plus the Rinkel system contact, tag 'system'): names, company, phone numbers, email. Rinkel API: GET /contacts.

Input parameters:

- `filter` (string): Search by name, company or number.
- `letter` (string): Only contacts whose name starts with this letter.
- `page` (integer): Page number (default 1).
- `per_page` (integer): Items per page (default 10, max 50).

### `rinkel_get_contact` (~37 tokens)

Get a contact

Get one contact by id. Rinkel API: GET /contacts/{id}.

Input parameters:

- `contact_id` (string, required): The contact id.

### `rinkel_find_contact_by_number` (~77 tokens)

Find a contact by phone number

Find the contact that owns a phone number (E.164 such as +31612345678 works best). 404 when there is none. Rinkel API: GET /contacts/find-by-number/{number}.

Input parameters:

- `phone_number` (string, required): The phone number, preferably in E.164 format (+31612345678).

### `rinkel_list_users` (~77 tokens)

List users

List the account's users: name, email, phone number, role (ADMIN, USER, ANSWERINGSERVICE), availability schedule and status, and `fixed`/device info (`deviceId` is needed to start a call). Rinkel API: GET /users.

Input parameters:

- `include_avatars` (boolean): Include avatar URLs.

### `rinkel_get_user` (~65 tokens)

Get a user

Get one user by id, including preferences, notification settings, schedule and `deviceId`. Rinkel API: GET /users/{id}.

Input parameters:

- `include_avatar` (boolean): Include avatar URLs.
- `user_id` (string, required): The user id (rinkel_list_users).

### `rinkel_list_numbers` (~55 tokens)

List phone numbers

List the account's Rinkel phone numbers: id, label, number, status (ACTIVE, SUSPENDED, PENDING_PORTING_IN ...), activation date and the users assigned. Rinkel API: GET /numbers.

### `rinkel_get_number` (~70 tokens)

Get a phone number

Get one Rinkel number with its full dial plan: greeting, business hours schedule, call forwarding targets and ring logic, voice menu, call recording and caller-id settings. Rinkel API: GET /numbers/{id}.

Input parameters:

- `number_id` (string, required): The number id (rinkel_list_numbers).

### `rinkel_list_recordings` (~112 tokens)

List greeting recordings

List the uploaded audio recordings used in the dial plan (greetings, announcements, voice-over scripts): name, description, duration and where each is used. Not call recordings. Rinkel API: GET /recordings.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Items per page (default 10, max 999).
- `sort` (string): Sort field (default date).
- `sort_order` (string): Sort order (default DESC).

### `rinkel_list_webhooks` (~54 tokens)

List webhooks

List the webhook subscriptions (events incomingCall, outgoingCall, callStart, callEnd, callInsights) with URL and active flag. Webhooks need the Expert plan. Rinkel API: GET /webhooks.

### `rinkel_validate_phone_number` (~96 tokens)

Validate a phone number

Check a phone number for a country and return its normalised form. With check_inventory=true Rinkel also checks whether the number is available to order. Rinkel API: GET /misc/validate-phone-number.

Input parameters:

- `check_inventory` (boolean): Also check availability to order.
- `country_iso_code` (string, required): Country code such as NL or BE.
- `number` (string, required): The number without the country calling code.

### `rinkel_add_call_note` (~105 tokens)

Add a call note

WRITE: add a note to a call record (visible to everyone in the account who sees the call). The id is the call record's `id`; if Rinkel answers 404, retry with the record's `callId`. Rinkel API: PUT /call-detail-records/{callId}/note.

Input parameters:

- `call_record_id` (string, required): The call record id (`id` of rinkel_list_calls).
- `content` (string, required): The note text.

### `rinkel_update_call_note` (~102 tokens)

Update a call note

WRITE: replace the text of an existing note on a call record (the note id is in `notes[].id` of the call record). Rinkel API: PATCH /call-detail-records/{callId}/note/{noteId}.

Input parameters:

- `call_record_id` (string, required): The call record id (`id`).
- `content` (string, required): The new note text.
- `note_id` (string, required): The note id (`notes[].id`).

### `rinkel_delete_call_note` (~104 tokens)

Delete a call note

WRITE, irreversible: delete one note from a call record. Needs confirm=true after the user approved it. Rinkel API: DELETE /call-detail-records/{callId}/note/{noteId}.

Input parameters:

- `call_record_id` (string, required): The call record id (`id`).
- `confirm` (boolean): Must be true, set only after the user explicitly approved this exact action.
- `note_id` (string, required): The note id (`notes[].id`).

### `rinkel_create_contact` (~125 tokens)

Create a contact

WRITE: create a contact. It is shared with everyone in the Rinkel account (all users see it and calls from its numbers show its name). Rinkel API: POST /contacts.

Input parameters:

- `company_name` (string)
- `default_outbound_number_id` (string): Id of the Rinkel number to call this contact from (rinkel_list_numbers).
- `email` (string)
- `first_name` (string)
- `last_name` (string)
- `numbers` (array, required): Phone numbers of the contact (Rinkel requires at least one).

### `rinkel_update_contact` (~191 tokens)

Update a contact

WRITE: update a contact (PUT semantics). `numbers` is required and REPLACES all stored numbers, and an omitted default_outbound_number_id CLEARS it; omitted names, company and email keep their stored value. Read the contact first (rinkel_get_contact) and resend what must stay. The system contact cannot be changed. Rinkel API: PUT /contacts/{id}.

Input parameters:

- `company_name` (string)
- `contact_id` (string, required): The contact id.
- `default_outbound_number_id` (string): Resend the current value to keep it; omit to clear it.
- `email` (string)
- `first_name` (string)
- `last_name` (string)
- `numbers` (array, required): The COMPLETE list of numbers (replaces the stored ones; Rinkel requires at least one, so read the contact first and resend the ones to keep).

### `rinkel_delete_contact` (~82 tokens)

Delete a contact

WRITE, irreversible: delete a contact for the whole account. Needs confirm=true after the user approved it. The Rinkel system contact cannot be deleted. Rinkel API: DELETE /contacts/{id}.

Input parameters:

- `confirm` (boolean): Must be true, set only after the user explicitly approved this exact action.
- `contact_id` (string, required): The contact id.

### `rinkel_block_number` (~130 tokens)

Block a number

WRITE: block a number from calling ANY of the account's numbers. Accepts an E.164 number, 'anonymous', or a prefix wildcard such as '+31*' (a wildcard must end the value and include a country code; a broad wildcard blocks every caller from that country). Undo with rinkel_unblock_number. Rinkel API: POST /privacy/block-number.

Input parameters:

- `number` (string, required): E.164 number (+31612345678), 'anonymous', or a prefix wildcard like '+3161*'.
- `reason` (string): Why it is blocked (for example Spam).

### `rinkel_unblock_number` (~62 tokens)

Unblock a number

WRITE: remove a number (or the same wildcard pattern that was blocked) from the block list so it can call again. Rinkel API: DELETE /privacy/unblock-number.

Input parameters:

- `number` (string, required): The blocked entry exactly as it was blocked.

### `rinkel_start_call` (~227 tokens)

Start an outgoing call

WRITE, COSTS CALL MINUTES: starts a real phone call. Rinkel rings the given user device first and, once it is answered, dials `to` using the chosen Rinkel number as caller id, so call charges apply to the account and the person called sees the number. Needs confirm=true, set only after the user explicitly asked to place this call. Get device_id from rinkel_list_users (`fixed`/device info or `deviceId`) and number_id from rinkel_list_numbers. Rinkel API: POST /dial.

Input parameters:

- `anonymous` (boolean): Hide the caller id (default false).
- `confirm` (boolean): Must be true, set only after the user explicitly approved this exact action.
- `device_id` (string, required): The id of the user device that starts the call (`deviceId` of a user).
- `number_id` (string, required): The id of the Rinkel number used as caller id (rinkel_list_numbers).
- `to` (string, required): The number to call, in E.164 format (+31612345678).

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-rinkel/rinkel#diagnostics

## Score history

- 2026-10-25: 63
- 2026-10-24: 62

## Common questions

### What is the Rinkel MCP by usefulapi server?

Rinkel MCP by usefulapi is listed in the public MCP registry as io.usefulapi/rinkel. Read Rinkel calls, voicemails, contacts and numbers; add call notes, edit contacts, block numbers. This page covers its hosted endpoint (https://rinkel.usefulapi.io/mcp).

### Is the Rinkel MCP by usefulapi server safe to use?

Rinkel MCP by usefulapi scores 63 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Rinkel MCP by usefulapi server expose?

Rinkel MCP by usefulapi exposes 27 tools: rinkel_list_calls, rinkel_get_call, rinkel_get_call_by_network_id, rinkel_get_call_transcription, rinkel_get_call_recording_url, and 22 more. Their descriptions and schemas cost roughly 3,258 tokens of context every time the server is loaded.

### Does the Rinkel MCP by usefulapi server require authentication?

Yes. Rinkel MCP by usefulapi asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the Rinkel MCP by usefulapi server still maintained?

Rinkel MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 25 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://rinkel.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Website: https://usefulapi.io/rinkel/
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-rinkel/rinkel.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-rinkel/rinkel.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-rinkel/rinkel
