Three tools with basic verb-noun naming (create_report, get_report_status, download_report). All have descriptions (50-80 chars, below the 194-char baseline). Input schemas present with Zod validation but parameter descriptions are minimal or absent. create_report lacks description of what 'predefined settings' means; download_report description is vague about S3 URL handling. No output schema documentation. Error handling returns raw JSON or error text without recovery guidance. No pagination, no idempotent hints, no permission gates. Composition is reasonable (three separate concerns) but parameter naming lacks type suffixes (e.g., 'download_url' should clarify it's a URL string, not an ID).
Creates an asynchronous report in Singular with predefined settings.
Downloads the CSV report from the provided S3 URL.
Gets the status of an asynchronous report until status is 'DONE'.
Parameter descriptions missing or incomplete. 'start_date' and 'end_date' lack format guidance (YYYY-MM-DD is in tool description, not param description). 'download_url' has no description at all. LLMs cannot infer parameter meaning from names alone.
Output schemas not documented. Callers do not know what fields to expect from create_report (report_id? status?), get_report_status (status values?), or download_report (CSV structure?). Agents cannot plan downstream calls.
Error handling returns raw JSON or generic error text without recovery guidance. 'Singular API error: ...' tells the agent nothing about whether to retry, ask the user, or abort. No error classification (retryable vs. fatal).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
create_report description mentions 'predefined settings' but does not explain what dimensions, metrics, time_breakdown, and format are fixed. LLMs cannot determine if this tool meets their needs without reading source code.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). create_report is destructive (creates a report, consumes API quota) but LLMs have no signal to treat it carefully. get_report_status and download_report are read-only but unmarked.