Skip to main content
Glama
Recruit CRM MCP

Recruit CRM MCP

by ebragas

Recruit CRM MCP

CI

MCP (Model Context Protocol) server for Recruit CRM, enabling AI assistants to search candidates, view jobs, and manage recruiting workflows.

Quick Start

macOS / Linux — run in Terminal:

curl -LsSf https://raw.githubusercontent.com/ebragas/recruitcrm-mcp/main/install.sh | bash

Windows — run in PowerShell:

powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/ebragas/recruitcrm-mcp/main/install.ps1 | iex"

The installer will:

  • Install uv if you don't have it

  • Prompt for your Recruit CRM API key

  • Back up your existing Claude Desktop config

  • Add the Recruit CRM MCP server entry

macOS / Linux:

curl -LsSf https://raw.githubusercontent.com/ebragas/recruitcrm-mcp/main/install.sh -o install.sh
cat install.sh   # review the script
bash install.sh

Windows:

Invoke-WebRequest -Uri https://raw.githubusercontent.com/ebragas/recruitcrm-mcp/main/install.ps1 -OutFile install.ps1
Get-Content install.ps1   # review the script
powershell -ExecutionPolicy Bypass -File .\install.ps1

Already have uv? You can skip the bootstrap and run the installer directly:

uvx --from recruit-crm-mcp recruit-crm-mcp-install

Manual Setup

If you prefer to configure manually, add to your claude_desktop_config.json:

{
  "mcpServers": {
    "recruit-crm": {
      "command": "uvx",
      "args": ["--refresh-package", "recruit-crm-mcp", "recruit-crm-mcp"],
      "env": {
        "RECRUIT_CRM_API_KEY": "your-api-key-here"
      }
    }
  }
}

Why --refresh-package? Without it, uvx caches the installed venv and reuses it indefinitely — you'd stay on whichever version was installed first, even after we publish bug fixes. The flag forces uvx to re-fetch the package's PyPI index entry on each Claude Desktop launch (~100 ms warm) and pull a newer version when available. Auto-updates without you running anything.

Installing a pre-release (test) build

Pre-release builds (e.g. 0.16.0rc1) are published to PyPI for internal testing. They are not picked up by the default installer or by a bare uvx recruit-crm-mcp — you have to pin them explicitly.

To run a pre-release once from the command line:

uvx recruit-crm-mcp@0.16.0rc1

To use a pre-release with Claude Desktop, edit claude_desktop_config.json and change the args entry to include the version pin:

{
  "mcpServers": {
    "recruit-crm": {
      "command": "uvx",
      "args": ["recruit-crm-mcp@0.16.0rc1"],
      "env": {
        "RECRUIT_CRM_API_KEY": "your-api-key-here"
      }
    }
  }
}

Fully quit and reopen Claude Desktop (the app keeps running in the dock after closing the window).

To roll back to stable, set args back to ["--refresh-package", "recruit-crm-mcp", "recruit-crm-mcp"] (or pin a specific stable like ["recruit-crm-mcp@0.15.0"]) and restart Claude Desktop.

Why other users are safe. uvx's default resolver strategy is --prerelease=if-necessary: pre-releases are skipped unless no stable version satisfies the spec. Because recruit-crm-mcp has a stable release on PyPI, the unpinned uvx recruit-crm-mcp in the default installer's config resolves to the latest stable and never picks up a pre-release. Only an explicit pin like @0.16.0rc1 opts in.

Development

uv sync              # install dependencies
make test            # run tests
make lint            # run linter
make check           # run lint + tests

Related MCP server: trackly-cli

Tools

Tool

Description

ping

Health check — verify the server is running and API key is configured

Candidates

Tool

Description

search_candidates

Search candidates by name, email, LinkedIn, phone, state, country, or created/updated date range

get_candidate

Get full profile details for a candidate by slug/ID

create_candidate

Create a new candidate record

update_candidate

Update standard fields on an existing candidate

set_candidate_custom_fields

Set custom-field values on a candidate without touching standard fields

Jobs

Tool

Description

list_jobs

List job requisitions in reverse chronological order

search_jobs

Search jobs by status, name, city, country, company, owner, or created/updated date range

get_job

Get full details for a job by slug/ID

create_job

Create a new job requisition (requires name, openings, company_slug, contact_slug, description, currency, application form flag)

update_job

Update standard fields on an existing job

set_job_custom_fields

Set custom-field values on a job without touching standard fields

get_assigned_candidates

