Strong foundation with well-structured schemas and clear naming conventions. All 7 tools follow verb_noun patterns (search_*, get_*, chatgpt_*). Input schemas are comprehensive with proper type constraints, enums, and bounds. Descriptions are present and actionable (avg ~80 chars). However, output schemas are not documented, LLMs cannot predict response structure. Error handling exists but lacks recovery guidance. No tool annotations (readOnlyHint, etc.) despite all being read-only. Parameter descriptions are adequate but could be more prescriptive about format/constraints.
Fetch details about a specific ticket or changeset (ChatGPT-compatible tool)
Search for tickets or changesets (ChatGPT-compatible tool)
Get information about a specific changeset/revision
Get detailed information about a specific ticket
Get recent activity timeline from Trac
Get metadata about Trac instance configuration
Search for tickets in a Trac instance
Output schemas not documented. LLMs cannot predict response structure for any tool. Responses include ticket fields, changeset diffs, timeline entries, but no schema is visible in tool definitions.
Tool annotations missing. All 7 tools are read-only (no state mutation), but readOnlyHint is not declared. Agents cannot infer safety/idempotency without explicit hints.
Error handling lacks recovery guidance. ToolError class exists with codes (not_found, invalid_argument, rate_limited, upstream_error) but error responses do not suggest next steps. E.g., 'Ticket not found' should suggest 'Try search_tickets() first.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
chatgpt_search and chatgpt_fetch naming is ambiguous. 'chatgpt_' prefix suggests these are ChatGPT-specific variants, but they operate on the same Trac data as search_tickets/get_ticket. Naming should clarify purpose or consolidate.
Parameter descriptions lack format/constraint details. E.g., 'query' param says 'Search query' but does not explain syntax (AND/OR operators, field prefixes, etc.). 'component' and 'milestone' accept strings but do not list valid values or suggest discovery.