Skip to main content
Glama

Server Details

Run AI interviews, manage candidates and read hiring analytics on JobMojito.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
JobMojito/mcp
GitHub Stars
1
Server Listing
JobMojito MCP Server

TDQS

A3.6/5.0

Scored across 29 tools

Disambiguation4/5

Most tools target distinct resources and actions, with clear category prefixes like [Interviews], [Results], and [Admin]. A few pairs could be confused—create_interview vs. create_interview_from_questions and update_interview vs. set_interview_state—but the descriptions do enough to separate them.

Naming Consistency4/5

The overwhelming majority follow a consistent verb_noun pattern: create_*, get_*, list_*, update_*, generate_*. The main deviation is jobmojito_configuration, which is a noun phrase rather than an action verb, and a few longer names like request_another_interview_attempt break the clean pattern slightly.

Tool Count2/5

With 29 tools, this server is above the 25+ threshold and places a significant navigation burden on an agent. The tools are organized into coherent domains, but several admin/merchant and results tools could likely be consolidated.

Completeness3/5

The core interview lifecycle is well covered: create, read, update, list, state changes, result retrieval, and report generation. However, there are notable gaps such as no delete operations for interviews or catalogue directories, no candidate management beyond listing/registration, and no explicit result-decision tool.

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.
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.

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already communicate mutation and non-read-only behavior; the description adds genuinely useful behavioral detail such as the id becoming the URL segment and being unchangeable afterwards. It also explains that setting content_md replaces the default grid, which is meaningful beyond what annotations supply. No contradiction with annotations was found.

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 overlapping paragraphs that restate the same core facts almost identically. The '[Coaching catalogue]' prefix and 'Coaching-platform feature' line add little, and the important immutability warning is buried at the end after the duplicate explanation. A single compact paragraph would be more effective.

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 13-parameter tool, the description does a good job of explaining the overall role of a catalogue directory and how the key fields fit together. Combined with the fully detailed 100%-coverage input schema and an output schema, it provides enough context for an agent to select and invoke the tool correctly, though it could be tighter.

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 adds real extra meaning by warning that the id cannot be changed after creation, which directly affects how an agent should choose and validate the id field. It also frames the relationship between tags_sub, tags_interview_set_filter, and content_md more conceptually than the schema alone.

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 opens with 'Creates a directory (page) in the coaching portal catalogue', which names a specific verb and resource. It also clarifies that the directory can nest children, filter sessions, and carry custom Markdown, so an agent can distinguish it from create_interview/create_persona and from read/update catalogue tools.

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?

The tool is clearly positioned as the way to create a new coaching catalogue directory, with no ambiguity about whether this is a listing or reading tool. It does not explicitly name update_catalogue_directory as the alternative for modifying existing directories, but the creation context is clear and no misleading exclusions are present.

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

create_interviewCreate interviewC
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.
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.
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; 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.
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..
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.
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

C2.9/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description does not need to restate that this is a mutating creation. It adds useful context about AI generation of description/questions/expectations, auto-provisioned steps, and optional embed key. However, it doesn't detail reversible behavior or effects on existing resources, though creation tools are generally understood.

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 repeats itself — the first sentence and the second block both say 'creates a new interview... generates questions... provisions steps'. The first paragraph is also awkwardly phrased and the modality note is partially redundant with the schema's own parameter descriptions. It could be compacted to one focused paragraph.

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?

With an output schema present, 100% parameter coverage, and an annotations block, the description has a lighter burden. It covers core creation scope, AI generation side effects, and embed key provisioning. But it omits clear guidance distinguishing it from create_interview_from_questions and doesn't mention return semantics beyond the annotation context.

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% with 46 richly described parameters, so the description doesn't need to carry parameter semantics. The description adds a high-level pointer to the template ID's modality effect. Baseline 3 is appropriate given the schema does the heavy lifting.

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

Purpose3/5

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

The description states it creates a new interview and auto-generates the question sequence, which is a specific verb+resource. However, it's somewhat redundant and unclear about its relationship to sibling create_interview_from_questions, and the extra detail about modality/embed keys is muddled. It is distinguishable but not sharply.

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 mentions `list_avatars` for modality and implies AI-generated defaults, providing some context. But it doesn't explicitly say when to use this tool vs create_interview_from_questions vs update_interview — a key alternative is missing, so usage boundaries are only implied.

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.

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..
locationYesInterview location.
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.
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. 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.
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..
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.
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 mark the tool as non-read-only and potentially destructive. The description adds meaningful behavioral context beyond that: it builds default and generated steps, optionally activates the interview, and optionally creates an embed key. It does not contradict the annotations, and it gives useful side-effect awareness without repeating structured annotation data.

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 is short and front-loaded, but the first and second sentences are largely redundant: both essentially say 'create a new interview from an explicit array of questions.' The second sentence adds genuine value with the side-effect details, but the redundancy prevents a higher score.

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?

Given the tool's high complexity — 44 parameters, nested question definitions, and an output schema — the description provides an adequate high-level overview. It covers the core creation flow and key optional side effects, and the extensive schema and existing output schema compensate for any additional detail an agent might want.

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 44 parameters, so the schema carries the semantic burden. The description adds only high-level context about questions and generated steps, which maps to the questions parameter but does not meaningfully improve parameter-level understanding beyond 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?

The description clearly states the tool's function: creating a new interview definition from a caller-provided array of questions. It also differentiates from the sibling create_interview by emphasizing the explicit 'array of questions' mechanism rather than generic interview creation.

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 usage context: use this tool when you already have an explicit list of questions and want an interview created from them. However, it does not explicitly name alternatives like create_interview, nor does it state when-not-to-use it, so the guidance is implied rather than direct.

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. 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'). Coaching-platform feature.

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.
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.
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.
embed_signing_keyNoEmbed signing key, present only when is_embedded=true.
interview_def_set_idYesId of the newly created persona definition set.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations indicate mutation (readOnlyHint=false, destructiveHint=true), but the description adds substantial behavioral context: the dual-product nature, session flow (welcome → opening line → free-form → closing), default 'Hello' opener, and the consequence of omitting persona_avatar_progress (unstable concession behavior). No contradiction with 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?

The text is long but well-structured with bolded headings, bullet lists, and a front-loaded portal warning. Some redundancy exists—the free-form contrast is stated twice and the opening_line default is repeated—but given the tool's 31 parameters and complexity, the length is largely justified.

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 31-parameter tool with a rich schema and output schema, the description covers the non-obvious product split, session flow, defaults, scoring scale, and prompt-field semantics. It complements the schema rather than repeating it, making it a fully sufficient guide for correct invocation.

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

Parameters5/5

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

Schema has 100% parameter coverage, providing a baseline of 3, but the description adds significant meaning by grouping the four persona prompts into a coherent division, highlighting portal as the primary decision, and explaining how opening_line, welcome_message, and candidate_expectations fit the session flow. This goes far beyond the schema descriptions.

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?

Description opens with a specific verb and resource: 'Create a role-play persona', immediately contrasted with 'a scored Q&A interview', which distinguishes it from sibling tools like create_interview and create_interview_from_questions. It further specifies the persona role fields as the configuration, reinforcing its unique purpose.

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 instructs 'FIRST DECIDE portal' and defines when to use the interview portal ('ASSESS or SCREEN candidates... anything a recruiter runs') versus the coaching portal, warning that the default is coaching, not recruiting. This gives clear when-to-use and when-not-to-use guidance with named alternatives.

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
store_fileNoWhen true (pdf only), persist the file to storage and return a signed URL.
export_typeYes
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 }`.

TDQS

A4.4/5.0
Behavior4/5

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

Discloses that PDF can be persisted and returns a signed URL, and that translation costs 0.1 credit per result. Annotations indicate destructiveHint=true and idempotentHint=true, which align with the described behavior. Adds context beyond annotations without contradiction, though it could clarify the idempotent nature more explicitly.

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?

The description is succinct with two paragraphs: the first establishes purpose and context, the second details the two usage paths and export formats. Every sentence carries value, with no redundant or filler 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?

Covers the essential aspects: purpose, input parameters, and key options. Given the complexity (nested object with many flags), the description relies on the schema for sub-property details, which is acceptable. The existence of an output schema reduces the need to describe return values, though the description could briefly mention that reports are generated synchronously or any limitations.

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?

The description adds meaningful context for the ID parameters and export types by explaining their relationship (single vs. combined report) and the three output formats. While the nested export_features_result object is not elaborated in the description, its sub-properties are well-documented in the schema. The description compensates for the 40% schema coverage by clarifying the core parameters.

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 clearly states the tool generates interview result reports in HTML/PDF/JSON formats for completed interviews, serving as decision-support material. It specifies the target audience (human reviewer) and distinguishes from siblings by focusing on report generation rather than creation, listing, or 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 Guidelines4/5

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

Provides explicit instruction to provide either interview_result_id for a single result or interview_result_ids for a combined multi-result report. However, it does not explicitly state when not to use this tool or mention alternatives like get_interview_result_details for raw data, though the context of 'completed interview' implies applicable scenarios.

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.
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.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already provide destructiveHint=true and readOnlyHint=false, and the description adds that the URL is signed and public. However, it does not elaborate on side effects (e.g., token expiration, invalidation of previous URLs) or required permissions beyond what the schema indicates.

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 description is brief and front-loaded with a category tag and two sentences. It is efficient, though the '[Interviews]' bracket prefix is somewhat 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?

For a tool with six parameters, one required enum, and an output schema, the description covers the core idea but lacks guidance on selecting the appropriate 'type' value. An agent would need to infer from the schema descriptions, which are present but not synthesized in the tool description.

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% with each parameter described. The description reinforces that required IDs depend on 'type', but adds little beyond the schema's parameter descriptions. 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 clearly states it generates a signed public URL/token for an existing interview, profile, or result. The verb 'generate' and resource 'interview URL/token' are specific, and the tool's function is distinct from sibling tools like create_interview or list_interviews.

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 usage for generating shareable links for existing objects, but it does not explicitly state when to use this tool versus alternatives, nor does it provide exclusionary guidance or conditions like when not to use it.

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.

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.
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

A4.2/5.0
Behavior5/5

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

The description goes well beyond the annotations (readOnlyHint, idempotentHint, destructiveHint) by disclosing the critical behavior that `content_md`, `tags_sub`, and `tags_interview_set_filter` are replaced wholesale on update, so reading first is necessary to avoid overwriting. It also clarifies that the read returns resolved sub-directories and matched sessions, not just the directory's own metadata. There is no contradiction with the read-only annotations.

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 noticeably duplicated: the first bracketed paragraph and the following paragraph both state nearly identical information about reading a directory, its returned fields, and the wholesale replacement warning. This wastes space and muddles the front-loading. A single, tight summary would be more concise and easier for an agent to parse.

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?

Given that this is a read-only get operation with an output schema, described parameters, and the full behavioral nuance about update replacement, the description covers everything needed to call the tool correctly. The $merchant_id$ scoping is already documented in the schema. Any redundancy in the description does not cause content to be omitted.

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 schema already has 100% parameter coverage, including examples and permission notes for `merchant_id`. The description adds no extra meaning for the parameters themselves, mentioning only the returned fields rather than the input `id` or `merchant_id`. With full schema coverage, 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?

The description uses a specific verb and resource — 'Reads one catalogue directory in full' — and enumerates exactly what is returned: settings, `content_md`, sub-directories, and the sessions matched by the tag filter. This clearly differentiates it from the sibling `list_catalogue_directories` because it targets a single directory and from `update_catalogue_directory` because it is a read operation.

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?

The description explicitly states when to use this tool: 'Read a directory before updating it' and explains why — the fields are 'replaced wholesale' by updates. It also gives the verification use case of checking whether a session's tags place it in a directory. However, it does not name the alternative tool to use when a list is needed or specify when not to use this tool.

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).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds context: auto-fetches Markdown for developer docs, truncates based on max_chars, and domain restrictions. This provides value beyond annotations.

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?

The description is four concise sentences, each adding distinct information: purpose, URL source, special behavior for developer docs, and domain restrictions. No fluff, front-loaded with primary purpose.

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?

Given the tool's simplicity, the description covers essential context: what it does, how to get the URL, automatic Markdown handling, and domain restrictions. It does not detail error behavior or output format, but output schema exists and annotations cover safety.

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 descriptions cover both parameters (100% coverage), so baseline is 3. The description adds meaning by specifying that the URL must come from search_documentation and that only certain domains are allowed, which aids correct usage.

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 clearly states the tool fetches the full content of a single documentation page (specific verb+resource). It distinguishes from sibling tools like search_documentation by specifying that it accepts URLs from that tool and only allows certain domains.

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?

The description explicitly says to use a URL from search_documentation and restricts usage to specific domains. It implies when to use (after searching) but does not explicitly state when not to use or mention alternatives beyond search_documentation.

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.

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.
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.
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).
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_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.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate this is read-only, idempotent, and non-destructive. The description adds useful context: returns include `calc_definition_json`, metadata, and question ids should be preserved for round-tripping. It also discloses row-level security restrictions, which is valuable beyond 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.

Conciseness3/5

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

The description is front-loaded with the core purpose and workflow, but it has redundant phrasing: both paragraphs repeat the same-format round-trip point using different names. A tighter version would be just as clear with less duplication.

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 a full schema covering the only parameter, rich annotations, and an output schema, the description still adds all necessary behavioral context: resolved ID types, returned fields, workflow usage, and row-level security. An agent has enough information to call and use this tool 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%, and the schema already explains that `position_id` can be an interview or a position definition id. The description reinforces the round-trip purpose but does not add further parameter details, so the baseline of 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 clearly states that the tool retrieves the full definition/configuration of an interview, including its ordered `questions` array. It also distinguishes the read operation from create/update sibling tools by explicitly tying the output into a round-trip workflow.

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 gives specific usage context: read the definition, modify the questions array, and send it to update_interview. It also clarifies that `position_id` can be either an interview-definition id or a position id. However, it does not explicitly state when to use list_interviews or another sibling for lighter-weight reads.

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
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.
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/text).
ai_interview_coverage_percentageNoPercentage of the intended interview the AI judged to be covered.
ai_analysis_recruiter_why_not_hireNoReasons not to hire (list/text).

TDQS

A4/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, describing the safety profile. The description adds context: scores are 'assistive output for a human reviewer' and recording URLs are optional. This goes beyond annotations without contradiction.

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 description is concise with four sentences, front-loading the main purpose. The use of '[Results]' as a tag adds categorization. However, the structure is slightly fragmented; grouping optional details more tightly could improve readability.

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?

Given the tool's simplicity, presence of an output schema, and comprehensive annotations, the description covers key aspects: transcript, scores, AI assessment, and optional recordings. No further details (e.g., prerequisites, permissions) are necessary for this read-only 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?

Both parameters (interview_result_id, get_signed_recordings) have clear descriptions in the input schema (100% coverage). The tool description mentions 'Optionally attaches signed recording URLs' but does not add new meaning beyond the schema. Baseline of 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 clearly states 'Get full interview result details including transcript and scores' and mentions optionally attaching recording URLs. This distinguishes it from sibling tools like list_interview_results which returns a list without details. The verb 'get' and resource 'interview result details' are specific and unambiguous.

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 usage when full details are needed (e.g., 'Get full interview result details') but does not explicitly state when to use this over alternatives like list_interview_results. No exclusions or 'when not to use' guidance is provided.

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.

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

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint: false), the description adds critical behavioral details: pagination cap at 1000 records per page, only non-zero counts returned (implicit zero padding), and optional drilling to interview. This provides valuable context for an AI agent.

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 description is clear and front-loaded with purpose, but it is a single paragraph that could be slightly more structured. It is concise, but the note about zero padding could be separated for 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?

Given the tool's complexity (6 parameters, optional drilling, pagination) and the presence of an output schema, the description adequately covers usage scope, pagination behavior, and zero-padding note. It omits explicit read-only mention, but annotations cover that.

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 input schema covers all six parameters with descriptions, and the description adds minimal extra meaning beyond schema. It mentions scoping and drilling, but these are already in the schema descriptions. Baseline 3 is appropriate given 100% schema coverage.

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 clearly states the tool retrieves daily event analytics for a merchant using specific verbs and resources ('Get the merchant's daily event analytics'). It distinguishes itself from sibling tools like get_merchant_credit_usage and get_merchant_status by focusing on event-count time-series, making the purpose unambiguous.

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?

The description explains when to use the tool, including scoping to token merchant or merchant_id override and optional drilling to an interview. However, it does not explicitly state when not to use it or compare with alternatives, which would raise the score to 5.

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).

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

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds that results are ordered most recent first and capped at 1000 records per page, which are useful behavioral details. No contradiction with annotations.

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?

The description is concise (about 5 lines), front-loaded with the main purpose, and every sentence adds value. No redundancy or fluff.

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?

Given the annotations (readOnlyHint, idempotentHint, etc.) and the presence of an output schema, the description provides sufficient context: it explains the return format (ledger with credit_amount), ordering, pagination limit, and parameter behavior. It is complete for a read-only tool.

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

Parameters5/5

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

The description adds significant meaning beyond the input schema: it explains the merchant_id scope permission, and the interview_id parameter's dual behavior (detecting interview vs. position and combining credits accordingly). Schema coverage is 100%, but the description enriches understanding.

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 clearly states the tool returns a per-event credit-usage ledger for a merchant, listing billable analytics events that consumed credits. It distinguishes from siblings like get_merchant_analytics and get_merchant_status by focusing on detailed credit consumption events rather than aggregated analytics or status.

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 explains scoping (token's merchant or merchant_id override for admins) and drilling down via interview_id or position_id. However, it does not explicitly compare to sibling tools or state when to prefer this tool over alternatives, leaving some inference required.

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.

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.
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

A4.7/5.0
Behavior5/5

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

Annotations include readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false. Description adds that the tool echoes caller's profile_id and default_merchant_id, and clarifies authorization boundaries for the merchant_id parameter. No contradictions with annotations.

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?

The description is two sentences: a high-level summary followed by a detailed list of components. It is front-loaded with the purpose and succinctly expands without unnecessary words.

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?

Given the presence of an output schema, the description need not cover return values. It fully describes all components of the snapshot and the caller info echo, making it complete for a read-only, idempotent tool.

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% with description for the only parameter (merchant_id). The tool description adds valuable context about who can use the override (admins/sub-merchant operators), improving clarity beyond 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?

The description clearly states it retrieves a 'merchant status snapshot' and lists specific components like credit balances, subscription, pending-work counts, etc. It distinguishes from sibling tools such as 'get_merchant_analytics' and 'get_merchant_credit_usage' by detailing the unique fields included.

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?

The description explains scope: default to token's merchant, with optional merchant_id for admins/sub-merchant operators. While it doesn't explicitly name alternatives, it provides clear context on when to use the optional parameter and who can use it.

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

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint, idempotentHint, destructiveHint. The description adds useful behavioral context: it renders a UI, is interactive, and instructs the agent to pass merchant_id on subsequent calls. No contradictions.

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?

The description is concise and front-loaded with the main purpose. Every sentence adds value, and it efficiently conveys usage instructions.

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 simple tool with no parameters and no output schema, the description is complete. It explains the action, when to use it, and the expected behavior, including integration with other tools.

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?

There are no parameters (empty input schema), so baseline is 4. The description correctly handles this by not needing to add parameter info.

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 clearly states the tool's purpose: 'Show the interactive JobMojito merchant picker (UI).' It uses a specific verb and resource, and the context differentiates it from sibling tools like list_my_merchants.

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 guidance is provided: 'ALWAYS call this when the user wants to choose, switch, or set a merchant...' and includes what not to do ('Do NOT list merchants as text...'). It also instructs the agent to stop and wait for the user's selection.

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_heygen = realtime interactive avatar (video); 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
include_archivedNoInclude archived templates (excluded by default).false
mojito_language_codeNoFilter by platform language code.

Output Schema

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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already establish readOnly, idempotent, and non-destructive behavior; the description adds genuinely useful behavior beyond that, such as default page size of 15, the 1000-record cap, scoping to the token's merchant or `merchant_id`, and the legacy-template caveat. No statement contradicts 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?

The text is dense and front-loaded with the most decision-relevant information, and every sentence carries some useful content. It loses a point only for a slight redundancy where the pagination/count behavior is described in both the first paragraph ('returns 15 at a time') and the second ('Capped at 1000 records per page').

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?

Given the rich input schema, output schema, and strong annotations, the description covers the remaining needed context: how to pick the correct template, what legacy types mean, how pagination works, and how merchant scoping applies. An agent can safely and correctly call this tool without additional documentation.

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 materially enriches the `type` parameter by mapping each enum value to a concrete interview modality. It also gives practical meaning to `offset`, `filter_text`, and `merchant_id` through pagination and scoping guidance, which goes beyond the schema without restating every field.

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 operation ('List available avatar/voice templates') and a specific resource, then explains what returned items mean. It clearly distinguishes itself from sibling tools by defining how `type` maps to interview modality, so an agent knows this is for template selection, not for listing interviews or candidates.

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 explicitly tells the agent to choose the template whose `type` matches the intended experience and that the returned `id` becomes `interview_template_id` for create-interview tools. It also provides concrete operating guidance: paginate with `offset` while `pagination.has_more` is true, narrow with `type`/`filter_text`, and avoid legacy `offline_elai`/`offline_synthesia` types for new interviews.

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_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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe merchant's candidates for this page.
paginationYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds useful behavioral details: pagination with a 1000-record cap, scoping to merchant, and optional merchant_id override. No contradictions with 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?

The description is concise with three short sentences, no redundant information. It is front-loaded with the core purpose. Could be slightly more structured, but no wasted words.

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?

Given the presence of an output schema, the description adequately covers the tool's behavior (pagination, scoping, cap). It could mention filtering options, but the schema handles that. Completeness is sufficient for an AI agent.

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 descriptions cover all 8 parameters (100% coverage), so the description's contribution is minimal. It mentions pagination cap but does not explain individual parameters beyond what the schema provides. Baseline of 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 clearly states the tool lists the merchant's candidates, with pagination and scoping to the token's merchant or an override. The verb 'list' and resource 'candidates' are explicit, and there is no sibling tool with a similar purpose to cause confusion.

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?

The description provides clear context on when to use the tool (listing candidates) and constraints like scoping and pagination limits. However, it does not explicitly state alternatives or when not to use it, though no direct alternatives exist among siblings.

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.

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
mojito_language_codeNoFilter by the directory language (a platform-languages.json code, e.g. `en`).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe catalogue directories for this page, ordered by id.
paginationYes

TDQS

A4.3/5.0
Behavior4/5

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

Given the annotations already declare readOnlyHint and idempotentHint, the description adds useful behavioral context beyond the annotations: it states the list is paginated, includes public directories unless include_public=false, and notes that the custom Markdown page is excluded. It also describes how 'is_start_directory' marks the catalogue's default page, which is not in 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.

Conciseness2/5

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

The description contains two paragraphs that largely repeat the same information with slightly different wording. The first paragraph is a concise summary, while the second re-states the same points (list scope, use cases, custom Markdown exclusion). This redundancy wastes tokens and violates the 'every sentence should earn its place' principle.

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?

The tool has 9 parameters and some complexity, but the description orients the user well: it explains the result scope, typical use cases, the exclusion of the custom Markdown page, and pagination. The output schema exists, so return values are covered there. Despite not detailing every filter, the schema covers them, and the description provides enough context for effective selection and invocation.

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?

The schema has 100% parameter description coverage, so the baseline is 3. The description adds extra meaning for key parameters: it explains that include_public controls whether public directories are included ('unless you set include_public=false') and elaborates on parent_tag usage ('walk the tree with parent_tag'). This goes beyond the schema's basic field descriptions.

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 clearly states the tool's purpose: 'List the coaching-catalogue directories you can see' and distinguishes it from the sibling tool get_catalogue_directory by noting the custom Markdown page is not included and should be read with get_catalogue_directory. It also specifies the scope (merchant's own plus public) and typical use cases.

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?

The description explicitly tells when to use this tool ('Start here to find a directory id, to pick a parent for a new one, or to walk the tree with parent_tag') and provides an alternative for a specific case: 'The custom Markdown page is not included — read it with get_catalogue_directory.' This gives clear context and exclusions.

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.

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 (pre-screening vs interview). Omit for both.
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.
profile_interview_idNoFilter to a single candidate (profile_interview) id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe merchant's interview results for this page.
paginationYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds valuable behavioral context: pagination cap of 1000 records, scoping rules, and that it's the admin-portal results list.

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?

The description is concise, front-loaded with purpose, and uses two short paragraphs. Every sentence adds value without unnecessary elaboration.

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?

Given the complexity (12 parameters, output schema exists), the description covers the purpose, pagination, scoping, and cap. It could mention the default type or sort order, but the output schema compensates. Overall adequate.

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 baseline is 3. The tool-level description does not add significant per-parameter meaning beyond what the schema provides. It mentions the 1000 cap, which is reflected in the limit parameter.

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 clearly states the action (list), resource (interview results), and scope (merchant's, admin-portal). It differentiates from siblings like get_interview_result_details and list_candidates by focusing on a paginated list of results.

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?

The description implicitly indicates when to use this tool (to list results, paginated, scoped) but does not explicitly state when not to use it or suggest alternatives. The context of scoping is clear.

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.

Output Schema

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

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds behavioral details: paginated list, capped at 1000 records, scoped to merchant, and optional merchant_id override for admins. No contradictions.

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?

The description is concise with two sentences plus a header. It front-loads the action and every sentence adds value without redundancy.

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?

Given the tool's complexity (9 params, many siblings, output schema exists), the description covers the main purpose, scoping, pagination cap, and merchant override. Output details are handled by the existing output schema.

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?

With 100% schema description coverage, baseline is 3. The description adds value by explaining merchant_id scoping and the 1000 cap, which relate to parameters not fully covered in schema descriptions.

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 clearly states 'List the merchant's interview definitions' and 'Paginated list of a merchant's interview definitions'. It identifies the verb (list) and resource (interview definitions), distinguishing it from sibling tools like get_interview_definition (singular) and create_interview.

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 mentions scoping to token's merchant or merchant_id override and a cap of 1000 records per page, providing usage context. However, it does not explicitly state when to use this tool versus alternatives like get_interview_definition or create_interview.

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

list_languagesList supported languagesA
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

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
languagesYesSupported platform languages, sorted by English name.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds admin restriction and specifies exact return fields (code, names, flag URL, etc.), adding value beyond annotations.

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?

Two paragraphs restate similar information, with redundancy. Could be condensed into one sentence with bullet points for fields. Not excessively long but not optimally concise.

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?

Given zero parameters and presence of output schema, the description still adds valuable context (admin requirement, usage of code) and lists return fields. Complete for its purpose.

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?

No parameters, so baseline is 4. Description explains returned fields, though it is somewhat repetitive. Still provides clarity on what is returned.

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?

Clearly states it lists supported platform languages, including specific fields like code, names, and flag URL. Distinct from siblings which are about interviews and personas.

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?

Includes [Admin] prefix indicating intended audience, and mentions using the code in interviews/personas. Lacks explicit when-to-use vs alternatives, but context is sufficient for a simple list tool.

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.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint true and destructiveHint false. The description adds behavioral context: it is a fallback, returns own account plus sub-merchants, and advises how to use the result. No contradictions, and the extra context is helpful, though it doesn't detail rate limits or authentication.

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?

The description is concise, using three sentences that front-load the key purpose ('FALLBACK merchant list') and then efficiently cover usage, return content, and follow-up actions. No unnecessary verbiage.

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?

Given the tool's simplicity (one optional parameter, output schema present), the description is complete: it explains purpose, when to use, what it returns, and how to use the output. The presence of an output schema relieves the need for return value details.

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% with one parameter described. The description does not add new semantic information beyond the schema's parameter description; it merely restates 'sub-merchant name' implicitly. 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 clearly states the tool's purpose: a fallback merchant list for clients without UI support. It explicitly distinguishes from the interactive picker (jobmojito_configuration) and implies differentiation from list_sub_merchants by indicating it returns both own account and sub-merchants.

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 guidance on when to use (only when client cannot render UI), when not to use (when UI is available, use jobmojito_configuration instead), and what not to do (do not hand-format as text). Also provides usage instructions for the returned merchant IDs.

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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe sub-merchants the caller administers for this page.
paginationYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint=false. The description adds valuable behavioral details: pagination capped at 1000 records, row-level security, and admin scope, which go beyond annotations.

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 concise sentences front-load the admin context and purpose, followed by pagination and security details. No unnecessary words.

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 full schema coverage and annotations, the description covers core purpose, pagination cap, and security. Output schema exists, so return values are not needed. Lacks mention of sorting/filtering but schema handles that.

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% with detailed descriptions for all 5 parameters. The description adds minimal new meaning, only reiterating the pagination cap already present in the schema. 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?

The description explicitly states 'List sub-merchants under the merchant account' with a clear verb (list) and resource (sub-merchants). No sibling tool has a similar name, so differentiation is inherent.

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?

The description specifies admin context and row-level security, giving clear usage context. However, it does not explicitly exclude alternative tools or provide when-not guidance, though naming makes it unique.

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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesThe input users, each annotated with its registration result and (on success) interview URL.

TDQS

A4.2/5.0
Behavior4/5

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

The description adds useful behavioral context beyond annotations: it discloses that the operation registers or updates profiles, returns one-time interview URLs, and has different auth requirements. While destructiveHint is true, the description doesn't spell out destructive side effects, but it does not contradict 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.

Conciseness5/5

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

The description is two tight sentences with no filler. It front-loads the core operation in the first sentence and adds auth nuance in the second, making it easy for an agent to quickly grasp the tool's purpose.

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?

Given the rich input schema, output schema, and annotations, the description covers the essential operation, return value, and auth requirements. It is complete enough for correct invocation, though it could be slightly stronger by explicitly stating what the destructive hint implies for existing candidate registrations.

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 7 parameters thoroughly. The description reinforces the merchant_id/service-key relationship and the per-user URL return, but does not add significant meaning beyond what the schema provides.

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: 'Register users/candidates for a specific interview' and returns their personal interview links. It clearly distinguishes this from sibling tools by emphasizing the registration/update of candidate profiles and the one-time URL output.

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?

The description gives clear context for when to use the tool: when candidates need to be registered or updated for an interview and per-candidate interview links are needed. It also provides authentication guidance (user JWT vs service key with merchant_id), but does not explicitly name alternatives 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.

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
interview_result_idYesThe interview result to reopen for another attempt.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate destructiveHint=true, and the description elaborates on the destructive actions: marking unsuccessful, resetting to draft, and clearing the recruiter decision. This adds context beyond annotations about the specific state changes.

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, front-loaded with purpose, followed by detailed effects. No redundant information. Every sentence adds value.

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?

The description explains the preconditions (submitted+completed) and the effects. With an output schema present, return values are not needed. It is sufficiently complete for a mutation tool with clear annotations.

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%, and the single parameter 'interview_result_id' is described in the schema. The description does not add extra meaning beyond the schema, so 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 clearly states the tool reopens a submitted interview result for another attempt. It specifies the action, resource, and effects (marks unsuccessful, resets to draft, clears decision), distinguishing it from siblings like set_interview_state.

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?

The description provides context on when to use the tool: for submitted (active+completed) interview results. It implies preconditions but does not explicitly mention when not to use or alternatives. This is clear enough for most agents.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true and idempotentHint=true. The description goes beyond by detailing the parallel search across two sources, merging with source labels, and serving as the single entry point. No contradiction with annotations.

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?

The description is concise with clear structure: purpose, behavior, usage guidance, and a note about subsequent use of `get_documentation`. Bullet points effectively list the two documentation sources. Every sentence contributes meaning without redundancy.

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?

Given the tool's complexity (search with merging) and the presence of an output schema (confirmed by context), the description fully explains the return format (merged, source-labeled list) and the role of the tool alongside `get_documentation`. It is complete for effective use.

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 schema already documents the parameters. The description adds value by explaining the content of the 'developer' source (API reference, schemas, etc.) and 'help' source (product guides), enriching understanding of the `source` parameter beyond its enum values.

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 clearly states the tool searches all JobMojito documentation, merging results from two sources (developer and help) with labels. It distinguishes itself from the sibling tool `get_documentation` by positioning itself as the entry point and advising subsequent use of `get_documentation` for full pages.

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 tells when to use the tool: '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.' It also clarifies that the user does not need to choose a source or call a separate tool because it handles both sources in parallel.

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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesReturns `{ embed_id, embed_signing_key }` when an embed key was created/returned (is_embedded=true), otherwise `{ success: true }`.

TDQS

A3.9/5.0
Behavior4/5

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

The description adds behavioral context beyond annotations: it explains that the embed key is managed via is_embedded, and lists all possible statuses including 'deleted' (destructive). However, it does not mention irreversible effects of deletion or behavior when both parameters are provided.

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?

The description is two sentences: the first front-loads the core purpose, the second adds detail. No unnecessary words, efficient structure.

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?

Given the presence of annotations, full schema coverage, and an output schema, the description covers the main behaviors and parameter constraints. It lacks information about side effects (e.g., reversible? error conditions?) but is largely complete for the tool's complexity.

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?

With 100% schema coverage, the baseline is 3. The description adds value by clarifying the constraint 'Provide at least one of status or is_embedded' and explaining the purpose of is_embedded (managing embed key), which supplements 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 clearly states the tool changes the lifecycle status of an interview/position and manages its embed key. The examples 'draft, active, archived' give specificity. However, the parenthetical '(e.g. open, closed)' is slightly inconsistent with the listed enum values, causing minor confusion.

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 provides a parameter usage guideline ('Provide at least one of status or is_embedded') but does not explicitly tell when to use this tool versus siblings like create_interview or list_interviews. The context is implied but not stated.

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.
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.

TDQS

A4/5.0
Behavior4/5

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

Given the annotations already declare destructive/idempotent/read-only intent, the description adds valuable behavioral detail: only sent fields are written, null clears a nullable field, list fields replace whole collections, and `content_md` can restore the default page. It does not discuss permissions or broader side effects, but the annotation context lowers that burden.

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 main purpose and partial-update nuance are front-loaded, which is good. However, the first paragraph and second paragraph repeat nearly the same use-case enumeration and partial-update statement, making the description more verbose than necessary.

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 an 11-parameter mutation tool with an output schema, the description covers the essential behavioral nuances an agent needs: partial update, null-clearing semantics, and full replacement semantics for list fields. The remaining details live in the schema and parameter descriptions, so the tool is adequately specified.

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 each parameter is already well documented. The description references several fields by name and maps them to intents, but it adds no genuinely new semantics beyond what the schema already provides.

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?

Clearly specifies the verb `update` and the resource (`coaching catalogue directory`), and enumerates concrete actions: rename, change the session filter, reorder sub-directories, or author custom Markdown. This distinguishes it from sibling tools like create/get/list catalogue directories.

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?

The description clearly frames this as modifying an existing directory and explains partial-update semantics, which tells the agent when this tool is appropriate. It does not explicitly contrast with create/list alternatives, so it stops short of a 5.

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.

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.
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. 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.
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..
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.
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.
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.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations: it states that only fields present in the payload are written, explains the diff behavior with unlink/recreate semantics, warns that nothing is ever fully deleted, describes active-template constraints, and clarifies that language and step-based content are immutable. It is fully consistent with the `destructiveHint: true`, `idempotentHint: true`, and `readOnlyHint: false` annotations.

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 is front-loaded and logically organized, but it repeats itself: the first paragraph and the second paragraph both explain the 'only fields you send' rule, the 'omit questions' behavior, and the constraints on welcome/thank-you and language. The content is extremely valuable, but it could be condensed by roughly a third without losing 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 40-parameter tool with an output schema and rich annotations, the description covers the critical edge cases: question diffing, active-interview restrictions, avatar template interactions, null-clearing behavior, language immutability, position vs interview field restrictions, and idempotent resending. No essential context for correctly calling this tool 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?

The input schema already documents all 40 parameters, so the baseline is high. The prose still adds value beyond the schema by explaining the global partial-update contract, the complete-list/diff behavior for `questions`, the restricted field set for multi-stage positions (422 for interview-only fields), and the catalogue mapping of `tags`. This is more than minimal but not exhaustive per-parameter detail, since the schema handles that.

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: 'Update the configuration of an existing interview/position', and enumerates the kinds of settings that can be changed (name, description, avatar template, recording, scoring, tags, questions). It distinguishes the tool from its creation-oriented siblings by emphasizing it updates existing definitions, and it explicitly scopes interview vs position behavior.

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?

The description gives concrete when-to-use guidance: omit `questions` to leave them untouched, read the interview first and resend the full list to edit questions, set active offline-template interviews back to draft before changing questions, and create a new interview if the language needs to change. It also states alternatives, such as updating multi-stage position interview stages individually, and tells the agent what is not handled by this endpoint.

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).
knowledge_base_store_idYesThe knowledge base store to add the document to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
knowledge_base_idYesId of the created knowledge_base record.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations indicate destructiveHint=true (modifies data). The description adds that uploading queues the document for processing, implying asynchronous behavior. However, it does not detail what happens after processing, whether overwriting occurs, or error scenarios. The description adds some context beyond annotations but lacks depth.

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 description is two paragraphs, front-loaded with the purpose, and provides necessary details succinctly. It is slightly verbose in repeating file formats but overall efficient. No unnecessary sentences.

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?

Given that an output schema exists (return values are handled separately), the tool description covers the main behavior: uploading, queuing, and accepted formats. It lacks details about processing time, error handling, or file size limits, but annotations and schema mitigate some gaps. For a 4-parameter tool, it is fairly complete.

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 baseline is 3. The description adds value by explaining that the file parameter can be binary or base64 depending on Content-Type, and that the name falls back to the uploaded file name for multipart. This clarifies parameter usage beyond 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?

The title and description clearly state that the tool uploads and processes a knowledge base document. It uses specific verbs (upload, process) and identifies the resource (knowledge base document), distinguishing it from sibling tools focused on interviews, personas, and merchants.

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?

The description explains that the tool accepts file as multipart/form-data or JSON, and mentions queuing for processing. However, it does not explicitly state when to use this tool versus alternatives, nor does it provide prerequisites (e.g., store must exist) or exclusion cases. Nonetheless, no direct sibling tool performs similar uploading, so the guidance is adequate.

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. Dates show when Glama detected each change.

  1. 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"
  2. 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"
  3. 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"
        +]
  4. 3 tool updates
    • Changedcreate_interview_from_questions3 fields changed
      • changedInput schema / properties / questions / items / properties / conditional_question_main_id / description
        Previous value: -"For a conditional question, the id (the local \"id\" field above) of the parent question in this same array that triggers it."New value: +"For a conditional question, the id (the \"id\" field above) of the parent question in this same array that triggers it. The parent must appear earlier in the array than the conditional question referencing it."
      • changedInput schema / properties / questions / items / properties / external_id / description
        Previous value: -"External identifier stored on the question."New value: +"External identifier stored on the question. job-interview-update matches on this first, so an ATS that owns stable ids can send its own array and have the diff line up without round-tripping our ids."
      • changedInput schema / properties / questions / items / properties / id / description
        Previous value: -"Caller-local identifier for this question. Only needed when another question references it via conditional_question_main_id (the mapping is resolved within this array)."New value: +"Identifier for this question. job-interview-get returns the question's real id here; send it back to job-interview-update so an unchanged question keeps its existing record (and with it its answer rules and any rendered avatar video). Also the handle another question references via conditional_question_main_id. On job-interview-create-from-array it is a caller-local value, only needed for those references."
    • Changedget_interview_definition2 fields changed
      • addedOutput schema / properties / questions
        Added value: +{
        +  "description": "The 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.",
        +  "items": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "candidate_expectations_json": {
        +        "description": "Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved.",
        +        "properties": {
        +          "moderate": {
        +            "description": "Requirements expected of a solid, competent candidate.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": [
        +              "array",
        +              "null"
        +            ]
        +          },
        +          "strong": {
        +            "description": "High-bar requirements only standout candidates clear.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": [
        +              "array",
        +              "null"
        +            ]
        +          },
        +          "weak": {
        +            "description": "Baseline requirements every viable candidate should meet (table stakes).",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": [
        +              "array",
        +              "null"
        +            ]
        +          }
        +        },
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "conditional_question_main_id": {
        +        "description": "For a conditional question, the id (the \"id\" field above) of the parent question in this same array that triggers it. The parent must appear earlier in the array than the conditional question referencing it.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "duration": {
        +        "description": "Answer duration in seconds for this question.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "external_data": {
        +        "additionalProperties": {},
        +        "description": "Arbitrary JSON metadata stored on the question.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "external_id": {
        +        "description": "External identifier stored on the question. job-interview-update matches on this first, so an ATS that owns stable ids can send its own array and have the diff line up without round-tripping our ids.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "id": {
        +        "description": "Identifier for this question. job-interview-get returns the question's real id here; send it back to job-interview-update so an unchanged question keeps its existing record (and with it its answer rules and any rendered avatar video). Also the handle another question references via conditional_question_main_id. On job-interview-create-from-array it is a caller-local value, only needed for those references.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "is_candidate_asking_recruiter": {
        +        "description": "Candidate-asks-recruiter prompt (view 'candidate asking recruiter').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_conditional": {
        +        "description": "Conditional follow-up question (view 'with listening conditional'). Use with conditional_question_main_id.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_expert": {
        +        "description": "Expert listening question (view 'with listening expert').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_multiple_choice": {
        +        "description": "Multiple-choice question (view 'multiple choice').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_without_scoring": {
        +        "description": "Question is asked but not scored (view 'without scoring').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "knowledge_base_id": {
        +        "description": "Knowledge-base store id (uuid) the question draws context from.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "label": {
        +        "description": "Optional label/tag stored on the question.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "mojito_language_code": {
        +        "description": "Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted.",
        +        "enum": [
        +          "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
        +        ],
        +        "example": "en",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "question": {
        +        "description": "The question text shown to the candidate.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "question_alternatives": {
        +        "description": "Alternative phrasings for the question.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "question"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "created_at",
        -  "updated_at",
        -  "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",
        +  "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_interview5 fields changed
      • addedInput schema / properties / questions
        Added value: +{
        +  "description": "OPTIONAL. 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.",
        +  "items": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "candidate_expectations_json": {
        +        "description": "Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved.",
        +        "properties": {
        +          "moderate": {
        +            "description": "Requirements expected of a solid, competent candidate.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": [
        +              "array",
        +              "null"
        +            ]
        +          },
        +          "strong": {
        +            "description": "High-bar requirements only standout candidates clear.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": [
        +              "array",
        +              "null"
        +            ]
        +          },
        +          "weak": {
        +            "description": "Baseline requirements every viable candidate should meet (table stakes).",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": [
        +              "array",
        +              "null"
        +            ]
        +          }
        +        },
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "conditional_question_main_id": {
        +        "description": "For a conditional question, the id (the \"id\" field above) of the parent question in this same array that triggers it. The parent must appear earlier in the array than the conditional question referencing it.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "duration": {
        +        "description": "Answer duration in seconds for this question.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "external_data": {
        +        "additionalProperties": {},
        +        "description": "Arbitrary JSON metadata stored on the question.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "external_id": {
        +        "description": "External identifier stored on the question. job-interview-update matches on this first, so an ATS that owns stable ids can send its own array and have the diff line up without round-tripping our ids.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "id": {
        +        "description": "Identifier for this question. job-interview-get returns the question's real id here; send it back to job-interview-update so an unchanged question keeps its existing record (and with it its answer rules and any rendered avatar video). Also the handle another question references via conditional_question_main_id. On job-interview-create-from-array it is a caller-local value, only needed for those references.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "is_candidate_asking_recruiter": {
        +        "description": "Candidate-asks-recruiter prompt (view 'candidate asking recruiter').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_conditional": {
        +        "description": "Conditional follow-up question (view 'with listening conditional'). Use with conditional_question_main_id.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_expert": {
        +        "description": "Expert listening question (view 'with listening expert').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_multiple_choice": {
        +        "description": "Multiple-choice question (view 'multiple choice').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "is_without_scoring": {
        +        "description": "Question is asked but not scored (view 'without scoring').",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "knowledge_base_id": {
        +        "description": "Knowledge-base store id (uuid) the question draws context from.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "label": {
        +        "description": "Optional label/tag stored on the question.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "mojito_language_code": {
        +        "description": "Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted.",
        +        "enum": [
        +          "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
        +        ],
        +        "example": "en",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "question": {
        +        "description": "The question text shown to the candidate.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "question_alternatives": {
        +        "description": "Alternative phrasings for the question.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "question"
        +    ],
        +    "type": "object"
        +  },
        +  "minItems": 1,
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / regenerate_candidate_expectations
        Added value: +{
        +  "description": "Re-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).",
        +  "example": false,
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / questions_diff
        Added value: +{
        +  "description": "What the question diff decided, question by question. Null when `questions` was not sent.",
        +  "properties": {
        +    "added": {
        +      "description": "Ids of the questions created for entries that matched nothing stored.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "kept": {
        +      "description": "Questions left exactly as they were, record and all.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "question_ids": {
        +      "description": "The interview's full ordered step list after the update, including the welcome / thank-you / instructional steps this endpoint does not manage.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "reactivated": {
        +      "description": "True when the interview was already active and was re-published so the new questions go live.",
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "removed": {
        +      "description": "Ids unlinked because no entry in the request matched them. The question records themselves still exist.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "replaced": {
        +      "description": "Edited questions: the old record was unlinked and a new one created, so the change cannot leak into other interviews reusing it.",
        +      "items": {
        +        "properties": {
        +          "from": {
        +            "description": "The id that was unlinked.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "to": {
        +            "description": "The id of the question created in its place.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to"
        +        ],
        +        "type": "object"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "kept",
        +    "added",
        +    "removed",
        +    "replaced",
        +    "question_ids",
        +    "reactivated"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / updated_fields / description
        Previous value: -"Names of the stored columns that were written, plus `status` when the lifecycle status was changed."New value: +"Names of the stored columns that were written, plus `status` when the lifecycle status was changed and `questions` when the question list was diffed."
      • changedOutput schema / required
        Previous value: -[
        -  "position_id",
        -  "is_multistage",
        -  "updated_fields"
        -]New value: +[
        +  "position_id",
        +  "is_multistage",
        +  "updated_fields",
        +  "questions_diff"
        +]
  5. 9 tool updates
    • Addedcreate_catalogue_directory
    • Changedcreate_interview2 fields changed
      • changedInput schema / properties / tags / description
        Previous value: -"Free-form tags stored on the interview."New value: +"Free-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."
      • changedInput schema / properties / tags / example
        Previous value: -[
        -  "engineering",
        -  "remote"
        -]New value: +[
        +  "interview-practice",
        +  "sales"
        +]
    • Changedcreate_interview_from_questions2 fields changed
      • changedInput schema / properties / tags / description
        Previous value: -"Free-form tags stored on the interview."New value: +"Free-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."
      • changedInput schema / properties / tags / example
        Previous value: -[
        -  "engineering",
        -  "remote"
        -]New value: +[
        +  "interview-practice",
        +  "sales"
        +]
    • Changedcreate_persona2 fields changed
      • changedInput schema / properties / tags / description
        Previous value: -"Free-form tags stored on the persona."New value: +"Free-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."
      • changedInput schema / properties / tags / example
        Previous value: -[
        -  "sales",
        -  "role-play"
        -]New value: +[
        +  "interview-practice",
        +  "sales"
        +]
    • Addedget_catalogue_directory
    • Changedget_interview_definition19 fields changed
      • changedOutput schema / properties / candidate_expectations_json / description
        Previous value: -"Structured candidate expectations JSON. Null for multi-stage positions."New value: +"Structured candidate expectations JSON — the scoring rubric. Null for multi-stage positions."
      • addedOutput schema / properties / coach_plan
        Added value: +{
        +  "description": "Coaching-plan stage this session belongs to. Null for multi-stage positions and for sessions outside any plan.",
        +  "enum": [
        +    "demo",
        +    "screening",
        +    "2nd",
        +    "3rd",
        +    "closing",
        +    "job-specific",
        +    "other",
        +    null
        +  ],
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / creation_parameters / description
        Previous value: -"The 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)."New value: +"The 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)."
      • addedOutput schema / properties / interview_available_till
        Added value: +{
        +  "description": "ISO date/time after which the interview is no longer available to candidates. Null means always available.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / interview_conversation_speed
        Added value: +{
        +  "description": "Conversation pace of the AI avatar (slower/normal/faster). Null keeps the template default. Null for multi-stage positions.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / interview_department
        Added value: +{
        +  "description": "Department the position belongs to.",
        +  "example": "Engineering",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / interview_description_long / description
        Previous value: -"Long description (create field `description_long`)."New value: +"Long description (create/update field `description_long`)."
      • addedOutput schema / properties / interview_salary
        Added value: +{
        +  "description": "Salary range shown for the position.",
        +  "example": "$80k - $100k",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / max_duration
        Added value: +{
        +  "description": "Live session limit in seconds. Null for multi-stage positions.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / max_followups
        Added value: +{
        +  "description": "Maximum number of AI follow-up questions; null uses the template default. Null for multi-stage positions.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / pdf_export_auto_config
        Added value: +{
        +  "description": "Auto-PDF-report options applied when the interview completes; null when auto-export is off. Null for multi-stage positions."
        +}
      • addedOutput schema / properties / questions_random_subset
        Added value: +{
        +  "description": "Fraction of the questions actually asked (0.01-0.9); null asks all of them. Null for multi-stage positions.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / recruiter_profile_id
        Added value: +{
        +  "description": "Profile id of the recruiter owning this interview/position.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / required_pronunciation
        Added value: +{
        +  "description": "Whether a pronunciation assessment is required. Null for multi-stage positions.",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / result_enable_edit_transcript
        Added value: +{
        +  "description": "Whether the candidate may edit the transcript on the result view. Null for multi-stage positions.",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / result_scoring / description
        Previous value: -"Resolved result-scoring config. Null for multi-stage positions."New value: +"Resolved 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."
      • addedOutput schema / properties / slug
        Added value: +{
        +  "description": "URL slug of the public listing, when one was generated.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / tags
        Added value: +{
        +  "description": "Free-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.",
        +  "example": [
        +    "interview-practice",
        +    "sales"
        +  ],
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "created_at",
        -  "updated_at",
        -  "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"
        -]New value: +[
        +  "name",
        +  "created_at",
        +  "updated_at",
        +  "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"
        +]
    • Addedlist_catalogue_directories
    • Addedupdate_catalogue_directory
    • Addedupdate_interview
  6. 1 tool update
    • Changedcreate_interview7 fields changed
      • changedInput schema / properties / interview_length / description
        Previous value: -"Number of questions to generate (max 40)."New value: +"Number 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."
      • changedInput schema / properties / max_duration / description
        Previous value: -"Maximum interview duration in minutes used to scope question generation."New value: +"Maximum 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."
      • changedInput schema / properties / max_duration / example
        Previous value: -30New value: +1200
      • changedOutput schema / description
        Previous value: -"Id of the created interview. Includes embed_id/embed_signing_key when is_embedded=true."New value: +"Id of the created interview, the number of questions generated and the stored max_duration. Includes embed_id/embed_signing_key when is_embedded=true."
      • addedOutput schema / properties / max_duration
        Added value: +{
        +  "description": "Live session limit in seconds stored on the interview — the value sent, or the 1200 default when omitted.",
        +  "example": 1200,
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / questions_generated
        Added value: +{
        +  "description": "Number of questions actually generated. May be lower than the requested interview_length, which is capped by max_duration.",
        +  "example": 8,
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "interview_def_set_id"
        -]New value: +[
        +  "interview_def_set_id",
        +  "questions_generated",
        +  "max_duration"
        +]
  7. 24 tool updates
    • First observedcreate_interview
    • First observedcreate_interview_from_questions
    • First observedcreate_persona
    • First observedgenerate_interview_report
    • First observedgenerate_interview_url
    • First observedget_documentation
    • First observedget_interview_definition
    • First observedget_interview_result_details
    • First observedget_merchant_analytics
    • First observedget_merchant_credit_usage
    • First observedget_merchant_status
    • First observedjobmojito_configuration
    • First observedlist_avatars
    • First observedlist_candidates
    • First observedlist_interview_results
    • First observedlist_interviews
    • First observedlist_languages
    • First observedlist_my_merchants
    • First observedlist_sub_merchants
    • First observedregister_users_for_interview
    • First observedrequest_another_interview_attempt
    • First observedsearch_documentation
    • First observedset_interview_state
    • First observedupload_knowledge_base_document

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Generate tailored job descriptions, hire senior developers and pull technical interview questions without leaving the conversation.
    2
    -
  • A
    license
    A
    quality
    D
    maintenance
    Manage Job using MCP: Manage Job, Candidates, Resumes, Salaries all within this one MCP tools It can solve problems like: You have 50 resumes to screen. Your AI assistant can reason about candidates, but it can't: Read PDFs/DOCX — The AI can't open binary files Extract structured data — Copy-pasting loses formatting, metrics, and context Compare at scale — No consistent scoring across candida
    24
    42
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.