Skip to main content
Glama

Server Details

Run AI interviews, simulated personas and coaching sessions on JobMojito.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 45 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
JobMojito/mcp
GitHub Stars
1
Server Listing
JobMojito MCP Server

TDQS

A3.8/5.0

Scored across 29 tools

Disambiguation4/5

Most tools target a clearly distinct resource+action (create/get/update/list per domain), and boundaries are actively clarified (e.g. list_my_merchants vs jobmojito_configuration, search vs get_documentation). The main potential confusion is among the three interview-creation tools (create_interview, create_interview_from_questions, create_persona), but their descriptions differentiate the use cases well enough.

Naming Consistency4/5

Nearly all names follow a clean verb_noun snake_case pattern (create_interview, list_interviews, get_interview_result_details, update_catalogue_directory, upload_knowledge_base_document). The single clear outlier is jobmojito_configuration, which drops the verb and prefixes the product name, breaking the otherwise uniform convention.

Tool Count3/5

At 29 tools the surface is on the heavy side, though the server legitimately spans several domains (interviews, results, coaching catalogue, merchant admin, candidates, docs, knowledge base). The breadth partially justifies the count, but it lands in the borderline/heavy range rather than a tightly scoped set.

Completeness4/5

Coverage is strong: interviews have create/read/update/state/list/register/url, results have list/details/report/retry analytics, and the catalogue has full create/get/list/update. Minor gaps remain (no explicit delete for interviews or catalogue directories, and the knowledge base exposes only upload with no list/get/delete), but core workflows are covered.

Available Tools

29 tools
create_catalogue_directoryCreate coaching catalogue directoryA
Destructive
Inspect

[Coaching catalogue] Create a directory (page) in the coaching portal catalogue. A directory nests other directories (tags_sub), lists coaching sessions whose own tags match its tags_interview_set_filter, and can carry a fully custom Markdown page (content_md) with [sessions], [directory:…], [session:…] and [plan-progress] directives. Coaching-platform feature.

Creates a directory (page) in the coaching portal catalogue. A directory nests other directories through tags_sub, lists coaching sessions through tags_interview_set_filter, and can replace the default grid with a custom Markdown page through content_md. The id you choose is the catalogue URL segment and cannot be changed afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDirectory id — also the catalogue URL segment (/catalogue/<id>) and the value other directories reference in their `tags_sub`. Lowercase letters, digits and single - or _ separators. Convention is to end language-specific directories with the language code, e.g. `sales-coaching-en`.
nameYesDisplay name of the directory, shown as the page title and on its card.
statusNoLifecycle status of the catalogue directory. Options — `draft`: Not published — the directory exists but is not served to visitors. | `active`: Published and served in the catalogue. | `archived`: Retired — kept for reference but no longer served..
tags_subNoIds of the directories nested under this one, in display order. Replaces the whole list — send the full set, not just the additions. A referenced directory only appears if it exists and is visible to the viewer.
coach_planNoCoaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit/null to leave it out of any plan. Options — `demo`: Demo session. | `screening`: Screening-interview practice. | `2nd`: Second-interview practice. | `3rd`: Third-interview practice. | `closing`: Closing / salary-negotiation practice. | `job-specific`: Job-specific coaching. | `other`: Anything that does not fit the other buckets..
content_mdNoMarkdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text. Chips, callouts, cards, columns and buttons are available here too — full vocabulary: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
parent_tagNoId of an existing directory to nest this new one under: the new id is appended to that directory's `tags_sub`. Omit to create a top-level directory (reachable via a direct link, or by adding it to another directory later).
visibilityNoWho can see the catalogue directory. Options — `public`: Shared across every merchant. Platform admins only — a merchant caller is rejected by row-level security. | `merchant_public`: Listed in the merchant's own catalogue — the normal choice. | `merchant_invite`: Owned by the merchant but not listed; reachable only for invited users. | `merchant_unlisted`: Owned by the merchant but not listed; reachable only via a direct link..
descriptionNoShort description shown on the directory card.
merchant_idNoMerchant that owns the directory. Admin / sub-merchant callers only; otherwise taken from your token.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
cover_image_urlNoCover image URL shown on the directory card.
mojito_language_codeNoLanguage of the directory (one of the platform-languages.json codes). The catalogue groups directories by language; defaults to `en` when omitted.
tags_interview_set_filterNoTag filter selecting which coaching sessions this directory lists: a session appears when its own `tags` contain EVERY tag here (an AND, not an OR). Only `active` coaching/persona sessions with visibility `public` or `merchant_public` are listed. Set the matching tags on the session with the create-interview / job-interview-update `tags` field.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesId of the created directory.
parent_tagYesThe directory this one was nested under, when `parent_tag` was supplied.
merchant_idYesOwning merchant id. Null for a platform-wide (`public`) directory.
catalogue_urlYesPublic URL of the directory page, when the merchant has a coaching-portal domain configured. Null otherwise.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (destructiveHint=true, idempotentHint=false, openWorldHint=true), so the bar is lower. The description adds genuinely useful behavior beyond them and beyond the schema: the id becomes an immutable URL segment that 'cannot be changed afterwards', and custom markdown 'replaces' the default grid rather than augmenting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description contains two near-identical paragraphs: the second ('Creates a directory (page) in the coaching portal catalogue. A directory nests other directories through tags_sub...') is a verbatim paraphrase of the first. Only the trailing 'id is the catalogue URL segment and cannot be changed afterwards' sentence is unique, so a large share of the text is duplicated rather than earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the 14-parameter schema is exhaustively documented. The description covers the concept of a directory, its nesting/listing behavior, the markdown page replacement, and the immutability of the id — enough for an agent to call it correctly, with only the not-named update sibling and parent-existence prerequisites left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 14 parameters, including enum explanations for status/visibility/coach_plan and detailed semantics for tags_sub, tags_interview_set_filter and content_md. The description restates a few of these roles (tags_sub, tags_interview_set_filter, content_md) but adds no syntax, format or edge-case detail the schema does not already carry, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb+resource ('Create a directory (page) in the coaching portal catalogue') and clarifies what a directory actually is — a node that nests sub-directories and lists sessions. It never names or contrasts itself with the obvious sibling update_catalogue_directory, so discrimination relies on the tool name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the text explains that directories can be top-level or nested via parent_tag and can be customised via content_md, which hints at when those options apply. But there is no explicit 'use this to...' vs 'use update_catalogue_directory to...' routing, no stated prerequisites (a parent directory must already exist), and no when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_interviewCreate interviewA
Destructive
Inspect

[Interviews] Create a new interview and auto-generate its question sequence from position data. The interview_template_id you pass also sets the modality (voice-only vs realtime/pre-recorded avatar) — see list_avatars.

Creates a new interview / coaching / assessment definition, generates its description, questions and candidate expectations via AI, and provisions default steps. Optionally provisions an embed key.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoOptional external code/reference for the interview.
nameYesInterview / position name.
tagsNoFree-form tags stored on the interview. Tags are also the coaching-catalogue mapping key: a catalogue directory (see the catalogue-tag-create / catalogue-tag-update endpoints) lists a coaching or persona session when the session's tags contain EVERY tag in that directory's `tags_interview_set_filter`. Only `active` sessions with visibility `public` or `merchant_public` are listed.
typeYesProduct type of the interview. Options — `interview`: Standard candidate interview for a role — answers are AI-scored and produce a hiring recommendation. | `coaching`: Practice/coaching session — candidate-facing feedback to help them improve; not a hiring evaluation. Only available on the coaching portal, NOT the interview portal. | `assessment`: Skills/knowledge assessment — evaluates competencies and is scored like an interview..
statusYesLifecycle status of the interview. Options — `draft`: Created but not published — not visible to candidates and cannot be run yet. Use to stage an interview before going live. | `active`: Published and live — candidates can run it..
locationYesJob location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`.
recordingNoCheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit/null to disable. Options — `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only. | `audio_all`: Audio-only cheating detection on every answer. | `video_all`: Audio + video cheating detection on every answer (candidate is recorded for all answers). | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only..
visibilityYesWho can discover and access the interview. Options — `merchant_public`: Listed on the merchant's public interview list — anyone with the merchant link can find and start it. | `merchant_invite`: Invite-only — only candidates explicitly invited (by email/link) can access it; not listed anywhere. | `merchant_unlisted`: Reachable only via a direct link — not listed anywhere; share the link manually..
descriptionNoShort, two-sentence job description shown to the candidate. Provide it to use it as-is; leave it null/blank and it is AI-generated from the position name and any other context.
environmentNoWhich of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..
is_embeddedNoSet true when the interview will be embedded as an iframe on an external page. Provisions an embed key and returns embed_id / embed_signing_key, which are used to authenticate/sign the iframe embed.
merchant_idNoMerchant id. Admin / sub-merchant callers only; otherwise taken from your token.
result_viewNoResult screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown. Options — `none`: No results screen at all — the interview is submitted immediately when the candidate finishes (no feedback, intro video, transcript edit or manual submit step). | `minimal`: Minimal results layout, no score shown. | `minimal_with_score`: Minimal results layout including the overall score. | `advanced`: Advanced results layout with more detail. | `full`: Full results layout with all sections. | `full_expand_scores`: Full results with every score breakdown expanded..
max_durationNoMaximum interview duration in seconds. Scopes how many questions are generated (see interview_length) and is stored on the interview as the live session limit and the basis for the credit multiplier. Defaults to 1200 (20 minutes) when omitted.
max_followupsNoMaximum number of AI follow-up questions. 0 disables follow-ups; presets are 0-3 (none/low/normal/high) and custom values start at 4; null uses the template default (Normal).
custom_scoringNoCustom result-scoring overrides merged with defaults and template overrides.
interview_toneNoInterview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script..
interview_typeNoInterview style — configures the AI avatar and shapes both the AI-generated questions and the follow-up questions asked during the interview. Defaults to pre-screening when omitted. Options — `pre-screening`: Pre-screening — quick qualification check focusing on basic requirements and availability. | `pre-screening-with-test-questions`: Pre-screening with test questions — pre-screening plus practical questions to test relevant skills. | `second-interview`: Second round interview — deeper dive for candidates who passed initial screening. | `remote-freelancer-verification`: Remote worker verification — verify remote work capabilities and communication skills. | `strength-based-interview`: Strength-based interview — focus on what candidates enjoy and excel at to predict job satisfaction. | `potential-based-interview`: Potential-based interview — assess learning ability and growth potential rather than past experience. | `process-verification-from-knowledge-base`: Knowledge Base interview — generate questions from your knowledge base documents..
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
cover_image_urlNoCover image URL.
seniority_levelNoTarget seniority level for the role; auto-detected from the job description when omitted. Options — `entry-level`: Early-career or graduate roles. | `intermediate`: Some experience required. | `senior`: Experienced professional. | `managerial`: Team or department lead. | `director`: Director-level responsibility. | `executive`: C-suite or executive role..
welcome_messageNoCustom welcome message shown to the candidate.
description_longNoFull job description in Markdown (Job Purpose, Responsibilities, Required & Preferred Qualifications). Provide it to use it as-is; leave it null/blank and it is AI-generated (interview and assessment types only). Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
interview_lengthNoNumber of questions to generate (1-40). Also capped by max_duration, which allows one question per 2 minutes: 20 min -> 10 questions, 30 min -> 15, 45 min -> 22, 60 min -> 30, 80 min -> 40. Asking for more than the cap is not an error — you get the cap, and the response reports the real count in questions_generated. Omit this field to let the AI pick 5-8.
interview_salaryNoSalary range shown for the position.
thank_you_messageNoCustom thank-you message shown after the interview.
additional_contextNoArbitrary additional context object merged into AI generation.
hiring_for_companyNoWho the position is really for. Omit/null (or an object with name null/blank) when hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size for a named client. Stored in creation_parameters.hiring_for_company.
interview_attemptsNoAllowed candidate attempts (1-20).
instructional_videoNoShow an instructional video before approval. Defaults to false.
interview_departmentNoDepartment the position belongs to.
mojito_language_codeYesPlatform language code used for the interview. Must be one of the platform-languages.json codes.
recruiter_profile_idNoProfile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant.
interview_template_idYesId of the interview template to base this interview on.
candidate_expectationsNoFree-text candidate expectations folded into AI generation.
include_closing_promptNoInclude a closing prompt. Defaults to true.
pdf_export_auto_configNoAuto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.
recording_full_sessionNoFull interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit/null to disable. Options — `audio_all`: Record the whole session audio (avatar + candidate voice) into a single file. Adds +0.2 credits. | `video_all`: Record the whole session video + audio (avatar + candidate) into a single file. Adds +0.4 credits..
required_pronunciationNoRequire pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false.
knowledge_base_store_idNoKnowledge base store id to source additional context from.
questions_random_subsetNoAsk only a random subset of the questions, expressed as a fraction between 0.01 and 0.9 (e.g. 0.5 = 50%). null asks all questions.
include_rapport_questionNoInclude an opening rapport question. Defaults to false.
interview_available_tillNoISO date/time after which the interview is no longer available to candidates. null keeps it always available.
use_enhanced_expectationsNoReserved flag passed through to generation.
candidate_video_introductionNoWhether a candidate video introduction is optional or required.
interview_conversation_speedNoConversation pace of the AI avatar. Omit/null keeps the template default pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation..
result_enable_edit_transcriptNoAllow editing the transcript on the result view. Defaults to true.
instructional_video_custom_textNoCustom narration text for the instructional video.

Output Schema

ParametersJSON Schema
NameRequiredDescription
embed_idNoEmbed id, present only when is_embedded=true.
max_durationYesLive session limit in seconds stored on the interview — the value sent, or the 1200 default when omitted.
_mcp_instructionsNoServer-issued metadata for this conversation.
embed_signing_keyNoEmbed signing key, present only when is_embedded=true.
questions_generatedYesNumber of questions actually generated. May be lower than the requested interview_length, which is capped by max_duration.
interview_def_set_idYesId of the newly created interview definition set.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a non-idempotent, destructive, open-world write, so the safety profile is covered. The description adds real behavioral context beyond that: AI generation of description/questions/candidate expectations, provisioning of default steps, and optional embed-key provisioning. It stops short of disclosing credit implications or environment/webhook effects, which the schema carries instead.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead sentence is well front-loaded with scope and the template-id modality insight. But the second paragraph largely restates the first — 'Creates a new interview / coaching / assessment definition' duplicates the opening 'Create a new interview' and re-lists the AI-generated artifacts, so a meaningful share of the text is redundant rather than additive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 48-parameter, 100%-documented schema with an output schema present, the description need not enumerate returns or fields, and it correctly covers the core operation, generation behavior, and a cross-reference to list_avatars. The one notable gap is sibling routing against create_interview_from_questions and update_interview, which a creation tool this broad should address.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning the schema lacks: that interview_template_id determines the modality (voice-only vs realtime/pre-recorded avatar), a cross-field consequence not stated in the parameter's own description. It does not explain the 48-parameter surface broadly, but the key semantic link is captured.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new interview') plus the non-obvious side effect that questions are auto-generated from position data, and notes it covers interview/coaching/assessment definitions. However, it never distinguishes itself from the close sibling create_interview_from_questions, leaving the agent to infer which creation path to take.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the verb: use this to originate a new interview from position data. There is no explicit when-not-to-use, no mention of create_interview_from_questions for question-driven interviews, and no prerequisites such as required permissions or the need to have a template/avatar already chosen beyond a passing 'see list_avatars' pointer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_interview_from_questionsCreate interview from questionsA
Destructive
Inspect

[Interviews] Create a new interview from an explicit array of questions. The AI rephrases your wording by default; pass interview_tone="exact" to have each question asked verbatim, which is what you want when the wording is a script (compliance, translated, or legally reviewed text).

Creates a new interview definition set from a caller-provided array of questions, builds its default and generated steps, optionally activates it, and optionally creates an embed key.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoOptional external code/reference.
nameYesInterview/position name.
tagsNoFree-form tags stored on the interview. Tags are also the coaching-catalogue mapping key: a catalogue directory (see the catalogue-tag-create / catalogue-tag-update endpoints) lists a coaching or persona session when the session's tags contain EVERY tag in that directory's `tags_interview_set_filter`. Only `active` sessions with visibility `public` or `merchant_public` are listed.
typeYesProduct type of the interview. Options — `interview`: Standard candidate interview for a role — answers are AI-scored and produce a hiring recommendation. | `coaching`: Practice/coaching session — candidate-facing feedback to help them improve; not a hiring evaluation. Only available on the coaching portal, NOT the interview portal. | `assessment`: Skills/knowledge assessment — evaluates competencies and is scored like an interview..
statusYesLifecycle status of the interview. Options — `draft`: Created but not published — not visible to candidates and cannot be run yet. Use to stage an interview before going live. | `active`: Published and live — candidates can run it..
locationYesJob location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`.
questionsYesOrdered list of interview questions to create as steps.
recordingNoCheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit/null to disable. Options — `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only. | `audio_all`: Audio-only cheating detection on every answer. | `video_all`: Audio + video cheating detection on every answer (candidate is recorded for all answers). | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only..
visibilityYesWho can discover and access the interview. Options — `merchant_public`: Listed on the merchant's public interview list — anyone with the merchant link can find and start it. | `merchant_invite`: Invite-only — only candidates explicitly invited (by email/link) can access it; not listed anywhere. | `merchant_unlisted`: Reachable only via a direct link — not listed anywhere; share the link manually..
descriptionYesShort interview description.
environmentNoWhich of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..
is_embeddedNoSet true when the interview will be embedded as an iframe on an external page. Creates an embed key and returns embed_id/embed_signing_key, used to authenticate/sign the iframe embed.
merchant_idNoTarget merchant id (admins / sub-merchant only).
result_viewNoResult screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown. Options — `none`: No results screen at all — the interview is submitted immediately when the candidate finishes (no feedback, intro video, transcript edit or manual submit step). | `minimal`: Minimal results layout, no score shown. | `minimal_with_score`: Minimal results layout including the overall score. | `advanced`: Advanced results layout with more detail. | `full`: Full results layout with all sections. | `full_expand_scores`: Full results with every score breakdown expanded..
max_followupsNoMaximum number of AI follow-up questions. 0 disables follow-ups; presets are 0-3 (none/low/normal/high) and custom values start at 4; null uses the template default (Normal).
custom_scoringNoCustom scoring overrides merged with defaults.
interview_toneNoTone — configures the AI avatar's speaking style and the follow-up questions it generates; the base `questions` you supply are not affected. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script..
interview_typeNoInterview style — configures the AI avatar and the follow-up questions it generates during the interview. The base `questions` you supply are used as-is and are NOT affected by this setting. Options — `pre-screening`: Pre-screening — quick qualification check focusing on basic requirements and availability. | `pre-screening-with-test-questions`: Pre-screening with test questions — pre-screening plus practical questions to test relevant skills. | `second-interview`: Second round interview — deeper dive for candidates who passed initial screening. | `remote-freelancer-verification`: Remote worker verification — verify remote work capabilities and communication skills. | `strength-based-interview`: Strength-based interview — focus on what candidates enjoy and excel at to predict job satisfaction. | `potential-based-interview`: Potential-based interview — assess learning ability and growth potential rather than past experience. | `process-verification-from-knowledge-base`: Knowledge Base interview — generate questions from your knowledge base documents..
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
cover_image_urlNoCover image URL.
seniority_levelNoTarget seniority level for the role; auto-detected from the job description when omitted. Options — `entry-level`: Early-career or graduate roles. | `intermediate`: Some experience required. | `senior`: Experienced professional. | `managerial`: Team or department lead. | `director`: Director-level responsibility. | `executive`: C-suite or executive role..
welcome_messageNoCustom welcome message.
description_longNoLong-form interview description. Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
interview_salaryNoSalary range shown for the position.
thank_you_messageNoCustom thank-you message.
additional_contextNoExtra context forwarded to expectation generation.
hiring_for_companyNoWho the position is really for. Omit/null (or an object with name null/blank) when hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size for a named client. Stored in creation_parameters.hiring_for_company.
interview_attemptsNoAllowed attempts, 1-20.
instructional_videoNoEnable an instructional video before approval.
interview_departmentNoDepartment the position belongs to.
mojito_language_codeYesPlatform language code (one of the platform-languages.json codes); must also resolve to a supported language with an Azure speech mapping.
recruiter_profile_idNoProfile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant.
disable_deduplicationNoWhen true, skip step deduplication on insert.
interview_template_idYesId of the interview template to use. Must reference an existing interview_templates row.
candidate_expectationsNoFree-text candidate expectations.
pdf_export_auto_configNoAuto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.
recording_full_sessionNoFull interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit/null to disable. Options — `audio_all`: Record the whole session audio (avatar + candidate voice) into a single file. Adds +0.2 credits. | `video_all`: Record the whole session video + audio (avatar + candidate) into a single file. Adds +0.4 credits..
required_pronunciationNoRequire pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false.
knowledge_base_store_idNoOptional knowledge base store id; validated for existence.
questions_random_subsetNoFraction of questions to randomly ask, between 0.01 and 0.9.
interview_available_tillNoISO date/time after which the interview is no longer available to candidates. null keeps it always available.
candidate_expectations_jsonNoPre-generated candidate expectations, bucketed by requirement level (weak/moderate/strong); auto-generated when omitted for type=interview. Extra keys are preserved.
candidate_video_introductionNoWhether a candidate video introduction is optional or required.
interview_conversation_speedNoConversation pace of the AI avatar. Omit/null keeps the template default pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation..
result_enable_edit_transcriptNoAllow editing the transcript on the result view. Defaults to true.
instructional_video_custom_textNoCustom text for the instructional video.

Output Schema

ParametersJSON Schema
NameRequiredDescription
embed_idNoEmbed id, present only when is_embedded=true.
_mcp_instructionsNoServer-issued metadata for this conversation.
embed_signing_keyNoEmbed signing key, present only when is_embedded=true.
interview_def_set_idYesId of the newly created interview definition set.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that: the AI rephrases supplied questions by default (a non-obvious behavioral trait), and it builds default and generated steps while optionally activating and optionally creating an embed key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening paragraph front-loads the key differentiator and the one actionable tip, and the second sentence is tight. The second paragraph partially restates the first ('creates a new interview definition set') but does add the step-building/activation/embed behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the 100%-covered schema carries the parameter detail. For this complexity the description supplies the one thing structured fields cannot: the default rephrasing behavior and how to override it, plus the side effects (steps, activation, embed key).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 46 parameters, including interview_tone='exact'. The description's mention of the exact-tone behavior largely echoes what the schema already states, so it adds little beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new interview') and pins the distinguishing input ('from an explicit array of questions'). This implicitly separates it from the sibling create_interview, but the sibling is never named, so the agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides one genuinely useful conditional — pass interview_tone='exact' when the wording is a script — but offers no guidance on when to choose this over create_interview, when not to use it, or what prerequisites (e.g. a valid interview_template_id) are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_personaCreate role-play personaA
Destructive
Inspect

[Interviews] Create a role-play persona: an avatar that plays a defined role in a free-form conversation instead of a scored Q&A interview. FIRST CHOOSE portal, because it selects between two different products: portal="interview" builds a SIMULATED PERSONA a recruiter invites candidates to — scored, billed to merchant credits, and listed with the recruiter's other results; portal="coaching" (THE DEFAULT) builds a coaching persona learners start themselves from the catalogue, billed to their own coaching credits and never visible to recruiters. Pass portal="interview" explicitly for any hiring, screening or assessment use. Then set persona_role_avatar/persona_role_user for the roles and opening_line for the avatar's first spoken line (defaults to a generic 'Hello').

FIRST DECIDE portal. This endpoint creates two different products and the default is NOT the recruiter one:

  • portal: "interview" — an INTERVIEW ROLE-PLAY. Use this whenever the goal is to ASSESS or SCREEN candidates: hiring, assessments, sales role-plays for job applicants, anything a recruiter runs. Candidates are invited through the normal invitation flow, results appear in the recruiter's result list, it is billed against merchant credits, and attempts are capped via interview_attempts — exactly like an interview.

  • portal: "coaching" (THE DEFAULT) — a coaching persona for practice/training on the coaching portal. Consumed against the mentee's own coaching credits, self-started from the catalogue, and its results are NOT visible to recruiters. Omitting portal gives you this one, so pass portal: "interview" explicitly for any recruiting/assessment use case. The conversation itself behaves identically in both.

