visa-jobs-mcp
MCP to find your dream job.
Install / Use
claude mcp add neosh11 -- npx -y github:neosh11/visa-jobs-mcpIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
Development & EngineeringSupported Platforms
Tags
Skill content
View source on GitHubvisa-jobs-mcp

visa-jobs-mcp is an MCP server that helps agents find relevant jobs from fresh LinkedIn searches, with optional visa-aware filtering.
It is built for speed and practical outcomes:
- search jobs in a location,
- match employers against sponsorship history,
- return actionable results with links and contact info,
- keep user data local.
Get Started
1. Install on macOS (Homebrew)
brew tap neosh11/visa-jobs-mcp
brew install neosh11/visa-jobs-mcp/visa-jobs-mcp
2. Install on macOS/Linux (bash installer)
curl -fsSL https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.sh | bash
Pin a specific version:
curl -fsSL https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.sh | bash -s -- --version 0.3.1
3. Install on Windows (PowerShell installer)
irm https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.ps1 | iex
Pin a specific version:
$env:VISA_JOBS_MCP_VERSION = "0.3.1"
irm https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.ps1 | iex
4. Register in Codex (macOS/Linux)
codex mcp add visa-jobs-mcp --env VISA_JOB_SITES=linkedin -- visa-jobs-mcp
Register in Codex (Windows PowerShell):
codex mcp add visa-jobs-mcp --env VISA_JOB_SITES=linkedin -- "$env:LOCALAPPDATA\\Programs\\visa-jobs-mcp\\bin\\visa-jobs-mcp.exe"
Verify:
codex mcp list
codex mcp get visa-jobs-mcp
5. Use it in chat
In a new Codex session, ask naturally:
Find IT jobs in Delhi for my skills.Set my visa preference to E3 and find software engineer jobs in New York that sponsor E3.
Build from source (optional)
go build -o visa-jobs-mcp ./cmd/visa-jobs-mcp
./visa-jobs-mcp --version
If you need to refresh data/companies.csv from source, run:
./scripts/run_internal_pipeline.sh
Note: MCP runtime is Go-only. Python is only needed for maintainers running the internal dataset pipeline.
Live LinkedIn E2E (manual)
Run a real end-to-end search against LinkedIn (not stubbed tests):
./scripts/run_live_linkedin_e2e.sh
Optional timeout override:
VISA_E2E_TEST_TIMEOUT=8m ./scripts/run_live_linkedin_e2e.sh
Optional live test parameters:
VISA_E2E_VISA_TYPE=E3 \
VISA_E2E_LOCATION="New York, NY" \
VISA_E2E_JOB_TITLE="Software Engineer" \
./scripts/run_live_linkedin_e2e.sh
What It Supports
- LinkedIn-only search.
- General skill/location job search with no visa setup required.
- Optional visa preference matching when
preferred_visa_typesis set. - Search sessions with pagination and resume support.
- Saved jobs and ignored jobs.
- Employer contact extraction when available.
- Local-first private data storage.
- No proxy usage.
- No LLM calls inside MCP runtime (agent handles reasoning).
Core MCP Tools
start_job_searchget_job_search_statusget_job_search_resultsset_user_preferencesstart_visa_job_searchget_visa_job_search_statusget_visa_job_search_resultssave_job_for_laterignore_joblist_saved_jobslist_ignored_jobsget_mcp_capabilities
Tip: ask the agent to call get_mcp_capabilities first for a machine-readable contract.
MCP Contract (Generated)
<!-- MCP_CONTRACT:START --> <details> <summary><strong>Expand MCP Contract</strong> (auto-generated)</summary>Generated from get_mcp_capabilities() via scripts/generate_contract_docs.py.
Server
server:visa-jobs-mcpversion:0.3.1capabilities_schema_version:1.2.0confidence_model_version:v1.1.0-rules-go
Required Before Search
tool:start_job_searchrequired_fields:user_id
Design Decisions
agent_is_reasoning_layer:Truebackground_search_runs_local_persistence:Truedata_not_shared_or_sold:Truefirst_class_job_management:Truefree_forever:Truefresh_job_search_per_query:Trueignored_companies_local_persistence:Trueignored_jobs_local_persistence:Truelicense:MITllm_api_keys_required_by_mcp:Falsellm_runtime_inside_mcp:Falseno_fake_reviews_or_bot_marketing:Trueproxies_used:Falserate_limit_backoff_retries:Truesaved_jobs_local_persistence:Truesearch_sessions_local_persistence:Truestrict_user_visa_match:Falsestrictness_modes_supported:['balanced', 'strict']supported_job_sites:['linkedin']visa_matching_optional:True
Defaults
dataset_stale_after_days:30job_db_path:data/app/visa_jobs.dbmax_scan_results:1200max_search_sessions_per_user:20rate_limit_initial_backoff_seconds:2rate_limit_max_backoff_seconds:30rate_limit_retry_window_seconds:180scan_multiplier:8search_run_ttl_seconds:21600search_session_ttl_seconds:21600strictness_mode:stricttool_call_soft_timeout_seconds:48
Tools
| Tool | Description | Required Inputs | Optional Inputs |
|---|---|---|---|
| get_mcp_capabilities | Return MCP capabilities, tools, and contracts for agent self-discovery. | - | - |
| set_user_preferences | Save the user's visa preferences for optional visa-specific matching. | user_id, preferred_visa_types | - |
| set_user_constraints | Save urgency and work-mode constraints used for personalized guidance. | user_id | - |
| get_user_preferences | Fetch the saved user preferences and constraints. | user_id | - |
| get_user_readiness | Report whether the user and local dataset are ready for search. | user_id | - |
| find_related_titles | Return adjacent role titles to widen low-yield searches. | job_title | - |
| add_user_memory_line | Append a profile memory line (skills, goals, fears, constraints). | user_id, content | - |
| query_user_memory_blob | Query the user's local memory blob with optional text filtering. | user_id | - |
| delete_user_memory_line | Delete one memory line by id from the local blob. | user_id, line_id | - |
| save_job_for_later | Save a job to the user's local shortlist for follow-up. | user_id | job_url, result_id, session_id |
| list_saved_jobs | List saved jobs in reverse-chronological order. | user_id | - |
| delete_saved_job | Remove one saved job from the local shortlist. | user_id, saved_job_id | - |
| ignore_job | Hide one job from future results for this user. | user_id | job_url, result_id, session_id |
| list_ignored_jobs | List ignored jobs in reverse-chronological order. | user_id | - |
| unignore_job | Unhide a previously ignored job by id. | user_id, ignored_job_id | - |
| ignore_company | Hide all jobs from a company in future searches. | user_id | - |
| list_ignored_companies | List ignored companies in reverse-chronological order. | user_id | - |
| unignore_company | Remove one company from the ignored list. | user_id, ignored_company_id | - |
| mark_job_applied | Mark a job as applied and persist pipeline state. | user_id | - |
| update_job_stage | Update lifecycle stage for a tracked job (saved/applied/interview/etc). | user_id, stage | - |
| list_jobs_by_stage | List tracked jobs filtered by lifecycle stage. | user_id, stage | - |
| add_job_note | Attach or append a note to a tracked job record. | user_id, note | - |
| list_recent_job_events | List recent stage transitions and lifecycle events. | user_id | - |
| get_job_pipeline_summary | Summarize tracked pipeline counts by stage for one user. | user_id | - |
| clear_search_session | Delete one cached search session or all sessions for a user. | user_id | - |
| export_user_data | Export all local records for a user across stores. | user_id | - |
| delete_user_data | Permanently delete all local records for a user. | user_id, confirm | - |
| get_best_contact_strategy | Suggest best outreach channel/contact for a job. | user_id | - |
| generate_outreach_message | Generate a practical outreach draft tailored to user and role. | user_id | - |
| start_job_search | Start a background job search without requiring visa preferences. | location, job_title, user_id | - |
| get_job_search_status | Poll incremental progress/events for a background job search run. | user_id, run_id | - |
| get_job_search_results | Fetch current result page from a background job search run. | user_id, run_id | - |
| cancel_job_search | Request cancellation of an in-progress background job search run. | user_id, run_id | - |
| start_visa_job_search | Start a background search run for long scans. | location, job_title, user_id | - |
| get_visa_job_search_status | Poll incremental progress/events for a background search run. | user_id, run_id | - |
| get_visa_job_search_results | Fetch current result page from a background search run. | user_id, run_id | - |
| cancel_visa_job_search | Request cancellation of an in-progress background run. | user_id, run_id | - |
| discover_latest_dol_disclosure_urls | Discover latest DOL LCA/PERM disclosure sources. | - | - |
| run_internal_dol_pipeline | Run internal pipeline to refresh sponsor-company dataset. | - | - |
| refresh_company_dataset_cache | Clear and reload in-memory company dataset cache. | - | - |
Search Response Fields
runstatusstatsguidancedataset_freshnesspaginationrecovery_suggestionsjobs[].result_idjobs[].job_urljobs[].titlejobs[].companyjobs[].locationjobs[].sitejobs[].date_postedjobs[].description_fetchedjobs[].descriptionjobs[].description_excerptjobs[].salary_textjobs[].salary_currencyjobs[].salary_intervaljobs[].salary_min_amountjobs[].salary_max_amountjobs[].salary_sourcejobs[].job_typejobs[].job_leveljobs[].company_industryjobs[].job_functionjobs[].job_url_directjobs[].is_remotejobs[].employer_contactsjobs[].visa_countsjobs[].visas_sponsoredjobs[].visa_match_strengthjobs[].eligibility_reasonsjobs[].confidence_scorejobs[].confidence_model_versionjobs[].agent_guidance
Paths
dataset_default:data/companies.csvignored_companies_default:data/config/ignored_companies.jsonignored_jobs_default:data/config/ignored_jobs.jsonjob_management_db_default:data/app/visa_jobs.dbpipeline_manifest_default:data/pipeline/last_run.jsonsaved_jobs_default:data/config/saved_jobs.jsonsearch_runs_store_default:data/config/search_runs.jsonsearch_session_store_default:data/config/search_sessions.jsonuser_memory_blob_default:data/config/user_memory_blob.jsonuser_preferences_default:data/config/user_preferences.json
Deprecations
build_company_dataset_from_dol_disclosures->run_internal_dol_pipeline(soft_deprecated)
{
"capabilities_schema_version": "1.2.0",
"confidence_model_version": "v1.1.0-rules-go",
"defaults": {
"dataset_stale_after_days": 30,
"job_db_path": "data/app/visa_jobs.db",
"max_scan_results": 1200,
"max_search_sessions_per_user": 20,
"rate_limit_initial_backoff_seconds": 2,
"rate_limit_max_backoff_seconds": 30,
"rate_limit_retry_window_seconds": 180,
"scan_multiplier": 8,
"search_run_ttl_seconds": 21600,
Truncated for display — read the full file on GitHub.
Related Skills
momen-cursurrules-prompt-file
40.7kCursor rules for building custom frontends with Momen.app as headless BaaS with GraphQL API, actionflows, AI agents, and Stripe integration.
semiotic-react-dataviz-cursorrules-prompt-file
40.7kCursor rules for Semiotic data visualization library with 30+ chart types, MCP server, and AI-assisted chart generation.
Agent-Reach
75.6kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
ruflo
69.5k🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated
