ApplyOps
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pingA | Check that the ApplyOps server is reachable. |
| 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 This applies to nothing. It only lists. Take a |
| 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_stateA | List the current page's form fields, buttons and tabs. Every field carries a Fields with
|
| 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. |
| browser_tabsA | List open tabs. A click may open a second tab (employer ATS sites). |
| browser_switch_tabB | Make another tab the active one, by index from |
| browser_scrollC | Scroll the viewport. |
| fill_fieldA | Type a value into a text-like field.
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. |
| select_optionB | Choose an option in a dropdown. Handles both a real |
| set_checkboxC | Check or uncheck a checkbox or radio button. |
| upload_fileC | Attach a local file to a file input (typically a resume). |
| click_targetA | Click a button or link, by visible/accessible If the click opens a new tab, this follows it automatically and reports
|
| 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.
|
| 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. |
| get_selector_hintsA | Known-good element references for a platform, best first. These are learned from real runs. Feed them back through |
| route_guideA | What kind of application this job is, and what it will take. Call this before Any step carrying
|
| setup_statusA | Whether the user's profile is complete, and the questions to ask. Call this before the first application and any time 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_profileA | Store setup answers in the user's profile file.
Check |
| 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 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. |
| 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 |
| flywheel_statsB | Whether the memory is actually compounding. Watch |
| application_historyD | Past applications, newest first. |
| 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. |
| 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 |
| 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 |
| guard_statusA | Current safety state: remaining quota today, failures, halted or not. |
| request_submit_confirmationA | Request approval before submitting, and get a one-time token.
Show the returned |
| submit_applicationA | Record a submitted application. Call this only after clicking Submit. Requires a When the client could not prompt the user directly, pass
|
| 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 |
| reset_haltA | Clear a tripped failure breaker so a run may resume. |
| browser_closeA | Close the automation browser and release the profile. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.