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_jobsSearch the live AI-native job index, ranked by fit.
  • get_job_formRead a job’s application-form fields so your agent can pre-draft answers.
  • get_learning_contentPull 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:

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:

bash
claude mcp add --transport http landed https://mcp.landed.jobs/mcp

Streamable 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:

json
{
  "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.

ToolCost
search_jobs1 unit per job returned (≤5 per call, anon)
get_job_form1 unit
get_learning_contentFree

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.

ParameterTypeDescription
querystringFree-text search (required).
rolestringCanonical role filter, e.g. "ai-engineer".
locationstringCity or region.
remote'remote' | 'hybrid' | 'onsite'Work-location filter.
senioritystringMid, Senior, Staff, …
limitnumberResults to return (anon ≤ 5, token ≤ 20).

Example

request
{
  "query": "senior AI engineer, RAG",
  "remote": "remote",
  "limit": 5
}
response
{
  "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.

ParameterTypeDescription
jobIdstringThe job to fetch the form for (required).

Example

request
{ "jobId": "anthropic-ai-engineer-1" }
response
{
  "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.

ParameterTypeDescription
topicstringFree-text topic, e.g. "RAG".
rolestringFilter by role.
category'interview-prep' | 'portfolio' | 'roadmap' | 'jobs'Content category.

Example

request
{ "category": "interview-prep", "role": "ai-engineer" }
response
{
  "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:

response
{
  "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.