MCP server connecting AI agents (Claude, Cursor) to Notion, Slack, and Jira — the turnkey connector Zapier never shipped.
Teamflow-mcp has 6 tools with basic schemas and descriptions, but significant gaps prevent higher scores. All tools have descriptions (10-100 chars, mostly adequate), and input schemas are present with Zod validation. However, parameter descriptions are sparse or missing entirely (e.g., notion_create_page 'title' param has null description; slack_post_message 'channel' and 'text' lack descriptions; jira_search 'max' and jira_create_issue 'project_key'/'summary' lack descriptions). Output schemas are not documented, responses are free-text strings without structured field definitions. Error handling returns generic fail() messages without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear read/write distinctions. Naming is verb-noun compliant but generic (e.g., 'notion_search' vs 'search_notion_pages'). No pagination support despite search tools returning lists. Missing parameter constraints (e.g., no enum for issue_type despite mentioning 'Task'/'Bug'). Composition is reasonable, tools are single-purpose, but output lacks IDs needed for chaining (e.g., notion_create_page returns only title and ID in text, not structured JSON).
Create a Jira issue in a project.
Search Jira issues with a JQL query. Returns key + summary.
Create a new Notion page under a parent page, with a title and markdown-ish text body.
Search Notion pages and databases by text. Returns matching titles and IDs.
List Slack channels the bot can see (id + name).
Post a message to a Slack channel (by channel id or #name).
Missing parameter descriptions on 7+ parameters across all tools (notion_create_page.title, slack_post_message.channel, slack_post_message.text, jira_search.max, jira_create_issue.project_key, jira_create_issue.summary, jira_create_issue.issue_type). LLMs cannot infer parameter meaning from names alone.
No output schemas documented. All tools return free-text strings via ok()/fail() helpers. LLMs cannot parse structured fields, extract IDs for chaining, or plan downstream calls. E.g., notion_create_page returns 'Created page "X" id=Y' as plain text, not {title, id, url}.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk classification. Write tools (notion_create_page, slack_post_message, jira_create_issue) should declare destructiveHint=true; read tools should declare readOnlyHint=true. Agents cannot distinguish safe from unsafe operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error handling returns generic fail() messages without recovery guidance. E.g., 'notion_search failed: HTTP 401: invalid_grant' tells the agent nothing actionable. Should return 'Invalid Notion token. Verify NOTION_TOKEN environment variable is set and has read:pages scope.'
No pagination support on list/search tools. notion_search and jira_search accept page_size/max but do not return total_count, next_cursor, or has_more. Agents cannot iterate over large result sets without manual offset tracking.