The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Trackly CLI listing page.
The only job tracking CLI built for AI agents.
Search 170,000+ jobs across 3,800+ companies and 40+ ATS types. Track applications, get AI-powered recommendations, and manage your job search -- from the terminal or through Claude, ChatGPT, Cursor, and other MCP-compatible AI agents.
Use Trackly directly inside your AI — zero config:
https://mcp.usetrackly.app/api/mcpFull setup guide with screenshots →
Works in: Claude co-work (web), Claude Desktop, ChatGPT Connectors, and any MCP client that supports remote/streamable-http connectors.
Prerequisites: Node.js 20.20+ or 22.22+ (LTS recommended). On macOS with the official
.pkginstaller, global npm installs may requiresudo.
3,800+ companies | 170K+ jobs | 40+ ATS types | CLI + MCP | 58 local MCP tools
Add --json to any command for JSON output. Use --api-key <key> or --base-url <url> as one-off global flags when needed.
trackly preferences --json returns only success, experienceFilterV2Available, and preferences. The availability flag controls whether this client may edit role-specific limits; it does not claim that feed or alert enforcement is active. Every update checks that flag and the latest preference revision before writing.
No install. In your AI tool, open Settings → Connectors → Add custom connector and enter:
Sign in with Google when prompted. Full visual guide →
For agent-assisted form filling on macOS, install the public skill and local MCP together:
The skill uses the profile and default resume in your Trackly account, asks only missing questions, fills user-approved saved jobs, and always stops before Submit. “Fill the next N” continues through the original recent-first Check Later snapshot until N unauthenticated forms are durably ready for your manual review; authentication walls and exclusions are reported separately and do not consume the target. An explicit “inspect the next N records” request still uses one fixed immutable batch. Support is fetched from Trackly at the start of every run: Greenhouse is full, Ashby and Lever are best effort, and 27 additional named ATS/provider classes use constrained guided mode. Employer-hosted unknown forms run only when Trackly binds them to a verified company domain. LinkedIn-hosted forms and unverified origins remain manual-only; a separately stored external application URL is evaluated under its own ATS and origin policy.
Guided mode is deliberately fail-closed. The agent stops on credential entry, OTP/email verification, CAPTCHA/human verification, an unexpected employer or origin, a submit-only transition, or any field whose committed state cannot be observed. trackly agent doctor checks the local skill, MCP registration, protocol compatibility, declared browser/computer-use configuration, profile completeness, and default-resume metadata. Live semantic browser capability and the exact resume bytes are verified at the start of a real run.
Or equivalently:
Add to ~/.claude/settings.json:
Add to .cursor/mcp.json or ~/.cursor/mcp.json (same schema works for Windsurf):
Then use natural language in any of these clients:
| Tool | Description |
|---|---|
| trackly_search_jobs | Search and filter jobs by function, company, region, employment type, work arrangement, visa sponsorship, and status |
| trackly_get_job | Get full details for a specific job |
| trackly_search_companies | Semantic company search |
| trackly_list_companies | List all tracked companies |
| trackly_get_stats | Job tracker metrics and status counts |
| trackly_get_preferences | Read bounded discovery preferences, edit availability, and save revision |
| trackly_update_experience_limits | Atomically replace role-specific limits on a job's stated minimum years |
| trackly_update_status | Mark jobs as applied, saved, or dismissed |
| trackly_ask | Natural language job search (20/day) |
| trackly_get_job_brief | Get network brief for a job (company signal, top contact, actions) |
| trackly_contacts_at_company | Search contacts at a specific company |
| trackly_get_company_workspace | Full company workspace (jobs, contacts, hiring managers, campaigns) |
| trackly_request_company | Request a company be added to Trackly (rate-limited to 5 pending) |
| trackly_get_apply_queue | Get user-approved jobs ready for execution |
| trackly_get_application_profile | Get versioned profile answers and provenance |
| trackly_get_profile_onboarding | Get schema plus missing questions |
| trackly_update_application_profile | Save scoped answers with optimistic concurrency; revoking sensitive storage takes a two-step confirmation |
| trackly_start_apply_execution | Start a target-counted accessible Apply execution |
| trackly_get_active_apply_execution | Recover the active execution before legacy batch recovery |
| trackly_get_apply_execution | Read the authoritative progress funnel and immutable child waves |
| trackly_list_recoverable_apply_executions | List bounded exact-member recovery candidates after context loss |
| trackly_recover_exact_apply_members | Recover only one explicitly confirmed candidate set without substitutes |
| trackly_list_apply_review_handoffs | Rediscover active, value-free review-handoff receipts for one execution |
| trackly_claim_apply_review_handoff | Claim and classify one exact review-handoff group before reconciliation |
| trackly_get_apply_execution_snapshot | Fetch a compact bounded projection for current execution members and required profile keys |
| trackly_resume_parked_apply_member | Explicitly resume one parked member for a fresh non-mutating access probe |
| trackly_approve_apply_execution_resume | Approve one exact resume identity for an unchanged execution snapshot |
| trackly_advance_apply_execution | Transactionally create the next eligible immutable wave with frozen accessKnowledge |
| trackly_list_apply_access_deferments | List persistent user access deferments |
| trackly_defer_apply_access | Persist a job or company deferment from a Trackly jobId |
| trackly_clear_apply_access_deferment | Clear one discovered user access deferment |
| trackly_record_apply_execution_dispositions | Record typed, value-free access classifications |
| trackly_stop_apply_execution | Stop an execution without changing saved-job state |
| trackly_create_apply_batch | Freeze an exact recent-first approved batch |
| trackly_cancel_apply_batch | Retire a legacy fixed batch after explicit user confirmation |
| trackly_get_active_apply_batch | Recover the newest unexpired active batch after context loss |
| trackly_get_apply_batch | Read frozen membership with opaque pagination |
| trackly_claim_apply_batch | Acquire or renew a batch mutation lease |
| trackly_checkpoint_apply_batch | Bulk-record redacted inspection checkpoints and human actions |
| trackly_bind_apply_surface | Bind an initial or recovered browser surface to the existing run and exact requisition URL |
| trackly_record_apply_surface_evidence | Record current-epoch inventory, missing-tab, close-receipt, and post-close absence evidence |
| trackly_record_apply_submission_evidence | Record redacted submit-request, success-page, user-confirmation, or provider-receipt evidence |
| trackly_approve_apply_batch_resume | Approve one exact default resume for the current frozen run set |
| trackly_certify_apply_batch_truth | Certify final answer and wording fingerprints after every other review-readiness gate |
| trackly_start_apply_run | Start or reuse a manual-submit browser run |
| trackly_get_apply_evidence | Get aggregate, value-free beta evidence and release readiness |
| trackly_get_apply_protocol | Get current workflow and compatibility rules |
| trackly_report_apply_observation | Send redacted ATS mechanics feedback |
| trackly_lint_application_text | Locally lint application writing and return only value-free violations plus a draft hash |
| trackly_diagnose_local_path | Locally diagnose the exact implicated filesystem path without deleting files |
| trackly_validate_apply_tab_keep_set | Locally validate an exact expected/keep tab set against complete caller-supplied inventories without controlling the browser or sending tab IDs remotely |
| trackly_validate_apply_resume_upload | Locally validate adapter capability and ordered value-free attachment proof stages |
| trackly_report_apply_observations | Bulk-send up to 20 leased, batch-bound redacted observations |
| trackly_record_application_outcome | Record review or confirmed submission outcome |
| trackly_record_application_outcomes | Bulk-record up to 20 leased batch outcomes with per-member conflicts |
| trackly_prepare_resume | Prepare a private expiring resume file for upload |
| trackly_verify_prepared_resume | Recheck the confirmed resume immediately before attachment |
| get_more_tools | Report a missing capability so Trackly can improve its MCP surface |
Opens your browser for Google sign-in. Tokens are stored locally at ~/.trackly/config.json.
Trackly is currently opening new memberships through a limited, invite-based rollout. Existing members can keep using OAuth and API keys normally. If a new account is not yet eligible, the CLI returns an invitation-specific message instead of suggesting repeated login attempts; request a future seat at usetrackly.app/early-access.
Existing members can use an API key for firewalls, headless servers, or CI:
Or pass it per-command:
Or set it as an environment variable:
If you're already logged in via OAuth, you can create a key without visiting the web app:
| Feature | CLI | Web App | Public API |
|---|---|---|---|
| Job search + filters | Yes | Yes | Yes |
| Apply/save/dismiss | Yes | Yes | Yes |
| AI-powered search | Yes (trackly ask) | Yes | Yes |
| MCP integration | Yes (58 local tools) | -- | -- |
| Browser required | No | Yes | No |
| Best for | Terminal + AI agents | Visual browsing | Custom integrations |
Web: usetrackly.app | API docs: usetrackly.app/developers
How do I track job applications from the terminal?
Install trackly-cli (npm install -g trackly-cli), authenticate with trackly login or configure an API key, then use trackly jobs to browse openings and trackly apply <id> to mark applications. All data syncs with the Trackly web app at usetrackly.app.
What MCP servers exist for job searching?
trackly-cli includes a built-in MCP server with 58 tools: the complete Trackly
job-search and application set plus get_more_tools, which lets agents report
a missing capability. Run trackly mcp or use
trackly agent setup --client claude.
MCP usage analytics are on by default and relay through Trackly so the free
service can be debugged and improved. They exclude résumé text, profile answers,
demographic or work-authorization answers, and application notes. Turn off future
collection with Share usage analytics in Account Settings. Operators may also
disable local MCP instrumentation with TRACKLY_MCP_ANALYTICS_DISABLED=1 (or
TRACKLY_MCP_ANALYTICS_ENABLED=0); the account setting remains authoritative
for authenticated backend capture.
How do I use Claude Code for job hunting?
Add trackly as an MCP server in Claude Code. Then ask questions naturally: "Find PM jobs at fintech companies in SF", "What companies are hiring for engineering?", or "Mark job 1234 as applied." Claude will use trackly's MCP tools to search and manage your applications.
What are the best CLI tools for job search?
trackly-cli is the first dedicated job tracking CLI. It provides direct terminal access to 170,000+ job postings across 3,800+ companies, with filters for job function, location, and work modality. It also integrates with AI agents via the Model Context Protocol (MCP).
~/.trackly/config.json with 0600 permissionsMIT -- see LICENSE