MCP server that identifies gaps in resumes compared to job descriptions using OpenAI
The server has 2 tools with moderate quality. analyze_resume_gaps has a strong description (194 chars, well-structured) and detailed input schema (2 params, both with descriptions). However, the output schema relies on a Pydantic model (GapAnalysisResult) defined in prompts.py that is not fully visible in the provided code snippet, the schema structure cannot be fully verified. get_sample_resume is weaker: it's defined as a resource (not a tool), has a terse description (28 chars), and accepts only 1 parameter with minimal context. Both tools lack error guidance that tells LLMs what to do on failure (e.g., 'If the file format is unsupported, try converting to .docx first'). Parameter validation exists (file existence, format checks) but error messages are generic. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. The naming convention is good (analyze_resume_gaps, get_sample_resume both start with action verbs), but the composition could be clearer, analyze_resume_gaps performs extraction, comparison, and recommendation in one call, which is acceptable for a complex domain operation but could benefit from clearer intermediate step guidance.
Analyze a resume against a job description to identify gaps and improvements. This tool: - Extracts text from DOCX resume files - Compares resume content against job requirements - Identifies missing skills, keywords, and experience gaps - Provides prioritized, actionable recommendations - Optimizes for both ATS and human readability
Get the content of a sample resume.
Output schema (GapAnalysisResult) not fully visible; cannot verify field structure, types, or completeness. The Pydantic model is imported from prompts.py but the full class definition is truncated in the provided source.
Error handling provides no recovery guidance. Exceptions like 'Failed to analyze resume' or 'Sample resume not found' do not tell LLMs what to try next (e.g., 'Try a different format', 'Check available samples with...').
get_sample_resume description is 28 characters ('Get the content of a sample resume.'), below the 34 char p10 baseline and lacking context on when/why to use it or how it integrates with analyze_resume_gaps.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). analyze_resume_gaps and get_sample_resume are both read-only operations and should declare readOnlyHint=true to inform LLM schedulers and safety checks.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
Parameter 'name' in get_sample_resume lacks guidance on how to discover valid values. No mention of what 'sample resumes' are available or how to list them.
API key (OPENAI_API_KEY) is loaded from environment via dotenv but there is no documentation or schema declaration of required permissions/scopes (e.g., 'gpt-4o-mini access required'). Servers calling external APIs should declare their scope requirements.