JobMojito
Server Details
Run AI interviews, manage candidates and read hiring analytics on JobMojito.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- JobMojito/mcp
- GitHub Stars
- 1
- Server Listing
- JobMojito MCP Server
TDQS
Scored across 29 tools
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.
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.
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.
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 toolscreate_catalogue_directoryCreate coaching catalogue directoryADestructiveInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Directory 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`. | |
| name | Yes | Display name of the directory, shown as the page title and on its card. | |
| status | No | Lifecycle 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_sub | No | Ids 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_plan | No | Coaching-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_md | No | 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 | |
| parent_tag | No | Id 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). | |
| visibility | No | Who 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.. | |
| description | No | Short description shown on the directory card. | |
| merchant_id | No | Merchant that owns the directory. Admin / sub-merchant callers only; otherwise taken from your token. | |
| cover_image_url | No | Cover image URL shown on the directory card. | |
| mojito_language_code | No | Language of the directory (one of the platform-languages.json codes). The catalogue groups directories by language; defaults to `en` when omitted. | |
| tags_interview_set_filter | No | Tag 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
| Name | Required | Description |
|---|---|---|
| id | Yes | Id of the created directory. |
| parent_tag | Yes | The directory this one was nested under, when `parent_tag` was supplied. |
| merchant_id | Yes | Owning merchant id. Null for a platform-wide (`public`) directory. |
| catalogue_url | Yes | Public URL of the directory page, when the merchant has a coaching-portal domain configured. Null otherwise. |
TDQS
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.
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.
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.
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.
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.
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 interviewCDestructiveInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Optional external code/reference for the interview. | |
| name | Yes | Interview / position name. | |
| tags | No | 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. | |
| type | Yes | Product 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.. | |
| status | Yes | Lifecycle 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.. | |
| location | Yes | Job location. | |
| recording | No | Cheating/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.. | |
| visibility | Yes | Who 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.. | |
| description | No | Short, 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_embedded | No | Set 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_id | No | Merchant id. Admin / sub-merchant callers only; otherwise taken from your token. | |
| result_view | No | Result 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_duration | No | 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. | |
| max_followups | No | Maximum 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_scoring | No | Custom result-scoring overrides merged with defaults and template overrides. | |
| interview_tone | No | Interview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups; omit to default to relaxed. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default. | |
| interview_type | No | Interview 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_url | No | Cover image URL. | |
| seniority_level | No | Target 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_message | No | Custom welcome message shown to the candidate. | |
| description_long | No | 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 | |
| interview_length | No | 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. | |
| interview_salary | No | Salary range shown for the position. | |
| thank_you_message | No | Custom thank-you message shown after the interview. | |
| additional_context | No | Arbitrary additional context object merged into AI generation. | |
| hiring_for_company | No | Who 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_attempts | No | Allowed candidate attempts (1-20). | |
| instructional_video | No | Show an instructional video before approval. Defaults to false. | |
| interview_department | No | Department the position belongs to. | |
| mojito_language_code | Yes | Platform language code used for the interview. Must be one of the platform-languages.json codes. | |
| recruiter_profile_id | No | Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. | |
| interview_template_id | Yes | Id of the interview template to base this interview on. | |
| candidate_expectations | No | Free-text candidate expectations folded into AI generation. | |
| include_closing_prompt | No | Include a closing prompt. Defaults to true. | |
| pdf_export_auto_config | No | Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export. | |
| recording_full_session | No | Full 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_pronunciation | No | Require pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false. | |
| knowledge_base_store_id | No | Knowledge base store id to source additional context from. | |
| questions_random_subset | No | Ask 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_question | No | Include an opening rapport question. Defaults to false. | |
| interview_available_till | No | ISO date/time after which the interview is no longer available to candidates. null keeps it always available. | |
| use_enhanced_expectations | No | Reserved flag passed through to generation. | |
| candidate_video_introduction | No | Whether a candidate video introduction is optional or required. | |
| interview_conversation_speed | No | Conversation 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_transcript | No | Allow editing the transcript on the result view. Defaults to true. | |
| instructional_video_custom_text | No | Custom narration text for the instructional video. |
Output Schema
| Name | Required | Description |
|---|---|---|
| embed_id | No | Embed id, present only when is_embedded=true. |
| max_duration | Yes | Live session limit in seconds stored on the interview — the value sent, or the 1200 default when omitted. |
| embed_signing_key | No | Embed signing key, present only when is_embedded=true. |
| questions_generated | Yes | Number of questions actually generated. May be lower than the requested interview_length, which is capped by max_duration. |
| interview_def_set_id | Yes | Id of the newly created interview definition set. |
TDQS
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.
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.
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.
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.
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.
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 questionsADestructiveInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Optional external code/reference. | |
| name | Yes | Interview/position name. | |
| tags | No | 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. | |
| type | Yes | Product 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.. | |
| status | Yes | Lifecycle 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.. | |
| location | Yes | Interview location. | |
| questions | Yes | Ordered list of interview questions to create as steps. | |
| recording | No | Cheating/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.. | |
| visibility | Yes | Who 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.. | |
| description | Yes | Short interview description. | |
| is_embedded | No | Set 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_id | No | Target merchant id (admins / sub-merchant only). | |
| result_view | No | Result 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_followups | No | Maximum 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_scoring | No | Custom scoring overrides merged with defaults. | |
| interview_tone | No | Tone — configures the AI avatar's speaking style and the follow-up questions it generates; the base `questions` you supply are not affected. Omit to default to relaxed. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default. | |
| interview_type | No | Interview 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_url | No | Cover image URL. | |
| seniority_level | No | Target 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_message | No | Custom welcome message. | |
| description_long | No | 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 | |
| interview_salary | No | Salary range shown for the position. | |
| thank_you_message | No | Custom thank-you message. | |
| additional_context | No | Extra context forwarded to expectation generation. | |
| hiring_for_company | No | Who 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_attempts | No | Allowed attempts, 1-20. | |
| instructional_video | No | Enable an instructional video before approval. | |
| interview_department | No | Department the position belongs to. | |
| mojito_language_code | Yes | Platform language code (one of the platform-languages.json codes); must also resolve to a supported language with an Azure speech mapping. | |
| recruiter_profile_id | No | Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. | |
| disable_deduplication | No | When true, skip step deduplication on insert. | |
| interview_template_id | Yes | Id of the interview template to use. Must reference an existing interview_templates row. | |
| candidate_expectations | No | Free-text candidate expectations. | |
| pdf_export_auto_config | No | Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export. | |
| recording_full_session | No | Full 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_pronunciation | No | Require pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false. | |
| knowledge_base_store_id | No | Optional knowledge base store id; validated for existence. | |
| questions_random_subset | No | Fraction of questions to randomly ask, between 0.01 and 0.9. | |
| interview_available_till | No | ISO date/time after which the interview is no longer available to candidates. null keeps it always available. | |
| candidate_expectations_json | No | Pre-generated candidate expectations, bucketed by requirement level (weak/moderate/strong); auto-generated when omitted for type=interview. Extra keys are preserved. | |
| candidate_video_introduction | No | Whether a candidate video introduction is optional or required. | |
| interview_conversation_speed | No | Conversation 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_transcript | No | Allow editing the transcript on the result view. Defaults to true. | |
| instructional_video_custom_text | No | Custom text for the instructional video. |
Output Schema
| Name | Required | Description |
|---|---|---|
| embed_id | No | Embed id, present only when is_embedded=true. |
| embed_signing_key | No | Embed signing key, present only when is_embedded=true. |
| interview_def_set_id | Yes | Id of the newly created interview definition set. |
TDQS
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.
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.
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.
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.
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.
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 personaADestructiveInspect
[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 viainterview_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. Omittingportalgives you this one, so passportal: "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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Optional external code/reference for the persona. | |
| name | Yes | Persona / session name. | |
| tags | No | 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. | |
| portal | No | REQUIRED 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. | |
| status | Yes | Lifecycle 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.. | |
| recording | No | Cheating/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.. | |
| visibility | Yes | Who 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.. | |
| description | No | Short 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_embedded | No | Set 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_id | No | Merchant id. Admin / sub-merchant callers only; otherwise taken from your token. | |
| result_view | No | Result 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_duration | No | Maximum conversation duration in seconds. Defaults to 1200 (20 min) when omitted. | |
| opening_line | No | The 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_url | No | Cover image URL. | |
| welcome_message | No | Custom 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_user | Yes | The 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_message | No | Custom thank-you message shown after the session — set it; omitting it leaves a generic platform default. | |
| interview_attempts | No | Allowed 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_location | No | Optional location label shown for the session. | |
| persona_role_avatar | Yes | The 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_code | Yes | Platform language code used for the conversation. Must be one of the platform-languages.json codes. | |
| recruiter_profile_id | No | Profile id of the recruiter owning this persona. Must be a merchant/merchant_owner/admin profile of the same merchant. | |
| interview_template_id | Yes | Id of the interview template (avatar) the persona uses. | |
| persona_avatar_who_is | No | Who 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_expectations | No | Mentee assessment goals — free-text describing what the candidate is expected to achieve (max 2100 chars). | |
| recording_full_session | No | Full 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_progress | No | How 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_knowledge | No | Private 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_introduction | No | Whether a candidate video introduction is optional or required. | |
| interview_conversation_speed | No | Conversation 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_conditions | No | When 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
| Name | Required | Description |
|---|---|---|
| embed_id | No | Embed id, present only when is_embedded=true. |
| embed_signing_key | No | Embed signing key, present only when is_embedded=true. |
| interview_def_set_id | Yes | Id of the newly created persona definition set. |
TDQS
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.
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.
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.
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.
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.
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 reportADestructiveIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| store_file | No | When true (pdf only), persist the file to storage and return a signed URL. | |
| export_type | Yes | ||
| interview_result_id | No | ||
| interview_result_ids | No | Generate a single combined report for multiple results. | |
| export_features_result | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | The 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
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.
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.
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.
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.
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.
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 linkADestructiveInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Which kind of signed URL to generate. | |
| hide_menu | No | Pass the string 'false' to show the navigation menu; any other value hides it (default). | |
| merchant_id | No | Override merchant id (admin / sub-merchant only). | |
| interview_id | No | Interview or position id. Required for interview-for-profile and interview-results-for-position. | |
| interview_result_id | No | Interview result id. Required for interview-result-candidate and interview-result-talent-seeker. | |
| interview_profile_id | No | Candidate profile id. Required for interview-for-profile and results-for-profile. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | The signed interview URL. |
TDQS
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.
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.
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.
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.
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.
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 directoryARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the catalogue directory to read (the catalogue URL segment). | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Directory id — also the catalogue URL segment. |
| name | Yes | Display name. |
| status | Yes | Lifecycle status. |
| tags_sub | Yes | Ids 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_plan | Yes | Coaching-plan stage, when the directory belongs to one. |
| content_md | Yes | 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 |
| created_at | Yes | Creation timestamp (ISO 8601). |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| visibility | Yes | Who can see it. |
| description | Yes | Short description shown on the directory card. |
| merchant_id | Yes | Owning merchant id. Null for a platform-wide directory. |
| catalogue_url | Yes | Public URL of this directory page, when the merchant has a coaching-portal domain configured. |
| cover_image_url | Yes | Cover image URL. |
| sub_directories | Yes | The 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_sessions | Yes | The 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_directory | Yes | True when this is the directory the merchant's catalogue opens on. |
| mojito_language_code | Yes | Directory language. |
| tags_interview_set_filter | Yes | Tag 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_truncated | Yes | True when more sessions match than the 200 returned — narrow `tags_interview_set_filter` if you see this. |
TDQS
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.
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.
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.
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.
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.
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 pageARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The documentation page URL. | |
| max_chars | No | Truncate content to this many characters (default 20000). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 definitionARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| position_id | Yes | Identifier of either an interview definition (single-stage) or a position definition (multi-stage). The function resolves whichever matches. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | Yes | Caller-supplied external code/reference. |
| name | Yes | Interview or position name. |
| slug | Yes | URL slug of the public listing, when one was generated. |
| tags | Yes | 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. |
| type | Yes | Interview type. Null for multi-stage positions. |
| stage | Yes | Hiring-pipeline stage. Null for multi-stage positions. |
| status | Yes | Lifecycle status of the interview/position. |
| questions | Yes | 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. |
| recording | Yes | Per-answer recording mode. Null for multi-stage positions. |
| coach_plan | Yes | Coaching-plan stage this session belongs to. Null for multi-stage positions and for sessions outside any plan. |
| created_at | Yes | |
| updated_at | Yes | |
| visibility | Yes | Who can see and access the interview/position. |
| description | Yes | Short description. |
| merchant_id | Yes | Owning merchant id. |
| result_view | Yes | Result view level. Null for multi-stage positions. |
| type_credit | Yes | Credit bucket the interview draws from. Null for multi-stage positions. |
| max_duration | Yes | Live session limit in seconds. Null for multi-stage positions. |
| is_multistage | Yes | True when the id resolved to a multi-stage position rather than a single interview. |
| is_voice_only | Yes | Convenience 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_followups | Yes | Maximum number of AI follow-up questions; null uses the template default. Null for multi-stage positions. |
| result_scoring | No | 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. |
| cover_image_url | Yes | Cover image URL. |
| interview_salary | Yes | Salary range shown for the position. |
| interview_location | Yes | Location (create field `location`). |
| creation_parameters | No | 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). |
| calc_definition_json | No | The compiled interview definition JSON (structure varies by interview type). |
| interview_department | Yes | Department the position belongs to. |
| mojito_language_code | Yes | Platform (mojito) language code. |
| recruiter_profile_id | Yes | Profile id of the recruiter owning this interview/position. |
| speech_language_code | Yes | Azure speech language code. Null for multi-stage positions. |
| speech_language_name | Yes | Azure speech language display name. Null for multi-stage positions. |
| interview_template_id | Yes | Interview template id. For multi-stage positions this is the first interview step's template. |
| candidate_expectations | Yes | Free-text candidate expectations. Null for multi-stage positions. |
| pdf_export_auto_config | No | Auto-PDF-report options applied when the interview completes; null when auto-export is off. Null for multi-stage positions. |
| recording_full_session | Yes | Full-session recording mode. Null for multi-stage positions. |
| required_pronunciation | Yes | Whether a pronunciation assessment is required. Null for multi-stage positions. |
| interview_template_type | Yes | Type of the linked interview template. `interactive_elevenlabs` is voice-only; the others (`interactive_heygen`, `offline_heygen`, `offline_elai`, `offline_synthesia`) are avatar-based. Null when the template could not be resolved. |
| knowledge_base_store_id | Yes | Linked knowledge base store id. Null for multi-stage positions. |
| questions_random_subset | Yes | Fraction of the questions actually asked (0.01-0.9); null asks all of them. Null for multi-stage positions. |
| interview_available_till | Yes | ISO date/time after which the interview is no longer available to candidates. Null means always available. |
| interview_description_long | Yes | 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 |
| candidate_expectations_json | No | Structured candidate expectations JSON — the scoring rubric. Null for multi-stage positions. |
| candidate_video_introduction | Yes | Whether a candidate video introduction is hidden/optional/required. Null for multi-stage positions. |
| interview_conversation_speed | Yes | Conversation pace of the AI avatar (slower/normal/faster). Null keeps the template default. Null for multi-stage positions. |
| result_enable_edit_transcript | Yes | Whether the candidate may edit the transcript on the result view. Null for multi-stage positions. |
TDQS
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.
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.
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.
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.
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.
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 detailsARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| interview_result_id | Yes | The interview result to fetch the transcript and details for. | |
| get_signed_recordings | No | When true, includes short-lived signed recording URLs for the session, the video introduction, and each transcript answer. | false |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | No | Interview end timestamp (training_end, ISO 8601). |
| score | No | Overall interview score. |
| start | No | Interview start timestamp (training_start, ISO 8601). |
| status | No | Coach/interview status (coach_status), e.g. started, completed. |
| duration | No | Total duration in deciseconds (duration_ds). |
| score_text | No | Human-readable score summary. |
| transcript | No | Ordered interactions (questions + answers) of the interview. |
| ai_analysis | No | Candidate-facing AI analysis of the whole interview. |
| score_answer | No | Aggregate answer sub-score. |
| recording_url | No | Signed session-recording URL; present only when get_signed_recordings=true. |
| recruiter_risks | No | Detected recruiter risk flags (jsonb). |
| score_sentiment | No | Sentiment sub-score. |
| score_simulation | No | Overall simulated score. |
| recording_is_video | No | Whether the session recording is video. |
| score_pronunciation | No | Pronunciation sub-score. |
| ai_completion_reason | No | Why the interview completed (ai_completed_reason). |
| recording_local_path | No | Storage path of the full session recording. |
| ai_analysis_recruiter | No | Recruiter-facing AI analysis of the whole interview. |
| score_words_per_minute | No | Speaking-pace (words per minute) sub-score. |
| video_introduction_url | No | Signed video-introduction URL; present only when get_signed_recordings=true. |
| user_feedback_recruiter | No | Recruiter-entered feedback note. |
| video_introduction_local_path | No | Storage path of the candidate video introduction. |
| ai_analysis_recruiter_why_hire | No | Reasons to hire (list/text). |
| ai_interview_coverage_percentage | No | Percentage of the intended interview the AI judged to be covered. |
| ai_analysis_recruiter_why_not_hire | No | Reasons not to hire (list/text). |
TDQS
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.
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.
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.
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.
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.
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 analyticsARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1–1000). | |
| offset | No | Number of records to skip from the start of the result set. | |
| date_to | Yes | End of the date range (inclusive), YYYY-MM-DD. | |
| date_from | Yes | Start of the date range (inclusive), YYYY-MM-DD. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. | |
| interview_id | No | Optional 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
| Name | Required | Description |
|---|---|---|
| data | Yes | Daily 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. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 usageARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1–1000). | |
| offset | No | Number of records to skip from the start of the result set. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. | |
| interview_id | No | Optional 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
| Name | Required | Description |
|---|---|---|
| data | Yes | Credit-consuming analytics events for the merchant, most recent first. Each row is one billable event; the credits it consumed are in stats.credit_amount. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 statusARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. |
Output Schema
| Name | Required | Description |
|---|---|---|
| candidates | Yes | Total candidates (non-archived profile_interview rows) for the merchant. |
| profile_id | Yes | The calling user's profile id (auth user id), taken from the JWT. |
| merchant_id | Yes | The 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_sent | Yes | Interview invitations sent during the current subscription period. |
| interview_results | Yes | Total non-archived interview results for the merchant. |
| invitations_limit | Yes | Maximum invitations allowed this period (4x available credits). Null for unlimited (Special) plans. |
| subscription_type | Yes | Subscription plan name (e.g. Free, Starter, Growth, Special). |
| candidates_history | Yes | Daily new-candidate counts for the last 14 days, most recent first. |
| definitions_active | Yes | Count of active interview + position definitions. |
| interviews_ongoing | Yes | Interviews currently in progress (coach_status = started). |
| default_merchant_id | Yes | The caller's home merchant id pinned in the JWT (app_metadata.merchant_id). Null if the token carries no merchant. |
| subscription_status | Yes | Subscription status (e.g. active, past_due, canceled). Null when no subscription. |
| interviews_undecided | Yes | Completed interviews awaiting a recruiter decision. |
| invitations_available | Yes | Remaining invitations this period. Null for unlimited (Special) plans. |
| credits_interview_extra | Yes | Extra (top-up) interview credits available on top of the monthly allowance. |
| credits_interview_single | Yes | Single-position interview credits available. |
| interview_result_history | Yes | Daily new-interview-result counts for the last 14 days, most recent first. |
| credits_interview_monthly | Yes | Remaining monthly interview credits. |
| interviews_without_credits | Yes | Completed interviews that have not yet consumed a credit. |
| credits_interview_monthly_limit | Yes | Monthly interview-credit allowance for the current plan. |
TDQS
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.
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.
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.
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.
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.
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 merchantARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 templatesARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by avatar template type. Omit for all. | |
| limit | No | Maximum number of records to return (1–1000). | |
| offset | No | Number of records to skip from the start of the result set. | |
| status | No | Filter by status. Omit for all except archived (see include_archived). | |
| filter_text | No | Case-insensitive search on template name or voice language name. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. | |
| include_public | No | Also include public templates shared across merchants, in addition to this merchant's own. | false |
| include_archived | No | Include archived templates (excluded by default). | false |
| mojito_language_code | No | Filter by platform language code. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The merchant's avatar templates for this page, newest-updated first. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 candidatesARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Filter candidates by recent activity. Omit (or empty) to include all. | |
| limit | No | Maximum number of records to return (1–1000). | |
| offset | No | Number of records to skip from the start of the result set. | |
| source | No | Filter by how the candidate entered: invited or self-registered. Omit for both. | |
| order_by | No | Sort order of the result set. | created_at_newest |
| filter_text | No | Case-insensitive search on candidate name or email. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. | |
| filter_emoji | No | Filter by the candidate emoji marker. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The merchant's candidates for this page. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 directoriesARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1–1000). | |
| offset | No | Number of records to skip from the start of the result set. | |
| status | No | Filter by lifecycle status. Omit to include every status you can see (deleted directories are never returned). | |
| parent_tag | No | Return 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. | |
| visibility | No | Filter by visibility. | |
| filter_text | No | Case-insensitive search on the directory id, name and description. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. | |
| include_public | No | Include the platform-wide `public` directories shared across merchants. | true |
| mojito_language_code | No | Filter by the directory language (a platform-languages.json code, e.g. `en`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The catalogue directories for this page, ordered by id. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 resultsARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Filter by decision/completion state. Omit (or empty) to include all. | |
| step | No | Filter by pipeline step (pre-screening vs interview). Omit for both. | |
| type | No | Product type of results to list. | interview |
| limit | No | Maximum number of records to return (1–1000). | |
| risks | No | Comma-separated list of recruiter-risk keys to filter by (matches any). | |
| offset | No | Number of records to skip from the start of the result set. | |
| order_by | No | Sort order of the result set. | created_at_newest |
| filter_text | No | Case-insensitive search on candidate name or email. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. | |
| filter_emoji | No | Filter by the candidate emoji marker. | |
| interview_id | No | Filter to a single interview definition id. | |
| profile_interview_id | No | Filter to a single candidate (profile_interview) id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The merchant's interview results for this page. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 interviewsARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Product type of interviews to list. | interview |
| limit | No | Maximum number of records to return (1–1000). | |
| offset | No | Number of records to skip from the start of the result set. | |
| status | No | Filter by lifecycle status. Omit to include all statuses. | |
| show_demo | No | Include demo/sample interviews. | false |
| filter_text | No | Case-insensitive search on the interview name. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. | |
| show_public | No | Include interviews shared publicly across merchants (coaching/avatars). | false |
| filter_emoji | No | Filter by the interview emoji marker. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The merchant's interview definitions for this page, newest-updated first. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 languagesARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| languages | Yes | Supported platform languages, sorted by English name. |
TDQS
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.
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.
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.
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.
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.
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 asARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Optional case-insensitive filter on sub-merchant name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-merchantsARead-onlyIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1–1000). | |
| offset | No | Number of records to skip from the start of the result set. | |
| order_by | No | Sort order of the result set. | created_at_newest |
| filter_text | No | Case-insensitive search on the sub-merchant name. | |
| merchant_id | No | Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The sub-merchants the caller administers for this page. |
| pagination | Yes |
TDQS
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.
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.
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.
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.
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.
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 interviewADestructiveInspect
[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).
| Name | Required | Description | Default |
|---|---|---|---|
| users | Yes | Candidates to register for the interview. Each gets a one-time interview URL. | |
| is_test | No | When 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_menu | No | When true (or the string "true"), the interview UI hides its menu (view_hm). | |
| send_email | No | Whether to send an invitation email to each registered candidate. | |
| hide_iframe | No | When true (or the string "true"), the interview UI hides its iframe chrome (view_hi). | |
| merchant_id | No | Merchant id. Required when authenticating with the service key; for user tokens it is optional and only honored for admin / sub-merchant accounts. | |
| interview_id | Yes | Interview definition (interview_def_set) or position (position_def_set) id to register users for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | The input users, each annotated with its registration result and (on success) interview URL. |
TDQS
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.
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.
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.
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.
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.
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 attemptADestructiveInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| interview_result_id | Yes | The interview result to reopen for another attempt. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 documentationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results per source (1-25). | |
| query | Yes | Natural-language search query or keywords. | |
| source | No | "all" (default), "developer", or "help" to restrict the search. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 stateADestructiveIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | New lifecycle status to apply. | |
| is_embedded | No | Controls 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_id | Yes | Interview definition id or position id whose state should change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Returns `{ embed_id, embed_signing_key }` when an embed key was created/returned (is_embedded=true), otherwise `{ success: true }`. |
TDQS
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.
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.
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.
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.
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.
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 directoryADestructiveIdempotentInspect
[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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the directory to update (the catalogue URL segment). The id itself cannot be changed — create a new directory instead. | |
| name | No | Display name of the directory. | |
| status | No | Lifecycle 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_sub | No | Ids 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_plan | No | Coaching-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_md | No | 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 | |
| visibility | No | Who 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.. | |
| description | No | Short description shown on the directory card. | |
| cover_image_url | No | Cover image URL shown on the directory card. null clears it. | |
| mojito_language_code | No | Language of the directory (one of the platform-languages.json codes). The catalogue groups directories by language. | |
| tags_interview_set_filter | No | Tag 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
| Name | Required | Description |
|---|---|---|
| id | Yes | Id of the updated directory. |
| catalogue_url | Yes | Public URL of the directory page, when the merchant has a coaching-portal domain configured. Null otherwise. |
| updated_fields | Yes | Names of the fields that were written. |
TDQS
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.
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.
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.
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.
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.
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 positionADestructiveIdempotentInspect
[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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | External code/reference. Blank is stored as null. | |
| name | No | Interview / position name. | |
| tags | No | 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. | |
| type | No | Product 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. | |
| status | No | New 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). | |
| location | No | Interview location (column `interview_location`). Blank is stored as null. | |
| questions | No | 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. | |
| recording | No | Cheating/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_plan | No | Coaching-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.. | |
| visibility | No | Who 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.. | |
| description | No | Short interview description. | |
| position_id | Yes | Id of the interview definition (single-stage) or position definition (multi-stage) to update. The same id you pass to job-interview-get. | |
| result_view | No | Result 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_credit | No | Credit 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_duration | No | Live session limit in seconds. Also the basis for the credit multiplier. | |
| max_followups | No | Maximum 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_scoring | No | Result-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_tone | No | Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default. | |
| interview_type | No | Interview 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_url | No | Cover image URL. | |
| seniority_level | No | Target 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_long | No | 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 | |
| interview_salary | No | Salary range shown for the position. Blank is stored as null. | |
| hiring_for_company | No | Who 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_attempts | No | Allowed candidate attempts (1-20). Stored as result_scoring.max_retries. | |
| interview_department | No | Department the position belongs to. Blank is stored as null. | |
| recruiter_profile_id | No | Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it. | |
| interview_template_id | No | Id 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_expectations | No | Free-text candidate expectations. | |
| pdf_export_auto_config | No | Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export. | |
| recording_full_session | No | Full 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_pronunciation | No | Require pronunciation assessment (restricts to pronunciation-capable languages). | |
| knowledge_base_store_id | No | Knowledge base store id the interview draws context from; validated for existence. null unlinks it. | |
| questions_random_subset | No | Ask only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions. | |
| interview_available_till | No | ISO date/time after which the interview is no longer available to candidates. null keeps it always available. | |
| candidate_expectations_json | No | Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved. | |
| candidate_video_introduction | No | Whether a candidate video introduction is hidden, optional or required. null is treated like hidden. | |
| interview_conversation_speed | No | Conversation 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_transcript | No | Allow editing the transcript on the result view. | |
| regenerate_candidate_expectations | No | 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| position_id | Yes | The id that was updated. |
| is_multistage | Yes | True when the id resolved to a multi-stage position (position_def_set) rather than a single interview. |
| questions_diff | No | What the question diff decided, question by question. Absent when `questions` was not sent. |
| updated_fields | Yes | Names of the stored columns that were written, plus `status` when the lifecycle status was changed and `questions` when the question list was diffed. |
TDQS
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.
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.
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.
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.
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.
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 documentADestructiveInspect
[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).
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | The document file (binary). | |
| name | No | Document name (with extension). Falls back to the uploaded file name for multipart. | |
| merchant_id | No | Override merchant id (admin / sub-merchant only). | |
| knowledge_base_store_id | Yes | The knowledge base store to add the document to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| knowledge_base_id | Yes | Id of the created knowledge_base record. |
TDQS
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.
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.
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.
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.
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.
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 tool update
- Changed
register_users_for_interview2 fields changed- changed
Input schema / properties / users / examplePrevious 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" + } +] - changed
Input schema / properties / users / items / properties / email / examplePrevious value: -"jozo@jozo.sk"New value: +"peter.parker@example.com"
8 tool updates
- Changed
create_catalogue_directory2 fields changed- changed
Input schema / properties / content_md / descriptionPrevious 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" - changed
Input schema / properties / content_md / examplePrevious 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"
- Changed
create_interview1 field changed- changed
Input schema / properties / description_long / descriptionPrevious 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"
- Changed
create_interview_from_questions1 field changed- changed
Input schema / properties / description_long / descriptionPrevious 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"
- Changed
get_catalogue_directory2 fields changed- changed
Output schema / properties / content_md / descriptionPrevious 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" - changed
Output schema / properties / content_md / examplePrevious 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"
- Changed
get_interview_definition1 field changed- changed
Output schema / properties / interview_description_long / descriptionPrevious 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"
- Changed
list_avatars1 field changed- changed
Input schema / properties / limit / defaultPrevious value: -50New value: +15
- Changed
update_catalogue_directory2 fields changed- changed
Input schema / properties / content_md / descriptionPrevious 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" - changed
Input schema / properties / content_md / examplePrevious 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"
- Changed
update_interview1 field changed- changed
Input schema / properties / description_long / descriptionPrevious 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"
1 tool update
- Changed
update_interview2 fields changed- changed
Output schema / properties / questions_diff / descriptionPrevious 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." - changed
Output schema / requiredPrevious value: -[ - "position_id", - "is_multistage", - "updated_fields", - "questions_diff" -]New value: +[ + "position_id", + "is_multistage", + "updated_fields" +]
3 tool updates
- Changed
create_interview_from_questions3 fields changed- changed
Input schema / properties / questions / items / properties / conditional_question_main_id / descriptionPrevious 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." - changed
Input schema / properties / questions / items / properties / external_id / descriptionPrevious 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." - changed
Input schema / properties / questions / items / properties / id / descriptionPrevious 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."
- Changed
get_interview_definition2 fields changed- added
Output schema / properties / questionsAdded 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" + ] +} - changed
Output schema / requiredPrevious 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" +]
- Changed
update_interview5 fields changed- added
Input schema / properties / questionsAdded 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" + ] +} - added
Input schema / properties / regenerate_candidate_expectationsAdded 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" + ] +} - added
Output schema / properties / questions_diffAdded 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" +} - changed
Output schema / properties / updated_fields / descriptionPrevious 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." - changed
Output schema / requiredPrevious value: -[ - "position_id", - "is_multistage", - "updated_fields" -]New value: +[ + "position_id", + "is_multistage", + "updated_fields", + "questions_diff" +]
9 tool updates
- Added
create_catalogue_directory - Changed
create_interview2 fields changed- changed
Input schema / properties / tags / descriptionPrevious 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." - changed
Input schema / properties / tags / examplePrevious value: -[ - "engineering", - "remote" -]New value: +[ + "interview-practice", + "sales" +]
- Changed
create_interview_from_questions2 fields changed- changed
Input schema / properties / tags / descriptionPrevious 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." - changed
Input schema / properties / tags / examplePrevious value: -[ - "engineering", - "remote" -]New value: +[ + "interview-practice", + "sales" +]
- Changed
create_persona2 fields changed- changed
Input schema / properties / tags / descriptionPrevious 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." - changed
Input schema / properties / tags / examplePrevious value: -[ - "sales", - "role-play" -]New value: +[ + "interview-practice", + "sales" +]
- Added
get_catalogue_directory - Changed
get_interview_definition19 fields changed- changed
Output schema / properties / candidate_expectations_json / descriptionPrevious value: -"Structured candidate expectations JSON. Null for multi-stage positions."New value: +"Structured candidate expectations JSON — the scoring rubric. Null for multi-stage positions." - added
Output schema / properties / coach_planAdded 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" + ] +} - changed
Output schema / properties / creation_parameters / descriptionPrevious 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)." - added
Output schema / properties / interview_available_tillAdded value: +{ + "description": "ISO date/time after which the interview is no longer available to candidates. Null means always available.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / interview_conversation_speedAdded value: +{ + "description": "Conversation pace of the AI avatar (slower/normal/faster). Null keeps the template default. Null for multi-stage positions.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / interview_departmentAdded value: +{ + "description": "Department the position belongs to.", + "example": "Engineering", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / interview_description_long / descriptionPrevious value: -"Long description (create field `description_long`)."New value: +"Long description (create/update field `description_long`)." - added
Output schema / properties / interview_salaryAdded value: +{ + "description": "Salary range shown for the position.", + "example": "$80k - $100k", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / max_durationAdded value: +{ + "description": "Live session limit in seconds. Null for multi-stage positions.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / max_followupsAdded value: +{ + "description": "Maximum number of AI follow-up questions; null uses the template default. Null for multi-stage positions.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / pdf_export_auto_configAdded value: +{ + "description": "Auto-PDF-report options applied when the interview completes; null when auto-export is off. Null for multi-stage positions." +} - added
Output schema / properties / questions_random_subsetAdded 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" + ] +} - added
Output schema / properties / recruiter_profile_idAdded value: +{ + "description": "Profile id of the recruiter owning this interview/position.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / required_pronunciationAdded value: +{ + "description": "Whether a pronunciation assessment is required. Null for multi-stage positions.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / result_enable_edit_transcriptAdded value: +{ + "description": "Whether the candidate may edit the transcript on the result view. Null for multi-stage positions.", + "type": [ + "boolean", + "null" + ] +} - changed
Output schema / properties / result_scoring / descriptionPrevious 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." - added
Output schema / properties / slugAdded value: +{ + "description": "URL slug of the public listing, when one was generated.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / tagsAdded 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" + ] +} - changed
Output schema / requiredPrevious 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" +]
- Added
list_catalogue_directories - Added
update_catalogue_directory - Added
update_interview
1 tool update
- Changed
create_interview7 fields changed- changed
Input schema / properties / interview_length / descriptionPrevious 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." - changed
Input schema / properties / max_duration / descriptionPrevious 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." - changed
Input schema / properties / max_duration / examplePrevious value: -30New value: +1200 - changed
Output schema / descriptionPrevious 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." - added
Output schema / properties / max_durationAdded 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" + ] +} - added
Output schema / properties / questions_generatedAdded 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" + ] +} - changed
Output schema / requiredPrevious value: -[ - "interview_def_set_id" -]New value: +[ + "interview_def_set_id", + "questions_generated", + "max_duration" +]
24 tool updates
- First observed
create_interview - First observed
create_interview_from_questions - First observed
create_persona - First observed
generate_interview_report - First observed
generate_interview_url - First observed
get_documentation - First observed
get_interview_definition - First observed
get_interview_result_details - First observed
get_merchant_analytics - First observed
get_merchant_credit_usage - First observed
get_merchant_status - First observed
jobmojito_configuration - First observed
list_avatars - First observed
list_candidates - First observed
list_interview_results - First observed
list_interviews - First observed
list_languages - First observed
list_my_merchants - First observed
list_sub_merchants - First observed
register_users_for_interview - First observed
request_another_interview_attempt - First observed
search_documentation - First observed
set_interview_state - First observed
upload_knowledge_base_document
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity – fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge – works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge – works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
- mcpOAuthcom.linatora
AI-powered hiring for recruiters & candidates - video interviews, transcripts, scores, profiles.
AI screening interviews, resume matching, and evidence-linked scorecards for recruiting teams.
Official 100Hires MCP: AI ATS & Recruitment Software for candidates, jobs, applications, interviews.
AI voice interviewer: create roles, screen CVs, schedule interviews, read scored reports.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceGenerate tailored job descriptions, hire senior developers and pull technical interview questions without leaving the conversation.2-
- AlicenseAqualityDmaintenanceManage 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 candida24421MIT
- FlicenseNot gradedqualityDmaintenanceIntelligent interview assistant that parses resumes, generates interview questions, records conversations, and produces evaluation reports for technical interviews.9-
- FlicenseNot gradedqualityDmaintenanceEnables automatic analysis and comparison of CVs against a job description, scoring candidates and generating professional reports.-
Glama MCP Gateway
Add one secure layer between your agents and this server.