Unpress has 10 tools with complete JSON Schema definitions and descriptions, but significant gaps limit production readiness. All tools have descriptions (10-80 chars, below the 194-char baseline), parameter schemas with types, and enums where appropriate. However, output schemas are entirely undocumented, LLMs cannot predict response structure. Error handling is minimal (only 'Session not found' visible). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels (WRITE, DESTRUCTIVE). Parameter descriptions are sparse (e.g., 'Migration session ID' lacks context on how to obtain it). No guidance on dependencies between tools (e.g., unpress_start must precede unpress_migrate). Secrets (wp_auth_token, sanity_token, github_token, vercel_token) are exposed as parameters, violates pattern:secret-injection.
Execute a post-migration site change via the AI copilot
Submit a user decision for a pending migration choice
Deploy the generated site to GitHub and Vercel
Analyze inspiration sites and generate a design for the new website
Migrate WordPress content to Sanity CMS
Mark a migration session as rolled back — manual cleanup of remote resources required
Scan a WordPress site and generate a content manifest with cost estimate
Secrets exposed as tool parameters: wp_auth_token, sanity_token, github_token, vercel_token appear in unpress_start, unpress_scan, unpress_design, unpress_deploy, unpress_copilot. These will be logged in agent traces and prompt history.
No output schemas documented. LLMs cannot predict response structure. unpress_status returns JSON with 'phase', 'progress', 'checkpoint', 'pending_decisions', 'errors' but this is inferred from code, not declared in tool definition.
No tool annotations despite clear risk levels. unpress_rollback is DESTRUCTIVE but has no destructiveHint. unpress_status is READ_ONLY but has no readOnlyHint. Agents cannot reason about side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Start or resume a WordPress to AI-website migration
Get current migration status
Launch the onboarding wizard web UI
Minimal error handling. Only 'Session not found' visible. No recovery guidance (e.g., 'Try unpress_start first'). No categorization of errors as retryable vs fatal.
Parameter descriptions lack context. 'Migration session ID' does not explain how to obtain it (from unpress_start response). 'Decision identifier' and 'User's choice' are vague. No enum constraints for decision_id or choice in unpress_decide.