FoundRole Jobs - AI Job Search & Application Tracker
OfficialFoundRole MCP Server — 在 ChatGPT、Claude 和 Cursor 中进行 AI 求职
向 ChatGPT 或 Claude 询问职位,即可获得真实职位空缺——每个职位都会经过核实:是否仍然有效、实际薪资多少、公司是否提供签证担保。FoundRole MCP 服务器将你的 AI 助手连接到 FoundRole 的实时职位板、申请跟踪器和职业知识库,让整个求职过程在你已经使用的聊天中完成。
只需登录一次——你的助手会处理一切。 当你的 AI 首次调用 FoundRole 时,它会打开标准的 OAuth 登录;在浏览器中批准一次即可覆盖所有功能:搜索、事实核查、跟踪器、提醒和警报。无需复制或轮换 API 密钥,而且账户是免费的。
你的助手可以做什么
通过提问搜索实时职位。 职位直接来自公司招聘页面,每小时在 40 多个行业更新。自然语言映射到真实筛选条件——职位名称、地点、公司、薪资范围、发布日期:“本周发布的纽约远程 React 职位,薪资超过 13 万美元。”
免费为每个职位进行事实核查。 在花一个晚上准备申请之前,三个问题会得到回答,每个回答都有证据支持:
真的有人在招聘吗? 幽灵职位风险——该职位是否已发布数月,或者看起来像是在收集简历。
我的薪资是否被低估? 将薪资与该市场雇主实际申报的薪资进行比较,这样隐藏的薪资范围就不再是猜测。
他们会为我提供担保吗? 公司之前是否赞助过签证,根据公开文件逐年统计。
了解你的匹配度。 根据你的简历和个人资料进行匹配评分,并提供按匹配度排序的个性化职位推荐。
并排比较职位。 “比较这两个” 会同时列出匹配度、薪资、担保和发布风险——这样选择就不再是凭感觉。
从任何地方粘贴职位。 LinkedIn、招聘页面、朋友发来的链接——将职位信息粘贴到聊天中,它会得到同样的核查,并且可以与 FoundRole 列表一起放在你的跟踪器中。你的助手会读取你提供的文本;不会为你爬取网站。
不再丢失申请记录。 将职位保存到你的 看板申请跟踪器 中,并通过提问将其从“已保存”→“已申请”→“面试中”→“已录用”→“已入职”移动。可以附加备注、标签、期望薪资、招聘联系人以及截止日期。同一个看板也会出现在 Web 应用中。
绝不错过跟进。 在任何跟踪的职位上设置提醒,即可收到一封包含日历 (
.ics) 邀请的电子邮件,适用于 Google 日历、Outlook 或 Apple 日历。让搜索主动来找你。 将搜索订阅为定期电子邮件提醒——每日、每周或每月——这样新的匹配结果就会出现在你的收件箱中。
也可以问那些尴尬的问题。 面试准备、薪资谈判、简历技巧、公司研究——答案基于 FoundRole 的知识库,并附有来源链接。
以真实面板而非文本墙的形式查看结果。 在支持 MCP 应用(包括 ChatGPT)的客户端中,搜索结果、职位详情和你的跟踪器会以交互式面板的形式直接呈现在聊天中。
这与 FoundRole.com 使用相同的账户和数据——MCP 服务器只是让你的 AI 来驱动它。
Related MCP server: jobs-winterchill-mcp
免费版与专业版
搜索、每个职位的核查、跟踪器、提醒和警报均免费,无使用限制。专业版增加了筛选功能:要求仅远程、仅担保、最低薪资、隐藏高风险职位或最低匹配度,你的助手会在你看到列表之前进行过滤——并告知你已过滤。免费账户仍会收到完整列表,并附注说明这些筛选条件未应用。
新用户? FoundRole AI 搜索指南 逐步介绍如何连接每个客户端,并附有常见问题解答。
设置
根据你的客户端,有两种连接方式。无论哪种方式,你的客户端在首次连接时都会打开 FoundRole 登录——批准一次即可完成设置。
选项 1 — 远程服务器(推荐)
将你的客户端指向 FoundRole MCP 端点:
https://www.foundrole.com/mcp大多数现代客户端——ChatGPT、Claude、Cursor、VS Code——原生支持远程 MCP(Streamable HTTP),因此这就是全部配置。
选项 2 — stdio 桥接(适用于不支持远程 MCP 的客户端)
如果你的客户端仅支持 stdio 传输,请使用 npx 在本地运行此包;它会将 stdio 桥接到 FoundRole 端点,并为你处理 OAuth 登录:
npx @foundrole/ai-job-search-mcp连接你的 AI 助手
ChatGPT
预计时间: ~1 分钟
在 ChatGPT 应用目录 中打开 FoundRole。
点击 添加,并在 ChatGPT 打开 FoundRole 登录时批准。
在任何聊天中询问职位——无需配置设置,无需粘贴任何内容。
Claude Web/Desktop
预计时间: ~2 分钟
打开 Claude 设置(个人资料/设置图标)。
找到 连接器(或 工具),然后点击 添加自定义连接器。
将其命名为
FoundRole。在 远程 MCP 服务器 URL 字段中,粘贴:
https://www.foundrole.com/mcp保存,允许 Claude 连接,并批准它打开的 FoundRole 登录。然后在聊天中询问职位。
Cursor
预计时间: ~1 分钟
从 Cursor 市场 安装 FoundRole 插件:打开侧边栏中的 自定义,找到 FoundRole,然后选择 安装。批准 Cursor 打开的 FoundRole 登录,然后在任何聊天中询问职位。
该插件位于此仓库中——.cursor-plugin/plugin.json,服务器在 mcp.json 中声明。要在其列出之前试用,请将此仓库符号链接到 ~/.cursor/plugins/local/ 并重新加载窗口。
手动设置 — Cursor / VS Code / Windsurf
在 Cursor 中,打开设置 → MCP,并将此内容添加到 ~/.cursor/mcp.json:
{
"mcpServers": {
"foundrole": {
"url": "https://www.foundrole.com/mcp"
}
}
}在 VS Code 中,将此内容添加到工作区中的 .vscode/mcp.json(或你的用户 mcp.json)——VS Code 使用不同的键,并且需要显式的传输类型:
{
"servers": {
"foundrole": {
"type": "http",
"url": "https://www.foundrole.com/mcp"
}
}
}当你的编辑器打开 FoundRole 登录时批准,然后在聊天中询问职位。
Antigravity (Google)
预计时间: ~1 分钟
直接从此仓库安装插件:
agy plugin install https://github.com/foundrole/jobs-mcp-proxy批准 Antigravity 打开的 FoundRole 登录,然后在 CLI 中询问职位。该插件在 mcp_config.json 中声明服务器;若要手动配置,请将相同的条目添加到 ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"foundrole": {
"serverUrl": "https://www.foundrole.com/mcp"
}
}
}任何其他 MCP 客户端
相同的地址适用于所有地方:将 https://www.foundrole.com/mcp 添加为远程服务器,或使用 npx @foundrole/ai-job-search-mcp 桥接仅支持 stdio 的客户端。
注意: 批准登录后,某些客户端需要重启(退出并重新打开)才能建立连接。
试试这样说
“查找本周发布的旧金山高级后端工程师职位。”
“这些职位中哪一个最不可能是幽灵职位?”
“Stripe 是否提供签证担保?这个职位的实际薪资是多少?”
“比较 Stripe 和 Vercel 职位的匹配度、薪资和担保情况。”
“这是来自 LinkedIn 的职位信息——对它进行同样的核查。”
“推荐与我的简历匹配的职位。”
“将其保存到我的跟踪器中,并标记为已申请。”
“提醒我下周二早上跟进。”
“我当前‘面试中’列中有什么?”
“为我订阅每周远程 React 职位的提醒。”
“如何回答‘请介绍一下你的简历’?”
安全性
使用 PKCE 的 OAuth 2.1。 你通过标准授权流程登录 FoundRole——短期令牌、即时撤销、不与 AI 客户端共享凭据、无需复制、存储或泄露 API 密钥。
仅使用 HTTPS,支持动态客户端注册和重定向 URI 验证。
Streamable HTTP 传输(直接),或通过此代理使用 stdio。
它绝不会以你的名义申请职位或发送电子邮件。
故障排除
提示登录 / “需要身份验证”:
首次连接时属于正常现象——服务器会对每个会话进行身份验证。在你客户端打开的浏览器窗口中完成 FoundRole 登录。
如果之后工具仍未出现,请重启客户端或重新连接连接器,以便重新发送授权。
“连接失败”:
检查你的互联网连接,并确保 URL 完全为
https://www.foundrole.com/mcp。确认你的客户端支持远程 HTTP MCP;如果不支持,请使用 stdio 桥接(选项 2)。
“找不到命令”(stdio 客户端):
安装 Node.js(所需版本请参阅
package.json中的engines),然后重试,或全局安装:npm install -g @foundrole/ai-job-search-mcp并运行ai-job-search-mcp。
连接器无法工作:
仔细检查 URL,完成登录,并重启 AI 客户端——某些客户端只有在重启后才会建立连接。
探索答案背后的数据
你的助手读取的相同数据可在 FoundRole 上浏览:
工作原理 — 职位空缺的来源,以及每个职位如何获得幽灵、薪资和签证核查
H1B 薪资浏览器 — 雇主向美国劳工部申报的认证工资,按行业、领域、地点和职位绘制图表
H1B 担保排名 — 按申报工资中位数排名的顶级签证担保公司,可按行业、领域、城市和州浏览
公司目录 — 任何雇主的开放职位、薪资数据和签证担保历史
行业领域 — 40 多个行业中的招聘者
按地点招聘 — 按州和大都市区的职位空缺和工资基准
职位跟踪器 — 你的助手在浏览器中管理的看板
实时职位板 — 直接浏览列表
帮助
🌐 网站:www.foundrole.com — 免费 AI 求职、申请跟踪器和公司研究
📖 设置指南与常见问题解答:foundrole.com/ai-search-mcp
🐛 问题:GitHub Issues
💬 疑问:dev@foundrole.com
连接你的 AI 客户端,登录一次,即可在聊天中完成整个求职过程 — 搜索、事实核查、跟踪、提醒和警报,在 FoundRole 免费使用。
由 FoundRole 团队制作。
Available Tools
21 toolsjob_alert_listList job alertsARead-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, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: it discloses pagination behavior and, notably, that each response includes a system_instruction telling the client how to present results — non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then cleanly sectioned into Input and Output blocks. It is slightly redundant with the input schema (limit/offset/status repeated verbatim), but not verbose and every section is 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?
The tool is simple (3 optional params, no nesting) and an output schema exists, so return values need not be explained. The description still covers filtering, pagination and the system_instruction behavior, leaving little an agent would need to guess at.
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 largely restates the same limit/offset/status details. It adds only a marginal clarification (status default is "all statuses" and that all three params are optional). Baseline 3 is appropriate when the schema already documents every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Lists the authenticated user's job alerts") and adds meaningful scope ("across all subscription sources (regular, company page, MCP)") that goes beyond the name. It does not explicitly contrast itself with siblings like jobs_recommendations or jobs_search, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the way to enumerate the user's own alerts, but gives no explicit when-to-use guidance, no exclusions, and no pointer to alternatives such as jobs_recommendations. Usage is inferable from the name and scope rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_alert_subscribeCreate a job alertAIdempotentInspect
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. An existing active alert with the same query text, location, company and filters, and at least the same radius, is returned instead of a new one, with the requested frequency applied to it.
Delivery:
All of a user's alerts arrive together in one email digest, one section per alert. Each section applies every filter and the sort of its saved search, the same way jobs_search does; Pro-only filters apply while the user has Pro. A job appears in the digest once, even when it matches several alerts, and no email is sent when there are no new matches. The digest follows the most frequent alert, and arrives less often when the user has not used FoundRole for a while.
| 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?
Annotations already declare idempotentHint=true and destructiveHint=false, but the description goes well beyond them: it spells out the exact idempotency rule (existing alert matched on query text, location, company, filters, and at least the same radius), that the requested frequency is applied to the returned alert, and the delivery semantics (one digest, deduplicated jobs, Pro-only filters, cadence).
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?
Bold section headers (Input/Output/Delivery) front-load the purpose and required parameter, and the Input/Output blocks earn their place. The Delivery paragraph is informative but longer than needed to select and invoke this tool, describing email behavior that doesn't change the call itself.
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, return values need not be explained, yet the description still covers idempotency, default frequency, accepted ID formats, and downstream delivery effects. Nothing an agent needs to invoke this tool correctly 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%, so both parameters are already documented, and the description largely restates them (UUID vs composite ID format, default 'weekly'). It adds no syntax or validation detail the schema lacks, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Subscribes the authenticated user to job alerts for a specific saved job search' — which cleanly separates it from job_alert_unsubscribe, job_alert_unsubscribe_all, and job_alert_list. An agent can identify the action without opening the schema.
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?
Gives clear context for use (subscribe to a saved job search) and points to jobs_search / jobs_details as the source of the accepted composite ID format. It does not explicitly state when to prefer this over the unsubscribe siblings or what prerequisites apply, so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_alert_unsubscribeUnsubscribe from a job alertADestructiveInspect
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 declare destructiveHint=true and readOnlyHint=false. The description adds genuinely new behavioral context: the operation is idempotent and returns success even if the user was never subscribed. That is not derivable from 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?
Front-loaded single-sentence purpose followed by tight input/output notes. Every sentence earns its place; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format detail is unnecessary. The description covers the required input's accepted forms and the idempotency edge case, leaving little an agent needs beyond it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the job_search_id format. The description restates the same UUID/composite-ID detail without adding syntax or validation info beyond it; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Unsubscribes the authenticated user from job alerts for a specific job search.' The 'specific job search' scope implicitly separates it from the sibling job_alert_unsubscribe_all, though it never names that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description's scope and the parameter explanation, but there is no explicit when-to-use vs. when-to-use-alternative statement, and the obvious alternative (job_alert_unsubscribe_all) is never referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_alert_unsubscribe_allUnsubscribe from all job alertsADestructiveIdempotentInspect
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?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new context: the confirm guard's rejection behavior and the explicit idempotency claim ('returns success even when the user has no active alerts') plus the source coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by tight Input/Output sections. Every sentence carries distinct information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter bulk mutation, the description covers the confirm requirement, the safety rationale, source scope, and idempotency, while the output schema carries the return value. Nothing needed to call it correctly 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 coverage is 100% and the single parameter is documented there, so baseline is 3. The description adds the rationale behind the guard ('guards against an unintended bulk unsubscribe'), giving the agent the meaning of the flag beyond its 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?
Specific verb + resource + scope: 'Unsubscribes the authenticated user from ALL of their job alerts at once, across every subscription source.' It clearly distinguishes itself from the singular sibling job_alert_unsubscribe by emphasizing the bulk/all scope.
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 'ALL ... at once' framing implicitly routes the agent away from the single-alert sibling, and it enumerates the subscription sources covered. However, it never explicitly names job_alert_unsubscribe as the alternative for single-alert cases, so exclusion guidance is inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_analyze_externalAnalyze a job from another siteAInspect
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 | |
| studioUrl | No | |
| statusOrder | Yes | |
| derivedFields | Yes | |
| trackerWebUrl | Yes | |
| unknownFields | Yes | |
| providedFields | Yes | |
| clientExtraction | Yes | |
| system_instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false/destructiveHint=false/openWorldHint=false. The description goes well beyond that: it states what FoundRole does server-side (validates evidence, stores client extraction separately, derives missing deterministic facts, reports provided/derived/accepted/rejected/unknown), and candidly frames the analysis as a decision aid rather than a guarantee.
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 purpose is front-loaded and the routing instruction sits near the top where it matters. Three paragraphs is somewhat long and the middle paragraph is dense, but each block carries distinct information with little 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 16-parameter, output-schema-backed tool, the description covers the input contract conventions, the server-side validation semantics, the comparisonRef handoff, and the limits of the result. Nothing an agent needs to invoke it correctly 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 coverage is already 100%, so the baseline is 3, but the description adds genuine meaning: the five text identity fields are required while every structured fact is optional and simply omitted/null when the source is silent, and client_extraction labels must be evidence-backed. These rules are not obvious from the schema alone.
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 gives a specific verb and resource ('Analyzes one job found outside FoundRole') and enumerates the exact signals computed (resume match, missing skills, H-1B history, E-Verify, ghost-job risk, compensation, market salary). It is clearly distinguishable from sibling tools like jobs_details and tracker_add_external.
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 routes the agent explicitly away from this tool in one case ('Use tracker_add_external only when the user asks to save without analysis') and forward to jobs_compare via comparisonRef. That is real when/when-not guidance, though it doesn't differentiate from jobs_details or jobs_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_compareCompare jobsARead-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 | |
| studioUrl | No | |
| statusOrder | Yes | |
| trackerWebUrl | Yes | |
| system_instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a read-only, non-destructive, closed-world operation, so the safety profile is covered. The description adds real behavioral context beyond that: a 2-4 reference bound, the requirement to preserve exact reference strings and user order, and a no-duplicates constraint. It stops short of describing what the comparison output looks like, though an output schema 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 core action and field list are front-loaded in the first sentence, with the reference-format guidance second. Two paragraphs with no filler; slightly dense but every sentence carries a constraint the agent must honor.
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 read tool with an output schema and full annotation coverage, the description supplies everything else needed: input provenance, prerequisite analysis step, count bounds, ordering, and dedup. Nothing an agent needs to invoke it correctly 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 single parameter is documented with minItems/maxItems, so the baseline is 3. The description adds meaning the schema cannot: the two distinct reference types (FoundRole job IDs vs external comparisonRef URLs), the requirement to pass them exactly, and the ordering/dedup rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('compares 2 to 4 jobs side by side') and enumerates the exact analysis dimensions returned (resume match, missing skills, H-1B/E-Verify, ghost-job risk, pay, salary estimates). This clearly separates it from jobs_details and jobs_analyze_external, which handle single jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: it names jobs_search as the source of job IDs and jobs_analyze_external as the source of external comparisonRef URLs, and states the prerequisite that an outside job must be analyzed first. It also states the failure condition — a bare unanalyzed URL cannot be compared — which is exactly the when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_detailsGet job 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.result_item_id: The matching occurrence ID from that result'sresultItemIdfield, when available.
Output:
Complete job details: description, skills, benefits, requirements, salary benchmark, resume match,
H-1B and E-Verify signals, job-trust analysis, and application link. A posting that passed the
fully-remote check carries remoteCheck: the posting lines that make the role remote and where
the employee may work from, or an unknown scope when the posting does not say. 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 | |
| result_item_id | No | The result occurrence ID returned with the selected job |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | No | |
| studioUrl | No | |
| trackedJob | No | |
| statusOrder | No | |
| trackerWebUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, yet the description describes a pure fetch — a mild tension worth noting, though not a hard contradiction since personalization/entitlement resolution can be non-read-only. The description does add real context beyond annotations (entitlement-dependent fields, the remoteCheck payload semantics), but it does not clarify auth requirements or why the tool is not read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then cleanly separated into Input and Output blocks that are easy to scan. It is slightly long, but the Output section carries non-obvious information (entitlement gating, remoteCheck shape) rather than 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?
With an output schema present, the description is not obligated to enumerate return fields, yet it still summarizes them usefully and clarifies the conditional remoteCheck field. Missing only auth/entitlement prerequisites for a tool whose results vary by the authenticated user.
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, and the description earns an increment by tying each parameter to its originating field in a jobs_search result (`id` and `resultItemId`), which the schema itself does not establish. It adds genuine cross-tool semantics rather than restating types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fetches full details for one job') and explicitly anchors it to the `id` returned from jobs_search. An agent can distinguish it from jobs_search, jobs_compare, and jobs_analyze_external without opening any schema.
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?
Frames the tool as 'the deeper view behind a search result,' which implies the correct usage sequence (search first, then fetch details by ID). It does not state exclusions or name a competing sibling for retrieving a single job, so it stops short of the explicit when/when-not guidance a 5 requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_recommendationsRecommend jobs for my profileAIdempotentInspect
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. The search filters and sort parameters apply to this personalized feed too. Advanced parameters return a matching preview and hidden count for free accounts; Pro accounts receive the complete filtered list. An explicit query for a different or unrecognized profession uses the same general job search as jobs_search, preserving the query and filters instead of substituting the profile's target roles.
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 | |
| sort | No | Result order (score, posted_at, match, salary): score is relevance and the default, posted_at is newest first, salary is highest pay first, match is best personal fit first and needs a resume. Ordering by salary or match is an advanced option. | |
| query | No | The full job title or skill (e.g., "Ruby Developer", NOT just "Ruby") | |
| radius | No | Search radius in miles around a city location (default 40); not used for state, country or remote searches. | |
| remote | No | Advanced filter: only remote-eligible jobs, matched across the whole country of the requested location rather than its radius. | |
| company | No | The official company name | |
| benefits | No | Advanced filter: benefit names such as "health insurance", "401k" or "parental leave"; a job qualifies only when it states every listed benefit. Names that match no known benefit are ignored. | |
| location | No | Geographic location (e.g., 'Boston, MA') | |
| companies | No | Filter: official company names; a job from any of them qualifies, across every job board each employer posts on. More than one company makes it an advanced filter. Next to company, a job has to match both; hiring_brand narrows company only. | |
| education | No | Filter: jobs whose posting requires one of these education levels (no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree); bachelor_degree means the posting asks for a bachelor degree, not that it suits someone holding one. | |
| min_match | No | Advanced filter: lowest personal FoundRole match grade to keep, the same letter each job shows in insights.match.grade. A and A- are rare even for a strong resume; B keeps good and strong matches; C+ also keeps fair ones. Needs a resume on the account. | |
| work_modes | No | Advanced filter: jobs in any of these work modes (on_site, remote, hybrid). remote is matched across the whole country of the location, the others within the radius. ["remote"] is the same search as remote: true. | |
| bonuses_only | No | Advanced filter: only jobs that state a bonus (sign-on, performance, referral, commission and the like). | |
| hiring_brand | No | Filter: one brand inside the company, for example company "Google" with hiring_brand "YouTube"; used only together with company. | |
| salary_floor | No | Advanced filter: minimum annualized salary in USD; a posting qualifies when the lower bound of its pay band reaches the floor. Jobs without a USD salary are dropped. | |
| strict_remote | No | Advanced filter: only postings checked as fully remote that can be worked from the requested location: the posting names that area, allows anywhere, or does not say where. Stricter than remote; work_modes other than remote do not apply with it. | |
| posted_days_ago | No | Number of days ago to search for jobs (1-365) | |
| employment_types | No | Filter: jobs offered as any of these employment types (full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other). | |
| hide_low_quality | No | Advanced filter: hides postings with a risky ghost grade (D/F); ungraded postings stay. | |
| exclude_companies | No | Advanced filter: official company names whose jobs are removed from the results, across every job board each employer posts on. | |
| experience_levels | No | Filter: jobs at any of these experience levels (entry_level, mid_level, senior_level, executive). The level comes from the years of experience the posting asks for and the seniority in its title, the higher of the two; entry_level never includes a posting asking for more than two years. | |
| h1b_sponsors_only | No | Advanced filter: only companies known to sponsor H1B visas. | |
| confirmed_work_from | No | Advanced filter: with strict_remote, also leaves out postings that do not say where the work can be done from. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | |
| preview | No | |
| feedKind | No | |
| nextPage | No | |
| feedStatus | No | |
| totalCount | No | |
| continueUrl | No | |
| jobSearchId | No | |
| resultSetId | No | |
| statusOrder | No | |
| revalidating | No | |
| resultBatchId | No | |
| trackerWebUrl | No | |
| profileSetupUrl | No | |
| profileSetupState | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: results are fit-ranked, may include related roles, carry the same insights payload as search, and free vs Pro accounts receive different result completeness (preview plus hidden count vs the full filtered list). It also documents the asynchronous processing status and that a later call returns the completed feed, which the annotations (idempotent, non-destructive, closed-world) do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then ambient behavior (ranking, insights), then tiering, then the jobs_search fallback and pagination/status semantics. Three compact paragraphs with little waste, though slightly longer than strictly needed for a read-style tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers the remaining gaps an agent needs: what determines the feed, tier-gated completeness, async processing, pagination continuity, and the fallback search path. Nothing material for correct invocation 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 coverage is 100% across 23 params, so the schema carries the per-parameter burden (baseline 3). The description still adds non-obvious parameter behavior: the search filters and sort apply to the personalized feed, and advanced parameters change output scope by account tier, which the schema does not state.
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?
Names a specific verb and resource — returns the authenticated user's personalized job recommendations — and states the inputs that build them (resume, skills, target roles, preferred location). It also distinguishes itself from jobs_search by explaining the fallback path when an explicit query names a different or unrecognized profession.
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?
Gives explicit routing: an explicit query outside the profile's target roles routes to the same general search as jobs_search rather than substituting the profile. It also notes how pages retrieve more of the same feed and what a processing status means. It stops short of stating outright when to prefer this over jobs_search for a normal query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_searchSearch jobsAInspect
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 and resultItemId; jobs_details takes that id with the corresponding
result_item_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.
With a ready profile, a query for the profile's target profession or an omitted query uses the same personalized feed as jobs_recommendations and the website. A different or unrecognized profession uses general job search, preserving the explicit query and filters. An omitted location uses the profile location. Without a ready profile, search uses the general job listings. 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.
Constraints in the user's request — remote-only work, H1B sponsorship, a minimum salary, hiding risky postings, a minimum match grade — are the search parameters remote, h1b_sponsors_only, salary_floor, hide_low_quality, and min_match; sort orders the results by relevance, newest, salary or personal match. The search enforces only constraints passed as parameters; a constraint left out of the call is not applied to the result set.
Job type, work mode, required education, experience level, benefits, bonuses, employers to include or exclude, and the search radius are the parameters employment_types, work_modes, education, experience_levels, benefits, bonuses_only, companies, exclude_companies and radius. Remote and hybrid are independent work modes: a remote search never returns hybrid jobs. A job that does not state the filtered attribute is left out while that filter is set. Fully remote work that can be done from the requested location is strict_remote, with confirmed_work_from to require a stated work-from area; one brand inside a company is hiring_brand next to company.
Advanced filters (sort, min_match, h1b_sponsors_only, hide_low_quality, salary_floor, remote, strict_remote, confirmed_work_from, work_modes, benefits, bonuses_only, companies, exclude_companies; sort only when ordering by salary or match, companies only when it names more than one employer) apply for every account. Without FoundRole Pro, a search using one returns the first few matching jobs and the number of further matches; FoundRole Pro accounts receive the whole list. The other parameters never shorten the results.
Each response includes a system_instruction describing how to present the results for the current client.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Result order (score, posted_at, match, salary): score is relevance and the default, posted_at is newest first, salary is highest pay first, match is best personal fit first and needs a resume. Ordering by salary or match is an advanced option. | |
| 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. | |
| radius | No | Search radius in miles around a city location (default 40); not used for state, country or remote searches. | |
| remote | No | Advanced filter: only remote-eligible jobs, matched across the whole country of the requested location rather than its radius. | |
| company | No | The official company name | |
| benefits | No | Advanced filter: benefit names such as "health insurance", "401k" or "parental leave"; a job qualifies only when it states every listed benefit. Names that match no known benefit are ignored. | |
| location | No | Geographic location (e.g., 'Boston, MA') | |
| companies | No | Filter: official company names; a job from any of them qualifies, across every job board each employer posts on. More than one company makes it an advanced filter. Next to company, a job has to match both; hiring_brand narrows company only. | |
| education | No | Filter: jobs whose posting requires one of these education levels (no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree); bachelor_degree means the posting asks for a bachelor degree, not that it suits someone holding one. | |
| min_match | No | Advanced filter: lowest personal FoundRole match grade to keep, the same letter each job shows in insights.match.grade. A and A- are rare even for a strong resume; B keeps good and strong matches; C+ also keeps fair ones. Needs a resume on the account. | |
| work_modes | No | Advanced filter: jobs in any of these work modes (on_site, remote, hybrid). remote is matched across the whole country of the location, the others within the radius. ["remote"] is the same search as remote: true. | |
| bonuses_only | No | Advanced filter: only jobs that state a bonus (sign-on, performance, referral, commission and the like). | |
| hiring_brand | No | Filter: one brand inside the company, for example company "Google" with hiring_brand "YouTube"; used only together with company. | |
| salary_floor | No | Advanced filter: minimum annualized salary in USD; a posting qualifies when the lower bound of its pay band reaches the floor. Jobs without a USD salary are dropped. | |
| strict_remote | No | Advanced filter: only postings checked as fully remote that can be worked from the requested location: the posting names that area, allows anywhere, or does not say where. Stricter than remote; work_modes other than remote do not apply with it. | |
| posted_days_ago | No | Number of days ago to search for jobs (1-365) | |
| employment_types | No | Filter: jobs offered as any of these employment types (full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other). | |
| hide_low_quality | No | Advanced filter: hides postings with a risky ghost grade (D/F); ungraded postings stay. | |
| exclude_companies | No | Advanced filter: official company names whose jobs are removed from the results, across every job board each employer posts on. | |
| experience_levels | No | Filter: jobs at any of these experience levels (entry_level, mid_level, senior_level, executive). The level comes from the years of experience the posting asks for and the seniority in its title, the higher of the two; entry_level never includes a posting asking for more than two years. | |
| h1b_sponsors_only | No | Advanced filter: only companies known to sponsor H1B visas. | |
| confirmed_work_from | No | Advanced filter: with strict_remote, also leaves out postings that do not say where the work can be done from. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | |
| preview | No | |
| feedKind | No | |
| feedStatus | No | |
| continueUrl | No | |
| jobSearchId | No | |
| resultSetId | No | |
| statusOrder | No | |
| revalidating | No | |
| resultBatchId | No | |
| trackerWebUrl | No | |
| profileSetupUrl | No | |
| profileSetupState | No | |
| lowRelevanceNotice | No | |
| system_instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only readOnlyHint/openWorldHint/destructiveHint, so the description does the heavy lifting: it discloses pagination via nextCursor and the cursor-only protocol, entitlements-gated result truncation for non-Pro accounts, profile-driven personalization, strict_remote vs remote semantics, and that constraints left out of the call are simply not applied. This is far beyond what the annotations provide.
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 content is valuable but the middle and later paragraphs largely restate semantics already encoded in the 100%-covered schema (work_modes vs remote independence, strict_remote/confirmed_work_from, the advanced-filter list), producing a dense wall of text with meaningful redundancy. Front-loading is good, but several sentences do not earn their place against the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter, zero-required search tool with an output schema, the description covers the remaining unknowns an agent needs: profile/entitlement behavior, pagination protocol, the id-to-jobs_details handoff, and the fact that omitted constraints are not applied. Return-value explanation is correctly delegated to the output schema.
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%, yet the description still adds mapping value by translating natural-language constraints (remote-only work, H1B sponsorship, salary floor, hiding risky postings) onto the exact parameter names remote, h1b_sponsors_only, salary_floor, hide_low_quality, min_match, and by noting sort only when ordering by salary/match and companies only for multiple employers.
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 states a specific verb and resource — 'Searches a database for real-time job listings' — and the rest of the description makes clear how it differs from jobs_recommendations, jobs_details, and jobs_analyze_external. An agent can select it without opening any sibling schema.
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 routing rules: use jobs_details with a result's `id`/`resultItemId` for full posting text; an omitted or profession-matching query falls into the same personalized feed as jobs_recommendations; a different profession falls back to general search. It also states when advanced filters apply and what happens without Pro.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_searchSearch career guidesARead-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.
Two optional facets add further result groups: company returns FoundRole's employer profile pages matching that company name; location returns the market landing page for that city, state, or country — an analytical page about that labour market, not a list of openings. 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 and reports no open-job counts — jobs_search covers live roles, including questions about openings for a particular job title. 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, when the question is about that labour market — returns its market landing page |
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 cover the safety profile (readOnly, idempotent, openWorld=false), so the description's job is added context — and it delivers: empty groups rather than padded off-topic results, closest-match (non-exhaustive) semantics, facet behavior, and a system_instruction included in each response. It does not mention pagination or rate limits, but nothing essential is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then facets, then boundaries with siblings. It is on the long side and some enumeration of site-page types (Pro plan, H1B salary data, AI job search) borders on padding, but nearly every sentence carries routing or behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and the description correctly refrains from re-explaining return values while still flagging the embedded system_instruction and the empty-group behavior. Combined with clear sibling boundaries and facet disambiguation, an agent has everything needed 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?
Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning beyond it: 'company' maps to employer profile pages and 'location' maps to an analytical market landing page, not job listings, plus the disambiguation rule that a company mentioned in passing does not need the facet. That goes past restating 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?
States a precise verb+resource ('Searches FoundRole's published content by semantic similarity') and enumerates the corpora searched (blog articles, product/site pages, sector landings). It explicitly distinguishes itself from siblings jobs_search and knowledge_topics, so an agent can route without opening any schema.
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?
Names the alternatives and the conditions that select them: 'questions about overall topic coverage are answered by knowledge_topics' and 'It does not search job listings... jobs_search covers live roles'. It also gives a when-not for the optional facets ('a company mentioned only in passing does not need the company facet'). This is explicit when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_topicsList career guide 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, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds useful behavioral context beyond that: it takes no parameters, reflects the live published corpus (a freshness guarantee, not a cached snapshot), and enumerates what the response contains (categories, tags, per-item article counts and URLs, plus a total). It stops short of stating pagination or result-size limits, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then the routing rule, then the no-parameter/freshness note. Every sentence carries information, but the return-value enumeration partially duplicates the output schema, which is mild redundancy rather than waste.
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, the description needn't explain return values, yet it still names the resource, the freshness behavior, the absence of parameters, and the sibling handoff. Nothing an agent needs in order to call this correctly 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?
The tool has zero parameters, which establishes a baseline of 4; the description correctly and explicitly confirms 'It takes no parameters', removing any doubt that filtering arguments might exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (lists) and resource (blog categories, most-used tags, counts, URLs, total article count) and explicitly contrasts with the sibling that does something similar but different: 'It does not retrieve articles for a specific question; knowledge_search does that.' An agent can distinguish it from knowledge_search without opening either schema.
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?
Gives both the when ('the factual source for questions about the blog's topics or overall coverage') and the when-not, naming the alternative tool that handles the excluded case (article retrieval for a specific question goes to knowledge_search). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_deleteDelete a reminderADestructiveInspect
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 safety profile is covered. The description adds the specific effect — the reminder is removed and reminderAt is cleared while the tracked job survives — which is genuinely useful context beyond the annotation. It does not mention irreversibility or auth, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action in one sentence and uses labeled Input/Output blocks that scan quickly. Reasonably tight, though the bolded section scaffolding is slightly heavier than the single-parameter tool needs.
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 annotations covering destructiveness and an output schema documenting the returned tracked job, the description supplies the one thing not in structured fields — what specifically gets cleared. Complete enough for a one-parameter destructive 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 description coverage is 100% and the description's tracked_job_id text is essentially identical to the schema's, so it adds no new meaning. Baseline 3 applies when the schema does the heavy lifting; the disambiguation from trackable.id/job.id is helpful but already in 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?
States a specific verb and resource ('Deletes a reminder from a tracked job'), scoping it to a job rather than reminders generally. An agent can distinguish it from reminder_set and reminder_list without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the sibling set (reminder_set/reminder_list) and the destructive verb; there is no explicit statement of when to use delete versus clearing via tracker_update, nor any prerequisite or caution. Minimum viable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_listList remindersARead-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, destructiveHint=false, and openWorldHint=false, so the safety profile is covered by structured data. The description adds genuine behavioral context not present elsewhere: the soonest-first ordering and the max-50 cap. It does not cover pagination beyond limit, empty-result behavior, or permission requirements, and the Input restatement duplicates the schema rather than adding to it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-sentence purpose followed by short Input/Output blocks; nothing is bloated. Minor waste in the Input block, which restates the schema's limit description word-for-word instead of adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple, side-effect-free list tool with a rich output schema (return values need not be explained) and full sibling context. Ordering, scope, and the limit cap are the only things an agent materially needs, and ordering plus scope are present; only the alert-vs-reminder distinction is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, so the schema already documents default 20 / max 50. The description merely repeats this verbatim rather than adding semantics, which is the expected baseline 3 for a fully covered 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?
States a specific verb and resource ('Lists tracked jobs that have reminders set') and adds a scope/ordering qualifier ('ordered by reminder time, soonest first'). An agent can distinguish it from tracker_list, job_alert_list, and reminder_set/delete from the description alone, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose (call this to view existing reminders) but there is no explicit when/when-not guidance and no mention of the adjacent alternatives in the sibling list, notably job_alert_list (alerts vs reminders) and tracker_list. Nothing misleading, just under-specified routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_setSet a follow-up reminderADestructiveInspect
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?
With annotations already declaring readOnlyHint=false, destructiveHint=true and openWorldHint=true, the description usefully adds the email/ICS side effect and the return payload (updated tracked job with reminderAt). It does not explain what makes the operation destructive (e.g. overwriting an existing reminder), which is the one gap left against a destructiveHint=true 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?
Front-loaded with the core action in the first sentence, then clearly sectioned Input/Output blocks. Slightly padded by duplicating schema parameter text verbatim, but every line is scannable and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so explaining return values is optional, yet the description summarizes the reminderAt field, which is helpful rather than harmful. Combines with annotation coverage to give an agent everything needed to invoke the tool correctly, minus any note on idempotency/overwrite behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented with identical wording (ISO 8601 example, distinct-ID warning). The description restates the schema rather than adding new syntax or constraints, 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?
States a specific verb and resource ("Sets a reminder for a tracked job") and adds the concrete side effect of sending a confirmation email with an .ics attachment. This clearly separates it from reminder_list and reminder_delete in the sibling 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?
Usage is implied by the title and the note that remind_at must be in the future, but there is no explicit when-to-use/when-not guidance or routing to sibling tools such as reminder_delete or reminder_list. Adequate but leaves the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_checkCheck how hiring software reads a resumeARead-onlyIdempotentInspect
Checks resume text for machine-readable sections, recognized skills, contact channels, a headline, and experience date ranges using FoundRole's deterministic parser.
Pass resume_text to check plain text supplied in the conversation. If resume_text is omitted, the tool reads the previously extracted text of the primary resume in the authenticated user's FoundRole account. It returns a readability band (strong, good, partial), parsed facts, and findings. This is FoundRole's text-readability assessment, not a test against a named ATS, a hiring prediction, or a file-layout check. Pasted text does not preserve the original PDF or DOCX layout.
The tool does not upload a file, create a saved resume or report, change the user's profile, submit an application, or fetch URLs found in the text. It may return a FoundRole website link; opening that link and uploading or editing a resume are separate user actions. Operational request records and diagnostics may retain tool inputs; this tool does not promise that submitted text is never stored.
| Name | Required | Description | Default |
|---|---|---|---|
| resume_text | No | Plain text of the resume to check, when it is available in the conversation. Omit to check the resume uploaded to the user's FoundRole account. Minimum 200 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| band | No | |
| mode | Yes | |
| findings | No | |
| parsedAs | No | |
| uploadUrl | No | |
| studioReportUrl | No | |
| system_instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: no file upload, no saved resume or report, no profile change, no application submission, no URL fetching, plus a candid retention caveat and a note that returned website links require separate user action. That is unusually rich behavioral disclosure for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short paragraphs, front-loaded with purpose, then input behavior, then scope exclusions, then side-effect disclaimers. Every sentence carries information, though the negative-capability list is somewhat exhaustive and could be tightened slightly.
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, return values need not be explained, yet the description still summarizes the readability band and outputs. Combined with the input fallback semantics and full side-effect disclosure, nothing an agent needs to call this correctly 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 single optional parameter is fully documented there, including the minimum-length constraint. The description restates the pass/omit behavior but adds no syntax, format, or constraint detail beyond the schema, 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?
States a specific verb and resource ('checks resume text for machine-readable sections, recognized skills, contact channels, a headline, and experience date ranges') and names the mechanism (FoundRole's deterministic parser). It also explicitly carves out what it is not (ATS test, hiring prediction, file-layout check), so an agent can distinguish it from analysis-adjacent siblings like jobs_analyze_external.
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?
Gives an explicit branch: pass resume_text when the text is in the conversation, omit it to use the stored primary resume. It further names exclusions ('not a test against a named ATS, a hiring prediction, or a file-layout check') and notes the layout caveat for pasted text, which routes the agent correctly for edge cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_addSave a job to the trackerAInspect
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 | |
| result_item_id | No | The result occurrence ID returned with the selected job |
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 declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so safety is already covered. The description adds genuinely non-obvious behavior beyond the annotations: repeated saves are idempotent ('return the existing tracked job') and a previously removed job is restored with its earlier status and notes. It does not clarify whether a new status/sub_status passed on a repeated save overrides the stored one, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the routing rule, then a scannable field list. The main inefficiency is the full sub_status enumeration, which duplicates the schema text verbatim and consumes a large share of the description without adding meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still summarizes the return ('Returns the tracked job with its details'), and the mutation's idempotency/restore behavior is disclosed. What is missing is any steer toward the related mutation siblings (tracker_update, tracker_update_status) that an agent would need when the job already exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the default value for status ('defaults to "saved"'), which the schema does not state. It also omits any mention of result_item_id (present in the schema) and mostly restates the status/sub_status enumerations verbatim.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Tracks a job from jobs_search results in the user's job tracker, identified by its job_id') and immediately names the sibling it is not (tracker_add_external). An agent can distinguish this from tracker_add_external without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the routing condition: use tracker_add for jobs with a jobs_search job_id, and use tracker_add_external for jobs found elsewhere with a URL but no job_id. This is a concrete when-to-use-this-vs-alternative statement rather than implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_add_externalSave a job from another site to the trackerAInspect
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?
Annotations establish the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds important behavior: repeated saves return the existing tracked job, missing facts are omitted rather than blocking, extractors derive missing structured facts, and client_extraction labels are validated and stored separately. These are non-obvious operational traits that go well 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 opening usage guidance is strong and front-loaded, but the long bulleted enumeration of fields largely duplicates the schema descriptions, including enum values already present in the schema. For a 19-parameter tool some length is warranted, but the redundancy makes it less concise than it could be.
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 complex schema, existing output schema, and annotations, the description covers what an agent needs: required vs optional fields, default status, idempotent repeated saves, derivation of missing facts, and the evidence-backed client_extraction contract. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds useful semantics beyond the schema: it identifies the five required identifying fields, states that status defaults to 'saved', and explains that omitted facts are derived by extractors rather than requiring values. The field-by-field list mostly restates schema descriptions, limiting this to a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Saves a job posting ... into the user's tracker') and explicitly distinguishes itself from the sibling tracker_add by source and input type. An agent can tell when this tool applies without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use tracker_add instead for jobs that came from jobs_search results, and clarifies that jobs seen elsewhere need no prior jobs_search call. This is precise when-to-use and when-not-to-use guidance tied to a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_listList tracked jobsARead-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, destructiveHint=false and openWorldHint=false. The description goes beyond them by disclosing that results come back grouped by status, that pagination metadata is included, and that a system_instruction governs result presentation for the current client — genuinely useful behavioral context for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then clearly sectioned Input/Output headings — easy to scan. It loses a point for duplicating the schema's parameter text verbatim, which is redundancy rather than added information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-required-parameter list tool with a full output schema and strong annotations, the description covers purpose, params, and response shape adequately. Nothing critical is missing, though it could note the default ordering of the grouped results.
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 parameters are already fully documented. The Input section restates the schema word-for-word (default 20, max 50, default 0, enum-like status values) without adding syntax, validation, or interaction semantics beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Lists the user's tracked jobs") plus scope (optional filtering and pagination), so the agent immediately knows the operation. It does not distinguish itself from tracker_remove/tracker_update/tracker_update_status, but the read-only listing intent is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for browsing tracked jobs with filters. There is no explicit when-to-use statement, no named alternative (e.g. jobs_search for non-tracked jobs), and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_removeRemove a job from the trackerADestructiveInspect
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, readOnlyHint=false, and openWorldHint=false, so the safety profile is covered without the description's help. The description adds only the output confirmation ('Confirms the job was removed') and the ID provenance; it says nothing about reversibility, required auth, or side effects, so it is an adequate but not rich supplement.
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?
Short and front-loaded: the purpose leads, then Input and Output are cleanly sectioned. Slight waste in restating the schema's parameter description word-for-word, but nothing is bloated or meandering.
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 destructive tool, the description covers purpose, the one input's provenance, and the confirmation result. With an output schema present it need not explain return values, and annotations carry the destructive semantics, leaving only reversibility/auth unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's parameter text is a verbatim duplicate of the schema's property description, adding no syntax, format, or provenance information beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Removes a job from the user's job tracker'), which is unambiguous and cannot be confused with sibling tracker_add/tracker_update/tracker_list. It even disambiguates the identifier space, noting tracked_job_id is distinct from trackable.id and job.id, which is exactly the kind of precision that separates this from neighboring 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 intent to remove an existing tracked job is implied clearly enough by the name and description, but there is no explicit when-to-use, when-not-to-use, or reference to alternative tools (e.g., how this differs from job_alert_unsubscribe). Guidance is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_updateUpdate a tracked jobBDestructiveInspect
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 declare destructiveHint=true, readOnlyHint=false, so the safety profile is covered. The description adds genuinely useful context (reminder_at must be future or empty to clear; tracked_job_id differs from trackable.id/job.id), but it never states whether omitted fields are preserved or whether the update is reversible/partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-sentence purpose, then organizes parameter and output notes under clear Input/Output headers. Slight redundancy with the schema, but no wasted sentences.
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, return values needn't be explained, and the required ID and delta semantics are covered. What is missing is the effect of a destructive/partial update on unmentioned fields, which an agent would want before calling a destructiveHint=true 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 description coverage is 100%, so the schema already documents every parameter; the description largely restates it, including the reminder_at future constraint and the ID disambiguation. Baseline 3 is correct when the structured schema does the heavy lifting.
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 first sentence states a specific verb (Updates) and resource (tracked job details) and enumerates the affected fields (notes, deadline, salary, tags). It implicitly distinguishes itself from tracker_update_status by enumerating detail fields, but never names that sibling to make the boundary explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the field enumeration makes clear this is for non-status details, which separates it from tracker_update_status. However, there is no explicit when-to-use guidance, no named alternative, and no statements about prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracker_update_statusMove a tracked job to another stageBDestructiveInspect
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?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=false, so the safety profile is covered. The description adds the meaningful behavioral constraint that sub_status is only valid within its parent status, but says nothing about auth requirements, reversibility of a stage change, or side effects such as notifying the employer or altering timestamps.
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 Input/Output structure is front-loaded and easy to scan, but the entire Input block duplicates schema descriptions that are already 100% covered, and the long inline sub_status enumeration is repeated twice across description and schema. Roughly half the text does not earn additional 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?
With an output schema present and rich annotations, the description covers the inputs, the valid value space, and the return shape, which is sufficient for correct invocation. It falls short only on sibling differentiation and on what a status transition actually changes on the tracked job.
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 reproduces the schema text nearly verbatim, including the full status/sub_status enumerations. It adds no format, defaulting, or interaction semantics beyond what the schema already documents, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — updating the status of a tracked job — and the title frames it as moving a job between stages. It is clearly a mutation on a tracked job, but it never distinguishes itself from the sibling tracker_update, which an agent would plausibly consider for the same goal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus tracker_update or the other tracker_* siblings, nor any prerequisites (e.g., that the job must already be tracked). The only routing hint is that tracked_job_id comes from tracker_list output, which is identification, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.1.16- Changed
jobs_analyze_external4 fields changed- removed
Output schema / properties / jobs / items / properties / estimatedSalary / properties / basedOnRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / jobs / items / properties / estimatedSalary / properties / currencyAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / studioUrlAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / system_instructionAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
jobs_compare4 fields changed- removed
Output schema / properties / jobs / items / properties / estimatedSalary / properties / basedOnRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / jobs / items / properties / estimatedSalary / properties / currencyAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / studioUrlAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / system_instructionAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
jobs_details6 fields changed- added
Input schema / properties / result_item_idAdded value: +{ + "description": "The result occurrence ID returned with the selected job", + "type": "string" +} - removed
Output schema / properties / job / properties / estimatedSalary / properties / basedOnRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / job / properties / estimatedSalary / properties / currencyAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / job / properties / remoteCheckAdded value: +{ + "properties": { + "quotes": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "workFrom": { + "properties": { + "allowedPlaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "excludedPlaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "quotes": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "scope": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / job / properties / resultItemIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / studioUrlAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
jobs_recommendations30 fields changed- added
Input schema / properties / benefitsAdded value: +{ + "description": "Advanced filter: benefit names such as \"health insurance\", \"401k\" or \"parental leave\"; a job qualifies only when it states every listed benefit. Names that match no known benefit are ignored.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" +} - added
Input schema / properties / bonuses_onlyAdded value: +{ + "description": "Advanced filter: only jobs that state a bonus (sign-on, performance, referral, commission and the like).", + "type": "boolean" +} - added
Input schema / properties / companiesAdded value: +{ + "description": "Filter: official company names; a job from any of them qualifies, across every job board each employer posts on. More than one company makes it an advanced filter. Next to company, a job has to match both; hiring_brand narrows company only.", + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / companyAdded value: +{ + "description": "The official company name", + "type": "string" +} - added
Input schema / properties / confirmed_work_fromAdded value: +{ + "description": "Advanced filter: with strict_remote, also leaves out postings that do not say where the work can be done from.", + "type": "boolean" +} - added
Input schema / properties / educationAdded value: +{ + "description": "Filter: jobs whose posting requires one of these education levels (no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree); bachelor_degree means the posting asks for a bachelor degree, not that it suits someone holding one.", + "items": { + "enum": [ + "no_requirements", + "high_school", + "associate_degree", + "bachelor_degree", + "professional_certificate", + "postgraduate_degree" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / employment_typesAdded value: +{ + "description": "Filter: jobs offered as any of these employment types (full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other).", + "items": { + "enum": [ + "full_time", + "part_time", + "contractor", + "temporary", + "intern", + "volunteer", + "per_diem", + "other" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / exclude_companiesAdded value: +{ + "description": "Advanced filter: official company names whose jobs are removed from the results, across every job board each employer posts on.", + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / experience_levelsAdded value: +{ + "description": "Filter: jobs at any of these experience levels (entry_level, mid_level, senior_level, executive). The level comes from the years of experience the posting asks for and the seniority in its title, the higher of the two; entry_level never includes a posting asking for more than two years.", + "items": { + "enum": [ + "entry_level", + "mid_level", + "senior_level", + "executive" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / h1b_sponsors_onlyAdded value: +{ + "description": "Advanced filter: only companies known to sponsor H1B visas.", + "type": "boolean" +} - added
Input schema / properties / hide_low_qualityAdded value: +{ + "description": "Advanced filter: hides postings with a risky ghost grade (D/F); ungraded postings stay.", + "type": "boolean" +} - added
Input schema / properties / hiring_brandAdded value: +{ + "description": "Filter: one brand inside the company, for example company \"Google\" with hiring_brand \"YouTube\"; used only together with company.", + "type": "string" +} - changed
Input schema / properties / location / descriptionPrevious value: -"Optional preferred location name or slug"New value: +"Geographic location (e.g., 'Boston, MA')" - added
Input schema / properties / min_matchAdded value: +{ + "description": "Advanced filter: lowest personal FoundRole match grade to keep, the same letter each job shows in insights.match.grade. A and A- are rare even for a strong resume; B keeps good and strong matches; C+ also keeps fair ones. Needs a resume on the account.", + "enum": [ + "A", + "A-", + "B+", + "B", + "B-", + "C+", + "C" + ], + "type": "string" +} - added
Input schema / properties / posted_days_agoAdded value: +{ + "description": "Number of days ago to search for jobs (1-365)", + "maximum": 365, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / queryAdded value: +{ + "description": "The full job title or skill (e.g., \"Ruby Developer\", NOT just \"Ruby\")", + "type": "string" +} - added
Input schema / properties / radiusAdded value: +{ + "description": "Search radius in miles around a city location (default 40); not used for state, country or remote searches.", + "maximum": 100, + "minimum": 5, + "type": "integer" +} - added
Input schema / properties / remoteAdded value: +{ + "description": "Advanced filter: only remote-eligible jobs, matched across the whole country of the requested location rather than its radius.", + "type": "boolean" +} - added
Input schema / properties / salary_floorAdded value: +{ + "description": "Advanced filter: minimum annualized salary in USD; a posting qualifies when the lower bound of its pay band reaches the floor. Jobs without a USD salary are dropped.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Result order (score, posted_at, match, salary): score is relevance and the default, posted_at is newest first, salary is highest pay first, match is best personal fit first and needs a resume. Ordering by salary or match is an advanced option.", + "enum": [ + "score", + "posted_at", + "match", + "salary" + ], + "type": "string" +} - added
Input schema / properties / strict_remoteAdded value: +{ + "description": "Advanced filter: only postings checked as fully remote that can be worked from the requested location: the posting names that area, allows anywhere, or does not say where. Stricter than remote; work_modes other than remote do not apply with it.", + "type": "boolean" +} - added
Input schema / properties / work_modesAdded value: +{ + "description": "Advanced filter: jobs in any of these work modes (on_site, remote, hybrid). remote is matched across the whole country of the location, the others within the radius. [\"remote\"] is the same search as remote: true.", + "items": { + "enum": [ + "on_site", + "remote", + "hybrid" + ], + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / continueUrlAdded value: +{ + "type": "string" +} - removed
Output schema / properties / jobs / items / properties / estimatedSalary / properties / basedOnRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / jobs / items / properties / estimatedSalary / properties / currencyAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / jobs / items / properties / relatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / jobs / items / properties / resultItemIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / previewAdded value: +{ + "properties": { + "continueUrl": { + "type": [ + "string", + "null" + ] + }, + "hidden": { + "type": "integer" + }, + "hiddenAtLeast": { + "type": "boolean" + }, + "shown": { + "type": "integer" + } + }, + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / resultBatchIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / resultSetIdAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
jobs_search30 fields changed- added
Input schema / properties / benefitsAdded value: +{ + "description": "Advanced filter: benefit names such as \"health insurance\", \"401k\" or \"parental leave\"; a job qualifies only when it states every listed benefit. Names that match no known benefit are ignored.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" +} - added
Input schema / properties / bonuses_onlyAdded value: +{ + "description": "Advanced filter: only jobs that state a bonus (sign-on, performance, referral, commission and the like).", + "type": "boolean" +} - added
Input schema / properties / companiesAdded value: +{ + "description": "Filter: official company names; a job from any of them qualifies, across every job board each employer posts on. More than one company makes it an advanced filter. Next to company, a job has to match both; hiring_brand narrows company only.", + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / confirmed_work_fromAdded value: +{ + "description": "Advanced filter: with strict_remote, also leaves out postings that do not say where the work can be done from.", + "type": "boolean" +} - added
Input schema / properties / educationAdded value: +{ + "description": "Filter: jobs whose posting requires one of these education levels (no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree); bachelor_degree means the posting asks for a bachelor degree, not that it suits someone holding one.", + "items": { + "enum": [ + "no_requirements", + "high_school", + "associate_degree", + "bachelor_degree", + "professional_certificate", + "postgraduate_degree" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / employment_typesAdded value: +{ + "description": "Filter: jobs offered as any of these employment types (full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other).", + "items": { + "enum": [ + "full_time", + "part_time", + "contractor", + "temporary", + "intern", + "volunteer", + "per_diem", + "other" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / exclude_companiesAdded value: +{ + "description": "Advanced filter: official company names whose jobs are removed from the results, across every job board each employer posts on.", + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / experience_levelsAdded value: +{ + "description": "Filter: jobs at any of these experience levels (entry_level, mid_level, senior_level, executive). The level comes from the years of experience the posting asks for and the seniority in its title, the higher of the two; entry_level never includes a posting asking for more than two years.", + "items": { + "enum": [ + "entry_level", + "mid_level", + "senior_level", + "executive" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / hiring_brandAdded value: +{ + "description": "Filter: one brand inside the company, for example company \"Google\" with hiring_brand \"YouTube\"; used only together with company.", + "type": "string" +} - changed
Input schema / properties / min_match / descriptionPrevious value: -"Advanced filter: minimum personal FoundRole match score (0-100); needs a resume on the account."New value: +"Advanced filter: lowest personal FoundRole match grade to keep, the same letter each job shows in insights.match.grade. A and A- are rare even for a strong resume; B keeps good and strong matches; C+ also keeps fair ones. Needs a resume on the account." - added
Input schema / properties / min_match / enumAdded value: +[ + "A", + "A-", + "B+", + "B", + "B-", + "C+", + "C" +] - removed
Input schema / properties / min_match / maximumRemoved value: -100 - removed
Input schema / properties / min_match / minimumRemoved value: -0 - changed
Input schema / properties / min_match / typePrevious value: -"integer"New value: +"string" - added
Input schema / properties / radiusAdded value: +{ + "description": "Search radius in miles around a city location (default 40); not used for state, country or remote searches.", + "maximum": 100, + "minimum": 5, + "type": "integer" +} - changed
Input schema / properties / remote / descriptionPrevious value: -"Advanced filter: only remote-eligible jobs (respects the location/region scope)."New value: +"Advanced filter: only remote-eligible jobs, matched across the whole country of the requested location rather than its radius." - changed
Input schema / properties / salary_floor / descriptionPrevious value: -"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."New value: +"Advanced filter: minimum annualized salary in USD; a posting qualifies when the lower bound of its pay band reaches the floor. Jobs without a USD salary are dropped." - added
Input schema / properties / sortAdded value: +{ + "description": "Result order (score, posted_at, match, salary): score is relevance and the default, posted_at is newest first, salary is highest pay first, match is best personal fit first and needs a resume. Ordering by salary or match is an advanced option.", + "enum": [ + "score", + "posted_at", + "match", + "salary" + ], + "type": "string" +} - added
Input schema / properties / strict_remoteAdded value: +{ + "description": "Advanced filter: only postings checked as fully remote that can be worked from the requested location: the posting names that area, allows anywhere, or does not say where. Stricter than remote; work_modes other than remote do not apply with it.", + "type": "boolean" +} - added
Input schema / properties / work_modesAdded value: +{ + "description": "Advanced filter: jobs in any of these work modes (on_site, remote, hybrid). remote is matched across the whole country of the location, the others within the radius. [\"remote\"] is the same search as remote: true.", + "items": { + "enum": [ + "on_site", + "remote", + "hybrid" + ], + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / continueUrlAdded value: +{ + "type": "string" +} - removed
Output schema / properties / jobs / items / properties / estimatedSalary / properties / basedOnRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / jobs / items / properties / estimatedSalary / properties / currencyAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / jobs / items / properties / relatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / jobs / items / properties / resultItemIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / previewAdded value: +{ + "properties": { + "continueUrl": { + "type": [ + "string", + "null" + ] + }, + "hidden": { + "type": "integer" + }, + "hiddenAtLeast": { + "type": "boolean" + }, + "shown": { + "type": "integer" + } + }, + "type": [ + "object", + "null" + ] +} - removed
Output schema / properties / proFilterUpsellUrlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / resultBatchIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / resultSetIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / system_instructionAdded value: +{ + "type": "string" +}
- Changed
knowledge_search4 fields changed- removed
Input schema / properties / job_titleRemoved value: -{ - "description": "A job title or role, when the question is about openings for it — returns job-listing landing pages", - "type": "string" -} - changed
Input schema / properties / location / descriptionPrevious value: -"A city, state, or country refining job_title, or alone when the question is about jobs in that place"New value: +"A city, state, or country, when the question is about that labour market — returns its market landing page" - removed
Output schema / properties / companyPages / items / properties / openJobsRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - removed
Output schema / properties / landingPages / items / properties / openJobsRemoved value: -{ - "type": [ - "integer", - "null" - ] -}
- Added
resume_check - Changed
tracker_add1 field changed- added
Input schema / properties / result_item_idAdded value: +{ + "description": "The result occurrence ID returned with the selected job", + "type": "string" +}
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
Scored across 21 tools
Most tools target clearly distinct resources and actions (alerts vs tracker vs reminders vs knowledge vs resume). A few boundaries blur: jobs_search and jobs_recommendations both return job feeds, and reminder_set overlaps with tracker_update's reminder_at field, but the descriptions do clarify intent.
Tools follow a mostly predictable domain_verb pattern (job_alert_subscribe, tracker_add, knowledge_search, resume_check). Minor deviations exist, notably the plural 'jobs_' prefix versus singular 'job_alert_' and the 'external' suffix variants, but the scheme is readable throughout.
21 tools is on the heavy side for what is a fairly broad domain with multiple sub-areas (jobs, alerts, tracker, reminders, knowledge, resume). Every tool arguably earns its place, but the surface borders on being too large and could be consolidated.
The surface covers the full lifecycle across its sub-domains: search/details/compare/analyze for jobs, subscribe/list/unsubscribe for alerts, add/list/update/remove for tracking, and set/list/delete for reminders. Gaps are minor, such as the deliberate exclusion of resume upload or profile editing.
Maintenance
Related MCP Connectors
Manage job applications — jobs, companies, boards, notes, and profile — from your AI client.
Job search, application materials, and application tracking for AI assistants.
Free, read-only access to job listings rated by AI level, from Little AI to Builds AI.
Job platform for AI agents. Track tech jobs from companies that match your stack.
Related MCP Servers
- 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.-
- AlicenseAqualityCmaintenanceAn MCP server for searching UK tech jobs from the winterchill catalog, enabling job search, company lookup, and CV matching/tailoring via LLM agents.6MIT
- AlicenseNot gradedqualityBmaintenanceEnables natural-language job search and aggregation from multiple recruitment websites with zero configuration, providing filtered results and standardized output for AI assistants.64 npmISC
- AlicenseAqualityBmaintenanceEnables AI agents to search job openings across free sources, prepare application materials using known experience, and handle authorized email sending and follow-ups.95MIT