ApplyOps
Provides job application automation for Amazon's career site (amazon.jobs), including navigating the passport.amazon.jobs sign-in flow and filling application forms.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ApplyOpsApply to this job and prompt me before submitting: https://www.linkedin.com/jobs/view/123456"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ApplyOps
A harness-agnostic MCP server for job applications. It gives an AI agent the hands to fill in real application forms in a real browser, and the memory to interrupt you less on every application after the first.
No model, no API key, no agent loop of its own — the brain is your harness.
New here? Follow Zero to first application below — every step is copy-pasteable and says what you should see.
English
What it is
ApplyOps is not an agent. It is an MCP server exposing 32 tools that any MCP-speaking harness — Codex, WorkBuddy, Claude Code — can drive:
Hands | A real browser that fills real forms, through shadow DOM and cross-origin iframes, plus a locator layer built to survive a page redesign |
Memory | A flywheel recording every question ever answered, every selector that ever worked, and how each application route behaves — so application N+1 asks you less than application N |
Everything else is the harness's job: planning, reading a difficult page, handling the unexpected, talking to you.
In plain terms: you talk to your AI assistant, and ApplyOps is what lets it actually open a browser and submit the form for you.
Zero to first application
All commands run in a terminal (Terminal.app on macOS). Each step ends with what you should see — if you don't, jump to Troubleshooting.
Step 0 — Check your Python. You need Python 3.12 or newer:
python3 --version # needs to say 3.12 or higherStep 1 — Install uv (a tool that manages Python dependencies for you; it will also install a matching Python if needed):
curl -LsSf https://astral.sh/uv/install.sh | shThen close and reopen your terminal so the uv command is found.
Step 2 — Get the code and install everything:
git clone https://github.com/hanyuli0310/applyops-agent.git
cd applyops-agent
uv sync # creates .venv/ and installs dependencies
uv run playwright install chrome # installs the real Google Chrome it drivesNo
git? Click Code → Download ZIP on the GitHub page instead, unzip it, andcdinto the folder.
Step 3 — Tell it who you are. Run the setup wizard:
.venv/bin/applyops-initIt asks, one question at a time, everything a job form will ever ask — name, email, phone, work authorization, salary expectations, and so on. Three things to know:
Enter keeps the current value,
-clears one, Ctrl-C quits anytime — answers are saved after every question, so you can rerun the command later and it resumes instead of restarting.Anything you leave blank stays blank, and the system will ask you when it reaches that field rather than guess. Salary and visa status are exactly where a confident wrong answer causes real harm.
Your answers live in
data/profile.md— an ordinary markdown file you can open and edit by hand at any time. All 34 fields are explained inprofile.example.md.
Step 4 — Bring your LinkedIn login over. Easy Apply needs a logged-in session. Reuse the one your Chrome already has:
.venv/bin/python tools/import_chrome_session.py --list # find the Chrome profile you use
.venv/bin/python tools/import_chrome_session.py --domains linkedin.com --verify # confirm the session came acrossSkipped or it failed? Nothing breaks — the first time an application needs it, the browser will simply show a LinkedIn login page and you sign in once by hand.
Step 5 — Register the server in your AI harness. This tells your AI assistant that ApplyOps exists. Point it at the applyops-mcp command inside this project (use the full absolute path):
{
"mcpServers": {
"applyops": {
"command": "/FULL/PATH/TO/applyops-agent/.venv/bin/applyops-mcp"
}
}
}Claude Code:
claude mcp add applyops -- /FULL/PATH/TO/applyops-agent/.venv/bin/applyops-mcpCodex: add the same command under
[mcp_servers.applyops]in~/.codex/config.tomlAny other harness: the JSON above, in whatever place it accepts MCP servers.
You can also test the server by itself, without any harness:
.venv/bin/python tools/op.py ping '{}' # → the server replies
.venv/bin/python tools/op.py setup_status '{}' # → is your profile complete?
.venv/bin/python -m pytest tests/ -q # → 22 tests pass, ~6sStep 6 — Apply. Open your AI assistant and just say it in one sentence:
That's it. The agent calls preflight (daily cap / pacing / have-you-already-applied), route_guide (which route this posting takes), opens the real browser, fills the form from your profile and its memory, and shows you a full summary of every field before asking you to confirm submission. Nothing is ever submitted without your one-time confirmation.
The first application will ask you a few things the memory doesn't know yet. The second asks fewer. That's the flywheel.
Troubleshooting
What you see | What it means | What to do |
| The install script finished but your shell hasn't reloaded | Close and reopen the terminal; or run |
Python says 3.11 or lower | Too old |
|
| You're pasting into the wrong window | Run it in a real terminal, not inside some other tool |
| Another driver (unattended loop, another chat) holds the Chrome profile | Wait for it to finish; the message names the holder. Don't retry in a loop |
A fill reports | The page rejected the value | It is not filled — fix the value and refill; never treat it as done |
LinkedIn login page appears mid-run | Step 4 was skipped or the session expired | Sign in once by hand in the opened browser; it persists in |
Server "not found" in the harness | Wrong command path, or not absolute | Use the absolute path of |
Daily use
Once the first application has gone through, the two everyday patterns are:
Keep using it by conversation. Paste a job URL into your AI assistant. Same flow, fewer questions each time.
Unattended mode — a supervised loop that discovers and applies on a schedule:
.venv/bin/python tools/cron_apply.py --dry-run # rails + browser only, no applications
.venv/bin/python tools/cron_apply.py --ensure # start the loop if it is not running
.venv/bin/python tools/cron_apply.py --status # is it up? how much quota is left?
.venv/bin/python tools/cron_apply.py --stopRun --dry-run first, and watch the first real submission — the loop drives the same Chrome profile you do.
What your data looks like
Everything mutable is under data/, which is git-ignored in full:
path | contents | safe to delete? |
| your facts, as a hand-editable markdown file | no — that is your work |
| the flywheel: learned answers, selector scores, history, route knowledge | no |
| today's count, breaker, outstanding confirmation tokens | yes |
| the live Chrome profile, including session cookies | yes, then re-import |
The repository itself contains no personal data of any kind — no default name, email, phone, salary or location. Keep it that way.
Why this shape
The first version of this project owned the brain: an agent loop, pluggable LLM providers, a web UI. Moving the brain out removed the API-key requirement, the provider-drift problem, and the entire front end in one stroke. What survives a change of harness is exactly what remains here: the browser layer and the learning memory. legacy/ holds the retired v1 as a rollback point.
The invariants
Five rules the code is built around. Breaking one produces something that looks like it works.
The flywheel records inside the tools, never in the caller.
Submission requires a one-time confirmation token — the only real guard against a mis-filled form.
A blank profile field is asked about, never guessed — salary, visa status, work authorization and legal declarations are where a confident wrong answer causes real harm.
selectors_suggestedmust be non-zero after real runs — the only signal separating "never tried" from "tried and always failed".Human-required gates are declared up front, in the route, before the form is opened.
Route knowledge: Easy Apply is the easy case
LinkedIn Easy Apply stays on the posting page. amazon.jobs hands you to passport.amazon.jobs, where a sign-in — usually confirmed by an emailed one-time code — stands in front of the first input field. So knowledge is split into two layers, keyed <platform>/<route>:
layer | question it answers |
selectors ( | how do I locate this element |
routes ( | how many steps, what does it need, which step needs a human |
route_guide(job_url) returns all of this before the form is opened, so human-required gates (one-time codes, captchas, account passwords) get batched into the same question set as the profile answers rather than discovered halfway through. A route record also carries flywheel counters — blocked_at says which gate a route dies at, which is where the next adapter gets written.
One browser at a time
Several processes share one Chrome profile, because the logged-in session is the one thing this project cannot rebuild for itself. Two Chromes on one profile do not slow each other down — they overwrite each other's cookie database. So the profile has an exclusive lock and there is exactly one driver; a second one is refused with browser_busy: true naming the holder.
State files use lock + write — and merge, so that even a misbehaving writer cannot lose data:
file | mechanism | accuracy |
| lock + read-modify-write | exact: 12 processes racing a cap of 5, exactly 5 get through |
| lock + merge-on-write | no record lost; counters take the max |
| same lock, merged by posting | no row lost or duplicated |
Locks are flock, not pid files: the kernel releases them however a process dies (SIGKILL included), so there is no stale-lock cleanup anywhere and no code that has to answer "is that pid still alive". tests/test_concurrency.py genuinely spawns processes to prove all of the above.
License
MIT — see LICENSE.
Related MCP server: CoverAI MCP Server
中文
这是什么
ApplyOps 不是 agent。它是一个 MCP server,对外暴露 32 个工具,由任何会说 MCP 的 harness 驱动 —— Codex、WorkBuddy、Claude Code 都行:
手 | 真实浏览器填真实表单,能穿 shadow DOM 和跨域 iframe;定位层按「扛得住页面改版」来写 |
记忆 | 飞轮:记下答过的每个问题、生效过的每个选择器、以及每条投递路由的行为 —— 所以第 N+1 次投递比第 N 次更少打扰你 |
其余的归 harness:规划、看难页、处理意外、跟你对话。
说人话就是:你跟你的 AI 助手对话,ApplyOps 让它真的能打开浏览器、替你把表单填好提交。
从零到第一次投递
以下命令都在终端(macOS 的「终端」App)里执行。每一步都写了「你应该看到什么」,看不到就跳到常见问题。
第 0 步 —— 检查 Python。 需要 3.12 或更新:
python3 --version # 要显示 3.12 或更高第 1 步 —— 安装 uv(帮你管理 Python 依赖的工具,缺 Python 时它还能自动装一个):
curl -LsSf https://astral.sh/uv/install.sh | sh装完后关掉终端重新打开,uv 命令才能被找到。
第 2 步 —— 拿到代码,装好一切:
git clone https://github.com/hanyuli0310/applyops-agent.git
cd applyops-agent
uv sync # 建出 .venv/ 并安装依赖
uv run playwright install chrome # 安装它要驱动的真实 Chrome不会用
git?在 GitHub 页面点 Code → Download ZIP,解压后cd进文件夹就行。
第 3 步 —— 告诉它你是谁。 运行设置向导:
.venv/bin/applyops-init它会把填表可能问到的一切逐项问你:姓名、邮箱、电话、工作授权、期望薪资……三件事要知道:
直接回车 = 保留当前值,输入
-= 清空这一项,Ctrl-C 随时退出 —— 每答完一题就立刻保存,所以中途退出再跑会接着来,不用从头答。你留空的就真的是空的,系统到那个字段时会来问你,绝不替你猜。薪资、签证状态正是「自信地答错会造成实害」的地方。
答案写在
data/profile.md—— 一个普通的 markdown 文件,随时可以打开手改。全部 34 个字段的解释见profile.example.md。
第 4 步 —— 把 LinkedIn 登录态搬过来。 Easy Apply 需要已登录的会话,直接复用你 Chrome 里现成的那个:
.venv/bin/python tools/import_chrome_session.py --list # 找出你在用的 Chrome profile
.venv/bin/python tools/import_chrome_session.py --domains linkedin.com --verify # 确认登录态搬过来了没做这一步或者失败了?不影响 —— 第一次真投递时浏览器会停在 LinkedIn 登录页,你手动登录一次就好。
第 5 步 —— 在你的 AI harness 里注册服务。 这一步是告诉你的 AI 助手「ApplyOps 存在」。把它的启动命令(绝对路径)注册进去:
{
"mcpServers": {
"applyops": {
"command": "/完整/路径/applyops-agent/.venv/bin/applyops-mcp"
}
}
}Claude Code:
claude mcp add applyops -- /完整/路径/applyops-agent/.venv/bin/applyops-mcpCodex:把同样的命令写进
~/.codex/config.toml的[mcp_servers.applyops]其他 harness:上面那段 JSON,放到它接受 MCP server 的地方。
不接 harness 也能单独验证服务本身:
.venv/bin/python tools/op.py ping '{}' # → 服务应答
.venv/bin/python tools/op.py setup_status '{}' # → 档案齐了没
.venv/bin/python -m pytest tests/ -q # → 22 项测试通过,约 6 秒第 6 步 —— 投递。 打开你的 AI 助手,一句话:
就是这样。agent 会先跑 preflight(每日上限 / 节流 / 查重)、route_guide(这条招聘走哪条路),然后打开真实浏览器,用你的档案和它的记忆填表,并在请求你确认前把每个字段的值完整列给你看。没有你的一次性确认,任何东西都不会被提交。
第一次投递会问你几个记忆里还没有的问题,第二次就更少 —— 这就是飞轮。
常见问题
看到什么 | 意味着什么 | 怎么办 |
| 安装成功了但 shell 没刷新 | 关掉终端重开;或 |
Python 显示 3.11 或更低 | 版本太老 | 直接跑 |
| 你把命令敲进了别的工具的窗口 | 用真正的终端跑它 |
返回 | 另一个驱动(无人值守循环、另一个会话)占着 Chrome profile | 等它跑完;报错里写了持有者是谁,别循环重试 |
某次填写返回 | 页面拒绝了这个值 | 它没填进去 —— 改值重填,永远别当它已填好 |
跑到一半出现 LinkedIn 登录页 | 第 4 步没做或会话过期 | 在打开的浏览器里手动登录一次,会话会留在 |
harness 里找不到服务 | 命令路径不对,或不是绝对路径 | 用项目里 |
日常使用
第一次投递跑通后,日常就两种用法:
继续用对话。 把岗位链接丢给 AI 助手,流程同上,问题一次比一次少。
无人值守 —— 一个按节奏自动发现岗位并投递的后台循环:
.venv/bin/python tools/cron_apply.py --dry-run # 只跑护栏 + 浏览器,不投任何岗位
.venv/bin/python tools/cron_apply.py --ensure # 没在跑就起起来
.venv/bin/python tools/cron_apply.py --status # 在跑吗?还剩多少名额?
.venv/bin/python tools/cron_apply.py --stop先跑 --dry-run,第一次真实投递建议盯屏 —— 它和你共用同一个 Chrome profile。
你的数据长什么样
所有会变的东西都在 data/ 下,而这个目录整个被 git 忽略:
路径 | 内容 | 能删吗? |
| 你的个人信息,可手改的 markdown | 不能 —— 这是你的心血 |
| 飞轮:学到的问答、选择器得分、历史、路由知识 | 不能 |
| 今日计数、熔断、未消费的确认令牌 | 能 |
| 活的 Chrome profile,含会话 cookie | 能,删了重新导入即可 |
仓库本身不含任何人的个人信息 —— 没有默认的名字、邮箱、电话、薪资、地址。请保持这样。
为什么是这个形态
这个项目的第一版自带大脑:agent 循环、可插拔 LLM provider、Web UI。把大脑搬出去后,API Key 要求、provider 漂移、整个前端一次性消失。换任何 harness 都不会失去的,恰好就是这里剩下的:浏览器层和学习型记忆。legacy/ 是退役的 v1,作为回滚点保留。
五条不变式
代码就是围着这五条写的。破掉任何一条,都会得到一个看起来能用的系统。
飞轮记录在工具内部,不在调用方。
提交必须持有一次性确认令牌 —— 这是拦住「误提交」的唯一真护栏。
档案空值只能问,不能猜 —— 薪资、签证状态、工作授权、法律声明,答错的代价是实害。
selectors_suggested在真实跑单后必须非零 —— 它是唯一能区分「从没试过」和「试了全失败」的信号。人工关卡必须提前声明 —— 写在路由里,在开表单之前就拿到。
申请路由经验库:Easy Apply 才是简单的那条
LinkedIn Easy Apply 不出招聘页;amazon.jobs 会把你交给 passport.amazon.jobs,那里在第一个输入框之前就横着一道登录,而且往往要邮箱验证码。所以知识分两层,key 都是 <平台>/<路由>:
层 | 回答的问题 |
选择器( | 这个元素怎么定位 |
路由( | 几步、前提是什么、哪一步必须人来做 |
route_guide(job_url) 在开表单之前返回这些,所以人工关卡(验证码、一次性密码、建账号)能和档案问题一起批量问掉,而不是填到一半才发现。路由记录还带飞轮计数 —— blocked_at 说「死在哪道闸门」,下一个适配器就从这句话写起。
一次只开一个浏览器
多个进程共用一个 Chrome profile,因为登录态是这个项目唯一自己造不出来的东西。两个 Chrome 挤一个 profile 不是「慢一点」,是互相重写 cookie 数据库。所以 profile 有独占锁,同一时刻只有一个驱动;第二个会被拒绝,返回 browser_busy: true 并报出持有者是谁。
状态文件用锁 + 写入 —— 而且是合并写,即使某个写者不守规矩也不丢数据:
文件 | 机制 | 精确度 |
| 锁 + 读—改—写 | 精确:12 个进程抢 5 个名额,结果就是 5 |
| 锁 + 合并写 | 记录一条不丢;计数器取 max |
| 同一把锁,按 posting 合并 | 一条不丢、不重复 |
锁用 flock,不用 pid 文件:内核在进程以任何方式退出时释放锁(含 SIGKILL),所以项目里没有陈旧锁清理,也没有任何代码需要回答「那个 pid 还活着吗」。tests/test_concurrency.py 真的 spawn 多进程验证以上全部。
许可
MIT,见 LICENSE。
Available Tools
32 toolsapplication_historyD
Past applications, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only mentions ordering ('newest first') and fails to state that the operation is read-only, has no side effects, or describe return format or pagination—critical gaps for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short phrase, but it is under-specified rather than concise. It lacks a clear structure and does not front-load essential operational details; the minimal length is not justified by informative content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Though an output schema exists, the description omits crucial context such as when to call this tool, what the output contains, and how the limit parameter behaves. For a simple tool, this is still incomplete because it relies entirely on the name and schema without bridging the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention the 'limit' parameter at all. It adds no meaning beyond the schema's default value, failing to compensate for the lack of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Past applications, newest first,' which conveys the tool returns a list of prior applications ordered by recency. However, it lacks an explicit verb (list/retrieve) and does not differentiate from siblings like check_already_applied or flywheel_stats, making the purpose vague rather than specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of the appropriate context (e.g., viewing submission history) or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_closeA
Close the automation browser and release the profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It states the action ('close' and 'release profile') but does not explain side effects such as discarding unsaved work, releasing locks, or the irreversibility of the operation. This is minimal but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence that front-loads the primary action ('Close') and includes the secondary effect ('release the profile'). No filler or redundant text.
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, parameterless tool with an output schema, the description adequately states what it does. It could benefit from noting that it ends the browser session, but given the simplicity, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is effectively 100%. The description does not need to add parameter information. A baseline of 4 is appropriate since there is nothing to clarify.
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: 'Close the automation browser and release the profile.' It clearly distinguishes itself from sibling tools like browser_open (opens) and browser_state (reads state), leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It does not mention that it should be used at the end of a session, nor does it contrast with browser_state or browser_tabs. The agent must infer the appropriate context from the action itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_openA
Open a URL in the automation browser.
The browser launches on first use with a persistent profile, so a LinkedIn session established once is reused on later runs.
Only one process may drive that profile at a time -- two Chromes on one
profile delete each other's cookies, and the logged-in session cannot be
rebuilt from here. If another driver (the scheduled loop, a batch run)
has it, this returns browser_busy: true with the holder's name instead
of opening a second browser. Do not retry in a loop; the holder is
usually mid-application.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden — and it excels. It discloses session persistence across runs, cookie-deletion risk from concurrent drivers, the browser_busy return with holder's name, and the constraint that the session cannot be rebuilt. These are non-obvious behaviors an agent could not infer from the schema.
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?
Purpose is front-loaded in the first sentence, and every subsequent sentence earns its place by conveying a distinct operational fact: persistence, contention, cookie destruction, busy signal, and retry guidance. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema (which likely documents return values), the description covers purpose, session behavior, contention, and the failure mode. Minor gaps remain — e.g., what constitutes a successful open or whether the tool waits for page load — but the non-obvious operational facts are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It maps the single url parameter to 'a URL... in the automation browser,' which defines it adequately. However, it adds no format, scheme, or validation detail beyond what the schema's own property name 'url' already implies.
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 'Open a URL in the automation browser' states a specific verb, resource, and target. This is clearly distinct from siblings like browser_tabs, browser_screenshot, browser_scroll, and browser_close, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong operational guidance: the persistent-profile model, the single-driver constraint, the browser_busy failure signal, and explicit 'do not retry in a loop' advice. It does not explicitly name sibling alternatives or when-not conditions, but the context for correct use is clearly established.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotA
Save a screenshot of the visible viewport and return its path.
Use this when the field list looks wrong or empty: the DOM can be read literally, but only a picture shows whether the page is where you think it is.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool captures only the visible viewport, saves a screenshot, and returns a path, which is the core behavior. It does not discuss side effects or file-handling details, but this is a relatively simple read-only action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and output, followed by a concise when-to-use explanation. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description covers what the tool does, what it returns, and when to use it. 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?
The tool has zero parameters, so the baseline is 4. The description appropriately adds no parameter detail because there is nothing to document.
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 screenshot of the visible viewport and returns its path. The use-case sentence distinguishes it from DOM-reading tools, so an agent can tell what it does 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?
Provides clear context for when to use it: when the field list looks wrong or empty, because a screenshot reveals whether the page is actually in the expected state. It does not name specific alternative tools or exclusions, but the guidance is strong enough to route the agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_scrollC
Scroll the viewport. direction is 'down' or 'up'.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| direction | No | down |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states 'Scroll the viewport' without revealing any side effects, return format, or behavior details (e.g., instant vs. animated, relative vs. absolute). The tool mutates the viewport, but that is inherent. No additional behavioral context is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short and front-loaded with the action, but it borders on under-specification. While there is no fluff, the lack of detail on `amount` and behavior makes it less useful. It is concise but not sufficiently informative to be rated higher on structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool, the description is incomplete. It fails to explain the `amount` parameter, does not describe the return value (despite an output schema being present), and gives no prerequisites (e.g., browser must be open). While the tool is simple, the description leaves essential operational details 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 0%, so the description must compensate. It explains the `direction` parameter ('down' or 'up') but says nothing about `amount`. Since `amount` has a default and no enum, its meaning (pixels, lines, or steps) is left entirely ambiguous. The description adds value only for direction, leaving half the parameters unexplained.
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 clear verb and resource: 'Scroll the viewport.' It unambiguously identifies the tool's function and distinguishes it from all sibling tools, none of which perform scrolling. The mention of direction further clarifies the 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 description gives no guidance on when to use this tool versus alternatives, nor any context such as 'use after opening a page' or 'for long pages'. Since no sibling tool offers scrolling, the usage is implied but not explicitly articulated. There are no exclusions or alternative routing provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_stateA
List the current page's form fields, buttons and tabs.
Every field carries a ref string. Pass that same ref back to
fill_field / select_option / click_target; do not construct your
own CSS selector, because the references are already chosen to survive
the site's generated markup.
Fields with required: true must be filled before submitting.
field_type tells you which action to use:
text/email/tel/number/textarea/contenteditable -> fill_field
select/combobox/listbox -> select_option
radio/checkbox -> set_checkbox
file -> upload_file
| Name | Required | Description | Default |
|---|---|---|---|
| include_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that refs are stable across generated markup, that required fields must be filled before submission, and that field_type determines the proper action tool. It does not explicitly state that the tool has no side effects, but the read-only verb 'List' and the overall inspection role make that sufficiently clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core action and resource. Every section earns its place: the ref usage rule, required-field warning, and field_type mapping are all necessary and presented with clean formatting. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a form-state inspection tool, the description covers the essential operational context: what is listed, how refs work, required-field behavior, and which action tool to call for each field_type. An output schema exists, so return-value details are not needed. The only notable completeness gap is the unexplained include_text parameter, but that is already penalized under parameter semantics.
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 only parameter, include_text, is not mentioned anywhere in the description, and schema description coverage is 0%. The schema only provides the title 'Include Text' and a default, which is too sparse for an AI agent to know what the parameter controls. The description must compensate for the missing parameter documentation and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the current page's form fields, buttons and tabs.' It clearly states what the tool produces and is not easily confused with sibling action tools like fill_field or click_target, which it explicitly references as downstream consumers of its output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains exactly how to use the returned data: pass the provided ref back to fill_field, select_option, or click_target, and use field_type to decide which action to take. It gives clear guidance, though it does not explicitly say when not to use this tool or name alternatives for list-only tabs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_switch_tabB
Make another tab the active one, by index from browser_tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action but does not disclose side effects, such as whether the current tab's state is preserved, whether the switch is immediate, or any potential errors (e.g., invalid index). This is a significant gap for a tool that changes browser state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the action and resource, then specifies the parameter source. Every word earns its place, and it is appropriately sized for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and an output schema, so the description is mostly adequate. However, the lack of behavioral details (e.g., error handling, index base) and no annotations mean an agent might not know how to handle edge cases. The reference to `browser_tabs` helps, but the description could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does explain that `index` refers to the tab index from `browser_tabs`, which adds meaning beyond the bare schema. However, it does not specify the index base (0-based vs 1-based) or what happens if the index is out of range, leaving some ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Make another tab the active one') and the resource (browser tab), with a specific mechanism (by index from `browser_tabs`). It distinguishes itself from sibling tools like browser_open and browser_tabs by focusing on switching among existing tabs rather than opening or listing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this when you need to change the active tab, and it references `browser_tabs` as the source for the index. However, it does not explicitly state when not to use it or mention alternatives like browser_open for creating a new tab, leaving some room for inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tabsA
List open tabs. A click may open a second tab (employer ATS sites).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the behavioral transparency burden. It adds a useful non-obvious behavior—clicks may open a second tab on employer ATS sites—but it does not describe how open tabs are represented or whether the active tab is indicated. The output schema may cover return details, but the description itself adds only limited behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The primary action is front-loaded, and the second sentence adds a practical caveat about ATS sites without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument listing tool with an output schema, the description covers the essential action and a relevant edge case. It is nearly complete, though the timing of when to call it relative to other browser tools is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so parameter semantics are trivially satisfied. The baseline of 4 for a zero-parameter tool applies, and no additional parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('open tabs'), making the tool's core function immediately understandable. It is distinct from sibling tools like browser_switch_tab or browser_open, though it does not explicitly differentiate itself by naming an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives such as browser_state or browser_switch_tab. The ATS note hints that it may be useful after a click, but the description leaves the usage context largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_already_appliedB
Whether this posting was already applied to.
Matched on the job id, so the same posting reached through a different tracking link is still recognised.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | ||
| job_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that matching is on job id, so the same posting via different tracking links is recognized – a useful detail. However, it does not state whether the tool is read-only, what it returns, or any edge cases (e.g., behavior when job_id is omitted). It gives one nuance but lacks comprehensive transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with zero fluff. The primary purpose is front-loaded, and the additional behavioral note is concise. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple check tool with an output schema (per context), the description is adequate but not complete. It explains the matching logic but omits details about return format, required vs optional parameters, and any preconditions. Since annotations are absent, more context would be expected, but the description covers the core functionality sufficiently for a straightforward 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 0%, so the description must compensate, but it only mentions job id in a behavioral context without explaining the parameters. It does not clarify that job_url is required and job_id is optional, nor does it explain the role of each. The hint that matching is on job id is helpful, but it leaves the parameters largely undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: checking whether a posting was already applied to. It adds a behavioral nuance about matching on job id, which distinguishes it from URL-based matching. However, it does not explicitly differentiate from the sibling application_history, which might serve a similar role, so it doesn't fully separate itself from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (check applied status) but does not explicitly state when to use this tool versus alternatives like application_history. It offers no conditions, prerequisites, or exclusions. The mention of matching on job id hints at a use case, but there is no direct guidance on when to prefer this over other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
click_targetA
Click a button or link, by visible/accessible name or by ref.
If the click opens a new tab, this follows it automatically and reports
new_tab: true -- "Apply on company site" leads to the employer's own
ATS in a new tab, and continuing to drive the old tab would lose the
application entirely.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| name | No | ||
| role | No | ||
| reason | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It openly describes the automatic new-tab following and the new_tab: true report, which is a critical and non-obvious behavior. It does not cover failure behavior or broader side effects, but the key quirk is transparently disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and locator methods, then adds one high-value behavioral note with a concrete scenario. Every sentence earns its place, and there is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for normal use: it explains what is clicked, how to target it, and an important tab-following behavior. However, the undefined 'role' and 'reason' parameters, plus the lack of guidance around when to use submit_application instead of a generic click, leave the context incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It explains 'name' and 'ref', but completely ignores 'role' and 'reason', leaving two of the four parameters semantically unexplained. This is a meaningful gap for a tool with no schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Click') and resource ('a button or link'), and names the two locator modes ('visible/accessible name' or 'ref'). This clearly distinguishes it from sibling tools like fill_field, browser_scroll, or submit_application.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: clicking interactive elements by name or reference. It also explains the tab-following behavior with a concrete ATS example, though it does not explicitly state when not to use it or name alternatives like submit_application.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_jobsA
Search LinkedIn for postings, newest first.
Use this when the user wants jobs found rather than handed a link. Defaults to Easy Apply only, because that is the route this server can actually finish; "Apply on company site" hands off to an ATS whose form we have never seen.
Returns the postings plus the exact search_url used, so a surprising
result can be traced back to the query that produced it.
This applies to nothing. It only lists. Take a job_id or url from
the result and run the normal preflight -> apply flow on it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| keywords | Yes | ||
| location | No | ||
| recent_days | No | ||
| easy_apply_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well. It discloses the Easy Apply-only limitation and the reason ('Apply on company site' hands off to an ATS whose form we have never seen), explicitly says the tool applies to nothing, and explains that the exact `search_url` is returned for traceability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, starting with the core action and following with usage, behavioral limitations, and downstream flow. Every sentence adds either purpose, a constraint, or routing guidance; there is minimal fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, behavior, limitations, return traceability, and the correct downstream flow, and an output schema exists for result details. It is only slightly incomplete in not defining the less obvious parameters such as `recent_days` and `location`, though their defaults and names mitigate the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to compensate by explaining the parameters. It only adds meaningful context to `easy_apply_only` via the default rationale; `keywords`, `location`, `limit`, and especially `recent_days` are left to be inferred from their names and types 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 description opens with a specific verb-resource pair: 'Search LinkedIn for postings, newest first.' It then distinguishes itself from sibling tools by explicitly saying it only lists results and does not apply, which makes its role clear without needing to inspect other schemas.
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 gives an explicit trigger: 'Use this when the user wants jobs *found* rather than handed a link.' It also states a clear exclusion ('This applies to nothing. It only lists.') and directs the agent to run the `preflight` -> apply flow on a returned job_id or url, so the downstream action is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_fieldA
Type a value into a text-like field.
ref comes from browser_state. role names what the field is for
(for example "phone", "first_name") and reason explains why this value
is correct; both are recorded so the same field is faster to fill next
time. There is no version of this tool without them, on purpose.
The value is typed character by character and then read back. If the read-back disagrees with what was typed, the tool reports a mismatch instead of pretending to have succeeded.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| role | Yes | ||
| value | Yes | ||
| reason | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does well: it discloses that the value is typed character by character, read back, and that mismatches are reported instead of silently succeeding. It also reveals that role and reason are recorded for future speed, providing valuable behavioral insight beyond the simple action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: a one-sentence purpose is followed by parameter semantics and then behavioral detail. The 'no version without them' sentence is slightly emphatic but useful in preventing agents from omitting required fields. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values are covered elsewhere. The description covers what the tool does, when to use it, parameter meanings, recording behavior, and verification behavior. The only minor gap is not defining precisely what counts as a 'text-like field', but this is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it explains three of the four parameters: ref comes from browser_state, role names the field's purpose, and reason justifies the value. The value parameter is self-evident from the tool name and action. This is solid compensation for the schema gap, though value formatting details are not addressed.
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 'Type a value into a text-like field' states a specific verb and resource, making the tool's function immediately clear. It distinguishes itself from siblings like select_option, set_checkbox, and upload_file by targeting text-like fields specifically, and the role examples ('phone', 'first_name') reinforce the intended use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states this tool is for text-like fields, which gives an agent clear context for when to use it. It does not explicitly name alternatives or state when not to use it, but the text-like field qualifier is sufficient guidance for most selection scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flywheel_statsB
Whether the memory is actually compounding.
Watch automation_rate (share of questions answered without asking) and
selectors_suggested. A selectors_suggested of 0 after real runs means
nothing is being recorded, and the memory is not learning.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Because no annotations are provided, the description carries the full burden of behavioral disclosure. It does provide meaningful interpretation of the metrics and a failure signal. However, it never explicitly states that this is a read-only stat retrieval, whether values are computed live, or what effect if any the call has, leaving some assumptions implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loads the core question of whether memory is compounding. The metric names and their interpretation are packed into two focused sentences, though the opening fragment is slightly ungrammatical.
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 parameterless stats tool with an output schema, the description covers the essential interpretation and a key failure mode. It does not explicitly describe when or how often to invoke the tool, or state that it is a read-only operation, but the overall picture is adequate for a simple stats check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema already fully covers parameter semantics. The description adds value by explaining what the metrics mean and how to judge them, which is beyond what an empty parameter schema could provide.
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 identifies the tool as a check on whether the memory flywheel is compounding surroundly, and pinpoints the key metrics to inspect. It lacks an explicit verb such as 'returns' or 'reports', but the intent is clear and it is not confused with siblings like record_answer or get_selector_hints.
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 explicit when-to-use guidance or mention of alternative tools. The interpretation that a `selectors_suggested` of 0 after real runs indicates a logging problem implies a monitoring use case, but it does not tell the agent when to call this tool versus related diagnostics like setup_status or guard_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_answerA
Look up a previously learned answer to an application question.
Call this for every question on a form before deciding to ask the user. When it answers, use the value as-is -- it is a stored fact, and paraphrasing it risks putting a wrong answer on a real application.
status meanings:
"answered" -- confident match; use
answerdirectly"suggestion" -- plausible but not yet proven; confirm with the user
"need_human" -- nothing usable stored; ask the user, then call
record_answerso the next run does not have to
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It thoroughly discloses the behavioral outcomes of each status (answered, suggestion, need_human) and warns against paraphrasing, giving a complete picture of what the tool does and its implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with a clear purpose, then a usage directive, and a bulleted list of status meanings. Every sentence contributes to the agent's understanding without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter) and the presence of an output schema (not shown but implied), the description covers all necessary aspects: what it does, when to use it, how to interpret results, and subsequent actions. It is complete for an agent to use 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 0%, so the description must compensate. It clarifies that the 'question' parameter is the application question to look up, but doesn't provide examples or format details. Still, for a single simple string parameter, this is adequate and adds meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'look up' and the resource 'previously learned answer to an application question'. It distinguishes itself from siblings like 'record_answer' (which stores) by implying a retrieval action, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this tool for every question before asking the user, and details the conditional actions for each status. It also indirectly routes to 'record_answer' when needed, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileA
The candidate's stored facts (name, email, phone, resume path, ...).
Treat these as authoritative for form fields, and use them verbatim --
do not reformat a phone number or round a salary. If a field an
application needs is not here, call setup_status to get the question
and ask the user; never infer an answer.
The values come from a markdown file the user may have edited by hand, so they are exactly what the user intends, not a normalized copy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden of behavioral disclosure. It explains that the values come from a user-editable markdown file, may not be normalized, and should be treated as exactly what the user intends. This gives important context about data provenance and reliability beyond the tool's name and schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states what the tool returns, the second gives verbatim-use and fallback instructions, and the third explains why the data is authoritative. The most important guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema available, the description covers everything an agent needs: what the data is, how to treat it, and what to do when a needed field is absent. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific semantics because none exist, which is appropriate. It focuses on behavior and usage instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('candidate's stored facts') and the purpose of the tool: retrieving authoritative form-field values. It also differentiates from the sibling `setup_status` by explaining that missing fields should be handled elsewhere, giving an agent clear resolution.
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 explicitly tells the agent when to rely on this tool (authoritative for form fields), how to use the data (verbatim, no reformatting), and when not to infer values (call `setup_status` and ask the user instead). This is precise, actionable guidance with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_selector_hintsA
Known-good element references for a platform, best first.
These are learned from real runs. Feed them back through browser_state
refs where possible; the raw values are also useful when a form renders
differently than expected.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It adds non-obvious context: the references are 'learned from real runs,' are ranked best-first, and have two distinct consumption modes (refs vs. raw values). It does not cover failure modes or edge cases, but for a simple lookup tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs with no wasted words. The first sentence front-loads the primary purpose and ordering; the second adds provenance and practical usage nuance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, one-parameter lookup with an output schema, the description is mostly adequate: it explains what the tool returns, how results are ordered, and how to use them. The notable gaps are the undefined `platform` value space and the lack of explicit when-to-use guidance relative to sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for the undocumented `platform` parameter. It only says 'for a platform,' without specifying accepted values, format, or where the platform identifier comes from. This leaves the agent under-specified on the tool's only required input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns 'Known-good element references for a platform' and that they are ordered 'best first.' This is specific about the resource and outcome, but it does not explicitly distinguish the tool from sibling browser-interaction tools, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful consumption guidance: feed refs back through `browser_state` where possible, and use raw values when a form renders differently than expected. However, it never explicitly says when to call this tool over alternatives or when not to use it, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guard_statusA
Current safety state: remaining quota today, failures, halted or not.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It implies a read-only status check by describing the current safety state, but it never explicitly states that calling it has no side effects or whether any prerequisites exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the core concept and lists the relevant status fields. There is no wasted wording or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and an output schema exists, the one-line description is functionally sufficient for invoking it correctly. The main gap is the absence of usage context or an explicit read-only guarantee, especially since no annotations are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema description coverage is 100%, so there are no parameter semantics for the description to clarify. The baseline of 4 applies because no parameter documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as the current safety state and specifies the data it exposes: remaining quota today, failures, and whether halted. However, it lacks an explicit verb like 'returns' or 'reports' and does not differentiate itself from sibling status tools such as setup_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call guard_status versus alternatives like preflight, setup_status, or reset_halt. The description does not mention whether this should be checked before operations, after failures, or as a general health check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Check that the ApplyOps server is reachable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states the action but does not disclose whether the operation is read-only, has side effects, or what happens on unreachability (e.g., error vs. boolean). For a simple ping, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no waste. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, no parameters, and the presence of an output schema (not shown but indicated), the description fully covers what an agent needs to invoke it correctly. Nothing essential 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 takes zero parameters, and the schema coverage is 100% (empty schema). The description adds no parameter information, but none is needed; baseline for zero params is 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?
The description states a specific verb ('Check') and a clear resource ('ApplyOps server reachable'), which is distinct from all sibling tools. It unambiguously tells the agent what this tool does.
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 purpose implies usage as a health check, but there is no explicit when-to-use guidance or mention of alternatives. Given there are no sibling health-check tools, the context is clear, though it could state prerequisites or typical invocation time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preflightA
Ask permission before starting an application. Call this first.
Checks the daily cap, the minimum spacing between applications, whether this posting was already applied to, and whether a previous run tripped the failure breaker.
If allowed is false, do not proceed -- the reason says why. If
wait_seconds is greater than zero this call has already waited, so the
pacing is enforced rather than merely suggested.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | ||
| job_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that the tool may wait ('this call has already waited'), enforces pacing, checks the daily cap and failure breaker, and that 'allowed' false means the caller must not proceed. This is meaningful behavioral transparency beyond a simple read/write classification.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most important instruction ('Call this first') and is dense with relevant behavioral details. It is slightly verbose with the bullet-like checklist, but every sentence contributes to correct usage. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, how to interpret its outcome, and the critical waiting behavior. Since an output schema exists, return-value explanation is not needed. The only notable gap is parameter semantics, which prevents a 5, but the overall flow context is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain either parameter beyond the schema's names. It implies that the posting is identified via the job, but it does not clarify the role of 'job_id' vs 'job_url', why one is required, or how they relate. The description does not compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Ask permission before starting an application. Call this first.' It names a specific verb ('ask permission'), the resource (application), and the specific checks performed. This distinguishes it from siblings like 'check_already_applied' and 'guard_status' by framing it as the first-step gate before the application flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage directive: 'Call this first' before starting an application. It explains what the tool checks and what to do when 'allowed' is false, but it does not name alternative tools or explicitly state when not to use it. This is clear context without formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_answerC
Store a user-supplied answer so future applications reuse it.
Call this immediately after the user answers something, including the exact wording of the question as the form asked it.
| Name | Required | Description | Default |
|---|---|---|---|
| answer | Yes | ||
| context | No | ||
| question | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'store' implying a mutation, but does not describe side effects, idempotency, whether it overwrites previous answers, or the return value. An agent cannot anticipate the tool's behavior beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at two sentences, with the core purpose front-loaded and the usage guideline in the second sentence. There is no wasted text, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (not shown here), the description omits important context: what happens after storing, potential errors, and any prerequisites. Given the absence of annotations and the 0% schema coverage, the description is not complete enough for an agent to fully understand the tool's behavior and edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions including 'exact wording of the question' which gives some guidance for the 'question' parameter, but it does not explain the 'answer' or 'context' parameters at all. The context parameter has a default but its purpose is unexplained. This is insufficient compensation for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool stores a user-supplied answer for future reuse, with a specific verb and resource. It also gives a concrete trigger ('immediately after the user answers something'). However, it does not explicitly differentiate from sibling tools like record_vision_fallback, which could also record user-provided data, so it's not a full 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 provides a clear condition for when to call the tool (immediately after the user answers), which is helpful. But it does not mention any alternatives or when not to use it, leaving the agent to infer that this is the primary recording tool. This is adequate but not explicit about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_vision_fallbackA
Record that the DOM locator failed and vision had to resolve a field.
This is an adapter gap report, not bookkeeping: each entry names a field
the platform adapter cannot address, which is exactly the rule that is
missing. See flywheel_stats().adapter_gaps for the ranking.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | ||
| succeeded | No | ||
| field_label | Yes | ||
| dom_attempts | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the burden. It discloses that each entry represents an adapter gap and that this is a report rather than bookkeeping, which is meaningful behavioral context. However, it does not explain whether records accumulate, whether repeated calls create duplicates, or what side effects occur besides recording.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence front-loads the action and trigger; the second adds useful semantic framing and a cross-reference to flywheel_stats. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The conceptual purpose is clearly explained and an output schema exists, but the lack of parameter documentation and the absence of annotations leave gaps for an agent trying to call this correctly. It is adequate for a simple reporter but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only indirectly references field_label as 'a field.' platform, succeeded, and dom_attempts are left undocumented; an agent must infer their meaning from names and default values.
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: 'Record that the DOM locator failed and vision had to resolve a field.' It further clarifies the purpose as an 'adapter gap report, not bookkeeping,' which distinguishes it from generic logging or bookkeeping tools and from siblings like record_answer or report_failure.
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 first sentence gives the exact triggering condition for use: DOM locator failure followed by vision resolving the field. The 'not bookkeeping' note and pointer to flywheel_stats().adapter_gaps help frame interpretation, though it does not explicitly name alternative tools or provide when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_failureA
Report that the current application attempt failed.
Consecutive failures trip the breaker and stop the run. That is deliberate: a run that keeps failing is usually failing for one systemic reason, and continuing multiplies the damage instead of the results.
If the attempt died at a recognisable step, pass platform, route and
blocked_at (a short description of that step). The failure is then
filed against the route instead of merely counted, which is what turns
"this kind of application is hard" into an adapter worth writing.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| route | No | ||
| platform | No | ||
| blocked_at | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It transparently states that consecutive failures trip the breaker and stop the run, a side effect. It also explains that filing against a route is more valuable than just counting failures. This goes beyond the basic action and discloses consequences, though it does not mention other potential side effects like logging or state changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it starts with the core action, then explains rationale (breaker behavior), then parameter guidance. It is slightly verbose but every sentence adds value. The structure is front-loaded with the purpose, and the rationale is relevant for decision-making.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides sufficient context for an agent to call the tool correctly: it covers when to use it, what parameters do, and consequences. The note parameter is not explained, but an output schema exists, so return values are covered. For a tool with no annotations, this is quite complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains the purpose of platform, route, and blocked_at (filing the failure against a route) and implies note is optional context. It adds meaning beyond the schema by describing how these parameters affect behavior, but note is not explicitly described, leaving a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Report that the current application attempt failed.' This is a specific verb (report) and resource (failure), and it distinguishes itself from siblings by focusing on reporting failure rather than recording answers or checking status. The context of application attempts makes it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (when an attempt fails) and provides conditional guidance: 'If the attempt died at a recognisable step, pass platform, route and blocked_at.' It also explains the consequence of consecutive failures (breaker trips), which implies repeated use is discouraged. However, it does not explicitly contrast with alternatives or state when not to use it beyond the breaker effect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_submit_confirmationA
Request approval before submitting, and get a one-time token.
summary must list the fields and the exact values that will be sent,
and call out anything the tool filled by itself. If the user has not
seen a value, they are approving something they cannot see.
Show the returned summary_to_show to the user and get an explicit yes.
Then call submit_application with confirmation_id and
acknowledged: true. The token is single-use and expires, so a stale
approval cannot be replayed onto a different job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | ||
| job_url | Yes | ||
| summary | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the token's single-use and expiry, the requirement that `summary` list exact values, and that the tool may fill fields itself. It also implies the return includes `summary_to_show` and `confirmation_id`. This is above-average transparency, though it doesn't cover error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with zero fluff. It opens with the purpose, then details the `summary` constraint, then the workflow and token characteristics. Every sentence adds necessary information, and the structure is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the purpose, workflow, and critical constraints, and references the next step (`submit_application`). It doesn't explain `job_url`, but that is likely self-evident and required by the schema. An output schema exists, so the description need not detail the return format. It is complete enough for correct use, though it omits prerequisites like having a job URL.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It thoroughly explains `summary` (must list fields and exact values, and call out tool-filled values). However, it does not explain `job_id` or `job_url` at all. Since `job_url` is required, this is a significant gap, though partial compensation for one parameter exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Request approval before submitting, and get a one-time token.' It names a specific verb, resource, and outcome, and naturally distinguishes itself from the sibling `submit_application` which performs the actual submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit workflow guidance: show the summary, get explicit yes, then call `submit_application` with the token. It also warns about token single-use and expiry, which informs when to use this tool. It doesn't explicitly list alternatives, but the sequence is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_haltA
Clear a tripped failure breaker so a run may resume.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It indicates a state-changing action ('clear') but does not mention potential side effects, whether the operation is idempotent, permissions required, or any safety implications. For a mutating tool, this is a significant 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?
The description is a single, compact sentence that front-loads the action and immediately gives the purpose. Every word earns its place; there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters) and the presence of an output schema, the description provides sufficient context for an agent to understand the core action and intent. It lacks explicit usage boundaries, but these are more relevant to the usage dimension than to overall completeness for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema coverage is trivially 100%. The description adds no parameter details, but none are needed; a baseline of 4 is appropriate for parameterless tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('clear a tripped failure breaker') and a clear purpose ('so a run may resume'). It is immediately distinguishable from all sibling tools, which focus on browsing, filling, and application submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a failure breaker has tripped and a run is halted, but it does not explicitly state when to use it versus alternatives, nor does it mention any exclusions or prerequisites. The context is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
route_guideA
What kind of application this job is, and what it will take.
Call this before browser_open. There is more than one way to
apply, and the differences are structural: a LinkedIn Easy Apply lives
entirely in a modal on the posting, while an "external" posting hands
the browser to the employer's own account system, where a sign-in --
often an emailed one-time code -- stands before the first field.
Any step carrying human_required: true cannot be completed by the
machine. Ask the user for those up front, in the same message as the
profile questions, rather than walking into the gate and stopping there.
runs / success_rate / hardest_gate are what this route has
actually done here before. A route with runs: 0 is a shape we know
about but have never driven -- read its steps as a map, not as evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| job_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the output semantics (steps, human_required, runs, success_rate, hardest_gate), warns that runs: 0 means untested, and distinguishes machine-completable steps from human-required gates. This is strong context, though it does not mention side effects or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every section earns its place: purpose, ordering, human interaction guidance, and data interpretation. It is structured clearly and front-loads the most important ordering constraint.
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 single parameter and the presence of an output schema, the description covers the key operational context: when to call it, how to treat human_required steps, and how to interpret historical route stats. It is complete enough for an agent to invoke the tool sensibly, though it omits any mention of failure or fallback 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 0% and the description never explains job_url or how it should be supplied. The parameter is self-descriptive by name, but the description adds no meaning beyond the schema's existing 'Job Url' label.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly frames the tool as a route guide for a job application, explaining that it reveals what kind of application the job is and what the process will require. It differentiates the tool from browser actions by explicitly ordering it before browser_open, though it could state more directly that it returns a structured route plan.
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 gives an explicit usage instruction: call this before browser_open. It also tells the agent to surface human_required steps to the user up front and how to interpret low-run routes, which is practical guidance beyond just naming the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_profileA
Store setup answers in the user's profile file.
answers maps field keys to values. Booleans accept yes/no, numbers are
read leniently ("150k", "$150,000" and "150000" all mean 150000), paths
are expanded to absolute. Empty values clear a field.
Check warnings in the reply: anything listed there was rejected and is
not stored, so it must be re-asked rather than assumed. unknown_keys
lists keys that are stored but not part of the spec, which usually means
a typo in a key name.
| Name | Required | Description | Default |
|---|---|---|---|
| answers | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses several important behaviors: lenient number coercion, path expansion, empty values clearing a field, and the warnings/unknown_keys semantics. It could additionally clarify whether the profile is merged or replaced, but the disclosed traits are substantive and clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description leads with a one-sentence purpose, then uses compact paragraphs for value parsing and response semantics. Each section earns its place and is not overly verbose for a parameter with meaningful edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter nested-object tool with an output schema, the description covers the essential value-coercion rules and the warning/unknown_keys response contract. It is operationally sufficient for correct invocation, though selection guidance relative to update_profile is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the only parameter is an opaque answers object with additionalProperties. The description compensates well by explaining how values map to field keys, accepted boolean forms, number coercion, path resolution, and clearing behavior, though it does not enumerate valid keys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Store setup answers in the user's profile file,' which identifies a clear action and resource. It is specific enough to indicate a write operation for setup data, but it does not explicitly distinguish this from siblings like update_profile or record_answer.
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 explicit guidance on when to use save_profile versus update_profile or record_answer. The description implies it is for setup answers but gives no decision rules, exclusions, or alternatives, leaving the agent to infer the appropriate scenario from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_optionB
Choose an option in a dropdown.
Handles both a real <select> and a custom control that opens a popup,
so the same call works on LinkedIn and on Workday-style forms.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| role | Yes | ||
| value | Yes | ||
| reason | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a meaningful behavior: it handles both a real <select> and a custom popup-based control. Yet it omits side effects, interaction details, and failure behavior, so transparency is only 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?
Two short sentences with the core action front-loaded and the compatibility nuance added immediately after. Every word earns its place; no unnecessary detail or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four required undocumented parameters and no annotations, two sentences are insufficient. The dual-format handling is helpful, but the agent still lacks parameter semantics, usage boundaries, and behavioral details needed to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description gives no explanation of the required parameters ref, value, role, or reason. With four required parameters and no schema-level documentation, the description must compensate but does not.
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: 'Choose an option in a dropdown.' The compatibility note about native and custom controls clarifies scope, but it does not explicitly distinguish itself from sibling tools like fill_field or click_target, so differentiation is implicit rather than named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: for dropdowns, including custom controls that open a popup, with examples like LinkedIn and Workday. However, it does not state when not to use it or mention alternatives, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_checkboxC
Check or uncheck a checkbox or radio button.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| role | Yes | ||
| reason | Yes | ||
| checked | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It states the core state change but does not disclose side effects, whether it simulates user interaction, how radio-group semantics are handled, or what happens when unchecking a radio button. This is a significant gap for a mutating UI 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?
The description is a single, front-loaded sentence with no unnecessary words. It efficiently conveys the primary action and target element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four required parameters and no annotations, the description is too sparse. It does not explain parameter semantics, clarify usage against sibling tools, or cover important behavioral details like radio grouping, making it incomplete for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the four required parameters (ref, checked, role, reason). The agent is left to guess what each field means, especially role and reason, which are not self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's operation: checking or unchecking a checkbox or radio button. It is specific about the resource type, which helps distinguish it from fill_field, select_option, and click_target, though it does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus click_target or other interaction tools. The description gives no context about prerequisites, radio-group behavior, or scenarios where this tool should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_statusA
Whether the user's profile is complete, and the questions to ask.
Call this before the first application and any time get_profile
reports missing fields. If ready is false, ask the user the questions
in questionnaire -- all of them in a single message, not one at a
time -- then hand the answers back through save_profile.
Every field carries its current value, so a second run only needs to ask about what is still blank. Fields already answered are never re-asked; that is the whole point of the profile being a file.
Prefer save_profile over update_profile for this: it writes the whole
set at once and reports validation problems together.
| Name | Required | Description | Default |
|---|---|---|---|
| include_optional | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that fields carry current values, only blank fields are re-asked, and previously answered fields are never re-asked. It also explains the single-message requirement. While it doesn't explicitly state the tool is read-only, the wording implies it only checks status and returns data. A minor gap is not mentioning error handling or edge cases, but overall it is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loaded with purpose, then usage, then behavior. Each sentence adds value, and the guidance is clear. It is slightly verbose but not excessive; the length is justified by the need to convey usage and behavioral nuances.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main workflow and output semantics (ready, questionnaire), and an output schema exists. However, it fails to document the only input parameter (include_optional), which is a significant omission. The description also doesn't address what happens when ready is true beyond implying no questions are needed. Overall it's adequate for the core flow but incomplete due to the parameter gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions the include_optional parameter. The agent is left with no information about what this parameter controls or how to use it. With zero schema documentation, the description should compensate, but it doesn't, making this a critical deficiency.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports profile completeness and provides a questionnaire. It distinguishes itself from siblings like get_profile by specifying when to use it (before first application or when get_profile reports missing fields). The purpose is specific and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: call before the first application and any time get_profile reports missing fields. It also instructs how to handle the questionnaire (ask all at once, hand answers via save_profile) and recommends save_profile over update_profile. This is a model of usage clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_applicationA
Record a submitted application. Call this only after clicking Submit.
Requires a confirmation_id from request_submit_confirmation. Without
a valid, unused token this refuses -- the check is what makes "confirm
before submitting" real rather than advisory.
When the client could not prompt the user directly, pass
acknowledged: true only after you have shown the user the summary and
they explicitly approved.
| Name | Required | Description | Default |
|---|---|---|---|
| ats | No | ||
| steps | No | ||
| job_id | No | ||
| company | No | ||
| job_url | Yes | ||
| platform | No | ||
| job_title | No | ||
| apply_route | No | easy_apply | |
| acknowledged | No | ||
| answers_used | No | ||
| confirmation_id | Yes | ||
| vision_fallbacks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It discloses that the tool refuses without a valid, unused token, and explains the purpose of the check ('confirm before submitting real rather than advisory'). It also clarifies the only condition under which `acknowledged: true` is permissible. It doesn't fully state side effects, but no annotations exist and nothing contradicts the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tight sentences with the core directive front-loaded. Every sentence earns its place, and there is no filler or repetition of schema field names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 parameters, high-stakes submission flow, no annotations), the description covers the critical preconditions, the acknowledgment rule, and the refusal behavior. An output schema exists, so return values need not be explained. The remaining gap is that several optional parameters are undocumented, but the essential calling context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds real meaning to `confirmation_id` and `acknowledged`, which are the most safety-critical parameters. However, schema description coverage is 0% for 12 parameters, and the other 10 parameters (e.g., `job_url`, `steps`, `answers_used`, `vision_fallbacks`) receive no explanation. This partially compensates for the schema gap but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Record a submitted application,' giving a clear verb and resource. It also distinguishes itself from the pre-submission step by requiring a `confirmation_id` from `request_submit_confirmation`, so an agent can tell this tool apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call: 'Call this only after clicking Submit.' It also gives precise preconditions for the `confirmation_id` and for `acknowledged: true`, including the requirement that the user explicitly approved a shown summary. This is unusually concrete guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profileA
Change one or a few known profile fields mid-run.
For example after asking a single follow-up question. For initial setup
prefer save_profile, which reports all validation problems at once.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It adds useful context about the operation being a mid-run incremental change to known fields and implies a difference from save_profile's validation behavior, but it does not state whether unmentioned fields are preserved, what failure modes exist, or whether changes are persisted. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The action is front-loaded, followed by a concrete example scenario and a clear pointer to the sibling alternative. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter mutating tool with an output schema, the description covers the key selection and invocation context: when to call it, what it changes, and which alternative to prefer. It does not list valid profile fields or detail validation side effects, but those gaps are minor given the output schema and sibling context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single 'fields' object with additionalProperties: true and no property descriptions, so schema coverage is 0%. The description adds that these are 'known profile fields' and that one or a few should be supplied, which gives useful meaning to the parameter. However, it does not enumerate or describe the possible field names or value types, leaving some ambiguity.
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: 'Change one or a few known profile fields mid-run.' It clearly scopes the operation to incremental, mid-run edits and explicitly distinguishes itself from save_profile by naming the alternative. An agent can tell what this tool does and how it differs from its main sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage direction: use it mid-run for a small follow-up change, and 'prefer save_profile' for initial setup because save_profile reports all validation problems at once. This directly tells the agent when to choose this tool versus the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileC
Attach a local file to a file input (typically a resume).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| role | Yes | ||
| reason | Yes | ||
| file_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden обращения. It states the action but does not disclose side effects, validation of file_path, whether the action is reversible, required page state, or what happens after the file is attached. This is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word is purposeful, and the resume hint is useful. It earns a high score for conciseness even though it lacks technical detail.
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 four required parameters, no annotations, and no descriptions in the schema, this one-sentence description is far from complete. The agent has no way to know the purpose of ref, role, or reason, or what counts as a valid file_path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the four required parameters. It only loosely rephrases file_path as a 'local file' and gives no meaning for ref, role, or reason. The agent cannot correctly construct the required arguments from this description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Attach') and identifies the resource ('a local file to a file input'), which is clear and distinct from generic form-filling siblings like fill_field. The parenthetical 'typically a resume' adds useful domain context. It does not explicitly contrast with sibling tools, but the file-input framing is specific enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. The 'typically a resume' remark only implies a job-application context. The agent is left to infer when attaching a file is the correct action.
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.
32 tool updates
v0.1.0- First observed
application_history - First observed
browser_close - First observed
browser_open - First observed
browser_screenshot - First observed
browser_scroll - First observed
browser_state - First observed
browser_switch_tab - First observed
browser_tabs - First observed
check_already_applied - First observed
click_target - First observed
discover_jobs - First observed
fill_field - First observed
flywheel_stats - First observed
get_answer - First observed
get_profile - First observed
get_selector_hints - First observed
guard_status - First observed
ping - First observed
preflight - First observed
record_answer - First observed
record_vision_fallback - First observed
report_failure - First observed
request_submit_confirmation - First observed
reset_halt - First observed
route_guide - First observed
save_profile - First observed
select_option - First observed
set_checkbox - First observed
setup_status - First observed
submit_application - First observed
update_profile - First observed
upload_file
TDQS
Scored across 32 tools
Most tools target distinct actions and resources, and the descriptions clearly separate browser primitives from memory/profile/safety operations. A few status and get/record tools (setup_status vs guard_status, get_answer vs get_profile, save_profile vs update_profile) could cause initial misselection, but their descriptions resolve the boundaries.
The majority of tools follow a verb_noun pattern (fill_field, get_answer, submit_application), but the browser tools invert this to noun_verb (browser_open, browser_state, browser_switch_tab). A few noun_noun names (application_history, flywheel_stats) and standalone verbs (ping, preflight) further break the pattern, though all names use lowercase snake_case consistently.
At 32 tools, this server exceeds the 25+ threshold where the set usually feels too heavy for an agent to navigate. While the broad job-automation domain justifies many browser, memory, and safety tools, the count is still high enough that an agent may struggle to select among tightly scoped primitives, and several browser tools could plausibly be consolidated.
The core application lifecycle is covered: discover jobs, plan the route, preflight, open the browser, inspect/fill forms, submit with confirmation, record outcomes, and manage profile/memory. Notable gaps exist though—there is no tool to read the visible page text or job posting content, only form fields and screenshots, and no way to delete or retire learned answers or stored selectors, which limits long-term memory management.
Maintenance
Related MCP Connectors
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
- openhelmOAuthai.openhelm
Autonomous cloud agent tasks: real browser + your tools, structured evidence-backed results.
Browser-based QA for AI-built software. Test pages with real browsers via agents.
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with web browsers using natural language, featuring automated browsing, form filling, vision-based element detection, and structured JSON responses for systematic browser control.62MIT
- FlicenseNot gradedqualityCmaintenanceAutomates cover letter generation and application question answering from job postings via local AI agents. Manages candidate profile and AI humanization rules to produce tailored, humanized application materials.-
- AlicenseNot gradedqualityBmaintenanceEnables an AI agent to work inside a resume workspace where it can search job postings and propose edits grounded in user-recorded facts, while the interface constrains its tools and requires human approval before any change or application is prepared.6 npmMIT
- FlicenseAqualityCmaintenanceEnables AI agents to automatically inspect and fill web application forms on job application sites through a logged-in Chrome, supporting text, select, radio, date, cascading dropdowns, and dynamic row operations.4-