MCP App Store
by KeenEthics
Business & Operations
Workable MCP Server icon

Workable MCP Server

by Workable Engineering

Overview

Workable MCP Server helps users work with their Workable account from ChatGPT: discover accounts, inspect jobs and candidates, manage candidate workflow actions, handle employee lookup, time off, time tracking, requisitions, offers, departments, and performance review templates.

Tools

add_comment

ChatGPT
Add a comment to a candidate. Use this tool with candidate IDs obtained from get_candidates tool.

add_review

ChatGPT
Add a review/rating to a candidate. If you are looking for add_candidate_rating, use add_review. Use this tool with candidate IDs obtained from get_candidates tool.

approve_offer

ChatGPT
Approve an offer by its ID

approve_requisition

ChatGPT
Approve a requisition by its code, as the caller. Only works on a requisition that is pending and awaiting the caller's approval; any other requisition (already approved or rejected, or waiting on another approver) is reported as not awaiting approval.

bulk_create_time_entries

ChatGPT
Create complete time entries (clock-in + clock-out) for multiple employees in a single request (max 500)

clock_in

ChatGPT
Open a clock-in for an employee

clock_out

ChatGPT
Close the currently open clock-in for an employee. Returns an array of entries closed by this clock-out

copy_candidate

ChatGPT
Copy a candidate to a different job, leaving the original candidate in place. The candidate is added to the target job at the specified stage (or the default starting stage if not provided). Use this tool with candidate IDs obtained from get_candidates tools.

create_candidate

ChatGPT
Create a new sourced candidate and attach them to a specific job identified by its shortcode. The shortcode is required — use get_jobs to find the job shortcode if unknown. At minimum provide email plus either name or firstname+lastname.

create_department

ChatGPT
Create a new department.

create_requisition

ChatGPT
Create a new requisition. The response is the stored requisition: use its code and id for follow-up calls, since the account may assign its own code and adjust the plan date. Depending on the approval workflow, the new requisition may be approved immediately (e.g. when the caller is its only approver).

create_review_cycle_template

ChatGPT
Create a new performance review cycle template with sections and questions. All body fields (template title, section body, question body) must be non-empty strings — the API rejects empty values, so use a label like "Section rating" / "Overall rating" for rating questions rather than an empty string. Valid question types: "paragraph" (long text), "star_rated" (1-5 stars), "custom_rated" (labeled scale via metadata.ratingOptions), "numeric_rated" (numeric score), "multiple_choice" (options via metadata.answerOptions.choices). To mark a question as the section-level or template-level rating, set metadata.semanticType to "section_rating" (one per section, must be a rated type) or "overall_rating" (one per template, must be a rated type).

create_talent_pool_candidate

ChatGPT
Add a candidate to the talent pool when there is no specific job to match them to but they are a good prospect for future opportunities. Unlike create_candidate, no job shortcode is needed — the candidate is stored in the talent pool and can be matched to a job later. Supports the same fields as create_candidate except answers.

create_time_entry

ChatGPT
Create a complete time entry (clock-in and clock-out) for an employee in a single call. Use clock_in / clock_out for open-ended shifts

create_timeoff_request

ChatGPT
Creates a new time off request. Use get_timeoff_categories to discover category_id values.

delete_department

ChatGPT
Delete a department by its ID. Use force to delete even if the department has associated data.

delete_member

ChatGPT
Remove (deactivate) a member from the account, revoking their access — used for offboarding workflows. This is a reversible deactivation, not a hard delete: the member can be reinstated later with enable_member. On success returns a confirmation (the endpoint returns 204 with no body). An error is returned if the member ID does not exist (404) or the member cannot be removed due to account restrictions, e.g. they are the sole admin (422).

disqualify_candidate

ChatGPT
Disqualify a candidate from a job. Use this tool with candidate IDs obtained from get_candidates or get_candidates_by_job_name tools. IMPORTANT: Before calling this tool, use get_disqualification_reasons to retrieve the available disqualification reason IDs for the account.

enable_member

ChatGPT
Re-enable (restore) a previously deactivated member, reinstating their access. This action is idempotent: enabling an already-active member succeeds as a no-op (it is not an error). On success returns a confirmation (the endpoint returns no body, and enablement may propagate asynchronously, so the member is not fetched afterwards — use get_members to read the refreshed state). An error is returned if the member ID does not exist (404) or the member could not be restored (422).

