Skip to main content
Glama

Interview Coach MCP

An MCP-enabled AI Interview Coach that combines structured interview history, semantic memory, and Retrieval-Augmented Generation (RAG) to help analyze a user's LeetCode preparation, identify recurring weaknesses, and provide personalized insights.

The project demonstrates how Model Context Protocol (MCP) can connect an LLM such as Claude to application-owned tools, databases, and semantic memory.


Overview

While solving LeetCode problems, the final answer is only part of the learning process.

Important information is often hidden in the experience of solving the problem:

  • What approach did I initially take?

  • What mistake did I make?

  • What concept did I fail to recognize?

  • What insight did I gain?

  • How confident was I?

  • Have I made a similar mistake before?

  • Is the same weakness appearing across multiple problems?

This project stores those experiences and gives an LLM access to them through MCP.

The system combines:

MCP + SQL Database + Semantic Memory + RAG + LLM Agent

to create a personalized interview-preparation assistant.


Related MCP server: myBrAIn

Problem Being Solved

Suppose a user has the following experiences:

Problem A: "I couldn't recognize Binary Search on the Answer."

Problem B: "I recognized binary search but couldn't formulate the feasibility check."

Problem C: "I needed a hint to identify the monotonic relationship."

These are different problems and different descriptions, but they may indicate the same underlying weakness.

A traditional database can answer:

"What problems did I solve?"

But semantic retrieval can answer:

"Have I previously struggled with recognizing monotonic relationships?"

This distinction is the motivation behind the semantic-memory component of the project.


Architecture

                     USER
                       │
                       ▼
                CLAUDE / LLM
                       │
                       │ MCP
                       ▼
          ┌─────────────────────────┐
          │   Interview Coach MCP   │
          │         Server          │
          └────────────┬────────────┘
                       │
          ┌────────────┴────────────┐
          │                         │
          ▼                         ▼
  Structured Memory          Semantic Memory
          │                         │
          ▼                         ▼
       SQLite              Qwen Embeddings
          │                         │
          │                         ▼
          │                      ChromaDB
          │                         │
          └────────────┬────────────┘
                       ▼
                Retrieved Context
                       │
                       ▼
                Claude Reasoning
                       │
                       ▼
             Personalized Analysis

The architecture deliberately separates structured memory from semantic memory.


Technology Stack

Component

Technology

LLM / Agent

Claude

Agent Interface

Model Context Protocol (MCP)

MCP Framework

FastMCP

Language

Python

Relational Database

SQLite

ORM

SQLAlchemy

Embedding Model

Qwen/Qwen3-Embedding-0.6B

Vector Database

ChromaDB

Package Management

uv

Version Control

Git / GitHub


MCP Tools

The MCP server exposes the following capabilities to the LLM.

add_problem()

Adds a new LeetCode problem to the relational database.

It also prevents duplicate problem records.

log_attempt()

Logs an interview attempt containing:

  • solved status

  • time taken

  • confidence

  • initial approach

  • mistake

  • insight

  • final notes

New attempts are automatically indexed into semantic memory.

get_recent_attempts()

Retrieves the user's recent interview attempts.

get_attempt_history()

Retrieves the historical attempts associated with a problem.

get_topic_history()

Retrieves attempts associated with a particular topic.

get_weak_areas()

Analyzes structured attempt data to identify areas where the user is struggling.

search_interview_memory()

Performs semantic retrieval over previous interview experiences using vector similarity.


Structured Memory

The relational database is built using SQLite and SQLAlchemy.

The core data model is:

Problem │ │ 1:N ▼ Attempt │ │ 1:N ▼ Note

Problem

Stores information about a LeetCode problem:

id leetcode_id title difficulty topic

Attempt

Stores information about an attempt:

id problem_id solved time_taken confidence attempted_at

Note

Stores the qualitative experience:

id attempt_id initial_approach mistake insight final_notes

SQLite is responsible for questions requiring structured and deterministic querying.

For example:

"Show my last 10 attempts."

"What was my confidence on this problem?"

"Show my history with Dynamic Programming."


Semantic Memory & RAG

Structured queries alone cannot capture semantic relationships between different experiences.

Therefore, each attempt is transformed into a memory document.

For example:

Problem: Smallest Sufficient Team Leetcode ID: 1125 Difficulty: Hard

Solved: True Confidence: 6/10

Initial Approach: Recognized the bitmask pattern quickly but initially framed the problem as BFS instead of bitmask DP.

Mistake: Struggled to reframe the problem from BFS/search into DP.

Insight: Need more practice converting bitmask states into DP transitions and reconstructing the solution.

This document is embedded using:

Qwen/Qwen3-Embedding-0.6B

and stored in ChromaDB.


Semantic Retrieval Flow

When the user asks a semantic question:

User Query │ ▼ Qwen Embedding Model │ ▼ Query Vector │ ▼ ChromaDB │ ▼ Top-k Similar Memories │ ▼ MCP Tool Result │ ▼ Claude │ ▼ Reasoning + Synthesis │ ▼ Personalized Response

For example, instead of asking:

"What were my weaknesses in Smallest Sufficient Team?"

the user can ask:

"Have I previously struggled with reconstructing the actual solution after finding the optimal value?"

The system can retrieve the relevant experience even though the problem name was never mentioned.

This is the key semantic-retrieval capability of the project.


Automatic Memory Indexing

New attempts are automatically added to semantic memory.

The flow is:

log_attempt() │ ▼ Create Attempt │ ▼ Create Note │ ▼ Commit to SQLite │ ▼ index_attempt() │ ▼ build_memory_document() │ ▼ Qwen Embedding │ ▼ ChromaDB

This means the user does not need to manually synchronize the relational database and vector database.

Existing records can also be indexed using the indexing utility created during development.


Agentic Tool Orchestration

One of the main demonstrations of MCP is that Claude can combine multiple tools to answer a higher-level question.

For example:

"Analyze my recent interview performance."

Claude can determine that it needs multiple sources of information:

get_recent_attempts() ↓ get_weak_areas() ↓ search_interview_memory() ↓ get_attempt_history() ↓ Claude synthesizes the results

The important point is that the MCP server does not manually implement one giant function such as:

analyze_everything()

Instead, it exposes smaller capabilities and allows the LLM agent to decide which capabilities are required.


Why MCP?

Without MCP, the application could simply be implemented as a Python program directly connected to SQLite, ChromaDB, and an LLM API.

The purpose of MCP is to create a standardized interface between the LLM and application capabilities.

The LLM does not need to know:

  • how SQLAlchemy works,

  • where the database is located,

  • how ChromaDB performs similarity search,

  • how embeddings are generated.

It only interacts with capabilities such as:

get_recent_attempts() get_weak_areas() search_interview_memory() log_attempt()

Conceptually:

LLM │ │ MCP ▼ Tools / Capabilities │ ▼ Application Logic │ ├── SQLite └── ChromaDB

This separation makes the application capabilities accessible to an MCP-compatible client without coupling the client to the internal implementation.


Why Not Just Use Claude/ChatGPT Memory?

A natural question is:

"Claude and ChatGPT already have memory. Why build another memory system?"

The key distinction is application-owned, domain-specific memory vs. conversational memory.

This project explicitly owns and controls the memory layer.

1. Structured application data

The system stores interview-specific fields such as:

Problem Attempt Confidence Time Taken Mistake Insight Topic Difficulty

This allows deterministic database queries and analysis.

2. Semantic retrieval

The project explicitly embeds interview experiences and stores them in ChromaDB.

This allows queries based on meaning rather than exact wording.

3. Retrieval control

The application controls:

  • what gets stored,

  • how memories are constructed,

  • which embedding model is used,

  • how many results are retrieved,

  • how similarity search is performed,

  • what context is returned to the LLM.

4. Application ownership

The memory belongs to the application rather than being an implicit feature of a particular chat interface.

The underlying memory system can therefore evolve independently of the LLM client.

5. Domain-specific design

The memory schema is specifically designed around interview preparation.

The system is not simply remembering that a conversation happened; it is explicitly modeling:

problem → attempt → mistake → insight → confidence

Interview Summary

If asked:

"Why not just use Claude's memory?"

A concise answer is:

"Claude's conversational memory and my application's semantic memory solve different problems. I wanted application-owned, domain-specific memory where I control the schema, persistence, embedding model and retrieval strategy. SQLite handles structured interview history, while ChromaDB provides semantic retrieval over qualitative experiences. MCP then exposes these capabilities to the LLM in a standardized way."


Why SQLite + ChromaDB?

The two databases serve different purposes.

SQLite

Best for:

  • structured records

  • relationships

  • filtering

  • aggregation

  • deterministic queries

ChromaDB

Best for:

  • embeddings

  • semantic similarity

  • natural-language retrieval

  • conceptually related experiences

Therefore:

SQLite "What happened?"

ChromaDB "What is semantically similar?"

Using both provides a hybrid memory architecture.


Why Qwen Embeddings?

The project uses:

Qwen/Qwen3-Embedding-0.6B

because the primary retrieval task is semantic matching between natural-language descriptions of interview experiences.

The embedding model converts both memories and user queries into vector representations so that semantically related experiences can be retrieved even when they use different wording.

The model can also be run locally, which fits the current local-first architecture.


Example

Suppose the user logs:

I solved Smallest Sufficient Team. I recognized the bitmask pattern quickly but struggled to formulate it as DP. I also figured out the minimum team size but couldn't reconstruct the actual selected people. Confidence 6/10.

The system performs:

` log_attempt() ↓ SQLite ↓ index_attempt() ↓ Qwen Embedding ↓ ChromaDB

Later, the user asks:

"Have I previously struggled with reconstructing an actual solution after determining the optimal value?"

Claude calls:

search_interview_memory()

ChromaDB retrieves the semantically related memory.

Claude then uses that retrieved context to produce a personalized response.


Project Structure

interview_coach_mcp/
│
├── src/
│   ├── server.py
│   ├── database.py
│   ├── models.py
│   ├── memory.py
│   └── ...
│
├── prompts/
│   └── instructions_to_mcp.py
│
├── tests/
│   └── ...
│
├── chroma_data/
│
├── .env
├── pyproject.toml
├── uv.lock
└── README.md

chroma_data/, .env, virtual environments, caches and other generated/local files should not be committed to GitHub.


Running the Project

Install dependencies using uv and activate the project environment.

Run the MCP server using:

uv run python src/server.py

The MCP server can then be connected to an MCP-compatible client such as Claude.


Production Considerations

The current implementation is designed primarily as a local learning project.

A production deployment could evolve toward:

                Cloud Deployment
                       │
             ┌─────────┴─────────┐
             │                   │
         PostgreSQL            Qdrant
             │                   │
             └─────────┬─────────┘
                       │
                   MCP Server
                       │
                Authentication
                       │
                     LLM

Potential improvements include:

  • PostgreSQL instead of SQLite

  • Qdrant or another production vector database

  • Docker containerization

  • AWS deployment

  • authentication and authorization

  • asynchronous embedding/indexing

  • background workers

  • retrieval filtering

  • reranking

  • RAG evaluation

  • observability

  • automated testing


Future Improvements

Potential future extensions include:

Hybrid Retrieval

Combine structured filtering with semantic retrieval.

For example:

"Find semantically similar Dynamic Programming experiences from the last three months."

Reranking

Retrieve a larger candidate set and rerank the results before sending them to the LLM.

RAG Evaluation

Measure:

  • retrieval relevance

  • retrieval recall

  • answer relevance

  • answer faithfulness

Learning Progress Tracking

Track whether identified weaknesses improve over time.

For example:

Binary Search on Answer

August     → Confidence: 3/10
September  → Confidence: 6/10
October    → Confidence: 8/10

This could eventually turn the system from an interview-memory assistant into a longer-term learning analytics system.


Key Concepts Demonstrated

This project provides hands-on experience with:

Model Context Protocol

  • MCP server development

  • FastMCP

  • MCP tools

  • tool discovery

  • multi-tool orchestration

  • LLM-driven tool selection

RAG

  • document construction

  • embeddings

  • vector databases

  • semantic search

  • top-k retrieval

  • retrieved context

  • LLM synthesis

Databases

  • SQLite

  • SQLAlchemy

  • relational modeling

  • one-to-many relationships

  • persistent application state

AI Engineering

  • LLM tool use

  • agentic workflows

  • structured memory

  • semantic memory

  • application-owned memory

  • semantic retrieval

  • RAG pipelines


Project Status

Completed

  • MCP server

  • FastMCP tools

  • SQLAlchemy data model

  • SQLite persistence

  • Problem management

  • Attempt logging

  • Attempt history

  • Recent attempts

  • Topic history

  • Weak-area analysis

  • Agentic multi-tool orchestration

  • MCP instructions

  • Semantic memory

  • Qwen embeddings

  • ChromaDB

  • Semantic retrieval

  • RAG integration

  • Automatic memory indexing

  • Claude integration

Future

  • Dockerization

  • AWS deployment

  • PostgreSQL

  • Production vector database

  • Async indexing

  • Reranking

  • RAG evaluation

  • Observability


Core Idea

The project can ultimately be summarized as:

MCP
  +
Structured Memory
  +
Semantic Memory
  +
RAG
  +
LLM Agent
  =
Personalized Interview Coach

MCP provides the interface to the application's capabilities.

SQLite stores structured interview history.

Qwen embeddings + ChromaDB provide semantic memory.

RAG retrieves relevant past experiences.

Claude reasons over the retrieved context and produces personalized interview insights.

Available Tools

10 tools
add_problemC

Add a new leetcode problem inn the Interview Coach Database

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
topicNo
difficultyYes
leetcode_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It reveals only that a record is created; it says nothing about uniqueness of leetcode_id, duplicate handling, required permissions, or whether an existing entry is overwritten.

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?

A single short sentence that is front-loaded and wastes no space, but it contains a typo ('inn') and is too thin to be considered well-structured for a 4-parameter mutation tool.

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?

An output schema exists so return values needn't be explained, but for a write operation with no annotations and zero parameter documentation, the definition leaves out the behavioral and input details an agent needs to call it correctly.

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

Parameters1/5

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

Schema description coverage is 0% across 4 parameters, and the description adds no meaning for leetcode_id, title, difficulty, or topic (e.g., allowed difficulty values, whether topic is free text). With a low-coverage schema the description must compensate, and it does not.

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

Purpose4/5

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

States a specific verb ('Add') and resource ('leetcode problem') into a named database, so the agent knows the operation. It does not distinguish itself from siblings like search_problem or log_attempt, but the create-vs-query distinction is implicit.

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 indication of when to use this tool versus alternatives such as search_problem, nor any prerequisite (e.g., check for duplicates first). Usage must be inferred entirely from the name.

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

get_attempt_historyC

This tool will retrieve complete attempt history for a Leetcode Problem

ParametersJSON Schema
NameRequiredDescriptionDefault
leetcode_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations provided, so the description carries the full burden. It only says 'retrieve complete attempt history' — no mention of permissions, pagination, ordering, or what 'complete' means. Minimal behavioral disclosure.

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

Conciseness4/5

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

One efficient sentence that front-loads the verb and resource. No waste, though it could be slightly more informative without being verbose.

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?

An output schema exists, so return values needn't be explained. However, with no annotations and no usage differentiation from siblings, the description is incomplete for an agent to know when to select this tool over alternatives.

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 description coverage is 0% for the single leetcode_id parameter, but the parameter is intuitive (an integer identifying the problem) and the description implies its role. Baseline for 1 parameter without schema docs is moderate; description doesn't add format constraints but the parameter is self-evident.

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

Purpose4/5

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

States a specific verb (retrieve) and resource (complete attempt history for a Leetcode Problem). Clear enough that an agent knows what it does, though it doesn't distinguish itself from the sibling get_recent_attempts.

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 get_recent_attempts or other attempt-history siblings. The description implies full history vs. recent, but doesn't make that distinction explicit.

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

get_problem_statsC

Return the aggregated performance statistics for a Leetcode Problem This becomes useful because LLM doesn't need to recieve and manually calculate everything every time

ParametersJSON Schema
NameRequiredDescriptionDefault
leetcode_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It hints that results are pre-aggregated (saving the agent computation), which is a genuine behavioral trait, but says nothing about scope (all attempts vs recent), permissions, cost, or freshness of the aggregation.

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?

The first sentence is front-loaded and efficient. The second sentence is a soft justification rather than actionable content, and its value is marginal, making the description mildly padded.

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?

An output schema exists, so return values need not be explained. For a one-parameter read tool this is close to adequate, but the aggregation scope (which attempts, what time window) remains ambiguous, which is the main thing an agent needs to call it correctly.

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

Parameters2/5

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

The single parameter leetcode_id has 0% schema description coverage, so the description must compensate and largely does not. Only the phrase 'for a Leetcode Problem' weakly implies that the id identifies a problem; no format, validity, or lookup behavior is described.

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

Purpose4/5

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

States a specific verb and resource: 'Return the aggregated performance statistics for a Leetcode Problem'. This is clearly distinguishable from raw-log siblings like get_attempt_history or log_attempt. It does not, however, name any sibling explicitly, so the differentiation is left to inference.

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?

There is no when-to-use guidance: nothing says when aggregated stats are preferable to get_attempt_history or get_weak_areas. The second sentence offers a rationale ('LLM doesn't need to recieve and manually calculate everything') rather than a selection condition, and contains no exclusions or prerequisites.

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

get_recent_attemptsC

This tool will retrieve the user's most recent LeetCode attempts

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the entire behavioral burden. It does not say how 'recent' is bounded, whether results are capped, whether authentication is required, or how the limit interacts with the default of 5.

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

Conciseness4/5

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

A single compact sentence with no filler and the resource front-loaded. It is efficient, though its brevity is partly under-specification rather than disciplined conciseness.

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?

An output schema exists, so return values need not be explained, and this is a simple one-parameter read. However the limit semantics and the meaning of 'recent' are left entirely unstated, which is a real gap for an agent choosing a value.

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

Parameters2/5

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

One parameter (limit) with 0% schema description coverage, and the description never mentions it. The phrase 'most recent' hints at bounded recency but gives no syntax, range, or default behavior, so the schema's own default=5 is the only guidance available.

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

Purpose4/5

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

States a specific verb ('retrieve') and resource ('the user's most recent LeetCode attempts'), so the agent knows exactly what comes back. It does not explicitly distinguish itself from the close sibling get_attempt_history, which weakens it slightly against the 5 bar.

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 indication of when to prefer this over get_attempt_history or search_interview_memory, no prerequisites, and no exclusions. The agent must guess the boundary between 'recent' and full history.

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

get_topic_historyC

Retrieve the user's Leetcode attempts for problems belonging to a specific topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It does not state whether results are paginated, sorted, time-bounded, or whether a missing topic errors or returns empty. For a read tool with a single required param this is thin.

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

Conciseness4/5

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

One clean sentence, front-loaded with the verb and resource. No waste, though it is arguably too short for a tool whose parameter semantics are opaque.

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?

Output schema exists, so return values needn't be explained, but with zero annotation coverage and 0% parameter description coverage the definition is missing the context needed to call it correctly among topic-similar siblings.

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

Parameters2/5

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

Schema description coverage is 0% and the description says only 'a specific topic'. Four siblings all deal with topics or attempts, and the description gives no syntax, allowed values, or matching semantics (exact vs substring, known topic list) beyond the bare parameter name.

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

Purpose4/5

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

Clear verb+resource: retrieves the user's attempts filtered by topic. It is distinguishable from get_attempt_history and get_recent_attempts at a high level, though the description doesn't explicitly contrast with those siblings.

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 when-to-use guidance, no prerequisites, and no indication of how this differs from get_attempt_history, get_recent_attempts, or get_problem_stats. The agent must infer the use case.

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

get_weak_areasA

Analyze the user's attempt history and identify DSA topics where the user appears to be struggling and assign a weakness score to it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses that the tool derives a 'weakness score' from attempt history, which is real behavioral context beyond the schema. It does not state that the operation is read-only, whether scoring is deterministic or recency-weighted, or what happens with an empty attempt history.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the analytical intent arrives immediately. Slightly loose phrasing ('assign a weakness score to it') costs a little precision but nothing is wasted.

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

Completeness4/5

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

For a parameterless read with an output schema, the description supplies the essential framing: inputs come from attempt history and the output is per-topic weakness scores. Missing is any hint about scoring scale or how many topics are surfaced, but the return structure is covered by the output schema.

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 tool takes zero parameters, so there is nothing for the description to clarify; the baseline of 4 applies. No parameter-level gaps exist.

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

Purpose4/5

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

States a specific verb and derived output: 'Analyze the user's attempt history' and 'identify DSA topics where the user appears to be struggling and assign a weakness score.' This is a concrete analytical product rather than a restatement of the name. It does not, however, explicitly contrast itself with siblings like get_attempt_history or get_topic_history that also operate on attempt data.

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

Usage Guidelines3/5

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

Usage is implied by the framing ('analyze the user's attempt history') but there is no explicit when-to-use, no prerequisites (e.g. requires logged attempts), and no named alternative such as get_attempt_history for raw data versus this diagnostic view. The agent can infer the intent but gets no routing guidance.

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

helloC

Say hello from the Interview Coach.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It does not state side effects, return format, or whether this is a read-only operation, leaving the agent with almost no behavioral context beyond the vague phrase 'say hello'.

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, front-loaded sentence with no wasted words, appropriately sized for a trivial tool.

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 zero parameters and the presence of an output schema, the description only needs to convey purpose. It does so minimally, but the utility of the tool remains ambiguous (e.g., is it a test endpoint or a greeting?), leaving a gap for the 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 tool has zero parameters, so the baseline score is 4. The description does not need to explain parameters, and the schema is fully covered.

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

Purpose2/5

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

The description 'Say hello from the Interview Coach' essentially restates the tool name 'hello' without specifying what the tool actually does, such as returning a greeting string or performing a health check. It does not distinguish this tool from any sibling tool.

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?

There is no indication of when to use this tool versus the many siblings listed, nor any exclusions or prerequisites. The description provides no contextual guidance for selection.

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

log_attemptC

This tool LOG'S A USER'S ATTEMPT AT A LEETCODE PROBLEM.

ParametersJSON Schema
NameRequiredDescriptionDefault
solvedYes
insightNo
mistakeNo
confidenceNo
time_takenNo
final_notesNo
leetcode_idYes
initial_approachNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.4/5.0
Behavior2/5

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

With no annotations provided, the description carries the full behavioral burden, yet it only implies a write action. It never states whether logging is idempotent, whether an existing attempt is overwritten, what permissions are needed, or what happens to unset optional fields.

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?

It is a single front-loaded sentence with no wasted clauses, which is appropriate in size. But the all-caps styling and the stray apostrophe in "LOG'S" hurt readability and professionalism without adding emphasis value.

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?

For an 8-parameter mutation tool with no annotations, the description is far too thin; the agent is given none of the field semantics or write-behavior context. The existence of an output schema reduces the need to explain return values, but that is the only mitigating factor.

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

Parameters1/5

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

There are 8 parameters with 0% schema description coverage, and the description adds no meaning for any of them—not leetcode_id, solved, confidence, time_taken, or the free-text fields. It neither clarifies types/ranges nor explains which fields matter for which outcome.

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

Purpose4/5

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

The description names a specific verb (logs) and resource (a user's attempt at a LeetCode problem), which is clearer than a mere restatement of the name. However, it does nothing to distinguish itself from read-oriented siblings such as get_attempt_history or get_recent_attempts, so it stops short of a 5.

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?

There is no when-to-use guidance, no prerequisites, and no mention of alternative tools for viewing past attempts. The agent must infer entirely from the name that this is the write path while its siblings are the read paths.

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

search_interview_memoryC

Search the user's previous interview experiences using semantic similarity.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose a meaningful behavioral trait — retrieval is semantic rather than keyword-based — but says nothing about whose data is searched, permissions, result scope, or how many items are returned by default.

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

Conciseness4/5

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

A single front-loaded sentence with no filler. It is efficient, though the brevity is partly under-specification rather than true density.

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?

An output schema exists, so return values need not be explained, but with zero annotation coverage and 0% parameter description coverage the definition leaves key gaps: query format, top_k meaning, and whether results are the user's own history or aggregated. Not complete enough for confident invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate and does not. It never explains what form the 'query' string should take (a topic, a question, a company name) or what 'top_k' controls, leaving both parameters semantically opaque.

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

Purpose4/5

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

States a specific verb (search) and resource (the user's previous interview experiences), plus the matching mechanism (semantic similarity). It is distinguishable from siblings like search_problem by resource, but it never explicitly contrasts itself with them.

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 when-to-use guidance, no prerequisites, and no mention of alternatives such as search_problem or get_attempt_history. The resource name implies a use case but nothing steers the agent between this and its siblings.

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

search_problemB

Search for Leetcode problems by title or LeetCode ID

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It does not state that this is a read-only lookup, whether matching is exact or substring, whether it paginates, or what happens when no problem matches. Only the bare search behavior is disclosed.

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?

A single front-loaded sentence with no filler; the resource and both accepted query forms are stated immediately.

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

Completeness4/5

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

An output schema exists, so return values need not be described, and for a one-parameter search tool the description covers the essentials. It is slightly thin on matching semantics and no-result behavior, but nothing essential is missing.

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 description coverage is 0%, so the description must compensate. It does add real meaning by stating the query accepts a title or a LeetCode ID, but it never clarifies whether the query is exact-match, fuzzy, or case-sensitive, nor what happens with ambiguous input.

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

Purpose4/5

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

States a specific verb (search) plus the resource (LeetCode problems) and the two lookup keys (title or LeetCode ID). It is clear what the tool does, though it does not distinguish itself from the sibling search_interview_memory, which is also a search tool.

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 when-to-use guidance, no prerequisites, and no mention of alternatives such as search_interview_memory or get_problem_stats. The agent must infer that this is the lookup step before add_problem or get_problem_stats.

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.

  1. 10 tool updatesv0.1.0
    • First observedadd_problem
    • First observedget_attempt_history
    • First observedget_problem_stats
    • First observedget_recent_attempts
    • First observedget_topic_history
    • First observedget_weak_areas
    • First observedhello
    • First observedlog_attempt
    • First observedsearch_interview_memory
    • First observedsearch_problem

TDQS

B3/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target distinct actions on distinct resources (log, search, add, stats, weak areas). The retrieval trio get_attempt_history, get_recent_attempts, and get_topic_history overlap in returning attempts and differ only by filter scope, which could cause occasional misselection, though descriptions do clarify each scope.

Naming Consistency4/5

Nearly all tools follow a clear snake_case verb_noun pattern (log_attempt, search_problem, get_attempt_history, add_problem). The lone 'hello' tool breaks the convention but is a trivial outlier.

Tool Count5/5

Ten tools is well within the ideal range and each earns its place across problem management, attempt tracking, analytics, and interview memory. No bloat or thinness.

Completeness3/5

Core attempt-tracking and analytics workflows are covered, but there are notable gaps: no tool to add an interview experience despite search_interview_memory existing, no list_topics to feed get_topic_history, and no update/delete for problems or attempts.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers