MCP server for voice-driven task automation with Gmail, Google Tasks, and Notion integration
Four tools with basic schemas and descriptions, but significant gaps in parameter documentation, error guidance, and output structure. All tools have descriptions (10-80 chars, below the 194-char baseline), and input schemas are present but sparse. send_email and create_notion_page lack parameter descriptions for critical fields (to_email, subject, body, title, content). Error handling returns free-text strings instead of structured recovery guidance. No tool declares output schema or pagination. Composition is reasonable (separate read/write tools), but descriptions are too terse to guide LLM selection effectively.
Add a task to the default Google Tasks list.
Create a new page in the default Notion database with the given title and content.
List recent tasks in the default Google Tasks list to check for duplicates.
Send or draft an email using Gmail. You MUST use an exact email address. Do not guess.
Parameter descriptions missing or incomplete. send_email's to_email, subject, body lack descriptions in the schema; create_notion_page's title and content similarly undocumented. LLMs cannot infer parameter meaning from names alone.
Tool descriptions are too brief (30-80 chars vs. 194-char baseline). send_email's 'Send or draft an email using Gmail...' lacks WHEN to use it, WHAT it returns, and prerequisites. Descriptions should be 50-200 chars and answer: what, when, and what's returned.
No output schema documented. Tools return free-text strings (e.g., 'Draft created: {id}', 'Task Id: {id}') without declaring structure. LLMs cannot plan downstream calls or extract IDs reliably. Responses should be structured JSON with typed fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Error handling returns unstructured text without recovery guidance. 'Failed to send email: {str(e)}' gives the LLM no actionable next step. Errors should categorize as retryable/user-fixable/fatal and suggest recovery (e.g., 'Invalid email format. Try search_contacts() first.').
Credentials stored in Firestore and injected via get_google_creds(). While not exposed as parameters, the fallback 'simulation mode' silently succeeds without credentials, masking auth failures and producing fake results that confuse agents.