The avatar plays a defined role in a free-form conversation instead of running a scored Q&A interview. No AI question/description generation runs; the persona role fields ARE the configuration. The session runs as: a welcome message → the avatar's OPENING LINE (the first thing it says, set via opening_line) → the candidate replies and the free-form role-play begins → a closing message. Because there is no question list, opening_line is how the avatar starts the scene — set it to a concrete in-character line; if omitted it defaults to a generic "Hello". Set welcome_message and thank_you_message too — omitting them leaves the generic platform defaults. Also set candidate_expectations: it is the yardstick the session is scored against. The four avatar prompts divide up as: persona_avatar_who_is (identity and what drives it), persona_avatar_knowledge (the private facts it may use), persona_avatar_progress (how the conversation is allowed to move forward, and what gates the later personal details), and persona_avatar_end_conditions (when to stop). Without persona_avatar_progress the avatar has no defined arc and tends to either concede immediately or never concede at all. Provisions the default conversational steps and optionally an embed key.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoOptional external code/reference for the persona.
nameYesPersona / session name.
tagsNoFree-form tags stored on the persona. Tags are also the coaching-catalogue mapping key: a catalogue directory (see the catalogue-tag-create / catalogue-tag-update endpoints) lists a coaching or persona session when the session's tags contain EVERY tag in that directory's `tags_interview_set_filter`. Only `active` sessions with visibility `public` or `merchant_public` are listed.
portalNoREQUIRED IN PRACTICE — pick deliberately; the default is the coaching product, not the recruiting one. `interview`: an interview role-play. Choose this for ANY recruiting or assessment use case (screening candidates, hiring, sales role-plays for applicants). Candidates are invited through the normal invitation flow, results are visible to the recruiter alongside ordinary interview results, it is billed against your merchant credits on the same basis as an interview, and attempts are capped (see `interview_attempts`). | `coaching` (DEFAULT when omitted): the classic coaching persona for practice/training. Runs on the coaching portal, is consumed against the mentee's own coaching credits, is started by the mentee from the catalogue or a shared link, and its results are NOT visible to recruiters. The conversation itself behaves identically in both cases — only the portal, billing, visibility and attempt limits differ.
statusYesLifecycle status of the interview. Options — `draft`: Created but not published — not visible to candidates and cannot be run yet. Use to stage an interview before going live. | `active`: Published and live — candidates can run it..
recordingNoCheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit/null to disable. Options — `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only. | `audio_all`: Audio-only cheating detection on every answer. | `video_all`: Audio + video cheating detection on every answer (candidate is recorded for all answers). | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only..
visibilityYesWho can discover and access the interview. Options — `merchant_public`: Listed on the merchant's public interview list — anyone with the merchant link can find and start it. | `merchant_invite`: Invite-only — only candidates explicitly invited (by email/link) can access it; not listed anywhere. | `merchant_unlisted`: Reachable only via a direct link — not listed anywhere; share the link manually..
descriptionNoShort persona description shown to the candidate on the pre-session poster. Candidate-visible — keep it to max 2 sentences. Unlike job-interview-create, personas run no AI generation, so this is never auto-generated: leave it null/blank and the poster simply shows no description; set it to frame the scene.
environmentNoWhich of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..
is_embeddedNoSet true when the persona will be embedded as an iframe on an external page. Provisions an embed key and returns embed_id / embed_signing_key.
merchant_idNoMerchant id. Admin / sub-merchant callers only; otherwise taken from your token.
result_viewNoResult screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown. Options — `none`: No results screen at all — the interview is submitted immediately when the candidate finishes (no feedback, intro video, transcript edit or manual submit step). | `minimal`: Minimal results layout, no score shown. | `minimal_with_score`: Minimal results layout including the overall score. | `advanced`: Advanced results layout with more detail. | `full`: Full results layout with all sections. | `full_expand_scores`: Full results with every score breakdown expanded..
max_durationNoMaximum conversation duration in seconds. Defaults to 1200 (20 min) when omitted.
opening_lineNoThe avatar's opening line — the FIRST thing it says out loud when the session starts, before the candidate has said anything. This is a literal spoken line, NOT a description: write the exact words the avatar should say, in character and consistent with persona_role_avatar. For an escalated scenario it should already convey that state (e.g. an angry customer opens angrily). If omitted, the platform inserts a generic default ("Hello"), which is usually a weak opener — set this for anything other than a neutral greeting.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
cover_image_urlNoCover image URL.
welcome_messageNoCustom welcome message spoken to the candidate before the role-play starts — set it; omitting it leaves a generic platform default. This is the scene-setting message; the avatar's first in-character line is `opening_line`, which comes after it.
persona_role_userYesThe role the candidate (mentee) plays. Candidate-visible — shown on the pre-session poster as 'Your role', so write it as candidate-facing setup and keep it to max 2 sentences. Example: 'is to be a sales person trying to sell an additional product to the customer'.
thank_you_messageNoCustom thank-you message shown after the session — set it; omitting it leaves a generic platform default.
interview_attemptsNoAllowed candidate attempts (1-20), defaulting to 3. Only meaningful when `portal` is `interview`; coaching personas are unlimited. A recruiter can still grant an extra attempt afterwards.
interview_locationNoOptional location label shown for the session.
persona_role_avatarYesThe role the AI avatar plays. Candidate-visible — shown on the pre-session poster as 'Role of the agent', so write it as candidate-facing setup and keep it to max 2 sentences. Example: 'is to act as a happy customer responding to questions'.
mojito_language_codeYesPlatform language code used for the conversation. Must be one of the platform-languages.json codes.
recruiter_profile_idNoProfile id of the recruiter owning this persona. Must be a merchant/merchant_owner/admin profile of the same merchant.
interview_template_idYesId of the interview template (avatar) the persona uses.
persona_avatar_who_isNoWho the avatar represents: name, role, context, personality, woven with what drives them underneath (motive, fear, what they refuse until heard, what they do not know until told). One continuous description; no labelled subsections.
candidate_expectationsNoMentee assessment goals — free-text describing what the candidate is expected to achieve (max 2100 chars).
recording_full_sessionNoFull interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit/null to disable. Options — `audio_all`: Record the whole session audio (avatar + candidate voice) into a single file. Adds +0.2 credits. | `video_all`: Record the whole session video + audio (avatar + candidate) into a single file. Adds +0.4 credits..
persona_avatar_progressNoHow the conversation moves forward — one plain-text value starting with `Mode: turning point` (resistance) or `Mode: steps` (difficult conversation protocol), then the labelled lines for that mode (Initial hold / Unlocks when / … or Framework / Steps / …), including a Gates line: do not share later personal details from persona_avatar_knowledge until progress is earned.
persona_avatar_knowledgeNoPrivate facts the avatar can use (numbers, dates, names, objections), plus any personal details shareable only after progress and only if natural — timing written inline, not as labelled subsections. Those personal details are never required for the goal.
candidate_video_introductionNoWhether a candidate video introduction is optional or required.
interview_conversation_speedNoConversation pace of the AI avatar. Omit/null keeps the template default pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation..
persona_avatar_end_conditionsNoWhen the avatar should end the session. Prefer referring to persona_avatar_progress: wrap up when progress is complete (turning point unlocked and a plan accepted, or steps "Done when" reached), or when the conversation has clearly broken down.

Output Schema

ParametersJSON Schema
NameRequiredDescription
embed_idNoEmbed id, present only when is_embedded=true.
_mcp_instructionsNoServer-issued metadata for this conversation.
embed_signing_keyNoEmbed signing key, present only when is_embedded=true.
interview_def_set_idYesId of the newly created persona definition set.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare mutation/open-world/destructive; the description goes far beyond them, disclosing billing destination (merchant vs coaching credits), recruiter visibility, attempt caps, the session flow (welcome → opening line → role-play → closing), that no AI question generation runs, and which omitted fields fall back to generic platform defaults.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded and organized, but the portal guidance is stated twice in near-duplicate form — once in the bracketed intro paragraph and again under 'FIRST DECIDE portal' — and several defaults are repeated. The duplication is real waste, though the bulk of the length is load-bearing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 33-parameter creation tool with an output schema, the description supplies everything the agent needs: required-vs-optional intent, defaulting behavior, billing and visibility consequences, the session lifecycle, and how the template/avatar fields interact. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so the baseline is 3, but the description adds genuine cross-parameter meaning: it splits the four persona_avatar_* prompts by purpose (who_is / knowledge / progress / end_conditions) and warns that omitting persona_avatar_progress causes the avatar to have no arc, plus clarifies opening_line is a literal spoken line rather than a description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb+resource ('Create a role-play persona: an avatar that plays a defined role in a free-form conversation instead of a scored Q&A interview') and explicitly contrasts the result with its closest siblings create_interview / create_interview_from_questions. An agent can tell what this creates and how it differs from the scored-interview tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It opens with an explicit decision instruction ('FIRST CHOOSE portal') and gives when-to-use conditions for each branch: 'interview' for hiring/screening/assessment, 'coaching' for practice/training, plus the critical warning that the default is NOT the recruiter product. Alternatives and exclusions are stated outright.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_interview_reportGenerate interview reportA
DestructiveIdempotent
Inspect

[Results] Generate an interview result report (HTML/PDF/JSON) for a completed interview. The report is decision-support material for a human reviewer, not an automated hiring decision.

Generates an interview result report as a PDF (returns a signed URL), raw HTML, or structured JSON. Provide either interview_result_id for a single result or interview_result_ids for a combined multi-result report.

ParametersJSON Schema
NameRequiredDescriptionDefault
templateNo
store_fileNoWhen true (pdf only), persist the file to storage and return a signed URL.
export_typeYes
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
interview_result_idNo
interview_result_idsNoGenerate a single combined report for multiple results.
export_features_resultNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesThe generated report. Exactly one of the three shapes below is returned, selected by the request `export_type`: `pdf` → `{ pdf_export_url, pdf_export_valid_until }`; `html` → `{ html_export }`; `json` → `{ json_export }`.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, but the description never explains why a report tool is destructive (e.g., overwriting a stored export) or what idempotency means here. It does add real context beyond annotations: PDF returns a signed URL, and the report is a human decision-support artifact, not an automated decision.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the scope and the human-reviewer caveat, and the second paragraph is compact. However, it restates 'Generate an interview result report' and the format list (HTML/PDF/JSON) that the first sentence already gave, so one sentence is partially redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the core selection logic is covered. But for a 7-parameter tool with a nested 10-property `export_features_result` object controlling transcripts, analytics, recordings and language, the description never mentions that customization surface or the 0.1-credit translation cost, leaving an agent to discover it only via the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 43%, so the schema carries most parameter detail (store_file, template precedence, mojito_language_code credit cost). The description usefully clarifies the `interview_result_id` vs `interview_result_ids` choice, but adds nothing about `export_features_result`, the largest and most consequential parameter group.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Generate an interview result report') plus the output formats (HTML/PDF/JSON) and the single-vs-multi-result scope, which distinguishes it from list_interview_results and get_interview_result_details. The '[Results]' tag and decision-support caveat further sharpen what it produces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It says to provide either `interview_result_id` for one result or `interview_result_ids` for a combined report, and scopes the tool to a 'completed interview', but never names an alternative tool or states when to prefer get_interview_result_details or list_interview_results. Usage is implied rather than contrasted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_interview_urlGenerate shareable interview linkA
Destructive
Inspect

[Interviews] Generate a signed public interview URL/token.

Generates a public, token-signed URL for an existing interview, profile, or result. The required id fields depend on type.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesWhich kind of signed URL to generate.
hide_menuNoPass the string 'false' to show the navigation menu; any other value hides it (default).
merchant_idNoOverride merchant id (admin / sub-merchant only).
interview_idNoInterview or position id. Required for interview-for-profile and interview-results-for-position.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
interview_result_idNoInterview result id. Required for interview-result-candidate and interview-result-talent-seeker.
interview_profile_idNoCandidate profile id. Required for interview-for-profile and results-for-profile.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesThe signed interview URL.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true, and non-idempotency, so the safety profile is covered structurally. The description adds useful context that the output is a public, token-signed link (i.e. the URL itself grants access without auth), but it does not explain why the operation is flagged destructive, whether tokens expire or are revocable, or whether repeat calls mint new tokens.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the core action (signed public URL/token) front-loaded ahead of the conditional-id caveat. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the cross-parameter conditionality is stated. The remaining gap is token lifecycle behavior, which matters for a security-sensitive share link but is not strictly required to make the call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each id parameter already documents which `type` values require it, so the schema carries the load. The description's only addition is the general conditional rule, which is a useful summary but not new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (generate) plus resource (a signed public interview URL/token) scoped to an existing interview, profile, or result. It is easy to separate from siblings like create_interview or get_interview_definition, which produce different artifacts. It stops just short of 5 because it does not explicitly state how it differs from any named sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the usage condition with 'The required id fields depend on `type`', routing the caller to the enum, but it never states when to use this tool versus alternatives or what preconditions must hold (e.g. the interview must already exist). Usage is inferable rather than explained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_catalogue_directoryGet coaching catalogue directoryA
Read-onlyIdempotent
Inspect

[Coaching catalogue] Read one catalogue directory in full: its settings, its custom Markdown page (content_md), its resolved sub-directories, and the coaching sessions its tag filter currently matches — which is how you verify that a session's tags actually place it in this directory. Read before updating: content_md, tags_sub and tags_interview_set_filter are replaced wholesale, so you need the current value to extend it.

Reads one catalogue directory in full: its settings, its custom Markdown page (content_md), the sub-directories it nests, and the coaching sessions its tags_interview_set_filter currently matches. Read a directory before updating it — content_md, tags_sub and tags_interview_set_filter are replaced wholesale by catalogue-tag-update, so you need the current value to extend rather than overwrite it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId of the catalogue directory to read (the catalogue URL segment).
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesDirectory id — also the catalogue URL segment.
nameYesDisplay name.
statusYesLifecycle status.
tags_subYesIds of the directories nested under this one, in display order. Replaces the whole list — send the full set, not just the additions. A referenced directory only appears if it exists and is visible to the viewer.
coach_planYesCoaching-plan stage, when the directory belongs to one.
content_mdYesMarkdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text. Chips, callouts, cards, columns and buttons are available here too — full vocabulary: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
created_atYesCreation timestamp (ISO 8601).
updated_atYesLast update timestamp (ISO 8601).
visibilityYesWho can see it.
descriptionYesShort description shown on the directory card.
merchant_idYesOwning merchant id. Null for a platform-wide directory.
catalogue_urlYesPublic URL of this directory page, when the merchant has a coaching-portal domain configured.
cover_image_urlYesCover image URL.
sub_directoriesYesThe directories listed in `tags_sub`, resolved and in display order. An id in `tags_sub` that does not resolve (deleted, or not visible to you) is simply absent here — compare the two to spot a broken link.
matched_sessionsYesThe coaching/persona sessions this directory currently lists, applying the same rules as the live portal: `active`, type `coaching` or `persona`, visibility `public` or `merchant_public` for this merchant, and `tags` containing every tag of `tags_interview_set_filter`. Empty when the filter is null. Capped at 200.
_mcp_instructionsNoServer-issued metadata for this conversation.
is_start_directoryYesTrue when this is the directory the merchant's catalogue opens on.
mojito_language_codeYesDirectory language.
tags_interview_set_filterYesTag filter selecting which coaching sessions this directory lists: a session appears when its own `tags` contain EVERY tag here (an AND, not an OR). Only `active` coaching/persona sessions with visibility `public` or `merchant_public` are listed. Set the matching tags on the session with the create-interview / job-interview-update `tags` field.
matched_sessions_truncatedYesTrue when more sessions match than the 200 returned — narrow `tags_interview_set_filter` if you see this.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the read-only safety profile is covered. The description usefully adds the wholesale-replacement warning that motivates the read, but beyond that it does not disclose return format or pagination behaviour (the latter being a gap, though an output schema exists).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two paragraphs restate essentially the same content — the second duplicates the first's enumeration of settings, content_md and sub-directories and the wholesale-replacement warning. The only sentence unique to the first paragraph ('how you verify that a session's tags place it in this directory') is buried inside the duplication, so structure and economy are poor.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with a complete output schema, full schema description coverage and strong annotations, the description supplies the needed purpose and read-before-update context. The only shortfall is that the guidance on sibling selection is not spelled out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (id, merchant_id, conversation_id) are already documented in the schema. The description adds no parameter-level meaning of its own, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read one catalogue directory in full') and enumerates the returned pieces (settings, content_md, sub-directories, matched sessions). It is clear enough to distinguish from most siblings, though it never explicitly names list_catalogue_directories as the alternative, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use condition: read before updating because content_md, tags_sub and tags_interview_set_filter are replaced wholesale, so the current value is needed to extend rather than overwrite. That is actionable guidance, but it offers no when-not clause and does not contrast against the list sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_documentationRead a JobMojito documentation pageA
Read-onlyIdempotent
Inspect

Fetch the full content of a single JobMojito documentation page.

Accepts a URL returned by search_documentation. For developer docs the clean Markdown (.md) variant is fetched automatically. Only developer.jobmojito.com and help.jobmojito.com URLs are allowed.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe documentation page URL.
max_charsNoTruncate content to this many characters (default 20000).
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive behavior, so the description's job is to add beyond that. It does: the two-domain allowlist (developer.jobmojito.com, help.jobmojito.com) and the automatic .md-variant fetch for developer docs are behavioral facts an agent could not infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the source constraint, then the domain restriction. No filler and no repetition of schema or annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail is correctly omitted. The provenance rule, domain allowlist, and format behavior cover what an agent needs to call this successfully; only an explicit 'what if the URL is rejected / not from search_documentation' failure note is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3 and the bar for extra credit is real. The description adds provenance semantics for url (must be a URL returned by search_documentation) and explains why raw vs. rendered content may differ (.md auto-fetch), neither of which is in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) and resource (a single documentation page) and immediately distinguishes itself from the sibling search_documentation by scoping to one page. An agent can tell exactly which of the 28 siblings this is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the prerequisite path explicitly: the URL must come from search_documentation, which tells the agent the correct call order. It also constrains where URLs may point, but does not state an explicit 'do not use this for X' exclusion or what to do when no URL is available.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_interview_definitionGet interview definitionA
Read-onlyIdempotent
Inspect

[Interviews] Get the definition/configuration of an interview (position), including its ordered questions array. The questions come back in the same format create_interview_from_questions accepts, so you can read an interview here, change the array, and send it to update_interview. Each question's id identifies it — keep the ids you did not mean to change.

Retrieves the interview definition for a given interview-definition id or position id. Returns the compiled calc_definition_json, the ordered questions array (in the same format job-interview-create-from-array accepts, so it round-trips into job-interview-update) plus basic metadata. Access is subject to the caller's row-level security.

ParametersJSON Schema
NameRequiredDescriptionDefault
position_idYesIdentifier of either an interview definition (single-stage) or a position definition (multi-stage). The function resolves whichever matches.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeYesCaller-supplied external code/reference.
nameYesInterview or position name.
slugYesURL slug of the public listing, when one was generated.
tagsYesFree-form tags. Also the coaching-catalogue mapping key: a catalogue directory lists this session when its `tags_interview_set_filter` is a subset of these tags. Null for multi-stage positions.
typeYesInterview type. Null for multi-stage positions.
stageYesHiring-pipeline stage. Null for multi-stage positions.
statusYesLifecycle status of the interview/position.
questionsYesThe interview questions, in the order they are asked, in the same format job-interview-create-from-array accepts — so this array can be edited and sent straight back to job-interview-update, or used to create a copy of this interview. Each `id` is the question's real identifier: send it back unchanged and the question keeps its existing record (and with it its answer rules and any rendered avatar video). The welcome, thank-you and instructional-video steps are NOT included — they are not questions in this format, and job-interview-update leaves them untouched. Null for multi-stage positions, whose questions live on the individual interview stages.
recordingYesPer-answer recording mode. Null for multi-stage positions.
coach_planYesCoaching-plan stage this session belongs to. Null for multi-stage positions and for sessions outside any plan.
created_atYes
updated_atYes
visibilityYesWho can see and access the interview/position.
descriptionYesShort description.
environmentYesWhich webhook environment this interview's results are delivered to. Null for multi-stage positions, whose stages each carry their own.
merchant_idYesOwning merchant id.
result_viewYesResult view level. Null for multi-stage positions.
type_creditYesCredit bucket the interview draws from. Null for multi-stage positions.
max_durationYesLive session limit in seconds. Null for multi-stage positions.
is_multistageYesTrue when the id resolved to a multi-stage position rather than a single interview.
is_voice_onlyYesConvenience flag derived from interview_template_type: true when voice-only (`interactive_elevenlabs`), false when avatar-based, null when the template type could not be resolved.
max_followupsYesMaximum number of AI follow-up questions; null uses the template default. Null for multi-stage positions.
result_scoringNoResolved result-scoring config (update field `custom_scoring`; its `max_retries` is the update field `interview_attempts`). Null means the platform defaults apply. Null for multi-stage positions.
cover_image_urlYesCover image URL.
interview_salaryYesSalary range shown for the position.
_mcp_instructionsNoServer-issued metadata for this conversation.
interview_locationYesLocation (create field `location`).
creation_parametersNoThe creation parameters recorded at build time (interview_type, interview_tone, interview_length, additional_context, include_rapport_question, include_closing_prompt, knowledge_base_store_id, seniority_level, hiring_for_company).
calc_definition_jsonNoThe compiled interview definition JSON (structure varies by interview type).
country_availabilityNoPortal availability by the candidate's country: {countries_allowed?: string[], countries_allowed_eu?: boolean, countries_blocked?: string[], countries_blocked_eu?: boolean} (ISO 3166-1 alpha-2, EU = EU + EEA + Switzerland; blocked wins), judged by the candidate's IP on the portal; invited candidates keep access. Null = not used, every country. Set it with job-interview-update.
interview_departmentYesDepartment the position belongs to.
mojito_language_codeYesPlatform (mojito) language code.
recruiter_profile_idYesProfile id of the recruiter owning this interview/position.
speech_language_codeYesAzure speech language code. Null for multi-stage positions.
speech_language_nameYesAzure speech language display name. Null for multi-stage positions.
interview_template_idYesInterview template id. For multi-stage positions this is the first interview step's template.
candidate_expectationsYesFree-text candidate expectations. Null for multi-stage positions.
pdf_export_auto_configNoAuto-PDF-report options applied when the interview completes; null when auto-export is off. Null for multi-stage positions.
recording_full_sessionYesFull-session recording mode. Null for multi-stage positions.
required_pronunciationYesWhether a pronunciation assessment is required. Null for multi-stage positions.
interview_template_typeYesType of the linked interview template. `interactive_elevenlabs` is voice-only; the others (`interactive_spatius`, `interactive_heygen`, `offline_heygen`, `offline_elai`, `offline_synthesia`) are avatar-based. Null when the template could not be resolved.
knowledge_base_store_idYesLinked knowledge base store id. Null for multi-stage positions.
questions_random_subsetYesFraction of the questions actually asked (0.01-0.9); null asks all of them. Null for multi-stage positions.
interview_available_tillYesISO date/time after which the interview is no longer available to candidates. Null means always available.
interview_description_longYesLong description (create/update field `description_long`). Rendered as Markdown on the candidate-facing position page — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
candidate_expectations_jsonNoStructured candidate expectations JSON — the scoring rubric. Null for multi-stage positions.
candidate_video_introductionYesWhether a candidate video introduction is hidden/optional/required. Null for multi-stage positions.
interview_conversation_speedYesConversation pace of the AI avatar (slower/normal/faster). Null keeps the template default. Null for multi-stage positions.
result_enable_edit_transcriptYesWhether the candidate may edit the transcript on the result view. Null for multi-stage positions.
candidate_notification_channelYesSMS / WhatsApp candidate notifications: null = off, reminders = with both e-mail reminders, last_reminder = only with the final reminder, all = invitation + reminders + pre-screening accepted.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond annotations: access is subject to row-level security, the returned `calc_definition_json` and `questions` array are disclosed, and it warns to preserve unchanged question `id`s.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description restates the same round-trip point twice: the first sentence says questions come back in the format create_interview_from_questions accepts, and the second paragraph repeats that they are in the format accepted so they round-trip into update_interview. Redundancy costs it, though the round-trip concept is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be enumerated, yet the description helpfully sketches the response shape (calc_definition_json, ordered questions, basic metadata) and adds the row-level-security caveat. It is nearly complete for a read tool, with only minor redundancy and no explicit selection guidance between sibling reads.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (position_id and conversation_id) are already documented in the schema itself. The description echoes that position_id can be an interview-definition id or a position id but adds no syntactic or format detail beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (interview definition/configuration) and clarifies it includes the ordered `questions` array. It implicitly distinguishes itself from siblings like get_interview_result_details and list_interviews by naming the definition/configuration concept and the round-trip consumers create_interview_from_questions and update_interview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the intended workflow: read the definition here, modify the array, send it to update_interview, and names the format-compatible siblings create_interview_from_questions and update_interview. It gives clear context but no explicit when-not-to-use or conditions for choosing between related read tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_interview_result_detailsGet interview result detailsA
Read-onlyIdempotent
Inspect

[Results] Get full interview result details including transcript and scores. Scores are assistive output for a human reviewer. One result is a large record, so view controls how much of it comes back — the default (standard) omits only the raw machine assessment data.

Returns an interview result with its full transcript and AI assessment. Optionally attaches signed recording URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoHow much of the record to return. Handled by the MCP server, not the JobMojito API — it only narrows the response, never the query. - `summary`: scores, the overall AI analysis, and each question with the candidate's answer — no per-answer AI commentary, recording paths or raw assessment data. Use this to review or compare candidates. - `standard`: everything a human reviewer reads: the full transcript with per-answer analysis, scores and recordings, minus the raw machine assessment blobs. This is the default. - `full`: the API response verbatim, including the raw per-answer pronunciation/sentiment data. Large — a long interview can exceed the result limit and fail. Only ask for this if you need those raw fields.standard
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
interview_result_idYesThe interview result to fetch the transcript and details for.
get_signed_recordingsNoWhen true, includes short-lived signed recording URLs for the session, the video introduction, and each transcript answer.false

Output Schema

ParametersJSON Schema
NameRequiredDescription
endNoInterview end timestamp (training_end, ISO 8601).
scoreNoOverall interview score.
startNoInterview start timestamp (training_start, ISO 8601).
statusNoCoach/interview status (coach_status), e.g. started, completed.
durationNoTotal duration in deciseconds (duration_ds).
score_textNoHuman-readable score summary.
transcriptNoOrdered interactions (questions + answers) of the interview.
ai_analysisNoCandidate-facing AI analysis of the whole interview.
score_answerNoAggregate answer sub-score.
recording_urlNoSigned session-recording URL; present only when get_signed_recordings=true.
recruiter_risksNoDetected recruiter risk flags (jsonb).
score_sentimentNoSentiment sub-score.
score_simulationNoOverall simulated score.
_mcp_instructionsNoServer-issued metadata for this conversation.
ai_analysis_otherNoSession-level AI analyses keyed by analysis name (jsonb). `strengths_concerns`: { strengths: string[], concerns: string[] } (0-4 items each, recruiter-facing; called `hiring_reasons` with `reasons_to_hire` / `reasons_not_to_hire` inside before 2026-09-15, and rows written before then may still carry that shape). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added.
recording_is_videoNoWhether the session recording is video.
score_pronunciationNoPronunciation sub-score.
ai_completion_reasonNoWhy the interview completed (ai_completed_reason).
recording_local_pathNoStorage path of the full session recording.
ai_analysis_recruiterNoRecruiter-facing AI analysis of the whole interview.
score_words_per_minuteNoSpeaking-pace (words per minute) sub-score.
video_introduction_urlNoSigned video-introduction URL; present only when get_signed_recordings=true.
user_feedback_recruiterNoRecruiter-entered feedback note.
video_introduction_local_pathNoStorage path of the candidate video introduction.
ai_analysis_recruiter_why_hireNoReasons to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.strengths, kept for existing integrations.
ai_interview_coverage_percentageNoPercentage of the intended interview the AI judged to be covered.
ai_analysis_recruiter_why_not_hireNoReasons not to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.concerns, kept for existing integrations.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive), so the bar is lower; the description adds meaningful context beyond them — that a result is a large record, that `view` is server-side narrowing and never affects the query, that `full` can exceed the result limit and fail, and the caveat that scores are assistive output for a human reviewer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then the `view` behavior, then the return summary. Slightly redundant — the default-omission point and the transcript/recording summary repeat what the schema and opening sentence already establish — but no sentence is wasted overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the safety profile, the description supplies what is still needed: the size caveat for `full`, the meaning of the default view, and the optional signed URLs. Only the absence of explicit sibling routing keeps it short of complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter, including the detailed `view` enum semantics and `get_signed_recordings`. The description largely restates that ('view controls how much of it comes back', 'Optionally attaches signed recording URLs') rather than adding new parameter meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get full interview result details including transcript and scores') and adds scope ('full ... including transcript'). It implicitly contrasts with the sibling list_interview_results by emphasizing 'full ... details' of one record, but never names that sibling, so the differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real usage context: `summary` is for reviewing or comparing candidates, `full` should only be requested when the raw fields are needed, and the default is described. It never explicitly says when to use this tool instead of list_interview_results or get_interview_definition, but the within-tool guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_merchant_analyticsGet merchant analyticsA
Read-onlyIdempotent
Inspect

[Results] Get the merchant's daily event analytics.

Daily event-count time-series for a merchant over a date range (the admin-portal analytics events graph), scoped to your token's merchant (or a merchant_id override). Optionally drilled to a single interview. Capped at 1000 records per page. Note: only day/event combinations with a non-zero count are returned — any day/event pair absent from the response should be treated as a count of 0 by the caller.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1–1000).
offsetNoNumber of records to skip from the start of the result set.
date_toYesEnd of the date range (inclusive), YYYY-MM-DD.
date_fromYesStart of the date range (inclusive), YYYY-MM-DD.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
interview_idNoOptional interview (interview_def_set) or position (position_def_set) id to drill the event counts down. The type is detected automatically: a position aggregates the daily counts across every interview that makes up the position; an interview filters to that single definition.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesDaily event counts for the requested range, ordered by day ascending. Only day/event combinations with a non-zero count are returned; missing combinations should be treated as 0 by the caller.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description adds real behavioral value beyond that: a 1000-record page cap and, importantly, the zero-suppression rule that absent day/event pairs must be treated as count 0. It doesn't cover auth requirements or rate limits, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by scope, drill-down, cap, and the sparse-result caveat in a logical order. It is a little dense, and the '[Results]' prefix is unexplained, but every sentence carries weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description still covers scope, pagination cap, drill-down, and the zero-suppression caveat. The conversation_id lifecycle is fully specified in the schema parameter, so the definition is essentially complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters and the baseline is 3. The description reinforces scoping (merchant_id override) and drill-down behavior, but its phrase 'drilled to a single interview' omits the position_def_set case that the schema documents, adding marginal rather than corrective value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: retrieve a merchant's daily event-count time-series over a date range, explicitly tied to the admin-portal analytics events graph. This is clearly distinguishable from siblings like get_merchant_credit_usage and get_merchant_status, which concern billing and account state, not event analytics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: scoped to the token's merchant by default, with merchant_id override restricted to admins/sub-merchant operators, and optional drill-down to an interview/position. It stops short of naming alternative tools or stating when-not to use it, so no explicit alternatives are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_merchant_credit_usageGet merchant credit usageA
Read-onlyIdempotent
Inspect

[Results] Get the merchant's credit usage.

Per-event credit-usage ledger for a merchant: every billable analytics event (interview, pre-screening, public avatar, simulation, …) that consumed credits, ordered most recent first. Scoped to your token's merchant, or a merchant_id override for admins / sub-merchant operators. The credits consumed by each event are in stats.credit_amount. Capped at 1000 records per page.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1–1000).
offsetNoNumber of records to skip from the start of the result set.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
interview_idNoOptional interview (interview_def_set) or position (position_def_set) id to drill the credit-usage ledger down to a single interview or position. The type is detected automatically: for a position the response combines pre-screening and interview-result credits across the whole position; for an interview it returns that interview's credit events (including simulations and report translations).
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesCredit-consuming analytics events for the merchant, most recent first. Each row is one billable event; the credits it consumed are in stats.credit_amount.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered; the description adds genuinely useful behavior beyond that — result ordering (most recent first), the 1000-record page cap, the admin-only override semantics, and where the consumed credit figure lives (stats.credit_amount). It stops short of describing auth failure modes or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A short bracketed marker, a one-line statement of purpose, then two dense sentences covering scope, ordering, field location and the page cap. Front-loaded and nearly waste-free, though the parenthetical event list ('interview, pre-screening, public avatar, simulation, …') is slightly loose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full parameter coverage, the description only needs to add the things structured fields don't carry — ordering, the 1000-record cap, scoping rules, and where the credit amount is found — and it does all of that. Nothing an agent needs to invoke this read tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, offset, merchant_id, interview_id and conversation_id, including the interview-vs-position detection logic. The description largely restates the merchant scoping rule rather than adding new parameter meaning, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get the merchant's credit usage') and immediately sharpens it into a per-event credit-usage ledger listing every billable analytics event that consumed credits, ordered most recent first. That level of detail lets an agent distinguish it from sibling reporting tools like get_merchant_analytics or get_merchant_status without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives scoping context ('scoped to your token's merchant, or a merchant_id override for admins / sub-merchant operators') and a pagination cap, which implies when the tool applies, but it never names an alternative or states when NOT to use it versus the other merchant/interview reporting tools. Usage is implied rather than instructed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_merchant_statusGet merchant statusA
Read-onlyIdempotent
Inspect

[Admin] Get a merchant status snapshot: credit balances, subscription, pending-work counts, candidate/result totals, and invitation headroom.

Status snapshot for a merchant: interview-credit balances, subscription type/status, pending-work counts (undecided / ongoing / uncredited interviews), candidate & result totals with 14-day history, and invitation headroom. Scoped to your token's merchant (or a merchant_id override for admins / sub-merchant operators). Also echoes the caller's profile_id and default_merchant_id from the token, plus the effective merchant_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
candidatesYesTotal candidates (non-archived profile_interview rows) for the merchant.
profile_idYesThe calling user's profile id (auth user id), taken from the JWT.
merchant_idYesThe merchant this status is scoped to — the default_merchant_id unless an admin / sub-merchant operator overrode it via the merchant_id query param.
invitations_sentYesInterview invitations sent during the current subscription period.
_mcp_instructionsNoServer-issued metadata for this conversation.
interview_resultsYesTotal non-archived interview results for the merchant.
invitations_limitYesMaximum invitations allowed this period (4x available credits). Null for unlimited (Special) plans.
subscription_typeYesSubscription plan name (e.g. Free, Starter, Growth, Special).
candidates_historyYesDaily new-candidate counts for the last 14 days, most recent first.
definitions_activeYesCount of active interview + position definitions.
interviews_ongoingYesInterviews currently in progress (coach_status = started).
default_merchant_idYesThe caller's home merchant id pinned in the JWT (app_metadata.merchant_id). Null if the token carries no merchant.
subscription_statusYesSubscription status (e.g. active, past_due, canceled). Null when no subscription.
interviews_undecidedYesCompleted interviews awaiting a recruiter decision.
invitations_availableYesRemaining invitations this period. Null for unlimited (Special) plans.
credits_interview_extraYesExtra (top-up) interview credits available on top of the monthly allowance.
credits_interview_singleYesSingle-position interview credits available.
interview_result_historyYesDaily new-interview-result counts for the last 14 days, most recent first.
credits_interview_monthlyYesRemaining monthly interview credits.
interviews_without_creditsYesCompleted interviews that have not yet consumed a credit.
credits_interview_monthly_limitYesMonthly interview-credit allowance for the current plan.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description adds genuine behavioral context beyond that: it is scoped to the token's merchant unless an admin override is used, and it echoes back the caller's profile_id, default_merchant_id, and effective merchant_id. It does not, however, discuss rate limits or freshness of the 14-day history.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is redundant: the opening sentence and the following paragraph both enumerate the same snapshot contents (credit balances, subscription, pending-work counts, candidate/result totals, invitation headroom). The second paragraph restates the first with minor added detail rather than front-loading new information, wasting space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover the safety profile, so the description needn't explain return values. It adequately conveys scope, admin override behavior, and echoed identifiers, leaving only minor gaps around when to prefer it over sibling reporting tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (including the detailed conversation_id continuity instructions) are fully documented in the schema. The description's mention of merchant_id scoping largely restates the schema and adds no syntax or format detail, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get a merchant status snapshot') and enumerates what the snapshot contains (credit balances, subscription, pending-work counts, candidate/result totals, invitation headroom). It is clearly distinguishable from a generic read, though it never explicitly contrasts itself with the closest siblings get_merchant_analytics or get_merchant_credit_usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives scoping rules ('Scoped to your token's merchant (or a merchant_id override for admins / sub-merchant operators)') and flags itself as [Admin], which is useful context. However, it offers no explicit when-to-use or when-not-to-use guidance versus the many sibling merchant/reporting tools, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jobmojito_configurationChoose a JobMojito merchantA
Read-onlyIdempotent
Inspect

Show the interactive JobMojito merchant picker (UI).

ALWAYS call this when the user wants to choose, switch, or set a merchant, or when a tool needs a merchant_id and none is selected. It renders a searchable picker with clickable options. Do NOT list merchants as text or ask the user to type a name — render this picker instead. After calling it, STOP and wait for the user's selection; then pass merchant_id=<chosen id> on every JobMojito call (omit it for the user's own account).

ParametersJSON Schema
NameRequiredDescriptionDefault
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds substantial behavior beyond that: it renders a UI, it requires the agent to STOP and await user selection before proceeding, and it defines a persistent merchant_id propagation rule for all subsequent JobMojito calls. That is exactly the kind of interaction-model context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The critical directive (render the picker, don't list text) is front-loaded, and every sentence is actionable rather than filler. It is slightly repetitive in restating the trigger as both an ALWAYS and a DO-NOT clause, but the redundancy is purposeful emphasis rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter UI-rendering tool with no output schema, the description covers everything needed: when to invoke, what is displayed, that control returns to the user, and how to use the resulting merchant_id afterward. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter, conversation_id, and the schema already documents it at 100% coverage including the lifecycle rules (pass unchanged, don't invent, don't reset). The description adds no additional meaning about this parameter, so the baseline of 3 applies. The merchant_id mentioned is not a parameter of this tool but downstream guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — it renders an interactive JobMojito merchant picker UI — and implicitly distinguishes itself from text-listing siblings such as list_my_merchants by forbidding that approach. An agent can tell what this tool does and how it differs from list-oriented siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger conditions ('ALWAYS call this when the user wants to choose, switch, or set a merchant, or when a tool needs a merchant_id and none is selected') and explicit exclusions ('Do NOT list merchants as text or ask the user to type a name — render this picker instead'). The post-call routing ('pass merchant_id=<chosen id> on every JobMojito call, omit it for the user's own account') closes the loop on what to do next.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_avatarsList avatars and voice templatesA
Read-onlyIdempotent
Inspect

[Admin] List available avatar/voice templates. Each item's type decides the interview modality: interactive_elevenlabs = voice-only (no video avatar); interactive_spatius = realtime interactive 3D avatar (rendered in the candidate's browser, 1.25 credits, no early stop); interactive_heygen = premium realtime interactive video avatar; offline_heygen = pre-recorded, non-interactive avatar. An item's id is the interview_template_id you pass to the create-interview tools, so pick the template whose type matches the experience you want. Note: offline_elai and offline_synthesia are legacy integrations that may still appear here but cannot be used to create new interviews. Rows are large, so this returns 15 at a time; page with offset while pagination.has_more is true, or narrow with type/filter_text.

Paginated list of a merchant's avatar templates (the admin-portal avatars list), scoped to your token's merchant (or a merchant_id override). Capped at 1000 records per page.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by avatar template type. Omit for all.
limitNoMaximum number of records to return (1–1000).
offsetNoNumber of records to skip from the start of the result set.
statusNoFilter by status. Omit for all except archived (see include_archived).
filter_textNoCase-insensitive search on template name or voice language name.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
include_publicNoAlso include public templates shared across merchants, in addition to this merchant's own.false
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
include_archivedNoInclude archived templates (excluded by default).false
mojito_language_codeNoFilter by platform language code. Omit for all languages.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe merchant's avatar templates for this page, newest-updated first.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the description is free to add the traits that matter here: large rows returned 15 at a time, paging via `offset` while `pagination.has_more`, a 1000-record page cap, and legacy integrations that render but are unusable for new interviews. These are concrete operational caveats beyond the annotation surface.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the type taxonomy are front-loaded, and the second paragraph handles scoping and page caps. Pagination is mentioned twice (first and second paragraph), which is a small redundancy, but nearly every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail is not needed, and the description still covers scoping (token merchant vs. `merchant_id` override), paging, status/archive filtering, and legacy-type caveats. An agent has everything required to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to the `type` enum (each value's modality, credit cost, and whether it can early-stop) and to paging behavior (`offset` with `pagination.has_more`, `type`/`filter_text` narrowing). That exceeds what the bare enum listing conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb and resource ('List available avatar/voice templates') and immediately explains what each returned `type` means in terms of interview modality, credits, and interactivity. It also distinguishes this from the create-interview tools by stating that an item's `id` is the `interview_template_id` those tools consume.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly routes usage: 'pick the template whose type matches the experience you want' and warns that `offline_elai`/`offline_synthesia` are legacy and cannot create new interviews. It also explains how to page and narrow. It stops just short of explicitly stating when to call this vs. get_interview_definition or list_languages, so it is clear context without explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_candidatesList candidatesA
Read-onlyIdempotent
Inspect

[Candidates] List the merchant's candidates.

Paginated list of a merchant's candidates (the admin-portal candidates list), scoped to your token's merchant (or a merchant_id override). Capped at 1000 records per page.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNoFilter candidates by recent activity. Omit (or empty) to include all.
limitNoMaximum number of records to return (1–1000).
offsetNoNumber of records to skip from the start of the result set.
sourceNoFilter by how the candidate entered: invited or self-registered. Omit for both.
order_byNoSort order of the result set.created_at_newest
filter_textNoSearch on candidate name, email, external id, phone and CV skills. Every word must match (case and accents ignored; longer words tolerate typos). Without order_by, the best matches come first.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
filter_emojiNoFilter by the candidate emoji marker.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe merchant's candidates for this page.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds that results are paginated and capped at 1000 records per page, which is modest extra context, but says nothing about total counts, auth failures, or ordering interactions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core operation and followed by scope then pagination constraints. The '[Candidates]' tag is minor noise but nothing is padded or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% parameter coverage, the description need not explain return values. It correctly covers scope and pagination cap; the only gap is that it does not position the tool against the many list_* siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all nine parameters (including enums, defaults and the conversation_id contract) are already documented in the schema. The description only reinforces the merchant_id override, adding no syntax or format detail beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List the merchant's candidates') and disambiguates the term by defining it as the admin-portal candidates list. It is clearly distinguishable from list_interviews / list_interview_results by resource, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the description explains the merchant scoping (token's merchant, or a merchant_id override) which tells the caller when the tool applies, but it never states when to prefer this over list_interviews or list_interview_results, nor any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_catalogue_directoriesList coaching catalogue directoriesA
Read-onlyIdempotent
Inspect

[Coaching catalogue] List the coaching-catalogue directories you can see (your merchant's own plus the platform-wide public ones). Start here to find a directory id, to pick a parent for a new one, or to walk the tree with parent_tag; is_start_directory marks the page the catalogue opens on. The custom Markdown page is not included — read it with get_catalogue_directory. Returns 25 at a time; page with offset while pagination.has_more is true.

Paginated list of the coaching-catalogue directories visible to you: your merchant's own, plus the platform-wide public ones unless you set include_public=false. Use it to find a directory id before updating one, to pick a parent_tag, or to walk the tree with parent_tag. The custom Markdown page is not included — fetch it per directory with catalogue-tag-get.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1–1000).
offsetNoNumber of records to skip from the start of the result set.
statusNoFilter by lifecycle status. Omit to include every status you can see (deleted directories are never returned).
parent_tagNoReturn only the directories nested directly under this one (its `tags_sub`), in the parent's own order. Combine with the other filters to narrow further.
visibilityNoFilter by visibility.
filter_textNoCase-insensitive search on the directory id, name and description.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
include_publicNoInclude the platform-wide `public` directories shared across merchants.true
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
mojito_language_codeNoFilter by the directory language. Omit for all languages.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe catalogue directories for this page, ordered by id.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description still adds real behavioral value with pagination semantics (25 per page, page with offset while pagination.has_more is true) and the include_public=false scoping behavior, though it doesn't fully explain cursor/result-shape behavior beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description contains two near-identical paragraphs that restate the same points twice — list your own plus public directories, use it to find an id/parent_tag, the Markdown page is excluded. This duplication wastes space, and the second paragraph even cites a non-sibling name (catalogue-tag-get), reducing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and rich annotations, the description needn't explain return values, and it covers the main use cases and the key scoping caveat. It is slightly incomplete on filtering interaction nuances but nothing essential to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all ten parameters in detail (conversation_id, filter_text, visibility, etc.). The description adds only marginal meaning on a few params (parent_tag nesting, include_public=false), which lands at the baseline for a fully documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (coaching-catalogue directories) plus the exact scope: the merchant's own directories plus platform-wide public ones. It explicitly distinguishes itself from get_catalogue_directory, which serves the Markdown page this tool excludes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use triggers: find a directory id before updating, pick a parent_tag for a new directory, or walk the tree with parent_tag. It also names the alternative (get_catalogue_directory) and the condition that selects it (reading the Markdown page).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_interview_resultsList interview resultsA
Read-onlyIdempotent
Inspect

[Results] List the merchant's interview results. Rows carry the candidate's scores and recruiter risk flags, so this returns 20 at a time; page with offset while pagination.has_more is true, or narrow with tab/interview_id/filter_text.

Paginated list of a merchant's interview results (the admin-portal results list), scoped to your token's merchant (or a merchant_id override). Capped at 1000 records per page.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNoFilter by decision/completion state. Omit (or empty) to include all.
stepNoFilter by pipeline step type (pre-screening, interview or meeting). Omit for all.
typeNoProduct type of results to list.interview
limitNoMaximum number of records to return (1–1000).
risksNoComma-separated list of recruiter-risk keys to filter by (matches any).
offsetNoNumber of records to skip from the start of the result set.
order_byNoSort order of the result set.created_at_newest
filter_textNoCase-insensitive search on candidate name or email.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
filter_emojiNoFilter by the candidate emoji marker.
interview_idNoFilter to a single interview definition id.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
profile_interview_idNoFilter to a single candidate (profile_interview) id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe merchant's interview results for this page.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description earns credit for adding non-obvious behavior: default 20 rows per call, a 1000-record per-page cap, and that results are scoped to the token's merchant unless merchant_id is overridden. It also notes rows carry candidate scores and recruiter risk flags, which helps an agent anticipate payload shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Roughly 85 words is well-sized for a 13-parameter paginated tool, and the paging instruction is front-loaded immediately after the purpose. There is mild redundancy between the opening 'List the merchant's interview results' and the second paragraph's 'Paginated list of a merchant's interview results', but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers the things structured fields can't: the paging loop, the per-page cap, and merchant scoping. What's left unstated is minor (e.g. it doesn't flag that `conversation_id` must be echoed back), and that detail is already carried in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all 13 parameters (including enums, defaults, and the merchant_id admin restriction), setting the baseline at 3. The description adds only light semantic value by tying paging params together via `offset`/`has_more` and restating the 20-default/1000-cap behavior already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List the merchant's interview results', 'Paginated list of a merchant's interview results') and identifies it as the admin-portal results list, which distinguishes it somewhat from list_interviews/get_interview_result_details. It never names the detail-fetching sibling as the alternative, so the differentiation is implied rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operational guidance: page with `offset` while `pagination.has_more` is true, or narrow with `tab`/`interview_id`/`filter_text`. That tells an agent how and when to drive the tool, but no exclusions or named alternatives (e.g. get_interview_result_details for a single record) are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_interviewsList interviewsA
Read-onlyIdempotent
Inspect

[Interviews] List the merchant's interview definitions.

Paginated list of a merchant's interview definitions (the admin-portal interview list), scoped to your token's merchant (or a merchant_id override). Capped at 1000 records per page.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoProduct type of interviews to list.interview
limitNoMaximum number of records to return (1–1000).
offsetNoNumber of records to skip from the start of the result set.
statusNoFilter by lifecycle status. Omit to include all statuses.
show_demoNoInclude demo/sample interviews.false
filter_textNoCase-insensitive search on the interview name.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
show_publicNoInclude interviews shared publicly across merchants (coaching/avatars).false
filter_emojiNoFilter by the interview emoji marker.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe merchant's interview definitions for this page, newest-updated first.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely useful operational context on top: the 1000-record per-page cap, the merchant-token scoping default, and the admin-only restriction on merchant_id. It stops short of describing what a page contains or how to page through beyond limit/offset.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs, front-loaded with the resource label, then scope and cap. 'Paginated list' mildly restates the title, but the second sentence carries real information without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, all ten parameters are documented in-schema, and annotations carry the safety profile. The description supplies the remaining missing pieces an agent needs: scope resolution and the page-size ceiling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all ten parameters including enums, defaults, ranges and examples; baseline 3 applies. The description only reinforces scoping (merchant_id override, 1000 cap) and adds no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the merchant's interview definitions') and clarifies it is the admin-portal interview definition list, which implicitly separates it from list_interview_results. It never explicitly names a sibling, so differentiation is left to the reader's inference between 'definitions' and 'results'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives scoping guidance — the list is bound to the token's merchant unless an admin/sub-merchant operator passes merchant_id — and states the 1000-record page cap. However, it never says when to use this tool instead of get_interview_definition or list_interview_results, and there are no exclusions or prerequisites beyond the scope note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_languagesList supported languagesB
Read-onlyIdempotent
Inspect

[Admin] List supported platform (mojito) languages: the code to pass as mojito_language_code, English/local names, SVG flag URL, per-interface enablement flags, and Azure speech accents.

Returns all supported platform (mojito) languages: the mojito language code, English and local names, and an SVG flag image URL. Use the code as mojito_language_code when creating interviews or personas.

ParametersJSON Schema
NameRequiredDescriptionDefault
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
languagesYesSupported platform languages, sorted by English name.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the '[Admin]' qualifier and the returned field list, but discloses nothing about permissions, rate limits, or freshness beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence and the follow-up sentence overlap heavily, repeating English/local names and the SVG flag URL, and the second sentence drops the 'per-interface enablement flags' and 'Azure speech accents' items without explanation. Front-loading is fine but the redundancy costs it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only discovery tool with full annotations and an output schema, the definition is essentially complete. The only gap is the missing routing guidance, and the restated return-value prose is redundant against the output schema but not harmful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter (conversation_id) has 100% schema description coverage with detailed protocol instructions, so the schema carries the load. The description mentions 'code' only as a returned field, adding no input-parameter meaning; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List supported platform (mojito) languages') and enumerates the returned fields, so an agent knows exactly what it yields. It is clear but does not need sibling differentiation, since no other tool in the list serves this purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the sentence 'Use the `code` as `mojito_language_code` when creating interviews or personas' tells the agent how to consume the output, not when to call this tool versus alternatives. There is no explicit when-to-use or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_my_merchantsList merchants you can act asA
Read-onlyIdempotent
Inspect

FALLBACK merchant list for clients WITHOUT UI support.

Do NOT use this to choose or switch merchants when a UI is available — call jobmojito_configuration instead (it renders an interactive picker), and do not hand-format a merchant list as text. Use this tool only when the client cannot render MCP App UI. Returns the user's own account plus any sub-merchants; after a pick, pass merchant_id=<chosen id> on subsequent calls (OMIT for the own account).

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoOptional case-insensitive filter on sub-merchant name.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), yet the description adds genuinely new behavioral context: the fallback trigger condition, the downstream protocol (pick a merchant then pass merchant_id=<chosen id> on later calls, omitting it for the own account), and the anti-pattern to avoid. That multi-step flow context is not derivable from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the decisive constraint ('FALLBACK merchant list for clients WITHOUT UI support') before any procedural detail, and every subsequent sentence carries an instruction. It is slightly dense with parentheticals and backticked names, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the remaining burden — fallback condition, alternative tool, follow-up call protocol — is fully covered. Nothing an agent needs in order to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented, which sets a baseline of 3. The description goes beyond that by explaining how the returned selection should be threaded into subsequent calls via merchant_id, including the omit-for-own-account case — semantics the schema for this tool cannot express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('merchant list') and immediately qualifies its scope as a FALLBACK path for clients without UI support, which separates it from jobmojito_configuration and list_sub_merchants. An agent knows both what it returns (own account plus sub-merchants) and what it is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the preferred alternative (jobmojito_configuration), the condition that selects this tool (client cannot render MCP App UI), and two prohibitions: do not use it to choose/switch merchants when a UI exists, and do not hand-format a merchant list as text. This is textbook when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sub_merchantsList sub-merchantsA
Read-onlyIdempotent
Inspect

[Admin] List sub-merchants under the merchant account.

Paginated list of the sub-merchants the caller administers (the admin-portal sub-merchants list). Visibility is enforced by row-level security. Capped at 1000 records per page.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1–1000).
offsetNoNumber of records to skip from the start of the result set.
order_byNoSort order of the result set.created_at_newest
filter_textNoCase-insensitive search on the sub-merchant name.
merchant_idNoOptional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe sub-merchants the caller administers for this page.
paginationYes
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false, idempotentHint=true), so the safety profile is covered. The description still adds useful non-annotation context: visibility is row-level-security enforced and results are capped at 1000 per page, which tells the agent to paginate rather than expect a full dump.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the admin scope front-loaded and no filler. The parenthetical restating 'the admin-portal sub-merchants list' is mildly redundant with the opening sentence but does not bloat the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no prose, and 100% schema coverage handles parameters. The description supplies the remaining behavioral essentials (admin-only, RLS visibility, page cap) for a read-only paginated list, leaving nothing an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter including limit, offset, order_by, filter_text, merchant_id, and conversation_id is already documented in the schema. The description adds no parameter-level meaning beyond that, which is the correct baseline of 3 when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List sub-merchants') and scopes it with the '[Admin]' prefix plus 'the sub-merchants the caller administers'. It is clear what the tool returns, but it never names the obvious sibling list_my_merchants, so the agent must infer the boundary between the two.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The '[Admin]' marker and 'admin-portal sub-merchants list' phrasing imply when this tool applies, and the merchant_id schema note explains scoping. However, there is no explicit statement of when to prefer this over list_my_merchants or any other list tool, and no prerequisites are called out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

register_users_for_interviewRegister candidates for interviewA
Destructive
Inspect

[Interviews] Register users/candidates for a specific interview and return their personal interview links.

Registers (or updates) one or more candidate profiles for an interview and returns a one-time interview URL for each. Accepts a Supabase user JWT (merchant/admin) or the service key (merchant_id then required).

ParametersJSON Schema
NameRequiredDescriptionDefault
usersYesCandidates to register for the interview. Each gets a one-time interview URL.
is_testNoWhen true (or the string "true"), mints a test token that can take a draft/unpublished interview and flags the result as a test. For a DRAFT interview it also recompiles the definition (interview_recalc_definition) first, so the test session includes the current questions/welcome. This makes it a single-call "trigger interview test".
hide_menuNoWhen true (or the string "true"), the interview UI hides its menu (view_hm).
send_emailNoWhether to send an invitation email to each registered candidate.
hide_iframeNoWhen true (or the string "true"), the interview UI hides its iframe chrome (view_hi).
merchant_idNoMerchant id. Required when authenticating with the service key; for user tokens it is optional and only honored for admin / sub-merchant accounts.
interview_idYesInterview definition (interview_def_set) or position (position_def_set) id to register users for.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesThe input users, each annotated with its registration result and (on success) interview URL.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the bar is lower. The description adds useful context beyond that: it is an upsert ('Registers (or updates)'), returns one-time URLs, and discloses the two auth modes, but it does not say who is notified, whether existing profiles are overwritten, or the consequences of the destructive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and outcome. Mild redundancy in the second sentence (the one-time URL was already implied by 'return their personal interview links'), but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich schema, an output schema, and safety annotations, the description needs only to frame the operation and auth modes — both of which it does. It is complete enough for an agent to call correctly, though it stops short of routing the agent away from overlapping siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter thoroughly (phone semantics, merchant_id auth conditions, conversation_id protocol). The description only restates the merchant_id/service-key rule, adding essentially nothing beyond the structured fields — the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Register users/candidates for a specific interview') plus the return value (personal interview links), so the core action is unambiguous. It does not, however, distinguish itself from the sibling 'generate_interview_url', which plausibly overlaps in the 'get a link' space.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives authentication context (Supabase user JWT vs service key, with merchant_id required for the latter), which hints at when the tool is callable, but offers no explicit when-to-use/when-not guidance relative to siblings like generate_interview_url or request_another_interview_attempt. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_another_interview_attemptRe-open interview for another attemptA
Destructive
Inspect

[Results] Re-open a submitted interview result so the candidate can retry.

Marks a submitted (active + completed) interview result as unsuccessful so the candidate can retake it. Resets the result to draft and clears the recruiter decision.

ParametersJSON Schema
NameRequiredDescriptionDefault
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
interview_result_idYesThe interview result to reopen for another attempt.

Output Schema

ParametersJSON Schema
NameRequiredDescription
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds genuinely useful detail beyond that: it marks the result unsuccessful, resets it to draft, and clears the recruiter decision — a concrete account of what state is destroyed and changed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, with the action front-loaded and the state-change consequences following. The '[Results]' tag adds categorization value; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and annotations cover the destructive profile. The description covers the mutation's effects well; only permission/auth prerequisites are unstated, a minor gap for a simple two-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; interview_result_id is documented in the schema and conversation_id carries an extensive description there. The description adds no parameter syntax or format detail beyond what the schema already provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Re-open a submitted interview result') and frames the outcome ('so the candidate can retry'). The 'interview result' scoping cleanly separates it from sibling interview-level tools like create_interview, set_interview_state, and get_interview_result_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The clause 'so the candidate can retry' implies the use case, and 'submitted (active + completed)' narrows the applicable state. But no alternative is named (e.g., vs set_interview_state) and no explicit when-not condition is given, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_documentationSearch JobMojito documentationA
Read-onlyIdempotent
Inspect

Search ALL JobMojito documentation. This is the single entry point.

One call searches both documentation sources in parallel and returns a merged, source-labeled list — you do not need to choose a source or call a separate tool: • "developer" — developer.jobmojito.com: API reference, request/response schemas, tables, webhooks, code examples, integration guides. • "help" — help.jobmojito.com: recruiter, candidate, and administrator product guides (how the platform behaves for end users).

Use this whenever you need to understand how a feature, endpoint, field, or workflow works — including before calling an action tool you're unsure about. Then call get_documentation(url) with a returned URL to read the full page.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results per source (1-25).
queryYesNatural-language search query or keywords.
sourceNo"all" (default), "developer", or "help" to restrict the search.all
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description still adds real behavioral context beyond them: the search fans out over both sources in parallel and returns a merged, source-labeled result rather than requiring separate calls. It does not discuss pagination or result ranking, keeping it just short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core claim ('Search ALL JobMojito documentation. This is the single entry point.') before any detail, and the bullet list is dense and informative rather than padding. It runs slightly long for a search tool, costing it the top score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-format details are not needed. The description still covers purpose, source semantics, when to invoke versus the read-full-page sibling, and the parallel-search behavior — nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes further by explaining what the 'developer' and 'help' source values actually cover (API reference/schemas/webhooks vs. recruiter/candidate/admin product guides), which gives semantic meaning the bare enum-less source parameter lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (ALL JobMojito documentation) and explicitly positions itself as 'the single entry point' that searches both sources in parallel. It names get_documentation as the separate follow-up tool, so an agent can distinguish it from siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('whenever you need to understand how a feature, endpoint, field, or workflow works — including before calling an action tool you're unsure about') and names the alternative path (call get_documentation(url) to read the full page). It also removes a decision point by stating the agent need not choose a source.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_interview_stateChange interview stateA
DestructiveIdempotent
Inspect

[Interviews] Change the state of an interview/position (e.g. open, closed).

Changes the lifecycle status of an interview or position (draft, active, archived, preparing, completed, deleted) and/or manages its embed key. Provide at least one of status or is_embedded.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoNew lifecycle status to apply.
is_embeddedNoControls iframe embedding of the interview on an external page. When true, ensures an embed key exists (returns embed_id/embed_signing_key, used to authenticate/sign the iframe embed). When false, removes the embed keys (disables embedding).
position_idYesInterview definition id or position id whose state should change.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesReturns `{ embed_id, embed_signing_key }` when an embed key was created/returned (is_embedded=true), otherwise `{ success: true }`.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose destructiveHint, idempotentHint, openWorldHint and non-readonly, so the safety profile is covered. The description adds independent value by disclosing the embed-key side effect (creating vs removing embed keys) and the cross-parameter requirement. Minor confusion: the intro examples 'open, closed' do not appear in the actual enum.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the scope and followed by the values and the at-least-one requirement. No filler, though the duplicated 'e.g. open, closed' example is slightly redundant and inconsistent with the enum.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the mutation semantics. The description supplies the lifecycle values, the embed-key side effect and the input constraint, leaving only sibling differentiation as a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents each field. The description adds the cross-parameter constraint that at least one of `status`/`is_embedded` must be supplied and frames the two as an either/or, which is meaning not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (change the lifecycle status of an interview/position) and enumerates the status values plus the embed-key side operation. It is clear what the tool does, but it never distinguishes itself from the sibling update_interview, leaving the agent to guess which one to pick for a status change.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives one real usage constraint: 'Provide at least one of `status` or `is_embedded`.' That is useful, but there is no guidance on when to prefer this tool over update_interview or generate_interview_url, and no mention of prerequisites or when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_catalogue_directoryUpdate coaching catalogue directoryA
DestructiveIdempotent
Inspect

[Coaching catalogue] Update a coaching catalogue directory: rename it, change which sessions it lists (tags_interview_set_filter), re-order its sub-directories (tags_sub), or author its custom Markdown page (content_md). Only the fields you send are changed. Coaching-platform feature.

Updates a directory (page) of the coaching portal catalogue. Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. Use it to rename a directory, re-point which sessions it lists (tags_interview_set_filter), re-order or replace its sub-directories (tags_sub), or author its custom Markdown page (content_md).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId of the directory to update (the catalogue URL segment). The id itself cannot be changed — create a new directory instead.
nameNoDisplay name of the directory.
statusNoLifecycle status of the catalogue directory. Options — `draft`: Not published — the directory exists but is not served to visitors. | `active`: Published and served in the catalogue. | `archived`: Retired — kept for reference but no longer served..
tags_subNoIds of the directories nested under this one, in display order. Replaces the whole list — send the full set, not just the additions. A referenced directory only appears if it exists and is visible to the viewer.
coach_planNoCoaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit/null to leave it out of any plan. Options — `demo`: Demo session. | `screening`: Screening-interview practice. | `2nd`: Second-interview practice. | `3rd`: Third-interview practice. | `closing`: Closing / salary-negotiation practice. | `job-specific`: Job-specific coaching. | `other`: Anything that does not fit the other buckets..
content_mdNoMarkdown for the custom directory page. Sending null removes the custom page and restores the default grid; sending a string replaces the whole page. Directives, each ALONE on its own line: `[plan-progress]`, `[directory:<tag-id>]`, `[session:<interview-id>]`, `[sessions]`, `[sessions:<term>]`, `[sessions:filter=<term>,limit=<n>]`. Chips, callouts, cards, columns and buttons are available too — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
visibilityNoWho can see the catalogue directory. Options — `public`: Shared across every merchant. Platform admins only — a merchant caller is rejected by row-level security. | `merchant_public`: Listed in the merchant's own catalogue — the normal choice. | `merchant_invite`: Owned by the merchant but not listed; reachable only for invited users. | `merchant_unlisted`: Owned by the merchant but not listed; reachable only via a direct link..
descriptionNoShort description shown on the directory card.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
cover_image_urlNoCover image URL shown on the directory card. null clears it.
mojito_language_codeNoLanguage of the directory (one of the platform-languages.json codes). The catalogue groups directories by language.
tags_interview_set_filterNoTag filter selecting which coaching sessions this directory lists: a session appears when its own `tags` contain EVERY tag here (an AND, not an OR). Only `active` coaching/persona sessions with visibility `public` or `merchant_public` are listed. Set the matching tags on the session with the create-interview / job-interview-update `tags` field.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesId of the updated directory.
catalogue_urlYesPublic URL of the directory page, when the merchant has a coaching-portal domain configured. Null otherwise.
updated_fieldsYesNames of the fields that were written.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so safety is covered. The description adds real behavioral value beyond that: partial-update semantics ('only the fields present in the request body are written') and the null-clears-a-field rule ('sending null removes the custom page'). It does not expand on the destructive profile (e.g. that replacing tags_sub drops the whole previous list is only in the schema), which keeps it at a solid 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the tool name and operations, but the two paragraphs are largely redundant: 'Only the fields you send are changed' and 'Only the fields present in the request body are written' say the same thing, and the four supported operations are listed twice. The duplication costs it a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the annotations carry the safety profile. The description covers the partial-update contract and the main editable fields, leaving only minor gaps (destructive scope of list replacements is schema-only), so it is nearly complete for a 12-param mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 12 parameters thoroughly, including enums and examples. The description restates a few field meanings (tags_interview_set_filter, tags_sub, content_md) but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (update) and resource (coaching catalogue directory) and enumerates the concrete operations: rename, re-point session listings, re-order sub-directories, author the Markdown page. Purpose is unambiguous, though it never names its create/get siblings, so differentiation is left to the tool name rather than the prose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to reach for it by listing the field-level operations it supports, but offers no explicit when-to-use/when-not guidance and never names an alternative (e.g. create_catalogue_directory for a new id). Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_interviewUpdate interview or positionA
DestructiveIdempotent
Inspect

[Interviews] Update the configuration of an existing interview/position: name, description, avatar template, recording, scoring, tags and the rest of the create-time settings. Only the fields you send are changed. To change the questions, send questions — the WHOLE list you want the interview to end up with, in order, in the format get_interview_definition returns. OMIT questions and the existing questions are left completely alone; there is no way to change one question on its own, so read the interview first, edit that array, and send it back. Resending an unchanged array does nothing. Not updated by this tool at all: the welcome and thank-you messages and the instructional-video screen (stored as steps, not questions), and the language, which the existing questions are already written in. Use tags to place a coaching session into a catalogue directory. MULTI-STAGE POSITIONS: some per-interview settings do not exist at position level and are rejected with a 422 naming the field — candidate_expectations_json is the one seen in practice. Read the position with get_interview_definition, then update the individual stage you mean instead of sending that field to the position.

Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoExternal code/reference. Blank is stored as null.
nameNoInterview / position name.
tagsNoFree-form tags stored on the interview. Tags are also the coaching-catalogue mapping key: a catalogue directory (see the catalogue-tag-create / catalogue-tag-update endpoints) lists a coaching or persona session when the session's tags contain EVERY tag in that directory's `tags_interview_set_filter`. Only `active` sessions with visibility `public` or `merchant_public` are listed.
typeNoProduct type of the interview. Changing it also re-derives `type_credit` (null for interview/assessment, otherwise interview_coach_manager) unless you send `type_credit` explicitly. Single-stage interviews only.
statusNoNew lifecycle status. Applied through the same interview_set_status routine as job-interview-set-state (which is also where you manage the iframe embed key).
locationNoInterview location (column `interview_location`). Blank is stored as null.
questionsNoOPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — this endpoint only touches questions when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format job-interview-create-from-array accepts and job-interview-get returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array job-interview-get gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. `questions_diff` in the response reports exactly what was decided. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. The welcome, thank-you and instructional-video steps are not part of this array and are left in place. Single-stage interviews only; for a multi-stage position, update its interview stages individually.
recordingNoCheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit/null to disable. Options — `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only. | `audio_all`: Audio-only cheating detection on every answer. | `video_all`: Audio + video cheating detection on every answer (candidate is recorded for all answers). | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only..
coach_planNoCoaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit/null to leave it out of any plan. Options — `demo`: Demo session. | `screening`: Screening-interview practice. | `2nd`: Second-interview practice. | `3rd`: Third-interview practice. | `closing`: Closing / salary-negotiation practice. | `job-specific`: Job-specific coaching. | `other`: Anything that does not fit the other buckets..
visibilityNoWho can discover and access the interview. Options — `merchant_public`: Listed on the merchant's public interview list — anyone with the merchant link can find and start it. | `merchant_invite`: Invite-only — only candidates explicitly invited (by email/link) can access it; not listed anywhere. | `merchant_unlisted`: Reachable only via a direct link — not listed anywhere; share the link manually..
descriptionNoShort interview description.
environmentNoWhich of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..
position_idYesId of the interview definition (single-stage) or position definition (multi-stage) to update. The same id you pass to job-interview-get.
result_viewNoResult screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown. Options — `none`: No results screen at all — the interview is submitted immediately when the candidate finishes (no feedback, intro video, transcript edit or manual submit step). | `minimal`: Minimal results layout, no score shown. | `minimal_with_score`: Minimal results layout including the overall score. | `advanced`: Advanced results layout with more detail. | `full`: Full results layout with all sections. | `full_expand_scores`: Full results with every score breakdown expanded..
type_creditNoCredit bucket the session draws from. Only meaningful for candidate-paid coaching/persona sessions; hiring interviews and assessments are merchant-billed and carry null. Options — `resume_check`: Resume-check credits. | `interview_coach_starter`: Coaching credits — starter tier. | `interview_coach_contributor`: Coaching credits — contributor tier. | `interview_coach_manager`: Coaching credits — manager tier. | `cover_letter`: Cover-letter credits..
max_durationNoLive session limit in seconds. Also the basis for the credit multiplier.
max_followupsNoMaximum number of AI follow-up questions. 0 disables follow-ups; presets are 0-3 (none/low/normal/high) and custom values start at 4; null uses the template default (Normal).
custom_scoringNoResult-scoring overrides (max_score, early_stop, speech_cadence, ai_pronunciation, sentiment_analysis, ai_assessment_answer, ai_assessment_resume, ai_assessment_session). Merged onto the stored configuration, so keys you omit keep their current value.
interview_toneNoTone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script..
interview_typeNoInterview style — configures the AI avatar and the follow-up questions it generates during the interview. Stored in creation_parameters; existing questions are NOT regenerated. Options — `pre-screening`: Pre-screening — quick qualification check focusing on basic requirements and availability. | `pre-screening-with-test-questions`: Pre-screening with test questions — pre-screening plus practical questions to test relevant skills. | `second-interview`: Second round interview — deeper dive for candidates who passed initial screening. | `remote-freelancer-verification`: Remote worker verification — verify remote work capabilities and communication skills. | `strength-based-interview`: Strength-based interview — focus on what candidates enjoy and excel at to predict job satisfaction. | `potential-based-interview`: Potential-based interview — assess learning ability and growth potential rather than past experience. | `process-verification-from-knowledge-base`: Knowledge Base interview — generate questions from your knowledge base documents..
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
cover_image_urlNoCover image URL.
seniority_levelNoTarget seniority level for the role; auto-detected from the job description when omitted. Options — `entry-level`: Early-career or graduate roles. | `intermediate`: Some experience required. | `senior`: Experienced professional. | `managerial`: Team or department lead. | `director`: Director-level responsibility. | `executive`: C-suite or executive role..
description_longNoLong-form interview description (column `interview_description_long`). Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
interview_salaryNoSalary range shown for the position. Blank is stored as null.
hiring_for_companyNoWho the position is really for. null (or an object with name null/blank) means hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size. Stored in creation_parameters.hiring_for_company.
interview_attemptsNoAllowed candidate attempts (1-20). Stored as result_scoring.max_retries.
country_availabilityNoWhich countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows "not available in your region". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. Null = not used, every country.
interview_departmentNoDepartment the position belongs to. Blank is stored as null.
recruiter_profile_idNoProfile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it.
interview_template_idNoId of the interview template (avatar/voice) to use. Must reference an existing interview_templates row. Also decides the modality — see list_avatars / merchant-avatar-list.
candidate_expectationsNoFree-text candidate expectations.
pdf_export_auto_configNoAuto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.
recording_full_sessionNoFull interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit/null to disable. Options — `audio_all`: Record the whole session audio (avatar + candidate voice) into a single file. Adds +0.2 credits. | `video_all`: Record the whole session video + audio (avatar + candidate) into a single file. Adds +0.4 credits..
required_pronunciationNoRequire pronunciation assessment (restricts to pronunciation-capable languages).
knowledge_base_store_idNoKnowledge base store id the interview draws context from; validated for existence. null unlinks it.
questions_random_subsetNoAsk only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions.
interview_available_tillNoISO date/time after which the interview is no longer available to candidates. null keeps it always available.
candidate_expectations_jsonNoStructured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved.
candidate_video_introductionNoWhether a candidate video introduction is hidden, optional or required. null is treated like hidden.
interview_conversation_speedNoConversation pace of the AI avatar. Omit/null keeps the template default pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation..
result_enable_edit_transcriptNoAllow editing the transcript on the result view.
candidate_notification_channelNoSMS / WhatsApp notifications to the candidate, sent alongside the e-mails: "reminders" = with both e-mail reminders (day 1 and day 3); "last_reminder" = only with the final day-3 reminder; "all" = invitation, both reminders and the pre-screening-accepted step. null switches them off. WhatsApp is tried first, SMS when the number is not on WhatsApp. Available on paid plans (Starter and above) and needs a phone number on the candidate.
regenerate_candidate_expectationsNoRe-derive the interview-level `candidate_expectations_json` scoring rubric from the resulting question list, the way job-interview-create-from-array derives it at creation time. Only applies when `questions` is sent, the interview type is `interview`, and `candidate_expectations_json` is not also being set explicitly (an explicit value wins).

Output Schema

ParametersJSON Schema
NameRequiredDescription
position_idYesThe id that was updated.
is_multistageYesTrue when the id resolved to a multi-stage position (position_def_set) rather than a single interview.
questions_diffNoWhat the question diff decided, question by question. Absent when `questions` was not sent.
updated_fieldsYesNames of the stored columns that were written, plus `status` when the lifecycle status was changed and `questions` when the question list was diffed.
_mcp_instructionsNoServer-issued metadata for this conversation.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true, so the safety profile is known, and the description goes well beyond them: partial-update semantics (only sent fields written, null clears nullable), the diff mechanics (match on external_id then id then content; edited questions unlink-and-recreate; nothing is ever deleted because questions are shared records), the active-interview restriction on question edits, and the immutable `mojito_language_code`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and scannable, but the description is essentially written twice: the second paragraph restates the first's points about questions handling, the welcome/thank-you steps, and the multi-stage 422. A large fraction of the text is redundant with itself, which dilutes rather than adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 44-parameter mutation tool with an output schema available, the description covers what the structured fields cannot: partial-write semantics, question-diff behavior and its response field (`questions_diff`), status-dependent editability, and immutable fields. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real operational meaning on top of the schema — the read-edit-resend workflow for `questions`, the fact that re-sending an unchanged array is a no-op, and the `tags`-as-catalogue-mapping key. These are workflow semantics rather than mere parameter restatement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update the configuration of an existing interview/position') and immediately scopes it: single-stage interview vs multi-stage position, with the exact field families affected (name, description, avatar template, recording, scoring, tags). An agent can distinguish it from create_interview and set_interview_state without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when/when-not guidance: omit `questions` to leave questions alone, read the interview first and send the whole array back, use `tags` for coaching-catalogue placement, and for multi-stage positions update the individual stage rather than sending interview-only fields. It even names the failing field (`candidate_expectations_json`) and the 422 outcome.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_knowledge_base_documentUpload knowledge base documentA
Destructive
Inspect

