Skip to main content

MCP Server

Nico exposes a Model Context Protocol (MCP) server that lets AI assistants like Claude interact with Nico directly.

What can the MCP server do?

The MCP server provides 12 tools in three groups: job posting search (job_posting_*, discover openings in Nico’s index), job application management (job_application_*, your own tracked applications), and interviews (schedule and manage interviews on your applications).
Job posting search (job_posting_search, job_posting_get) searches Nico’s shared posting index — not your own applications. To check “have I already saved this?”, use job_application_search. Posting search requires job search to be enabled for your account.

Connecting your AI assistant

The server URL for all assistants is:
Authentication is handled via OAuth — you never paste a token, API key, or client ID. Nico supports dynamic client registration, so your assistant registers itself automatically. When you add the connector, you’re redirected to Nico’s consent screen; click Authorize and you’re connected.

Claude (Desktop and claude.ai)

  1. Go to Settings → Connectors and choose Add custom connector.
  2. Enter a name (e.g. “Nico”) and the server URL above. Leave the advanced OAuth fields blank.
  3. Click Connect and approve access on Nico’s consent screen.

ChatGPT

Custom MCP connectors in ChatGPT require developer mode, which is available on paid plans (Plus, Pro, Business/Enterprise).
  1. Enable developer mode: go to Settings → Apps & Connectors → Advanced settings and turn on Developer mode.
  2. Go back to Apps & Connectors and choose Create to add a custom connector.
  3. Enter a name (e.g. “Nico”), the server URL above, and select OAuth as the authentication method. Leave the client ID and secret blank — ChatGPT registers itself automatically.
  4. Complete the connection and approve access on Nico’s consent screen.
For a visual walkthrough of enabling remote MCP servers in ChatGPT, see Enable Remote MCP Servers in ChatGPT (Step-by-Step).
The MCP server requires OAuth authentication with the mcp scope — the connector requests it automatically. See OAuth for details on the flow, scopes, and revoking access.
Search Nico’s job postings index — the same data behind the in-app job search at /jobs. Returns the most recent matching postings, newest-first, in compact form (no application URL or description — fetch those with job_posting_get). Parameters:
Don’t combine a geographic filter (region or city) with work_mode: ["remote"]. Remote postings aren’t pinned to a location, so that combination almost always returns nothing. Search remote roles by country, and use region/city for on-site or hybrid roles.
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.
Example response:
Search results omit url and description to stay compact. Take a result’s id and call job_posting_get to retrieve the application URL and the full description. Errors: The tool returns a single-key error object when the request can’t proceed:
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.

job_posting_get

Get one job posting by the id returned from job_posting_search. Returns the same fields as a search result, plus the external application url and the full description (the two fields the search list omits). Parameters: Example response:
Returns { "error": "Job posting not found" } for an unknown id. Same feature-flag gate as job_posting_search.
After finding a relevant posting, call job_posting_get for its url, then pass that URL to job_application_parse_url to extract richer structured fields, and finally job_application_create to add it to your board.

Job application management

Search your job applications by URL (exact match) or company name (case-insensitive). Parameters: *At least one of url or company_name is required. Example response (search by URL):

job_application_list

List your job applications with optional filtering and pagination. Parameters: Example response:

job_application_get

Get the full details of one job application, including its notes and interviews. Parameters: Example response:
Returns { "error": "Job application not found" } for an unknown id.

job_application_parse_url

Extract structured job data from a job posting URL. Nico automatically detects the job board and parses the posting. Parameters: Example response:
Use job_application_parse_url before job_application_create to extract job details automatically — then pass the parsed data to the create tool.

job_application_create

Create a new job application in proposed status. The account owner must approve it before it moves forward. Parameters: Idempotency: If an application with the same url already exists, the tool returns { "error": "A job application with this URL already exists", "existing_job_application_id": "<id>" } instead of creating a duplicate. Example response:

job_application_add_note

Add a note to an existing job application. Notes are visible to all team members. Parameters: Example response: