Remote Job Agent MCP
Click on "Install 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., "@Remote Job Agent MCPFind remote GenAI jobs and tailor my CV for the top match."
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.
Remote Job Agent MCP for ChatGPT
Version 0.3.0 is a refactored TypeScript MCP server for remote job discovery, factual ATS-CV preparation, approval-gated application packages, and application tracking.
It is intentionally designed as a job agent, not a LinkedIn browser bot. LinkedIn can provide lite OIDC identity/profile data and indexed job URLs can be used for discovery, while applications prefer the employer's official careers/ATS URL.
Design goals
Separation of concerns: domain rules, repositories, external adapters, services, MCP tools, and HTTP delivery live in separate modules.
SOLID: services depend on narrow repositories/adapters and domain functions stay independently testable.
DRY: shared parsing, canonicalization, ATS detection, screening-answer logic, and persistence are centralized.
KISS: deterministic rules first, filesystem persistence for the starter, no unnecessary framework, and no hidden application automation.
Safe by default: no fabricated CV facts, no authenticated LinkedIn scraping, no silent submission, and explicit application-state transitions.
Related MCP server: Job Application MCP
Main capabilities
Job discovery
Search Frontend, Backend, Full-Stack, GenAI, or custom titles together.
Discover indexed LinkedIn listings, common ATS boards, and company career pages.
Concurrency-limited search with request timeouts and partial-failure reporting.
Detect ATS providers and prefer official employer/ATS URLs.
Canonicalize URLs and merge duplicates across sources without merging different locations.
Filter obvious remote/work-location restrictions before ranking.
Rank with an explainable 100-point score.
Candidate/CV data
One factual master candidate profile.
Separate reusable application facts such as work authorization, sponsorship need, notice period, salary expectation, relocation, availability, and years by skill.
LinkedIn OIDC profile stored separately from the master CV.
Tailored CV brief with anti-fabrication rules.
Per-job Markdown CV versions; CV IDs are bound to the job that generated them.
Application workflow
Discovered
↓
Ranked
↓
Official apply URL resolved
↓
Tailored CV saved
↓
Prepared
↓
Screening answers reviewed
↓
Approved
↓
Submitted externally
↓
Interview / Rejected / Offer / Withdrawnprepared -> submitted is intentionally invalid. A package must be explicitly approved first. Editing an approved package invalidates its approval and returns it to prepared.
Architecture
src/
server.ts process bootstrap only
http-server.ts HTTP/MCP transport + request security
mcp.ts MCP tool schemas and tool wiring
types.ts shared domain contracts
application-domain.ts pure application state/answer rules
job-intelligence.ts pure eligibility/ranking/dedupe rules
discovery.ts search-provider adapter/query builder
linkedin-oauth.ts LinkedIn OIDC adapter/token protection
storage.ts atomic JSON persistence primitive
repositories.ts persistence boundaries
services/
job-service.ts job use-cases/orchestration
candidate-service.ts candidate/CV use-cases
application-service.ts application use-cases/state transitionsSee docs/ARCHITECTURE.md for the responsibility boundaries.
Weighted job score
Skills match 30
Experience match 20
Remote eligibility 15
Role relevance 10
Seniority 10
AI/domain relevance 5
Salary 5
Freshness 5
---
100Salary is currently neutral until structured salary extraction is added. The score is a prioritization aid, not a hiring prediction.
Remote eligibility behavior
Examples:
Remote worldwide / work from anywhere -> eligible
Remote within United States -> blocked unless explicitly eligible
Must reside in EU / Europe -> blocked unless explicitly eligible
Remote EMEA -> eligible only when EMEA is explicitly allowed
On-site only -> blocked for remote-only candidates
Security-clearance/citizenship blocker -> blocked when detected
Remote with unclear scope -> manual verificationworldwide does not automatically imply eligibility for an EMEA-only, Europe-only, or country-restricted role.
Configure factual eligibility in data/profile.json or with update_master_profile.
LinkedIn OAuth
LinkedIn OIDC is optional and is only used for the connected member's lite identity/profile. The MCP requests:
openid profile emailIt does not turn into a general LinkedIn job-search or Easy Apply API. This project does not store LinkedIn passwords/cookies, scrape authenticated pages, bypass CAPTCHAs, or click Easy Apply automatically.
Use the MCP tool:
get_linkedin_connect_urlOpen the returned URL, approve LinkedIn, and LinkedIn redirects to:
/oauth/linkedin/callbackThe callback stores the access token encrypted with AES-256-GCM and stores the lite profile separately. There is no public profile-status route.
See docs/LINKEDIN_OAUTH.md.
Main MCP tools
Discovery
search_best_jobssearch_jobsimport_joblist_jobsanalyze_jobfind_official_apply_urlget_application_routeget_search_configupdate_search_config
Candidate and CV
get_master_profileupdate_master_profileget_candidate_factsupdate_candidate_factscreate_cv_briefsave_cv_version
get_linkedin_connect_urlget_linkedin_connectiondisconnect_linkedin
Application lifecycle
prepare_applicationupdate_application_packageapprove_applicationrecord_applicationlist_applicationsget_application_analytics
record_application only accepts externally observed lifecycle states (submitted, interview, rejected, offer, withdrawn); it cannot manufacture the internal prepared or approved states.
Configuration
Copy the example environment file:
cp .env.example .envImportant variables:
PORT=8787
HOST=127.0.0.1
PUBLIC_BASE_URL=http://localhost:8787
SERPER_API_KEY=
MCP_BEARER_TOKEN=use-at-least-24-random-characters-for-public-bind
REQUEST_TIMEOUT_MS=15000
DISCOVERY_CONCURRENCY=4
LINKEDIN_CLIENT_ID=
LINKEDIN_CLIENT_SECRET=
LINKEDIN_REDIRECT_URI=http://localhost:8787/oauth/linkedin/callback
TOKEN_ENCRYPTION_KEY=use-at-least-32-random-charactersInvalid numeric configuration fails at startup. The server refuses a non-local bind unless MCP_BEARER_TOKEN is configured. The bearer token is a development/single-user safeguard; use proper MCP OAuth and per-user storage before a real multi-user deployment.
Search provider
Discovery currently uses Serper as a search-index adapter instead of scraping LinkedIn:
SERPER_API_KEY=...The adapter is isolated in src/discovery.ts, so another permitted provider can replace it without changing domain/services/MCP tools.
Candidate facts
data/profile.json is the factual CV source of truth.
data/candidate-facts.json stores reusable application facts:
{
"noticePeriod": "",
"salaryExpectation": "",
"workAuthorization": "",
"requiresVisaSponsorship": "",
"relocation": "",
"availability": "",
"yearsBySkill": {},
"reusableAnswers": {}
}The agent must not infer missing values.
Setup
Requires Node.js 20+.
npm install
npm run check
npm run build
npm run devEndpoints:
GET / health metadata
* /mcp MCP HTTP endpoint
GET /oauth/linkedin/callback LinkedIn OAuth callback onlyFor local ChatGPT testing, expose the server through HTTPS and connect the HTTPS /mcp URL.
Docker
docker build -t remote-job-agent-mcp .
docker run --rm \
-p 8787:8787 \
--env-file .env \
-e HOST=0.0.0.0 \
-e MCP_BEARER_TOKEN=replace-with-at-least-24-random-characters \
-v "$(pwd)/data:/app/data" \
remote-job-agent-mcpHOST=0.0.0.0 is required inside the container for port publishing; because that is a public bind, the starter also requires a sufficiently long bearer token. Candidate profile/facts and OAuth/token files are excluded from the Docker build context so personal data is not accidentally baked into an image. Mount data/ at runtime when persistence is needed.
Persistence and concurrency
The starter uses JSON files for a simple single-user deployment. Writes are serialized per file and use temp-file + atomic rename so concurrent MCP requests do not overwrite/corrupt JSON state. Malformed JSON is surfaced as an error rather than silently being replaced with empty data.
For multi-user production, replace the repository implementations with PostgreSQL while keeping the service/domain APIs unchanged.
Tests and checks
npm run typecheck
npm test
npm run checkCurrent core tests cover:
application approval/state transitions;
sponsorship vs work-authorization answers;
discovery-query deduplication;
ATS hostname detection;
role-family classification;
worldwide/US/EMEA eligibility behavior;
canonical URL cleanup;
cross-source duplicate behavior;
official apply-link confidence;
malformed JSON handling;
concurrent JSON updates.
Production upgrades
The clean extension points are intentional. Recommended next steps are PostgreSQL repositories keyed by authenticated MCP user, full MCP OAuth, permitted direct job-board adapters, job-description enrichment, DOCX/PDF rendering, Gmail response synchronization, audit logging/rate limits, and explicitly authorized ATS submission adapters where the provider/employer allows them.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server that scours job openings from public, ToS-clean sources (Greenhouse, Lever, Ashby, HN, RemoteOK, Adzuna, USAJobs) and provides tools for job search, company listings, and salary context.4MIT
- Alicense-qualityAmaintenanceA local-first, open-source MCP server that analyzes jobs, matches your CV, tailors documents, and tracks applications — all on your machine with no data uploaded.AGPL 3.0
- AlicenseAqualityCmaintenanceA privacy-first MCP server for locally managing job, fellowship, and graduate-school applications. It offers tools for tracking application status, analyzing role fit, generating LaTeX CV/cover letters, interview prep, and discovering public jobs from ATS APIs.8MIT
- AlicenseAqualityBmaintenanceAn MCP server that automates job applications by discovering postings from ATS boards, applying eligibility gates, scoring candidates, and drafting answers, while requiring human approval before submission. It respects anti-bot controls and only submits with explicit consent.22MIT
Related MCP Connectors
MCP server for AI job search — find jobs, track applications, get alerts. Claude, ChatGPT, Cursor.
Search remote and onsite jobs through the public Corvi Careers MCP server.
Search remote jobs, compare salaries, create alerts, and request user-confirmed apply links.
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/salman0butt/linkedin-job-agent-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server