Work Researcher MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WORK_RESEARCHER_PROFILE | No | Optional profile ID to use for this MCP server instance. Equivalent to the --profile CLI flag. Overrides the active_profile setting in config.toml. Profile IDs are limited to letters, numbers, _ and -. |
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 |
|---|---|
| manage_profilesA | List candidate profiles or switch the active candidate. |
| get_statusA | Health/config snapshot: active candidate, local CV directory, DB stats, providers, API keys and saved searches. Call first in a session. |
| search_jobsA | Run a UK job search OR page an earlier one. Fresh search: pass query ('Data Analyst'…) or profile ('data_analytics'/'field_geologist'). Paging: pass search_id (+offset from next_offset), preferably by copying the returned next_page object. Response sizing: pass context_window and auto selects compact (<=80k), balanced (80k-300k), or wide (>=300k). Local Qwen 3.8 27B uses context_window=78000. You may instead pass response_profile explicitly. Optional limit requests a page size within that profile's safety cap (8/20/50). With no sizing signal the default is balanced (12). All remaining results stay stored. Results are ranked, cross-board duplicates merged (sources[]), with memory flags (already_applied, application_status) and location intelligence (work_mode, distance_miles from the active profile's home, location_status ok|mismatch|caution|unknown). PAID TRAINING/COURSE ADS (where you pay them, e.g. Netcom-style 'trainee' course marketing) are excluded automatically — training_offers_skipped shows how many; set include_training=true only if the user explicitly wants courses. location_policy: 'auto' (default), 'uk_wide', 'commute_only'. work_from_home=true restricts to remote. |
| get_jobA | Details for selected jobs with adaptive batch sizing. Pass the same context_window/response_profile used for search_jobs. Compact returns up to 5 summaries or 2 full descriptions; balanced 12/5; wide 30/12. Request full descriptions only for plausible finalists. No job is deleted when a supplied job_ids list is truncated; request the remainder later. |
| manage_blocklistA | Employer/recruiter exclusion memory. When the user says 'never apply to ' → action=add, kind=company, value=, reason=. kind=keyword blocks any vacancy whose title/description contains it. action: add | remove | list. Blocked jobs are hidden from search results and start_application refuses them until removed. |
| fetch_job_descriptionA | Fetch FULL job descriptions by opening pages in the browser. Accepts 1-10 job_ids (BATCH - prefer batching to save round-trips). Use for jobs where the parser returned null/short descriptions (common on Totaljobs/Reed). Stores descriptions back and re-runs the requirements check against your CVs. Also detects closed vacancies ("no longer accepting applications"). |
| list_stored_jobsA | Search the LOCAL job database by criteria (no board calls). Use INSTEAD of Bash/sqlite: find all jobs from a company, filter by title keyword, location, source board, or freshness. Returns job_ids + titles + requirements status - then get_job / fetch_job_description for detail. |
| submit_job_observationsA | Feed jobs found via the harness's own browser (Indeed, CV-Library, LinkedIn, Glassdoor) into the same dedup + ranking store. Each observation: {source, url, title, company, location_text, salary_raw, description, posted_at?}. Returns stored count + duplicates merged. |
| list_cvsA | CVs indexed from the active profile's local folder. Pass job_id to get per-CV recommendation scores for that job. |
| sync_cvsA | Index CV files manually copied into the active profile's cv_dir. Unchanged files are skipped unless force=true. There is no cloud sync. |
| start_applicationA | Begin applying to a job. Returns the full plan: URL, apply method + site playbook, chosen CV (+alternatives), applicant profile values, step list, cautions (location mismatch, LinkedIn ToS…). REFUSES to create a second application for a job that already has one — that is the anti-double-apply memory (works across boards via dedup). |
| record_applicationA | Update an application: status planned|applying|submitted|interview| offer|rejected|withdrawn|failed; notes; evidence {screenshot: path,…}; cover_letter text. |
| list_applicationsB | Application history (job, company, status, dates) — the long-term memory of everything already applied to. |
| check_appliedA | 'Have we already applied here?' — by job_id, exact URL, or fuzzy title+company (catches the same vacancy re-found on another board). ALWAYS call before a manual browser application. |
| make_cover_letterA | Write a cover letter as a DOCX file into CV_collection and return its path — ready for browser_upload as a supporting file. Boards like Totaljobs reject files smaller than 8KB, so the document is padded through metadata if the text alone is too short. Prefer DOCX over PDF here (PDFs from minimal text are usually under the limit). |
| browser_loginA | Ensure we're signed in on a job board before applying. Opens the site; if signed out, walks 'Continue with Google' and picks the pre-approved account (active profile auth.google_account — the user allows this WITHOUT asking). Returns logged_in; needs_user=true on 2FA/ captcha/consent — then stop and ask the user to finish in the window. |
| browser_openA | Open a URL in the persistent application browser; returns the first snapshot. Logins survive between runs. Headed by default so the user can handle 2FA/captcha. |
| browser_snapshotA | Look at the page: numbered interactive elements + text. focus: 'inputs'|'buttons'|'links'; filter_text narrows by name (find 'Apply'); text_chars=0 → elements only, 6000 → reading mode. modal_only=true → ONLY the active dialog/wizard (question text + controls, hidden templates excluded) — use for apply wizards, then browser_set/click by number. |
| browser_formA | The dominant form with human labels per field (n, tag, type, label, required, options) + likely submit buttons. Use once per application page, then browser_set fields by number. |
| browser_clickA | Click element #n → returns the FRESH snapshot (popups become the active tab automatically). |
| browser_setA | Set element #n to a value — one verb for every control: inputs → fill; selects → pick option value; checkboxes/radios → true/false → returns fresh snapshot. |
| browser_typeA | Type into #n key-by-key (fires JS handlers); submit=true presses Enter → fresh snapshot. Use for search boxes and chat fields. |
| browser_uploadA | Click upload control #n and send a local file (the CV path from start_application) → fresh snapshot. |
| browser_pressA | Press a page-level key (Enter, Tab, Escape) → fresh snapshot. |
| browser_waitB | Wait for time / text to appear ('Application submitted') / text to disappear (spinners) → returns a snapshot. |
| browser_screenshotA | Save a PNG to data/screenshots — pass the path as evidence to record_application. |
| browser_evalA | Evaluate JS on the page (extract hidden JSON, scroll, dismiss cookie banners). |
| browser_tabsA | Tabs: list / select / close. Click-opened popups become active automatically — use this to switch back. |
| browser_closeA | Close the browser (the login profile persists on disk). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Andrem19/work-researcher-bot'
If you have feedback or need assistance with the MCP directory API, please join our Discord server