[Knowledge base] Upload and process a knowledge base document (multipart form-data).

Uploads a document to a knowledge base store and queues it for processing. Accepts the file either as multipart/form-data (binary file) or as application/json (base64 file).

ParametersJSON Schema
NameRequiredDescriptionDefault
fileYesThe document file (binary).
nameNoDocument name (with extension). Falls back to the uploaded file name for multipart.
merchant_idNoOverride merchant id (admin / sub-merchant only).
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
knowledge_base_store_idYesThe knowledge base store to add the document to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
_mcp_instructionsNoServer-issued metadata for this conversation.
knowledge_base_idYesId of the created knowledge_base record.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation/destructive/non-idempotent profile, so the bar is lower. The description still adds real behavioral value beyond them: it discloses that processing is asynchronous ('queues it for processing') and that the file may arrive as multipart binary or JSON base64. It does not address permissions or duplicate-upload consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, front-loaded with the bracketed domain tag and the core action, then the processing/format details. No filler and nothing redundant with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and annotations cover the safety profile. The description supplies the async-processing and encoding context an agent needs; only permission/auth requirements and behavior on re-upload of the same document are left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description genuinely extends the 'file' parameter by explaining the two accepted encodings (multipart binary vs. application/json base64), which the schema's 'format: binary' alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Upload and process a knowledge base document') and reinforces it with 'Uploads a document to a knowledge base store and queues it for processing.' No sibling tool performs document upload, so the scope is unambiguous even without explicit differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the description (adding a document to a KB store) and the dual content-type note hints at two invocation paths, but there is no explicit when-to-use/when-not guidance or named alternative. Since no sibling competes for this job, the omission is tolerable but still a gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 2 tool updates
    • Changedget_interview_definition1 field changed
      • addedOutput schema / properties / country_availability
        Added value: +{
        +  "description": "Portal availability by the candidate's country: {countries_allowed?: string[], countries_allowed_eu?: boolean, countries_blocked?: string[], countries_blocked_eu?: boolean} (ISO 3166-1 alpha-2, EU = EU + EEA + Switzerland; blocked wins), judged by the candidate's IP on the portal; invited candidates keep access. Null = not used, every country. Set it with job-interview-update."
        +}
    • Changedupdate_interview1 field changed
      • addedInput schema / properties / country_availability
        Added value: +{
        +  "description": "Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. Null = not used, every country.",
        +  "properties": {
        +    "countries_allowed": {
        +      "description": "Available ONLY to candidates in these countries (ISO 3166-1 alpha-2).",
        +      "example": [
        +        "PH",
        +        "IN"
        +      ],
        +      "items": {
        +        "pattern": "^[A-Za-z]{2}$",
        +        "type": "string"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "countries_allowed_eu": {
        +      "description": "Adds every EU country (plus EEA and Switzerland) to countries_allowed.",
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "countries_blocked": {
        +      "description": "NOT available to candidates in these countries (ISO 3166-1 alpha-2). Wins over the allowed side.",
        +      "example": [
        +        "US"
        +      ],
        +      "items": {
        +        "pattern": "^[A-Za-z]{2}$",
        +        "type": "string"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "countries_blocked_eu": {
        +      "description": "Adds every EU country (plus EEA and Switzerland) to countries_blocked.",
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
  2. 1 tool update
    • Changedlist_candidates2 fields changed
      • changedInput schema / properties / filter_text / description
        Previous value: -"Case-insensitive search on candidate name or email."New value: +"Search on candidate name, email, external id, phone and CV skills. Every word must match (case and accents ignored; longer words tolerate typos). Without order_by, the best matches come first."
      • addedOutput schema / properties / data / items / properties / skills
        Added value: +{
        +  "description": "Skills read from the candidate's latest CV; null until extracted.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
  3. 29 tool updates
    • Changedcreate_catalogue_directory1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedcreate_interview1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedcreate_interview_from_questions1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedcreate_persona1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedgenerate_interview_report1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedgenerate_interview_url1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedget_catalogue_directory1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedget_documentation1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedget_interview_definition1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedget_interview_result_details1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedget_merchant_analytics1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedget_merchant_credit_usage1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedget_merchant_status1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedjobmojito_configuration1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedlist_avatars1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedlist_candidates1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedlist_catalogue_directories1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedlist_interview_results7 fields changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
      • changedInput schema / properties / step / description
        Previous value: -"Filter by pipeline step (pre-screening vs interview). Omit for both."New value: +"Filter by pipeline step type (pre-screening, interview or meeting). Omit for all."
      • changedInput schema / properties / step / enum
        Previous value: -[
        -  "pre-screening",
        -  "interview"
        -]New value: +[
        +  "pre-screening",
        +  "interview",
        +  "meeting"
        +]
      • addedOutput schema / properties / data / items / properties / position_def_step_id
        Added value: +{
        +  "description": "Position step definition id the row belongs to (null for single-stage interviews).",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / data / items / properties / position_step_count
        Added value: +{
        +  "description": "Number of steps in the position process.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / data / items / properties / position_step_index
        Added value: +{
        +  "description": "1-based position of the step in the position process.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / data / items / properties / position_step_name
        Added value: +{
        +  "description": "Custom name of the position step, null when the step uses its default label.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedlist_interviews1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedlist_languages1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedlist_my_merchants1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedlist_sub_merchants1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedregister_users_for_interview1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedrequest_another_interview_attempt1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedsearch_documentation1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedset_interview_state1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedupdate_catalogue_directory1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedupdate_interview1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    • Changedupload_knowledge_base_document1 field changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
  4. 3 tool updates
    • Changedget_interview_definition2 fields changed
      • addedOutput schema / properties / candidate_notification_channel
        Added value: +{
        +  "description": "SMS / WhatsApp candidate notifications: null = off, reminders = with both e-mail reminders, last_reminder = only with the final reminder, all = invitation + reminders + pre-screening accepted.",
        +  "enum": [
        +    "reminders",
        +    "last_reminder",
        +    "all",
        +    null
        +  ],
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "created_at",
        -  "updated_at",
        -  "questions",
        -  "is_multistage",
        -  "status",
        -  "visibility",
        -  "stage",
        -  "type",
        -  "environment",
        -  "code",
        -  "interview_location",
        -  "cover_image_url",
        -  "merchant_id",
        -  "interview_template_id",
        -  "interview_template_type",
        -  "is_voice_only",
        -  "knowledge_base_store_id",
        -  "mojito_language_code",
        -  "speech_language_code",
        -  "speech_language_name",
        -  "recording",
        -  "recording_full_session",
        -  "type_credit",
        -  "result_view",
        -  "candidate_video_introduction",
        -  "description",
        -  "interview_description_long",
        -  "candidate_expectations",
        -  "interview_department",
        -  "interview_salary",
        -  "interview_available_till",
        -  "recruiter_profile_id",
        -  "slug",
        -  "tags",
        -  "coach_plan",
        -  "interview_conversation_speed",
        -  "max_followups",
        -  "max_duration",
        -  "questions_random_subset",
        -  "required_pronunciation",
        -  "result_enable_edit_transcript"
        -]New value: +[
        +  "name",
        +  "created_at",
        +  "updated_at",
        +  "questions",
        +  "is_multistage",
        +  "status",
        +  "visibility",
        +  "stage",
        +  "type",
        +  "environment",
        +  "code",
        +  "interview_location",
        +  "cover_image_url",
        +  "merchant_id",
        +  "interview_template_id",
        +  "interview_template_type",
        +  "is_voice_only",
        +  "knowledge_base_store_id",
        +  "mojito_language_code",
        +  "speech_language_code",
        +  "speech_language_name",
        +  "recording",
        +  "recording_full_session",
        +  "type_credit",
        +  "result_view",
        +  "candidate_video_introduction",
        +  "description",
        +  "interview_description_long",
        +  "candidate_expectations",
        +  "interview_department",
        +  "interview_salary",
        +  "interview_available_till",
        +  "candidate_notification_channel",
        +  "recruiter_profile_id",
        +  "slug",
        +  "tags",
        +  "coach_plan",
        +  "interview_conversation_speed",
        +  "max_followups",
        +  "max_duration",
        +  "questions_random_subset",
        +  "required_pronunciation",
        +  "result_enable_edit_transcript"
        +]
    • Changedregister_users_for_interview2 fields changed
      • addedInput schema / properties / users / items / properties / phone
        Added value: +{
        +  "description": "Optional mobile number in international format (E.164, e.g. +421903123456). Enables SMS / WhatsApp invitation and reminder notifications when the interview has candidate_notification_channel set. Never overwrites a phone already stored on the candidate.",
        +  "example": "+421903123456",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / phone
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedupdate_interview1 field changed
      • addedInput schema / properties / candidate_notification_channel
        Added value: +{
        +  "description": "SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: \"reminders\" = with both e-mail reminders (day 1 and day 3); \"last_reminder\" = only with the final day-3 reminder; \"all\" = invitation, both reminders and the pre-screening-accepted step. null switches them off. WhatsApp is tried first, SMS when the number is not on WhatsApp. Available on paid plans (Starter and above) and needs a phone number on the candidate.",
        +  "enum": [
        +    "reminders",
        +    "last_reminder",
        +    "all",
        +    null
        +  ],
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  5. 29 tool updates
    • Changedcreate_catalogue_directory2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcreate_interview2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcreate_interview_from_questions2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcreate_persona2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedgenerate_interview_report2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedgenerate_interview_url2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_catalogue_directory2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_documentation2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "_mcp_instructions": {
        +    "description": "Server-issued metadata for this conversation.",
        +    "properties": {
        +      "conversation_id": {
        +        "description": "The server-issued conversation identifier.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
    • Changedget_interview_definition2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_interview_result_details2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_merchant_analytics2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_merchant_credit_usage2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_merchant_status2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedjobmojito_configuration1 field changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
    • Changedlist_avatars2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_candidates2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_catalogue_directories2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_interview_results2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_interviews2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_languages2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_my_merchants2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "_mcp_instructions": {
        +    "description": "Server-issued metadata for this conversation.",
        +    "properties": {
        +      "conversation_id": {
        +        "description": "The server-issued conversation identifier.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
    • Changedlist_sub_merchants2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedregister_users_for_interview2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedrequest_another_interview_attempt2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedsearch_documentation2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "_mcp_instructions": {
        +    "description": "Server-issued metadata for this conversation.",
        +    "properties": {
        +      "conversation_id": {
        +        "description": "The server-issued conversation identifier.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
    • Changedset_interview_state2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedupdate_catalogue_directory2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedupdate_interview2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedupload_knowledge_base_document2 fields changed
      • addedInput schema / properties / conversation_id
        Added value: +{
        +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Server-issued metadata for this conversation.",
        +  "properties": {
        +    "conversation_id": {
        +      "description": "The server-issued conversation identifier.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  6. 5 tool updates
    • Changedcreate_interview5 fields changed
      • changedInput schema / properties / interview_tone / description
        Previous value: -"Interview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups; omit to default to relaxed. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default."New value: +"Interview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.."
      • addedInput schema / properties / interview_tone / enum
        Added value: +[
        +  "relaxed",
        +  "simple",
        +  "professional",
        +  "persuasive",
        +  "exact",
        +  null
        +]
      • changedInput schema / properties / location / description
        Previous value: -"Job location."New value: +"Job location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`."
      • changedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / description
        Previous value: -"Report language code (platform-languages.json code)."New value: +"Report language code (a platform-languages.json code)."
      • addedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / enum
        Added value: +[
        +  "ar",
        +  "bg",
        +  "zh",
        +  "hr",
        +  "cs",
        +  "da",
        +  "nl",
        +  "en",
        +  "fil",
        +  "fi",
        +  "fr",
        +  "de",
        +  "el",
        +  "hi",
        +  "hu",
        +  "id",
        +  "it",
        +  "ja",
        +  "ko",
        +  "ms",
        +  "no",
        +  "pl",
        +  "pt",
        +  "br",
        +  "ro",
        +  "ru",
        +  "sk",
        +  "es",
        +  "sv",
        +  "ta",
        +  "th",
        +  "tr",
        +  "uk",
        +  "vi",
        +  null
        +]
    • Changedcreate_interview_from_questions5 fields changed
      • changedInput schema / properties / interview_tone / description
        Previous value: -"Tone — configures the AI avatar's speaking style and the follow-up questions it generates; the base `questions` you supply are not affected. Omit to default to relaxed. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default."New value: +"Tone — configures the AI avatar's speaking style and the follow-up questions it generates; the base `questions` you supply are not affected. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.."
      • addedInput schema / properties / interview_tone / enum
        Added value: +[
        +  "relaxed",
        +  "simple",
        +  "professional",
        +  "persuasive",
        +  "exact",
        +  null
        +]
      • changedInput schema / properties / location / description
        Previous value: -"Interview location."New value: +"Job location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`."
      • changedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / description
        Previous value: -"Report language code (platform-languages.json code)."New value: +"Report language code (a platform-languages.json code)."
      • addedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / enum
        Added value: +[
        +  "ar",
        +  "bg",
        +  "zh",
        +  "hr",
        +  "cs",
        +  "da",
        +  "nl",
        +  "en",
        +  "fil",
        +  "fi",
        +  "fr",
        +  "de",
        +  "el",
        +  "hi",
        +  "hu",
        +  "id",
        +  "it",
        +  "ja",
        +  "ko",
        +  "ms",
        +  "no",
        +  "pl",
        +  "pt",
        +  "br",
        +  "ro",
        +  "ru",
        +  "sk",
        +  "es",
        +  "sv",
        +  "ta",
        +  "th",
        +  "tr",
        +  "uk",
        +  "vi",
        +  null
        +]
    • Changedlist_avatars3 fields changed
      • changedInput schema / properties / mojito_language_code / description
        Previous value: -"Filter by platform language code."New value: +"Filter by platform language code. Omit for all languages."
      • addedInput schema / properties / mojito_language_code / enum
        Added value: +[
        +  "ar",
        +  "bg",
        +  "zh",
        +  "hr",
        +  "cs",
        +  "da",
        +  "nl",
        +  "en",
        +  "fil",
        +  "fi",
        +  "fr",
        +  "de",
        +  "el",
        +  "hi",
        +  "hu",
        +  "id",
        +  "it",
        +  "ja",
        +  "ko",
        +  "ms",
        +  "no",
        +  "pl",
        +  "pt",
        +  "br",
        +  "ro",
        +  "ru",
        +  "sk",
        +  "es",
        +  "sv",
        +  "ta",
        +  "th",
        +  "tr",
        +  "uk",
        +  "vi"
        +]
      • addedInput schema / properties / mojito_language_code / example
        Added value: +"en"
    • Changedlist_catalogue_directories3 fields changed
      • changedInput schema / properties / mojito_language_code / description
        Previous value: -"Filter by the directory language (a platform-languages.json code, e.g. `en`)."New value: +"Filter by the directory language. Omit for all languages."
      • addedInput schema / properties / mojito_language_code / enum
        Added value: +[
        +  "ar",
        +  "bg",
        +  "zh",
        +  "hr",
        +  "cs",
        +  "da",
        +  "nl",
        +  "en",
        +  "fil",
        +  "fi",
        +  "fr",
        +  "de",
        +  "el",
        +  "hi",
        +  "hu",
        +  "id",
        +  "it",
        +  "ja",
        +  "ko",
        +  "ms",
        +  "no",
        +  "pl",
        +  "pt",
        +  "br",
        +  "ro",
        +  "ru",
        +  "sk",
        +  "es",
        +  "sv",
        +  "ta",
        +  "th",
        +  "tr",
        +  "uk",
        +  "vi"
        +]
      • addedInput schema / properties / mojito_language_code / example
        Added value: +"en"
    • Changedupdate_interview4 fields changed
      • changedInput schema / properties / interview_tone / description
        Previous value: -"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default."New value: +"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.."
      • addedInput schema / properties / interview_tone / enum
        Added value: +[
        +  "relaxed",
        +  "simple",
        +  "professional",
        +  "persuasive",
        +  "exact",
        +  null
        +]
      • changedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / description
        Previous value: -"Report language code (platform-languages.json code)."New value: +"Report language code (a platform-languages.json code)."
      • addedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / enum
        Added value: +[
        +  "ar",
        +  "bg",
        +  "zh",
        +  "hr",
        +  "cs",
        +  "da",
        +  "nl",
        +  "en",
        +  "fil",
        +  "fi",
        +  "fr",
        +  "de",
        +  "el",
        +  "hi",
        +  "hu",
        +  "id",
        +  "it",
        +  "ja",
        +  "ko",
        +  "ms",
        +  "no",
        +  "pl",
        +  "pt",
        +  "br",
        +  "ro",
        +  "ru",
        +  "sk",
        +  "es",
        +  "sv",
        +  "ta",
        +  "th",
        +  "tr",
        +  "uk",
        +  "vi",
        +  null
        +]
  7. 5 tool updates
    • Changedcreate_interview1 field changed
      • addedInput schema / properties / environment
        Added value: +{
        +  "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..",
        +  "enum": [
        +    "production",
        +    "uat",
        +    "development",
        +    "demo",
        +    null
        +  ],
        +  "example": "production",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedcreate_interview_from_questions1 field changed
      • addedInput schema / properties / environment
        Added value: +{
        +  "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..",
        +  "enum": [
        +    "production",
        +    "uat",
        +    "development",
        +    "demo",
        +    null
        +  ],
        +  "example": "production",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedcreate_persona1 field changed
      • addedInput schema / properties / environment
        Added value: +{
        +  "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..",
        +  "enum": [
        +    "production",
        +    "uat",
        +    "development",
        +    "demo",
        +    null
        +  ],
        +  "example": "production",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_interview_definition2 fields changed
      • addedOutput schema / properties / environment
        Added value: +{
        +  "description": "Which webhook environment this interview's results are delivered to. Null for multi-stage positions, whose stages each carry their own.",
        +  "enum": [
        +    "production",
        +    "uat",
        +    "development",
        +    "demo",
        +    null
        +  ],
        +  "example": "production",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "created_at",
        -  "updated_at",
        -  "questions",
        -  "is_multistage",
        -  "status",
        -  "visibility",
        -  "stage",
        -  "type",
        -  "code",
        -  "interview_location",
        -  "cover_image_url",
        -  "merchant_id",
        -  "interview_template_id",
        -  "interview_template_type",
        -  "is_voice_only",
        -  "knowledge_base_store_id",
        -  "mojito_language_code",
        -  "speech_language_code",
        -  "speech_language_name",
        -  "recording",
        -  "recording_full_session",
        -  "type_credit",
        -  "result_view",
        -  "candidate_video_introduction",
        -  "description",
        -  "interview_description_long",
        -  "candidate_expectations",
        -  "interview_department",
        -  "interview_salary",
        -  "interview_available_till",
        -  "recruiter_profile_id",
        -  "slug",
        -  "tags",
        -  "coach_plan",
        -  "interview_conversation_speed",
        -  "max_followups",
        -  "max_duration",
        -  "questions_random_subset",
        -  "required_pronunciation",
        -  "result_enable_edit_transcript"
        -]New value: +[
        +  "name",
        +  "created_at",
        +  "updated_at",
        +  "questions",
        +  "is_multistage",
        +  "status",
        +  "visibility",
        +  "stage",
        +  "type",
        +  "environment",
        +  "code",
        +  "interview_location",
        +  "cover_image_url",
        +  "merchant_id",
        +  "interview_template_id",
        +  "interview_template_type",
        +  "is_voice_only",
        +  "knowledge_base_store_id",
        +  "mojito_language_code",
        +  "speech_language_code",
        +  "speech_language_name",
        +  "recording",
        +  "recording_full_session",
        +  "type_credit",
        +  "result_view",
        +  "candidate_video_introduction",
        +  "description",
        +  "interview_description_long",
        +  "candidate_expectations",
        +  "interview_department",
        +  "interview_salary",
        +  "interview_available_till",
        +  "recruiter_profile_id",
        +  "slug",
        +  "tags",
        +  "coach_plan",
        +  "interview_conversation_speed",
        +  "max_followups",
        +  "max_duration",
        +  "questions_random_subset",
        +  "required_pronunciation",
        +  "result_enable_edit_transcript"
        +]
    • Changedupdate_interview1 field changed
      • addedInput schema / properties / environment
        Added value: +{
        +  "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..",
        +  "enum": [
        +    "production",
        +    "uat",
        +    "development",
        +    "demo",
        +    null
        +  ],
        +  "example": "production",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  8. 2 tool updates
    • Changedlist_catalogue_directories1 field changed
      • changedInput schema / properties / limit / default
        Previous value: -50New value: +25
    • Changedlist_interview_results1 field changed
      • changedInput schema / properties / limit / default
        Previous value: -50New value: +20
  9. 6 tool updates
    • Changedcreate_interview1 field changed
      • changedInput schema / properties / pdf_export_auto_config / properties / template / description
        Previous value: -"Report layout: classic (default), modern, or one_pager."New value: +"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
    • Changedcreate_interview_from_questions1 field changed
      • changedInput schema / properties / pdf_export_auto_config / properties / template / description
        Previous value: -"Report layout: classic (default), modern, or one_pager."New value: +"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
    • Changedgenerate_interview_report1 field changed
      • changedInput schema / properties / template / allOf
        Previous value: -[
        -  {
        -    "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.",
        -    "enum": [
        -      "classic",
        -      "modern",
        -      "one_pager"
        -    ],
        -    "example": "modern",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Report layout: `classic` (default), `modern` or `one_pager`."
        -  }
        -]New value: +[
        +  {
        +    "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.",
        +    "enum": [
        +      "classic",
        +      "modern",
        +      "one_pager"
        +    ],
        +    "example": "modern",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Report layout: `classic`, `modern` or `one_pager`. Omit for the merchant default (modern when unset)."
        +  }
        +]
    • Changedget_interview_definition2 fields changed
      • changedOutput schema / properties / interview_template_type / description
        Previous value: -"Type of the linked interview template. `interactive_elevenlabs` is voice-only; the others (`interactive_heygen`, `offline_heygen`, `offline_elai`, `offline_synthesia`) are avatar-based. Null when the template could not be resolved."New value: +"Type of the linked interview template. `interactive_elevenlabs` is voice-only; the others (`interactive_spatius`, `interactive_heygen`, `offline_heygen`, `offline_elai`, `offline_synthesia`) are avatar-based. Null when the template could not be resolved."
      • changedOutput schema / properties / interview_template_type / enum
        Previous value: -[
        -  "offline_elai",
        -  "offline_synthesia",
        -  "interactive_heygen",
        -  "offline_heygen",
        -  "interactive_elevenlabs",
        -  null
        -]New value: +[
        +  "offline_elai",
        +  "offline_synthesia",
        +  "interactive_heygen",
        +  "offline_heygen",
        +  "interactive_elevenlabs",
        +  "interactive_spatius",
        +  null
        +]
    • Changedlist_avatars1 field changed
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "interactive_heygen",
        -  "interactive_elevenlabs",
        -  "offline_heygen",
        -  "offline_elai",
        -  "offline_synthesia"
        -]New value: +[
        +  "interactive_heygen",
        +  "interactive_elevenlabs",
        +  "interactive_spatius",
        +  "offline_heygen",
        +  "offline_elai",
        +  "offline_synthesia"
        +]
    • Changedupdate_interview1 field changed
      • changedInput schema / properties / pdf_export_auto_config / properties / template / description
        Previous value: -"Report layout: classic (default), modern, or one_pager."New value: +"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
  10. 1 tool update
    • Changedget_interview_result_details3 fields changed
      • changedOutput schema / properties / ai_analysis_other / description
        Previous value: -"Session-level AI analyses keyed by analysis name (jsonb). `hiring_reasons`: { reasons_to_hire: string[], reasons_not_to_hire: string[] } (0-4 items each, recruiter-facing). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added."New value: +"Session-level AI analyses keyed by analysis name (jsonb). `strengths_concerns`: { strengths: string[], concerns: string[] } (0-4 items each, recruiter-facing; called `hiring_reasons` with `reasons_to_hire` / `reasons_not_to_hire` inside before 2026-09-15, and rows written before then may still carry that shape). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added."
      • changedOutput schema / properties / ai_analysis_recruiter_why_hire / description
        Previous value: -"Reasons to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_to_hire, kept for existing integrations."New value: +"Reasons to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.strengths, kept for existing integrations."
      • changedOutput schema / properties / ai_analysis_recruiter_why_not_hire / description
        Previous value: -"Reasons not to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_not_to_hire, kept for existing integrations."New value: +"Reasons not to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.concerns, kept for existing integrations."
  11. 5 tool updates
    • Changedcreate_interview1 field changed
      • addedInput schema / properties / pdf_export_auto_config / properties / template
        Added value: +{
        +  "description": "Report layout: classic (default), modern, or one_pager.",
        +  "enum": [
        +    "classic",
        +    "modern",
        +    "one_pager",
        +    null
        +  ],
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedcreate_interview_from_questions1 field changed
      • addedInput schema / properties / pdf_export_auto_config / properties / template
        Added value: +{
        +  "description": "Report layout: classic (default), modern, or one_pager.",
        +  "enum": [
        +    "classic",
        +    "modern",
        +    "one_pager",
        +    null
        +  ],
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedgenerate_interview_report2 fields changed
      • addedInput schema / properties / export_features_result / properties / template
        Added value: +{
        +  "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.",
        +  "enum": [
        +    "classic",
        +    "modern",
        +    "one_pager"
        +  ],
        +  "example": "modern",
        +  "type": "string"
        +}
      • addedInput schema / properties / template
        Added value: +{
        +  "allOf": [
        +    {
        +      "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.",
        +      "enum": [
        +        "classic",
        +        "modern",
        +        "one_pager"
        +      ],
        +      "example": "modern",
        +      "type": "string"
        +    },
        +    {
        +      "description": "Report layout: `classic` (default), `modern` or `one_pager`."
        +    }
        +  ]
        +}
    • Changedget_interview_result_details3 fields changed
      • addedOutput schema / properties / ai_analysis_other
        Added value: +{
        +  "description": "Session-level AI analyses keyed by analysis name (jsonb). `hiring_reasons`: { reasons_to_hire: string[], reasons_not_to_hire: string[] } (0-4 items each, recruiter-facing). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added."
        +}
      • changedOutput schema / properties / ai_analysis_recruiter_why_hire / description
        Previous value: -"Reasons to hire (list/text)."New value: +"Reasons to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_to_hire, kept for existing integrations."
      • changedOutput schema / properties / ai_analysis_recruiter_why_not_hire / description
        Previous value: -"Reasons not to hire (list/text)."New value: +"Reasons not to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_not_to_hire, kept for existing integrations."
    • Changedupdate_interview1 field changed
      • addedInput schema / properties / pdf_export_auto_config / properties / template
        Added value: +{
        +  "description": "Report layout: classic (default), modern, or one_pager.",
        +  "enum": [
        +    "classic",
        +    "modern",
        +    "one_pager",
        +    null
        +  ],
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  12. 1 tool update
    • Changedget_interview_result_details1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "default": "standard",
        +  "description": "How much of the record to return. Handled by the MCP server, not the JobMojito API — it only narrows the response, never the query.\n\n- `summary`: scores, the overall AI analysis, and each question with the candidate's answer — no per-answer AI commentary, recording paths or raw assessment data. Use this to review or compare candidates.\n- `standard`: everything a human reviewer reads: the full transcript with per-answer analysis, scores and recordings, minus the raw machine assessment blobs. This is the default.\n- `full`: the API response verbatim, including the raw per-answer pronunciation/sentiment data. Large — a long interview can exceed the result limit and fail. Only ask for this if you need those raw fields.",
        +  "enum": [
        +    "summary",
        +    "standard",
        +    "full"
        +  ],
        +  "type": "string"
        +}
  13. 1 tool update
    • Changedregister_users_for_interview2 fields changed
      • changedInput schema / properties / users / example
        Previous value: -[
        -  {
        -    "email": "jozo@jozo.sk",
        -    "external_id": "abcd",
        -    "name": "Peter Parker"
        -  },
        -  {
        -    "email": "hi@jozefbalaz.com",
        -    "name": "mr beast"
        -  }
        -]New value: +[
        +  {
        +    "email": "peter.parker@example.com",
        +    "external_id": "abcd",
        +    "name": "Peter Parker"
        +  },
        +  {
        +    "email": "mary.jane@example.com",
        +    "name": "Mary Jane Watson"
        +  }
        +]
      • changedInput schema / properties / users / items / properties / email / example
        Previous value: -"jozo@jozo.sk"New value: +"peter.parker@example.com"
  14. 8 tool updates
    • Changedcreate_catalogue_directory2 fields changed
      • changedInput schema / properties / content_md / description
        Previous value: -"Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text."New value: +"Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text. Chips, callouts, cards, columns and buttons are available here too — full vocabulary: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
      • changedInput schema / properties / content_md / example
        Previous value: -"## Sales coaching\n\nPick a session to practise with.\n\n[sessions:filter=objection-handling,limit=6]\n"New value: +"## Sales coaching\n\nPick a session to practise with.\n\n[chip:6 sessions] [chip:Beginner,tone=accent]\n\n[sessions:filter=objection-handling,limit=6]\n"
    • Changedcreate_interview1 field changed
      • changedInput schema / properties / description_long / description
        Previous value: -"Full job description in Markdown (Job Purpose, Responsibilities, Required & Preferred Qualifications). Provide it to use it as-is; leave it null/blank and it is AI-generated (interview and assessment types only)."New value: +"Full job description in Markdown (Job Purpose, Responsibilities, Required & Preferred Qualifications). Provide it to use it as-is; leave it null/blank and it is AI-generated (interview and assessment types only). Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
    • Changedcreate_interview_from_questions1 field changed
      • changedInput schema / properties / description_long / description
        Previous value: -"Long-form interview description."New value: +"Long-form interview description. Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
    • Changedget_catalogue_directory2 fields changed
      • changedOutput schema / properties / content_md / description
        Previous value: -"Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text."New value: +"Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text. Chips, callouts, cards, columns and buttons are available here too — full vocabulary: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
      • changedOutput schema / properties / content_md / example
        Previous value: -"## Sales coaching\n\nPick a session to practise with.\n\n[sessions:filter=objection-handling,limit=6]\n"New value: +"## Sales coaching\n\nPick a session to practise with.\n\n[chip:6 sessions] [chip:Beginner,tone=accent]\n\n[sessions:filter=objection-handling,limit=6]\n"
    • Changedget_interview_definition1 field changed
      • changedOutput schema / properties / interview_description_long / description
        Previous value: -"Long description (create/update field `description_long`)."New value: +"Long description (create/update field `description_long`). Rendered as Markdown on the candidate-facing position page — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
    • Changedlist_avatars1 field changed
      • changedInput schema / properties / limit / default
        Previous value: -50New value: +15
    • Changedupdate_catalogue_directory2 fields changed
      • changedInput schema / properties / content_md / description
        Previous value: -"Markdown for the custom directory page. Sending null removes the custom page and restores the default grid; sending a string replaces the whole page. Directives, each ALONE on its own line: `[plan-progress]`, `[directory:<tag-id>]`, `[session:<interview-id>]`, `[sessions]`, `[sessions:<term>]`, `[sessions:filter=<term>,limit=<n>]`."New value: +"Markdown for the custom directory page. Sending null removes the custom page and restores the default grid; sending a string replaces the whole page. Directives, each ALONE on its own line: `[plan-progress]`, `[directory:<tag-id>]`, `[session:<interview-id>]`, `[sessions]`, `[sessions:<term>]`, `[sessions:filter=<term>,limit=<n>]`. Chips, callouts, cards, columns and buttons are available too — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
      • changedInput schema / properties / content_md / example
        Previous value: -"## Sales coaching\n\nPick a session to practise with.\n\n[sessions:filter=objection-handling,limit=6]\n"New value: +"## Sales coaching\n\nPick a session to practise with.\n\n[chip:6 sessions] [chip:Beginner,tone=accent]\n\n[sessions:filter=objection-handling,limit=6]\n"
    • Changedupdate_interview1 field changed
      • changedInput schema / properties / description_long / description
        Previous value: -"Long-form interview description (column `interview_description_long`), Markdown."New value: +"Long-form interview description (column `interview_description_long`). Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
  15. 1 tool update
    • Changedupdate_interview2 fields changed
      • changedOutput schema / properties / questions_diff / description
        Previous value: -"What the question diff decided, question by question. Null when `questions` was not sent."New value: +"What the question diff decided, question by question. Absent when `questions` was not sent."
      • changedOutput schema / required
        Previous value: -[
        -  "position_id",
        -  "is_multistage",
        -  "updated_fields",
        -  "questions_diff"
        -]New value: +[
        +  "position_id",
        +  "is_multistage",
        +  "updated_fields"
        +]

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.