handshake-mcp-server
Allows AI assistants to interact with a Handshake account, providing tools to search jobs, browse employers, explore events, and pull student or employer profiles from the Handshake platform.
Click on "Deploy 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., "@handshake-mcp-serverFind software engineering internships in San Francisco"
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.
Handshake MCP Server
Through this Handshake MCP server, AI assistants like Claude can connect to your Handshake account — the leading job and internship platform for students. Search jobs, browse employers, explore events, and pull student or employer profiles, all from your AI chat.
Installation Methods
Related MCP server: LinkedIn Agent MCP
Usage Examples
Find software engineering internships at companies in San FranciscoWhat events are coming up on Handshake this week?Get details for job posting 12345678 — does it sponsor visas?Show me the employer profile for Google on HandshakeFeatures & Tools
Tool | Description | Status |
| Get a student's profile by user ID (education, experience, skills, etc.) | Working |
| Get employer overview, open jobs, and reviews | Working |
| Search for employers by keyword | Working |
| Get full job/internship posting with metadata (salary, visa, dates) | Working |
| Search jobs with keyword, location, type, and sort filters | Working |
| Get event details for career fairs and info sessions | Working |
| Search for upcoming events | Working |
| Close the browser session and free resources | Working |
Handshake is astudent-gated platform — you must have a valid student account and log in before tools will work. Run uvx handshake-mcp-server --login (or the setup wizard) to authenticate.
🚀 uvx Setup (Recommended)
Prerequisites: Install uv and a Handshake student account.
1. Install the Patchright Chromium browser (one-time)
uvx --from handshake-mcp-server patchright install chromium2. Run the setup wizard
uvx handshake-mcp-server setupThe wizard asks whether you want Docker or local mode, handles login, and prints the exact claude mcp add-json command to register the server with your MCP client.
3. Register with your MCP client
After setup, paste the command the wizard printed. For example:
# Local mode (opens a browser window on your machine)
claude mcp add-json handshake '{"command":"uvx","args":["handshake-mcp-server"]}'
# Docker mode (runs headless in a container)
claude mcp add-json handshake '{"command":"uvx","args":["handshake-mcp-server","docker"]}'Or add manually to your MCP client config (claude_desktop_config.json or equivalent):
{
"mcpServers": {
"handshake": {
"command": "uvx",
"args": ["handshake-mcp-server"]
}
}
}Restart your MCP client. Done.
The server keeps a single Chromium browser open for its entire lifetime — this avoids re-authentication overhead and makes subsequent tool calls much faster. With--no-headless, a browser window stays visible for the duration of the session. This is normal.
uvx Setup Help
Flag | Description |
| Open browser for manual login, save profile, then exit |
| Clear saved authentication profile and exit |
| Check current session status and exit |
| Run browser in headed (visible) mode |
| Run via Xvfb virtual framebuffer (Linux only) |
| Start a noVNC web server for browser-based login |
| Port for noVNC server (default: 6080) |
| MCP transport: |
| HTTP host (default: 127.0.0.1) |
| HTTP port (default: 8000) |
|
|
HTTP mode example:
uvx handshake-mcp-server --transport streamable-http --host 127.0.0.1 --port 8000Login issues:
Make sure you have a valid Handshake student account
Handshake may show a CAPTCHA on first login —
--loginopens a browser so you can solve it manuallyIf your session expires, re-run
uvx handshake-mcp-server --login
Cloudflare detection:
Handshake uses Cloudflare bot protection. On any desktop with a GUI, always use
--no-headless(the setup wizard does this automatically)On headless Linux servers, use
--virtual-displayto avoid the headless fingerprintSee Cloudflare Bot Detection for details
Session issues:
Browser profile is stored at
~/.handshake-mcp/profile/Run
uvx handshake-mcp-server --statusto check if your session is still validRun
uvx handshake-mcp-server --logoutto clear the profile and start fresh
Installation issues:
Ensure uv is installed:
curl -LsSf https://astral.sh/uv/install.sh | shInstall the Chromium browser:
uvx handshake-mcp-serverwill install it automatically on first run
🐳 Docker Setup
Prerequisites: Docker installed and running. No other dependencies needed.
Docker runs the server headless inside a container using an Xvfb virtual display — no browser window on your machine. The browser profile (cookies/session) is stored in a named Docker volume (handshake-profile) and persists across container restarts.
1. One-time login
docker compose build
docker compose run --rm -p 6080:6080 handshake-mcp --vnc-loginOpen http://localhost:6080/vnc.html in your browser and log into Handshake manually.
2. Start the server
docker compose up -dThe MCP server is now available at http://127.0.0.1:8000/mcp (streamable-http transport).
3. Configure your MCP client
{
"mcpServers": {
"handshake": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "handshake-profile:/home/pwuser/.handshake-mcp",
"handshake-mcp-server",
"--transport", "stdio",
"--virtual-display"
]
}
}
}Docker Setup Help
docker compose logs -f # tail server logs
docker compose run --rm handshake-mcp --status # check session validity
docker compose down # stop the server
docker rmi -f handshake-mcp-server && docker volume rm -f handshake-profile # full resetLogin issues:
Open
http://localhost:6080/vnc.htmlwithin 5 minutes of starting--vnc-loginIf the session expires, repeat the one-time login step
Chromium may leave lock files (
SingletonLock) in the profile dir after a container kill — the server cleans these up automatically on next start
Docker issues:
Check Docker is running:
docker psRebuild after pulling new code:
docker compose buildFull reset:
docker rmi -f handshake-mcp-server && docker volume rm -f handshake-profile
🐍 Local Setup (Develop & Contribute)
Contributions are welcome! See CONTRIBUTING.md for architecture guidelines and the PR checklist. Please open an issue first to discuss your change before submitting a PR.
Prerequisites: Git and uv installed.
# 1. Clone the repository
git clone https://github.com/sudhxnva/handshake-mcp-server
cd handshake-mcp-server
# 2. Install dependencies
uv sync --group dev
# 3. Install the Chromium browser
uv run patchright install chromium
# 4. Log in (opens a browser window)
uv run -m handshake_mcp_server --login --no-headless
# 5. Start the server
uv run -m handshake_mcp_server --no-headlessLocal Setup Help
uv run ruff check . # lint
uv run ruff check . --fix # lint + auto-fix
uv run ruff format . # format
uv run ty check # type check
uv run pytest # tests
uv run pytest --cov # tests with coverageClaude Desktop config for local dev:
{
"mcpServers": {
"handshake": {
"command": "uv",
"args": ["--directory", "/path/to/handshake-mcp-server", "run", "-m", "handshake_mcp_server"]
}
}
}Scraping issues:
Use
--no-headlessto watch browser actions and debug scraping problemsAdd
--log-level DEBUGfor verbose logging
Python/Patchright issues:
Requires Python 3.12+:
python --versionReinstall Patchright:
uv run patchright install chromiumReinstall dependencies:
uv sync --reinstall
Cloudflare Bot Detection
Patchright does not bypass Cloudflare's headless fingerprint when headless=True — that mode uses the chromium-headless-shell binary, which is trivially detected.
Environment | Solution |
Desktop with GUI (macOS, Windows, Linux) | Use |
Headless Linux server | Use |
Docker | Default CMD already uses |
Cloudflare challenge pages are detected automatically and raise a RateLimitError if unresolved.
Tool Return Format
All scraping tools return:
{
"url": "string",
"sections": { "section_name": "raw text content" },
"references": { "section_name": [{ "kind": "job", "url": "/jobs/123", "text": "..." }] },
"section_errors": { "section_name": { "error_type": "...", "error_message": "..." } },
"unknown_sections": ["invalid_section_name"]
}get_job_details also returns a metadata key with structured fields:
{
"metadata": {
"id": "123", "title": "Software Engineer Intern", "company": "Acme Corp",
"salary": 3000, "salary_type": "hourly",
"work_type": "hybrid", "locations": ["San Francisco, CA"],
"job_type": "internship", "employment_type": "part_time",
"start_date": "2025-06-01", "end_date": "2025-08-31",
"deadline": "2025-03-01", "posted_at": "2025-01-15",
"work_auth_required": false, "accepts_opt": true, "accepts_cpt": false,
"will_sponsor": true, "apply_url": "https://..."
}
}Salary values from the GraphQL API are incents — divide by 100 to get dollars.
search_jobs also returns jobs (card-level metadata list) and job_ids. search_employers returns employer_ids. search_events returns event_ids.
Acknowledgements
Built with FastMCP and Patchright. Inspired by the architecture of linkedin-mcp-server.
Use in accordance with Handshake's Terms of Service. Web scraping may violate platform terms. This tool is intended for personal use only.
License
Apache-2.0 — see LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Manage job applications — jobs, companies, boards, notes, and profile — from your AI client.
Query professional profiles, search candidates, and get AI-powered summaries and job fit analysis.
Connect AI agents to Process Street workflows, tasks, runs, data sets, and operational records.
LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts. Quotas and webhooks.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query, search, and analyze LinkedIn profiles from the Headstarter network for recruiting, networking, and community building.3MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to connect to LinkedIn, accessing profiles and companies, searching for jobs and people, managing saved jobs, updating job-search profile settings, and inspecting analytics.1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with LinkedIn using the official API for profile access, company management, and job postings.Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI assistants to search and apply for jobs on Handshake, track applications, and research employers using your browser session.121MIT