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.
- 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 private data8
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- 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/mcpclaude mcp add --transport http rinkel https://rinkel.usefulapi.io/mcpRun 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.
{
"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.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.usefulapi/rinkel)Source: MCP Registry · repository. Synced Oct 24, 2026, 17:17 UTC.