Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.nico-jobagent.com/llms.txt

Use this file to discover all available pages before exploring further.

MCP Server

Nico exposes a Model Context Protocol (MCP) server that allows AI assistants like Claude to interact with your job applications directly.

What can the MCP server do?

The MCP server provides 7 tools:
ToolTypeDescription
list_job_applicationsReadList your job applications with filtering
search_job_applicationsReadSearch your saved applications by URL or company name
get_job_applicationReadGet full details of a specific application
parse_job_application_urlReadExtract structured data from a job posting URL
search_job_postingsReadSearch Nico’s global job postings index
create_proposed_job_applicationWriteAdd a new proposed job to your board
add_note_to_job_applicationWriteAdd a note to an existing application

Connecting Claude Desktop

To use Nico with Claude Desktop, add this to your Claude Desktop configuration:
{
  "mcpServers": {
    "nico-jobagent": {
      "url": "https://mcp.nico-jobagent.com/mcp",
      "authorization_token": "YOUR_OAUTH_TOKEN"
    }
  }
}
The MCP server requires OAuth authentication with the mcp scope. See OAuth for how to obtain a token.

Tools reference

list_job_applications

List job applications with optional filtering and pagination. Parameters:
ParameterTypeRequiredDescription
statusstringNoFilter by status group: draft, applied, interviewing, offer, finished, active
pageintegerNoPage number (default: 1)
per_pageintegerNoItems per page (default: 25)
Example response:
{
  "job_applications": [
    {
      "id": 42,
      "title": "Senior Product Manager",
      "status": "applied",
      "company": {
        "id": 7,
        "name": "Acme Corp"
      },
      "url": "https://acme.com/careers/pm-senior",
      "location": "Berlin, Germany",
      "work_mode": "hybrid",
      "created_at": "2025-03-15T10:30:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "total_pages": 3,
    "total_count": 52
  }
}

search_job_applications

Search for job applications by URL (exact match) or company name (case-insensitive). Parameters:
ParameterTypeRequiredDescription
urlstringNo*Search by exact job posting URL
company_namestringNo*Search by company name (case-insensitive)
statusstringNoFilter results by status group
*At least one of url or company_name is required. Example response (search by URL):
{
  "exists": true,
  "count": 1,
  "job_applications": [
    {
      "id": 42,
      "title": "Senior Product Manager",
      "status": "applied",
      "company": {
        "name": "Acme Corp"
      }
    }
  ]
}

get_job_application

Get the full details of a specific job application, including interviews, notes, and status history. Parameters:
ParameterTypeRequiredDescription
idintegerYesThe job application ID
Example response:
{
  "id": 42,
  "title": "Senior Product Manager",
  "status": "applied",
  "kanban_category": "applied",
  "company": {
    "id": 7,
    "name": "Acme Corp",
    "url": "https://acme.com"
  },
  "url": "https://acme.com/careers/pm-senior",
  "location": "Berlin, Germany",
  "work_mode": "hybrid",
  "salary_min": 80000,
  "salary_max": 100000,
  "currency": "EUR",
  "period": "annual",
  "employment_type": "full-time",
  "interviews": [],
  "notes": [],
  "created_at": "2025-03-15T10:30:00Z"
}

parse_job_application_url

Extract structured job data from a job posting URL. Nico automatically detects the job board and parses the posting. Parameters:
ParameterTypeRequiredDescription
urlstringYesURL of the job posting to parse
Example response:
{
  "title": "Senior Product Manager",
  "company": "Acme Corp",
  "location": "Berlin, Germany",
  "work_mode": "hybrid",
  "salary_min": 80000,
  "salary_max": 100000,
  "currency": "EUR",
  "period": "annual",
  "employment_type": "full-time"
}
Use parse_job_application_url before create_proposed_job_application to extract job details automatically — then pass the parsed data to the create tool.

search_job_postings

Search Nico’s global job postings index — the same data behind the in-app job search at /jobs. Returns the most recent matching postings, newest-first.
This searches Nico’s shared posting index, not the user’s own job applications. To check “have I already saved this?”, use search_job_applications instead.
Parameters:
ParameterTypeRequiredDescription
country_codestringYesISO 3166-1 alpha-2 country code, e.g. US or NL. Always required.
titlestring[]NoTitle phrases ORed together. Each phrase is a case-insensitive substring match. Example: ["backend engineer", "staff engineer"]
regionstringNoState/province name (case-insensitive). Required when city is set and country_code is US or CA.
citystringNoCity name for radius search. Looked up exactly against Nico’s geocoded locations index — no external geocoding is performed. Returns an error if the city is unknown or ambiguous.
radius_kmintegerNoSearch radius in km around the resolved city (default 25). Only used when city is set.
work_modestring[]NoOne or more of remote, onsite. Hybrid postings surface under either filter.
employersstring[]NoFilter to postings at these employers. Pass employer names — lookup is case-insensitive. Each name must resolve to exactly one employer; unknown or ambiguous names return an error. Example: ["Anthropic", "Stripe"]
limitintegerNoMax results (default 20, max 100)
City radius search: Pass city together with country_code (plus region for US/CA) to filter postings within radius_km of that city. Cities are resolved by exact, case-insensitive match against Nico’s existing geocoded-locations index — there is no live geocoding fallback, so unknown or ambiguous names return an error rather than a best-guess match.
{
  "city": "Amsterdam",
  "country_code": "NL",
  "radius_km": 50
}
{
  "city": "Springfield",
  "region": "Illinois",
  "country_code": "US",
  "radius_km": 50
}
Errors: The tool returns a single-key error object when the request can’t proceed:
{ "error": "country_code is required" }
Other error messages you may see:
  • country_code is requiredcountry_code is mandatory on every call.
  • region (state/province) is required for city search in US (or CA) — region must be set when city is given and the country is US or CA.
  • Location not found: <city> — the city wasn’t found in Nico’s geocoded locations index.
  • Ambiguous location: multiple matches for <city> — please refine — more than one row matched; narrow with region.
  • Unknown employer: <name> — a name in employers didn’t match any employer.
  • Ambiguous employer: multiple matches for <name> — please refine — a name in employers matched more than one employer; refine the spelling.
  • Job search is not enabled for this account — the calling account doesn’t have job search enabled.
Example response:
{
  "job_postings": [
    {
      "id": "019e1e37-ff01-7870-a56a-7b316b2d2373",
      "title": "Senior Backend Engineer",
      "company_name": "Acme Co",
      "company_id": "019e1e37-aa01-7870-a56a-7b316b2d2374",
      "location": "San Francisco, CA / Hybrid",
      "work_mode": "hybrid",
      "employment_type": "full-time",
      "salary_min": 150000,
      "salary_max": 200000,
      "salary_currency": "USD",
      "salary_period": "annual",
      "posted_at": "2026-05-12T08:00:00Z",
      "url": "https://acme.test/jobs/be-eng"
    }
  ],
  "count": 1
}
After finding a relevant posting, pass its url to parse_job_application_url to extract richer structured fields, then create_proposed_job_application to add it to the user’s board.

create_proposed_job_application

Create a new job application in proposed status. The job owner must approve it before it moves forward. Parameters:
ParameterTypeRequiredDescription
titlestringYesJob title
company_namestringYesCompany name (creates company if it doesn’t exist)
urlstringNoJob posting URL
locationstringNoJob location
work_modestringNoOne of: remote, remote-optional, hybrid, on-site
salary_minnumberNoMinimum salary
salary_maxnumberNoMaximum salary
currencystringNoSalary currency (e.g., USD, EUR)
periodstringNoPay period (e.g., annual, monthly)
employment_typestringNoOne of: full-time, part-time, contract, internship, temporary
Idempotency: If a job application with the same URL already exists, the existing application is returned instead of creating a duplicate. Example response:
{
  "id": 43,
  "title": "Senior Product Manager",
  "status": "proposed",
  "company": {
    "name": "Acme Corp"
  },
  "created": true
}

add_note_to_job_application

Add a note to an existing job application. Parameters:
ParameterTypeRequiredDescription
job_application_idintegerYesThe job application ID
contentstringYesThe note text
Example response:
{
  "id": 156,
  "content": "Strong match for the candidate's background in product analytics.",
  "created_at": "2025-03-15T14:20:00Z",
  "author": "Job Search Bot"
}