CareerBot
Tracks prepared and submitted job applications in Airtable using a least-privilege PAT; expected tables and fields are defined in a schema.
Offers an injectable Gmail adapter through the Google integration for email-related capabilities.
Provides optional Google API adapters, including Gmail and Calendar, for use in job application workflows.
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., "@CareerBotScore this job description against my Master CV and draft a tailored resume."
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.
Visit the live CareerBot website
CareerBot
CareerBot is an open-source Python and MCP toolkit for scoring job fit, preparing verified application artifacts, preserving immutable evidence, and tracking application state. It is designed for bounded sessions and explicit handoffs, not unattended job-board automation.
What it does
Normalizes, ranks, and deduplicates jobs supplied manually or through permitted adapters.
Scores fit against a private, hash-verified Master CV using xAI's Responses API.
Generates role positioning, tailored LaTeX resumes, and concise cover letters.
Enforces deterministic ATS, claim-provenance, and one-page PDF checks.
Saves immutable application snapshots with SHA-256 manifests.
Tracks prepared and submitted applications locally and optionally in Airtable.
Exposes 12 focused tools through local stdio or authenticated remote MCP.
Related MCP server: CoverAI MCP Server
What it deliberately does not do
It does not ship LinkedIn, JobsDB, JobThai, or other job-board scraping connectors.
It does not ship a default portal submission connector.
It never bypasses CAPTCHA, MFA, identity checks, consent, declarations, or access controls.
It does not treat generated or proposed projects as completed experience.
Architecture
Workflow
Quick start
Requirements: Python 3.12+, uv, and Tectonic for PDF rendering.
git clone https://github.com/Sai21112000/CareerBot.git
cd CareerBot
uv sync --extra dev
cp .env.example .env
cp data/master_resume.tex.example data/master_resume.tex
cp AGENTS.md.example AGENTS.md
chmod 600 .env data/master_resume.tex AGENTS.md
uv run careerbot --helpReplace every [VERIFIED ...] marker in data/master_resume.tex. Put supporting .tex, .txt,
or .md sources under the ignored data/master_cv/ directory. CareerBot treats those private
sources as the factual boundary for generated claims.
At minimum, model-backed commands need:
CAREERBOT_XAI_API_KEY=
CAREERBOT_XAI_MODEL=grok-4.6Optional Airtable tracking uses CAREERBOT_AIRTABLE_PAT and
CAREERBOT_AIRTABLE_BASE_ID. Keep credentials in .env or an operating-system secret store.
CLI
uv run careerbot triage --input examples/jobs.json --max-jobs 10
uv run careerbot --profile review apply --job examples/job.json
uv run careerbot --profile review batch-apply --queue examples/review_queue.json
uv run careerbot follow-up sync --limit 20
uv run careerbot reconcile --limit 50
uv run careerbot verify-snapshot snapshots/<snapshot-id>triageperforms local heuristic ranking and deduplication. LLM fit scoring is available through the MCPscore_jobtool and theapplypreparation path.applyscores, drafts, validates, compiles, snapshots, and records a prepared local application.batch-applyrepeats preparation within configured count and time limits, skipping known keys.follow-up synccurrently lists due local records; it does not send messages.reconcilecurrently reports local record and Airtable configuration readiness.verify-snapshotchecks artifact sizes and SHA-256 hashes against the manifest.
Execution profiles
dry_run: intended for local inspection and simulation.review: prepares local artifacts while requiring review before external actions.auto: reserved for explicitly authorized connectors that have passed supervised qualification.
The project is alpha: profiles are not yet a centralized authorization layer for every local write.
apply creates a local snapshot and CSV record in every profile. No shipped command submits to a
job portal. Treat auto as unavailable until you provide and qualify an authorized connector.
Shared hard stops apply regardless of profile: CAPTCHA, MFA, identity verification, consent, declarations, ambiguous answers, restricted platforms, and unsupported connectors.
Configure conservative limits:
CAREERBOT_MAX_JOBS_PER_RUN=20
CAREERBOT_MAX_APPLICATIONS_PER_RUN=5
CAREERBOT_MAX_RUN_MINUTES=30Agent runbooks
The optional .agent/ layer contains a career-positioning consultant, resume-family classifier,
and bounded runbooks for strategy refresh, daily triage, batch preparation, follow-up review, and
status reconciliation. These are operator instructions, not a claim that every step is implemented
as an unattended Python workflow. Configure private constraints in ignored AGENTS.md.
MCP
The committed .mcp.json starts a local stdio server in Cursor:
uv run careerbot-mcpThe server exposes:
Strategy:
consult_career_positioning,save_career_strategy,get_career_strategyJobs:
search_jobs,score_jobArtifacts:
tailor_resume,generate_cover_letter,save_application_snapshot,verify_snapshotTracking and policy:
track_application,submission_hard_stops,assess_submission
For a remote MCP client, run Streaming HTTP behind an HTTPS reverse proxy:
CAREERBOT_MCP_TRANSPORT=streamable-http \
CAREERBOT_MCP_HOST=127.0.0.1 \
CAREERBOT_MCP_PORT=8000 \
CAREERBOT_MCP_AUTH_TOKEN='<strong-random-token>' \
uv run careerbot-mcpThe local endpoint is http://127.0.0.1:8000/mcp. Configure the remote client with the public
HTTPS /mcp URL and the same bearer token. Allowlist only required tools. The included static
token verifier is suitable for development; use an OAuth/JWT provider for production.
Integrations
xAI / Grok: model-backed strategy, scoring, resume tailoring, and cover-letter generation.
Airtable: optional application tracking through a least-privilege PAT. Expected tables and fields are documented in
data/airtable_schema.json.Tectonic: local LaTeX compilation and one-page validation.
Google APIs: injectable Gmail and Calendar adapters are available through the
googleoptional dependency. They are library extensions, not complete CLI synchronization commands.
Install Google dependencies with:
uv sync --extra googlePrivate data
These paths are intentionally ignored:
.envand OAuth credentialsAGENTS.mdResume/data/master_resume.texanddata/master_cv/data/applications_log.csvcareer-strategy drafts and snapshots
application snapshots and active platform queues
Public templates are provided as AGENTS.md.example, data/master_resume.tex.example, and
data/applications_log.csv.example. Never force-add ignored private files.
Repository layout
src/job_agent/: typed domain models, CLI, scoring, strategy, validation, tracking, and policy.mcp_servers/job_agent/: FastMCP composition root and tool adapters..agent/: optional agent definitions, skills, and bounded workflow runbooks.examples/: fictional job inputs and command examples.data/: public templates and integration schemas; private runtime files are ignored.workspaces/: per-platform instructions; active queues and logs are ignored.tests/: offline unit and integration-contract tests.
Current limitations
Discovery requires caller-supplied jobs, parsed alerts, or a permitted adapter.
There is no shipped portal submission connector.
Google adapters are not wired into CLI follow-up synchronization.
CLI reconciliation reports readiness; it does not yet perform full remote-to-local convergence.
Execution profiles are an operator contract, not a centralized authorization system for every local write.
The project is alpha and should begin with fictional inputs and development credentials.
Development
uv sync --extra dev
uv run pytest
uv run ruff check .
uv run mypy src/job_agent mcp_servers
uv buildLicense
CareerBot is released under the MIT License.
Available Tools
12 toolsassess_submissionAssess SubmissionC
Decide whether an application can use an authorized automatic connector.
| Name | Required | Description | Default |
|---|---|---|---|
| source_url | Yes | ||
| mfa_required | No | ||
| captcha_present | No | ||
| ambiguous_questions | No | ||
| identity_verification_required | No | ||
| consent_or_declaration_required | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It does not state whether the tool fetches or inspects source_url, whether it only evaluates the provided boolean flags, or what side effects or checks occur. The term 'authorized' also implies some permission model that is never explained.
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 sentence with no filler, and the core purpose is front-loaded. However, brevity is achieved by omitting needed context, so it is concise but not optimally structured for guidance.
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 six-parameter decision tool with no annotations, this description is incomplete: it does not explain how the inputs combine into a decision, when to call the tool, or what the decision is based on. The output schema reduces the need for return-value text, but the input semantics and workflow context remain undefined.
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 0%, and the description mentions none of the six parameters. The agent is left to infer the meaning of source_url, mfa_required, captcha_present, ambiguous_questions, identity_verification_required, and consent_or_declaration_required solely from their names, which is insufficient for a decision tool.
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 a specific verb ('Decide') and names the assessed resource ('an application'/'authorized automatic connector'), so the core function is identifiable. However, it does not differentiate from sibling tools like submission_hard_stops or verify_snapshot, and the phrase 'authorized automatic connector' is jargon that is not explained.
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 about when to use this tool versus alternatives such as submission_hard_stops, verify_snapshot, or track_application. The description only states what the tool does, without prerequisites, exclusions, or workflow context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consult_career_positioningConsult Career PositioningA
Generate a CV-grounded career strategy for review without saving it.
| Name | Required | Description | Default |
|---|---|---|---|
| market_context | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It explicitly states the key non-persistence behavior ('without saving it'), which is the most important trait an agent needs to know. It does not mention other potential side effects, but for a consult-only generation tool this is reasonably transparent.
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, front-loaded sentence that communicates the action, resource, basis, and side-effect boundary without wasted words. Every phrase 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?
For a tool with one optional parameter and an output schema, the description covers the core purpose and side-effect. The only notable gap is that market_context is not explained, but since it is optional and the tool is low-complexity, the description is still largely 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?
Schema description coverage is 0%, so the description needs to compensate by explaining how market_context affects the output. It does not mention the parameter at all. The agent is left to infer from the property name alone what content should go in market_context.
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 a specific verb ('generate') and resource ('career strategy'), clarifies the grounding ('CV-grounded'), and states the purpose ('for review') and side-effect boundary ('without saving it'). This clearly distinguishes it from siblings like save_career_strategy and get_career_strategy.
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 conveys the intended context: use this when you want a career strategy to review, not one to persist. It does not explicitly name the save_career_strategy sibling or state exclusions, but the 'without saving it' phrasing gives a clear enough usage boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_cover_letterGenerate Cover LetterB
Generate a concise cover letter grounded in the tailored resume.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | ||
| tailored_resume_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 behavioral disclosure. It states the action (generate a cover letter) but does not disclose whether this is a read-only operation, whether it has side effects (e.g., saving anything), what the output looks like, or any constraints such as length or format beyond 'concise'. The description provides minimal behavioral information beyond the tool's basic purpose.
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 sentence that is front-loaded with the action ('Generate'), the object ('cover letter'), and the key constraint ('grounded in the tailored resume'). There is zero waste; every word contributes to the agent's understanding of the tool's core function.
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 nested object parameter ('job') with no schema description, no annotations, and no guidance on its structure or required fields. While the output schema exists, the description does not explain how to construct the input or what the return value will be. The description lacks critical context for an agent to call the tool correctly, especially given the workflow context with siblings like tailor_resume and save_application_snapshot.
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 0%, so the description must compensate by explaining the parameters. It mentions 'tailored_resume_text' indirectly ('grounded in the tailored resume') but does not define what 'job' should contain, what its structure is, or how it is used. The 'job' parameter is an open-ended object with no guidance, leaving the agent to guess what fields are required. The description adds only marginal clarity for one parameter and none for the other.
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 a specific verb ('Generate') and resource ('concise cover letter'), and clearly ties it to the tailored resume. This distinguishes it from sibling tools like tailor_resume (which generates a resume, not a letter) and search_jobs (which searches jobs). The purpose is unambiguous and actionable.
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 phrase 'grounded in the tailored resume' implicitly indicates that a tailored resume must exist first, suggesting a workflow dependency on a tool like tailor_resume. However, it does not explicitly state when to use this tool vs. alternatives, nor does it mention any exclusions or prerequisites beyond the resume. The usage guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_career_strategyGet Career StrategyA
Return the currently approved downstream career strategy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Return' implies a read operation, and 'currently approved' suggests stateful retrieval rather than recomputation. However, there is no disclosure of side effects, failure behavior, or what happens when no approved strategy exists.
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?
A single sentence with no filler or redundancy. The core action and resource are front-loaded, and every word contributes meaning.
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 zero-parameter getter with an output schema, the description is nearly sufficient. It identifies the resource clearly, though it leaves the meaning of 'downstream' and the relationship to sibling tools slightly implicit.
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, so the baseline of 4 applies. The description adds no parameter information, but none is needed because there is nothing to configure.
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 a specific verb ('Return') and names a concrete resource ('currently approved downstream career strategy'). It is clearly distinct from save_career_strategy and consult_career_positioning, though it does not explicitly name or contrast any sibling.
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 phrase 'currently approved downstream career strategy' implies this is the read-only retrieval step before downstream career actions, but no explicit when-to-use, when-not-to-use, or alternative guidance is provided. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_application_snapshotSave Application SnapshotC
Compile and atomically save a complete immutable application package.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | ||
| changes | Yes | ||
| resume_tex | Yes | ||
| cover_letter | Yes | ||
| score_report | Yes | ||
| source_hashes | Yes | ||
| prompt_versions | Yes | ||
| submitted_answers | No | ||
| resume_version_note | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It does disclose valuable behavior: the save is 'atomic' and the package is 'immutable'. This goes beyond a plain 'saves data' statement. However, it does not explain side effects such as overwriting, validation behavior, authentication requirements, or what happens on failure, leaving important behavioral gaps.
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, efficient sentence with the key action ('Compile and atomically save') front-loaded. Every word earns its place and there is no fluff. It sacrifices completeness for conciseness, but structurally it is clean and readable.
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?
This is a high-complexity tool with 9 parameters, 8 required, nested objects, and no annotations. The description only communicates atomicity and immutability. It omits when to invoke the tool, what constitutes a complete package, and how the many required fields interrelate. The output schema reduces the need to describe return values, but the input side remains under-described for safe invocation.
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 0%, and the description names none of the 9 parameters. Saying 'complete' only repeats the fact that most fields are required, which is already evident from the schema. The description provides no extra meaning for fields like source_hashes, prompt_versions, or submitted_answers, so the agent is left entirely to the bare 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 names a specific verb ('save') and resource ('application snapshot' / 'application package'), and adds meaningful qualifiers ('complete', 'immutable', 'atomically'). This distinguishes it from generic save operations)Skip. However, it does not explicitly contrast it with sibling tools like verify_snapshot, so the differentiation is implicit rather than explicit.
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. There is no mention of the application pipeline, prerequisites, or how this relates to sibling tools like verify_snapshot, tailor_resume, or generate_cover_letter. The intended usage context is only implied by the name and the phrase 'complete application package'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_career_strategySave Career StrategyC
Save an explicitly reviewed strategy and an immutable snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| strategy | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It does add useful information: the strategy should be explicitly reviewed and the snapshot is immutable. However, it does not disclose whether existing strategies are overwritten, what side effects occur, or whether special permissions are needed.
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, front-loaded sentence with no wasted words. It is efficient, though it is so brief that some necessary detail is missing.
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 mutation tool with one nested object parameter, no annotations, and similar sibling tools, this description is incomplete. It does not explain the expected strategy structure, the meaning of 'immutable snapshot' in practice, or the circumstances under which saving is appropriate.
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 0%, so the description must compensate for the undocumented 'strategy' parameter. It only adds the vague qualifier 'explicitly reviewed' and does not explain what fields or shape the strategy object should have, making it hard for an agent to construct valid input.
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 names a specific verb ('save') and resource ('career strategy' and 'immutable snapshot'), so an agent can tell what the tool operates on. However, it does not distinguish itself from the sibling tool save_application_snapshot, which is similar in action.
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 phrase 'explicitly reviewed' hints that the strategy must be reviewed before saving, but there is no direct statement of when to use this tool versus alternatives such as get_career_strategy or save_application_snapshot. No exclusions or selection criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_jobScore JobB
Score one job against the verified master resume.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | ||
| company | Yes | ||
| job_url | No | ||
| location | No | ||
| description | Yes | ||
| sponsorship | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does not say whether scoring persists state, what side effects occur, what the returned score represents, or whether any preconditions (e.g., a verified master resume must already exist) are required. 'Score... against' names the behavior but leaves important traits unspecified.
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 front-loaded sentence with no filler or repetition. Every word—'Score', 'one job', 'verified master resume'—contributes to the operative meaning.
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 presence of an output schema reduces the need to explain return values, and the input schema defines the shape of the job. However, the description still omits whether a master resume must be prepared beforehand, whether the score is saved anywhere, and what distinguishes this from assess_submission, so it is only minimally 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 schema's description coverage is 0%, and the description adds no parameter-specific meaning. Although property names (company, role, description, job_url, location, sponsorship) are somewhat self-explanatory and the required fields are visible, the description does not compensate for the lack of schema documentation.
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 states a specific action ('Score') on a specific object ('one job') and adds the distinctive reference point ('verified master resume'). It is clear and meaningfully distinct from siblings like search_jobs and tailor_resume; however, it does not explicitly differentiate itself from assess_submission or save_application_snapshot.
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?
'Score one job against the verified master resume' implies this tool is for evaluating a single job posting against the stored master resume, but it gives no explicit when-to-use/when-not-to-use guidance or alternative sibling recommendation. Usage is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsSearch JobsC
Normalize, rank, and deduplicate permitted supplied job data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| manual_jobs | No | ||
| email_alerts | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden of behavioral disclosure, but it only names three high-level transformations. It leaves 'permitted' undefined and says nothing about ranking criteria, filtering behavior, mutation, or how the query parameter is used.
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 efficient sentence that front-loads the main action verbs and avoids repetition. The terseness hurts completeness rather than conciseness, so this dimension remains relatively strong.
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 four-parameter tool with no annotations and zero schema descriptions, this description is too thin. The output schema may cover return shape, but an agent still lacks understanding of query semantics, the meaning of 'permitted', and how ranking or deduplication behaves.
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 0%, so the description needed to compensate for the four parameters, but it does not. The vague 'supplied job data' may allude to manual_jobs and email_alerts, but query and limit receive no explanatory treatment at all.
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 provides specific verbs ('normalize, rank, and deduplicate') and identifies the resource ('permitted supplied job data'), so an agent can tell this tool processes provided job data rather than performing a generic search. It does not explicitly distinguish itself from siblings like score_job, but the core action is clear enough.
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 phrase 'supplied job data' weakly implies this tool is for user-provided job payloads rather than a broad external search, giving some context. However, it offers no explicit when-to-use guidance, exclusions, or alternatives among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submission_hard_stopsSubmission Hard StopsA
Return conditions that always require a manual handoff.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 behavioral disclosure. The verb 'Return' implies a non-mutating query, and the phrase 'always require a manual handoff' clarifies that it does not perform the handoff itself. Still, it does not elaborate on behavior such as whether the list is static or context-dependent.
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 focused sentence with no filler. It delivers the core meaning immediately and is appropriately sized for the tool's simplicity.
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 nullary tool with an output schema, the description is adequately complete. It names the resource and the key concept (manual handoff), so an agent can decide whether to call it. Minor ambiguity about what 'manual handoff' encompasses is tolerable given the output schema likely clarifies the returned structure.
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 tool has zero parameters and the schema fully covers this by defining an empty object. A baseline of 4 applies because there are no parameter semantics for the description to add.
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 a specific verb ('Return') and a clear resource ('conditions that always require a manual handoff'). It clearly explains what the tool does, though it does not explicitly distinguish itself from siblings like assess_submission.
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 intended use is implied: an agent would call this when it needs to know which conditions force a manual handoff. However, there is no explicit statement of when to use it versus alternatives, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tailor_resumeTailor ResumeC
Tailor the master LaTeX resume and enforce all deterministic rules.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It indicates that the tool modifies a resume and applies deterministic rules, but it does not disclose side effects, persistence, file system changes, failure conditions, or what the 'deterministic rules' actually are.
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 concise sentence and front-loads the main purpose. It is not bloated, though the vague 'enforce all deterministic rules' phrase adds limited concrete value despite taking up space.
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 is too thin for an unannotated tool with a nested required parameter and a vague behavioral claim. It omits what the 'job' object should contain, what the tool returns, and what effects invoking it has. The presence of an output schema does not compensate for missing invocation and behavior guidance.
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 schema description coverage is 0%, and the description does not mention the single required 'job' parameter at all. The description provides no meaning for what the job object should contain or how it affects the tailoring process, so there is no compensation for the schema's lack of documentation.
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 identifies the action ('Tailor') and the resource ('master LaTeX resume'), and it is distinct enough from sibling tools like generate_cover_letter. However, it never explicitly differentiates itself from other resume-related workflow tools, and the phrase 'enforce all deterministic rules' is vague.
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, no prerequisites, and no exclusions. It only vaguely implies that the tool is for tailoring a resume for a job, but it does not explain what inputs or state are required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_applicationTrack ApplicationC
Upsert an application in Airtable when configured and in the CSV backup.
| Name | Required | Description | Default |
|---|---|---|---|
| record | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the core write behavior ('Upsert'), the persistence targets (Airtable and CSV backup), and a conditional ('when configured'). It does not however explain what happens when configuration is absent, whether the operation is idempotent beyond the word 'upsert', or what side effects occur on existing records.
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 sentence with no filler, which is appropriately concise. It front-loads the main action and includes the key storage targets, though the ambiguous 'when configured and in the CSV backup' phrasing slightly reduces structural clarity.
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 nested, undocumented 'record' parameter and no annotations, the description is not complete enough for an agent to confidently construct a valid call. An output schema exists, so return values are presumably covered, but the input contract and behavioral caveats are largely absent.
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 schema provides 0% description coverage for the single 'record' object, so the description must compensate. It adds the general semantic that the record is an application object, but it does not specify required fields, nested structure, or validation rules for an object with additionalProperties: true.
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 a specific verb ('Upsert') and a clear resource ('an application in Airtable... CSV backup'), so an agent can infer the core action. However, it does not explicitly compare itself to sibling tools like save_application_snapshot or assess_submission, so differentiation is only implicit through the storage targets.
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 given about when to use this tool versus alternatives such as save_application_snapshot or verify_snapshot. The phrase 'when configured' hints at a condition, but it is ambiguous and does not explain what configuration is required or when a different tool should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_snapshotVerify SnapshotB
Verify immutable artifact sizes and SHA-256 hashes.
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. 'Verify' and 'immutable' imply a non-mutating integrity check, but the description does not explain what happens on mismatch, where the expected hashes come from, or whether any state is modified.
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, front-loaded sentence with zero filler. Every word contributes meaning, and it is appropriately sized for a one-parameter verification tool.
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 is simple and has an output schema, so the description is minimally viable. However, the absence of usage guidance, parameter semantics, and behavioral edge cases leaves meaningful gaps for a tool with no annotations.
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 0%, and the description does not clarify the snapshot_path parameter beyond its name. It does not explain what the path must point to, what format is expected, or whether it is a file or directory, so the agent gains no additional meaning from the 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 names a specific action ('Verify') and a concrete resource ('immutable artifact sizes and SHA-256 hashes'), making it clearly distinct from sibling tools like save_application_snapshot. It is concise and unambiguous, though 'artifact' could be slightly more explicit.
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 given about when to use this tool versus alternatives. The description does not mention related tools, prerequisites, or typical verification scenarios, leaving the agent to infer usage from the name alone.
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.
12 tool updates
v0.1.0- First observed
assess_submission - First observed
consult_career_positioning - First observed
generate_cover_letter - First observed
get_career_strategy - First observed
save_application_snapshot - First observed
save_career_strategy - First observed
score_job - First observed
search_jobs - First observed
submission_hard_stops - First observed
tailor_resume - First observed
track_application - First observed
verify_snapshot
TDQS
Scored across 12 tools
Most tools map cleanly to distinct actions: strategy lifecycle, resume/cover letter generation, snapshot verification, and tracking are all clearly separated. The only mild ambiguity is between search_jobs/score_job and submission_hard_stops/assess_submission, where the evaluation and approval responsibilities are adjacent.
Nearly all tools follow a verb_noun snake_case pattern such as save_career_strategy, tailor_resume, and verify_snapshot. The outlier is submission_hard_stops, which is a noun phrase rather than a verb-led action, creating a small but noticeable inconsistency.
Twelve tools is well-scoped for a career-application pipeline covering strategy, job matching, resume/cover letter production, snapshot verification, tracking, and submission assessment. Each tool addresses a distinct stage or artifact, so the count feels purposeful rather than bloated.
The core lifecycle is well covered: strategy approval, job scoring, resume tailoring, cover letter generation, application snapshot creation and verification, tracking, and submission assessment. Minor gaps exist around retrieving past application snapshots and actually executing a submission, though the design may intentionally stop at assessment and manual handoff.
Maintenance
Related MCP Connectors
Analyze job listings against your resume, track applications, and generate cover letters.
Tailored, graded job applications: a CV, cover letter and form answers built per vacancy.
- ResuMaxOAuthai.resumax
Find jobs, improve resumes, prepare for interviews, and manage your application pipeline.
Manage job applications — jobs, companies, boards, notes, and profile — from your AI client.
Related MCP Servers
- FlicenseAqualityCmaintenanceEnables tracking job applications through a pipeline, scheduling follow-ups, and summarizing job search progress via natural language.7-
- FlicenseNot gradedqualityCmaintenanceAutomates cover letter generation and application question answering from job postings via local AI agents. Manages candidate profile and AI humanization rules to produce tailored, humanized application materials.-
- FlicenseNot gradedqualityBmaintenanceEnables Claude Desktop to manage a job search end-to-end: find and score job listings, tailor resumes, generate application messages, and track application history, while leaving final external actions to the user.-
- FlicenseNot gradedqualityBmaintenanceExposes MCP tools (via FastMCP) to fetch and parse job postings, load a resume profile, compute a fit score, and log or track application decisions persistently.-