Skip to content

Rinkel MCP by usefulapi

io.usefulapi/rinkelusefulapi.iostreamable-httpv1.0.0Scanned

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

27 tools: 5 can delete or cancel things, 4 change things and 18 only read.

Tools: 5 delete, 0 irreversible, 4 write, 18 read.
  • Reads private data · 8
  • Reads text others write · 6
  • Can send data out · 0
  • No findings

Anlyon alternative

9 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

27 tools

Deletes or cancels 5Claude Code: deny
  • rinkel_delete_call_noteWRITE, irreversible: delete one note from a call record.No findings

    Why it is in this group

    • The name "rinkel_delete_call_note" says "delete": a word for removing or ending something.
    • The description says "irreversible".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Delete a call note
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
  • rinkel_delete_contactWRITE, irreversible: delete a contact for the whole account.No findings

    Why it is in this group

    • The name "rinkel_delete_contact" says "delete": a word for removing or ending something.
    • The description says "irreversible".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Delete a contact
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
  • rinkel_start_callWRITE, COSTS CALL MINUTES: starts a real phone call.No findings

    Why it is in this group

    • The name "rinkel_start_call" says "start": a word for a change.
    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Start an outgoing call
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
  • rinkel_update_call_noteWRITE: replace the text of an existing note on a call record (the note id is in `notes[].id` of the call record).No findings

    Why it is in this group

    • The name "rinkel_update_call_note" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Update a call note
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
  • rinkel_update_contactWRITE: update a contact (PUT semantics).No findings

    Why it is in this group

    • The name "rinkel_update_contact" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Update a contact
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
Changes things 4Claude Code: ask
  • rinkel_add_call_noteWRITE: add a note to a call record (visible to everyone in the account who sees the call).No findings

    Why it is in this group

    • The name "rinkel_add_call_note" says "add": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Add a call note
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • rinkel_block_numberWRITE: block a number from calling ANY of the account's numbers.No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Block a number
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
  • rinkel_create_contactWRITE: create a contact.No findings

    Why it is in this group

    • The name "rinkel_create_contact" says "create": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Create a contact
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • rinkel_unblock_numberWRITE: remove a number (or the same wildcard pattern that was blocked) from the block list so it can call again.No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Unblock a number
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
Only reads 18Show 18 read-only tools
  • rinkel_count_new_voicemailsNumber of voicemails that have not been played yet.No findings

    Why it is in this group

    • The name "rinkel_count_new_voicemails" says "count": a word for reading.
    Description, as the server wrote it
    Number of voicemails that have not been played yet. Rinkel API: GET /voicemails/new-count.

    Annotations the server declares

    • title: Count new voicemails
    • readOnlyHint: true
  • rinkel_find_contact_by_numberFind the contact that owns a phone number (E.164 such as +31612345678 works best).Reads private dataNo findings

    Why it is in this group

    • The name "rinkel_find_contact_by_number" says "find": a word for reading.

    What it can reach

    • private-dataThe name "rinkel_find_contact_by_number" says "find" and "contact": it reads contacts.
    • private-dataThe description's first sentence says "find" and "contact": it reads contacts.
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Find a contact by phone number
    • readOnlyHint: true
  • rinkel_get_callGet 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.Reads private dataNo findings

    Why it is in this group

    • The name "rinkel_get_call" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "get" and "note": it reads notes.
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Get a call
    • readOnlyHint: true
  • rinkel_get_call_by_network_idGet one call detail record by its network `callId` (the id Rinkel sends in webhook events), optionally with insights and notes.Reads private dataNo findings

    Why it is in this group

    • The name "rinkel_get_call_by_network_id" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "get" and "note": it reads notes.
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Get a call by network call id
    • readOnlyHint: true
  • rinkel_get_call_recording_urlGet a temporary URL (valid 3 hours) to stream or download a call recording.Reads text others writeNo findings

    Why it is in this group

    • The name "rinkel_get_call_recording_url" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe name "rinkel_get_call_recording_url" says "get" and "url": it reads web pages, which anyone can write.
    • untrusted-inputThe description's first sentence says "get" and "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get a call recording URL
    • readOnlyHint: true
  • rinkel_get_call_transcriptionGet the raw transcription of a call by its network `callId` (needs Rinkel AI insights on the account; 404 when the call has none).No findings

    Why it is in this group

    • The name "rinkel_get_call_transcription" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get a call transcription
    • readOnlyHint: true
  • rinkel_get_contactGet one contact by id.Reads private dataNo findings

    Why it is in this group

    • The name "rinkel_get_contact" says "get": a word for reading.

    What it can reach

    • private-dataThe name "rinkel_get_contact" says "get" and "contact": it reads contacts.
    • private-dataThe description's first sentence says "get" and "contact": it reads contacts.
    Description, as the server wrote it
    Get one contact by id. Rinkel API: GET /contacts/{id}.

    Annotations the server declares

    • title: Get a contact
    • readOnlyHint: true
  • rinkel_get_numberGet 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.No findings

    Why it is in this group

    • The name "rinkel_get_number" says "get": a word for reading.
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Get a phone number
    • readOnlyHint: true
  • rinkel_get_userGet one user by id, including preferences, notification settings, schedule and `deviceId`.No findings

    Why it is in this group

    • The name "rinkel_get_user" says "get": a word for reading.
    Description, as the server wrote it
    Get one user by id, including preferences, notification settings, schedule and `deviceId`. Rinkel API: GET /users/{id}.

    Annotations the server declares

    • title: Get a user
    • readOnlyHint: true
  • rinkel_get_voicemail_urlGet a temporary URL (valid 3 hours) to stream or download a voicemail.Reads text others writeNo findings

    Why it is in this group

    • The name "rinkel_get_voicemail_url" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe name "rinkel_get_voicemail_url" says "get" and "url": it reads web pages, which anyone can write.
    • untrusted-inputThe description's first sentence says "get" and "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get a voicemail URL
    • readOnlyHint: true
  • rinkel_list_callsList call detail records (inbound and outbound calls) with date, direction, status (ANSWERED, MISSED, VOICEMAIL, ANSWERING_SERVICE), duration, external and internal number, the use…Reads private dataNo findings

    Why it is in this group

    • The name "rinkel_list_calls" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "note": it reads notes.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List calls
    • readOnlyHint: true
  • rinkel_list_contactsList the contacts shared with everyone in the account (plus the Rinkel system contact, tag 'system'): names, company, phone numbers, email.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "rinkel_list_contacts" says "list": a word for reading.

    What it can reach

    • private-dataThe name "rinkel_list_contacts" says "list" and "contact": it reads contacts.
    • private-dataThe description's first sentence says "list" and "contact": it reads contacts.
    • untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List contacts
    • readOnlyHint: true
  • rinkel_list_numbersList the account's Rinkel phone numbers: id, label, number, status (ACTIVE, SUSPENDED, PENDING_PORTING_IN ...), activation date and the users assigned.No findings

    Why it is in this group

    • The name "rinkel_list_numbers" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List phone numbers
    • readOnlyHint: true
  • rinkel_list_recordingsList the uploaded audio recordings used in the dial plan (greetings, announcements, voice-over scripts): name, description, duration and where each is used.No findings

    Why it is in this group

    • The name "rinkel_list_recordings" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List greeting recordings
    • readOnlyHint: true
  • rinkel_list_usersList 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 …Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "rinkel_list_users" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List users
    • readOnlyHint: true
  • rinkel_list_voicemailsList voicemail messages (call records with status VOICEMAIL): caller, date, duration, whether new, and the voicemail id.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "rinkel_list_voicemails" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "message": it reads messages.
    • untrusted-inputThe description's first sentence says "list" and "message": it reads messages, which other people can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List voicemails
    • readOnlyHint: true
  • rinkel_list_webhooksList the webhook subscriptions (events incomingCall, outgoingCall, callStart, callEnd, callInsights) with URL and active flag.Reads text others writeNo findings

    Why it is in this group

    • The name "rinkel_list_webhooks" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe description's first sentence says "list" and "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    List the webhook subscriptions (events incomingCall, outgoingCall, callStart, callEnd, callInsights) with URL and active flag. Webhooks need the Expert plan. Rinkel API: GET /webhooks.

    Annotations the server declares

    • title: List webhooks
    • readOnlyHint: true
  • rinkel_validate_phone_numberCheck a phone number for a country and return its normalised form.No findings

    Why it is in this group

    • The name "rinkel_validate_phone_number" says "validate": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Validate a phone number
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Reads text others write6
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

