Skip to main content
Glama

Interview Prep AI — MCP Agent

An end-to-end interview coach that uses a real Model Context Protocol (MCP) server to ground an OpenAI agent in a candidate's resume and a target job description.

The project demonstrates MCP tool discovery, OpenAI Responses API tool calling, multi-step agent orchestration, document ingestion, deterministic evaluation logic, and a polished Streamlit UI.

What it does

  • Upload a resume (PDF, DOCX, TXT, or MD)

  • Upload or paste a job description

  • Analyze matched skills and priority gaps

  • Generate role-specific technical, behavioral, and system-design questions

  • Evaluate answers with a STAR, relevance, specificity, and quantified-impact rubric

  • Inspect every MCP call in an in-app activity trace

Related MCP server: shivonai-mcp

Architecture

flowchart LR
    U[Candidate] --> UI[Streamlit UI]
    UI --> A[OpenAI Responses agent]
    A <-->|tool schemas and calls| C[MCP client]
    C <-->|stdio| S[FastMCP server]
    S --> R[(Resume)]
    S --> J[(Job description)]
    S --> G[Gap analysis]
    S --> Q[Question generator]
    S --> E[Answer evaluator]

This is intentionally a genuine client/server MCP design. The LLM discovers JSON schemas from the MCP server, decides which tools to call, and receives each result through the Responses API function-calling loop.

MCP tools

Tool

Purpose

get_resume()

Reads the uploaded resume

get_job_description()

Reads the target job description

analyze_skill_gaps()

Compares resume evidence with JD requirements

generate_interview_questions()

Produces targeted practice questions

evaluate_answer()

Scores an answer and returns a coaching rubric

Run locally

Prerequisites: Python 3.11+ and an OpenAI API key.

git clone https://github.com/YOUR_USERNAME/interview-prep-mcp.git
cd interview-prep-mcp
python -m venv .venv
source .venv/bin/activate       # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
cp .env.example .env
# Add your OPENAI_API_KEY to .env
streamlit run app.py

The default is gpt-5.4-mini, chosen as a cost-conscious tool-calling model. Set OPENAI_MODEL in .env to use a different compatible model.

Test the MCP server

Run the unit tests without an API key:

pytest
ruff check .

Start the MCP server directly over stdio:

interview-prep-server

Privacy

Uploaded resume and JD text are stored only in .interview_prep/ on the local machine. That directory and .env are Git-ignored. Document text is sent to OpenAI only when the agent calls the relevant MCP tool during a workflow.

Design choices

  • Auditable orchestration: the UI displays the exact MCP tools used for each answer.

  • Testable core: skill comparison and answer scoring are deterministic; the LLM interprets and coaches rather than hiding all logic in a prompt.

  • No invented experience: the system prompt requires resume evidence before claims about the candidate.

  • Bounded agent loop: tool execution stops after eight rounds to prevent runaway calls.

Resume bullets

  • Built an MCP-based Interview Preparation Agent using Python and OpenAI's Responses API, enabling an LLM to dynamically access resumes, job descriptions, and evaluation tools for personalized interview workflows.

  • Implemented agentic tool-calling workflows for skill-gap analysis, targeted question generation, and rubric-based answer evaluation, with an auditable MCP activity trace.

Roadmap

  • Persist separate interview sessions in SQLite

  • Add voice answers and transcription

  • Export a preparation report as PDF

  • Add eval datasets for question quality and scoring consistency

  • Deploy the MCP server with authenticated Streamable HTTP transport

References

License

MIT

Available Tools

5 tools
analyze_skill_gapsB

Compare the uploaded resume and job description and return evidence-based skill coverage.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It fails to mention prerequisites (e.g., resume/job description being available), side effects, or the nature of the 'evidence-based' output. The tool is likely read-only, but this is not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence that immediately conveys the tool's purpose. Every word is necessary, and there is no wasted space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists, the description omits important context: how the resume and job description are 'uploaded' (likely via sibling tools), what constitutes 'evidence-based' coverage, and whether any preconditions must be met. This brevity leaves gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so schema coverage is 100% by default. No parameter details are needed, matching the baseline score of 4 for no-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: comparing an uploaded resume and job description to return skill coverage. The verb 'compare' and noun phrase 'evidence-based skill coverage' are specific, and the tool is distinct from siblings like 'get_resume' or 'evaluate_answer'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool or how it relates to siblings. For instance, it doesn't specify that the resume and job description must be uploaded first via other tools, nor does it indicate when this tool is appropriate versus 'evaluate_answer' or 'generate_interview_questions'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evaluate_answerB

