A comprehensive MCP server for the full Unipile API covering account management, cross-platform messaging (LinkedIn, WhatsApp, Instagram, Telegram), attendee management, email (Gmail + Outlook unified), calendar (Google + Microsoft unified), LinkedIn search/profiles/users, connections, InMail, posts & content, jobs & recruiter, webhooks, and advanced LinkedIn operations
The Unipile MCP server presents 8 tools with basic structure but significant quality gaps. Tool naming follows verb conventions (list_, get_, delete_, reconnect_, resync_, connect_, solve_), which is good. However, descriptions lack depth and actionable context. Parameters are present with types and descriptions, but many descriptions are too brief (under 50 chars) and lack format constraints, validation guidance, or dependency hints. Output schemas are not documented, the code shows API passthrough without schema shaping. Error handling is absent: no recovery guidance, no error categorization, and raw API errors would propagate to the LLM. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are visible in the code. The server declares 8 tools total but sources indicate 96 tools are claimed in comments; only 8 are shown in the provided code, suggesting incomplete implementation or documentation mismatch. Across the visible tools, average description length is ~95 chars (below the 194-char baseline for production tools), and parameter descriptions are minimal (30-60 chars vs. 72-char baseline).
Connect a new account using native authentication (username/password).
Delete a connected account from Unipile.
Get details of a single connected account.
Get the authenticated user's LinkedIn profile. Returns profile data including name, headline, summary, experience, education, and skills.
List all connected accounts (LinkedIn, WhatsApp, Email, etc.). Returns account IDs, types, status, and connection details for all platforms linked to your Unipile integration.
Reconnect a disconnected account via hosted authentication. Returns a URL that the user must open in a browser to re-authorize.
Output schemas are not documented. Code shows API passthrough (response.json()) with no shaping or field documentation. LLMs cannot infer what fields the response contains or how to chain calls.
Destructive operations (delete_account, connect_account with password, solve_checkpoint) lack confirmation/dry-run patterns and do not declare destructiveHint. No guard against accidental data loss by agents.
Descriptions are too brief and lack actionable context. E.g., 'Delete a connected account from Unipile.' (45 chars) does not explain consequences, reversibility, or when to use this tool vs. disconnect. Minimum 50 - 100 chars recommended; many are 30 - 60 chars.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Force a full resync of an account's data.
Solve a 2FA/checkpoint challenge during account connection.
connect_account exposes passwords as a plain-text parameter. This violates secret-injection pattern, agent calls and logs will contain plaintext credentials. Must use secure OAuth/WebAuthn flow or server-side credential storage.
No error handling or recovery guidance in tool implementations. Code returns raw API errors (response.status_code, response.text) without classification or actionable hints. LLMs cannot determine if errors are retryable, user-fixable, or fatal.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are absent. Code does not declare tool metadata via @mcp.tool() decorator options. Agents cannot infer which tools are safe to retry or require confirmation.
Parameter descriptions lack format constraints and validation rules. E.g., 'account_id' param lacks mention of format (UUID? alphanumeric?), length, or examples. 'google_scopes' (in reconnect_account) says 'max 6' but no description of scope format or validation.
Documentation mismatch: project README claims '96 tools for messaging, email, calendar, LinkedIn, and more' but only 8 are visible in server.py. Either massive tools are missing from the code snapshot, or the description is misleading. This creates false expectations.
No pagination parameters (limit, offset, page, cursor) on list_accounts despite claiming to return 'all connected accounts'. If a user has 1000+ accounts, response will be huge and block context window.