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 6 tools:
| Tool | Type | Description |
|---|
list_job_applications | Read | List your job applications with filtering |
search_job_applications | Read | Search by URL or company name |
get_job_application | Read | Get full details of a specific application |
parse_job_application_url | Read | Extract structured data from a job posting URL |
create_proposed_job_application | Write | Add a new proposed job to your board |
add_note_to_job_application | Write | Add 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.
list_job_applications
List job applications with optional filtering and pagination.
Parameters:
| Parameter | Type | Required | Description |
|---|
status | string | No | Filter by status group: draft, applied, interviewing, offer, finished, active |
page | integer | No | Page number (default: 1) |
per_page | integer | No | Items 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:
| Parameter | Type | Required | Description |
|---|
url | string | No* | Search by exact job posting URL |
company_name | string | No* | Search by company name (case-insensitive) |
status | string | No | Filter 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:
| Parameter | Type | Required | Description |
|---|
id | integer | Yes | The 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:
| Parameter | Type | Required | Description |
|---|
url | string | Yes | URL 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.
create_proposed_job_application
Create a new job application in proposed status. The job owner must approve it before it moves forward.
Parameters:
| Parameter | Type | Required | Description |
|---|
title | string | Yes | Job title |
company_name | string | Yes | Company name (creates company if it doesn’t exist) |
url | string | No | Job posting URL |
location | string | No | Job location |
work_mode | string | No | One of: remote, remote-optional, hybrid, on-site |
salary_min | number | No | Minimum salary |
salary_max | number | No | Maximum salary |
currency | string | No | Salary currency (e.g., USD, EUR) |
period | string | No | Pay period (e.g., annual, monthly) |
employment_type | string | No | One 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:
| Parameter | Type | Required | Description |
|---|
job_application_id | integer | Yes | The job application ID |
content | string | Yes | The 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"
}