local-tech-digest-mcp
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., "@local-tech-digest-mcpsend me today's digest"
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.
π local-tech-digest-mcp
A local, privacy-first Model Context Protocol (MCP) server that automatically tracks entry-level tech job openings and upcoming USA tech conferences β then emails you a clean HTML digest on a smart schedule.
Runs 100% on your machine. No cloud, no tracking, no third-party accounts beyond a Gmail App Password.
β¨ Features
Dual digest β entry-level jobs (daily) + tech conferences (weekly)
Smart scheduler β fires at 08:00 ET daily; also triggers immediately if you open your laptop after 8 PM
3-gate job filter β level β exclusion β domain β stack scoring
F-1 OPT aware β excludes clearance/citizenship-required and no-sponsorship roles
USA / International split β USA roles first, foreign roles in a separate section
Zero API keys β all data sources are free and public
Deduplication β SQLite tracks every job/conference ever seen; emails only new entries
10 MCP tools β query, search, and trigger digests directly from Claude Desktop
Auto-start β silent Windows Startup launcher included
Related MCP server: j-hunt-mcp
ποΈ Architecture
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β local-tech-digest-mcp β
β β
β βββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββ β
β β Claude β β Scrapers β β
β β Desktop ββββββΆβ SimplifyJobs β RemoteOK β The Muse β β
β β (MCP tools) β β (GitHub JSON) β (API) β (API) β β
β βββββββββββββββ ββββββββββββββββ¬ββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββ ββββββββββββββββΌββββββββββββββββββββββββββββ β
β β Scheduler β β Filter Pipeline β β
β β node-cron β β Gate 1: Level (junior/entry/intern) β β
β β 08:00 ET β β Gate 2: Exclusion (clearance/no-visa) β β
β β + 8 PM β β Gate 3: Domain (cyber/cloud/web/sys) β β
β β on-open β β Scorer: Stack match (Python/AWS/Linuxβ¦) β β
β ββββββββ¬βββββββ ββββββββββββββββ¬ββββββββββββββββββββββββββββ β
β β β β
β β ββββββββββββββββΌββββββββββββββββββββββββββββ β
β β β SQLite (digest.db) β β
β β β conferences table β jobs table β β
β β β hash dedup β hash dedup β β
β β ββββββββββββββββ¬ββββββββββββββββββββββββββββ β
β β β β
β ββββββββββββββββββββββββββββΆβ β
β βΌ β
β ββββββββββββββββββββββββββββ β
β β Email Builder β β
β β Section 1: USA Jobs β β
β β Section 2: Conferences β β
β β Section 3: Intl Jobs β β
β ββββββββββββββββ¬ββββββββββββ β
β β β
β βΌ β
β Gmail SMTP (nodemailer) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββπ Project Structure
local-tech-digest-mcp/
βββ src/
β βββ db/
β β βββ schema.ts # SQLite init β creates both tables on first run
β β βββ conferences.ts # Conference CRUD & queries
β β βββ jobs.ts # Job CRUD, search, filter, stats
β βββ filters/
β β βββ jobs.ts # 3-gate pipeline, stack scorer, HTML stripper
β βββ scrapers/
β β βββ conferences.ts # confs.tech GitHub JSON scraper
β β βββ jobs/
β β βββ index.ts # Parallel orchestrator for all job sources
β β βββ simplify.ts # SimplifyJobs (new-grad + internships)
β β βββ remoteok.ts # RemoteOK public API
β β βββ themuse.ts # The Muse public API
β βββ email/
β β βββ builder.ts # Region classifier, USA/intl split, SMTP send
β β βββ jobs-section.ts # Job cards HTML renderer
β β βββ conf-section.ts # Conference cards HTML renderer
β βββ server.ts # MCP server β 10 tools for Claude Desktop
β βββ scheduler.ts # node-cron dual schedule + 8 PM on-open trigger
βββ data/ # Auto-created β SQLite database (gitignored)
βββ dist/ # Auto-created β compiled JS (gitignored)
βββ launch-silent.vbs # Windows Startup silent launcher
βββ setup-autostart.ps1 # Register Windows startup task (optional)
βββ .env.example # Environment variable template
βββ package.json
βββ tsconfig.jsonπ Data Sources
Source | Type | Auth | What it provides |
GitHub raw JSON | None | Entry-level CS full-time roles | |
GitHub raw JSON | None | Summer/fall tech internships | |
Public API | None | Remote tech roles globally | |
Public API | None | Entry-level filtered roles | |
GitHub raw JSON | None | USA tech conferences by topic |
π Job Filter Pipeline
Every scraped job passes three sequential gates before being stored:
RAW JOB
β
βΌ GATE 1 β LEVEL FILTER (title must match)
junior Β· entry-level Β· associate Β· l1 Β· graduate Β· new-grad Β· intern(ship)
β
βΌ GATE 2 β EXCLUSION FILTER (reject if found in title or description)
us-citizenship-required Β· must-be-us-citizen Β· secret-clearance
top-secret Β· ts/sci Β· dod Β· department-of-defense Β· itar
no-sponsorship Β· sponsorship-not-available
β
βΌ GATE 3 β DOMAIN FILTER (must match at least one)
Cybersecurity β security | infosec | soc | devsecops | pentest | siem β¦
Cloud/DevOps β cloud | aws | azure | devops | kubernetes | terraform β¦
Web Development β frontend | backend | full-stack | react | node | django β¦
SysAdmin β linux | sysadmin | system-admin | sre | network-admin β¦
β
βΌ STACK SCORER (points added for matching user's tech stack)
Python +2 Linux / Debian / Ubuntu +2
Bash / Shell +2 AWS +2
Security (CVE) +2 Docker / Kubernetes +1
Terraform +1 Git / GitHub +1
Networking +1
ββββββββββββββββββββββββββββββββββββ
Maximum score: 14 points
β
βΌ STORED in SQLite
Emailed if score β₯ MIN_JOB_SCORE (default: 0)
Capped at MAX_JOBS_PER_DOMAIN per email (default: 25)π§ Email Layout
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π Weekly Tech Digest β May 29, 2026 β
β πΊπΈ 82 USA roles Β· π 18 international Β· π 15 conf β
β [Cybersecurity] [Cloud/DevOps] [Web Dev] [SysAdmin] β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
πΌ NEW ENTRY-LEVEL OPENINGS (USA)
ββββββββββββββββββββββββββββββββββββββββββββββ
π Cybersecurity (N roles)
ββββββββββββββββββββββββββββββββββββββββββββ
β Security Analyst Intern β CrowdStrike β
β π’ CrowdStrike π Remote β
β [Internship] [Remote] [β Visa Sponsor] β
β Tags: python linux aws β
β Match ββββββββββββ 8/14 β
β [Apply β] β
ββββββββββββββββββββββββββββββββββββββββββββ
βοΈβ Cloud / DevOps (N roles)
π Web Development (N roles)
π₯οΈ SysAdmin (N roles)
π UPCOMING USA TECH CONFERENCES (Monday only)
ββββββββββββββββββββββββββββββββββββββββββββββ
π Cybersecurity
β’ DEF CON 34 β Las Vegas Β· Aug 7β10
βοΈ Cloud / DevOps
β’ KubeCon NA β Atlanta Β· Nov 10β14 β° CFP: Jul 21
π INTERNATIONAL OPPORTUNITIES
ββββββββββββββββββββββββββββββββββββββββββββββ
βΉοΈ These roles are outside the USA. Verify work
authorization before applying.
[Same card layout, purple accent]π οΈ Prerequisites
Node.js v18 or later
A Gmail account with App Password enabled (requires 2-Step Verification)
βοΈ Setup
1. Clone & install
git clone https://github.com/YOUR_USERNAME/local-tech-digest-mcp.git
cd local-tech-digest-mcp
npm install2. Configure environment
copy .env.example .env # Windows
cp .env.example .env # Mac/LinuxEdit .env with your values:
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=you@gmail.com
SMTP_PASS=xxxx_xxxx_xxxx_xxxx # Gmail App Password (16 chars, no spaces)
NOTIFY_EMAIL=you@gmail.com
TZ=America/New_York # Your timezone
MIN_JOB_SCORE=0 # 0 = all jobs | 4 = strong stack matches only
MAX_JOBS_PER_DOMAIN=25 # Max job cards per domain per emailGmail App Password: Go to myaccount.google.com/apppasswords, create a new app password, and paste the 16-character code (without spaces) as
SMTP_PASS.
3. Build
npm run build4. Register with Claude Desktop
Add to claude_desktop_config.json:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"tech-digest-mcp": {
"command": "node",
"args": ["/absolute/path/to/local-tech-digest-mcp/dist/server.js"]
}
}
}Restart Claude Desktop after saving.
5. Run the scheduler
node dist/scheduler.jsKeep this terminal open. The scheduler fires automatically on its schedule.
6. Auto-start on Windows login (optional)
Copy launch-silent.vbs to your Windows Startup folder:
Copy-Item .\launch-silent.vbs ([Environment]::GetFolderPath('Startup'))The scheduler will now start silently every time you log in.
π§ͺ Test Commands
# Trigger daily jobs digest immediately
node dist/scheduler.js --now-daily
# Trigger full weekly digest (jobs + conferences)
node dist/scheduler.js --now-weeklyπ Schedule Behaviour
When | Action |
Every day 08:00 ET (TueβSun) | Scrape jobs β send jobs-only email |
Every Monday 08:00 ET | Scrape jobs + conferences β send full email |
Laptop opened after 8 PM | Runs the appropriate digest immediately |
Nothing new | Email skipped β no empty digests |
π§ MCP Tools (Claude Desktop)
Tool | Description |
| Scrape all sources, filter, score, store new jobs |
| Pending (un-emailed) jobs sorted by score |
| Top N jobs by stack-match score |
| Full-text search by keyword |
| Filter by domain, type, min score |
| Scrape confs.tech for upcoming USA events |
| Conferences in the next N days |
| Keyword search across conferences |
| Manually trigger digest ( |
| Database counts for jobs and conferences |
ποΈ Database Schema
-- Conference events
CREATE TABLE conferences (
id, name, url, startDate, endDate, city, state, country,
topics TEXT, -- JSON array of domain labels
cfpDeadline, cfpUrl, source,
hash TEXT UNIQUE, -- md5(name|startDate|city) for deduplication
firstSeen, notified INTEGER DEFAULT 0
);
-- Job listings
CREATE TABLE jobs (
id, external_id, title, company, url, apply_url,
location, remote INTEGER,
job_type, -- full-time | internship
domain, -- primary domain bucket
tags TEXT, -- JSON array
description TEXT,
date_posted, sponsorship, source,
hash TEXT UNIQUE, -- md5(title|company|url) for deduplication
score INTEGER, -- 0β14 stack-match score
first_seen, notified INTEGER DEFAULT 0
);π Privacy
All data stays on your machine
No analytics, no telemetry, no external accounts required
The only outbound connections are to public GitHub raw URLs, RemoteOK, The Muse, and your own SMTP relay
.envcredentials are gitignored and never leave your machine
π License
MIT β use freely, modify freely.
Available Tools
13 toolsfetch_conferencesA
Scrape confs.tech for upcoming USA tech conferences.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 of behavioral disclosure. It does not mention potential side effects of scraping, rate limits, network dependencies, or failure modes, leaving the agent without important operational expectations.
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?
One sentence, front-loaded with the action and target. Every word earns its place, with no redundancy or filler.
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 identifies the source and filter but does not explain what the tool returns (e.g., list of conference details, URLs, dates). With no output schema, the description should at least hint at the return format. It also does not differentiate from similarly named conference tools beyond the source, leaving some ambiguity.
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 coverage is trivially 100%. The description adds no parameter-specific semantics, but with no parameters, the baseline is 4, so this 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 uses the specific verb 'scrape' and names the resource 'confs.tech' with a clear scope ('upcoming USA tech conferences'). This distinguishes it from sibling tools like fetch_jobs and list_upcoming_conferences, which target different resources or scopes.
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 clear context (scraping a specific website) but does not explicitly state when to use this tool versus alternatives like search_conferences or list_upcoming_conferences. It implies the tool is for sourcing from confs.tech but lacks any when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_jobsA
Scrape all 6 job sources (SimplifyJobs, RemoteOK, The Muse, Remotive, Jobicy, Arbeitnow), apply 4-gate filter, score, and store. Returns per-source breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries full responsibility for behavioral disclosure. It does state the tool filters, scores, and stores data (indicating a write operation) and returns a per-source breakdown. However, it omits caveats like duration, potential to overwrite existing data, or prerequisites such as API keys.
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?
One sentence, front-loaded with the core action, enumerates the sources, and specifies the return value. 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?
Given no output schema, the description includes a minimal but sufficient return value ('per-source breakdown'). It outlines the entire process from scrape to store, though it does not explain what the '4-gate filter' or 'score' mean, nor any operational prerequisites. Still, for a parameterless tool, it provides adequate 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?
The tool has zero parameters, and the input schema is empty. Per the baseline for zero-parameter tools, the description does not need to add parameter details. It correctly focuses entirely on the action.
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 states a specific verb ('Scrape'), names the exact resource (all 6 job sources with names), and describes the full pipeline (filter, score, store). This clearly distinguishes it from sibling tools that operate on existing job data, such as search_jobs and filter_jobs.
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 this is the ingestion tool, contrasting with siblings that query or list already-stored jobs. However, it does not explicitly provide when-to-use vs. when-not-to-use guidance or mention alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filter_jobsB
Filter stored jobs by domain, type, status, and min score.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| domain | No | ||
| status | No | new | saved | applied | interviewing | rejected | offer | |
| job_type | No | full-time | internship | |
| min_score | No |
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 not mention whether the operation is read-only (e.g., does not modify stored jobs), what the return format is, or any default limits. The description merely restates the filtering action without behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero wasted words. Every element contributes to understanding, making it highly concise and well-structured.
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 a simple filter with no output schema or annotations, and the description gives the basic purpose. However, it lacks any mention of return format, pagination behavior, or whether the filter is applied to the stored job collection without side effects. Given the tool's low complexity, this is adequate but not thorough.
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 40%, so the description must compensate. It lists the filter criteria (domain, type, status, min score) but does not explain the meaning of 'domain' or 'min_score', and omits the 'limit' parameter entirely. The schema already provides enum-like descriptions for status and job_type, so the description adds minimal value beyond naming the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('filter') with a clear resource ('stored jobs') and the specific criteria ('by domain, type, status, and min score'). This distinguishes it from siblings like fetch_jobs, list_new_jobs, and search_jobs by indicating a filtered view of the stored collection.
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 says what the tool does but provides no guidance on when to use it over alternatives. Sibling tools like search_jobs and list_new_jobs exist, yet there is no comparison or exclusion, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pipelineA
Show your job application pipeline grouped by status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of explaining behavior. It discloses that the output is grouped by status, but it does not mention any other behavioral traits such as whether the result is a summary, list, or counts, nor does it describe pagination or ordering. The description is adequate for a simple read-only tool but lacks enriching detail.
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 or redundancy. It front-loads the action and object, making it easy to parse and understand at a glance.
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 tool's low complexity (no parameters, no output schema) and clear purpose, the description is minimally adequate but not fully complete. It does not explain what the 'pipeline' consists of (e.g., job names, counts, stages) or what the output shape looks like, leaving some ambiguity about the exact return content.
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, so the baseline is 4. The description correctly implies no inputs are needed. Since there are no parameters to explain, the description does not need to add parameter semantics beyond what the schema already communicates (empty schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool shows the job application pipeline grouped by status. It uses a specific verb ('Show') and resource ('your job application pipeline') with an explicit grouping dimension, making it distinct from sibling tools like fetch_jobs or search_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for viewing an overview of application statuses, but it lacks explicit when-to-use guidance or exclusion criteria relative to sibling tools. There is no mention of alternatives or conditions, so the agent must infer context from the tool's purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statsB
Database counts for jobs (by status, type, salary) and conferences.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only mentions 'database counts,' suggesting a read-only operation, but does not disclose data freshness, permissions, rate limits, or response format. This is a significant gap for a tool 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?
The description is one compact sentence that conveys the core purpose without any redundant wording. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should clarify the return structure. It lists the categories (job status, type, salary, conferences) but does not specify whether counts are grouped, combined, or presented as a structured object. For a zero-parameter tool, this is adequate but leaves some ambiguity about the exact response format.
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 no parameters, with an empty input schema. Since there is nothing to document, the baseline of 4 applies. The description appropriately does not attempt to describe nonexistent parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool provides aggregate counts for jobs and conferences, with breakdowns by status, type, and salary. It lacks an explicit verb (e.g., 'Returns') but is unambiguous and distinct from sibling tools that list or search individual records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for summary statistics rather than fetching individual records, but it does not explicitly state when to use it versus siblings like search_jobs or fetch_conferences. No alternatives are named, and no exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_matchesA
Return top N jobs by stack-match score across all stored jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 20 | |
| min_score | No | Default 4 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It adds useful context about global scope ('across all stored jobs') and ranking by score, but does not mention the min_score filtering behavior or sort direction explicitly. This is adequate but not rich.
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 that communicates the core functionality without unnecessary wording. It is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two optional parameters, but the description omits any mention of the min_score parameter's role as a filter threshold. Since there is no output schema and annotations, the description should ideally clarify this behavior to be 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 description coverage is 100%, so the baseline is 3. The description does not add any parameter-specific meaning beyond what the schema provides, which is acceptable per the rubric.
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 specifies the action (return), the resource (jobs), and the ranking criteria (stack-match score), and clearly distinguishes from sibling tools like fetch_jobs and filter_jobs by emphasizing 'top N' and 'across all stored jobs'.
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: the tool is for retrieving top matching jobs ranked by score. However, there is no explicit when-to-use vs alternatives or exclusions, so it falls into the 'implied usage' category.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_new_jobsA
List un-notified jobs sorted by score. Optional domain and min_score filters.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | ||
| min_score | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden of disclosing side effects and context. It accurately describes the listing and sorting behavior but does not mention whether the tool modifies notification status, limits results, or requires authentication. The description adds the sorting detail but lacks depth on what 'un-notified' entails.
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 convey the core purpose and parameters without wasted words. The information is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic functionality but omits details like return format, pagination, or how this tool differs from similar list/search tools. Without an output schema or annotations, the description should provide more completeness, but for a simple listing tool it is minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description labels domain and min_score as 'optional filters', providing some context beyond the bare schema (which has no descriptions). However, it does not clarify what domain values are allowed or how min_score scales, so semantic meaning remains partial. Given 0% schema coverage, more detail would be beneficial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the specific resource ('un-notified jobs'), and the sorting behavior ('sorted by score'). This distinguishes it from siblings like search_jobs and filter_jobs by focusing on the un-notified subset.
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 'un-notified jobs' implies the intended use case (retrieving jobs that haven't been notified), but there is no explicit guidance on when to choose this over alternatives like fetch_jobs or get_top_matches. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_upcoming_conferencesB
List upcoming conferences in the next N days (default 60).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool returns upcoming conferences and includes a default 'days' value, adding behavioral context. However, it does not explain return format, ordering, inclusivity of the start/end dates, or pagination, which is a notable gap for a list 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?
The description is a single, front-loaded sentence that states the main action ('List upcoming conferences') and provides the optional parameter context immediately. Every word adds value; there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description covers the core functionality. However, it lacks differentiation from sibling tools and does not describe return details (e.g., which conference fields are included). This makes it adequate but not 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?
The schema provides no description for the 'days' parameter (0% coverage). The description compensates by explaining that 'days' means 'next N days' and defaults to 60, giving the parameter clear meaning. It does not specify constraints like minimum/maximum or integer requirements, but the core semantics are well covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists upcoming conferences within a time window (next N days) with a default of 60. This provides a specific verb and resource, but does not differentiate it from sibling tools like fetch_conferences and search_conferences, which could overlap in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description implies usage for time-based queries but does not explicitly state exclusions or mention other conference-related tools (e.g., search_conferences), leaving the agent without clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_jobA
Update the application status of a job by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Job ID from the database | |
| status | Yes | new | saved | applied | interviewing | rejected | offer |
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 of disclosing behavioral traits. It only says 'update,' which implies mutation, but it does not describe side effects, permissions, reversibility, or return behavior. This is a significant gap for a state-changing tool with no annotation support.
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, clear, front-loaded sentence with no unnecessary words. It efficiently communicates the essential purpose without 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 simple two-parameter tool, the description covers the core purpose, but it lacks context about return values, error conditions, or the fact that it's a write operation. With no output schema or annotations, the description should be more explicit about behavioral expectations to be 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%: both id and status have descriptions in the schema. The description adds minimal extra value by tying them to the action ('by its ID' and 'application status'), but it doesn't provide new details beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Update the application status of a job by its ID' clearly specifies the action (update), the resource (application status of a job), and the method (by ID). It effectively distinguishes this mutation tool from the read-only sibling tools like fetch_jobs, search_jobs, and get_pipeline.
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 context is implied: it's for changing a job's status rather than listing or searching jobs. However, the description does not explicitly state when to prefer this tool over alternatives or mention any exclusions or prerequisites, so it only meets the implied-usage bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_conferencesC
Search conferences by keyword.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
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 only says 'search by keyword' and does not disclose return format, pagination, or any side effects. The agent has no idea what the output looks like or if there are limitations.
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 with no redundancy. It is front-loaded and clear, though it could be slightly more informative without harming conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and annotations, the description should explain what the tool returns and how it behaves. It does not, leaving the agent with only the bare fact that it searches by keyword. The tool is simple but still needs more context to be 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 description adds minimal meaning to the 'query' parameter by calling it a keyword, but provides no details on expected format, matching behavior, or interpretation. With 0% schema description coverage, this is insufficient to guide correct parameter use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches conferences by keyword, providing a specific verb and resource. It distinguishes itself from sibling tools like fetch_conferences or list_upcoming_conferences by implying a keyword-based search, though it does not explicitly name alternatives.
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 on when to use this tool versus the sibling tools (e.g., fetch_conferences, list_upcoming_conferences). The description gives no context on preferred use cases or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsB
Full-text search across title, company, tags, domain.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry full behavioral disclosure. It states what fields are searched but does not mention return format, pagination, or whether it is read-only, leaving significant behavioral traits 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?
The description is a single, concise sentence that is front-loaded with the core action and resource. Every word adds value, with 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 the simple schema and lack of annotations or output schema, the description is adequate but leaves gaps. It clarifies search scope but does not explain expected results or how it differs from other job listing tools, making it minimally viable.
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 only provides a 'query' string with 0% coverage, so the description is essential. It adds meaning by specifying that the query is matched across title, company, tags, and domain, giving the parameter clear semantic 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 clearly states the tool performs a full-text search across the specific fields title, company, tags, and domain. It uses a specific verb and resource, though it doesn't explicitly distinguish from sibling tools like filter_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as filter_jobs or get_top_matches. The description implies use for text-based searching, but lacks explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_digest_emailA
Manually trigger a digest email. mode="daily" β jobs only; mode="weekly" β jobs + conferences.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | daily | weekly |
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 clearly states that the tool manually triggers an email and what content each mode includes. However, it does not disclose the broader side effects (e.g., emails are actually sent to recipients, irreversibility, permission requirements), which is notable for a mutating action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, with the primary action front-loaded. The mode mapping is presented in a compact, scannable format. Every word adds value, with no redundancy or filler.
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: one optional parameter, no output schema, no annotations. The description explains the parameter's effect and the tool's purpose. It could mention recipient behavior or side effects, but for a straightforward manual trigger, it is adequately 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 only lists 'mode' with 'daily | weekly' as a description. The tool description adds essential semantics by explaining what each mode does ('daily β jobs only; weekly β jobs + conferences'), enriching the schema and helping the agent select the correct value.
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 ('trigger') and clearly identifies the resource ('digest email'). It also distinguishes itself from sibling tools by specifying the two modes and their differing content (jobs only vs jobs + conferences), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool by explaining the two modes and their effects. It does not explicitly state alternatives or exclusions, but the naming and sibling context make it obvious this is the manual email-trigger tool, distinct from data-fetching tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_skillsA
Analyse the stored job database to suggest skills most in-demand that are NOT in your current stack.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 indicates a read-only analysis operation and specifies the criterion (skills not in current stack), but it doesn't clarify how 'current stack' is determined or whether there are any side effects. The safety profile is implied rather than stated.
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 directly states the purpose. Every word contributes meaning, with no fluff or repetition.
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?
Even without an output schema or annotations, the description provides sufficient context for an agent to know when to invoke the tool and what to expect. It explains the input (stored job database) and the output concept (in-demand skills not in stack), though it doesn't specify output format or count. For a zero-parameter analysis tool, this is adequately 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 tool has zero parameters and the schema is empty, so the baseline is 4. The description correctly doesn't invent parameters; it focuses on the overall behavior. No additional parameter information is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyses the stored job database to suggest in-demand skills not in the current stack, using specific verbs (analyse/suggest) and a clear resource. This distinguishes it from sibling tools that fetch jobs, matches, or conferences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when the user wants skill recommendations based on the job market, but it doesn't explicitly mention alternatives or exclusions. There is clear context but no guidance on when not to use this tool versus other job-related tools.
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.
13 tool updates
v1.0.0- First observed
fetch_conferences - First observed
fetch_jobs - First observed
filter_jobs - First observed
get_pipeline - First observed
get_stats - First observed
get_top_matches - First observed
list_new_jobs - First observed
list_upcoming_conferences - First observed
mark_job - First observed
search_conferences - First observed
search_jobs - First observed
send_digest_email - First observed
suggest_skills
TDQS
Scored across 13 tools
Tools are mostly distinct: fetch, list, search, filter, mark, pipeline, skills, conferences, email, stats each have clear roles. Minor overlap exists among job listing tools (list_new_jobs, get_top_matches, search_jobs, filter_jobs) but descriptions clarify their specific filters and purposes.
All tool names follow a consistent verb_noun pattern using lowercase with underscores (fetch_, list_, get_, search_, filter_, mark_, suggest_, send_). The pattern is uniform, and there are no mixed conventions or ambiguous verbs.
13 tools is well within the ideal 3-15 range for a server with this scope. The count feels balanced: 8 tools for job operations, 3 for conferences, plus digest email and stats, each earning its place without bloat.
The surface covers the main workflows: fetching/ingesting data, searching/filtering, managing a job pipeline, suggesting skills, sending digests, and viewing stats. Minor gaps exist such as no dedicated get_job_details or conference detail view, but these are workable via searches/filters.
Maintenance
Related MCP Connectors
Public MCP server for discovering open jobs. Search, filter, and get application links.
GetJobzi MCP server for job search, application tracking, and career forecasting.
AI job search MCP β fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that finds recent job postings based on your LinkedIn profile, scores each against your resume, and logs the results β all without logging into or scraping LinkedIn.MIT
- FlicenseAqualityDmaintenanceA local job-hunting MCP server for discovering jobs across pluggable web sources, tracking applications through a status lifecycle, and managing profiles/resumes, with geo/map-region search.12-
- AlicenseNot gradedqualityAmaintenanceA local-first, open-source MCP server that analyzes jobs, matches your CV, tailors documents, and tracks applications β all on your machine with no data uploaded.AGPL 3.0
- AlicenseAqualityAmaintenanceLive job postings read straight from 139 employers' own ATS APIs (Greenhouse, Lever, Ashby, Beisen, Moka). Every listing carries the employer's real posting date, days_open and a ghost_score β a board's "posted 2 days ago" is routinely 300 days old underneath. Heavy on AI infra, autonomous driving and embodied AI across the US, EU and China. No account, no signup, no rΓ©sumΓ© upload.56MIT