FoundRole MCP
OfficialThe FoundRole MCP server lets an AI assistant run a full job search inside a chat, covering search, fact-checks, tracking, reminders, alerts, and career guidance.
Search live jobs with natural-language queries and filters (title, location, company, salary floor, remote-only, H-1B sponsors, posted days ago, minimum match, ghost-post hiding) via
jobs_search.Get job details (
jobs_details) with full descriptions, requirements, salary benchmarks, resume match, H-1B/E-Verify signals, and ghost-job risk.Analyze external postings (
jobs_analyze_external) pasted from anywhere (LinkedIn, careers pages) for the same checks, and save them to the tracker (tracker_add_external).Compare jobs side by side (
jobs_compare) for 2–4 roles on fit, pay, sponsorship, and posting risk.Get personalized recommendations (
jobs_recommendations) ranked by resume match.Manage a job tracker (
tracker_list,tracker_add,tracker_update,tracker_update_status,tracker_remove) with statuses (saved → applied → interviewing → offered → archived), sub-statuses, notes, tags, deadlines, and salary info.Set, list, and delete reminders (
reminder_set,reminder_list,reminder_delete) with email + calendar (.ics) invites.Subscribe/unsubscribe to job alerts (
job_alert_subscribe,job_alert_list,job_alert_unsubscribe,job_alert_unsubscribe_all) with daily/weekly/monthly frequencies.Search career knowledge (
knowledge_search,knowledge_topics) for interview prep, salary negotiation, resume tactics, company research, and product feature pages.All actions are authenticated via OAuth 2.1 with PKCE, and results can render as interactive panels in supporting clients.
Allows creating calendar reminders for job follow-ups, which can be added to Google Calendar via .ics files.
Click on "Install 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., "@FoundRole MCPfind remote software engineer jobs posted this week"
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.
FoundRole MCP Server — AI Job Search in ChatGPT, Claude & Cursor
Ask ChatGPT or Claude for jobs and get real openings back — each one checked for whether it's still real, what it actually pays, and whether the company sponsors visas. The FoundRole MCP server connects your AI assistant to FoundRole's live job board, application tracker, and career knowledge base, so the whole job search runs inside the chat you already use.
Sign in once — your assistant handles it. The first time your AI calls FoundRole it opens a standard OAuth sign-in; approve it once in the browser and that covers everything: search, fact-checks, the tracker, reminders, and alerts. There is no API key to copy or rotate, and the account is free.
What your assistant can do
Search live jobs by asking. Openings straight from company career pages, refreshed hourly across 40+ industries. Natural language maps onto real filters — job title, location, company, salary range, posting date: "remote React jobs in NYC paying over $130k posted this week."
Get every posting fact-checked — free. Before you spend an evening on an application, three questions get answered with the evidence behind each call:
Is anyone actually hiring? Ghost-posting risk — whether the role has been reposted for months or looks like it's fishing for resumes.
Am I being underpaid? The pay against what employers in that market really file, so a hidden salary range stops being a guess.
Would they sponsor me? Whether the company has sponsored visas before, counted year by year from public filings.
See how well you fit. Match scoring against your resume and profile, plus personalized job recommendations ranked by fit.
See what hiring software reads off your resume — free. Ask, and you get back the version of you a parser extracts: job title, years, recognized skills, sections, contact details — plus what it loses on the way. It's the mechanical read, deterministic and repeatable, so the answer doesn't drift between asks. Paste the text into the chat, or check the resume already on your account.
Research before you commit. Dig into companies, industry sectors, and hiring by location to decide where to aim.
Compare roles side by side. "Compare these two" lines up fit, pay, sponsorship, and posting risk at once — so the choice stops being a feeling.
Paste a job from anywhere. LinkedIn, a careers page, a link a friend sent — paste the posting into the chat and it gets the same checks, and can sit in your tracker alongside FoundRole listings. Your assistant reads the text you provide; nothing crawls the site for you.
Stop losing track of applications. Save jobs to your Kanban application tracker and move them through Saved → Applied → Interviewing → Offered → Hired by asking. Attach notes, tags, expected salary, recruiter contacts, and deadlines. The same board shows up in the web app.
Never miss a follow-up. Set a reminder on any tracked job and get an email with a calendar (
.ics) invite for Google Calendar, Outlook, or Apple Calendar.Let the search come to you. Subscribe a search to recurring email alerts — daily, weekly, or monthly — so new matches land in your inbox.
Ask the awkward questions too. Interview prep, salary negotiation, resume tactics, company research — answers grounded in FoundRole's knowledge base, with the sources linked.
See results as real panels, not text walls. In clients that support MCP Apps (ChatGPT among them), search results, job details, and your tracker render as interactive panels right in the chat.
It's the same account and data as FoundRole.com — the MCP server just lets your AI drive it.
Related MCP server: recruiting-jobs-mcp
Free vs Pro
Search, the fact-checks on every posting, the tracker, reminders, and alerts are free with no usage limits. Pro adds screening: ask for remote-only, sponsors-only, a salary floor, risky postings hidden, or a minimum match, and your assistant filters the list before you ever see it — and tells you when it has. A free account still gets the full list back, with a note that those filters were not applied.
New here? The FoundRole AI Search guide walks through connecting each client step by step, with an FAQ.
Setup
Two ways to connect, depending on your client. Either way, your client opens a FoundRole sign-in the first time it connects — approve it once and you're set.
Option 1 — Remote server (recommended)
Point your client at the FoundRole MCP endpoint:
https://www.foundrole.com/mcpMost modern clients — ChatGPT, Claude, Cursor, VS Code — speak remote MCP (Streamable HTTP) natively, so this is all the configuration there is.
Option 2 — stdio bridge (for clients without remote MCP)
If your client only supports stdio transport, run this package locally with npx; it bridges stdio to the FoundRole endpoint and handles the OAuth sign-in for you:
npx @foundrole/ai-job-search-mcpConnecting your AI assistant
ChatGPT
Estimated time: ~1 minute
Open FoundRole in the ChatGPT app directory.
Click Add and approve the FoundRole sign-in when ChatGPT opens it.
Ask for jobs in any chat — no settings to configure, nothing to paste.
Claude Web/Desktop
Estimated time: ~2 minutes
Open Claude settings (profile / settings icon).
Find Connectors (or Tools) and click Add custom connector.
Name it
FoundRole.In the Remote MCP server URL field, paste:
https://www.foundrole.com/mcpSave, allow Claude to connect, and approve the FoundRole sign-in it opens. Then ask for jobs in the chat.
Cursor
Estimated time: ~1 minute
Install the FoundRole plugin from the Cursor Marketplace: open Customize in the sidebar, find FoundRole, and select Install. Approve the FoundRole sign-in Cursor opens, then ask for jobs in any chat.
The plugin lives in this repository — .cursor-plugin/plugin.json with the server declared in mcp.json. To try it before it is listed, symlink this repo into ~/.cursor/plugins/local/ and reload the window.
Manual setup — Cursor / VS Code / Windsurf
In Cursor, open Settings → MCP and add this to ~/.cursor/mcp.json:
{
"mcpServers": {
"foundrole": {
"url": "https://www.foundrole.com/mcp"
}
}
}In VS Code, add this to .vscode/mcp.json in your workspace (or your user mcp.json) — VS Code uses a different key and needs an explicit transport type:
{
"servers": {
"foundrole": {
"type": "http",
"url": "https://www.foundrole.com/mcp"
}
}
}Approve the FoundRole sign-in when your editor opens it, then ask for jobs in the chat.
Antigravity (Google)
Estimated time: ~1 minute
Install the plugin straight from this repository:
agy plugin install https://github.com/foundrole/jobs-mcp-proxyApprove the FoundRole sign-in Antigravity opens, then ask for jobs in the CLI. The plugin declares the server in mcp_config.json; to wire it up by hand instead, add the same entry to ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"foundrole": {
"serverUrl": "https://www.foundrole.com/mcp"
}
}
}Any other MCP client
The same address works everywhere: add https://www.foundrole.com/mcp as a remote server, or bridge stdio-only clients with npx @foundrole/ai-job-search-mcp.
Note: After you approve the sign-in, some clients need a restart (quit and reopen) before the connection goes live.
Try saying
"Find senior backend engineer roles in San Francisco posted this week."
"Which of these is least likely to be a ghost posting?"
"Does Stripe sponsor visas? What does this role really pay?"
"Compare the Stripe and Vercel roles on fit, pay, and sponsorship."
"Here's a posting from LinkedIn — run the same checks on it."
"Recommend jobs that match my resume."
"Save it to my tracker and mark it Applied."
"Remind me to follow up next Tuesday morning."
"What's in my Interviewing column right now?"
"Subscribe me to weekly alerts for remote React jobs."
"How do I answer 'walk me through your resume'?"
Security
OAuth 2.1 with PKCE. You sign in to FoundRole through a standard authorization flow — short-lived tokens, instant revocation, no credentials shared with the AI client, no API key to copy, store, or leak.
HTTPS only, with dynamic client registration and redirect-URI validation.
Streamable HTTP transport (direct), or stdio via this proxy.
It never applies or emails anyone as you.
Troubleshooting
Asked to sign in / "needs authentication":
Expected on first connect — the server authenticates every session. Complete the FoundRole sign-in in the browser window your client opens.
If tools still don't appear afterward, restart the client or reconnect the connector so the authorization is re-sent.
"Connection failed":
Check your internet connection and that the URL is exactly
https://www.foundrole.com/mcp.Confirm your client supports remote HTTP MCP; if not, use the stdio bridge (Option 2).
"Command not found" (stdio clients):
Install Node.js (see
enginesinpackage.jsonfor the required version), then retry, or install globally:npm install -g @foundrole/ai-job-search-mcpand runai-job-search-mcp.
Connector not working:
Double-check the URL, complete the sign-in, and restart the AI client — some clients only pick up the connection after a restart.
Explore the data behind the answers
The same data your assistant reads is browsable on FoundRole:
How It Works — where the openings come from and how each posting gets its ghost, pay, and visa checks
H1B Salary Explorer — certified wages employers filed with the U.S. Department of Labor, charted by sector, industry, location, and role
H1B Sponsor Rankings — top visa-sponsoring companies by median filed wage, browsable by industry, sector, city, and state
Company Directory — open roles, salary data, and visa sponsorship history for any employer
Industry Sectors — who's hiring across 40+ industries
Hiring by Location — openings and wage benchmarks by state and metro
Job Tracker — the Kanban board your assistant manages, in the browser
Resume Checker — upload a resume and see what hiring software reads off it, section by section
Resume Builder — build a version per target role and export PDF, DOCX or TXT free, no watermark
Live Job Board — browse the listings directly
Help
🌐 Website: www.foundrole.com — free AI job search, application tracker, and company research
📖 Setup guide & FAQ: foundrole.com/ai-search-mcp
🐛 Issues: GitHub Issues
💬 Questions: dev@foundrole.com
Connect your AI client, sign in once, and run the whole job search from the chat — search, fact-checks, tracking, reminders, and alerts, free at FoundRole.
Made by the FoundRole team.
Available Tools
20 toolsjob_alert_listARead-onlyInspect
Lists the authenticated user's job alerts across all subscription sources (regular, company page, MCP).
Input:
status: Filter by status — one of pending, active, unsubscribed (optional, default: all statuses)limit: Number of results to return (default 20, max 50)offset: Number of results to skip (default 0)
Output: Returns the user's job alerts with pagination info and a summary of the underlying job search (query, location, company where available). Each response includes a system_instruction describing how to present the results for the current client.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (default 20, max 50) | |
| offset | No | Number of results to skip (default 0) | |
| status | No | Filter by status: pending, active, unsubscribed |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| jobAlerts | No | |
| totalCount | No | |
| frequencies | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds value by detailing the output includes pagination info, a summary of the underlying job search, and a system_instruction for presenting results, which goes beyond simple read-only semantics.
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 well-structured with clear Input/Output sections, each sentence providing essential information without redundancy. It is appropriately sized and leaves no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter set (3 optional params, no nested objects), the presence of an output schema, and annotations, the description sufficiently covers the tool's behavior. It even mentions the system_instruction and summary info, making it complete for an agent to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description's Input section merely restates the parameter names, defaults, and ranges already present in the schema. The description adds no extra semantic value beyond what the schema provides, 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 clearly states the tool lists the authenticated user's job alerts across all subscription sources, using a specific verb (Lists) and resource (job alerts). It distinguishes itself from sibling tools like job_alert_unsubscribe by focusing on read-only listing.
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 context by specifying it returns alerts for the authenticated user and covers all subscription sources, but it does not explicitly mention when to choose this over alternatives like job_alert_unsubscribe. There are no exclusions, but no explicit alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_alert_subscribeAIdempotentInspect
Subscribes the authenticated user to job alerts for a specific saved job search.
Input:
job_search_id: The job search identifier to subscribe to (required). Accepts either the job search UUID or the composite job ID returned byjobs_search/jobs_details(format: "seo_id--job_search_id").frequency: Alert frequency — one of daily, weekly, monthly (optional, defaults to "weekly")
Output: Returns the created or updated job alert with id, status, and frequency. Idempotent: calling this tool for an already-subscribed search updates the existing alert without creating a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| frequency | No | Alert frequency: daily, weekly, monthly (defaults to "weekly") | |
| job_search_id | Yes | Job search UUID or composite job id ("seo_id--job_search_id") from jobs_search results |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobAlert | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description expands on the idempotentHint annotation by explaining that an existing subscription is updated without duplication. It also states the output shape (id, status, frequency) and notes the auth requirement. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with Input/Output sections. Each sentence contributes value, and it is appropriately sized for the tool's complexity.
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 an output schema present and annotations covering safety and idempotency, the description provides output details and behavioral context. It is sufficiently complete for a simple two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers 100% of parameters with equivalent descriptions, including accepted formats and default for frequency. The description repeats these details without adding significant new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Subscribes the authenticated user to job alerts for a specific saved job search,' using a specific verb and resource. This clearly distinguishes the tool from siblings like job_alert_unsubscribe and job_alert_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context such as being for an authenticated user, targeting a saved job search, and being idempotent. However, it does not explicitly compare with sibling tools or state when not to use it, making usage guidance implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_alert_unsubscribeADestructiveInspect
Unsubscribes the authenticated user from job alerts for a specific job search.
Input:
job_search_id: The job search identifier to unsubscribe from (required). Accepts either the job search UUID or the composite job ID returned byjobs_search/jobs_details(format: "seo_id--job_search_id").
Output: Confirms the alert has been unsubscribed. Idempotent: returns success even when the user was not subscribed or is already unsubscribed.
| Name | Required | Description | Default |
|---|---|---|---|
| job_search_id | Yes | Job search UUID or composite job id ("seo_id--job_search_id") from jobs_search results |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive (destructiveHint=true) and not read-only. The description adds valuable behavioral context beyond annotations: it states the operation is idempotent ('returns success even when the user was not subscribed or is already unsubscribed') and confirms the output ('Confirms the alert has been unsubscribed'). This gives the agent a clear safety profile beyond the binary hint.
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 compact and well-structured: a one-sentence purpose, then clearly labeled Input and Output sections, followed by a one-line behavioral note. Every sentence earns its place with no filler 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?
For a single-parameter tool with annotations and an output schema, the description fully covers the input format, the output confirmation, and the idempotent behavior. No missing context is apparent for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the parameter with 100% coverage, and the description essentially repeats the same information (job search UUID or composite job ID from jobs_search/jobs_details). No new meaning is added beyond the schema, so with high schema coverage 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 opens with a specific verb+resource: 'Unsubscribes the authenticated user from job alerts for a specific job search.' This clearly distinguishes the tool from siblings like job_alert_subscribe, job_alert_list, and job_alert_unsubscribe_all by targeting a single job search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context ('for a specific job search') and the input requirements, but it does not explicitly state when to choose this tool over alternatives (e.g., 'use unsubscribe_all for all alerts') or mention any exclusions. The sibling tool names provide some context, but the description itself lacks direct usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_alert_unsubscribe_allADestructiveIdempotentInspect
Unsubscribes the authenticated user from ALL of their job alerts at once, across every subscription source (regular, company page, MCP).
Input:
confirm: Must betrueto execute. The call is rejected when omitted or not true — this guards against an unintended bulk unsubscribe.
Output: Confirms how many alerts were unsubscribed. Idempotent: returns success even when the user has no active alerts.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Set to true to confirm unsubscribing from every alert; the call is rejected otherwise |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: the confirm parameter must be true (with rejection otherwise), it reports the number unsubscribed, and it is idempotent (returns success even with no active alerts). This complements the idempotentHint and destructiveHint annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a clear purpose sentence, then Input/Output sections, and an idempotency note. Every sentence adds useful information with no wasted words or repetition of structured fields.
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 parameter) and the description covers what it does, the confirmation guard, the output behavior, and idempotency. With annotations and an output schema present, the description is complete enough for an agent to use the tool correctly without further 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 coverage is 100% for the single parameter, so the schema already documents the confirmation requirement. The description repeats this and adds the rationale about guarding against unintended bulk unsubscribe, but this is marginal extra value. The baseline of 3 is appropriate when the schema carries the parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool unsubscribes the authenticated user from ALL job alerts across every subscription source (regular, company page, MCP). It uses a specific verb+resource+scope and inherently distinguishes itself from the sibling 'job_alert_unsubscribe' by emphasizing 'ALL' and 'at once'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates this is a bulk operation for all alerts, implying it should be used when the intent is to unsubscribe from everything at once. It does not explicitly name alternatives or state when not to use it, but the scope is clear enough that an agent would not confuse it with a single-alert unsubscribe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_analyze_externalAInspect
Analyzes one job found outside FoundRole using the authenticated user's FoundRole profile and the same signals used for FoundRole jobs: resume match, missing skills, H-1B sponsorship history, E-Verify, ghost-job risk, posted compensation, and market salary estimates. Use tracker_add_external only when the user asks to save without analysis.
The input represents the direct posting URL and all job content already available in the conversation.
The five text identity fields are required; every structured fact field is optional, with a fact the
source does not state simply omitted (or null). The optional client_extraction object carries
evidence-backed skills, technology, benefits, bonuses, seniority, industry, management, clearance,
visa, and remote-scope labels when source excerpts for them exist. FoundRole validates the evidence,
stores the client extraction separately, derives missing deterministic facts, and reports which
values were provided, derived, accepted, rejected, or remain unknown.
The output includes comparisonRef; retain it exactly for a later jobs_compare call. The analysis is a
decision aid, not a guarantee about sponsorship, legitimacy, compensation, or hiring outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Direct URL of the specific job posting; a company homepage is invalid | |
| posted_at | No | Posting date as ISO 8601, when the source states it | |
| title_name | Yes | Job title from the posting | |
| description | Yes | Complete posting text available in the conversation; a source summary is valid only when no fuller posting text is available | |
| salary_type | No | Salary period: year, month, week, day, hour | |
| company_name | Yes | Company name from the posting | |
| salary_value | No | Single salary amount, when the posting gives one figure instead of a range | |
| location_name | Yes | Location text from the posting, including Remote when stated | |
| employment_type | No | Employment types: full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other | |
| salary_currency | No | ISO 4217 salary currency code, when stated | |
| salary_max_value | No | Salary range maximum, when stated | |
| salary_min_value | No | Salary range minimum, when stated | |
| client_extraction | No | Evidence-backed facts extracted by the client model from the posting; non-null evidence is a short source excerpt rather than an inference. Fields absent from the source are omitted or null. | |
| experience_months | No | Minimum required experience in months, when stated | |
| work_location_type | No | Work arrangement: on_site, remote, hybrid | |
| education_requirements | No | Education requirements: no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| mode | Yes | |
| statusOrder | Yes | |
| derivedFields | Yes | |
| trackerWebUrl | Yes | |
| unknownFields | Yes | |
| providedFields | Yes | |
| clientExtraction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses that FoundRole validates evidence, stores the client extraction separately, derives missing deterministic facts, and reports which values were provided, derived, accepted, rejected, or unknown. It also warns that the analysis is a decision aid, not a guarantee about sponsorship, legitimacy, compensation, or hiring outcome.
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 organized into three focused paragraphs: purpose, input semantics, and output/limitations. It is dense but every sentence contributes essential context—no filler or repeated schema content—making it appropriately sized for the tool's complexity.
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 16 parameters, nested client_extraction object, and existing output schema, the description covers all critical aspects: what the tool does, required vs optional input, the evidence-backed nature of client_extraction, the comparisonRef need for later jobs_compare calls, and the decision-aid disclaimer. It is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful context by explaining that the five text identity fields are required, all structured fact fields are optional, and fields absent from the source are simply omitted or null. It also clarifies that client_extraction must contain evidence-backed facts rather than inferences, which is not fully captured by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Analyzes one job found outside FoundRole using the authenticated user's FoundRole profile and the same signals used for FoundRole jobs,' which clearly specifies the verb, resource, and scope. It also distinguishes itself from sibling tracker_add_external by explicitly noting the save-without-analysis alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use tracker_add_external only when the user asks to save without analysis.' It also clarifies that the input must be the direct posting URL and all job content already available in the conversation, and that the five text identity fields are required while structured fact fields are optional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_compareARead-onlyInspect
Compares 2 to 4 jobs side by side using the same FoundRole analysis fields: resume match, missing skills, H-1B and E-Verify signals, ghost-job risk, posted pay, and market salary estimates.
comparison_refs accepts exact FoundRole job IDs returned by jobs_search and exact external
comparisonRef URLs returned by jobs_analyze_external. Analyze each outside job first; a bare URL that
has not been analyzed cannot be compared because FoundRole does not have its posting facts. Preserve
every reference exactly, keep the user's requested order, and do not send duplicates.
| Name | Required | Description | Default |
|---|---|---|---|
| comparison_refs | Yes | Two to four exact FoundRole job IDs or external comparisonRef URLs |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| mode | Yes | |
| statusOrder | Yes | |
| trackerWebUrl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description discloses important non-obvious behaviors: external jobs must be analyzed first because FoundRole does not have posting facts otherwise, references must be exact, order must be preserved, and duplicates are not allowed. These are operational constraints that materially affect invocation, and they are clearly stated. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: two paragraphs with three sentences total. The first sentence front-loads the core action and fields. The second paragraph provides necessary constraints in a structured, easy-to-follow manner. Every sentence earns its place with no fluff or repetition of schema details.
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 parameter), has an output schema, and comes with annotations. The description covers the essential context: what inputs are valid, what the prerequisite is, and what constraints apply. The return value is not described, but an output schema exists and the comparison fields are already listed. This is complete for 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?
Although the schema already provides a decent description of comparison_refs, the tool description adds significant meaning: the accepted values are exact IDs from jobs_search and exact URLs from jobs_analyze_external, the prerequisite to analyze external jobs, and the requirements to preserve order and avoid duplicates. This goes well beyond the schema's item description and makes the parameter semantics unambiguous.
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 'Compares 2 to 4 jobs side by side' using specific analysis fields, making the verb and resource explicit. It differentiates from sibling tools by referencing jobs_search and jobs_analyze_external as input sources, which is exactly what distinguishes this comparison tool from search, details, or external analysis tools.
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 explicit when-to-use guidance: comparing 2 to 4 jobs. It specifies that inputs must be exact FoundRole IDs from jobs_search or external comparisonRef URLs from jobs_analyze_external, and includes a critical prerequisite: analyze external jobs before comparing. It also gives behavioral instructions like preserving order and avoiding duplicates, which helps the agent know how to construct the request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_detailsAInspect
Fetches full details for one job by the id returned from jobs_search — the deeper view behind a search result.
Input:
job_id: The exact ID string from theidfield of ajobs_searchresult.
Output: Complete job details: description, skills, benefits, requirements, salary benchmark, resume match, H-1B and E-Verify signals, job-trust analysis, and application link. Personalized and extended insight fields follow the authenticated user's current entitlements.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The unique identifier of the job from jobs_search results |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackerWebUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide limited safety signals (readOnlyHint=false), but the description clarifies the operation is a fetch and adds behavioral context: output contains personalized fields tied to authenticated user entitlements. It does not overpromise or contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear Input/Output sections, uses bold labels effectively, and packs all necessary information into a compact block. No filler or redundant 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 a single parameter, an output schema, and clear relationship to jobs_search, the description fully covers the tool's purpose, input provenance, and output scope. It does not need to explain return fields since an output schema is present.
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 already describes job_id as the unique identifier from jobs_search. The description reinforces that it must be the exact `id` string from a search result, which adds marginal precision but no new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Fetches'), names the resource ('full details for one job'), and ties it to the ID from jobs_search. It clearly distinguishes itself from sibling search tools as the 'deeper view behind a search result'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use it: with a job ID returned from jobs_search. It implies the complementary relationship to jobs_search but does not explicitly name alternative tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_recommendationsAIdempotentInspect
Returns the authenticated user's personalized job recommendations built from their resume, skills, target roles, and preferred location. Results are ranked by fit, may include related roles, and carry the same salary, match, H-1B, and job-trust insight payload used by job search.
A processing status means the personalized feed is still being prepared; a later call returns the completed feed. Page numbers fetch additional recommendations from the same feed.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Recommendation page number | |
| location | No | Optional preferred location name or slug |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | |
| feedKind | No | |
| nextPage | No | |
| feedStatus | No | |
| totalCount | No | |
| jobSearchId | No | |
| statusOrder | No | |
| revalidating | No | |
| trackerWebUrl | No | |
| profileSetupUrl | No | |
| profileSetupState | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral details beyond annotations: the processing status page, eventual completion on later calls, and pagination from the same feed. It also discloses that results carry specific insight payloads. Annotations already cover idempotency and non-destructiveness, and the description does not contradict them.
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 short paragraphs, front-loaded with the core purpose, then adding behavior notes. Every sentence provides useful information—ranking, related roles, payload, processing status, and pagination—without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (not shown) and two optional params, the description covers the key aspects: what is returned, how it's ranked, what payload to expect, handling of processing status, and pagination behavior. It is complete enough for an agent to select and invoke the tool correctly, especially with the sibling context of jobs_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 coverage is 100%, so the baseline is 3. The description enhances understanding of the 'page' parameter by explaining that page numbers fetch additional recommendations from the same feed, and it clarifies that 'location' is optional and affects the feed. This adds meaning beyond the raw schema descriptions.
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 returns personalized job recommendations built from user-specific inputs (resume, skills, target roles, location). It distinguishes this from sibling tools like jobs_search by emphasizing personalization and ranking, making the 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 provides clear context for when to use this tool (personalized feed, ranked results, same payload as job search) and even covers pagination and processing status. It does not explicitly name alternative tools or say 'when not to use', but the context is strong enough to guide correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_searchAInspect
Searches a database for real-time job listings matching the user's criteria.
The query is the full job title or role: "Ruby Developer" or "Ruby on Rails Engineer" rather than a bare keyword like "Ruby", which is too broad and matches unrelated fields. Results may be filtered by location, company, and how recently a job was posted.
Each result carries an id; jobs_details takes that id and returns the job's full description,
requirements, and benefits. The response also carries a nextCursor for the next page of
results; a follow-up page is fetched by passing only that cursor, with no other search parameters.
Authenticated results include resume match data when a profile is available. Job details include FoundRole salary benchmarks, H-1B sponsorship signals, E-Verify status, and job-trust analysis; list-level employer signals follow the user's current entitlements.
Advanced constraints in the user's request — remote-only work, H1B sponsorship, a minimum salary, hiding risky postings, a minimum match score — are the search parameters remote, h1b_sponsors_only, salary_floor, hide_low_quality, and min_match. The search enforces only constraints passed as parameters; a constraint left out of the call is not applied to the result set. FoundRole Pro accounts receive the screened list; other accounts receive the full list and the response reports that the advanced filters were not applied.
Each response includes a system_instruction describing how to present the results for the current client.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | The full job title or skill (e.g., "Ruby Developer", NOT just "Ruby") | |
| cursor | No | Pagination cursor. Treat as an opaque string. COPY EXACTLY. | |
| remote | No | Advanced filter: only remote-eligible jobs (respects the location/region scope). | |
| company | No | The official company name | |
| location | No | Geographic location (e.g., 'Boston, MA') | |
| min_match | No | Advanced filter: minimum personal FoundRole match score (0-100); needs a resume on the account. | |
| salary_floor | No | Advanced filter: minimum annualized salary in USD; a posting qualifies when the midpoint of its pay band reaches the floor. Jobs without salary data are dropped. | |
| posted_days_ago | No | Number of days ago to search for jobs (1-365) | |
| hide_low_quality | No | Advanced filter: hides postings with a risky ghost grade (D/F); ungraded postings stay. | |
| h1b_sponsors_only | No | Advanced filter: only companies known to sponsor H1B visas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | |
| feedKind | No | |
| feedStatus | No | |
| jobSearchId | No | |
| statusOrder | No | |
| revalidating | No | |
| trackerWebUrl | No | |
| profileSetupUrl | No | |
| profileSetupState | No | |
| lowRelevanceNotice | No | |
| proFilterUpsellUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no meaningful annotation hints (readOnlyHint false does not indicate side effects), the description carries the burden and does well: it reveals that only passed parameters are enforced, that Pro accounts receive a screened list while others get the full list, and that responses include a system_instruction. This goes beyond the schema and annotations, though it omits potential error scenarios or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured but verbose, with multiple paragraphs covering job details, account tiers, and response instructions that may extend beyond the search action itself. While each sentence adds some context, the length could be trimmed without losing core meaning, making it less concise that ideal.
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 complexity (10 parameters, output schema, heterogeneous behaviors), the description is remarkably complete: it covers pagination via `nextCursor`, authentication-based resume data, Pro vs. non-Pro filtering behavior, and the presence of `system_instruction` in responses. The existing output schema handles return structure, so no further detail is needed.
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%, giving a baseline of 3. The description adds value by explaining the query parameter format ('full job title or role'), explicitly listing the advanced filters and how they map to parameters, and clarifying that omitted constraints are not applied. This enhances semantics beyond the schema descriptions.
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 opens with a clear, specific statement: 'Searches a database for real-time job listings matching the user's criteria.' It distinguishes itself from sibling tools by explicitly mentioning jobs_details for fetching full job descriptions using the `id` from search results, and it implies a search-specific role relative to recommendation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on how to use the search (e.g., use full job titles, not bare keywords) and directs to jobs_details for full descriptions. However, it does not explicitly state when not to use this tool or mention alternatives such as jobs_recommendations, though the query guidance and mention of jobs_details offer partial differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_searchARead-onlyIdempotentInspect
Searches FoundRole's published content by semantic similarity and returns the most relevant sources for a job-search question: career-guidance blog articles plus FoundRole site pages that describe the product's features (job tracker, Pro plan and pricing, H1B salary data, AI job search) and industry/sector career landings. Each article carries a title, url, summary, a content excerpt, publication date, and tags; each page carries a title, url, description, and its FAQ entries — enough material to answer the question and link the source.
Three optional facets add further result groups: company returns FoundRole's employer profile pages matching that company name; job_title and location return the live job-listing landing pages for that role and place, with open-job counts. The facets describe what the user is asking about — a company mentioned only in passing does not need the company facet.
Returns empty groups when nothing is relevant rather than padding with off-topic content. Results are the closest matches to the given question, not an index of the site's full coverage; questions about overall topic coverage are answered by knowledge_topics, which lists the blog's categories and tags with article counts. It does not search job listings; jobs_search covers live roles. Each response includes a system_instruction describing how to present the sources.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum articles to return (default 5) | |
| query | Yes | The career, job-search, or FoundRole product question to answer | |
| company | No | A company name, when the question is about that employer — returns FoundRole company profile pages | |
| location | No | A city, state, or country refining job_title, or alone when the question is about jobs in that place | |
| job_title | No | A job title or role, when the question is about openings for it — returns job-listing landing pages |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | No | |
| proUrl | No | |
| articles | No | |
| totalCount | No | |
| companyPages | No | |
| landingPages | No | |
| profileSetupUrl | No | |
| system_instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation read-only and non-destructive, but the description adds meaningful behavior: returns empty groups rather than padding with off-topic content, returns closest matches rather than a full index, and includes a system_instruction in each response. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical, but each sentence contributes meaning: core purpose, facet semantics, exclusions, behavioral guarantees, and response instructions. It is front-loaded with the main purpose before optional details, and no unnecessary repetition detracts from the value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's five parameters, multiple sibling tools, and rich output schema, the description covers the full context needed for correct invocation: what it searches, what facets mean, what it deliberately does not search, and how results behave. The agent is well-equipped to select and call this tool.
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. The description goes beyond schema by explaining when each facet should be supplied and what it returns, e.g., company returns employer profile pages and job_title/location return job-listing landing pages.
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 opens with a specific verb and resource: 'Searches FoundRole's published content by semantic similarity.' It clearly distinguishes from siblings by explicitly noting that knowledge_topics covers topic coverage and jobs_search covers live roles.
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?
Provides explicit when-to-use guidance, such as 'a company mentioned only in passing does not need the company facet' and names alternatives for topic coverage and live job listings. This prevents the agent from misusing the tool for out-of-scope queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_topicsARead-onlyIdempotentInspect
Lists what FoundRole's published career-guidance blog covers: every category and the most-used tags, each with its published-article count and url, plus the total number of published articles. This is the factual source for questions about the blog's topics or overall coverage. It takes no parameters and reflects the live published corpus. It does not retrieve articles for a specific question; knowledge_search does that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | |
| categories | No | |
| totalArticles | No | |
| system_instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: the tool takes no parameters and 'reflects the live published corpus,' which implies real-time consistency. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the action and scope, followed by usage guidance and an explicit alternative. Every sentence contributes value: what it lists, when to use, and a contrast with knowledge_search. 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 zero-parameter tool, the description covers the purpose, output content (categories, tags, counts, url, total), usage context, and an explicit alternative tool. An output schema exists, so return values need not be spelled out. The description is sufficiently complete for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% (empty properties object). The description explicitly says 'It takes no parameters,' which confirms the absence of any inputs. Baseline for 0 params is 4, and the description adds no further parameter explanation 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 uses the specific verb 'Lists' and names the resource ('FoundRole's published career-guidance blog') with concrete deliverables (categories, tags, counts, url, total count). It distinguishes from sibling tool knowledge_search by explicitly stating what it does not do ('does not retrieve articles for a specific question; knowledge_search does that').
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 states when to use this tool ('factual source for questions about the blog's topics or overall coverage') and provides an explicit exclusion with the alternative ('It does not retrieve articles for a specific question; knowledge_search does that'). This gives clear guidance on choosing between sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_deleteADestructiveInspect
Deletes a reminder from a tracked job.
Input:
tracked_job_id: The tracked job ID —trackedJobs[].idfrom tracker_list output, distinct fromtrackable.idandjob.id(required)
Output: Returns the updated tracked job with reminderAt cleared.
| Name | Required | Description | Default |
|---|---|---|---|
| tracked_job_id | Yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation is known. The description adds the specific effect: 'reminderAt cleared' and 'Returns the updated tracked job', giving concrete behavioral context beyond the annotations. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sections plus a one-sentence summary. It front-loads the purpose, then details input and output in a structured list. Every sentence is necessary and no redundancy is present.
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 one-parameter destructive tool with a clear output schema and existing annotations, the description covers the essential input nuance (ID distinction) and the result (updated tracked job). Minor omissions such as idempotency or error behavior are acceptable given the richness of the output schema and 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?
The single parameter's description in the schema is identical to the tool description's input section, so no extra meaning is added beyond the schema. With 100% schema description coverage, the baseline is 3 and no bonus is warranted.
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 opening sentence 'Deletes a reminder from a tracked job' clearly identifies the action (delete) and resource (reminder from a tracked job). This distinguishes it from siblings such as reminder_set (which presumably creates/updates) and tracker_remove (which would remove the entire tracked job).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit when-to-use guidance or alternatives. It does clarify which ID to use ('tracked_job_id... distinct from trackable.id and job.id'), but that is parameter-level, not usage guidance. The intended usage is only implied by the verb 'deletes' and sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_listARead-onlyInspect
Lists tracked jobs that have reminders set, ordered by reminder time (soonest first).
Input:
limit: Number of results to return (default 20, max 50)
Output: Returns a list of tracked jobs with active reminders.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (default 20, max 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJobs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds behavioral detail by specifying that results are ordered by reminder time and that only active reminders are included. This goes beyond the basic read-only annotation.
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 extremely concise, with a single opening sentence stating the purpose, followed by clearly labeled Input and Output sections. Every word contributes to understanding the tool's behavior, and there is no redundant or filler 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?
For a simple tool with one optional parameter, the description covers the core behavior, ordering, and output. It does not mention edge cases such as empty results or what happens when no reminders exist, but given the schema and annotations, the description is sufficiently complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the 'limit' parameter with default and max values. The description repeats the exact same wording in its Input section, adding no new semantic value. Since schema coverage is 100%, 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 uses a specific verb 'Lists' and identifies the exact resource 'tracked jobs that have reminders set', with a clear ordering detail ('ordered by reminder time (soonest first)'). This clearly distinguishes it from sibling tools like tracker_list or reminder_set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit usage guidance or alternatives are mentioned. The intent is implied from the name and purpose, but there is no contrast with sibling tools such as tracker_list or job_alert_list. The description focuses only on what the tool does, not when to prefer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_setADestructiveInspect
Sets a reminder for a tracked job. Sends a confirmation email with .ics calendar attachment.
Input:
tracked_job_id: The tracked job ID —trackedJobs[].idfrom tracker_list output, distinct fromtrackable.idandjob.id(required)remind_at: Reminder date/time in ISO 8601 format, e.g. "2025-03-15T10:00:00Z" (required, must be in the future)
Output: Returns the updated tracked job with reminderAt field.
| Name | Required | Description | Default |
|---|---|---|---|
| remind_at | Yes | ISO 8601 datetime, e.g. "2025-03-15T10:00:00Z" (must be in the future) | |
| tracked_job_id | Yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a notable side effect beyond annotations: it sends a confirmation email with an .ics attachment. It also states the output (updated tracked job with reminderAt field). While it doesn't elaborate on the destructiveHint behavior (e.g., whether an existing reminder is overwritten), the additional email side effect and output description add meaningful transparency beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: it opens with a clear one-sentence purpose, then uses bullet points for input parameters, and closes with an output note. Every sentence contributes useful information, and the structure makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two parameters and an output schema (not shown here), the description covers the essential aspects: purpose, input requirements, side effects (email), and return value. It could have addressed the destructive behavior (e.g., what happens if a reminder already exists), which is hinted by the annotation, but overall it is sufficiently complete for 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 coverage is 100%, so parameters are already documented. The description adds extra value by clarifying that `tracked_job_id` must be `trackedJobs[].id` from tracker_list output, and explicitly distinguishes it from `trackable.id` and `job.id`. It also reiterates the future-date requirement for `remind_at`, reinforcing schema guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: "Sets a reminder for a tracked job." This is a specific verb+resource combination. It also adds a distinguishing side effect: "Sends a confirmation email with .ics calendar attachment." This differentiates it from other reminder tools like reminder_delete and reminder_list, and from generic job update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: it is for tracked jobs, requires a future date, and specifies that `tracked_job_id` comes from `tracker_list` output. It does not explicitly mention alternatives or exclusions, but the context is sufficient for an agent to understand its applicability relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_addAInspect
Tracks a job from jobs_search results in the user's job tracker, identified by its job_id. For a job found elsewhere on the open web (with a URL but no jobs_search job_id), tracker_add_external is the right tool instead.
Fields:
job_id: the job ID from jobs_search results (required)status: initial status (saved, applied, interviewing, offered, archived); defaults to "saved"sub_status: sub-status within the main status: saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_companynotes: notes about the job
Returns the tracked job with its details. Repeated saves return the existing tracked job. A job that was previously removed from the tracker is restored with its earlier status and notes.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Notes about this job | |
| job_id | Yes | The job ID from jobs.search results | |
| status | No | Initial tracking status: saved, applied, interviewing, offered, archived | |
| sub_status | No | Sub-status within the main status, valid only for that status — saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_company |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations indicate this is a non-read-only, non-destructive mutation, but the description adds crucial behavioral details: repeated saves return the existing tracked job, and previously removed jobs are restored with their earlier status and notes. This goes beyond the structured metadata and provides clear behavioral transparency.
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 well-structured with a purpose statement, alternative guidance, and field details. However, it repeats the full sub_status enumeration that is already in the schema, which adds unnecessary length. The front-loaded purpose and behavior summary are concise, but the field list could have referenced the schema instead of duplicating it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters and an output schema, the description covers purpose, alternatives, parameter semantics, default behavior, return value, idempotency, and restoration. It is complete enough for an agent to correctly invoke the tool without ambiguity or missing 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 schema already provides 100% description coverage for all parameters, so the baseline is 3. The description adds valuable context by noting job_id is required, specifying the default for status ("saved"), and clarifying the source of job_id (from jobs_search results). These additions enhance understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool tracks a job from jobs_search results using its job_id, which is a specific verb+resource+identifier. It explicitly distinguishes itself from tracker_add_external, which is for jobs found elsewhere on the open web. This provides strong differentiation from sibling tools.
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 explicit when-to-use guidance: use this tool for jobs from jobs_search, and tracker_add_external for jobs with a URL but no jobs_search job_id. It also describes behavior on repeated saves and restoration of removed jobs, which informs usage expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_add_externalAInspect
Saves a job posting found anywhere on the open web into the user's tracker. For jobs that came from jobs_search results, tracker_add (which takes a job_id) is the right tool instead. A job seen elsewhere in the conversation needs no prior jobs_search call — its URL and details from the conversation are sufficient input.
url, company_name, title_name, location_name, and description identify the posting
and are the only required fields. Every structured fact field (salary, dates, employment type,
education, experience) is optional: a fact the source does not state is simply omitted (or
null), and FoundRole's own extractors derive missing salary, employment, work-arrangement,
education, experience, skills, benefits, and bonuses from the description. A save never waits
on facts the source did not provide. The optional client_extraction object carries
evidence-backed skills, technology, benefits, bonuses, seniority, industry, management,
clearance, visa, and remote-scope labels when source excerpts for them exist; FoundRole
validates and stores those labels separately.
Fields:
url: the job posting's direct URL (required; not a company homepage)company_name: company name (required)title_name: job title (required)location_name: location, e.g. "New York, NY" (required)description: the posting's description from the source result; a short summary is acceptable (required)salary_min_value/salary_max_value: salary range bounds (numbers)salary_value: a single salary figure when there is no range (number)posted_at: ISO 8601 posting datesalary_currency: ISO 4217 currency codesalary_type: one of year, month, week, day, houremployment_type: array of full_time, part_time, contractor, temporary, intern, volunteer, per_diem, otherwork_location_type: one of on_site, remote, hybrideducation_requirements: array of no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degreeexperience_months: minimum required experience in months (number)client_extraction: evidence-backed extraction object; fields without source evidence are omittedstatus: initial tracking status (saved, applied, interviewing, offered, archived); defaults to "saved"sub_status: sub-status within the main status: saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_companynotes: notes about the job
Returns the tracked job. Repeated saves return the existing tracked job.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Direct URL of the specific job posting; a company homepage is invalid | |
| notes | No | Notes about this job | |
| status | No | Initial tracking status: saved, applied, interviewing, offered, archived | |
| posted_at | No | Posting date as ISO 8601, when the source states it | |
| sub_status | No | Sub-status within the main status, valid only for that status — saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_company | |
| title_name | Yes | Job title from the posting | |
| description | Yes | Complete posting text available in the conversation; a source summary is valid only when no fuller posting text is available | |
| salary_type | No | Salary period: year, month, week, day, hour | |
| company_name | Yes | Company name from the posting | |
| salary_value | No | Single salary amount, when the posting gives one figure instead of a range | |
| location_name | Yes | Location text from the posting, including Remote when stated | |
| employment_type | No | Employment types: full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other | |
| salary_currency | No | ISO 4217 salary currency code, when stated | |
| salary_max_value | No | Salary range maximum, when stated | |
| salary_min_value | No | Salary range minimum, when stated | |
| client_extraction | No | Evidence-backed facts extracted by the client model from the posting; non-null evidence is a short source excerpt rather than an inference. Fields absent from the source are omitted or null. | |
| experience_months | No | Minimum required experience in months, when stated | |
| work_location_type | No | Work arrangement: on_site, remote, hybrid | |
| education_requirements | No | Education requirements: no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors beyond the annotations: 'Repeated saves return the existing tracked job' (idempotency), 'A save never waits on facts the source did not provide,' and that FoundRole's extractors derive missing fields from the description. It also explains the validation and separate storage of client_extraction labels. The annotations provide only false hints, so the description carries the full burden and meets it well.
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 overly verbose, largely because the 'Fields:' bullet list duplicates the input schema's property descriptions almost verbatim, including all enum values and constraints. The first two paragraphs are valuable, but the lengthy list adds little beyond the schema and bloats the description. It is structured but not appropriately sized.
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 purpose, sibling differentiation, parameter semantics, extraction behavior, and return behavior. It states that the tool returns the tracked job and that repeated saves return the existing one. For a complex tool with 19 parameters and an output schema, this is sufficient for an agent to select and invoke it correctly without significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, but the tool description adds important semantics. It clarifies that all non-required fields are optional and that 'a fact the source does not state is simply omitted (or null)' and explains that FoundRole's extractors derive missing facts like salary and skills from the description. It also clarifies that a short summary is acceptable for the description field and that client_extraction contains evidence-backed labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Saves a job posting found anywhere on the open web into the user's tracker.' It also distinguishes from sibling tracker_add by noting that tracker_add 'takes a job_id' and is for jobs from jobs_search results. This specific verb+resource+scope and differentiation earns a top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'For jobs that came from jobs_search results, tracker_add (which takes a job_id) is the right tool instead.' It also explains that a job seen elsewhere needs no prior jobs_search call, and that fields not stated by the source can be omitted. This clearly defines when to use the tool and names the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_listARead-onlyInspect
Lists the user's tracked jobs with optional filtering and pagination.
Input:
status: Filter by status (saved, applied, interviewing, offered, archived)limit: Number of results per page (default 20, max 50)offset: Number of results to skip (default 0)
Output: Returns a list of tracked jobs grouped by status with pagination info. Each response includes a system_instruction describing how to present the results for the current client.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results per page (default 20, max 50) | |
| offset | No | Number of results to skip (default 0) | |
| status | No | Filter by status: saved, applied, interviewing, offered, archived |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral context: results are 'grouped by status' and each response includes a 'system_instruction' for presenting results. This goes beyond the schema and annotations, disclosing output structure and client-specific presentation behavior.
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 well-structured with a clear opening sentence, an Input section, and an Output section. Every line serves a purpose, and it avoids unnecessary fluff. The format is easy to scan and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool is a read-only list operation, has a detailed schema (100% param coverage), an output schema, and strong annotations, the description is complete. It covers the purpose, input parameters, and output format, including the notable system_instruction. No critical information is missing.
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 description's Input section simply duplicates the parameter descriptions already present in the schema. It does not add new meaning beyond what the schema provides, 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 clearly states the tool's function: 'Lists the user's tracked jobs'. The verb 'Lists' and resource 'tracked jobs' are specific, and it distinguishes itself from sibling tools like tracker_add, tracker_remove, and jobs_search by focusing solely on listing tracked jobs with optional filtering/pagination.
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 clearly implies when to use this tool (when you need to view a user's tracked jobs) and mentions its optional filtering/pagination, providing context. However, it does not explicitly mention when not to use it or name alternative tools, so it falls short of a 5 but has clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_removeADestructiveInspect
Removes a job from the user's job tracker.
Input:
tracked_job_id: The tracked job ID —trackedJobs[].idfrom tracker_list output, distinct fromtrackable.idandjob.id(required)
Output: Confirms the job was removed from tracking.
| Name | Required | Description | Default |
|---|---|---|---|
| tracked_job_id | Yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is known. The description adds that the output 'Confirms the job was removed from tracking', which is useful but not extensive. It does not mention side effects or reversibility beyond this.
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 the main purpose and is appropriately concise. However, the Input section duplicates the schema's parameter description, which adds redundancy and slightly reduces efficiency.
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 required parameter, the description covers the purpose, the tricky ID distinction, and the expected output. Given the annotations and output schema, this is complete for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's Input section repeats the same parameter text verbatim. The description adds no new semantic meaning beyond what the schema already provides, so the baseline score 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 clearly states 'Removes a job from the user's job tracker', using a specific verb and resource. This distinguishes it from sibling tools like tracker_add, tracker_list, and tracker_update that perform different actions on the same resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by specifying that tracked_job_id must be `trackedJobs[].id` from tracker_list output and distinct from other IDs. However, it does not explicitly state when to use this over alternatives or include exclusion criteria, so it falls 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.
tracker_updateADestructiveInspect
Updates details of a tracked job (notes, deadline, salary, tags).
Input:
tracked_job_id: The tracked job ID —trackedJobs[].idfrom tracker_list output, distinct fromtrackable.idandjob.id(required)notes: Updated notesdeadline: Deadline date (ISO 8601 format)salary_offered: Salary amountsalary_offered_type: Salary type: year, month, week, day, hourtags: Comma-separated tags (e.g., "remote,startup,tech")reminder_at: Reminder date/time in ISO 8601 format, e.g. "2025-03-15T10:00:00Z" (must be in the future, or empty to clear)
Output: Returns the updated tracked job.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Comma-separated tags (e.g., "remote,startup,tech") | |
| notes | No | Notes about this job | |
| deadline | No | Deadline date in ISO 8601 format | |
| reminder_at | No | ISO 8601 datetime, e.g. "2025-03-15T10:00:00Z" (must be in the future, or empty to clear) | |
| salary_offered | No | Salary amount | |
| tracked_job_id | Yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) | |
| salary_offered_type | No | Salary type: year, month, week, day, hour |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, and the description adds that the operation returns the updated tracked job and that reminder_at must be in the future. However, it does not disclose whether updates are partial or full overwrites, nor does it explain any irreversibility or side effects beyond the annotation.
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 well-structured with a clear lead sentence, a compact input list, and an output note. Every sentence serves a purpose, and the formatting enhances readability for an agent.
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 7 parameters with complete schema documentation and an output schema. The description fills the remaining gaps by specifying the correct ID to use, flagging potential ID confusion, and providing formatting examples, making it fully actionable.
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. The description adds genuine value by clarifying the tracked_job_id provenance (distinct from trackable.id and job.id), giving a concrete example for tags, and stressing the future-date requirement for reminder_at, which goes beyond the schema text.
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 ('Updates details') with a clear resource ('tracked job') and enumerates the affected fields (notes, deadline, salary, tags). This clearly distinguishes it from sibling tools like tracker_update_status, which presumably handles status changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on what this tool updates and emphasizes the correct ID source (trackedJobs[].id from tracker_list) while cautioning against confusing it with other IDs. It doesn't explicitly mention when not to use it or name alternatives like tracker_update_status, but the field scope strongly implies the intended use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_update_statusADestructiveInspect
Updates the status of a tracked job.
Input:
tracked_job_id: The tracked job ID —trackedJobs[].idfrom tracker_list output, distinct fromtrackable.idandjob.id(required)status: New status: saved, applied, interviewing, offered, archived (required)sub_status: Sub-status within the main status, valid only for that status (optional): saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_company
Output: Returns the updated tracked job.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | New status: saved, applied, interviewing, offered, archived | |
| sub_status | No | Sub-status within the main status, valid only for that status — saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_company | |
| tracked_job_id | Yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| totalCount | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackedJobs | No | |
| trackerWebUrl | No | |
| subStatusOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructive behavior (destructiveHint=true), and the description adds context by explaining the return value and the distinction between tracked_job_id and other IDs. This helps the agent anticipate 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?
The description is structured with headers and bullet points, making it easy to scan. It contains no redundant phrasing; the sub-status enumeration is necessary because it depends on the chosen status.
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 simplicity (3 parameters with strong schema coverage, output schema exists), the description fully addresses input requirements, output, and a critical ID disambiguation. It leaves no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage of parameter descriptions, including the same enum lists and ID guidance. The description restates the schema content without adding new semantic meaning beyond formatting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Updates') and resource ('tracked job'), and the focus on 'status' distinguishes it from sibling tools like tracker_update or tracker_add. No ambiguity.
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 for changing a job's status, and the detailed enum of statuses clarifies the exact scenarios. It does not explicitly contrast with tracker_update, but the specific purpose is clear enough for an agent to select it.
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. Dates show when Glama detected each change.
20 tool updates
v1.1.9- First observed
job_alert_list - First observed
job_alert_subscribe - First observed
job_alert_unsubscribe - First observed
job_alert_unsubscribe_all - First observed
jobs_analyze_external - First observed
jobs_compare - First observed
jobs_details - First observed
jobs_recommendations - First observed
jobs_search - First observed
knowledge_search - First observed
knowledge_topics - First observed
reminder_delete - First observed
reminder_list - First observed
reminder_set - First observed
tracker_add - First observed
tracker_add_external - First observed
tracker_list - First observed
tracker_remove - First observed
tracker_update - First observed
tracker_update_status
TDQS
Each tool targets a distinct resource and action: job alerts, job search/analysis, knowledge, reminders, and tracker are cleanly separated. Even the two external-job tools (jobs_analyze_external vs tracker_add_external) are explicitly contrasted. No overlapping boundaries or ambiguous purposes.
All tool names follow a consistent domain_verb pattern in snake_case: job_alert_*, jobs_*, knowledge_*, reminder_*, tracker_*. Verb suffixes (list, add, update, delete, subscribe, unsubscribe) are used predictably across domains. The only slight extension, job_alert_unsubscribe_all, still fits the pattern.
At 20 tools, the server is slightly above the typical 3-15 sweet spot, but the count is justified by five distinct functional areas (alerts, jobs, knowledge, reminders, tracker). Each tool has a unique role, and no redundant or trivial tools exist, so the weight is earned.
The tool set provides full lifecycle coverage: job search (search/details/recommendations/compare/analyze_external), tracker (add/update/status/remove), reminders (set/list/delete), alerts (subscribe/unsubscribe/list/unsubscribe_all), and knowledge (search/topics). No obvious gaps or dead ends; idempotent operations and clear fallbacks are provided.
Maintenance
Related MCP Connectors
Manage job applications — jobs, companies, boards, notes, and profile — from your AI client.
ATS resume scoring, job analysis, interview prep, and auto-apply that verifies each submission.
Job platform for AI agents. Track tech jobs from companies that match your stack.
Analyze job listings against your resume, track applications, and generate cover letters.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to fetch and structure job postings from major ATS platforms (Greenhouse, Lever, Ashby, etc.) directly, eliminating copy-paste and context loss.392MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to pull live job listings from major ATS platforms (Greenhouse, Lever, Ashby, Workable), Hacker News hiring threads, and detect hiring signals on company career pages.-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search and explore remote job listings, salary stats, and popular roles, and supports token-authenticated actions like job alerts and apply redirects.MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI clients to control a job application assistant that manages resume profiles, recommends SOE-first companies, tracks applications, scans jobs, and smart-fills ATS forms in a built-in browser.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/foundrole/jobs-mcp-proxy'
If you have feedback or need assistance with the MCP directory API, please join our Discord server