Config-driven local-first daily job aggregator with MCP server for job management, AI review, and application tracking.
Pupila has 17 well-named tools with consistent verb_noun patterns (list_, get_, mark_, update_, clear_, enqueue_, cancel_, skip_, trigger_, regenerate_). All tools have descriptions (10 - 200 chars, within baseline 194 avg). Input schemas are present and properly typed with enums for status fields. However, parameter descriptions are sparse or missing entirely, most tools lack descriptions for their inputs. Output schemas are not documented in the source. Error handling is minimal; no recovery guidance or actionable error messages visible. Composition is sound (single responsibility per tool), but missing pagination/limit parameters on list tools and no documented output structure.
Cancel a pending or running AI Apply job
Remove an applied entry by URL
Add a job to the AI Apply queue for automated application generation
Retrieve the AI review for a specific job
Retrieve the candidate brief (profile summary) used for job matching and AI review
Get the status of an ongoing or completed fetch operation
Retrieve full details for a specific job including complete job description body
List all AI reviews for jobs
Parameter descriptions missing or minimal. Tools like list_jobs, queue_status, worker_status, run_summary, trigger_fetch, get_fetch_status, regenerate_profile have empty required arrays but no explanation of what they do or when to call them. LLMs cannot infer intent from names alone.
Output schemas not documented. No visible return type definitions for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., jobId for chaining). Baseline: 100% of A+ tools document return types.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
List all aggregated jobs with filtering and pagination support
Mark a job as applied with status, date, and optional notes
Get the current status of the AI Apply queue
Regenerate the scoring profile from the candidate brief
Get a summary of the latest aggregation run including fetch statistics and categorization
Skip a job in the apply queue without applying
Trigger a new job aggregation run across all configured sources
Update the status of an existing applied entry
Get the status of the apply-worker process
List tools lack pagination. list_jobs and list_ai_reviews have no limit, offset, or page parameters. Returning unbounded results risks context window exhaustion. Baseline: tools returning lists should accept page/offset and limit.
No error handling guidance. Tools have no documented error cases, recovery paths, or actionable error messages. An LLM calling mark_applied with an invalid URL gets no guidance on what to do next.
Destructive tools lack confirmation. clear_applied and cancel_apply are reversible/destructive but have no dry-run or confirmation step. Agents can accidentally delete applied entries without safeguards.