Score an interview answer against relevance, STAR structure, specificity, and impact.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionYes
answerYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but only states the scoring criteria. It does not disclose whether the tool returns a numeric score, feedback text, or requires specific input formatting. The behavior beyond basic purpose is opaque.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no unnecessary words. It efficiently communicates the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description need not explain return values. However, it lacks usage guidelines and behavioral details that would make it complete for an agent. The simplicity of the tool (two string params) partially compensates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter names (question, answer) are self-explanatory, but the description adds no additional meaning about expected format, length, or language. Schema coverage is 0%, so description could have compensated but did not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: scoring an interview answer against specific criteria (relevance, STAR structure, specificity, impact). It distinguishes from siblings like analyze_skill_gaps and generate_interview_questions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. It does not mention prerequisites, context, or situations where this tool is appropriate or inappropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_interview_questionsB

Generate 1–10 personalized technical, behavioral, and design interview questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
focus_areasYes
question_countNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so description fully bears responsibility. It only states that it generates questions but does not disclose side effects, persistence, rate limits, or how personalization is implemented. Minimal behavioral information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no wasted words but also lacks necessary detail. Could be more structured and informative without being bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given moderate complexity (2 params) and no annotations, the description is insufficient. It does not address usage context, prerequisites, or behavior beyond basic generation. Output schema existence reduces need for return explanation, but still incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description adds meaning by specifying types (technical, behavioral, design) and count range (1-10). However, it does not explain what focus_areas are or how they influence output. Adds some value but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'generate' and the resource 'interview questions', specifying types (technical, behavioral, design) and range (1-10). It clearly differentiates from sibling tools like 'evaluate_answer' or 'get_job_description'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Does not mention prerequisites, context, or when not to use. Sibling tools provide context but description itself lacks any usage instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_descriptionA

Read the target job description. Call before analyzing fit or generating questions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description 'Read' indicates a read-only operation with no side effects. Although no annotations exist, the simple nature and output schema compensate for the lack of additional behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no wasted words, front-loaded with the verb. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters and an output schema, the description is sufficient. It also provides usage guidance, making it complete for a simple retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the baseline is 4. The description does not need to add parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Read the target job description' with a specific verb and resource. Differentiates from siblings like get_resume and analyze_skill_gaps by focusing on the job description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs 'Call before analyzing fit or generating questions', providing a clear usage context and ordering relative to other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_resumeA

Read the candidate's uploaded resume. Call before personalizing advice.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It correctly implies read-only behavior via 'Read'. For a zero-parameter tool, this is adequate; additional details like return format are covered by the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one sentence stating the action, followed by a clear instruction. Every word earns its place, with no unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, output schema exists to describe returns), the description covers all necessary context: what it does and when to call it. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so schema coverage is trivially 100%. The description is not required to add parameter meaning, so a baseline of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Read' and clearly identifies the resource as 'the candidate's uploaded resume'. It distinguishes itself from sibling tools (analyze_skill_gaps, evaluate_answer, etc.) which are about analysis and generation, not simple retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises 'Call before personalizing advice', providing a clear use case context. While it doesn't state when not to use it, the instruction implies proper sequencing, and sibling alternatives are obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv1.0.0
    • First observedanalyze_skill_gaps
    • First observedevaluate_answer
    • First observedgenerate_interview_questions
    • First observedget_job_description
    • First observedget_resume

TDQS

A3.9/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: data retrieval (get_resume, get_job_description), comparison (analyze_skill_gaps), question generation (generate_interview_questions), and answer evaluation (evaluate_answer). There is no overlap between tool responsibilities.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., analyze_skill_gaps, get_resume). No mixing of conventions or vague verbs.

Tool Count5/5

With 5 tools covering data ingestion, analysis, generation, and evaluation, the count is well-scoped for an interview preparation assistant. Each tool earns its place without redundancy.

Completeness4/5

The tool set covers the core workflow: retrieve inputs, analyze gaps, generate questions, and evaluate answers. A minor gap is that there is no tool to generate specific improvement suggestions based on answer scores, but the existing evaluate_answer provides scoring that indirectly supports feedback.

Maintenance

ActivityStale
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NUPUR0307/interview-prep-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server