get_account_custom_attributes

ChatGPT
Get all custom attributes configured for the account. Each attribute includes a question_key ("CA_<id>"): pass it as the question_key of an answer to create_candidate / update_candidate to set the attribute on a candidate.

get_accounts

ChatGPT
Get all Workable accounts accessible to the authenticated user. Call this first to discover the available accounts before invoking any other tool, and use the returned subdomain as the account parameter.

get_candidate

ChatGPT
Get detailed information for a specific candidate by ID. Use this tool with candidate IDs obtained from get_candidates or get_candidates_by_job_name tools.

get_candidate_activities

ChatGPT
Get activities for a specific candidate by ID. Returns a list of actions taken on the candidate such as stage changes, comments, and other events.

get_candidate_activity

ChatGPT
Get details for a specific activity on a candidate.

get_candidate_detailed_fields

ChatGPT
Returns all available candidate fields with their types and search capabilities. Fields with search_field can be used as filters in search_candidates_detailed. When filter_type is "dropdown", use get_candidate_detailed_filter_options to fetch the allowed values.

get_candidate_detailed_filter_options

ChatGPT
Returns the available values for a dropdown candidate filter field. Pass the search_field value from get_candidate_detailed_fields as filter_id.

get_candidate_files

ChatGPT
List files attached to a specific candidate (resume, cover letter, and other uploaded documents). Each file includes its name, source, optional kind, and a preview URL.

get_candidate_offer

ChatGPT
Get the offer for a specific candidate by ID

get_candidates

ChatGPT
List candidates with advanced filtering options. Provide a job shortcode to list candidates for a specific job, or omit it to search across all jobs in the account (e.g. by email to resolve a candidate ID). Returns candidate IDs that can be used with get_candidate, disqualify_candidate, or move_candidate tools for further actions.

get_departments

ChatGPT
List all departments in your Workable account.

get_disqualification_reasons

ChatGPT
Get all available disqualification reasons in your Workable account

get_employee

ChatGPT
Get details for a specific employee by ID

get_employee_documents

ChatGPT
List documents associated with a specific employee. Supports filtering by document type. If you do not have the employee ID, use the get_employees tool first to look it up by name or email. Document types: - simple_employee_document: documents uploaded directly to the employee profile. - signature_request_employee_document: documents created from a signature request. - timeoff_attachment: files attached to time off requests. - i_9_form_document: I-9 employment eligibility verification form documents (US-only). Access requires the caller to be the employee themselves or a member with the SignaturesView permission; otherwise the API returns 403.

get_employee_fields

ChatGPT
Returns all available employee fields with their types and search capabilities. Fields with search_field can be used as filters in search_employees. When filter_type is "dropdown", use get_employee_filter_options to fetch the allowed values.

get_employee_filter_options

ChatGPT
Returns the available values for a dropdown employee filter field. Pass the search_field value from get_employee_fields as filter_id.

get_employees

ChatGPT
List employees in your Workable account. The response includes a total_count field indicating the total number of employees matching the filters — use this to answer count questions without fetching all records. Start with a small limit (10 or 20) and only increase to 50 if you specifically need to retrieve a large dataset.

get_event

ChatGPT
Get detailed information for a specific event by its ID. Use this tool when the user requests details about a specific event from the get_events results. The event ID should be obtained from the get_events tool response.

get_events

ChatGPT
Get events from your Workable account with optional filtering. Returns a numbered list of events with their IDs for easy reference. After showing the results, ask the user if they would like to get detailed information about any specific event, then use the get_event tool with the event ID.

get_job

ChatGPT
Get details for a specific job by shortcode

get_job_activities

ChatGPT
Get activities for a specific job

get_job_application_form

ChatGPT
Get application form for a specific job

get_job_custom_attributes

ChatGPT
Get custom attributes for a specific job. Each attribute includes a question_key ("CA_<id>"): pass it as the question_key of an answer to create_candidate / update_candidate to set the attribute on a candidate.

get_job_members

ChatGPT
Get members for a specific job

get_job_recruiters

ChatGPT
Get external recruiters for a specific job

get_job_stages

ChatGPT
Get stages for a specific job

get_jobs

ChatGPT
Returns up to 10 jobs by default. By default only published jobs are returned; closed, draft, and archived jobs are excluded. If you are looking for a specific job or its candidates and find nothing, retry with state: 'closed', 'archived', or 'draft' before concluding the job does not exist. If more jobs are available, the response will include a since_id value you can use to fetch the next page.

get_members

ChatGPT
List members of the Workable account, one page at a time (10 by default, up to 20). Returns active members unless status is set to 'inactive' or 'all'; page with since_id / max_id, or filter by role, job shortcode, email or exact name. Use it to find member IDs for revert_disqualification, upsert_candidate_rating, update_member, enable_member and delete_member.

get_offer

ChatGPT
Get details for a specific offer by its ID

get_orgchart

ChatGPT
Get the organization chart for employees in your Workable account

get_permission_sets

ChatGPT
List the custom permission sets defined on your Workable account. Use this to discover the permission set names to include in the roles array of invite_member / update_member: pass the permission set's name (not its id). A member can hold both a built-in role (ats./hris./workable.superadmin) and one or more permission sets, so these may be combined in the roles array. Returns each permission set's id, name and localized label/description.

get_profile_update_fields

ChatGPT
Returns all available profile update fields with their types and search capabilities. Fields with search_field can be used as filters in search_profile_updates. When filter_type is "dropdown", use get_profile_update_filter_options to fetch the allowed values.

get_profile_update_filter_options

ChatGPT
Returns the available values for a dropdown profile update filter field. Pass the search_field value from get_profile_update_fields as filter_id.

get_requisition

ChatGPT
Get details for a specific requisition by its code

get_requisitions

ChatGPT
Returns requisitions with optional filtering. If more requisitions are available, the response will include paging info.

get_review

ChatGPT
Fetch a single review by its id (the template merged with any persisted answers — i.e. the autosaved draft). Returns { review, questionnaire }. Use this to load a review before writing, or to resume filling one in after a previous save. The caller must be the assigned reviewer of the review (the reviewee for self-reviews). Discover review ids from active_tasks[].reviews[].id via list_review_tasks.

get_review_aggregate

ChatGPT
Fetch the full review aggregate for an employee within a cycle, including aggregate status/state, the reviewee, the manager, the cycle, and every review visible to the caller (each as { review, questionnaire }). Peer / upward reviewers only see their own assigned review. Use the reviewee employee id (e.g. from active_tasks[].reviewee.id or an active_tasks[].actions.view URL).

get_review_cycle

ChatGPT
Get a specific performance review cycle by ID, including dates, deadlines, counts and which review types are configured.

get_review_cycle_template

ChatGPT
Get a specific performance review cycle template by ID, including its sections and questions

get_review_cycle_templates

ChatGPT
List performance review cycle templates with optional pagination

get_review_cycles

ChatGPT
List performance review cycles visible to the account, with optional pagination and state filtering. Archived/deleted cycles are not returned.

get_review_form

ChatGPT
Fetch the questionnaire form for a specific review type on a preparation task. Returns the underlying review (with status and template ids) and the questionnaire (sections + questions). Use list_review_tasks to discover task ids and the review types available on each task.

get_stages

ChatGPT
Get all available recruitment pipeline stages in your Workable account

get_timeoff_balances

ChatGPT
Get time off balances for an employee (or all employees if no employee_id provided)

get_timeoff_categories

ChatGPT
Get all time off categories configured for the account

get_timeoff_requests

ChatGPT
Get time off requests within a date range

get_work_schedules

ChatGPT
Get all work schedules in your Workable account

invite_member

ChatGPT
Invite a new member to the Workable account, creating a pending invitation. Use this for provisioning access as part of an onboarding or access-management workflow. On success returns the created invitation object (including its ID), not a member. Notes: the email must not already belong to an existing member or a pending invitation (otherwise 422); an invalid role or permission-set name is rejected (422); collaboration rules are only applied when the account subscription supports them, and member-limit and permission-set compatibility checks apply. When the account is authenticated with an account token you must supply member_id (the acting inviter); with a member token the authenticated member is used.

list_review_cycle_answers

ChatGPT
Bulk-pull persisted review answers in a cycle for reporting. Returns every answer the caller has access to: for a manager that is their reporting line (their reviewees across the org tree); an account admin with the ReviewCyclesView permission gets the entire cycle. By default only submitted reviews are returned — pass include_drafts=true to include draft answers as well. When the underlying review is anonymous, the reviewer is returned as { id: null, name: "Anonymous" }.

list_review_tasks

ChatGPT
List the review tasks assigned to the authenticated member for a given review cycle. Returns two groups: — preparation_tasks: review aggregates whose templates the caller (as the aggregate manager) still needs to customize. Returned regardless of cycle state. — active_tasks: aggregate-centric tasks the caller can act on. Each task carries a reviewee, the aggregate-level actions (view / share / sign) the caller is entitled to, and a reviews[] array. Each review has an id, type (manager / self / peer / upwards), state, deadlines, and its own actions (view / write) URLs. Use a review's id with get_review / submit_review, and the aggregate (task) id with share_review / sign_review. Submitted reviews stay listed with a view-only action.

list_time_entries

ChatGPT
List time tracking entries with optional filtering by date range, employees, type, or duration

mark_review_task_ready

ChatGPT
Finalise every customizable review form on a preparation task. Once marked ready in an active cycle, the forms can no longer be edited via update_review_form, so confirm with the user before calling this.

merge_department

ChatGPT
Merge a department into another target department. All associated data will be moved to the target department.

move_candidate

ChatGPT
Move a candidate to a different stage in the hiring process. Use this tool with candidate IDs obtained from get_candidates tools.

reject_offer

ChatGPT
Reject an offer by its ID

reject_requisition

ChatGPT
Reject a requisition by its code, as the caller. Only works on a requisition that is pending and awaiting the caller's approval; any other requisition (already approved or rejected, or waiting on another approver) is reported as not awaiting approval.

relocate_candidate

ChatGPT
Relocate a candidate to a different job, deleting the original candidate from the source job. This is like copy_candidate but destructive — the source candidate is removed. The candidate is added to the target job at the specified stage (or the default starting stage if not provided). Use this tool with candidate IDs obtained from get_candidates tools.

revert_disqualification

ChatGPT
Revert a previously disqualified candidate, restoring them to active status on the job. Use this tool with candidate IDs obtained from get_candidates or get_candidate tools.

search_candidates_detailed

ChatGPT
Search candidates with filters and column selection. Call get_candidate_detailed_fields first to discover available columns and their search operators. For dropdown fields, call get_candidate_detailed_filter_options to get valid values before filtering.

search_employees

ChatGPT
Search employees with filters and column selection. Call get_employee_fields first to discover available columns and their search operators. For dropdown fields, call get_employee_filter_options to get valid values before filtering.

search_jobs

ChatGPT
Find jobs by a partial or full job title and get back each match's shortcode, title, state, and id. Use this when you have a job name (e.g. 'Software Engineer') but not its shortcode: the returned shortcode can be passed directly to other job-scoped tools such as get_candidates, get_job_stages, and get_job_members. Only published jobs are returned by default; pass state to search closed, draft, or archived jobs.

search_profile_updates

ChatGPT
Search profile updates with filters and column selection. Call get_profile_update_fields first to discover available columns and their search operators. For dropdown fields, call get_profile_update_filter_options to get valid values before filtering.

share_review

ChatGPT
Share the entire review aggregate with the reviewee, sending the share notifications. Operates on the aggregate as a whole (not a single review type) and requires the manager review to have been submitted first. Authorized caller: the aggregate manager. Returns the updated employee-aggregate shape. Pass the aggregate (preparation/active task) id, not a review id.

sign_review

ChatGPT
Record the calling member's signature on a shared review aggregate. Operates on the aggregate as a whole. Authorized callers: the reviewee and/or the manager on a shared aggregate. Confirm with the user before calling — signing is final. Returns the updated employee-aggregate shape. Pass the aggregate (preparation/active task) id, not a review id.

submit_review

