Skip to main content
Glama

resume-mcp-server

CI License: GPL v3 Python 3.12+ MCP PyPI resume-mcp-server MCP server

An MCP server that gives Claude (or any MCP client) structured, searchable access to your resume collection — resumes, cover letters, and application materials in .docx, .pdf, .md, or .txt format.

Job seekers accumulate document sprawl fast: multiple resume versions tailored to different roles, cover letter drafts, reference sheets. Manually digging through them to draft a new application is tedious. Point this server at your resume folder and Claude can answer questions like "which of my resumes highlights Kubernetes experience?", "what achievements have I listed across my backend roles?", or "draft a cover letter drawing from my work at Acme Corp" — without you pasting anything.

The server parses each document into structured data (contact info, work history, education, skills, side projects) and exposes 20 tools covering full-text search, skill lookup, company and role queries, achievement mining, education search, ATS-style job-match ranking, collection analytics, and more. Files are watched and re-indexed automatically, so edits to your documents are reflected immediately.


Features

  • Multi-format parsing.docx, .pdf, .md, and .txt documents are parsed into structured data: contact info, work history, education, skills, and side projects.

  • Automatic de-duplication — resumes for the same person across multiple files (e.g. a .docx and a .pdf of the same resume) are matched by email or name and collapsed to the richest copy, so search and analytics aren't skewed by duplicates.

  • Automatic hot-reload — a filesystem watcher re-indexes your documents as soon as they change, no server restart needed.

  • Document type inference — files are automatically classified as resume, cover_letter, application_material, or other based on filename patterns, which can be overridden per category via environment variables.

  • Full-text and structured search — search whole documents with search_resumes, or filter any entity type (skills, work experience, achievements, side projects, education) with a scoped query, technology, or competency parameter.

  • Three search modesand, or, and regex matching, available consistently on every tool that accepts a query-like parameter.

  • Uniform pagination — every list-style tool returns the same total_count / items / has_more / next_offset / message envelope, with validated limit/offset and a 200-item cap.

  • Unified error shape — every failure returns {"error": "..."}, so callers only need to check for one shape regardless of which tool they called.

  • Collection analyticsget_collection_stats and get_skill_frequency surface aggregate counts and cross-resume skill popularity.

  • ATS-style job-match rankinglist_ranked_resumes scores every resume against a pasted job description (fuzzy skill matching plus keyword coverage) and ranks them best-match-first; match strictness and score weighting are tunable per call.

  • Read-only and safe by construction — every tool is annotated readOnlyHint / idempotentHint / openWorldHint: false; nothing mutates your files or reaches outside the local document collection.

  • Flexible deployment — run over stdio or HTTP, standalone or via Docker/Docker Compose with CORS support, configured through environment variables or a .env file.

See MCP Tools below for the full list of tools this exposes. For best extraction quality, see the Resume Formatting Guide.


Related MCP server: Resume Forge MCP

Quick Start

Give Claude structured access to your resume collection. The server parses your documents on startup and exposes 20 tools for searching by name, company, skill, education, side project, or full text, ranking resumes against a job description, plus analytics tools for skill frequency and collection statistics — with automatic hot-reload when files change.

Try it immediately with the included sample resumes:

pip install resume-mcp-server
RESUME_DIR=./sample_resumes resume-mcp-server

Then connect Claude Code:

claude mcp add resume-mcp-server resume-mcp-server -e RESUME_DIR=$(pwd)/sample_resumes

For a persistent setup with Docker or your own documents, see Docker Deploy or Dev Environment.


Docker Deploy

The recommended way to run the server. Docker Compose exposes the server over HTTP so any AI client can connect to it.

1. Set your resume directory

Copy the example env file and set your documents path:

cp .env.example .env
# then edit RESUME_DIR_HOST in .env

2. Sync the image version (optional)

Stamp the image with the current pyproject.toml version:

python scripts/sync_version.py

3. Build and start

docker compose build resume-mcp
docker compose up -d

The server is now available at http://localhost:8001/mcp.

4. Connect your AI client

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "resume-mcp-server": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    }
  }
}

VS Code (.vscode/mcp.json):

{
  "servers": {
    "resume-mcp-server": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    }
  }
}

Claude Code:

claude mcp add resume-mcp-server --transport http http://localhost:8001/mcp

To add it globally across all projects, add the following to ~/.claude.json instead:

{
  "mcpServers": {
    "resume-mcp-server": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    }
  }
}

Stopping

docker compose down

Docker (stdio)

Run the image directly — no Compose needed — for MCP clients that use stdio transport (including Glama.ai and Claude Desktop):

docker run -i --rm -v /path/to/your/resumes:/resumes resume-mcp-server

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "resume-mcp-server": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-v", "/path/to/your/resumes:/resumes", "resume-mcp-server"]
    }
  }
}

Dev Environment

For local development or running the server without Docker.

Prerequisites

Python 3.12+

Install

pip install .
# include test dependencies:
pip install ".[dev]"

Run

resume-mcp-server
# with a custom directory:
RESUME_DIR=/path/to/docs resume-mcp-server

Or create a .env file in the directory you run the server from:

# .env
RESUME_DIR=/path/to/docs
FASTMCP_PORT=8001

Then just run resume-mcp-server — the .env is loaded automatically. Variables already set in your shell or by the MCP client always take precedence over .env values.

Connect your AI client (stdio)

Claude Desktop:

{
  "mcpServers": {
    "resume-mcp-server": {
      "command": "resume-mcp-server",
      "env": {
        "RESUME_DIR": "/path/to/your/resumes"
      }
    }
  }
}

If resume-mcp-server is not on your PATH, use the full path (e.g. ~/.venv/bin/resume-mcp-server).

Claude Code:

claude mcp add resume-mcp-server resume-mcp-server -e RESUME_DIR=/path/to/your/resumes

uvx:

{
  "mcpServers": {
    "resume-mcp-server": {
      "command": "uvx",
      "args": ["resume-mcp-server"],
      "env": {
        "RESUME_DIR": "/path/to/your/resumes"
      }
    }
  }
}

Configuration

Docker Compose (.env):

Variable

Description

RESUME_DIR_HOST

Path on your machine to the documents directory — mounted to /resumes inside the container

FASTMCP_PORT

Port the HTTP server listens on (default 8001)

LOG_LEVEL

Logging verbosity: DEBUG, INFO, WARNING, ERROR (default INFO)

Local run (environment variables or .env):

Variable

Default

Description

RESUME_DIR

~/resumes

Directory scanned for documents

FASTMCP_TRANSPORT

http (local) / stdio (Docker image)

Transport protocol (http or stdio)

FASTMCP_HOST

0.0.0.0

Bind address

FASTMCP_PORT

8001

Port the HTTP server listens on

DOC_TYPE_PATTERN_RESUME

resume

Regex used to classify a filename as resume

DOC_TYPE_PATTERN_COVER_LETTER

cover.?letter|_cl\.|_cl_|coverletter

Regex used to classify a filename as cover_letter

DOC_TYPE_PATTERN_APPLICATION_MATERIAL

interview|study.?guide|why_|application.?question|job.?desc

Regex used to classify a filename as application_material

A .env file in the working directory is loaded automatically on startup if present. Shell environment variables and values set by the MCP client always take precedence over .env values.

Each DOC_TYPE_PATTERN_* variable replaces the default regex for that category (filenames are matched in order: resume, then cover letter, then application material, then everything else falls back to other). Leave a variable unset to keep its default; an invalid regex is ignored and the default is used instead.

The server scans RESUME_DIR recursively on startup and reloads automatically when files change.

Document type inference

Types are inferred from filenames:

Type

Filename patterns

resume

contains resume

cover_letter

cover letter, _cl., coverletter

application_material

interview, study guide, why_, application question, job desc

other

everything else

Each of the three regexes can be overridden with DOC_TYPE_PATTERN_RESUME, DOC_TYPE_PATTERN_COVER_LETTER, and DOC_TYPE_PATTERN_APPLICATION_MATERIAL — see Configuration.


Search behavior

Most tools that accept a query (or technology/competency) parameter split it on whitespace and support three match modes via the optional mode parameter:

mode

Behavior

"and" (default)

All tokens must appear within the same field. "latency throughput" only matches a description that contains both words.

"or"

Any token is sufficient. "latency throughput" matches a description that contains either word.

"regex"

The query is compiled as-is (not tokenized or escaped) into a case-insensitive regular expression and matched against the field. Use this for grep-style power — alternation, wildcards, anchors, etc., e.g. "eng(ineer)?" or `"aws

Multi-field note: For tools that search several fields (company name, position title, achievement text, etc.), AND mode requires all tokens to co-occur in the same field, not spread across fields. Use OR mode when you want a looser cross-field match. Regex mode also matches per-field.

Single-word queries behave identically in and/or mode.

Every tool that accepts a query-like parameter — including search_resumes, the whole-document keyword search — shares this same "and"/"or"/"regex" vocabulary.

search_resumes_by_skill accepts either a single skill string or a list of skills. For a list, mode does double duty: it also controls whether a resume must match EACH skill in the list ("and") or ANY skill ("or"); "regex" mode combines multiple skills with OR semantics.

An empty query or an empty skill list returns {"error": "..."} rather than an empty result — this distinguishes a caller mistake from a legitimate zero-match search.


Pagination

All list_* tools (and search_resumes/search_resumes_by_skill) accept limit and offset parameters and return a consistent envelope:

{
  "total_count": 247,
  "items": [...],
  "has_more": true,
  "next_offset": 100,
  "message": "100 of 247 results shown. Call again with offset=100 to see more."
}

total_count is the full match count before slicing. has_more and next_offset tell you directly whether to page further — no need to compute offset + len(items) < total_count yourself — and message restates that in plain language, ready to act on. When there's nothing left, has_more is false, next_offset is null, and message reads "All N results shown.".

limit must be greater than 0 and offset must be 0 or greater — otherwise the tool returns {"error": "..."}. An offset beyond the total result count is not an error; it's a valid "past the end" page (items: [], has_more: false).

Cap and defaults. limit is silently capped at 200 regardless of what's requested — if you ask for more, the response still comes back (not an error), but message is prefixed with "Requested limit N capped to 200." so you know it happened. Default limit varies by tool, generally lower for heavier, deeply-nested responses:

Tool

Default limit

list_resumes

10 (each item is a fully nested resume)

list_work_experiences, list_side_projects, list_education

25

list_achievements

50

list_resume_summaries, list_skills, search_resumes, search_resumes_by_skill

100

get_skill_frequency

20 (not part of the pagination envelope, but shares the same 200 cap)


Error handling

Every tool returns a dict. On failure, the dict is exactly {"error": "<message>"} — this is the only failure shape in the API, so a caller can check for the "error" key regardless of which tool it called. This covers: not-found IDs, a resume_id filter that doesn't match any resume, invalid regex patterns, and invalid limit/offset values. A resume_id filter that does match a resume but simply has zero matching child records (e.g. list_work_experiences(resume_id=<valid>) for someone with no work history) is not an error — it returns an empty items list.

get_resume's success shape is {"text": "..."} so that success and failure are both dicts, distinguishable by key.


MCP Tools

20 tools are exposed, covering full-text search, skill lookup, company and role queries, achievement mining, education search, ATS-style job-match ranking, collection analytics, and more. Every tool is read-only (readOnlyHint: true) — none mutate state or reach outside the local document collection (openWorldHint: false).

Tool

Description

list_resume_summaries

Lightweight identity records (id, name, email, phone) for orienting before fetching details; optional query filters by name

get_resume_profile

A resume's top-level fields (contact info, statement, education) without nested lists

get_resume_full

A resume's complete nested structure (work experiences, skills, side projects, education) in one call

list_resumes

List all documents, optionally filtered by type

get_resume

Full extracted text of a document, keyed by path (not resume_id)

search_resumes

Full-text search across all documents, sorted by match count

list_skills

List badge skills, optionally scoped to a resume and/or filtered by title

get_badge_skill

A single badge skill by ID

search_resumes_by_skill

Find which resumes list one or more given badge skills (accepts a string or a list)

get_skill_frequency

Badge skills ranked by how many resumes list them

list_ranked_resumes

Rank every resume against a pasted job description (fuzzy skill match + keyword coverage)

list_work_experiences

List work experiences, optionally scoped to a resume, current-only, and/or a keyword query

get_work_experience

A single work experience entry with its achievement bullets

list_achievements

List achievement bullets, optionally scoped to a resume and/or a keyword query

get_achievement

A single achievement bullet by ID

list_side_projects

List side projects, optionally scoped to a resume and/or matched by keyword or technology

get_side_project

A single side project by ID, including demonstrated technologies

list_education

List education entries, optionally scoped to a resume and/or matched by keyword or competency

get_education

A single education entry by ID, including its competencies

get_collection_stats

Aggregate counts and averages across the entire loaded collection

See docs/TOOLS.md for full parameter tables and return shapes for every tool.

Available Tools

19 tools
get_achievementA
Read-onlyIdempotent

Get a single achievement (phrase skill) by ID. Returns {"error": ...} if id is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAchievement ID from list_achievements

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and idempotentHint. Description adds value by specifying error return behavior on invalid ID, which annotations do not cover. No contradictions.

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?

Two sentences with no extraneous words. First sentence clearly states purpose, second adds error behavior. Efficient and front-loaded.

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 simple tool with one required parameter and existing output schema, the description fully covers essential behaviors (what it does, error case). No gaps.

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 covers 100% of parameters, so baseline is 3. Description only repeats 'by ID' and does not add additional semantics beyond the schema's existing description of the id parameter.

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?

Explicitly states the verb 'Get', the resource 'achievement (phrase skill)', and the key parameter 'by ID'. Clearly distinguishes from sibling 'list_achievements' which returns multiple.

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?

Implies usage when a single achievement is needed by ID. Indicates error handling if ID not found. However, lacks explicit exclusions or alternative suggestions beyond the sibling context.

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

get_badge_skillA
Read-onlyIdempotent

Get a single badge skill by ID. Returns {"error": ...} if id is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBadge skill ID from list_skills

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and idempotentHint=true. The description adds valuable behavioral context: returns an error object if the ID is not found, which is not covered by annotations. This is useful beyond the structured fields.

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?

Two sentences with no redundant information. Every part is essential: the action, the resource, the error behavior. Front-loaded with the main purpose.

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 (single parameter, simple retrieval), the description is complete. It explains the return value behavior (error on not found) and the parameter source. Output schema exists, so return format is covered.

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

Parameters5/5

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

Schema description coverage is 100%. The parameter 'id' is described as 'Badge skill ID from list_skills', adding meaning about the source and type of the ID beyond the schema's type definition.

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 'Get a single badge skill by ID', specifying the verb (Get), resource (badge skill), and scope (single by ID). It distinguishes from sibling tools like list_skills which retrieves multiple, and other get_* tools for different resources.

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?

The description implies usage for retrieving a specific badge skill by ID, but does not explicitly state when to use this tool vs alternatives (e.g., list_skills for browsing all). No 'when not to use' or exclusions are provided.

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

get_collection_statsA
Read-onlyIdempotent

Return aggregate counts and averages across the entire loaded resume collection.

Returns total_resumes, total_work_experiences, total_unique_skills, total_side_projects, total_education_entries, total_achievements, avg_skills_per_resume, avg_work_experiences_per_resume. Example: get_collection_stats()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds value by enumerating the exact fields returned, which clarifies the scope of data. No behavioral traits are hidden or contradicted.

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, with a clear front-loaded purpose sentence, a bullet-style list of outputs, and a single example. Every sentence is necessary and free of fluff.

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 no parameters, an output schema exists (implied by the field list), and annotations cover safety and idempotency, the description is fully adequate. It explains what is returned and how to call it.

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 no parameters, so the description need not add parameter details. Baseline is 4, and the description appropriately skips 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?

The description clearly states the tool returns aggregate counts and averages across the entire resume collection, listing specific fields (e.g., total_resumes, avg_skills_per_resume). This distinguishes it from sibling tools that operate on individual items (e.g., get_resume, list_resumes).

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?

The description implies usage for obtaining aggregate statistics but does not explicitly state when to use or not use this tool versus alternatives. It provides an example call but lacks guidance on context or exclusions.

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

get_educationA
Read-onlyIdempotent

Get a single education entry by ID, including its competencies. Returns {"error": ...} if id is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEducation entry ID from list_education

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds that it returns an error if the id is not found and includes competencies, providing useful behavioral context beyond annotations.

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 two short sentences, front-loaded with the core purpose, then adding error handling. Every word adds value with no unnecessary details.

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?

Given the tool's simplicity (one required parameter, annotations, output schema exists), the description covers the essential behavior: what it does, what it returns, and error case. No gaps for its intended use.

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?

Schema coverage is 100% and the schema description for 'id' says 'Education entry ID from list_education', which tells the user where to obtain the ID. The description does not repeat this but the parameter's purpose is clear.

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 starts with 'Get a single education entry by ID, including its competencies', clearly stating the verb and resource. It distinguishes from sibling tools like list_education (which lists all entries) by focusing on a single entry by ID.

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?

The description implies usage when you have an ID but does not explicitly state when to use this tool versus alternatives (e.g., list_education to get IDs first). No indication of when not to use it.

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

get_resumeA
Read-onlyIdempotent

Return the full extracted text of a document, as {"text": "..."}. Note: takes a file path (see list_resumes), not a resume_id — use get_resume_profile or list_resumes to fetch structured data by resume_id instead. Returns {"error": ...} if path is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path as returned by list_resumes, e.g. 'MyResume_v2.docx' or 'Acme/MyResume.docx'

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already confirm read-only and idempotent behavior; description adds return format and error handling details, going beyond structured data.

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?

Two concise sentences front-loading the purpose, with no extraneous information.

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?

For a simple tool with one parameter, clear annotations, and a straightforward return format, the description provides all necessary context including error case.

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 covers the path parameter completely with examples; description reinforces but adds no new semantic information beyond the schema.

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 returns full extracted text as a JSON object, and distinguishes it from siblings by specifying it takes a file path not a resume_id.

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 tells when to use (with a file path from list_resumes) and when not to (use get_resume_profile or list_resumes for structured data by ID), plus notes error handling.

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

get_resume_fullA
Read-onlyIdempotent

Get a resume's complete nested structure in one call: profile fields plus all work experiences (with achievements), badge skills, side projects (with technologies), and education entries (with competencies). Prefer get_resume_profile plus the scoped list_* tools (list_work_experiences, list_skills, list_side_projects, list_education) when you only need part of this — it's more token-efficient. Use get_resume_full when you need the whole picture at once. Returns {"error": ...} if resume_id is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
resume_idYesResume ID from list_resume_summaries

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, idempotentHint), description adds that it returns the full nested structure and mentions error handling for missing resume_id, providing useful behavioral context.

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?

Four sentences, no wasted words. Purpose is front-loaded, followed by usage guidance and error behavior. Efficient and well-structured.

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?

Description fully explains what data is returned, and context signals indicate output schema exists. Complete for a read-only retrieval tool with one parameter.

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

Parameters5/5

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

Single parameter resume_id is described well in schema as 'Resume ID from list_resume_summaries'. Description reinforces this and adds context about its source, adding value beyond the schema.

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?

Description clearly states it retrieves the complete nested structure of a resume, listing all included components. This distinguishes it from siblings like get_resume_profile and list_* tools.

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 advises to prefer get_resume_profile plus scoped list_* tools for partial data for token efficiency, and to use get_resume_full when the whole picture is needed. Provides clear when-to-use and alternatives.

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

get_resume_profileA
Read-onlyIdempotent

Get a resume's top-level fields (contact info, professional statement, education) without the nested work experience and badge skill lists. See also: get_resume_full for everything about this resume in one call. Returns {"error": ...} if resume_id is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
resume_idYesResume ID from list_resume_summaries

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint and idempotentHint as true. The description adds value by detailing what is omitted (nested fields) and error responses, without contradicting annotations.

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?

Two sentences plus a see-also and error note; every sentence provides value. Front-loaded with the core purpose.

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 presence of an output schema and simple single-parameter input, the description fully covers purpose, scope, alternatives, and errors, leaving no gaps.

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?

Schema coverage is 100% with an inline description for resume_id. The description adds context by noting the source ('from list_resume_summaries'), which aids parameter understanding beyond the schema.

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 specifies the verb 'Get' and the resource 'resume's top-level fields', listing included fields (contact info, professional statement, education) and excluded ones (nested work experience, badge skill lists), clearly distinguishing it from get_resume_full.

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 suggests when to use (for top-level fields) and directs to get_resume_full for complete resume data. Also documents error behavior when resume_id is not found.

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

get_side_projectA
Read-onlyIdempotent

Get a single side project by ID, including the technologies it demonstrates. Returns {"error": ...} if id is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSide project ID from list_side_projects

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnly and idempotent. The description adds that it returns technologies and an error object if not found, which is useful beyond annotations.

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?

Two concise sentences, front-loaded with purpose. No wasted words.

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 presence of an output schema, the description adequately covers return value shape (includes technologies, error on not found). Complete for a simple get-by-ID 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?

Schema covers 100% of parameters. The description adds context 'Side project ID from list_side_projects', which provides semantic guidance beyond the schema's type and required flag.

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 specifies 'Get a single side project by ID' with a verb and resource, and distinguishes from list_side_projects (list vs single). It also notes the inclusion of technologies and error handling.

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 implies usage when you have an ID (from list_side_projects), but does not explicitly state when not to use or compare to siblings. The error return note provides some guidance.

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

get_skill_frequencyA
Read-onlyIdempotent

Return badge skills ranked by how many resumes list them, in descending order.

Useful for identifying the most common technologies across all candidates.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of skills to return (default 20)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnly and idempotent behavior. The description adds the descending order ranking detail, which is non-obvious. No contradictions.

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?

Two short sentences with no fluff. The first sentence directly states the action and result format. Every word is informative.

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?

For a simple, one-parameter, read-only tool with an output schema, the description covers purpose, usage context, and parameter. No missing information needed for an agent to invoke it correctly.

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?

The only parameter 'limit' is fully documented in the input schema with description and default. The tool description adds no further semantic value beyond the schema, so baseline 3 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 clearly states the tool returns badge skills ranked by frequency in descending order, differentiating it from sibling tools like list_skills and search_resumes_by_skill.

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?

Provides context that it is useful for identifying common technologies across all candidates, but does not explicitly state when not to use or list alternatives. Still clear enough for an agent to infer appropriate usage.

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

get_work_experienceA
Read-onlyIdempotent

Get a single work experience entry with its achievements. Returns {"error": ...} if id is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWork experience ID from list_work_experiences

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, indicating safe behavior. The description adds that it returns an error object if the id is not found, which is useful but does not elaborate on other behavioral traits (e.g., whether achievements are nested or how many).

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 at two sentences, with the primary action front-loaded. Every word adds value, and there is no redundancy or waste.

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?

Given the simple nature of this read tool (single parameter, output schema present), the description covers the core purpose and error behavior. It mentions that achievements are included, aligning with the tool's scope. The presence of an output schema compensates for missing return value details.

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?

The input schema provides full coverage (100%) with a clear description for the 'id' parameter. The tool description does not add any additional meaning beyond what the schema already provides.

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 'Get' and the resource 'a single work experience entry with its achievements'. It distinguishes itself from sibling tools like list_work_experiences (which lists) and get_achievement (which gets a single achievement).

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?

The description implies usage by stating the tool gets a single entry, and the parameter description indicates the id comes from list_work_experiences. However, it does not explicitly state when to use this tool versus siblings, nor does it provide exclusions or prerequisites.

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

list_achievementsA
Read-onlyIdempotent

List achievements (resume bullet points), optionally filtered to a specific resume and/or a keyword query matched against the achievement text (absorbs the old search_achievements tool).

Response shape depends on the arguments given, to keep the common case cheap:

  • resume_id given, query omitted: bare {id, desc} per item (cheapest — you already know which resume these belong to).

  • query given, and/or resume_id omitted: each item also includes company_name, position_title, work_experience_id, and resume_id, since that context would otherwise be unrecoverable from the achievement alone. Response includes total_count and items for pagination. Returns {"error": ...} if resume_id is given but not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode for query — 'and' (default) requires all words to appear in the description; 'or' requires any word to match; 'regex' treats query as a case-insensitive regular expressionand
limitNoMaximum number of results to return (default 50)
queryNoOptional text to search for in achievement descriptions (case-insensitive)
offsetNoNumber of results to skip for pagination (default 0)
resume_idNoOptional resume ID from list_resume_summaries to filter results

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly and idempotent, so the description adds value by explaining conditional response shape, pagination, and error handling. No contradictions.

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?

Description is detailed but well-structured, with each paragraph adding value. Could be slightly more concise, but front-loads purpose and explains complex behavior efficiently.

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?

Given the tool's complexity (5 params, conditional output), the description covers purpose, filtering, response shape, pagination, and error handling. Output schema exists, so return details are not needed. Sibling differentiation is partially addressed.

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?

Schema has 100% coverage and descriptions, but the description adds meaningful context about how parameters affect response shape (e.g., resume_id and query omitted vs. given). This goes beyond schema.

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 the tool lists achievements (resume bullet points) with optional filtering by resume_id and keyword query. Mentions it absorbs the old search_achievements tool, distinguishing it from siblings.

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?

Provides clear guidance on when to use filtering options and how response shape depends on arguments. Does not explicitly state when not to use or compare to alternatives like get_achievement, but context is sufficient.

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

list_educationA
Read-onlyIdempotent

List education entries (degree, institution, year, and relevant coursework/competencies), optionally filtered to a resume and/or matched by keyword or competency (absorbs the old search_education and search_education_by_competency tools).

  • If competency is given, entries are matched against competency names only, and each result uses a lighter shape: id, institution, degree, year, matched_competencies, resume_id.

  • Else if query is given, entries are matched against institution, degree, or competency names, and each result includes the full nested structure plus resume_id.

  • If both are given, competency takes precedence and query is ignored.

  • If neither is given, today's plain listing behavior applies. Response includes total_count and items for pagination. Returns {"error": ...} if resume_id is given but not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode — 'and' (default) requires all words to match within the same field; 'or' requires any word to match; 'regex' treats query/competency as a case-insensitive regular expressionand
limitNoMaximum number of results to return (default 25)
queryNoOptional text to match against institution, degree, or competency (case-insensitive)
offsetNoNumber of results to skip for pagination (default 0)
resume_idNoOptional resume ID from list_resume_summaries to filter results
competencyNoOptional skill/competency name fragment to match (case-insensitive, partial match); takes precedence over query

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations show readOnlyHint and idempotentHint true, consistent with a safe read operation. The description adds behavioral details like different result shapes per mode, pagination, and error handling, going beyond annotations.

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?

The description is structured with bullet-like clauses and front-loaded with the main purpose. It is somewhat lengthy but each sentence adds value, avoiding redundancy.

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 complexity (multiple modes, filtering, pagination, error cases), the description covers necessary details. Response structure and error handling are mentioned, making it complete for an 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?

Schema coverage is 100%, but the description adds functional context: precedence between competency and query, result shape differences, and pagination behavior. This adds significant value beyond the schema alone.

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 lists education entries with filtering options. It explicitly mentions absorbing two old search tools, distinguishing it from siblings that handle other resume sections.

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 explains when to use competency vs query vs neither, including precedence rules. It lacks explicit when-not-to-use guidance but effectively conveys context.

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

list_resumesA
Read-onlyIdempotent

List all documents. When doc_type is 'resume' (or omitted), structured resume data is returned if available; otherwise flat file metadata is returned. Response includes total_count and items for pagination. See also: list_resume_summaries for a lighter-weight, more token-efficient listing; get_resume_full for one resume's full nested structure by resume_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 10 — each item is a fully nested resume)
offsetNoNumber of results to skip for pagination (default 0)
doc_typeNoOptional filter — one of: resume, cover_letter, application_material, other

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint. The description adds valuable context about returning structured data vs flat metadata depending on doc_type and includes pagination 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?

Three sentences with no waste. Front-loaded with main purpose, efficient and well-structured.

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 existence of an output schema and sibling tools, the description provides sufficient context including doc_type behavior, pagination, and references to alternatives.

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?

Schema coverage is 100% with parameter descriptions. The description adds extra meaning for doc_type behavior (structured data when resume) and mentions pagination parameters implicitly.

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 lists documents and explains the behavior based on doc_type. It distinguishes from sibling tools like list_resume_summaries and get_resume_full.

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 provides explicit references to alternative tools (list_resume_summaries, get_resume_full) for different use cases, giving good guidance. Lacks a direct 'use this when' statement but context is clear.

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

list_resume_summariesA
Read-onlyIdempotent

List resumes as lightweight identity records — id, name, email, phone only. Use this to orient and pick a resume_id before fetching details with other tools. Much more token-efficient than list_resumes when you only need to identify who is present. Pass query to filter by first or last name (absorbs the old search_resumes_by_name tool). Response includes total_count and items for pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode — 'and' (default) requires all words to appear in the same name field; 'or' requires any word to match; 'regex' treats query as a case-insensitive regular expressionand
limitNoMaximum number of results to return (default 100)
queryNoOptional name fragment to filter by first or last name (case-insensitive)
offsetNoNumber of results to skip for pagination (default 0)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations (readOnlyHint: true, idempotentHint: true) already signal safe read operation. The description adds behavioral context: it returns only 'id, name, email, phone', includes pagination fields 'total_count and items', and that query filters by first or last name. No contradictions. The description enhances understanding beyond the annotations.

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?

Five concise sentences, each adding distinct value. Front-loaded with purpose and output format. No redundant information. Every sentence earns its place, making it highly efficient for agent consumption.

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 presence of an output schema (context signal: true), the description need not detail return structure, but it mentions total_count and items for pagination, which is helpful. Covers filtering, the absorbed sibling tool, and the lightweight nature. Fully sufficient for an agent to understand usage in context.

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 100%, so baseline is 3. The description adds minimal parameter context: 'Pass query to filter by first or last name' relates to the query parameter, but the schema already describes it well. Mode and pagination parameters are not elaborated in the description beyond what schema provides. No significant value added beyond schema.

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 it lists resumes as lightweight identity records with specific fields (id, name, email, phone). Distinguishes from sibling 'search_resumes_by_skill' by contrasting name-based filtering vs skill search, and mentions absorbing the old search_resumes_by_name tool. The verb 'list' combined with the lightweight scope makes the purpose immediately clear.

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?

Explicitly advises using this tool to 'orient and pick a resume_id before fetching details with other tools' and highlights token-efficiency over a presumably heavier 'list_resumes' tool. Implicitly contrasts with sibling 'search_resumes_by_skill' by focusing on name filtering. Does not explicitly list when not to use, but the guidance is clear and actionable.

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

list_side_projectsA
Read-onlyIdempotent

List side projects (personal/portfolio projects, distinct from work experience), optionally filtered to a resume and/or matched by keyword or technology (absorbs the old search_side_projects and search_side_projects_by_technology tools).

  • If technology is given, projects are matched against technology names only, and each result uses a lighter shape: id, name, description, matched_technologies, resume_id.

  • Else if query is given, projects are matched against name, description, or technology names, and each result includes the full nested structure plus resume_id.

  • If both are given, technology takes precedence and query is ignored.

  • If neither is given, today's plain listing behavior applies. Response includes total_count and items for pagination. Returns {"error": ...} if resume_id is given but not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode — 'and' (default) requires all words to match within the same field; 'or' requires any word to match; 'regex' treats query/technology as a case-insensitive regular expressionand
limitNoMaximum number of results to return (default 25)
queryNoOptional text to match against name, description, or technology (case-insensitive)
offsetNoNumber of results to skip for pagination (default 0)
resume_idNoOptional resume ID from list_resume_summaries to filter results
technologyNoOptional technology/skill name fragment to match (case-insensitive, partial match); takes precedence over query

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint and idempotentHint. Description adds behavioral details: filtering interplay, result shape differences, error handling for missing resume_id, and pagination. No contradictions.

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?

Well-structured with bullet points and clear hierarchy. Lengthy but justified given the complex filtering behavior. Could be slightly more concise, but no fluff.

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?

Covers all filtering modes, pagination, error handling, and result shapes. With output schema present and no nested objects, the description is sufficiently complete for an AI agent to use correctly.

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?

Schema coverage is 100%, so parameters are already documented. The description adds value by explaining how query and technology interact, precedence rules, and result shape changes, which goes beyond the schema's individual field descriptions.

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 explicitly states the tool lists side projects (personal/portfolio projects) and distinguishes them from work experience. It also mentions absorbing old search tools, providing clear scope.

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?

Provides detailed filtering logic (technology vs query precedence, pagination) but does not explicitly compare to sibling tools like get_side_project or list_work_experiences; however, the context of listing vs retrieving is implied.

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

list_skillsA
Read-onlyIdempotent

List badge skills (technologies, tools, languages), optionally filtered to a resume and/or a keyword query matched against the skill title (absorbs the old search_skills tool). Note: badge skills are deduplicated and shared across resumes by title, so — unlike work experiences, side projects, and education — items here do not carry a resume_id. Response includes total_count and items for pagination. Returns {"error": ...} if resume_id is given but not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode for query — 'and' (default) requires all words to match; 'or' requires any word to match; 'regex' treats query as a case-insensitive regular expressionand
limitNoMaximum number of results to return (default 100)
queryNoOptional text to search for in skill titles (case-insensitive)
offsetNoNumber of results to skip for pagination (default 0)
resume_idNoOptional resume ID from list_resume_summaries to filter results

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate read-only and idempotent behavior. The description adds valuable context: skills are deduplicated and shared across resumes (no resume_id on items), pagination uses total_count and items, and an error is returned if resume_id is not found. No contradiction with annotations.

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 concise with four sentences, each adding unique value: purpose and filtering, deduplication note, pagination structure, and error behavior. It is front-loaded and efficient.

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?

Given the existence of an output schema, the description adequately covers pagination and error handling. It could benefit from mentioning default ordering, but overall it sufficiently guides the agent for a list/filter tool among many siblings.

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?

All parameters have schema descriptions (100% coverage), so the baseline is 3. The description does not add significant parameter details beyond what the schema provides, except implicitly linking query to title matching.

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 lists badge skills (technologies, tools, languages) and optionally filters by resume or keyword query. It also notes that it absorbs the old search_skills tool, effectively differentiating it as the combined list/search tool for skills.

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 provides clear context on when to use the tool (listing/filtering skills) and mentions limitations like deduplication and error handling. However, it does not explicitly state when to avoid it or suggest alternatives like get_badge_skill for a single skill.

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

list_work_experiencesA
Read-onlyIdempotent

List work experiences, optionally filtered to a specific resume, only current roles, and/or a keyword query matched against company name, position title, or achievement descriptions (absorbs the old search_work_experiences tool). Each result includes a resume_id field identifying which resume the experience belongs to. Response includes total_count and items for pagination. Returns {"error": ...} if resume_id is given but not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode for query — 'and' (default) requires all words to match within the same field; 'or' requires any word to match; 'regex' treats query as a case-insensitive regular expressionand
limitNoMaximum number of results to return (default 25)
queryNoOptional text to match against company name, position title, or achievement descriptions (case-insensitive)
offsetNoNumber of results to skip for pagination (default 0)
resume_idNoOptional resume ID from list_resume_summaries to filter results
current_onlyNoIf True, return only roles where end_date is 'Present'

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations indicate readOnlyHint and idempotentHint are true. The description adds context about pagination (total_count, items), error handling, and the 'absorbs the old search' behavior. No contradictions.

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?

The description is five sentences, front-loading the main purpose and filters. Each sentence adds meaning, though it could be slightly more terse. It effectively communicates key points without redundancy.

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 has 6 optional params, an output schema, and strong annotations, the description covers purpose, all filter options, pagination, and error states. It is complete for a list endpoint, providing sufficient context for an agent to decide and invoke correctly.

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?

Schema coverage is 100%, so param descriptions are already detailed. The description adds value by mentioning the resume_id field in results and pagination fields (total_count, items), which are not in param descriptions. This enhances understanding beyond the schema.

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 it lists work experiences with optional filters (resume, current_only, query). It distinguishes from siblings like get_work_experience (single) and other search tools by focusing on work experiences. The absorption of the old search tool reinforces its scope.

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 explains optional filters and pagination, and notes error when resume_id is not found. It mentions absorbing the old search tool, implying it replaces that. However, it could more explicitly contrast with sibling tools like get_work_experience or list_resumes.

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

search_resumesA
Read-onlyIdempotent

Search across all documents for a keyword or phrase. Response includes total_count, items, has_more, next_offset, and message for pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode — 'and' (default) requires all words to appear in the document; 'or' requires any word to match; 'regex' treats query as a case-insensitive regular expressionand
limitNoMaximum number of results to return (default 100)
queryYesText to search for (case-insensitive)
offsetNoNumber of results to skip for pagination (default 0)
doc_typeNoOptional filter — one of: resume, cover_letter, application_material, other

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true. Description adds that response includes pagination details (total_count, items, has_more, next_offset, message), which is useful but does not disclose further behavioral traits like rate limits or caching. No contradiction with annotations.

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?

Two concise sentences: first states purpose, second lists response fields. Front-loaded and no wasted words. Efficient structure.

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?

With output schema present (hidden), description covers pagination response well. For a general search tool, it is sufficiently complete. Could optionally mention which document types are searched (implied by 'all documents' but not explicit).

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 100%, so baseline is 3. Description does not add additional meaning beyond the schema; it remains generic. No parameter-specific elaboration.

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?

Description clearly states 'Search across all documents for a keyword or phrase.' 'All documents' distinguishes it from sibling 'search_resumes_by_skill' which focuses on skill-based search. Also mentions pagination fields in response, adding specificity.

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?

Description implies usage for keyword/phrase search across all documents, but does not explicitly state when to use versus alternatives like 'search_resumes_by_skill' or list tools. No exclusions or when-not guidance provided.

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

search_resumes_by_skillA
Read-onlyIdempotent

Find which resumes list one or more given badge skills. Returns resume identity and matched skill names only — more token-efficient than list_resumes when filtering by skill. Accepts either a single skill string or a list of skills to filter by multiple at once.

Each result includes: id, first_name, last_name, matched_skills. Response includes total_count, items, has_more, next_offset, and message for pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoToken match mode. For a single skill: 'and' (default) requires all words to appear in the skill title, 'or' requires any word to match, 'regex' treats it as a case-insensitive regular expression. For multiple skills, mode also controls whether a resume must match EACH skill in the list ('and') or ANY skill in the list ('or'); 'regex' mode combines multiple skills with OR semantics.and
limitNoMaximum number of results to return (default 100)
skillYesSkill title fragment, or list of fragments, to search for (case-insensitive, partial match)
offsetNoNumber of results to skip for pagination (default 0)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description adds valuable behavioral context beyond the readOnlyHint and idempotentHint annotations, such as returning only resume identity and matched skill names, and pagination details. No contradictions with annotations.

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 concise with three sentences, front-loading the purpose and usage, then listing output fields. Every sentence adds value with no redundancy.

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 existence of an output schema, the description provides sufficient context: purpose, input, output fields, and pagination. It covers the essential aspects for an agent to use the tool correctly.

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 100%, so baseline is 3. The description reinforces the skill parameter flexibility but does not add new meaning beyond the schema. The mention of result fields aids understanding but pertains to output, not parameter semantics.

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 'Find' and the resource 'resumes', specifying that it filters by badge skills. It explicitly distinguishes itself from the sibling tool 'list_resume_summaries' by highlighting token efficiency for skill-based filtering.

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?

The description explicitly advises when to use this tool ('more token-efficient than list_resumes when filtering by skill') and explains that it accepts both a single skill and a list of skills, providing clear guidance on alternative usage.

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. 17 tool updatesv1.0.8
    • Addedget_achievement
    • Addedget_badge_skill
    • Addedget_collection_stats
    • Addedget_education
    • Addedget_resume
    • Addedget_resume_full
    • Addedget_resume_profile
    • Addedget_side_project
    • Addedget_skill_frequency
    • Addedget_work_experience
    • Addedlist_achievements
    • Addedlist_education
    • Addedlist_resumes
    • Addedlist_side_projects
    • Addedlist_skills
    • Addedlist_work_experiences
    • Addedsearch_resumes
  2. 27 tool updatesv1.0.7
    • Removedget_achievement
    • Removedget_badge_skill
    • Removedget_collection_stats
    • Removedget_education
    • Removedget_resume
    • Removedget_resume_profile
    • Removedget_side_project
    • Removedget_skill_frequency
    • Removedget_work_experience
    • Removedlist_achievements
    • Removedlist_badge_skills
    • Removedlist_education
    • Changedlist_resume_summaries2 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to appear in the same name field; 'or' requires any word to match; 'regex' treats query as a case-insensitive regular expression",
        +  "type": "string"
        +}
      • addedInput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional name fragment to filter by first or last name (case-insensitive)"
        +}
    • Removedlist_resumes
    • Removedlist_side_projects
    • Removedlist_work_experiences
    • Removedsearch_achievements
    • Removedsearch_education
    • Removedsearch_education_by_competency
    • Removedsearch_resumes
    • Removedsearch_resumes_by_name
    • Changedsearch_resumes_by_skill10 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • changedInput schema / properties / mode / description
        Previous value: -"Token match mode — 'and' (default) requires all words to appear in the skill title; 'or' requires any word to match"New value: +"Token match mode. For a single skill: 'and' (default) requires all words to appear in the\n  skill title, 'or' requires any word to match, 'regex' treats it as a case-insensitive\n  regular expression. For multiple skills, mode also controls whether a resume must match\n  EACH skill in the list ('and') or ANY skill in the list ('or'); 'regex' mode combines\n  multiple skills with OR semantics."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / skill / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / skill / description
        Previous value: -"Skill title fragment to search for (case-insensitive, partial match)"New value: +"Skill title fragment, or list of fragments, to search for (case-insensitive, partial match)"
      • removedInput schema / properties / skill / type
        Removed value: -"string"
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Removedsearch_resumes_by_skills
    • Removedsearch_side_projects
    • Removedsearch_side_projects_by_technology
    • Removedsearch_skills
    • Removedsearch_work_experiences
  3. 19 tool updatesv1.0.6
    • Addedget_collection_stats
    • Addedget_skill_frequency
    • Changedlist_achievements6 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_badge_skills6 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_education6 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_resume_summaries6 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_resumes6 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_side_projects6 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_work_experiences6 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return (default 100)",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip for pagination (default 0)",
        +  "type": "integer"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_achievements1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to appear in the description; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Changedsearch_education1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to match within the same field; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Changedsearch_education_by_competency1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to appear in the competency name; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Changedsearch_resumes_by_name1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to appear in the same name field; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Changedsearch_resumes_by_skill1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to appear in the skill title; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Addedsearch_resumes_by_skills
    • Changedsearch_side_projects1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to match within the same field; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Changedsearch_side_projects_by_technology1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to appear in the technology name; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Changedsearch_skills1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to match; 'or' requires any word to match",
        +  "type": "string"
        +}
    • Changedsearch_work_experiences1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "and",
        +  "description": "Token match mode — 'and' (default) requires all words to match within the same field; 'or' requires any word to match",
        +  "type": "string"
        +}
  4. 8 tool updatesv1.0.4
    • Addedget_education
    • Addedget_side_project
    • Addedlist_education
    • Addedlist_side_projects
    • Addedsearch_education
    • Addedsearch_education_by_competency
    • Addedsearch_side_projects
    • Addedsearch_side_projects_by_technology
  5. 16 tool updatesv1.0.1
    • First observedget_achievement
    • First observedget_badge_skill
    • First observedget_resume
    • First observedget_resume_profile
    • First observedget_work_experience
    • First observedlist_achievements
    • First observedlist_badge_skills
    • First observedlist_resume_summaries
    • First observedlist_resumes
    • First observedlist_work_experiences
    • First observedsearch_achievements
    • First observedsearch_resumes
    • First observedsearch_resumes_by_name
    • First observedsearch_resumes_by_skill
    • First observedsearch_skills
    • First observedsearch_work_experiences

TDQS

A4.4/5.0

Scored across 19 tools

Disambiguation5/5

Every tool targets a distinct entity or level of detail: list_* for collections, get_* for individual items, search_* for cross-cutting queries. Even similar-sounding tools like list_resumes vs list_resume_summaries serve clearly different purposes (full vs lightweight).

Naming Consistency5/5

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

Tool Count4/5

19 tools is slightly above the typical 3-15 range, but the number is well-justified by the domain's complexity (multiple entity types: resumes, skills, experiences, projects, education) and the need for both list and detail endpoints per entity.

Completeness5/5

The tool surface provides comprehensive read-only coverage: every entity (resume, work experience, achievement, skill, side project, education) has a list and get endpoint, plus cross-cutting search and aggregate stats. No obvious gaps for retrieval.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to intelligently query and analyze your resume using RAG technology. Supports skill matching against job requirements and answering questions about your professional background from locally stored resume files.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that provides a structured API for AI agents to query a person's resume, including profile, projects, writing, and gated access to experience and skills.
    -
  • F
    license
    A
    quality
    D
    maintenance
    A local job-hunting MCP server for discovering jobs across pluggable web sources, tracking applications through a status lifecycle, and managing profiles/resumes, with geo/map-region search.
    12
    -