SkillMatch MCP
SkillMatch MCP is a job search and fit analysis server that connects your portfolio, resume, and preferences to help Claude find and evaluate jobs, track applications, and optimize your search.
Profile Management: Set up a detailed job search profile (
setup) with name, target roles, salary floor, remote preference, location, dealbreakers, GitHub URL, and resume. Retrieve (get_profile) or update (update_profile) fields later.Resume & Portfolio:
Add multiple resume variants (
add_resume) tailored to specific role types, list them (list_resumes), and read any saved resume (get_resume).Fetch public GitHub repos with metadata and README content, optionally with deep AI analysis (
get_portfolio).Analyze a local code repository to extract languages, tech stack, entry points, and architecture (
read_repo).
Job Search & Fit Analysis:
Build an optimized job search query from your profile and keywords (
search_jobs).Parse a job description to extract structured signals: hard requirements, nice-to-haves, red flags, compensation, role type, and experience level (
parse_jd).Bundle your portfolio, resume, and a job description for Claude to reason about your fit (
analyze_fit).
Job Scouting:
Save direct job listings with URL validation and deduplication (
save_scouted_job).List scouted jobs, optionally filtered to only unranked ones (
get_scouted_jobs).Mark all unranked jobs as ranked (
mark_jobs_ranked).Purge dead or expired job postings with dry-run support (
purge_dead_listings).
Application Tracking (CRM):
Log applications with company, role, URL, salary, status, and notes (
log_application).View all tracked applications, filterable by status (applied, screening, interview, offer, rejected, ghosted) (
get_applications).Update an application's status, notes, follow-up date, or outcome (
update_application).Show applications whose follow-up date has passed and you're still waiting for a response (
get_follow_ups).
Pattern Analysis: Analyze your application history (10+ needed) to uncover response patterns, resonant skills, and get search strategy adjustments (
get_application_patterns).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SkillMatch MCPAnalyze my fit for a senior frontend engineer role"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SkillMatch MCP
Claude-powered job fit analyzer for people who prove their skills through work, not credentials.
What It Does
SkillMatch is an MCP server that gives Claude access to your GitHub portfolio, resume, and job search preferences. It lets Claude:
Analyze how well you fit a specific job description based on your actual projects and resume
Build optimized job search queries tailored to your targets and constraints
Track every application you submit in a local SQLite database
Pull your public GitHub repos to highlight relevant work during fit analysis
All data stays local on your machine. Nothing is sent anywhere except public GitHub API calls to fetch your own repos.
Related MCP server: job-search-mcp
Setup
1. Install the dependency
cd skillmatch-mcp
pip install -r requirements.txtSpeaks MCP protocol revision 2026-07-28 over stdio, on SDK mcp>=2.0,<3. It is stateless:
no initialize handshake and no session id, with every request carrying its own protocol version
and client identity. tools/list and server/discover return ttlMs/cacheScope freshness
hints, and tool order is stable across calls so client-side and prompt caches keep hitting.
Upgrading from 1.x: 2.0.0 drops the
initializehandshake, so it requires a client that speaks2026-07-28. Tool names, schemas, and results are unchanged — only the transport moved. Stay on 1.x if you need to serve an older client.
2. Add to Claude
Claude Code (CLI):
claude mcp add --scope user skillmatch -- python /path/to/skillmatch-mcp/server.pyThen restart Claude Code.
Claude Desktop:
Open your Claude Desktop configuration file and add SkillMatch to the mcpServers section:
{
"mcpServers": {
"skillmatch": {
"command": "python",
"args": ["/path/to/skillmatch-mcp/server.py"]
}
}
}Replace /path/to/skillmatch-mcp/server.py with the actual path to server.py on your machine, then restart Claude Desktop.
3. Start using it
After restarting, SkillMatch tools will be available in your conversation. Works in Claude Code and Claude Desktop.
Onboarding
The first time you use SkillMatch, Claude will walk you through a setup conversation. It looks something like this:
You: Help me find a new job.
Claude: I don't have your profile set up yet. Let me ask you a few questions first.
What is your name?
You: Jordan
Claude: What is your current role?
You: Senior frontend developer
Claude: What roles are you targeting?
You: Staff frontend engineer, senior full-stack engineer
Claude: What is your minimum acceptable salary?
You: 180000
Claude: Are you only looking for remote positions?
You: Yes
Claude: Where are you located?
You: Portland, OR
Claude: Any dealbreakers?
You: No on-call rotations, no defense contractors
Claude: What is your GitHub URL?
You: https://github.com/jordan-dev
Claude: Where is your resume file?
You: C:/Users/jordan/Documents/resume.md
Claude: Got it. Your profile is saved. Let me search for jobs matching your targets.After onboarding, your profile is saved locally and reused in every future conversation.
Extended Profile (optional)
You can enrich your profile at any time by asking Claude to update it. These fields help Claude reason about nuanced fit:
Field | Type | Example |
| object |
|
| array |
|
| array |
|
| array |
|
| array |
|
| array |
|
These can be set during initial setup or added later with the update_profile tool.
How It Works
search_jobs builds a search query from your profile and any keywords you provide. Claude then uses that query with its web search capabilities to find real listings. The tool itself does not search the web.
analyze_fit runs a two-step process. First it parses the job description into structured signal (hard requirements, nice-to-haves, red flags, compensation signals, role type) via the Claude API. Then it fetches your portfolio and auto-selects the best resume variant for the detected role type. Claude sees structured signal before raw marketing copy.
parse_jd is the standalone JD parser. Use it independently to pre-process a job description without running the full fit analysis.
log_application, get_applications, and update_application form a job search CRM. Track status (applied, screening, interview, offer, rejected, ghosted), set follow-up dates, and record outcomes.
get_follow_ups shows applications that need attention — where the follow-up date has passed and you're still waiting.
get_application_patterns analyzes your full application history (10+ needed) to find which role types get responses, which skills resonate, and recommends search adjustments.
email_ranked_jobs.py is a standalone Conductor worker script that emails the latest ranked job report. See Email Worker Setup below for configuration.
save_scouted_job saves a job listing found during scouting. It validates the URL to reject search result pages and deduplicates against existing scouted jobs and applications.
get_scouted_jobs returns all scouted listings, optionally filtered to only unranked ones. mark_jobs_ranked marks all unranked jobs as ranked after a ranking report is generated.
add_resume and list_resumes manage multiple resume variants. Each variant targets specific role types (e.g. "AI Engineering" targets ai_engineering and ml_engineering). During fit analysis, the best variant is auto-selected based on the JD's detected role type.
update_profile merges new or changed fields into your existing profile without re-running setup.
get_portfolio and get_resume can be called independently if you want Claude to review just your repos or just your resume.
Quick Start (No File Paths)
For the simplest setup, paste your resume directly — no local files needed:
You: Help me find a job.
Claude: What is your name?
You: Alex
Claude: What roles are you targeting?
You: AI engineer, ML engineer
Claude: Paste your resume or provide a file path.
You: [paste resume text here]
Claude: Profile saved. Let me search for jobs.Email Worker Setup
email_ranked_jobs.py sends the ranked job report via Gmail. It is designed to run as a Conductor worker on a schedule.
Credentials live in a gitignored config file — never in the source. Copy the template and fill it in:
cp data/email_config.example.json data/email_config.jsonThen edit data/email_config.json:
{
"gmail_user": "you@gmail.com",
"gmail_app_password": "your-16-char-app-password",
"email_to": "you@gmail.com",
"email_cap": 15
}Key | Required | Default |
| yes | — |
| yes | — |
| no | falls back to |
| no |
|
The whole data/ folder is gitignored (only .gitkeep and email_config.example.json are tracked), so email_config.json can never be committed by accident.
Why a config file and not environment variables? Depending on how the worker process is launched — notably via Conductor on Windows — environment variables may not be inherited by the child process, causing silent send failures. The config file is read from a path relative to the script, so it works regardless of how the process was spawned. Environment variables (GMAIL_USER, GMAIL_APP_PASSWORD, EMAIL_TO, EMAIL_CAP) are still honored as a fallback when a key is absent from the config file, which is handy for CI or containerized runs. If neither source supplies credentials, the script exits with code 2 and prints setup instructions instead of failing silently.
To generate a Gmail App Password: Google Account → Security → 2-Step Verification → App Passwords. Create one for "Mail". This is not your normal account password. If you ever paste one into a source file by mistake, revoke it from that same screen.
The script reads data/ranked_jobs.md, caps the email to the top 15 ranked listings, sends it, and then deletes ranked_jobs.md so stale rankings are not recycled on the next run.
File Structure
skillmatch-mcp/
server.py # MCP server (stdio JSON-RPC)
requirements.txt # python-docx dependency
CLAUDE.md # Instructions for Claude
README.md # This file
email_ranked_jobs.py # Conductor worker: emails ranked job reports
cowork_monitor.py # Conductor worker: monitors Cowork VM, auto-recovers
cowork_tab.png # Reference image for Cowork tab UI automation
data/ # Entire folder gitignored except the two tracked files below
.gitkeep # Keeps the folder in git (tracked)
email_config.example.json # Credential template (tracked, no real secrets)
email_config.json # Your real Gmail credentials (gitignored)
profile.json # Created on first setup (gitignored)
applications.db # Created on first log (gitignored)
scouted_jobs.json # Scouted listings (gitignored)
ranked_jobs.md # Latest ranked report (gitignored)Available Tools
20 toolsadd_resumeB
Add a new resume variant to the profile. Each variant targets specific role types for automatic selection during fit analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Unique identifier for this variant (e.g. 'ai_eng') | |
| path | No | Absolute path to resume file (optional if text provided) | |
| text | No | Resume content as plain text/markdown (optional if path provided) | |
| label | Yes | Human-readable label (e.g. 'AI Engineering') | |
| role_types | Yes | List of role_type values this resume targets (e.g. ['ai_engineering', 'ml_engineering']) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It does not mention potential overwrites, required prerequisites (e.g., profile existence), side effects, or error conditions. The description is too sparse to inform safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant information. It front-loads the core action and then adds a brief justification for the role_types parameter. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description should clarify what the tool returns (e.g., success status, created variant). It also fails to explain the mutual exclusivity of 'path' and 'text' parameters (though the schema notes it). A creation tool requires richer context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds minimal meaning beyond the schema—it mentions 'each variant targets specific role types,' but the schema already describes role_types. No further parameter context is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Add a new resume variant to the profile.' It also explains the purpose of variants ('target specific role types for automatic selection during fit analysis'), distinguishing it from other resume-related tools like get_resume (view) and list_resumes (list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide guidance on when to use this tool versus alternatives (e.g., updating an existing variant or using list_resumes to view variants). No conditions or exclusions are mentioned, leaving the 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.
analyze_fitA
Gather all user data needed for job fit analysis. Accepts a job description, then internally fetches the user's portfolio (GitHub repos) and resume. Returns all three together in a structured bundle so Claude can reason about the fit. Does NOT perform the analysis itself.
| Name | Required | Description | Default |
|---|---|---|---|
| job_description | Yes | The full job description text to analyze against |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the main behavior (fetches portfolio and resume, returns bundle, no analysis) but lacks detail on side effects, auth needs, or latency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences efficiently convey purpose, input, internal operation, and what the tool does not do. No superfluous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers the tool's functionality for aggregating data. It could specify the return bundle structure more precisely, but given no output schema, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 100% schema coverage with a clear description. The tool description adds no new semantics beyond restating that it accepts a job description, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gathers user data (portfolio and resume) based on a job description and returns a bundle, explicitly distinguishing from siblings like get_portfolio and get_resume that fetch individually.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (for job fit analysis) and that it does not perform analysis, but does not explicitly list alternatives or when not to use. The mention of internal fetching suggests it is a convenience aggregator.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_application_patternsA
After 10+ applications, analyze the full history to find patterns: which role types get responses, which skills resonate, which red flags recur in silent roles, and recommended search adjustments. Uses Claude API internally.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses internal use of Claude API, which implies external calls, costs, and potential rate limits. It also describes what the tool does without hiding side effects. No destructive behavior is indicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the critical usage condition ('After 10+ applications'). Every clause adds value: the condition, the analysis scope, and the internal API usage. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and no output schema, the description provides a comprehensive overview of what the tool does and when to use it. It hints at the output by listing example patterns. However, it could specify the output format or any data structure more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, achieving 100% schema description coverage trivially. The description adds no parameter info because none are needed. Baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyzes full application history to find patterns in responses, skills, red flags, and recommended adjustments. It distinguishes itself from siblings like get_applications (which likely lists applications) and analyze_fit (specific job fit) by focusing on aggregate pattern analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly starts with 'After 10+ applications,' providing a clear precondition for use. It doesn't explicitly state when not to use it or compare to alternatives, but the context signal of sibling tools implies differentiation. The guidance is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_applicationsB
Return all tracked job applications, ordered by most recent first. Optionally filter by status.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status: applied, screening, interview, offer, rejected, ghosted (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It indicates read-only behavior and ordering, but does not disclose authorization needs, rate limits, or behavior when no results exist. This is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action and ordering, no wasted words. Highly concise while covering core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description covers the main purpose and filtering. However, it omits details about the return format (e.g., field set) and pagination, though these are less critical given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds 'Optionally filter by status', but this does not enhance beyond the schema's parameter description. Thus baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'tracked job applications', with ordering and optional filtering. However, it does not explicitly distinguish from sibling tools like 'get_scouted_jobs' or 'get_follow_ups', which have similar retrieval purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, nor are there any conditions or prerequisites mentioned. The description simply states functionality without contextual usage advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_follow_upsA
Return all applications where follow_up_due_date is today or earlier and status is still applied or screening. Shows what needs attention.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry behavioral disclosure. It correctly defines a read operation without side effects, but does not mention output format, pagination, or absence-of-results behavior. Adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundant words. Every part is informative: the action, the conditions, and the purpose ('shows what needs attention').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read with no params or output schema, the description covers the purpose and filtering. It lacks mention of return fields, but agents can infer from sibling tools. Minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, baseline is 4. The description adds value by explaining the filtering logic (date and status) beyond the empty schema, compensating for the lack of param details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'return', the resource 'applications', and includes specific filtering criteria (follow_up_due_date today or earlier, status applied/screening). It effectively distinguishes itself from sibling tools like 'get_applications' which lack this filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for viewing applications needing attention. While it doesn't explicitly state when not to use or offer alternatives, the context of sibling tools makes usage clear. A score of 4 reflects the lack of explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolioA
Fetch public GitHub repos for the user. Returns repo name, description, language, topics, last updated, homepage, and README content for each repo. Pass deep=true to also run a Haiku-powered analysis of each README, extracting stack, what it does, complexity, and notable achievements. Omit deep (or pass false) for the free metadata+README fetch. Only use deep=true when you explicitly need structured analysis and the user has authorized API spend.
| Name | Required | Description | Default |
|---|---|---|---|
| deep | No | If true, runs Haiku analysis on each README. Costs API tokens. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavior. It reveals that the operation reads public data, returns specific fields, and deep=true costs API tokens. Missing details on auth requirements, rate limits, or failure scenarios, but acceptable given the tool's simplicity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences), front-loaded with purpose, and every sentence provides essential information without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one non-required parameter, no output schema, and no annotations, the description covers the tool's functionality well—returns, deep mode behavior, cost implications. A minor gap: no mention of pagination or limit on number of repos returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (1 param, described in schema). The description adds value by explaining what deep=true does in detail (extracts stack, complexity, etc.) and when to use it, going beyond the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Fetch') and resource ('public GitHub repos for the user'), and is distinct from siblings like 'get_profile' (user profile) and 'read_repo' (single repo). It is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use deep=true ('when you explicitly need structured analysis and the user has authorized API spend') and when to omit it ('for the free metadata+README fetch'). However, it does not compare to sibling tools like 'read_repo', which might be more appropriate for a single repo.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileA
Read and return the saved user profile from data/profile.json.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description implies a read-only operation, but without annotations it does not elaborate on side effects, permissions, or error behavior. For a simple read, this is minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no parameters, the description sufficiently explains the tool's purpose, though it could mention the nature of the profile data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With no parameters, the schema covers everything. Baseline for 0 params is 4, and the description does not detract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads and returns the user profile from a specific file, distinguishing it from siblings like update_profile or get_portfolio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor any context or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resumeA
Read the user's resume file. Reads resume_path from the saved profile and returns the raw text content. Supports .txt, .md, and .docx files.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the source (resume_path from profile), return type (raw text), and supported formats. With no annotations, this transparency is good, though it omits potential failure modes (e.g., file not found).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no unnecessary words. The key points (read resume, source, return type, formats) are front-loaded. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description covers what the tool does, where it gets data, and what it returns. It is fully sufficient for an agent to understand and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so the description naturally adds meaning by explaining the data source (saved profile) and file formats. The baseline is 4 as there are no parameters to describe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads the resume file with a specific verb-resource combination. It distinguishes from siblings like get_profile (profile) and add_resume (adding) by focusing on reading the existing resume.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used to read the resume, but does not explicitly state when to use it versus alternatives (e.g., get_profile for profile info, add_resume for uploading). No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scouted_jobsB
Return all scouted job listings from scouted_jobs.json. Optionally filter to only unranked jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| unranked_only | No | If true, only return jobs where ranked is false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It indicates the tool reads from a JSON file and optionally filters, but does not disclose synchronous behavior, response format, or any side effects. Basic transparency for a read operation, but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The first sentence front-loads the main action, and the second adds the optional filter. Efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description adequately explains input but omits details about response structure or fields. For a simple read tool, it is minimally complete but lacks context about what data is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter, which already explains the filter. The description's 'Optionally filter to only unranked jobs' adds no new meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and resource 'scouted job listings', making the tool's purpose evident. However, it does not explicitly distinguish it from sibling tools like 'save_scouted_job' or 'mark_jobs_ranked', which could cause confusion about when to use this read-only tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It lacks any context about prerequisites, appropriate scenarios, or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_resumesA
Return all stored resume variants with their labels and target role types.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
States the read operation and what is returned (labels, target role types) but lacks details on side effects, permissions, or output structure since no annotations and no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no wasted words, directly conveys the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficient for a zero-parameter list tool, though lacking output schema details; no mention of ordering or filtering, but not required for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so schema coverage is 100%. The description adds meaning by indicating the returned fields (labels and target role types) beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'Return' and resource 'all stored resume variants', clearly distinguishing from siblings like get_resume (singular) and add_resume (creation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternatives mentioned, but the simplicity and zero parameters make it obvious that it's for listing all resumes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_applicationB
Log a job application to the tracking database. Creates the database if it does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Job listing URL (optional) | |
| role | Yes | Role title | |
| notes | No | Any notes about the application (optional) | |
| salary | No | Salary or compensation info (optional) | |
| status | No | Application status | applied |
| company | Yes | Company name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses the database creation side effect, but lacks details on permissions, idempotency, duplicate handling, or response behavior. Insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundancy, front-loaded with the primary action. Efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters and no output schema, description is too sparse. Missing return value, error conditions, and success/failure indicators. For a creation tool, more completeness expected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3. Description adds no extra meaning beyond schema descriptions. No clarification of parameter dependencies or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('log a job application') and the resource ('tracking database'), with a specific verb. It distinguishes from sibling tools like 'update_application' (update vs create) and 'get_applications' (read vs create).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies use for logging new applications, but no explicit when-to-use or when-not-to-use. No alternatives mentioned despite many sibling tools. Side effect of database creation is mentioned but lacks guidance on prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_jobs_rankedA
Mark all unranked scouted jobs as ranked. Returns the count of jobs marked.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It indicates a mutation (marking) and returns count, but lacks details on irreversibility, permissions, effects on already-ranked jobs, or potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The main action and return value are front-loaded. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no parameters and no output schema, the description is largely complete. It specifies scope (all unranked scouted) and output. Minor gap: no mention of idempotency or side effects, but acceptable for this simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. The description adds value by stating the return type (count), which is not in any schema. Baseline 4 for 0 parameters is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (mark as ranked), the resource (all unranked scouted jobs), and the output (count). It distinguishes from sibling tools like save_scouted_job (individual) and get_scouted_jobs (retrieval).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It implies usage after scouting jobs, but does not mention prerequisites, conditions, or other options (e.g., marking individual jobs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_jdA
Parse a job description into structured signal: hard requirements, nice-to-haves, responsibilities, red flags, compensation signals, role type, experience level, and domain. Uses Claude API internally. Returns structured JSON for better fit reasoning.
| Name | Required | Description | Default |
|---|---|---|---|
| job_description | Yes | The full job description text to parse |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that it uses Claude API internally, but does not mention side effects, authentication needs, or rate limits. The return format (structured JSON) is stated, but behavioral boundaries are not fully covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence lists output fields, the second explains internal API and purpose. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers return values by listing structured fields. It mentions internal API usage. It could improve by noting input size limits or error handling, but is largely complete for a parse tool with one parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one parameter. The description adds 'the full job description text', but this does not go beyond the schema description. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'parse' and the resource 'job description', listing specific structured outputs (hard requirements, nice-to-haves, responsibilities, etc.). This distinguishes it from sibling tools like 'analyze_fit'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for extracting structured signals before fit analysis, but lacks explicit when/when-not guidance or alternatives. No mention of when not to use this tool vs. siblings like 'analyze_fit'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purge_dead_listingsA
Checks every scouted job URL for liveness and removes expired or unavailable postings from scouted_jobs.json. Detects dead listings via HTTP 404/410 status codes and known closure phrases in page content (e.g. 'no longer accepting applications'). Connection errors and 5xx responses are treated as 'keep' to avoid false positives. Pass dry_run=true to preview what would be removed without actually deleting anything.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | If true, check URLs but do not modify scouted_jobs.json. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It clearly states the tool modifies scouted_jobs.json (destructive), explains detection logic, and notes that connection errors/5xx are kept. It also describes the dry_run safety mechanism. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences efficiently cover purpose, logic, and dry_run. Front-loaded with main action, no fluff. Every sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description explains return behavior (modification or dry-run preview). Covers detection logic, error handling, and parameter use. Complete for a cleanup tool with simple I/O.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes dry_run as boolean to check without modifying. Description adds value by explaining what dry_run does: preview removals without deletion. With 100% schema coverage, baseline is 3, but the additional clarity raises it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool checks job URLs for liveness and removes expired/unavailable postings from scouted_jobs.json. It specifies the action (purge), resource (dead listings), and format (scouted_jobs.json). It distinguishes itself from siblings like get_scouted_jobs (read-only) and save_scouted_job (add).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description provides clear context for when to use: to clean up dead listings from scouted jobs. It details detection methods (HTTP status codes, closure phrases) and warns about false positives (keeping on 5xx/errors). It also introduces dry_run for preview. However, it does not explicitly state when not to use or name alternatives, though the context implies it's for maintenance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_repoA
Analyzes a local code repository and extracts structural information: detected languages, tech stack (frameworks/libraries from imports), entry points, key modules (classes and functions), and architecture shape. Returns raw structured JSON for Claude to interpret — no API calls, pure local analysis using AST for Python files and regex for JS/TS. Use this to understand a candidate's project before analyzing job fit, or to supplement get_portfolio with deeper technical signal from local repos.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the local repository root directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully discloses behavior: it's a local analysis using AST for Python and regex for JS/TS, makes no API calls, and returns raw JSON. It doesn't mention side effects or restrictions, but the tool is read-only by nature, and the description is honest about its methods.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, followed by technical approach, then usage recommendation. Every sentence adds value without redundancy. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a single required parameter and no output schema. The description explains what the tool returns (raw structured JSON) and its limitations (no API calls). It covers all necessary context for an agent to understand when to invoke this tool and what it does.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for path. The tool description reinforces that the path is a local repository root directory but adds no new semantic depth beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Analyzes a local code repository' and specifies the resource (local repo) and the scope: structural information, languages, tech stack, entry points, modules. It distinguishes from siblings like get_portfolio by noting it provides 'deeper technical signal' and is 'pure local analysis'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells when to use: 'before analyzing job fit' and to supplement get_portfolio. While it doesn't list when not to use, the provided use cases and sibling tools implicitly guide an agent, and it mentions an alternative (get_portfolio). Exclusions are not explicit but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_scouted_jobA
Save a scouted job listing to the tracked scouted_jobs.json file. Validates the URL to ensure it is a DIRECT link to a specific job posting (e.g. indeed.com/viewjob?jk=..., greenhouse.io/.../jobs/...) and rejects search result page URLs (e.g. indeed.com/q-..., builtin.com/jobs/...). Also deduplicates against existing scouted jobs and applications. Returns {saved: true/false, reason: '...'} with clear feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Direct URL to the specific job posting. Must be a direct link, NOT a search results page. For Indeed use indeed.com/viewjob?jk=JOBKEY or indeed.com/cmp/COMPANY. For Greenhouse use job-boards.greenhouse.io/company/jobs/ID. | |
| role | Yes | Job title / role name | |
| remote | No | Whether the position is remote | |
| salary | No | Salary or compensation range (optional) | |
| source | No | Where the listing was found (e.g. indeed.com, greenhouse.io) | |
| company | Yes | Company name | |
| location | No | Job location |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: URL validation, deduplication against scouted jobs and applications, and return format. There is no ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. Each sentence adds information: saving, validation, deduplication, and return feedback. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers validation, deduplication, and return values. Without an output schema, it explains the return format. It is nearly complete, though it could mention side effects like overwriting the file.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions. The tool description adds significant value by specifying acceptable URL patterns and validation logic beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool saves a scouted job listing and validates the URL. It distinguishes from siblings like log_application or get_scouted_jobs by specifying the action of saving with validation and deduplication.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not explicitly state when to use it versus alternatives like log_application. It implies use for tracking job listings but lacks comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsA
Build an optimized job search query. Accepts a free-text query and combines it with the user's saved profile (target roles, salary floor, remote preference) to construct a search query string. Returns the query for Claude to use with web search tools. Does NOT perform the search itself.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Free-text search query or keywords to include |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses that the tool does not perform the search and that it reads user profile data to combine with the query. However, it does not mention any side effects, permissions required, or limits (e.g., rate limits).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with four sentences, each earning its place: purpose, input, output, and what it does not do. No wasted words, and the key action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 and no output schema, the description fully covers what the tool does, its inputs, output, and limitations. An agent can correctly select and invoke it without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'query' is fully described in the schema ('Free-text search query or keywords to include'). The description adds context about combining with saved profile, but this does not significantly enhance understanding beyond the schema. Schema coverage is 100%, so baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool builds an optimized job search query by combining a free-text query with the user's saved profile. It specifies the verb 'build' and the resource 'job search query'. While it does not explicitly differentiate from siblings, the function is unique as a query builder for web search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use it (for constructing a search query) and explicitly states what it does not do ('Does NOT perform the search itself'). It provides context for using the output with web search tools. However, it does not discuss alternatives or 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.
setupB
Onboard the user by collecting their job search profile. Captures: name, current_role, target_roles (list), salary_floor (integer), remote_only (bool), location, dealbreakers (list), github_url, resume_path. If a profile already exists, the 'confirm_overwrite' parameter must be true to replace it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full name | |
| location | Yes | Current location or preferred location | |
| github_url | Yes | GitHub profile URL (e.g. https://github.com/username) | |
| work_style | No | Work style preferences | |
| remote_only | Yes | Whether the user only wants remote positions | |
| resume_path | No | Absolute path to resume file (.txt, .md, or .docx). Optional if resume_text is provided. | |
| resume_text | No | Resume content as plain text or markdown. Use this instead of resume_path for portability. | |
| current_role | Yes | Current job title or situation | |
| dealbreakers | Yes | List of dealbreakers (things the user will not accept) | |
| linkedin_url | No | Public LinkedIn profile URL for supplemental work history (optional) | |
| salary_floor | Yes | Minimum acceptable salary (integer) | |
| target_roles | Yes | List of roles the user is targeting | |
| optimizing_for | No | What the candidate prioritizes: comp, growth, stability, remote, interesting_problems, autonomy | |
| unlisted_skills | No | Skills the candidate has but aren't formalized on resume | |
| confirm_overwrite | No | Must be true to overwrite an existing profile | |
| developing_skills | No | Skills actively being learned -- signals trajectory | |
| dealbreaker_detail | No | Detailed dealbreakers with hardness levels and notes | |
| rejection_patterns | No | Types of roles that looked good but weren't, and brief reason why |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must fully convey behavior. It mentions capturing profile and overwrite guard, but does not disclose side effects (e.g., creation vs. overwrite, reversibility, authentication needs, or rate limits).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with front-loaded purpose. No wasted words, efficient communication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has 18 parameters, nested objects, and no output schema. Description is brief, omitting return values, behavior after setup, and any post-conditions. Incomplete for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description only highlights a subset of parameters and adds context for confirm_overwrite (must be true to overwrite). Does not fully compensate for the high parameter count.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it's for onboarding by collecting a job search profile. Lists key fields and overwrite behavior. Distinguishes from sibling tools like get_profile (read-only) and update_profile (modification).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies use for initial setup, mentions overwrite condition, but lacks explicit guidance on when to use this vs. alternatives like update_profile for edits. No when-not-to indications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_applicationB
Update an existing application by ID. Accepts any subset of fields: status, notes, follow_up_due_date, response_received, outcome. Automatically updates last_activity_date.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Application ID to update | |
| notes | No | ||
| status | No | New status: applied, screening, interview, offer, rejected, ghosted | |
| outcome | No | ||
| response_received | No | ||
| follow_up_due_date | No | ISO date (YYYY-MM-DD) for follow-up reminder |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes that last_activity_date is automatically updated, which is useful behavioral context. However, for a mutation tool with no annotations, it lacks details on return values, idempotency, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the main purpose and add a behavioral note. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description should cover more context, such as return format, required permissions, or input constraints. The auto-update mention is helpful but insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description lists the updatable fields but adds no additional meaning beyond what the schema already provides. With 50% schema coverage, the description should elaborate on parameter usage or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing application by ID, distinguishing it from sibling read tools like get_applications and create tools like log_application.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., when to update vs. create). It simply describes the action without context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profileA
Update the user's profile with new or changed fields. Accepts any subset of profile fields and merges them into the existing profile.json without requiring a full re-setup. Useful for adding unlisted_skills, updating dealbreaker_detail, or changing any field.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| location | No | ||
| github_url | No | ||
| work_style | No | ||
| remote_only | No | ||
| resume_path | No | ||
| current_role | No | ||
| dealbreakers | No | ||
| salary_floor | No | ||
| target_roles | No | ||
| optimizing_for | No | ||
| unlisted_skills | No | ||
| developing_skills | No | ||
| dealbreaker_detail | No | ||
| rejection_patterns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It correctly states the merge semantics, but does not disclose potential side effects, permissions, or return value behavior, which is a gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the verb and resource, and each sentence adds value. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the complexity of 15 parameters nested objects and no annotations or output schema, the description is minimal. It does not explain return values, error handling, or how the merge interacts with existing data, leaving significant gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage and 15 parameters including nested objects, the description only mentions two example fields ('unlisted_skills', 'dealbreaker_detail'). It adds the merge behavior but does not explain the meaning or constraints of the many other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update the user's profile' with a specific verb and resource, and distinguishes from siblings like 'get_profile' and 'setup' by highlighting the merge behavior without full re-setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the tool accepts any subset of fields and merges them, implicitly distinguishing it from read tools and full setups. It provides concrete examples like 'unlisted_skills' and 'dealbreaker_detail', but lacks explicit when-not-to-use guidance.
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.
20 tool updates
v1.0.2- First observed
add_resume - First observed
analyze_fit - First observed
get_application_patterns - First observed
get_applications - First observed
get_follow_ups - First observed
get_portfolio - First observed
get_profile - First observed
get_resume - First observed
get_scouted_jobs - First observed
list_resumes - First observed
log_application - First observed
mark_jobs_ranked - First observed
parse_jd - First observed
purge_dead_listings - First observed
read_repo - First observed
save_scouted_job - First observed
search_jobs - First observed
setup - First observed
update_application - First observed
update_profile
TDQS
Scored across 20 tools
Each tool serves a distinct purpose with clear boundaries: profile management, application tracking, resume handling, portfolio analysis, job scouting, and utility functions. No two tools overlap significantly; descriptions are detailed enough to prevent confusion.
All tool names follow a consistent verb_noun pattern in snake_case, e.g., get_profile, search_jobs, update_application. The only slight deviation is 'setup', but it still reads as a clear action. No mixing of conventions.
With 20 tools, the server is on the higher side of reasonable for a comprehensive job search assistant. The count covers profile, resume, portfolio, application, and scouting workflows without being excessive. Slightly over the ideal 3-15 range but still well-scoped.
The tool set covers most CRUD operations for key entities: profile, applications, scouted jobs, and resumes. Minor gaps like explicit delete operations for applications or resume variants exist, but agents can work around them using update or other means. The domain is well-covered.
Maintenance
Related MCP Connectors
Analyze job listings against your resume, track applications, and generate cover letters.
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
Job application tracker for developers - AI agents write over MCP, you review in a dashboard.
AI resume triage for recruiters. Query your candidate pool from Claude or ChatGPT.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceHelps job seekers tailor their resume and generate cover letters against a specific job posting, powered by Claude.-
- FlicenseNot gradedqualityCmaintenanceEnables running a job search with Claude Code: parses CV, discovers roles, fetches exact application fields, drafts non-trivial applications (positioning, not autofill), and renders an offline dashboard for review.-
- FlicenseBqualityCmaintenanceEnables searching justjoin.it for job listings and tracking applications locally with status updates, all via natural language in Claude.4-
- AlicenseAqualityCmaintenanceA privacy-first MCP server for locally managing job, fellowship, and graduate-school applications. It offers tools for tracking application status, analyzing role fit, generating LaTeX CV/cover letters, interview prep, and discovering public jobs from ATS APIs.81MIT