No check matched anything in these tool definitions. That is not a safety guarantee.

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

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

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__rinkel__rinkel_list_calls",
      "mcp__rinkel__rinkel_get_call",
      "mcp__rinkel__rinkel_get_call_by_network_id",
      "mcp__rinkel__rinkel_get_call_transcription",
      "mcp__rinkel__rinkel_get_call_recording_url",
      "mcp__rinkel__rinkel_list_voicemails",
      "mcp__rinkel__rinkel_count_new_voicemails",
      "mcp__rinkel__rinkel_get_voicemail_url",
      "mcp__rinkel__rinkel_list_contacts",
      "mcp__rinkel__rinkel_get_contact",
      "mcp__rinkel__rinkel_find_contact_by_number",
      "mcp__rinkel__rinkel_list_users",
      "mcp__rinkel__rinkel_get_user",
      "mcp__rinkel__rinkel_list_numbers",
      "mcp__rinkel__rinkel_get_number",
      "mcp__rinkel__rinkel_list_recordings",
      "mcp__rinkel__rinkel_list_webhooks",
      "mcp__rinkel__rinkel_validate_phone_number"
    ],
    "ask": [
      "mcp__rinkel__rinkel_add_call_note",
      "mcp__rinkel__rinkel_create_contact",
      "mcp__rinkel__rinkel_block_number",
      "mcp__rinkel__rinkel_unblock_number"
    ],
    "deny": [
      "mcp__rinkel__rinkel_update_call_note",
      "mcp__rinkel__rinkel_delete_call_note",
      "mcp__rinkel__rinkel_update_contact",
      "mcp__rinkel__rinkel_delete_contact",
      "mcp__rinkel__rinkel_start_call"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as rinkel. Review it before you use it.

Capability tags behind 11 rules
  • mcp__rinkel__rinkel_list_calls private-data
  • mcp__rinkel__rinkel_get_call private-data
  • mcp__rinkel__rinkel_get_call_by_network_id private-data
  • mcp__rinkel__rinkel_get_call_recording_url untrusted-input
  • mcp__rinkel__rinkel_list_voicemails private-data, untrusted-input
  • mcp__rinkel__rinkel_get_voicemail_url untrusted-input
  • mcp__rinkel__rinkel_list_contacts private-data, untrusted-input
  • mcp__rinkel__rinkel_get_contact private-data
  • mcp__rinkel__rinkel_find_contact_by_number private-data
  • mcp__rinkel__rinkel_list_users private-data, untrusted-input
  • mcp__rinkel__rinkel_list_webhooks untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/io.usefulapi/rinkel/verify?hash=0887c231b800de56605ce8cfc14f0877b1410e7963f1b231911f024221a36d8c" | jq -e '.changed == false'

Pinned hash 0887c231b800, from Oct 24, 2026, 16:20 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/io.usefulapi/rinkel/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for io.usefulapi/rinkel
[![anlyon.dev](https://anlyon.dev/badge/io.usefulapi/rinkel.svg)](https://anlyon.dev/servers/io.usefulapi/rinkel)

Source: MCP Registry · repository. Synced Oct 24, 2026, 17:17 UTC.