List candidates assigned to a job (optionally filtered by hiring stage)

Contacts

Tool

Description

search_contacts

Search contacts by name, email, LinkedIn, phone, company_slug, owner, or date range

get_contact

Get full details for a contact by slug

create_contact

Create a new contact record

update_contact

Update standard fields on an existing contact

set_contact_custom_fields

Set custom-field values on a contact without touching standard fields

Companies

Tool

Description

search_companies

Search companies by name, owner, off-limit flag, or date range (supports sort and exact match)

get_company

Get full details for a company by slug

create_company

Create a new company record

update_company

Update standard fields on an existing company

set_company_custom_fields

Set custom-field values on a company without touching standard fields

Notes / Tasks / Meetings

Tool

Description

search_notes

Search notes by added_from/to and updated_from/to

get_note

Get a note by ID

create_note

Create a note attached to a candidate, job, contact, or company

delete_note

Delete a note by ID

search_tasks

Search tasks by title, owner, and created/updated/starting date ranges

get_task

Get a task by ID

create_task

Create a task attached to a related entity, with optional reminder

update_task

Update fields on an existing task

search_meetings

Search meetings by title, owner, and created/updated/starting date ranges

get_meeting

Get a meeting by ID

log_meeting

Log (create) a meeting against a related entity with attendees and timing

update_meeting

Update fields on an existing meeting

Assignments

Tool

Description

assign_candidate

Assign a candidate to a job

unassign_candidate

Remove a candidate-job assignment

update_hiring_stage

Move a candidate's hiring stage on a job

Files

Tool

Description

upload_file

Attach a public-URL file to a candidate, company, contact, or job

Users / Lookups

Tool

Description

list_users

List team members/users

list_note_types

Enumerate note type IDs and labels

list_meeting_types

Enumerate meeting type IDs and labels

list_task_types

Enumerate task type IDs and labels

list_hiring_pipelines

List hiring pipelines configured in the account

list_hiring_pipeline_stages

Stages for a hiring pipeline (pipeline_id=0 = master)

list_contact_stages

List sales pipeline stages (contact stages)

list_industries

List industries available in the account

list_company_custom_fields

Custom-field definitions for companies

list_contact_custom_fields

Custom-field definitions for contacts

list_job_custom_fields

Custom-field definitions for jobs

list_candidate_custom_fields

Custom-field definitions for candidates

Feedback

Tool

Description

report_issue

Build a prefilled GitHub Issues URL the user can click to file a bug report

Resources

Resource

Description

recruitcrm://candidate/{id}/resume

Get resume URL for a candidate

recruitcrm://job/{id}/description

Get full job description

Configuration

