A side-by-side look at the Freehire and Karea MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Freehire for workplace & productivity work as a local process; choose Karea MCP for workplace & productivity as a local process. You can also run both side by side in one mcpServers block.
FREEHIRE_TOKEN, FREEHIRE_API_URL.whoami, facets, search.KAREA_API_KEY, KAREA_URL.karea_projects, karea_tasks, karea_subtasks.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Workplace & Productivity | Workplace & Productivity |
| Quality signal | 61/100 · Good | 65/100 · Great |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | API key required |
| Pricing | Not declared | BYOK (pay the provider) |
| Required env vars | FREEHIRE_TOKENFREEHIRE_API_URL | KAREA_API_KEYKAREA_URL |
| Verified owner | Community listing | Community listing |
| GitHub stars | 3 | 1 |
| Directory activity | 1 views 0 installs 0 upvotes | 4 views 0 installs 0 upvotes |
| Tools | 32 | 12 |
| Full listing | View Freehire | View Karea MCP |
whoamiReturn the authenticated freehire user (verifies the API key). Call this to confirm auth before other tools.facetsList the market's filter vocabulary: every facet's live values with a vacancy count each, plus the skills list and numeric ranges. Call this FIRST to discover real values for `search` and `market_fit` — do not invent facet values. A filter key the API does not recognise is ignored rather than refused, so a result wrapped as {data, ignored} counted a broader market than the one asked for — retry with the suggested name before quoting any number from it.searchSearch open jobs by keyword with optional facet filters. Each result carries the job's FULL description as markdown alongside title, company, location and public_slug, plus the total match count — so you can screen a whole result set without calling `job` per hit. Use the returned slug with `job`, `apply`, `save`, etc. Two traps worth knowing. Geography (region/country/city) is ONE OR-group: passing region AND country widens rather than narrows, so drop the region to search a single country. And a filter param the API does not recognize is ignored rather than refused — the search still runs, just broader — so when a result carries an `ignored` list, its `total` answers a wider question than the one asked; retry with the suggested name before reporting the number.market_fitScore a skill list against the live open-vacancy market for a filtered role: headline coverage (% of vacancies listing ≥1 skill), must-have skills held, and the missing skills that unlock the most vacancies. Here `skills` is the MEASURED set, not a filter — use facet params to define the role. One skill probes that skill's demand.jobFetch a single job's full content by slug (title, company, location, posting URL, description).companyFetch a company and its open jobs by company slug.applyMark a job as applied for the authenticated user. Idempotent.saveBookmark a job for later. Idempotent.unsaveRemove a job's bookmark. A no-op if it was not saved.stageSet a job's application stage. The server validates the value; valid stages are applied/screening/responded/interview/offer/accepted/rejected/withdrawn.noteAttach a free-text note to a tracked job (overwrites the existing note).myList the caller's tracked jobs (viewed/saved/applied) with their stage and note. Filter narrows the set.karea_projectsProjects and their categories: list, create, delete, share, and manage the categories inside a project.
Pass one of these as `action`, with its arguments in `params`:
- karea_list_projects - List all Karea projects with their IDs [no parameters]
- karea_create_project - Create a new Karea project owned by you and seed it with the default categories (Coding, Testing, Documenting, Reviewing). [required: name]
- karea_delete_project - Permanently delete a project and everything inside it (tasks, categories, notes, history). [required: name; optional: confirm]
- karea_share_project - Give another user access to a project by email at a chosen role (owner, editor, commenter or viewer). [required: project, email; optional: role]
- karea_create_category - Create a new category (a task bucket) inside an existing project and return it. [required: name; optional: projectId]
- karea_delete_category - Permanently delete a category AND every task inside it, including history. [required: name; optional: projectId]
For the full parameter schema of any action, call karea_help with that action name.karea_tasksTasks: find them, read them, create them, change them, close them. The main entry point - start here.
Pass one of these as `action`, with its arguments in `params`:
- karea_list_tasks - List tasks in a project. [optional: projectId, status, closedSince, limit, category, priority, assignee, search]
- karea_view_task - Return one task with all its details (status, priority, deadline, recurrence, category, description, notes, requisites, links), located by visual ID, name or UUID. [required: task; optional: projectId, includeContext]
- karea_view_tasks - Return details for MANY tasks in one response. [required: tasks; optional: projectId, includeContext, includeMarkdown]
- karea_create_task - Create a new task in a project and return it with its visual ID (e.g. [required: name; optional: category, priority, sla, description, markdown, source, closingRequisites, tags, parentId, jiraIssueKey, projectId, aiSessionId, toolType, sessionLabel]
- karea_edit_task - Update fields of an existing task (title, status, priority, deadline, category, assignee, description, tags, or add a note) located by visual ID, name or UUID. [required: task; optional: name, priority, status, reviewStage, sla, description, markdown, category, note, tags, clearTags, closingRequisites, clearClosingRequisites, jiraIssueKey, linkTasks, linkType, unlinkTasks, projectId, aiSessionId, toolType, sessionLabel]
- karea_edit_tasks - Apply the SAME change to many tasks in ONE request - status, priority, category, deadline, assignee, or a note. [required: tasks; optional: projectId, status, priority, category, sla, note]
- karea_close_task - Mark a task as done: sets status to done and stamps the close time. [required: task; optional: resolution, projectId, aiSessionId, toolType, sessionLabel]
- karea_delete_task - Permanently delete a task and its history. [required: task; optional: confirm, projectId]
- karea_quick_task - Log something you already finished as a done task (it shows up in Recap) and return it. [required: description; optional: source, projectId, aiSessionId, toolType, sessionLabel]
- karea_doing - Create a task you are working on right now (status: in_progress) [required: description; optional: category, priority, sla, projectId, aiSessionId, toolType, sessionLabel]
- karea_done - Mark several tasks as done in one call, each given by visual ID or name; returns a per-task result. [required: tasks; optional: projectId]
For the full parameter schema of any action, call karea_help with that action name.karea_subtasksSubtasks and closing requisites - the checklist a task has to satisfy before it can be closed.
Pass one of these as `action`, with its arguments in `params`:
- karea_create_subtask - Create a subtask under a parent task. [required: parent, title; optional: category, priority, sla, description, markdown, source, closingRequisites, tags, jiraIssueKey, projectId, aiSessionId, toolType, sessionLabel]
- karea_list_subtasks - List subtasks of a parent task. [required: parent; optional: projectId]
- karea_add_requisite - Add a closing requisite (a checklist item that must be completed before the task may be closed) to a task, and return it. [required: task, description; optional: projectId]
- karea_toggle_requisite - Mark a closing requisite complete or incomplete, by ID. [required: task, requisiteId, completed; optional: projectId]
- karea_delete_requisite - Permanently delete a closing requisite from a task, by ID. [required: task, requisiteId; optional: projectId]
For the full parameter schema of any action, call karea_help with that action name.karea_notesNotes on a task - human-readable updates the user reads - plus the sticky-note scratch board. For private cross-session memory use karea_docs (set_context).
Pass one of these as `action`, with its arguments in `params`:
- karea_list_notes - List the notes (human-readable updates) on a task, newest first. [required: task; optional: projectId]
- karea_add_note - Add a note to a task - or the same note to many tasks at once, via `tasks`. [required: content; optional: task, tasks, projectId, aiSessionId, toolType, sessionLabel]
- karea_edit_note - Change the text of an existing note on a task, by note ID, and return the updated note. [required: task, noteId, content; optional: projectId, aiSessionId, toolType, sessionLabel]
- karea_delete_note - Permanently delete a note from a task, by note ID. [required: task, noteId; optional: projectId]
- karea_list_sticky_notes - List the user's sticky notes - the scratch pad: short reminders, commands, URLs. [optional: projectId]
- karea_create_sticky_note - Pin a short note to the user's sticky board - a command, a URL, a couple of lines to remember. [required: content; optional: title, color, projectId, pinned]
- karea_edit_sticky_note - Change a sticky note: its text, title, colour, pin state, or which project it belongs to. [required: noteId; optional: content, title, color, projectId, pinned]
- karea_delete_sticky_note - Delete a sticky note. [required: noteId]
For the full parameter schema of any action, call karea_help with that action name.karea_docsA task's long-form markdown document and its AI Context (private working memory that survives across sessions).
Pass one of these as `action`, with its arguments in `params`:
- karea_get_markdown - Read the markdown document attached to a task. [required: task; optional: projectId]
- karea_set_markdown - Write the markdown document for a task. [required: task, markdown; optional: projectId, aiSessionId, toolType, sessionLabel]
- karea_get_context - Read the task's Context - titled entries of AI working memory that hold the FULL HISTORY of a task (not just its current state): what was tried, decided, discovered, and abandoned along the way. [required: task; optional: projectId]
- karea_set_context - Write a titled entry of the task's Context - the AI-facing cross-session working memory. [required: task, context; optional: title, projectId, aiSessionId, toolType, sessionLabel]
For the full parameter schema of any action, call karea_help with that action name.karea_questionsOpen questions: things you are waiting on an answer for. Create, answer, edit, delete.
Pass one of these as `action`, with its arguments in `params`:
- karea_list_questions - List open questions (unresolved decisions or blockers) in a project, newest first. [optional: projectId, status]
- karea_create_question - Create an open question (a decision or blocker to resolve) in a project, optionally linked to tasks, and return it with its short ID (e.g. [required: question; optional: projectId, markdown, taskIds]
- karea_answer_question - Answer an open question, located by short ID or text match: sets its answer and flips its status to answered. [required: questionId, answer]
- karea_edit_question - Edit an open question: change its text, status (open, answered or cancelled), answer, or linked tasks. [required: questionId; optional: question, answer, status, markdown, taskIdsAdd, taskIdsRemove]
- karea_delete_question - Permanently delete an open question. [required: questionId]
For the full parameter schema of any action, call karea_help with that action name.karea_resourcesThe file/document library: list, read, create, update, upload, delete, and attach resources to tasks.
Pass one of these as `action`, with its arguments in `params`:
- karea_list_resources - List resources (text notes & files). [optional: projectId, query, folder, type, mime, minSize, maxSize]
- karea_get_resource - Return a resource with its full content and metadata, by ID. [required: resourceId]
- karea_create_resource - Create a text resource (a note or document) in a project or folder and return it with its ID. [required: name, content; optional: projectId, folder]
- karea_update_resource - Overwrite a text resource content and/or metadata, by ID, and return the updated resource. [required: resourceId; optional: name, content, folder]
- karea_upload_resource - Upload a binary file as a resource (base64-encoded) [required: name, data; optional: mimeType, folder, taskId]
- karea_delete_resource - Permanently delete a resource (text or file) by ID. [required: resourceId]
- karea_link_resource_to_task - Link an existing resource (text or file) to a task. [required: resourceId, task; optional: projectId]
- karea_unlink_resource_from_task - Remove the link between a resource and a task. [required: resourceId, task; optional: projectId]
For the full parameter schema of any action, call karea_help with that action name.karea_meetingsMeetings, and the tasks and open questions attached to them.
Pass one of these as `action`, with its arguments in `params`:
- karea_list_meetings - List meetings. [optional: scope, from, to, projectId]
- karea_view_meeting - Return one meeting in full: time, location, project, attendees, prep notes, transcript, linked tasks and linked open questions. [required: meetingId]
- karea_create_meeting - Create a meeting. [required: title, startAt, endAt; optional: description, location, projectId, notes, attendees]
- karea_edit_meeting - Update a meeting. [required: meetingId; optional: title, startAt, endAt, description, location, projectId, notes, transcript]
- karea_delete_meeting - Delete a meeting permanently. [required: meetingId, confirm]
- karea_link_task_to_meeting - Link an EXISTING task to a meeting (discussed at / arising from it). [required: meetingId, task; optional: projectId]
- karea_unlink_task_from_meeting - Remove the link between a task and a meeting. [required: meetingId, task; optional: projectId]
- karea_link_question_to_meeting - Link an EXISTING open question to a meeting, so it is raised there. [required: meetingId, questionId]
- karea_unlink_question_from_meeting - Remove the link between an open question and a meeting. [required: meetingId, questionId]
For the full parameter schema of any action, call karea_help with that action name.karea_remindersReminders: see what is due, create one, snooze it, dismiss it, mark it done.
Pass one of these as `action`, with its arguments in `params`:
- karea_check_reminders - Return the caller's upcoming and past-due reminders. [optional: taskId, includeDone]
- karea_create_reminder - Schedule a reminder on a task. [required: task, fireAt; optional: title, emailOptIn]
- karea_snooze_reminder - Snooze a firing reminder by N minutes. [required: reminderId, minutes]
- karea_dismiss_reminder - Dismiss a reminder - cancels it so it will not fire again. [required: reminderId]
- karea_mark_reminder_done - Fulfill a reminder: closes both the reminder AND the underlying task (status = done). [required: reminderId]
For the full parameter schema of any action, call karea_help with that action name.karea_integrationsJIRA links on a task, and AI CLI sessions linked to a task.
Pass one of these as `action`, with its arguments in `params`:
- karea_get_jira_link - Return the linked JIRA issue (key and URL) for a task, if one exists. [required: task; optional: projectId]
- karea_link_jira - Link a Karea task to a JIRA issue by issue key (e.g. [required: task, issueKey; optional: projectId]
- karea_unlink_jira - Remove the JIRA link from a Karea task [required: task; optional: projectId]
- karea_link_session - Link your current AI coding session (Claude Code, OpenCode, Codex, Cursor, Aider) to a Karea task so the user can see the session history for that task and copy a command to resume the session later. [required: task, provider, sessionId; optional: label, projectId]
- karea_list_sessions - List AI coding sessions linked to a task (provider, sessionId, label, last active, resume command). [required: task; optional: projectId]
- karea_unlink_session - Remove a previously-linked AI session from a task. [required: task, sessionRowId; optional: projectId]
For the full parameter schema of any action, call karea_help with that action name.karea_assistantAsk Karea a natural-language question about your work, or generate a recap of a period.
Pass one of these as `action`, with its arguments in `params`:
- karea_ask - Send a natural-language request to the Karea AI assistant, which may read or modify your tasks to carry it out, and return its reply. [required: message; optional: projectId]
- karea_recap - Return a summary of recent activity (tasks created, closed and updated) over a recent time window. [optional: hours, projectId]
For the full parameter schema of any action, call karea_help with that action name.karea_helpReturn the full JSON Schema and description of any Karea action, so you can call it correctly through its group tool. Read-only; changes nothing. Omit `action` to list every available action grouped by tool.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"freehire": {
"command": "npx",
"args": [
"-y",
"freehire-mcp"
],
"env": {
"FREEHIRE_TOKEN": "YOUR_FREEHIRE_TOKEN_HERE",
"FREEHIRE_API_URL": "YOUR_FREEHIRE_API_URL_HERE"
}
}
}
}
{
"mcpServers": {
"starecz-karea-mcp": {
"command": "npx",
"args": [
"-y",
"karea-mcp"
],
"env": {
"KAREA_API_KEY": "YOUR_KAREA_API_KEY_HERE",
"KAREA_URL": "YOUR_KAREA_URL_HERE"
}
}
}
}