Docs
Landed MCP Server
A public Model Context Protocol server that gives any agent live AI-native job search, application forms, and interview-prep content. Connect with a single URL — no account required to try it.
Introduction
The Landed MCP server exposes three read-and-prepare tools over Streamable HTTP:
search_jobs— Search the live AI-native job index, ranked by fit.get_job_form— Read a job’s application-form fields so your agent can pre-draft answers.get_learning_content— Pull interview prep, portfolio projects, and roadmaps from the open-source library.
It's stateless and multi-tenant: any MCP client connects with just the URL. Anonymous callers get a free budget; connect an API token for unmetered, personalized results.
Installation
The server is hosted at https://mcp.landed.jobs/mcp. Add it to any MCP client — no install, no keys to start.
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"landed": {
"url": "https://mcp.landed.jobs/mcp"
}
}
}Cursor & Windsurf
Add the same block to ~/.cursor/mcp.json (Cursor) or your Windsurf MCP config, then reload.
Claude Code
Add it from the CLI:
claude mcp add --transport http landed https://mcp.landed.jobs/mcpStreamable HTTP
The server speaks the MCP Streamable HTTP transport in stateless mode, so any compliant client can connect over plain HTTP with the URL above — no local process to run.
Authentication
Anonymous — no header needed. Every anonymous identity gets a 20 job-unit budget, metered by anon token and IP.
With a token — create a free account, mint an API token in Settings, and send it as a bearer header for unmetered, personalized results:
{
"mcpServers": {
"landed": {
"url": "https://mcp.landed.jobs/mcp",
"headers": {
"Authorization": "Bearer lnd_live_..."
}
}
}
}Tokens look like lnd_live_…and are shown once at creation. They're never stored in raw form — revoke and rotate any time from Settings.
Rate limits & quota
Usage is metered in job-units. Anonymous identities get 20; token'd identities are unmetered in v1. Learning content is always free.
| Tool | Cost |
|---|---|
| search_jobs | 1 unit per job returned (≤5 per call, anon) |
| get_job_form | 1 unit |
| get_learning_content | Free |
A per-IP request rate limit also applies to protect the search backend. Keep calls reasonable.
search_jobs
Search the live AI-native job index. Anonymous searches use a skeleton brief; token'd searches rank against your saved profile.
| Parameter | Type | Description |
|---|---|---|
| query | string | Free-text search (required). |
| role | string | Canonical role filter, e.g. "ai-engineer". |
| location | string | City or region. |
| remote | 'remote' | 'hybrid' | 'onsite' | Work-location filter. |
| seniority | string | Mid, Senior, Staff, … |
| limit | number | Results to return (anon ≤ 5, token ≤ 20). |
Example
{
"query": "senior AI engineer, RAG",
"remote": "remote",
"limit": 5
}{
"total": 128,
"jobs": [
{
"jobId": "anthropic-ai-engineer-1",
"title": "Senior AI Engineer",
"company": "Anthropic",
"location": "Remote (US)",
"fitLabel": "Strong fit",
"oneLineWhy": "Matches your RAG + evals experience.",
"applyUrl": "https://anthropic.com/careers",
"url": "https://landed.jobs/jobs/anthropic-ai-engineer-1"
}
]
}get_job_form
Return a job's application-form fields — grouped standard / screening / eeo — so your agent can pre-draft answers before opening the ATS.
| Parameter | Type | Description |
|---|---|---|
| jobId | string | The job to fetch the form for (required). |
Example
{ "jobId": "anthropic-ai-engineer-1" }{
"status": "ok",
"fields": [
{ "key": "why_join", "label": "Why do you want to join?",
"type": "textarea", "required": true, "group": "screening" },
{ "key": "work_auth", "label": "Are you authorized to work in the US?",
"type": "select", "options": ["Yes", "No"], "group": "standard" }
]
}If no form is stored, the tool returns { "status": "not_available", "applyUrl": "…" }.
get_learning_content
Fetch interview prep, portfolio projects, and roadmaps from the open-source landedjobs library. Always free.
| Parameter | Type | Description |
|---|---|---|
| topic | string | Free-text topic, e.g. "RAG". |
| role | string | Filter by role. |
| category | 'interview-prep' | 'portfolio' | 'roadmap' | 'jobs' | Content category. |
Example
{ "category": "interview-prep", "role": "ai-engineer" }{
"items": [
{
"kind": "repo",
"title": "awesome-ai-engineer-interview",
"url": "https://github.com/landedjobs/awesome-ai-engineer-interview",
"description": "267 questions, 12 company guides, worked designs.",
"category": "interview-prep",
"contentTypes": ["questions", "guides"]
}
]
}Errors
When an anonymous budget is exhausted, metered tools return a structured, agent-friendly error with the signup URL:
{
"error": "quota_exhausted",
"message": "Your free budget is used up. Create a free account, mint an API token in Settings, and set it as the Authorization: Bearer header to continue.",
"remaining": 0,
"signupUrl": "https://landed.jobs/signup"
}Support
Explore the same data on the web, or grab a token to go unmetered.