A multi-agent recruiting platform that searches job boards, ranks positions, tailors resumes and cover letters, and manages applications through human-approved submission workflows. Composed of three MCP servers (job-boards, ATS, browser) orchestrated by a DeepAgents-based LangGraph application.
Server has 7 tools with basic descriptions and some schema visibility, but significant gaps undermine quality. Tool names follow verb_noun convention (extract_, check_, get_, list_, submit_, search_) which is good. However, parameter descriptions are sparse or missing entirely. Input schemas are partially visible but incomplete, many lack type constraints, enums, or validation guidance. Output schemas are undocumented. Error handling is minimal; most tools return generic dicts without recovery guidance. The two IRREVERSIBLE tools (submit_to_ats, submit_application) lack confirmation patterns or dry-run support. Overall, this reads as a prototype rather than production-grade tooling.
Flag any claim in the tailored resume NOT supported by the source resume (anti-fabrication).
Extract a structured candidate profile (skills, experience, seniority) from resume text.
Fetch a single posting's details from an ATS provider.
Return the form fields an application to this posting requires.
Search LinkedIn for job postings matching a query and location. Returns up to `limit` (hard-capped at 15) normalized postings: job_id, title, company, location, description (truncated), url. Descriptions are truncated to keep the agent's token usage under control.
Fill and submit an application form. Only called AFTER human approval upstream.
IRREVERSIBLE tools (submit_to_ats, submit_application) lack confirmation/dry-run patterns. No mechanism to preview or cancel before execution. Agents can submit applications without human approval despite docstring claims.
Parameter descriptions are missing or trivial. 'application' in submit_to_ats is described as 'The application data to submit', no schema of what fields are required. 'form' in submit_application is 'A mapping of CSS selectors to form values', no guidance on selector format or value types.
Output schemas are undocumented. Tools return dicts but LLMs cannot infer field names, types, or structure. E.g., extract_profile returns {'skills': [], 'years_experience': 0.0, 'seniority': 'senior'}, this structure is not declared in the tool definition.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Submit an application to an ATS. Only called AFTER human approval upstream.
Enum constraints missing for provider parameter. get_posting and list_application_fields accept 'provider' as free-form string with runtime validation ('greenhouse', 'lever', 'workday'). Should declare as enum in schema to prevent hallucinated values.
Error handling is generic and non-actionable. submit_to_ats returns {'status': 'error', 'reason': '...'} with no guidance on retry, user action, or recovery. LLMs cannot distinguish retryable from fatal errors.