job-mcp
{"type":"text"}# Универсальный многопоточный сервер поиска работы FastMCP (job-mcp)
Корпоративный, ориентированный на конфиденциальность FastMCP-сервер, обеспечивающий интеллектуальную агрегацию вакансий из нескольких источников, умную дедупликацию, динамическое извлечение навыков из резюме, оценку покрытия требований и автономные рабочие процессы подачи заявок на HireMeTech, Comeet ATS и AllJobs Israel.
Обзор архитектуры
graph TD
Client([MCP Client: Claude / Cursor / Gemini Spark / Antigravity]) --> Tools[FastMCP Server Layer]
Tools --> Aggregator[JobAggregator]
Aggregator --> Registry[SourceRegistry]
subgraph Parallel Pluggable Sources Layer
Registry --> S1[HireMeTechSource<br/>Direct REST API + Session Fallback]
Registry --> S2[ComeetSource<br/>Direct ATS API + Concurrency Semaphore]
Registry --> S3[AllJobsSource<br/>Category Feeds + Anti-Blocking Headers]
end
subgraph Processing & Normalization Engine
S1 --> Dedup[Deduplication & Entity Merger]
S2 --> Dedup
S3 --> Dedup
Dedup --> NormKey["Key = slug(title) + '@' + slug(company)"]
NormKey --> Merge[Metadata & Links Merger]
Merge --> Scorer[Unified CV / Skill Matcher]
end
subgraph Dynamic Candidate Engine
CV["Candidate CV (.pdf / .docx / .txt)"] --> Extractor[Dynamic CV & Profile Extractor]
Extractor --> Skills["Extracted Skills (40+ tokens)"]
Extractor --> Seniority["Inferred Seniority & Exclusions"]
Extractor --> Roles["Target Job Roles"]
Skills --> Scorer
Seniority --> Scorer
end
Scorer --> Cache[Unified JobCache - 1h TTL]
Cache --> ToolsRelated MCP server: MCP Job Application Tracker & Resume Customizer
Ключевые возможности
Динамическое извлечение резюме и профиля кандидата:
Многоформатный ввод: Поддерживает файлы
.pdf(черезpypdf),.docx(черезpython-docx) и.txt.NLP-разбиение навыков и динамический лексикон: Обнаруживает и извлекает 40+ технических навыков без хрупкого жесткого кодирования, поддерживая сложные многословные технологии (например, FastAPI, LangGraph, PostgreSQL, Smart Contracts, GraphRAG).
Автоматическое определение уровня и исключений: Точно определяет уровень кандидата (Junior, Mid, Senior, Lead, Principal, Director) и генерирует интеллектуальные негативные ключевые слова для фильтрации неподходящих позиций.
Фильтрация стоп-слов и шума: Тщательно отбрасывает структурные артефакты резюме, даты, образовательные титулы и нетехнические метаданные.
Умная оценка покрытия требований (0–100):
Коэффициент покрытия требований вакансии: Вычисляет, насколько полно навыки кандидата удовлетворяют указанному технологическому стеку конкретной вакансии (
matched_job_skills / total_job_skills), предотвращая штрафы для кандидатов с широкими резюме.Взвешенная оценка компонентов:
Пересечение и покрытие технологического стека: до 40 баллов
Релевантность ключевых слов всего резюме: до 25 баллов
Соответствие режима работы и местоположения: до 20 баллов
Ожидания по зарплате: до 15 баллов
Штраф за исключение: -100 баллов за жесткие дисквалификаторы по уровню/технологиям.
Категоризация совпадений по уровням:
Лучшее совпадение ($\ge 85$): Автоподача / приоритетные кандидаты на подачу.
Сильное совпадение ($70 - 84$): Вакансии с высоким интересом, отмеченные для просмотра/закладок.
Дисквалифицировано ($< 50$): Автоматически скрыто или удалено.
Подключаемая многопоточная архитектура:
HireMeTech: Прямая интеграция с REST API (
/api/jobs/search,/api/auth/me,/api/resume/profile) с автоматическим резервным DOM-механизмом.Comeet (Direct ATS): Прямая интеграция с Comeet Careers API (
/careers-api/2.0/company/{id}/positions) с ограничением скоростиasyncio.Semaphore(5), индексацией технического каталога и TTL-кэшированием для каждой компании.AllJobs Israel: Интеграция с категорийными лентами с реалистичными заголовками браузера и изоляцией ошибок на уровне источника.
Межпоточная дедупликация и объединение сущностей:
Устраняет дубликаты, когда вакансии появляются на нескольких досках объявлений.
Объединяет списки источников (
sources: ["hiremetech", "comeet"]), объединяет технологические стеки, сохраняет наиболее полное описание и отдает приоритет прямым ссылкам на подачу через ATS.
Автономный и контролируемый режимы работы:
Контролируемый режим: Стандартное подтверждение MCP для каждого инструмента.
Автономный режим: Безопасная цепочка чтения/фильтрации/закладок без ручных запросов; двухэтапный защитный барьер при отправке заявки.
Наблюдаемость и устойчивость:
Структурированное JSON-логирование (
structlog) вstderrс очисткой токенов/учетных данных.Автоматическое отслеживание trace ID во всех полезных нагрузках
ToolResponse.
Справочник инструментов (9 инструментов)
Имя инструмента | Параметры | Описание |
| нет | Перечисляет все зарегистрированные источники вакансий ( |
|
| Получает подходящие вакансии со всех или указанных платформ с дедупликацией. |
|
| Оценивает и фильтрует агрегированные вакансии по резюме и предпочтениям кандидата. |
|
| Сохраняет/добавляет вакансию в избранное на исходной платформе. |
|
| Скрывает/удаляет вакансию из просмотра и удаляет её из кэша. |
|
| Шаг 1: Проверяет модальное окно подачи, подготавливает предпросмотр, сообщает о предупреждениях. |
|
| Шаг 2: Выполняет отправку заявки. Всегда требует явного подтверждения. |
| нет | Обнаруживает и калибрует DOM-селекторы на живых страницах с самовосстанавливающимися эвристиками. |
|
| Переключает режим выполнения сервера между контролируемым и автономным. |
Быстрый старт и настройка
1. Клонирование и установка зависимостей
git clone https://github.com/zvieli/hireme_mcp.git
cd hireme_mcp
# Using uv (recommended)
uv venv .venv
uv pip install -e ".[dev]"
playwright install chromium2. Настройка профиля кандидата и резюме
Поместите ваше резюме (cv.pdf, cv.docx или cv.txt) в корневой каталог:
cp /path/to/your/resume.pdf ./cv.pdf
cp .env.example .envОтредактируйте .env, чтобы настроить путь к резюме по умолчанию и контактные данные:
DEFAULT_CV_PATH=./cv.pdf
CANDIDATE_EMAIL=your.email@example.com
CANDIDATE_NAME="Your Name"3. (Необязательно) Первоначальная настройка аутентификации для HireMeTech
Comeet и AllJobs работают автоматически без входа в систему. Чтобы аутентифицировать вашу учетную запись HireMeTech для прямого доступа к API и автоподачи:
.venv/bin/python -m job_mcp.setupОткроется окно браузера Chromium.
Войдите с вашими учетными данными.
Вернитесь в терминал и нажмите
[Enter], чтобы сохранить сеанс в./browser_profile.
Запуск сервера
Вариант A: Использование Docker (рекомендуется)
# Build and run in background
docker compose up -d
# View live multi-source aggregation logs
docker compose logs -f hireme-mcpВариант B: Локальный запуск
# Streamable HTTP (Default for Web & Cloud Clients)
.venv/bin/python -m job_mcp --transport http --host 0.0.0.0 --port 8000
# Stdio (Default for Desktop Clients)
.venv/bin/python -m job_mcp --transport stdioВизуальный конвейерный запуск CLI
Чтобы выполнить полный автономный поиск, оценку и пробную подачу заявки прямо в терминале с богатым визуальным выводом:
# Run with auto-extracted skills from your CV:
.venv/bin/python scripts/run_mock_llm_pipeline.py --cv ./cv.pdf
# Run with explicit stack override and remote filter:
.venv/bin/python scripts/run_mock_llm_pipeline.py --cv ./cv.pdf --stack "Python,FastAPI,LangGraph" --work-mode remote --location "Tel Aviv"
# Execute live application submissions (disabled by default in dry-run):
.venv/bin/python scripts/run_mock_llm_pipeline.py --cv ./cv.pdf --auto-applyКонфигурация MCP-клиента
1. Claude Desktop (claude_desktop_config.json)
В Linux: ~/.config/Claude/claude_desktop_config.json
В macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
В Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"job-search-mcp": {
"command": "/absolute/path/to/hireme_mcp/.venv/bin/python",
"args": ["-m", "job_mcp", "--transport", "stdio"],
"env": {
"BROWSER_HEADLESS": "true",
"DEFAULT_CV_PATH": "/absolute/path/to/hireme_mcp/cv.pdf",
"CANDIDATE_EMAIL": "candidate@example.com",
"LOG_LEVEL": "INFO"
}
}
}
}2. Gemini Spark / веб-MCP-клиенты
Конечная точка:
https://<your-host-or-devtunnel-id>/mcpТранспорт:
Streamable HTTPАутентификация: Нет / Без аутентификации
Переменные окружения
Переменная | По умолчанию | Описание |
|
| Путь к файлу резюме по умолчанию для динамического извлечения навыков кандидата. |
|
| Электронная почта кандидата для автоматических модальных окон подачи. |
|
| Полное имя кандидата для форм подачи. |
|
| Транспортный протокол ( |
|
| Привязка хоста для HTTP/SSE-транспорта. |
|
| Порт для HTTP/SSE-транспорта. |
|
| Запуск браузера в безголовом режиме ( |
|
| Каталог для постоянного хранения сеанса Chromium. |
|
| Время жизни кэша дедуплицированных вакансий в памяти (в минутах). |
|
| Уровень структурированного логирования ( |
Запуск тестов
Запустите полный автоматизированный набор тестов (542 теста):
.venv/bin/pytest tests/ -vЛицензия
Этот проект лицензирован по лицензии MIT.
Available Tools
20 toolsauto_apply_jobA
Step 1: Inspect job application form and generate preview without submitting.
Uses HybridApplicationDispatcher to map form fields, evaluate safety guardrails,
and stage the application for subsequent confirmation via confirm_auto_apply.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Unique ID of the job listing. | |
| cv_path | No | Optional path to resume/CV document (defaults to DEFAULT_CV_PATH or user profile). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does disclose the critical safety property — 'without submitting' and 'evaluate safety guardrails' — which counters the write-like name, and it says the application is 'staged' rather than committed. However it never says what happens when a guardrail fails, whether the staged preview expires, or what authorization is required.
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 non-submission guarantee is front-loaded in the first clause, which is exactly what an agent needs before anything else. The second sentence is slightly padded by the internal dispatcher name but remains short and scannable.
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?
An output schema exists, so return values need not be explained. For a two-parameter preview tool with no annotations, the description covers intent, safety posture, and the required follow-up call; only failure-mode and auth behavior are unstated.
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 both `job_id` and the optional `cv_path` fallback are already documented in the schema. The description adds nothing about parameter meaning or precedence, so the 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?
States a specific verb+resource: 'Inspect job application form and generate preview without submitting', which is far more precise than the tool name suggests. It also distinguishes itself from the confirmation sibling by framing itself as 'Step 1'. The 'Uses HybridApplicationDispatcher' sentence is an internal implementation detail that adds little for an agent.
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?
Explicitly positions the tool as the first step and names `confirm_auto_apply` as the follow-up path, which gives the agent a clear routing decision. It stops short of stating preconditions (e.g., must the job be bookmarked or match-verified first) or any when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookmark_jobC
Save or bookmark a job listing by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Unique ID of the job listing. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a mutation but says nothing about idempotency (what happens if the job is already bookmarked), required auth/permissions, or whether the bookmark is reversible — significant omissions for a write operation with zero annotation coverage.
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 short sentence with the action and key front-loaded and no wasted words. It is efficient, though its brevity is partly the cause of the missing behavioral context rather than pure economy.
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?
An output schema exists, so return values need not be explained, and the tool has only one simple parameter. Still, for an unannotated mutation whose behavior on duplicate bookmarks and permission requirements is unknown, the description is only minimally sufficient.
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?
There is a single parameter with 100% schema description coverage, so the schema already explains job_id fully. The phrase 'by its ID' merely restates the parameter rather than adding format, source, or validity information, so the 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?
States a specific verb (save/bookmark) and resource (job listing) plus the lookup key, so the action is unambiguous. However, it does not distinguish itself from close siblings like mark_job_as_applied or delete_job, which operate on the same job entities, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no context about why an agent would bookmark versus apply to or delete a job, and no exclusions. With siblings like mark_job_as_applied and auto_apply_job in the same family, the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calibrate_selectorsA
Test, discover, and calibrate DOM selectors against the live page.
Tests all registered selectors against the live DOM, heuristically discovers alternative selectors if layout changes have occurred, and persists verified selectors into the dynamic selector registry.
| Name | Required | Description | Default |
|---|---|---|---|
| force_recalibrate | No | If True, clears existing dynamic registry cache before calibration. |
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 behavioral burden. It usefully discloses that the tool persists selectors into a dynamic registry and discovers alternatives heuristically, but it omits permissions, reversibility, side effects on the live page, and 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 front-loaded with a clear one-sentence summary and then adds a concise elaboration. It is efficient, though the second sentence slightly restates the verbs from the first without introducing much new 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?
An output schema exists, so return values need not be explained, and the single parameter is fully covered by the schema. The description sufficiently explains the calibration workflow, though it could be strengthened with usage conditions or prerequisites.
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%, and the single parameter 'force_recalibrate' is fully documented in the schema. The description adds no further parameter meaning, so the baseline of 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 uses specific verbs ('test, discover, calibrate') and a clear resource ('DOM selectors against the live page'), making the tool's function immediately distinguishable from the job-search/application siblings. It also states the core outcome ('persists verified selectors into the dynamic selector registry').
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 the tool is relevant ('if layout changes have occurred') but does not explicitly state when to use it versus alternatives, nor does it provide exclusions or prerequisites. Usage is inferable from the described behavior rather than directly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_auto_applyA
Step 2: Confirm and execute job application submission.
Executes application submission through HybridApplicationDispatcher and records an immutable audit record in the ApplicationLedger.
Requires auto_apply_job to have been called first for this job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | If True, bypasses non-duplicate guardrails (e.g. AUTO_APPLY_ENABLED, score, cap). | |
| job_id | Yes | Unique ID of the job listing previously previewed. | |
| cv_path | No | Optional path to CV document overriding the previewed CV. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 usefully discloses that submission runs through HybridApplicationDispatcher and writes an immutable audit record in the ApplicationLedger, plus the ordering prerequisite. It does not state that submission is effectively irreversible, nor permission/auth or rate-limit considerations, which matter for a final write operation.
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 compact sentences with the action and prerequisite front-loaded; every sentence adds signal. The middle sentence about the dispatcher/ledger slightly elongates without changing the decision, keeping it just below a 5.
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?
An output schema exists, so return values need not be explained, and the prerequisite is covered. However, for an irreversible write tool with no annotations, the description omits irreversibility, failure/duplicate behavior, and permission needs, leaving a meaningful 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?
Schema description coverage is 100%, so the meanings of force (bypass guardrails) and cv_path (override previewed CV) are already fully documented in the schema. The description adds only an implicit reference to job_id via the prerequisite, so the 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?
Specific verb+resource: it confirms and executes job application submission, and names the internal machinery (HybridApplicationDispatcher, ApplicationLedger). The 'Step 2' framing distinguishes it from the sibling auto_apply_job as the follow-up step in a pipeline. It stops short of a crisp one-line statement of what it does, but an agent can identify the operation.
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 states an explicit prerequisite: auto_apply_job must have been called first for this job_id, which is exactly the routing condition the agent needs. It does not say when NOT to use it or mention the alternative (mark_job_as_applied) for already-applied jobs, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_jobC
Dismiss or hide a job listing from view.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Unique ID of the job listing. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It says 'dismiss or hide from view,' implying a reversible view-level action, yet the name 'delete_job' implies permanent removal; the description never states which is true, whether data is destroyed, or whether the action can be undone. That destructive-vs-reversible ambiguity is the single most important behavior for the agent and it is left unresolved.
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 short sentence, front-loaded with the verb and resource, and free of padding. Its brevity is appropriate even though it leaves important behavior underspecified.
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?
An output schema exists, so return values need no explanation, but the description omits the crucial destructive-vs-reversible distinction and conflicts with the tool name. For a delete-named mutation with no annotations, this leaves an agent unable to safely decide whether to call it.
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?
There is only one parameter (job_id) with 100% schema description coverage, so the schema already documents it fully. The description adds nothing beyond what the schema provides, which is the expected baseline when coverage is complete.
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 gives a verb and resource ('Dismiss or hide a job listing'), but it conflicts with the tool name 'delete_job' and does not disambiguate whether the action is reversible. Sibling tools like bookmark_job and mark_job_as_applied are not distinguished, so an agent cannot confidently tell what this does relative to the family.
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?
There is no when-to-use guidance, no exclusions, and no mention of alternatives such as bookmark_job for the same hiding/saving intent. The agent is left to infer when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_companiesA
Identify supported ATS portals from company names or career URLs using bounded deterministic discovery.
Returns evidence and optional validated registry configuration. Does not persist configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | No | Bounded list of discovery targets (each with 'company_name' and/or 'career_url'), max 10. | |
| career_url | No | Single career board / jobs page URL to inspect. | |
| company_name | No | Single company name to discover (e.g. 'Stripe', 'Vercel'). |
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. It usefully discloses that discovery is bounded and deterministic and that configuration is not persisted, which is real behavioral value. However, it omits auth requirements, rate-limit/network behavior, and what 'evidence' actually contains for a discovery operation.
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 short, front-loaded sentences with no filler. The core action leads, followed by return and non-persistence notes. Tight and skimmable, though the two trailing sentences could be folded together.
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?
An output schema exists, so return-value explanation is unnecessary (and the description's return note is a harmless bonus). For a 3-param, zero-required, fully-documented tool, the description covers action, scope, and non-persistence adequately. The main gap is absent guidance on when to choose this over sibling discovery/job tools.
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 the schema already documents all three parameters (targets, career_url, company_name) with their constraints. The description only restates that inputs are company names or career URLs and adds no syntax, precedence, or interaction detail beyond the schema. 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?
States a specific verb+resource: 'Identify supported ATS portals from company names or career URLs.' This is clearly distinguishable in substance from siblings like job_search or auto_apply_job, but the description never names or contrasts any sibling explicitly. Clear purpose, no sibling differentiation.
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 'bounded deterministic discovery' and the ability to accept company names or URLs implies the discovery use case, but there is no explicit when-to-use guidance, no prerequisites, and no named alternative among the many sibling tools. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filter_jobs_by_preferencesB
Filter and rank cached job listings based on tech stack, location, salary, or CV.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum number of jobs to return. | |
| cv_path | No | Path to resume/CV file (PDF, DOCX, TXT) for automatic skill extraction and matching. | |
| keywords | No | Additional keywords to require or match in job descriptions. | |
| location | No | Target location (e.g. 'New York', 'London', 'Remote'). | |
| work_mode | No | Preferred work mode: 'remote', 'hybrid', or 'onsite'. | |
| min_salary | No | Minimum desired annual salary in USD. | |
| tech_stack | No | Preferred technologies (e.g. ['Python', 'FastAPI', 'React']). | |
| exclude_keywords | No | Keywords to exclude (e.g. ['Junior', 'PHP', 'Contract']). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 says 'filter and rank' but doesn't disclose ranking behavior, whether it mutates cached state, what ranking criteria are prioritized, or how cv_path processing works. For an 8-param tool with no annotations, this is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence that front-loads the verb and resource, then the criteria. 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 output schema exists, so return values need not be explained. However, for an 8-param tool with no annotations, the description omits ranking behavior, cv_path processing mechanics, and the tool's relation to the broader job-search workflow — gaps that leave the agent guessing about invocation 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% and each parameter has a clear description, so the schema does the heavy lifting. The description lists the filter dimensions (tech stack, location, salary, CV) which mirrors the schema without adding syntax or format detail beyond it. 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?
States a specific verb (Filter and rank) and resource (cached job listings) with the criteria it operates on. It distinguishes itself from siblings like search_linkedin_jobs or get_job_matches by specifying it works on already-cached listings, though the 'cached' aspect could be made more prominent.
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 vs. alternatives like get_job_matches or search_linkedin_jobs, nor any preconditions (e.g., must listings be cached first?). The agent is left to infer the tool's place in the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_application_historyB
Retrieve historical job application submissions and outcomes from the persistent audit ledger.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (default 50). | |
| status | No | Optional status filter ('success', 'failed', 'blocked', 'pending'). |
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. It adds useful context by naming a 'persistent audit ledger' (durable, historical source) and 'Retrieve' implies a read, but it does not state ordering, pagination semantics beyond limit, or whether results are scoped to a user. Partial disclosure only.
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 front-loaded sentence with the verb, resource, and data source, and zero filler. Nothing could be trimmed without losing 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 simple two-parameter read tool with a full schema and an output schema, the description covers what the tool returns and where the data comes from. The main gap is the absence of when-to-use routing against siblings, which keeps it from a 5.
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 the schema already documents both 'limit' (default 50) and the optional 'status' filter with its allowed values. The description adds nothing about parameter syntax or behavior, so the 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?
States a specific verb (retrieve) and a precise resource (historical job application submissions and outcomes), which is inherently distinct from the apply/search siblings. It stops short of explicitly differentiating itself from tools like mark_job_as_applied or search_linkedin_jobs, so it earns a 4 rather than a 5.
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?
There is no guidance on when to reach for this tool versus the many siblings that also touch applications, nor any stated prerequisites or exclusions. The purpose implies a reporting/audit use case, but the agent must infer it entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_matchesA
Fetch matched job listings from registered sources (HireMeTech, Comeet, AllJobs, LinkedIn, Workday, Eightfold, DirectTech).
Uses cached job listings unless cache is stale or force_refresh is True. Optionally filters by specific source IDs (e.g. ['hiremetech', 'comeet', 'alljobs']). When cv_path is provided, extracts candidate profile and dynamically populates queries, seniority exclusions, and scores.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of jobs to return (default: 50). | |
| cv_path | No | Path to resume/CV file (or raw CV text) for automatic skill extraction and matching. | |
| sources | No | Optional list of source IDs to query (e.g. ['hiremetech', 'linkedin', 'workday']). If None, queries all active registered sources. | |
| category | No | Optional category filter (e.g. 'public', 'enterprise', 'authenticated'). | |
| keywords | No | Additional keywords to require or match. | |
| location | No | Target location (e.g. 'Tel Aviv', 'Remote'). | |
| work_mode | No | Preferred work mode: 'remote', 'hybrid', or 'onsite'. | |
| categories | No | Optional list of category filters. | |
| min_salary | No | Minimum desired annual salary. | |
| tech_stack | No | Preferred technologies (e.g. ['Python', 'FastAPI']). | |
| force_refresh | No | Force a live scrape/fetch from sources even if cache is fresh. | |
| exclude_keywords | No | Keywords to exclude (e.g. ['Junior', 'PHP']). |
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 does disclose meaningful behavior: results come from cache unless stale or force_refresh=True, and cv_path triggers profile extraction that dynamically populates queries, seniority exclusions, and scores. It omits auth requirements, rate limits, and failure behavior, but the cache and dynamic-population semantics are real value beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place, with the core fetch purpose front-loaded before the cache and cv_path caveats. No filler or redundancy.
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 12-parameter, zero-required tool with an output schema, the description covers the non-obvious behaviors (caching, force_refresh, cv_path-driven matching). It leaves out how matching/scoring is computed and any auth or rate-limit context, which keeps it short of fully 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 coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: that sources defaults to all active registered sources and that cv_path causes automatic profile extraction that reshapes queries and scoring. These are behavioral couplings between parameters and results, not mere restatements.
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?
States a specific verb ('Fetch') and resource ('matched job listings') and enumerates the registered sources, which clearly separates it from generic siblings like job_search or job_fetch. However, it never explicitly contrasts itself with those siblings, so the differentiation is implicit rather than stated.
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 implies usage through the cache/force_refresh and cv_path mechanics, but gives no explicit when-to-use guidance or exclusions against alternatives such as job_search, search_linkedin_jobs, or filter_jobs_by_preferences. The agent must infer when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_linkedin_job_detailsA
Retrieve full job details for a specific LinkedIn job posting.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | LinkedIn job ID (e.g. 'linkedin_4152839402' or '4152839402'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 states it retrieves details but does not disclose whether this is a read-only operation, authentication requirements, rate limits, or error behavior. The presence of an output schema reduces the need to describe return values, but key behavioral traits remain undisclosed.
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, front-loaded sentence that is appropriately sized and contains no unnecessary 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 tool is simple with one parameter, and an output schema exists. The description is complete enough for an agent to understand what it does and how to call it, though it could mention that the job_id must be valid or that authentication is required.
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%, and the schema already documents the job_id parameter with examples. The description adds no additional meaning beyond what the schema provides, so the baseline 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 a specific verb 'Retrieve' and resource 'full job details for a specific LinkedIn job posting', distinguishing it from search-oriented siblings like search_linkedin_jobs. It is clear but does not explicitly mention which sibling to use when only a summary is needed.
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?
Usage is implied: use when you have a specific job ID and need full details. However, there is no explicit guidance on when to use this versus search_linkedin_jobs or other retrieval tools, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_fetchA
Fetch one canonical job using an opaque ref returned by job_search.
Returns factual retrieval status only.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Opaque, versioned JobRef string (e.g. 'v1_...'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that only factual retrieval status is returned, which is useful, and that 'ref' is opaque and versioned. However, it does not mention permissions, error behavior, or whether the result includes full job data or just status, leaving gaps for a retrieval 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 short sentences, front-loaded with the core action and followed by the return caveat. 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 one required parameter, an output schema exists (so return values need not be described), and the description covers purpose, source of input, and return nature. It is nearly complete, missing only minor behavioral details like error handling or authentication, which are not critical here.
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 schema describes 'ref' as an opaque, versioned JobRef string with an example. The description adds no parameter meaning beyond what the schema provides, 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?
States a specific verb (Fetch) and resource (one canonical job) with scope (single, by ref). It explicitly differentiates from job_search by naming the sibling and clarifying that this retrieves one job using a ref that job_search returns.
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?
Clear context: use after job_search to retrieve a specific job. It identifies the prerequisite (ref from job_search) but does not state exclusions or alternatives for fetching job details (e.g., get_linkedin_job_details), leaving some ambiguity about when to use another tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_searchA
Search normalized jobs across enabled TechJobMCP sources.
Returns opaque refs that can be passed to job_fetch. Provider knowledge is not required.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of postings to return (1-200, default: 25). | |
| query | No | Free-text search query / keywords (e.g. 'Software Engineer', 'Python'). | |
| cursor | No | Deferred to future milestones. Non-null values will be rejected. | |
| company | No | Company name filter. | |
| sources | No | Optional list of source families to query (e.g. ['ashby', 'linkedin']). If omitted, searches across all enabled sources. | |
| location | No | Geographic location filter (e.g. 'Tel Aviv', 'Remote', 'New York'). | |
| seniority | No | Deferred to future milestones. Non-null values will be rejected. | |
| work_mode | No | Preferred work mode: 'remote', 'hybrid', or 'onsite'. | |
| tech_stack | No | List of technology stack requirements (e.g. ['Python', 'FastAPI']). | |
| freshness_days | No | Deferred to Milestone 7. Non-null values will be rejected. |
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 behavioral burden; it does disclose that results are opaque refs consumed by job_fetch and that searching spans all enabled sources. It is silent on read-only nature, rate limits, and the fact that cursor/seniority/freshness_days are rejected, which the schema alone must convey.
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 short, front-loaded sentences with no filler; the core action comes first and the ref/job_fetch contract follows immediately.
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?
An output schema exists, so return-value detail is not required, and the description covers purpose plus the job_fetch handoff. For a ten-parameter tool it is nearly complete, missing only a note on the disabled/deferred filters and alternating-source selection.
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 the schema already documents all ten parameters (including the deferred, rejected ones). The description adds no parameter-level meaning beyond that, so the 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?
States a specific verb and resource ('Search normalized jobs across enabled TechJobMCP sources') and clarifies the return contract (opaque refs). It implies the distinction from search_linkedin_jobs via 'across enabled sources' but never names the sibling or states the differentiator explicitly.
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?
'Provider knowledge is not required' tells the agent it can call this without knowing source families, which is useful implied guidance, and naming job_fetch gives a workflow hint. However, there is no explicit when-to-use versus search_linkedin_jobs / get_job_matches, and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_configured_sourcesB
Return configured source metadata only, not observed provider health.
This path does not use the aggregator, provider health, browser or model. A full MCP transport startup still runs the existing lifespan separately.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does usefully signal that this path does not touch the aggregator, provider health, browser, or model, implying a lightweight read with no provider side effects, but it never explicitly states read-only semantics, auth needs, or whether the lifespan run has 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?
Three short sentences with the core scope ('configured source metadata only, not observed provider health') front-loaded. The final sentence about MCP transport lifespan is somewhat internal and only marginally helpful, but overall it is tight 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?
For a zero-parameter listing tool with an output schema that already documents return values, the description supplies adequate purpose and scope. The main omission is any routing between this and the sibling source/job listing tools.
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 takes zero parameters, so there is nothing for the description to document. Baseline 4 applies; no parameter-level ambiguity exists.
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?
States a specific verb and resource: returning configured source metadata. It also scopes the result by excluding observed provider health, which is genuinely clarifying. However, it never names list_job_sources or any sibling, so an agent cannot tell how this differs from the other source-listing 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?
There is no statement of when to use this tool versus alternatives such as list_job_sources. The notes about the aggregator, health, browser, and lifespan read as implementation detail rather than selection guidance, 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_job_sourcesC
List all registered job sources, their capabilities, and current health status.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Optional category filter ('public', 'enterprise', 'authenticated'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the response includes capabilities and health status, but says nothing about whether this is a safe read, whether it requires authentication, how health is determined, or whether results are paginated.
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 front-loaded sentence that names the resource first and the returned content second. No padding or redundancy, though it is arguably too terse given the missing usage and behavioral context.
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?
An output schema exists, so the description need not explain return values, and the single optional parameter is fully covered by the schema. What is missing is the usage context that would let an agent choose this tool over list_configured_sources or job_search.
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% and the single optional 'category' parameter is fully documented with its allowed values in the schema, so the baseline is 3. The description adds nothing about filtering behavior beyond what the schema already states.
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?
States a specific verb (list) and resource (job sources) plus the scope of what is returned: capabilities and health status. However, it does not distinguish itself from the similarly named sibling list_configured_sources, leaving the agent to guess which listing tool applies.
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 gives no when-to-use guidance, no prerequisites, and never names an alternative. With list_configured_sources in the sibling set, the absence of any routing hint is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_job_as_appliedA
Manually record a job as applied in the persistent ledger and dismiss it from cache.
This ensures the job will never reappear in future job scout runs.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Optional notes (e.g. 'Applied manually on company portal'). | |
| job_id | Yes | Job identifier (e.g., from job listings or 'manual_<id>'). | |
| company | No | Company name. | |
| job_title | No | Position / Job title. |
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 important consequences: a durable ledger entry, cache dismissal, and permanent exclusion from future job scout runs. That is genuine side-effect disclosure beyond the schema. It omits idempotency behavior (what happens if called twice) and any permission requirements, which keeps it short of a 5.
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 short sentences, zero filler, and the core action is front-loaded with the durability consequence immediately after. Nothing is redundant with the schema.
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?
An output schema exists, so return values need not be explained, and the input schema fully documents parameters. The description supplies purpose and the key persistence/exclusion semantics, leaving only minor gaps (idempotency, auth expectations) for a mutation 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 100%, so all four parameters (including the notes example and job_id format) are already documented in the schema. The description adds no parameter-level meaning such as what job_id formats are accepted or how company/job_title are used in the record, so the 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?
States a specific verb+resource (record a job as applied) plus the mechanism (persistent ledger) and side effect (dismiss from cache). The word 'manually' cleanly distinguishes it from the sibling auto_apply_job, so an agent can choose between them from the description alone.
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 'manually' framing implies this is the fallback when an application happened outside the agent (e.g., company portal), which is useful routing context. However, it never explicitly states when to use this instead of auto_apply_job or confirm_auto_apply, and offers no exclusions or preconditions, leaving the alternative choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notify_new_jobsB
Scan aggregated jobs, filter unseen postings via JobTracker, and dispatch alerts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum number of unseen jobs to notify in one batch. | |
| channel | No | Notification channel (default: 'telegram'). | telegram |
| sources | No | Optional list of source IDs to fetch from (e.g. ['linkedin', 'comeet', 'workday']). | |
| keywords | No | Additional keywords to require or match. | |
| location | No | Geographic location filter. | |
| min_score | No | Minimum match score (0-100) threshold for alerting. | |
| work_mode | No | Preferred work mode: 'remote', 'hybrid', or 'onsite'. | |
| tech_stack | No | Preferred tech stack list for ranking/filtering. | |
| force_refresh | No | Force live fetch from sources bypassing cache. | |
| auto_mark_seen | No | Automatically record notified jobs in tracker to avoid duplicate alerts. |
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. It usefully discloses the stateful dedup behavior (filter unseen via JobTracker, dispatch alerts), but for a tool with external side effects it omits that alerts are actually sent to a channel, that auto_mark_seen mutates tracker state by default, and any permission or rate-limit considerations.
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 twelve-word sentence ordered along the execution pipeline (scan, filter, dispatch) with no filler. It is efficiently front-loaded, though its extreme brevity leaves substantive gaps for a ten-parameter, side-effecting 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?
An output schema exists so return values need not be explained, but with ten parameters, zero annotations, and real side effects (outbound alerts plus tracker mutation), a one-line description leaves the agent without guidance on invocation context or consequences. It should do more given the tool's 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 description coverage is 100%, so all ten parameters are already self-documenting, including defaults for channel, force_refresh, and auto_mark_seen. The description adds no syntax or semantics beyond what the schema provides, which is the baseline 3 case.
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 verbs and a clear three-step pipeline (scan aggregated jobs, filter unseen via JobTracker, dispatch alerts), so the agent knows this is the end-to-end notification flow rather than a search primitive. It does not, however, distinguish itself from closely related siblings like run_job_scout, test_notifier, or get_job_matches.
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?
There is no statement of when to use this tool versus alternatives, nor any prerequisites or exclusions. The presence of siblings such as test_notifier (clearly a dry-run variant) makes the missing distinction especially costly, since nothing tells the agent to prefer one over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_job_scoutA
Execute autonomous end-to-end multi-source job scouting pipeline.
Discovers available sources, aggregates job listings, evaluates CV match scores against the candidate profile, automatically bookmarks high-affinity positions, stages/submits applications via HybridApplicationDispatcher if enabled, and returns structured tracking metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of jobs to return/process (default: 50). | |
| cv_path | No | Optional path to candidate CV (PDF, DOCX, TXT) or raw CV string. | |
| sources | No | Optional list of specific source IDs to query. If omitted or None, queries all registered sources. | |
| keywords | No | Additional keywords to match. | |
| location | No | Geographic location filter (e.g. 'Israel', 'Tel Aviv', 'Remote'). | |
| work_mode | No | Preferred work mode: 'remote', 'hybrid', or 'onsite'. | |
| auto_apply | No | If True, executes safe application preview and submission for top-tier jobs. | |
| min_salary | No | Minimum desired annual salary in USD. | |
| tech_stack | No | Target technology stack keywords (defaults dynamically to CV skills). | |
| action_mode | No | Action mode ('autonomous' or 'supervised'). In autonomous mode, auto_apply is enabled. | |
| detail_level | No | Response detail level ('summary' or 'full'). | |
| target_roles | No | Target job titles or roles to prioritize. | |
| auto_bookmark | No | If True, automatically bookmarks top-tier and strong-match jobs (default: True). | |
| force_refresh | No | Force fresh fetch from live sources bypassing cache. | |
| notify_channel | No | Optional notification channel to dispatch alerts to (e.g. 'telegram'). | |
| exclude_keywords | No | Keywords to filter out (e.g. seniority exclusions). | |
| max_applications | No | Maximum number of applications to submit per run (default: 3). | |
| top_tier_threshold | No | Score threshold for Top-Tier priority jobs (default: 85). | |
| disqualify_threshold | No | Score threshold below which jobs are dismissed/removed (default: 50). | |
| strong_match_threshold | No | Score threshold for Strong Match jobs (default: 70). |
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 does disclose the significant side effects: automatic bookmarking and staged/submitted applications via HybridApplicationDispatcher, gated on auto_apply. It omits permission requirements, rate limits, runtime/latency, and any reversibility caveats for submitted applications, which matters for a mutating pipeline.
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?
Front-loaded with a single-sentence purpose, followed by one dense sentence enumerating the pipeline stages. Efficient, though the second sentence is a long run-on that could be split for scanability.
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?
An output schema exists, so return values ('structured tracking metrics') need not be expanded, and all 20 params are schema-documented. The remaining gap is the absence of usage routing and safety/permission context for a 20-param tool that can submit real applications.
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 all 20 parameters are already documented in the schema. The description adds only a marginal cross-reference between action_mode 'autonomous' and auto_apply; it provides no syntax or default semantics beyond what the schema states, so the 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?
States a specific verb ('Execute') and resource ('multi-source job scouting pipeline') and then enumerates the actual stages (discover sources, aggregate listings, score CV match, bookmark, stage/submit applications). This distinguishes it from granular siblings like job_search, auto_apply_job, and get_job_matches, which each cover only one stage.
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 pipeline does but never says when to choose it over the many sibling tools (job_search, auto_apply_job, get_job_matches, filter_jobs_by_preferences). There is no explicit when/when-not guidance or named alternative, leaving selection to inference from the enumerated steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_linkedin_jobsB
Search LinkedIn jobs using the high-speed guest seeMoreJobPostings endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| f_E | No | Experience level filter (e.g. '1'=internship, '2'=entry, '3'=associate, '4'=mid-senior). | |
| f_AL | No | Filter for Easy Apply jobs. | |
| f_WT | No | Raw LinkedIn workplace type parameter ('1'=onsite, '2'=remote, '3'=hybrid). | |
| f_TPR | No | Time posted range (e.g. 'r86400' for past 24h, 'r604800' for past week). | |
| limit | No | Maximum number of jobs to return (default: 25). | |
| start | No | Pagination start offset index. | |
| cv_path | No | Optional path to resume/CV file (or raw CV text) to dynamically derive search keywords if keywords is empty. | |
| sort_by | No | Sorting parameter ('R'=relevant, 'DD'=date posted). | |
| keywords | No | Search query / keywords (e.g. 'Software Engineer', 'Python'). | |
| location | No | Target geographic location (default: 'Israel'). | Israel |
| work_mode | No | Optional work mode filter: 'onsite', 'remote', or 'hybrid'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. The phrase 'guest seeMoreJobPostings endpoint' weakly implies an unauthenticated, read-only lookup, but the description says nothing about rate limits, pagination behavior, default location scoping ('Israel'), or what happens when keywords are empty and cv_path drives the query.
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 front-loaded sentence with no filler; the core action and endpoint are stated immediately. Nothing could be trimmed without losing content.
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 11 parameters and an output schema present, the schema carries most of the load, but for a default-scoped search tool with no annotations and many competing siblings, the description should at minimum explain scope, defaults, and how it differs from the other job-listing tools.
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 the baseline is 3 and the schema already documents all 11 parameters, including enum-like codes for f_E, f_WT, f_TPR and sort_by. The description adds nothing beyond the schema and does not explain how overlapping filters (work_mode vs f_WT, keywords vs cv_path) interact.
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 and resource ('Search LinkedIn jobs') and even the underlying endpoint, so an agent knows exactly what the tool does. It does not, however, distinguish itself from look-alike siblings such as job_search, job_fetch, or get_job_matches, leaving the agent to infer the boundary.
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?
There is no statement of when to use this tool versus the many search-adjacent siblings (job_search, job_fetch, filter_jobs_by_preferences, get_job_matches). No prerequisites, no when-not-to-use, no routing guidance at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_operation_modeA
Switch between supervised and autonomous operation modes.
In autonomous mode, the server signals the LLM client that it may chain
read-only and safe-action tools without per-tool user confirmation.
Only confirm_auto_apply (actual job submission) always requires explicit
user confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Operation mode — 'supervised' or 'autonomous'. |
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 full burden and does well: it explains the concrete behavioral consequence of autonomous mode (tool chaining without per-tool confirmation) and the important exception that confirm_auto_apply still requires explicit user confirmation. This is meaningful state-changing context. It does not, however, state whether the mode persists across sessions, who may set it, or whether the change is reversible.
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?
Front-loaded statement of purpose followed by a concise consequence clause. Two short paragraphs, each earning its place. No redundancy.
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 required enum-like parameter and an output schema that presumably returns the resulting mode, the description covers the essential behavior an agent needs. Missing only persistence/permission details and any rollback semantics. Sufficient for correct 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 100% and the schema documents the mode parameter with its two allowed values. The description adds conceptual meaning ('supervised' vs 'autonomous' with behavioral effects) but no format or syntax detail beyond the schema. 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?
States a specific verb+resource (switch operation modes) and enumerates the two modes. Does not name any sibling tool to differentiate from, but no sibling performs the same function, so confusion risk is low. Clear but without explicit sibling differentiation.
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 when the switch matters by explaining what autonomous mode enables, but gives no explicit rule for when to call this tool vs simply proceeding. The conditional nature of the tool's effect is described, not its invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_notifierA
Verify notifier connectivity, health check, and dispatch a test alert message.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | Notification channel to test (default: 'telegram'). | telegram |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 does disclose the key side effect (an actual alert message is dispatched) and a read-only-style health check, but says nothing about required channel configuration, permissions, or whether the test message reaches a real external destination.
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 front-loaded sentence with no filler. Minor redundancy between 'verify connectivity' and 'health check', which describe nearly the same activity.
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?
Output schema exists, so return values need no explanation, and the single optional parameter is fully schema-documented. For a simple one-parameter diagnostic tool the description is nearly sufficient, missing only explicit guidance on when to run it and whether the test alert is externally visible.
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?
Only one parameter with 100% schema description coverage, so the schema already documents 'channel' and its 'telegram' default. The description adds nothing about valid channels or how the default is chosen, 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?
States specific verbs and resource: 'Verify notifier connectivity, health check, and dispatch a test alert message.' An agent can tell this is a diagnostic/test tool rather than the production notifier, though it never names the sibling notify_new_jobs it should be contrasted with.
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?
Usage is only implied by the words 'test' and 'health check' – an agent can infer this is a pre-flight/diagnostic call, but the description gives no explicit when-to-use, when-not, or alternative (e.g. 'run this before enabling notifications').
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
v0.1.0- First observed
auto_apply_job - First observed
bookmark_job - First observed
calibrate_selectors - First observed
confirm_auto_apply - First observed
delete_job - First observed
discover_companies - First observed
filter_jobs_by_preferences - First observed
get_application_history - First observed
get_job_matches - First observed
get_linkedin_job_details - First observed
job_fetch - First observed
job_search - First observed
list_configured_sources - First observed
list_job_sources - First observed
mark_job_as_applied - First observed
notify_new_jobs - First observed
run_job_scout - First observed
search_linkedin_jobs - First observed
set_operation_mode - First observed
test_notifier
TDQS
Scored across 20 tools
Several tools overlap in the job-discovery space: job_search, get_job_matches, filter_jobs_by_preferences, and run_job_scout all retrieve/aggregate jobs, while list_configured_sources vs list_job_sources and notify_new_jobs vs run_job_scout blur boundaries. Descriptions do help differentiate them (config vs health, one-shot search vs full pipeline), but an agent can still misselect among the search/aggregation tools.
Nearly all tools use snake_case verb_noun phrasing (list_job_sources, mark_job_as_applied, get_application_history), which is predictable and readable. The only deviations are job_search and job_fetch, which lead with the noun instead of the verb, but this is minor.
At 20 tools the surface is on the heavy side for a job-scouting server, and a few tools (job_search/job_fetch vs get_job_matches, notify_new_jobs vs run_job_scout) feel redundant. Each maps to some functionality, but the count is borderline rather than tight.
Coverage is strong: search, fetch, filter, bookmark, dismiss, two-step apply with audit history, notifications, full scout pipeline, source listing, and ATS discovery are all present. Minor gaps like no explicit preference/config update or source-management CRUD remain, but core lifecycles are covered.
Maintenance
Related MCP Connectors
Auto-apply to jobs: matches your CV, tailors a fresh CV per posting, and applies for you.
Job search across Greenhouse, Lever, Ashby, SmartRecruiters, Personio and Pinpoint, deduplicated.
Job platform for AI agents. Track tech jobs from companies that match your stack.
Resume and CV parsing, candidate matching and ranking for recruiting and ATS AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables autonomous job search by scanning, scoring, and applying to jobs via APIs like Ashby, Greenhouse, and Lever, with a TUI dashboard for tracking.91MIT
- FlicenseNot gradedqualityDmaintenanceAutomates job application tracking and resume/cover letter generation using AI, integrating with Google Drive, Notion, and Gmail.1-
- AlicenseNot gradedqualityCmaintenanceAn AI-powered job search and application assistant that enables multi-source job hunting, OpenAI matching, cover letter generation, and hybrid application automation via Playwright, Chrome CDP, screen OCR, and manual assist.MIT
- AlicenseNot gradedqualityBmaintenanceEnables natural-language job search and aggregation from multiple recruitment websites with zero configuration, providing filtered results and standardized output for AI assistants.64 npmISC