Set environment variables in your MCP client config (e.g. claude_desktop_config.json's env block):

Var

Required

Default

Description

RECRUIT_CRM_API_KEY

yes

—

Recruit CRM API token.

RECRUIT_CRM_MCP_SENTRY_DSN

no

unset

Your own Sentry project DSN. If set, tool-call exceptions and per-tool usage telemetry are auto-reported to that project. See Error reporting below.

SENTRY_DSN

no

unset

Fallback DSN if you already export it globally. RECRUIT_CRM_MCP_SENTRY_DSN takes precedence.

RECRUIT_CRM_MCP_ENV

no

production

Sentry environment tag.

RECRUIT_CRM_MCP_SENTRY_TRACES_RATE

no

1.0

Sentry trace sample rate (0.0–1.0). Defaults to full sampling so the MCP Dashboard populates immediately. Lower it (e.g. 0.2) if you're on a tight Sentry quota. Set 0.0 to disable tracing while keeping error capture.

Error reporting

Two complementary, fully optional channels for surfacing problems:

1. report_issue MCP tool (always available)

When something goes wrong and you want to send a structured bug report, ask Claude to "report this issue" or "file a bug." The MCP exposes a report_issue tool that builds a prefilled GitHub Issues URL — Claude returns the link, you click it, GitHub opens the new-issue form pre-populated with the summary, the last error, and your environment details. Submit it from your browser like any other issue. Works with any GitHub account; no token in the MCP, no collaborator access needed, repo is public.

2. Sentry auto-capture (bring-your-own-DSN)

If you want passive observability — every tool-call exception captured automatically with stack trace, span context, and HTTP breadcrumbs, plus a populated MCP Dashboard showing which tools your users actually call — set RECRUIT_CRM_MCP_SENTRY_DSN to a Sentry project DSN that you control. With no DSN set (the default), the MCP makes zero network calls to Sentry.

This is strictly bring-your-own-DSN. We do not publish or embed a project DSN. If you want this, sign up for a free Sentry account, create a Python project, copy its DSN, and put it in your MCP client config:

{
  "mcpServers": {
    "recruit-crm": {
      "command": "uvx",
      "args": ["--refresh-package", "recruit-crm-mcp", "recruit-crm-mcp"],
      "env": {
        "RECRUIT_CRM_API_KEY": "...",
        "RECRUIT_CRM_MCP_SENTRY_DSN": "https://<key>@<org>.ingest.sentry.io/<project>"
      }
    }
  }
}

What you get in your Sentry project:

  • Errors. Tool name, exception type, stack trace, HTTPX breadcrumbs (URLs and status codes), MCP request/session IDs, and the package version.

  • Usage telemetry. Every tool invocation is captured as a span (traces_sample_rate defaults to 1.0), tagged with tool name, arguments, result, duration, and transport. These populate Sentry's MCP Dashboard — per-tool request count, error rate, p95 latency, client distribution. This is how you find out which tools your users actually use.

Recruit CRM data flowing through tools (candidate names, emails, company info) will appear in span and event payloads — that's the point, since both errors and usage analysis are unhelpful without the data that triggered them. Because the DSN is yours, the data only goes to your Sentry project.

If transaction volume is a concern (free Sentry plans cap at 5K events/month), set RECRUIT_CRM_MCP_SENTRY_TRACES_RATE=0.2 for 20% sampling, or 0.0 to disable tracing entirely while keeping error capture.

Privacy

  • No telemetry by default. With no Sentry DSN configured, the MCP makes zero network calls to anyone except api.recruitcrm.io.

  • No DSN is bundled. We do not embed our own Sentry DSN — Sentry capture only works if you supply your own.

  • report_issue is explicit-consent. It only builds a clickable URL; nothing is sent until you submit the prefilled form in your browser.

  • Public repo issues. Reports filed via report_issue are publicly visible on GitHub. Don't paste secrets or PII you wouldn't want public.

Available Tools

53 tools
assign_candidateB

Assign a candidate to a job via POST /v1/candidates/{slug}/assign.

The target job is passed as a query param. No body is needed.

Inputs: candidate_slug (required), job_slug (required). Returns: Compact success response from a write tool.

create_candidateC

Create a candidate via POST /v1/candidates.

first_name is the only required field. current_organization_slug links the candidate to an existing company record; current_organization is the free-text fallback.

Inputs: first_name (required), last_name, email, contact_number, +13 more. Returns: Compact success response from a write tool.

create_companyA

Create a company via POST /v1/companies.

company_name is the only required field. Use list_industries to resolve industry_id and list_company_custom_fields to discover valid custom_fields field_ids.

Inputs: company_name (required), about_company, website, industry_id, +6 more. Returns: Compact success response from a write tool.

create_contactA

Create a contact via POST /v1/contacts.

first_name and last_name are required. company_slug accepts a comma-separated string for multi-company associations. Use list_contact_stages to resolve stage_id.

Inputs: first_name (required), last_name (required), email, contact_number, +9 more. Returns: Compact success response from a write tool.

create_jobA

Create a job requisition via POST /v1/jobs.

Seven fields are required: name, company_slug, contact_slug, number_of_openings, currency_id, enable_job_application_form, job_description_text.

job_status codes: 0=Closed, 1=Open, 2=On Hold, 3=Cancelled. job_location_type codes: 0=On-site, 1=Remote, 2=Hybrid.

Use list_hiring_pipelines for hiring_pipeline_id and list_job_custom_fields for custom_fields.

Inputs: name (required), company_slug (required), contact_slug (required), number_of_openings (required), +14 more. Returns: Compact success response from a write tool.

create_noteA

Create a note via POST /v1/notes.

description accepts Markdown — paragraphs, - bullets, **bold**, *italic*, and [links](url) render correctly in the Recruit CRM UI. The MCP layer converts to HTML before posting and back to Markdown on read.

related_to is the primary anchor entity. Use associated to cross-link the note to additional candidates/companies/contacts/jobs/deals.

Inputs: description (required), related_to (required), note_type_id, associated. Returns: Compact success response from a write tool.

create_taskB

Create a task via POST /v1/tasks.

start_date uses ISO 8601 (e.g. 2025-04-29T18:30:00Z). related_to is optional but recommended for easy discovery. reminder accepts: -1 (no reminder), 0, 15, 30, 60, 1440 (minutes before); defaults to 1440 (1 day before). description accepts Markdown — converted to HTML before POST so the Recruit CRM UI renders bullets/bold/links correctly.

Inputs: title (required), start_date (required), description, reminder, +4 more. Returns: Compact success response from a write tool.

delete_noteA

Delete a note via DELETE /v1/notes/{id}.

Returns a WriteResult with the deleted id for trace.

Inputs: note_id (required). Returns: Compact success response from a write tool.

get_assigned_candidatesA

Get candidates assigned to a specific job and their hiring stage.

Returns candidate summaries with their current hiring status for the given job. Use status_id to filter by a specific hiring stage.

Inputs: job_slug (required), status_id, limit. Returns: result

get_candidateB

Get full profile details for a specific candidate by slug or ID.

Inputs: candidate_id (required). Returns: object

get_companyA

Get full details for a specific company by slug.

Inputs: company_slug (required). Returns: object

get_contactA

Get full details for a specific contact by slug.

Inputs: contact_slug (required). Returns: object

get_jobA

Get full details for a specific job by slug or ID.

Inputs: job_id (required). Returns: object

get_meetingA

Get full details for a specific meeting by ID.

The description field is normalized from the CRM's stored HTML to Markdown before being returned to the model.

Inputs: meeting_id (required). Returns: object

get_noteA

Get full details for a specific note by ID.

The description field is normalized from the CRM's stored HTML to Markdown before being returned to the model.

Inputs: note_id (required). Returns: object

get_taskA

Get full details for a specific task by ID.

The description field is normalized from the CRM's stored HTML to Markdown before being returned to the model.

Inputs: task_id (required). Returns: object

list_candidate_custom_fieldsA

List all candidate custom fields defined in the account.

Returns {id, label} pairs where id is the field_id and label is the field name.

Inputs: no named parameters. Returns: result

list_company_custom_fieldsA

List all company custom fields defined in the account.

Returns {id, label} pairs where id is the field_id and label is the field name.

Inputs: no named parameters. Returns: result

list_contact_custom_fieldsA

List all contact custom fields defined in the account.

Returns {id, label} pairs where id is the field_id and label is the field name.

Inputs: no named parameters. Returns: result

list_contact_stagesA

List sales pipeline stages (contact stages).

Returns {id, label} pairs for each stage in the sales pipeline.

Inputs: no named parameters. Returns: result

list_hiring_pipelinesA

List all hiring pipelines configured in the account.

Pipeline ID 0 is the master hiring pipeline. Use list_hiring_pipeline_stages with the returned id to inspect stages for a specific pipeline.

Inputs: no named parameters. Returns: result

list_hiring_pipeline_stagesA

List hiring pipeline stages for a given pipeline.

Use pipeline_id=0 for the master hiring pipeline. Returns {id, label} stage entries suitable for filtering assigned candidates by hiring stage.

Inputs: pipeline_id (required). Returns: result

list_industriesA

List all industries available in the account.

Returns {id, label} pairs suitable for populating a company's industry_id.

Inputs: no named parameters. Returns: result

list_job_custom_fieldsA

List all job custom fields defined in the account.

Returns {id, label} pairs where id is the field_id and label is the field name.

Inputs: no named parameters. Returns: result

list_jobsA

List job requisitions without any filters.

Returns jobs in reverse chronological order. Use search_jobs instead when you need to filter by status or other fields.

Inputs: limit. Returns: result

list_meeting_typesA

List all meeting types available in the account.

Returns {id, label} pairs suitable for passing as meeting_type_id on meeting writes.

Inputs: no named parameters. Returns: result

list_note_typesA

List all note types available in the account.

Returns {id, label} pairs suitable for passing as note_type_id on note writes.

Inputs: no named parameters. Returns: result

list_task_typesA

List all task types available in the account.

Returns {id, label} pairs suitable for passing as task_type_id on task writes.

Inputs: no named parameters. Returns: result

list_usersA

List all team members/users.

Useful for discovering owner IDs to use with the search_jobs owner_id filter. Returns id, name, email, and role for each user.

Inputs: no named parameters. Returns: result

log_meetingA

Log a meeting via POST /v1/meetings.

Dates use ISO 8601 (e.g. 2025-04-29T18:30:00Z). related_to is the primary anchor entity. Use associated to cross-link the meeting to additional candidates/companies/contacts/jobs/deals. attendee_users expects integer user IDs; attendee_contacts and attendee_candidates expect slug strings. reminder accepts: -1 (no reminder), 0, 15, 30, 60, 120, 1440 (minutes before). do_not_send_calendar_invites defaults to True — safe for historical logging; set False to actually send invites to attendees. description accepts Markdown — converted to HTML before POST so the Recruit CRM UI renders bullets/bold/links correctly.

Inputs: title (required), start_date (required), end_date (required), related_to (required), +10 more. Returns: Compact success response from a write tool.

pingA

Check that the Recruit CRM MCP server is running and configured.

Inputs: no named parameters. Returns: object

report_issueA

Build a prefilled GitHub issue URL the user can click to report a bug.

Use when the user wants to flag unexpected behavior in this MCP server (not a Recruit CRM data issue). Returns a URL that opens the public repo's new-issue form pre-populated with the summary, last error, and environment details — the user clicks it and submits in their browser.

Pass any recent exception text via last_error so the report includes triage detail. Long inputs are truncated to fit GitHub's URL length limit.

Inputs: summary (required), last_error, additional_context. Returns: object

search_candidatesA

Search for candidates by name, email, location, or date range.

Provide at least one filter for targeted results. Filters are combined with AND logic. With no filters, returns a paginated list of recent candidates. Date params use YYYY-MM-DD format. Returns a list of matching candidate summaries.

Inputs: first_name, last_name, email, state, +6 more. Returns: result

search_companiesA

Search for companies by name, date range, or owner.

Provide at least one filter for targeted results. Filters are combined with AND logic. With no filters, returns a paginated list of recent companies. Date params use YYYY-MM-DD format. sort_by accepts 'createdon' or 'updatedon'. sort_order accepts 'asc' or 'desc'. Set exact_search=True for exact name matching (default is fuzzy/like matching). Use list_users to find valid owner_id values.

Inputs: company_name, created_from, created_to, updated_from, +6 more. Returns: result

search_contactsA

Search for contacts by name, email, company, or date range.

Provide at least one filter for targeted results. Filters are combined with AND logic. With no filters, returns a paginated list of recent contacts. Date params use YYYY-MM-DD format.

Inputs: first_name, last_name, email, linkedin, +8 more. Returns: result

search_jobsA

Search for jobs by status, name, location, company, date range, or owner.

Filters are optional and combined with AND logic. Status accepts a label: 'Open', 'On Hold', 'Closed', 'Placed', 'Canceled', 'Refill'. Date params use YYYY-MM-DD format. Use list_users to find valid owner_id values. With no filters, returns an empty list.

Inputs: status, name, city, country, +7 more. Returns: result

search_meetingsA

Search for meetings by title, date range, or owner.

Provide at least one filter for targeted results. Filters are combined with AND logic. With no filters, returns a paginated list of recent meetings. Date params use YYYY-MM-DD format. Use list_users to find valid owner_id values.

Inputs: title, created_from, created_to, updated_from, +5 more. Returns: result

search_notesA

Search for notes by date range.

Provide at least one filter for targeted results. Filters are combined with AND logic. With no filters, returns a paginated list of recent notes. Date params use YYYY-MM-DD format.

Inputs: created_from, created_to, updated_from, updated_to, +1 more. Returns: result

search_tasksA

Search for tasks by title, date range, or owner.

Provide at least one filter for targeted results. Filters are combined with AND logic. With no filters, returns a paginated list of recent tasks. Date params use YYYY-MM-DD format. Use list_users to find valid owner_id values.

Inputs: title, created_from, created_to, updated_from, +5 more. Returns: result

set_candidate_custom_fieldsB

Set custom-field values on a candidate without touching any standard fields.

Inputs: slug (required), fields (required). Returns: Compact success response from a write tool.

set_company_custom_fieldsA

Set custom-field values on a company without touching any standard fields.

Thin wrapper over update_company — the edit endpoint accepts custom_fields inline (there is no separate associated-fields endpoint for companies).

Inputs: slug (required), fields (required). Returns: Compact success response from a write tool.

set_contact_custom_fieldsB

Set custom-field values on a contact without touching any standard fields.

Inputs: slug (required), fields (required). Returns: Compact success response from a write tool.

set_job_custom_fieldsA

Set custom-field values on a job without touching any standard fields.

Inputs: slug (required), fields (required). Returns: Compact success response from a write tool.

unassign_candidateB

Unassign a candidate from a job via POST /v1/candidates/{slug}/unassign.

Inputs: candidate_slug (required), job_slug (required). Returns: Compact success response from a write tool.

update_candidateB

Update a candidate via partial POST to /v1/candidates/{slug}.

Only non-None fields are forwarded; omitted fields are preserved server-side (the API's required first_name is kept automatically).

Inputs: slug (required), first_name, last_name, email, +14 more. Returns: Compact success response from a write tool.

update_companyA

Update a company via partial POST to /v1/companies/{slug}.

Only non-None fields are forwarded; omitted fields are preserved server-side (the API's required company_name is kept automatically).

Inputs: slug (required), company_name, about_company, website, +7 more. Returns: Compact success response from a write tool.

update_contactA

Update a contact via partial POST to /v1/contacts/{slug}.

Only non-None fields are forwarded; omitted fields are preserved server-side.

Inputs: slug (required), first_name, last_name, email, +10 more. Returns: Compact success response from a write tool.

update_hiring_stageA

Update a candidate's hiring stage for a specific job.

POST /v1/candidates/{candidate_slug}/hiring-stages/{job_slug}. Use list_hiring_pipeline_stages to resolve status_id for the correct pipeline.

Inputs: candidate_slug (required), job_slug (required), status_id (required), remark, +2 more. Returns: Compact success response from a write tool.

update_jobA

Update a job requisition via partial POST to /v1/jobs/{slug}.

Only non-None fields are forwarded; omitted fields are preserved server-side.

Only the fields most commonly edited are exposed; use the full create_job surface area if you need to change other fields.

Inputs: slug (required), name, job_status, job_location_type, +5 more. Returns: Compact success response from a write tool.

update_meetingA

Update a meeting via partial POST to /v1/meetings/{id}.

Only non-None fields are forwarded; omitted fields are preserved server-side. Attendee and association lists are joined into comma-separated strings to match the create-endpoint shape. description accepts Markdown.

Inputs: meeting_id (required), title, start_date, end_date, +11 more. Returns: Compact success response from a write tool.

update_noteA

Update an existing note via POST /v1/notes/{id} — partial update.

Only provided fields are sent; omitted fields are preserved server-side.

description accepts Markdown (see create_note). Use associated to add cross-links to additional candidates/companies/ contacts/jobs/deals.

Inputs: note_id (required), description, note_type_id, associated. Returns: Compact success response from a write tool.

update_taskA

Update an existing task via partial POST to /v1/tasks/{id}.

Only non-None fields are forwarded; omitted fields are preserved. task_type_id is the integer ID from list_task_types; omit to keep current type. description accepts Markdown. NOTE: marking a task complete is not supported by the Recruit CRM API on this endpoint — the status field is silently ignored (see CLAUDE.md). Delete the task or use the RCRM UI instead.

Inputs: task_id (required), title, start_date, description, +2 more. Returns: Compact success response from a write tool.

upload_fileA

Upload a file to Recruit CRM via POST /v1/files (multipart).

file_url must be a publicly reachable URL — the Recruit CRM backend fetches the bytes itself. folder is the destination folder name (a sensible default is Uploads). related_to anchors the file to a specific CRM entity.

Inputs: file_url (required), related_to (required), folder. Returns: Compact success response from a write tool.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 53 tools

    Disambiguation5/5

    Each tool targets a distinct resource-action pair, with clear descriptions avoiding overlap. Terms like assign vs. update_hiring_stage and list vs. search are well-differentiated.

    Naming Consistency4/5

    The vast majority follow a consistent verb_noun snake_case pattern. Minor deviations include ping and report_issue, which are not data operations but are still verb_noun and do not significantly disrupt consistency.

    Tool Count2/5

    53 tools is far beyond the typical well-scoped range (3-15). While a CRM may require many endpoints, this large surface area is likely to overwhelm agents and reduce coherence.

    Completeness3/5

    Core CRUD operations exist for most entities, but there are notable gaps: missing delete tools for candidates, companies, contacts, jobs, tasks, and meetings, and missing list_all tools for candidates, companies, and contacts. Search tools partially fill the gap but cannot replace simple listing.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      This MCP server provides hiring automation tools for recruitment processes. It enables users to generate job descriptions, score CVs, create interview questions, benchmark salaries, and draft offer letters through natural language interactions.
      16 npm
      31 PyPI
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.
      839 npm
      3
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      MCP server enabling AI assistants to connect to Kula recruiting API for managing jobs, candidates, applications, webhooks, and more.
      84
      401 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for Hunaras, an AI-native recruiting platform that enables candidates and employers to manage jobs, applications, assessments, and talent sourcing through natural language.
      5 npm
      MIT