This PHP MCP server collection exposes 30 tools across GitHub, Trello, and X/Twitter APIs. Tool definitions are registered via PHP attributes (#[McpTool]) and include names, descriptions, and parameter schemas. Strengths: consistent verb-noun naming (create_issue, list_issues, move_card), documented parameter types via #[Schema] attributes, and structured JSON output. Weaknesses: descriptions are terse (often <100 chars, below the 194-char production baseline); many parameters lack detailed constraints or format guidance in descriptions; output schemas are not documented (only JSON_PRETTY_PRINT returned); error handling is implicit (no documented recovery paths); some parameter relationships underdocumented (e.g., board_id 'Required when moving to a list in a different board' is unclear without board_id context).
Tools (30)
add_check_itemwriteauthsource verified70/100
Add an item to a checklist.
add_commentwriteauthsource verified72/100
Add a comment to a card.
add_commentwriteauthsource verified72/100
Add a comment to a GitHub issue.
add_label_to_cardwriteauthsource verified70/100
Add a label to a card.
archive_cardwriteauthsource verified70/100
Archive a card (set closed to true).
archive_stale_cardswriteauthsource verified75/100
Archive cards in a list that have had no activity for more than N days. Returns a summary of archived cards.
Output schemas not documented. Tools return JSON_PRETTY_PRINT of underlying API responses, but LLMs lack guidance on expected fields, types, and structure. This violates pattern:tool requirement that output schema be documented.
Descriptions are below production baseline (194 chars). Many tools have 40-60 char descriptions that lack context for LLM selection. Examples: 'Get all labels for a board.' (35 chars), 'Get a checklist with all its check items.' (45 chars). Baseline A+ tools average 194 chars with WHEN/WHY context.
Document output schemas for all tools. For each tool, add a code comment or docstring block showing the expected JSON structure. Example for list_issues: 'Returns {issues: [{id, title, state, labels, created_at, ...}], total_count, next_cursor}'. This enables LLMs to plan downstream calls and extract correct fields.
Expand descriptions from 40-60 chars to 80-150 chars following the pattern: '[ACTION] [CONTEXT] [WHEN TO USE] [RETURN SUMMARY]'. Example: 'Get a specific Trello card by ID. Use this when you need to inspect a card's full details before updating or when you have a card_id from a previous list_cards call. Returns card metadata including name, description, due date, labels, and checklist summaries.'
Add explicit format constraints to parameter descriptions. For ISO 8601 dates, write 'due_date (ISO 8601 format: YYYY-MM-DD, e.g. 2024-12-31)'. For enums, write 'priority must be one of: high, medium, low (default: medium)'. For numeric ranges, write 'per_page (1-100, default 10)'.
Document parameter relationships in both parameters' descriptions. For update_card, add: 'list_id: Target list ID. If omitted, card stays in current list. board_id: Required ONLY if list_id is in a different board than the current card. If provided, list_id must belong to board_id.'
Add error recovery guidance as comments in the tool docstrings. Example for create_issue: 'If labels parameter contains non-existent labels, the API will reject the request. Call list_labels() first to discover valid label names, then retry create_issue with valid labels.'
Score history
Overall score trend
First recorded score · v2 rubric
49/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
49
2026-07-28+
v2
create_cardwriteauthsource verified75/100
Create a new card in a list.
create_checklistwriteauthsource verified70/100
Create a checklist on a card.
create_issuewriteauthsource verified77/100
Create a new GitHub issue (task/story).
create_listwriteauthsource verified73/100
Create a new list in a board.
create_stepwriteauthsource verified77/100
Create a Step (user story) and add it to the Steps board.
create_taskwriteauthsource verified73/100
Create a Task linked to a parent Step and add it to the Tareas board.
get_cardread onlyauthsource verified70/100
Get a card by its ID.
get_checklistread onlyauthsource verified70/100
Get a checklist with all its check items.
get_issueread onlyauthsource verified73/100
Get a specific GitHub issue by number.
get_labelsread onlyauthsource verified70/100
Get all labels for a board.
get_listsread onlyauthsource verified70/100
Get all lists in a board.
get_my_tweetsread onlyauthsource verified72/100
Get your own posts.
get_timelineread onlyauthsource verified73/100
Get your home timeline.
list_boardsread onlyauthsource verified65/100
List all boards for the authenticated user.
list_cardsread onlyauthsource verified70/100
Get all cards in a list.
list_issuesread onlyauthsource verified75/100
List GitHub issues.
move_cardwriteauthsource verified72/100
Move a card to a different list.
move_task_statuswriteauthsource verified75/100
Move a task to a different status column in the Tareas board.
Parameter relationships underdocumented. Example: update_card has 'board_id: Required when moving to a list in a different board' but this constraint is vague. Should state: 'Provide board_id only when list_id points to a board different from the current card's board.' Undocumented dependencies cause silent misuse (pattern:tool requirement).
No error handling guidance. Tools do not document recovery paths or error categories (retryable vs user-fixable). Example: create_issue may fail if labels don't exist, but there is no documented recovery. Pattern:recovery-guide requires 'what to do next' in error responses.
Parameter format guidance missing. Examples: create_card accepts 'due' as ISO 8601 but the description does not explicitly state format ('due_date (ISO 8601 format, YYYY-MM-DD)'), forcing LLM to infer. Pattern:constrained-input requires explicit format constraints.
Mutually exclusive parameters not flagged. Example: tweet has 'text' (required) and 'reply_to' (optional), but no indication that reply_to changes behavior (thread vs standalone). Pattern:tool requires documenting when params are mutually exclusive or conditionally required.
tweet
Document pagination for all list_* tools. Add to descriptions: 'Returns paginated results. Response includes total_count and next_cursor for fetching the next page. Use per_page to control batch size (1-100, default 10).' If the underlying API doesn't support cursors, document the offset/limit pattern.
Add toolAnnotations to tool definitions where applicable. Mark create_issue, update_issue, close_issue, create_task, move_task_status, create_card, update_card, archive_card, add_label_to_card, tweet as destructiveHint=true so LLMs know these are write operations and handle them carefully.
Add input validation examples or pseudo-code comments showing how invalid inputs will be rejected. Example: 'Invalid state value. Must be one of: open, closed, all. Received: pending.' This sets expectations for LLM error handling.
Consolidate duplicate tool names. Both GitHub and Trello have add_comment tools. Rename to add_issue_comment and add_card_comment for disambiguation, preventing LLMs from confusing the two.
Document batch operation alternatives. If agents will frequently add multiple labels to a card, offer add_labels (array variant) alongside add_label_to_card to reduce sequential call overhead.