MCP server that exposes read-only Allo API endpoints as tools for accessing call history, contacts, conversations, and analytics
Strong foundation with 12 well-named, read-only tools covering a coherent Allo API surface. All tools have descriptions (avg 150 chars, within baseline 194). Input schemas are present and properly typed with enums and constraints. Pagination parameters (page, size) are consistently implemented with min/max bounds. However, output schemas are not documented, LLMs cannot predict response structure for downstream chaining. Error handling is basic (HTTP status codes mapped to text) but lacks recovery guidance. No tool annotations (readOnlyHint, idempotentHint) despite all being read-only. Parameter descriptions are adequate but could be more prescriptive about expected formats and dependencies.
Get high-level analytics for the Allo account: call volume, average duration, top contacts, engagement trends, etc.
Retrieve a single contact by ID (e.g., 'cnt_abc123'). Pass `extend` to include additional sections.
Get the calls + SMS exchanged with a specific contact, including recordings, transcripts, and AI summaries. Page is 0-indexed.
Retrieve a single conversation item (call or SMS) by ID. Includes full transcript, recording URL, and AI summary.
List conversations grouped by contact phone number, sorted by most recent activity. Page is 1-indexed (v2 convention).
List the Allo phone numbers (E.164) attached to the account. Call this first when you need an `allo_number` parameter for `allo_search_calls` or `allo_list_conversations`.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nested objects) for downstream tool chaining. E.g., allo_search_calls returns transcript array and recording_url, but this is only in the description, not a formal schema.
No tool annotations despite all 12 tools being read-only and idempotent. Missing readOnlyHint and idempotentHint annotations prevent LLMs from optimizing retry logic and understanding safety guarantees.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
List all tags configured on the Allo account.
List team members on the Allo account. Filter by role or status.
Get the authenticated Allo account identity. Use this as a sanity check that the API key works.
Search call history for an Allo number. Each result includes the full transcript (array of {source,text,time,start_seconds,end_seconds}), AI summary, recording_url, tags, type (INBOUND/OUTBOUND) and result (ANSWERED/MISSED/VOICEMAIL/TRANSFERRED/TRANSFERRED_AI/BLOCKED). Page is 0-indexed.
List contacts with engagement level. Page is 0-indexed.
Search conversation items (calls + SMS) for a specific contact. Page is 0-indexed.
Error handling lacks recovery guidance. The respond() function maps HTTP errors to text but does not suggest next steps. E.g., a 404 'contact not found' should suggest 'Try allo_search_contacts() to find the correct ID.'
Pagination inconsistency: allo_list_conversations uses 1-indexed pages (v2 convention) while others use 0-indexed. This mismatch forces LLMs to track two different pagination models and risks off-by-one errors.
Parameter descriptions lack format constraints. E.g., 'allo_number' says 'E.164 format (e.g., +14155551234)' but does not declare a regex pattern or length bounds. LLMs may pass invalid formats like '14155551234' or '+1-415-555-1234'.