ChatGPT
Fill in a review identified by its id. The caller must be the assigned reviewer (the reviewee for self-reviews). Discover review ids from active_tasks[].reviews[].id via list_review_tasks. Use action="save" to autosave a draft — repeated calls upsert answers by question_id, keeping the review in "draft" state. Use action="submit" to finalise the review — the API runs mandatory-question and required-rating validations and transitions the review to "submitted". Submitted reviews cannot be edited again (a second submit returns 409), so confirm with the user before submitting. Each answer's question_id MUST be a UUID present on the review's resolved template (call get_review to discover them). Pass answer as HTML for long-text questions, and choices as a string array (e.g. ["yes"] for booleans, ["4"] for numeric/star ratings). Returns the updated { review, questionnaire } envelope.

update_candidate

ChatGPT
Update an existing candidate's profile with a partial set of fields — only the fields you provide are changed; everything else is left untouched. Recommended flow: call get_candidate first to read the current state, and get_job_custom_attributes / get_account_custom_attributes to discover custom field keys and valid values before setting them via answers. Writable fields: firstname, lastname, email, phone, address, headline, summary, notes, cover_letter, texting_consent, skills, tags, social_profiles, experience_entries, education_entries, image_url/image, resume_url/resume, and custom attributes (via answers, keyed by question_key). There is no single name field — set firstname and/or lastname instead. Format constraints: email must be a valid email address; social_profiles[].url and image_url/resume_url must be valid URLs; dates use YYYY-MM-DD. Note: tags and skills are full replacements (the array you pass overwrites the existing set). To add while keeping existing values, read them with get_candidate and merge first. You can pass the full candidate object returned by get_candidate straight back in: read-only fields (e.g. id, name, job, stage, stage_kind, disqualified, sourced, profile_url, created_at, updated_at, hired_at) are accepted and ignored, so only the writable fields above take effect. One exception: account is the account subdomain string this tool operates on, not the candidate's account object — set it to the subdomain, not the object from get_candidate. Returns the full updated candidate object.

update_candidate_tags

ChatGPT
Replace the full set of tags on a candidate. The provided tags array overwrites any existing tags — passing an empty array clears all tags. To add a tag while keeping existing ones, fetch the candidate first with get_candidate and merge the existing tags into the new array.

update_department

ChatGPT
Update an existing department.

update_member

ChatGPT
Update an existing member's roles, permissions, or access scope. Updates are partial — only the fields you provide are changed; all other fields remain untouched. There is no editable name via this endpoint. Returns the full updated member object on success. Errors: the member ID must exist (otherwise 404); an invalid value for any field, or a member in a pending state, is rejected (422).

update_requisition

ChatGPT
Update an existing requisition by its ID. Only the supplied fields are changed. The requisition code, linked job, and department cannot be modified through this tool. Every update stores a new version of the requisition with a new id (returned in the response); the previous id can no longer be updated, so use the returned id for any further update.

update_review_form

ChatGPT
Create or replace the questionnaire form for a specific review type on a preparation task. The whole questionnaire is replaced — pass the full set of sections and questions you want, not a partial diff. All body fields (section body, question body) must be non-empty strings — use a label like "Section rating" / "Overall rating" for rating questions rather than an empty string. Valid question types: "paragraph" (long text), "star_rated" (1-5 stars), "custom_rated" (labeled scale via metadata.ratingOptions), "numeric_rated" (numeric score), "multiple_choice" (options via metadata.answerOptions.choices). To mark a question as the section-level or template-level rating, set metadata.semanticType to "section_rating" (one per section, must be a rated type) or "overall_rating" (one per template, must be a rated type). Editing is rejected if the review cycle does not allow manager overwrite, or if the cycle is active and the form has already been marked ready.

update_time_entry

ChatGPT
Update an existing time entry. At least one of clock_in_time, clock_out_time, or note must be provided. Pass note as null to clear it

update_timeoff_approval

ChatGPT
Approves or rejects a pending time off approval. The key is the id from the pending_approvals array returned by get_timeoff_requests.

upsert_candidate_rating

ChatGPT
Create or update a candidate rating. Keyed on (candidate, member, stage): if a rating already exists for that combination it is updated, otherwise a new one is created. Use add_review when you specifically want create-only semantics.

Capabilities

Writes

App Stats

94

Tools

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily