Odile answering lines
com.odilelabs/answering-linesodilelabs.comstreamable-httpv1.0.0Scanned
A phone line for your app or business that answers calls, takes messages and bookings.
9 tools: 4 change things and 5 only read.
- Reads private data · 3
- Reads text others write · 6
- Can send data out · 0
- 2 findings
Anlyon alternative
4 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.
9 tools
Changes things 4Claude Code: ask
buy_packReturns a one-time Stripe checkout link for a prepaid pack, to top up something that already exists; to start a new answering line use set_up_answering_line.Reads text others write1 finding
Why it is in this group
- The description's first verb is "return": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Warn
The server marks "buy_pack" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns a one-time Stripe checkout link for a prepaid pack, to top up something that already exists; to start a new answering line use set_up_answering_line. The customer opens the link and pays on Stripe's own page, and this connection never sees the card. Only call it when the customer asked to buy, and tell them the price first. product picks what is bought: 'line_minutes' (phone minutes for an After Hours line; line_id required; min40: 40 minutes for $10; min200: 200 minutes for $50), 'line_outcomes' (resolved conversations for an outcome line; line_id required; out50: 50 resolved conversations for $24.50; out200: 200 resolved conversations for $98), 'direct' (Direct credits: direct100c, direct1000, direct10000), 'formats' (Odile Formats credits: small, medium, large), 'photos' (Plate API photo credits: starter: 1000 photos for $10; growth: 5000 photos for $45; scale: 20000 photos for $160), 'minutes' (meeting minutes, only where Meeting Notes is on) or 'calls' (legacy per-call lines only; line_id required). For line products the pack must match the line's billing_mode. What was paid is added within a minute of payment, whatever device paid it. Nothing renews. Needs a signed-in connection with the billing:checkout permission; rate limited per account. Returns { checkout_url, product, pack, price_cents, units, unit, then }.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
get_sip_addressCreate (first call) or read the SIP address and private trunk credentials for one of the signed-in owner's answering lines, so the owner's phone system can send calls to the line o…Reads private dataReads text others write1 finding
Why it is in this group
- The name "get_sip_address" says "get": a word for reading.
- The description's first verb is "create": a word for a change.
What it can reach
- private-dataThe description's first sentence says "credential": it reads secrets.
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Info
The description mentions "credentials".
What this check looks forMatched text
description: "...read the SIP address and private trunk credentials for one of the signed-in owner's answer..."
Description, as the server wrote it Create (first call) or read the SIP address and private trunk credentials for one of the signed-in owner's answering lines, so the owner's phone system can send calls to the line over SIP, with no phone number, instead of forwarding a number. For the line's number and forwarding codes use get_answering_line. Pass the line_id from get_answering_line; a line that is still being set up returns an error. Returns { alias, sip_uri, sip_uri_tls, username, password }; keep the username and password private. The address is created once and repeat calls return the same one. SIP calls use the line's normal balance with no separate SIP charge. Needs lines:manage; rate limited per account.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
set_up_answering_lineStart setting up an After Hours answering line for the signed-in owner's business: a phone assistant that answers calls forwarded from the business's own number and takes messages …Reads text others writeNo findings
Why it is in this group
- The name "set_up_answering_line" says "set": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Start setting up an After Hours answering line for the signed-in owner's business: a phone assistant that answers calls forwarded from the business's own number and takes messages and bookings for the owner. Nothing is built or bought until the owner pays: this returns a Stripe checkout link for the first pack, and once it is paid the line is set up automatically and its number and forwarding codes are emailed to the account's address. Only call it after showing the owner https://odilelabs.com/terms and getting a yes (owner_confirmed_terms true). The packs and billing rules are in get_answering_line_offer; a line that already exists is read with get_answering_line and topped up with buy_pack (product 'line_minutes' or 'line_outcomes', matching its billing_mode), not set up twice. United States only: business_phone and owner_mobile take any common US format with the area code and are stored as E.164, and Canadian area codes are refused. hours keys are day names (Monday, monday or mon); a day left out is closed, and omitting hours means Monday to Friday, 9 to 5. Messages reach the owner by email and the owner console; texts stay off until the owner switches them on there. Needs a signed-in connection with the lines:manage permission; limited to 3 set-ups a day per account, and rate limited. Returns { setup_id, status: 'awaiting payment', business_name, business_phone, pack, billing_mode, minutes or outcomes, price_cents, checkout_url, then }.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
try_answering_lineCreate a test call so you can hear an After Hours answering line before anything is set up: it returns a shared test phone number and a 4-digit code (valid 24 hours, up to 5 calls)…Reads text others writeNo findings
Why it is in this group
- The description's first verb is "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a test call so you can hear an After Hours answering line before anything is set up: it returns a shared test phone number and a 4-digit code (valid 24 hours, up to 5 calls). Calling the number and keying the code reaches a phone assistant answering as the business you describe, and hear_url plays the same assistant in a browser. Nothing is booked, sent or charged on a test line, and it is not a real line: for one on the business's own number use set_up_answering_line. business_name and trade are required; trade sets what the assistant knows to ask, and area, hours, services and timezone shape what it says. Needs a signed-in account (any permissions); limited to 3 test lines a day per account, and rate limited. Returns { sandbox, test_number, test_number_e164, test_code, hear_url, expires_at, calls_allowed, how }.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
Only reads 5Show 5 read-only tools
get_answering_lineList the signed-in owner's own After Hours answering lines and any set-ups still awaiting payment (under pending).No findings
Why it is in this group
- The name "get_answering_line" says "get": a word for reading.
Description, as the server wrote it List the signed-in owner's own After Hours answering lines and any set-ups still awaiting payment (under pending). Use it first: it returns the line_id that get_line_calls, get_line_messages, get_sip_address and buy_pack need. For each line it returns status (live, queued, setting up or closed), number, billing_mode, balance (seconds, outcomes or legacy calls; minutes_remaining to one decimal for minute lines, outcomes_remaining for outcome lines), forwarding (per carrier, the code that starts forwarding and, where the carrier has one, the stop code that turns it off) and the latest 10 recent_calls, with callers shown by their last four digits only. The full call list is get_line_calls and the messages callers left are get_line_messages. There is no tool to pause, edit or close a line: stop forwarding with the stop code, and use the owner console (https://odilelabs.com/owner) for settings, billing, call audio and transcripts. Needs lines:manage; changes nothing; rate limited per account.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_answering_line_offerRead the offer for starting a new After Hours answering line: a phone assistant that picks up the calls an owner forwards from their own business number, takes messages and booking…Reads private dataReads text others writeNo findings
Why it is in this group
- The name "get_answering_line_offer" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "read" and "message": it reads messages.
- untrusted-inputThe description's first sentence says "read" and "message": it reads messages, which other people can write.
Description, as the server wrote it Read the offer for starting a new After Hours answering line: a phone assistant that picks up the calls an owner forwards from their own business number, takes messages and bookings and tells the owner. Use it before set_up_answering_line, to tell the owner exactly what they would buy. It covers the prepaid minute packs, the per-resolved-conversation packs, the billing rules and what happens when a balance reaches zero. It covers After Hours lines only: Direct credit costs are in get_m2m_network and an existing line's balance is in get_answering_line. Offered in: US. The values come from the same tables checkout charges from, so they cannot drift from what is billed. Takes no arguments, needs no sign-in, reads no account and changes nothing. Returns { product, packs[{id, minutes, cents}], per_minute_cents, min_billable_seconds, billing_rule, at_zero, outcome_packs[{id, outcomes, cents}], per_outcome_cents, outcome_billing_rule, outcomes_at_zero, countries[], owner_must[], terms_url, set_up_with, top_up_with }.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_line_callsList the incoming calls answered by one of the signed-in owner's own lines, newest first, with the full caller number (E.164 or null) that get_answering_line shows only as its last…No findings
Why it is in this group
- The name "get_line_calls" says "get": a word for reading.
Description, as the server wrote it List the incoming calls answered by one of the signed-in owner's own lines, newest first, with the full caller number (E.164 or null) that get_answering_line shows only as its last four digits. Each item has id, at (ISO), caller, duration_seconds, summary when there is one, and urgent when known. Pass the line_id from get_answering_line; limit sets the page size, and to read further back pass the previous result's next_before as before (next_before is null when there is nothing older). It covers recent calls only, so older ones may not be returned. No audio links or transcripts: open the call in the owner console (https://odilelabs.com/owner). The messages callers left are in get_line_messages, and calls you placed with call_business are read with get_call_result. Needs lines:manage; changes nothing; rate limited per account.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_line_messagesList the messages the answering line took from callers for one of the signed-in owner's own lines, newest first.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "get_line_messages" says "get": a word for reading.
What it can reach
- private-dataThe name "get_line_messages" says "get" and "message": it reads messages.
- private-dataThe description's first sentence says "list" and "message": it reads messages.
- untrusted-inputThe name "get_line_messages" says "get" and "message": it reads messages, which other people can write.
- 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 the messages the answering line took from callers for one of the signed-in owner's own lines, newest first. Each item has id, at (ISO), name, phone, message and urgent, so it holds callers' names and phone numbers. Pass the line_id from get_answering_line; limit sets the page size, and to read further back pass the previous result's next_before as before (next_before is null when there is nothing older). It reaches back through at most the 500 most recent messages. The calls themselves, with duration and summary, are in get_line_calls. Replies from businesses you contacted through Direct are in get_replies. Needs lines:manage; changes nothing; rate limited per account.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_receptionist_benchmarkRead Odile Labs' published benchmark of AI phone answering products: real test calls placed to public lines, scored against stated measures.No findings
Why it is in this group
- The name "get_receptionist_benchmark" says "get": a word for reading.
Description, as the server wrote it Read Odile Labs' published benchmark of AI phone answering products: real test calls placed to public lines, scored against stated measures. Use it when someone asks how AI phone answering handles real calls, or to compare named products. Vendor-run by Odile Labs (which sells After Hours and Dusklin), so not independent. It does not test the caller's own line (read_more.free_line_check does). Call it with no arguments first, then narrow with line_id and scenario_id; both come from that first response, and an unknown id returns an error listing the valid ones. include_evidence adds the quoted transcript behind each point (much longer output). Returns { source, date, calls, minutes, run_by, limitations, fairness_note, scenarios[{id,name,brief}], lines[{id, vendor, business, kind, answers_as, list_price, ranked, points, possible, by_scenario{<scenario_id>:{points, possible, answered, first_words_s, ai_disclosed_unprompted, reply_language, price_quoted, measures}}}], read_more }. Needs no sign-in; reads a published file and changes nothing.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
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 data3
- 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.
- Warnbuy_pack
The server marks "buy_pack" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "return": a word for reading.
- Infoget_sip_address
The description mentions "credentials".
What this check looks forMatched text
description: "...read the SIP address and private trunk credentials for one of the signed-in owner's answer..."
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 answering-lines https://odilelabs.com/mcp/linesclaude mcp add --transport http answering-lines https://odilelabs.com/mcp/linesRun 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__answering-lines__get_answering_line_offer",
"mcp__answering-lines__get_answering_line",
"mcp__answering-lines__get_line_calls",
"mcp__answering-lines__get_line_messages",
"mcp__answering-lines__get_receptionist_benchmark"
],
"ask": [
"mcp__answering-lines__try_answering_line",
"mcp__answering-lines__set_up_answering_line",
"mcp__answering-lines__get_sip_address",
"mcp__answering-lines__buy_pack"
],
"deny": []
}
}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 answering-lines. Review it before you use it.
Capability tags behind 6 rules
- mcp__answering-lines__get_answering_line_offer private-data, untrusted-input
- mcp__answering-lines__try_answering_line untrusted-input
- mcp__answering-lines__set_up_answering_line untrusted-input
- mcp__answering-lines__get_sip_address private-data, untrusted-input
- mcp__answering-lines__get_line_messages private-data, untrusted-input
- mcp__answering-lines__buy_pack 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/com.odilelabs/answering-lines/verify?hash=3d01f11fad6e77b5c47bd3f84d4a3cf7e8f4bb037083cd0fdbfa9bc3d0d8abe3" | jq -e '.changed == false'Pinned hash 3d01f11fad6e, from Oct 31, 2026, 17:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/com.odilelabs/answering-lines/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/com.odilelabs/answering-lines)Source: MCP Registry · repository. Synced Oct 31, 2026, 17:17 UTC.