Remote MCP server for contacts CRM compatible with ChatGPT Custom Connectors
The server demonstrates solid definition quality with well-structured tools, consistent naming conventions, and comprehensive parameter documentation. All 5 tools follow verb_noun naming (contacts_manage, contacts_query, contacts_search, contacts_followup, contacts_delete). Descriptions are substantive (150-250 chars range), explaining WHAT the tool does and WHEN to use it. Input schemas are fully defined with JSON Schema types, descriptions, and constraints. However, output schemas are not explicitly documented in the source, descriptions mention what is returned but no formal schema is provided. Error handling is present but lacks actionable recovery guidance. The server properly includes response_format enums across all tools and uses proper constraints (enums for status, min/max for pagination).
Delete a contact from the database. Use this when the user wants to: - Remove outdated or duplicate contacts - Clean up the contact list - Delete a specific person Two ways to identify the contact: 1. By ID (exact match): Provide the UUID from a previous query 2. By name + company (fuzzy match): Finds the best match for safety IMPORTANT: This operation cannot be undone. For fuzzy matches, the contact details are shown for confirmation. Returns the deleted contact details.
Find contacts that need follow-up actions. Prioritizes by status and recency. Use this when the user wants to: - See who needs follow-up - Review pending tasks - Prioritize outreach - Check overdue follow-ups Parameters: - days_overdue: Optional filter for contacts pending N+ days (requires updated_at tracking) - limit: Maximum results (default 10, max 50) Returns contacts with status='Pending' and non-empty follow_up_action, sorted by oldest first.
Add or update contacts in batch (up to 100 at once). This is idempotent - if a contact with the same name and email exists, it will be updated instead of creating a duplicate. Use this when the user wants to: - Add new contacts from meetings, events, or conversations - Update existing contact information - Bulk import contacts from other sources Required field: name Optional fields: company, role, email, phone, linkedin_url, connection_type, how_we_met, status (Pending/Scheduled/Complete), follow_up_action, notes, tags Returns the created/updated contacts with their IDs.
Output schemas not formally documented. Tool descriptions state what is returned ('Returns created/updated contacts with their IDs', 'Returns paginated results', 'Returns ranked results') but no JSON Schema output definition is provided in the source code. LLMs cannot infer downstream field names needed for chaining tools.
contacts_delete accepts both ID-based and name+company fuzzy matching, but the mutual exclusivity and fallback behavior are not explicitly documented. Parameter descriptions say 'optional' for all three but do not explain: 'If id is provided, ignore name/company. Otherwise, attempt fuzzy match on name+company. At least one must be provided.'
Error handling lacks actionable recovery guidance. The source shows no error messages guiding the LLM on next steps (e.g., 'Email already exists. Did you mean to update? Call contacts_manage with the existing contact ID.').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 57 | - | v1 |
Search and filter contacts with pagination support. Use this when the user wants to: - List all contacts at a company - Find contacts by status (Pending/Scheduled/Complete) - Filter by tags - Browse contacts with pagination Filters (all optional): - company: Filter by company name (exact match) - status: Filter by status (Pending, Scheduled, Complete) - tag: Filter by tag (exact match) - limit: Results per page (default 20, max 200) - offset: Skip N results (for pagination) Returns paginated results with metadata showing total count and next offset.
Full-text search across all contact fields (name, company, role, notes). Use this when the user wants to: - Find contacts by keyword or phrase - Search across multiple fields at once - Recall someone based on partial information ("that person from the tech meetup") The search uses PostgreSQL full-text search with stemming and ranking. Parameters: - query: Search keywords or phrase - limit: Maximum results (default 20, max 100) Returns ranked results with the most relevant contacts first.
contacts_followup description mentions 'requires updated_at tracking' but does not explain what happens if a contact lacks this field or if the database does not populate it. The tool assumes a contract that may not be enforced.
contacts_manage does NOT declare idempotency explicitly in the tool definition, despite the description stating 'This is idempotent'. Missing idempotentHint annotation in tool metadata.