Your AI-powered job search companion
Profile Optimizer • Job Scout • Experience Bank • Resume Tailor • Recruiter Outreach
Audit and fix your LinkedIn profile, scout roles, tailor your resume, and reach recruiters — with a local dashboard to run it all.
Runs your skills via opencode or Claude Code over ACP
Installation · Dashboard · Skills · How it works
Mercury is a collection of AI agent skills that automate your LinkedIn job search end-to-end, plus a local dashboard to run and track it all. It works with any AI coding assistant that supports skill files (opencode, Cursor, Claude Code, Cline, …) paired with a LinkedIn MCP Server and Chrome MCP.
# install (or update) — downloads a prebuilt binary and installs the skills
# Bash / zsh:
curl -fsSL https://raw.githubusercontent.com/joaovjo/mercury/main/app/scripts/bootstrap.ts | bun run -
# PowerShell 7.x+:
irm https://raw.githubusercontent.com/joaovjo/mercury/main/app/scripts/bootstrap.ts | bun run -Re-run the same command any time to update. See Installation for prebuilt targets, env overrides, and the source-build fallback.
experience-bank (periodic, occasional)
│ read-only achievement pool
▼
profile-optimizer → job-scout → resume-tailor → recruiter-outreach
fix your find the tailor your reach the
profile roles resume recruiters
│
└──→ portal-filler
autofill the
ATS application
| Skill | What It Does |
|---|---|
| profile-optimizer | Audits your LinkedIn profile against recruiter-search signals and fixes gaps (Open to Work, headline, location, skills, languages, projects, About, experience) |
| job-scout | Searches LinkedIn Jobs by company/location/work-type, pulls full details, and presents a prioritized shortlist with fit assessment |
| experience-bank | "Grill me" — periodically interviews you about new achievements and stores them as a tagged, reusable pool in .mercury/experience/ that resume-tailor draws from. Run occasionally, not per application |
| resume-tailor | Takes your base resume + experience bank + scouted roles and produces role-tailored versions with gap analysis, ATS keyword alignment, and cover letters |
| recruiter-outreach | Finds technical recruiters at target companies, prioritizes by proximity/mutuals, and sends tailored connection requests |
| outreach-tracker | Runs the daily due-action queue (withdraw stale invites, draft follow-ups, detect replies via LinkedIn inbox, close unresponsive contacts) — all behind explicit user consent (never auto-sends) |
| portal-filler | Autofills an external ATS application form (Greenhouse / Lever / Ashby + generic) from your stored answers and tailored resume, then pauses for you to review and submit — it never submits for you |
See .github/assets/diagram.html for a visual of how the skills work together.
Mercury ships a local web dashboard — a central hub for your whole job search. Run one command and it opens in your browser:
mercury dashboardWhat it gives you:
- Overview — profile score, recruiters contacted/accepted/replied, interviews, jobs
- Profile — recruiter-search metrics charted over time (views, search appearances, connections)
- Search — instant LinkedIn job/people search (hybrid: raw results via the LinkedIn MCP)
- Launch — run any Mercury skill through your agent (opencode or Claude Code) over ACP, with a live agent activity stream
- Recruiters — kanban pipeline (pending → accepted → replied → interviewing → closed), with one-click Sync to detect accepted invites
- Outreach — lifecycle funnel (queued → invited → accepted → engaged), due-action queue (withdraw / follow-up / close), per-company blocked counts, and InMail credit budget
- Jobs / Applications / Interviews / Answers / Activity — everything tracked
Screenshots use synthetic demo data.
The dashboard is a single Bun-compiled binary with the UI embedded (React 19 +
Tailwind v4 + shadcn). It binds to 127.0.0.1 on a random port with a URL token,
stores everything in a local SQLite database at ~/.mercury/mercury.db, and
supports English and Brazilian Portuguese (selectable in the UI).
The mercury CLI is both the dashboard launcher and the write API the skills
call (mercury recruiter add, mercury job save, …) — one schema, one source of truth.
Mercury stores all job search state in ~/.mercury/ (override with MERCURY_HOME):
~/.mercury/
├── mercury.db # SQLite (WAL): recruiters, jobs, metrics, outreach, …
├── config.json # Provider + preferences (outreach thresholds, InMail budget, …)
├── dashboard.lock # {port, token, pid} of a running dashboard
├── update-check.json # Cached release-check result
├── base/
│ └── resume.typ # Your canonical base resume
├── experience/
│ ├── {slug}.md # One tagged achievement per entry (experience-bank)
│ └── index.md # Rollup for quick scanning
├── tailored/
│ ├── airbnb-4393940374.typ # Tailored per role (company-jobId)
│ ├── doordash-3969556398.typ
│ └── uber-4380982336.typ
├── cover-letters/
│ ├── airbnb-4393940374.md # Full cover letter per role
│ └── ...
├── reports/
│ ├── airbnb-4393940374.md # Gap/match analysis per role
│ └── ...
└── logs/
├── 2026-06-26T14:30:00.md # Run history, diffs, keyword scores
└── ...
Everything is tracked — you get full traceability of every tailoring run, outreach wave, and profile change.
- LinkedIn MCP Server — Profile reading, job search, people search, connection requests
- Chrome MCP — For profile edits that LinkedIn doesn't expose via API (browser automation)
Windows gotcha (LinkedIn MCP login): don't run the LinkedIn MCP login/setup (
bunx linkedin-mcp-server-ts@latest --login) from an Administrator/elevated terminal. It creates%USERPROFILE%\.linkedin-mcp\{profile,trace-runs}\with admin-only ACLs; your agent then runs the MCP at normal integrity, can't writetrace-runs\, and it crashes on startup (PermissionError: [WinError 5] Access is denied, shows as failed in/mcp). Run the login from a normal terminal. If you already hit it, fix the ACLs (preserves cookies/login — no re-login needed) from an elevated PowerShell:takeown /F "$env:USERPROFILE\.linkedin-mcp" /R /D Y icacls "$env:USERPROFILE\.linkedin-mcp" /reset /T /C /QThanks to @juanASP for confirming this on Win11.
Chrome MCP auto-starts a Chrome session on its first tool call — no manual
--remote-debugging-port launch flags required. Just make sure you're logged
into LinkedIn in that session.
Tip: For multi-step edit flows the skills use Chrome MCP's
pipelinetool (navigate → snapshot → click/fill in one call), which is faster and more reliable than individual round-trips.
# Bash / zsh:
curl -fsSL https://raw.githubusercontent.com/joaovjo/mercury/main/app/scripts/bootstrap.ts | bun run -
# PowerShell 7.x+:
irm https://raw.githubusercontent.com/joaovjo/mercury/main/app/scripts/bootstrap.ts | bun run -The one-liner installs (or updates) Mercury and copies the skills:
- detects your OS/arch and downloads a prebuilt binary from the latest GitHub Release (SHA256-verified) →
~/.local/bin/mercury— no build, justcurl; - copies the skills into detected agent dirs (
~/.config/opencode/skills,~/.claude/skills); - falls back to a source build with Bun if no prebuilt binary matches your platform.
Prebuilt targets: linux-x64, linux-arm64, darwin-x64, darwin-arm64, windows-x64.
Windows: run the one-liner from Git Bash (or WSL) — it installs
mercury.exe. There's nowindows-arm64prebuilt (Bun doesn't compile it); on Windows-arm64 the installer falls back to a source build with Bun.
Make sure
~/.local/binis on yourPATH(the installer prints a hint if not). Re-run the same command any time to update —mercuryalso prints a one-line notice when a newer release is available.
Env overrides: MERCURY_VERSION (pin a tag, e.g. v0.2.0), MERCURY_FROM_SOURCE=1,
MERCURY_BIN_DIR, MERCURY_SKILLS_DIR, MERCURY_NO_SKILLS=1, MERCURY_NO_UPDATE_CHECK=1.
The bootstrap copies skills for you. To (re)install them into your agents at any time — e.g. after adding a new agent:
mercury setup # every detected agent (opencode, Claude Code, Cursor, Codex, …)
mercury setup --agent opencode # just one
mercury setup --all # include agents that aren't detected yet
mercury setup --skills-dir <path># an explicit directoryFor the Launch tab you also need an ACP-capable agent on PATH: opencode
(native opencode acp) or claude (Claude Code, via @zed-industries/claude-code-acp).
Contributing or running from a clone? See AGENTS.md for the build and dev workflow.
The agent loads these skills automatically when your request matches their description. Examples:
- "Audit my LinkedIn profile and help me get more recruiter messages" → loads
profile-optimizer - "Find backend engineer roles at DoorDash and Airbnb in São Paulo" → loads
job-scout - "Tailor my resume for these 3 roles I scouted" → loads
resume-tailor - "Find recruiters at Uber who hire in Brazil and connect with them" → loads
recruiter-outreach - "Fill out this Greenhouse application for me" (with a job URL) → loads
portal-filler
- Pull full profile analytics (search appearances, views, impressions)
- Identify specific pitfalls ranked by recruiter-search impact
- Edit via browser automation: Open to Work (recruiter-only), headline, location, top skills, languages, projects, About section, experience descriptions
- Remove internal-mobility cards that signal "not looking"
- Search by company + location + work type + seniority
- Get full job descriptions with requirements and compensation
- Assess fit (Strong / Good / Stretch) based on your profile
- Flag diversity-scoped roles, staffing aggregators, and external ATS friction
- "Grill me" — STAR-style interview that probes for impact, metrics, scope, and tech
- Seeds from your existing bank + base resume + LinkedIn profile, so it only asks about gaps and new material
- Stores tagged entries in
.mercury/experience/(skills, tech, domain, role-type, metrics) - Incremental + idempotent — run periodically (quarterly/after shipping), never re-grills what it already has
- Truthful by construction — structures real stories, never invents
- Parse your base resume (Typst/MD/PDF/txt) + experience bank + LinkedIn profile data
- Pulls role-relevant experience-bank entries even when they aren't on the short base resume
- Batch-tailor to N scouted roles in one pass
- Produce ATS-keyword-aligned Typst output per role
- Generate full cover letters per role
- Gap/match analysis showing what's strong, what's a stretch, what's in your bank, what's missing
- All outputs stored in
.mercury/with full run logs
- Look up company URN IDs (required for LinkedIn's people search filter)
- Find technical recruiters/sourcers at target companies in your region
- Prioritize by: same city > 2nd-degree > mutual connections > relevant title
- Send connection requests with short, specific notes (<300 chars)
- Provide follow-up templates for post-acceptance
- Detects the ATS from the job URL (
mercury detect-portal) and loads its known field selectors — Greenhouse, Lever, Ashby, or a generic snapshot-driven fallback - Fills your contact / eligibility / links from a reusable answer store (
mercury answer set), maps the rest of the form's labels withmercury match, and uploads your compiled resume PDF (mercury export) - Pauses for human review and never clicks Submit — you verify the open browser and submit yourself (mirrors
recruiter-outreach's confirm step) - Never auto-fills EEO/demographic fields, and surfaces anything it couldn't confidently map instead of guessing
- Edit your stored answers and watch application status (
draft → filled → submitted) in the dashboard's Answers and Applications tabs
mercury answer set --key phone --value "+1 555 ..." --category contact
mercury answer list
mercury detect-portal --url "https://job-boards.greenhouse.io/acme/jobs/123"
mercury match --labels '["Email *","Phone","LinkedIn Profile"]'
mercury export --typ resume.typ --out resume.pdf
mercury application update --id 1 --status filled --portal greenhouse --unfilled '["work_authorization"]'
- Auto-apply is fill-then-pause, not fully autonomous —
portal-fillerfills external ATS forms (Greenhouse/Lever/Ashby) but stops before Submit so you review and send. Workday, Taleo, and iCIMS (multi-step, iframe-heavy, account-gated) and opt-in auto-submit are not yet supported; CAPTCHA/SSO are left to the human. - LinkedIn MCP stale browsers (Windows) — the LinkedIn MCP can leave orphaned headless Chromium processes that lock the profile directory. Run
mercury linkedin resetto sweep them (skills do this automatically as a preflight). See the Windows gotcha above for ACL fixes. - LinkedIn rate limits — don't send >10-15 connection requests per session
- Top Skills are managed inside the About editor (
/add-edit/SUMMARY/), not the Skills detail page - Company URN IDs are required for people search filters — plain names are silently ignored
- Typeahead fields (language, skills) require ArrowDown + Enter after typing
- "Notify network" toggle — always verify it's OFF before saving experience edits
- Self-update — run
mercury update(or re-run the bootstrap one-liner) to update to the latest release in-place
LinkedIn automation, job search AI, recruiter outreach, resume tailoring, profile optimization, experience bank, achievement tracking, ATS optimization, LinkedIn MCP, AI job hunting, career toolkit, LinkedIn bot, job scout, cover letter generator, LinkedIn skills for AI agents
The Unlicense — public domain. Do whatever you want with it.





