JobMojito
Server Details
Run AI interviews, simulated personas and coaching sessions on JobMojito.
- Status
- Healthy
- Uptime
- 100.0% over 45 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- JobMojito/mcp
- GitHub Stars
- 1
- Server Listing
- JobMojito MCP Server
TDQS
Scored across 29 tools
Most tools target a clearly distinct resource+action (create/get/update/list per domain), and boundaries are actively clarified (e.g. list_my_merchants vs jobmojito_configuration, search vs get_documentation). The main potential confusion is among the three interview-creation tools (create_interview, create_interview_from_questions, create_persona), but their descriptions differentiate the use cases well enough.
Nearly all names follow a clean verb_noun snake_case pattern (create_interview, list_interviews, get_interview_result_details, update_catalogue_directory, upload_knowledge_base_document). The single clear outlier is jobmojito_configuration, which drops the verb and prefixes the product name, breaking the otherwise uniform convention.
At 29 tools the surface is on the heavy side, though the server legitimately spans several domains (interviews, results, coaching catalogue, merchant admin, candidates, docs, knowledge base). The breadth partially justifies the count, but it lands in the borderline/heavy range rather than a tightly scoped set.
Coverage is strong: interviews have create/read/update/state/list/register/url, results have list/details/report/retry analytics, and the catalogue has full create/get/list/update. Minor gaps remain (no explicit delete for interviews or catalogue directories, and the knowledge base exposes only upload with no list/get/delete), but core workflows are covered.
Available Tools
29 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (destructiveHint=true, idempotentHint=false, openWorldHint=true), so the bar is lower. The description adds genuinely useful behavior beyond them and beyond the schema: the id becomes an immutable URL segment that 'cannot be changed afterwards', and custom markdown 'replaces' the default grid rather than augmenting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description contains two near-identical paragraphs: the second ('Creates a directory (page) in the coaching portal catalogue. A directory nests other directories through tags_sub...') is a verbatim paraphrase of the first. Only the trailing 'id is the catalogue URL segment and cannot be changed afterwards' sentence is unique, so a large share of the text is duplicated rather than earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the 14-parameter schema is exhaustively documented. The description covers the concept of a directory, its nesting/listing behavior, the markdown page replacement, and the immutability of the id — enough for an agent to call it correctly, with only the not-named update sibling and parent-existence prerequisites left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 14 parameters, including enum explanations for status/visibility/coach_plan and detailed semantics for tags_sub, tags_interview_set_filter and content_md. The description restates a few of these roles (tags_sub, tags_interview_set_filter, content_md) but adds no syntax, format or edge-case detail the schema does not already carry, so baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb+resource ('Create a directory (page) in the coaching portal catalogue') and clarifies what a directory actually is — a node that nests sub-directories and lists sessions. It never names or contrasts itself with the obvious sibling update_catalogue_directory, so discrimination relies on the tool name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the text explains that directories can be top-level or nested via parent_tag and can be customised via content_md, which hints at when those options apply. But there is no explicit 'use this to...' vs 'use update_catalogue_directory to...' routing, no stated prerequisites (a parent directory must already exist), and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_interviewCreate interviewADestructiveInspect
[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 — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`. | |
| 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. | |
| environment | No | Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials.. | |
| 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. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.. | |
| interview_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.. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| 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 a non-idempotent, destructive, open-world write, so the safety profile is covered. The description adds real behavioral context beyond that: AI generation of description/questions/candidate expectations, provisioning of default steps, and optional embed-key provisioning. It stops short of disclosing credit implications or environment/webhook effects, which the schema carries instead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence is well front-loaded with scope and the template-id modality insight. But the second paragraph largely restates the first — 'Creates a new interview / coaching / assessment definition' duplicates the opening 'Create a new interview' and re-lists the AI-generated artifacts, so a meaningful share of the text is redundant rather than additive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 48-parameter, 100%-documented schema with an output schema present, the description need not enumerate returns or fields, and it correctly covers the core operation, generation behavior, and a cross-reference to list_avatars. The one notable gap is sibling routing against create_interview_from_questions and update_interview, which a creation tool this broad should address.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning the schema lacks: that interview_template_id determines the modality (voice-only vs realtime/pre-recorded avatar), a cross-field consequence not stated in the parameter's own description. It does not explain the 48-parameter surface broadly, but the key semantic link is captured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new interview') plus the non-obvious side effect that questions are auto-generated from position data, and notes it covers interview/coaching/assessment definitions. However, it never distinguishes itself from the close sibling create_interview_from_questions, leaving the agent to infer which creation path to take.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb: use this to originate a new interview from position data. There is no explicit when-not-to-use, no mention of create_interview_from_questions for question-driven interviews, and no prerequisites such as required permissions or the need to have a template/avatar already chosen beyond a passing 'see list_avatars' pointer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_interview_from_questionsCreate interview from questionsADestructiveInspect
[Interviews] Create a new interview from an explicit array of questions. The AI rephrases your wording by default; pass interview_tone="exact" to have each question asked verbatim, which is what you want when the wording is a script (compliance, translated, or legally reviewed text).
Creates a new interview definition set from a caller-provided array of questions, builds its default and generated steps, optionally activates it, and optionally creates an embed key.
| 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 | Job location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`. | |
| 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. | |
| environment | No | Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials.. | |
| 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. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.. | |
| interview_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.. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| 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 declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that: the AI rephrases supplied questions by default (a non-obvious behavioral trait), and it builds default and generated steps while optionally activating and optionally creating an embed key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening paragraph front-loads the key differentiator and the one actionable tip, and the second sentence is tight. The second paragraph partially restates the first ('creates a new interview definition set') but does add the step-building/activation/embed behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the 100%-covered schema carries the parameter detail. For this complexity the description supplies the one thing structured fields cannot: the default rephrasing behavior and how to override it, plus the side effects (steps, activation, embed key).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 46 parameters, including interview_tone='exact'. The description's mention of the exact-tone behavior largely echoes what the schema already states, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new interview') and pins the distinguishing input ('from an explicit array of questions'). This implicitly separates it from the sibling create_interview, but the sibling is never named, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one genuinely useful conditional — pass interview_tone='exact' when the wording is a script — but offers no guidance on when to choose this over create_interview, when not to use it, or what prerequisites (e.g. a valid interview_template_id) are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_personaCreate role-play 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. FIRST CHOOSE portal, because it selects between two different products: portal="interview" builds a SIMULATED PERSONA a recruiter invites candidates to — scored, billed to merchant credits, and listed with the recruiter's other results; portal="coaching" (THE DEFAULT) builds a coaching persona learners start themselves from the catalogue, billed to their own coaching credits and never visible to recruiters. Pass portal="interview" explicitly for any hiring, screening or assessment use. Then set persona_role_avatar/persona_role_user for the roles and opening_line for the avatar's first spoken line (defaults to a generic 'Hello').
FIRST DECIDE portal. This endpoint creates two different products and the default is NOT the recruiter one:
portal: "interview"— an INTERVIEW ROLE-PLAY. Use this whenever the goal is to ASSESS or SCREEN candidates: hiring, assessments, sales role-plays for job applicants, anything a recruiter runs. Candidates are invited through the normal invitation flow, results appear in the recruiter's result list, it is billed against merchant credits, and attempts are capped 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. | |
| environment | No | Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials.. | |
| 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| 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 only declare mutation/open-world/destructive; the description goes far beyond them, disclosing billing destination (merchant vs coaching credits), recruiter visibility, attempt caps, the session flow (welcome → opening line → role-play → closing), that no AI question generation runs, and which omitted fields fall back to generic platform defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and organized, but the portal guidance is stated twice in near-duplicate form — once in the bracketed intro paragraph and again under 'FIRST DECIDE portal' — and several defaults are repeated. The duplication is real waste, though the bulk of the length is load-bearing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 33-parameter creation tool with an output schema, the description supplies everything the agent needs: required-vs-optional intent, defaulting behavior, billing and visibility consequences, the session lifecycle, and how the template/avatar fields interact. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3, but the description adds genuine cross-parameter meaning: it splits the four persona_avatar_* prompts by purpose (who_is / knowledge / progress / end_conditions) and warns that omitting persona_avatar_progress causes the avatar to have no arc, plus clarifies opening_line is a literal spoken line rather than a description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Create a role-play persona: an avatar that plays a defined role in a free-form conversation instead of a scored Q&A interview') and explicitly contrasts the result with its closest siblings create_interview / create_interview_from_questions. An agent can tell what this creates and how it differs from the scored-interview tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It opens with an explicit decision instruction ('FIRST CHOOSE portal') and gives when-to-use conditions for each branch: 'interview' for hiring/screening/assessment, 'coaching' for practice/training, plus the critical warning that the default is NOT the recruiter product. Alternatives and exclusions are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_interview_reportGenerate interview 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 |
|---|---|---|---|
| template | No | ||
| store_file | No | When true (pdf only), persist the file to storage and return a signed URL. | |
| export_type | Yes | ||
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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 }`. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, but the description never explains why a report tool is destructive (e.g., overwriting a stored export) or what idempotency means here. It does add real context beyond annotations: PDF returns a signed URL, and the report is a human decision-support artifact, not an automated decision.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the scope and the human-reviewer caveat, and the second paragraph is compact. However, it restates 'Generate an interview result report' and the format list (HTML/PDF/JSON) that the first sentence already gave, so one sentence is partially redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the core selection logic is covered. But for a 7-parameter tool with a nested 10-property `export_features_result` object controlling transcripts, analytics, recordings and language, the description never mentions that customization surface or the 0.1-credit translation cost, leaving an agent to discover it only via the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 43%, so the schema carries most parameter detail (store_file, template precedence, mojito_language_code credit cost). The description usefully clarifies the `interview_result_id` vs `interview_result_ids` choice, but adds nothing about `export_features_result`, the largest and most consequential parameter group.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate an interview result report') plus the output formats (HTML/PDF/JSON) and the single-vs-multi-result scope, which distinguishes it from list_interview_results and get_interview_result_details. The '[Results]' tag and decision-support caveat further sharpen what it produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says to provide either `interview_result_id` for one result or `interview_result_ids` for a combined report, and scopes the tool to a 'completed interview', but never names an alternative tool or states when to prefer get_interview_result_details or list_interview_results. Usage is implied rather than contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_interview_urlGenerate shareable interview 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and non-idempotency, so the safety profile is covered structurally. The description adds useful context that the output is a public, token-signed link (i.e. the URL itself grants access without auth), but it does not explain why the operation is flagged destructive, whether tokens expire or are revocable, or whether repeat calls mint new tokens.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core action (signed public URL/token) front-loaded ahead of the conditional-id caveat. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the cross-parameter conditionality is stated. The remaining gap is token lifecycle behavior, which matters for a security-sensitive share link but is not strictly required to make the call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each id parameter already documents which `type` values require it, so the schema carries the load. The description's only addition is the general conditional rule, which is a useful summary but not new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (generate) plus resource (a signed public interview URL/token) scoped to an existing interview, profile, or result. It is easy to separate from siblings like create_interview or get_interview_definition, which produce different artifacts. It stops just short of 5 because it does not explicitly state how it differs from any named sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage condition with 'The required id fields depend on `type`', routing the caller to the enum, but it never states when to use this tool versus alternatives or what preconditions must hold (e.g. the interview must already exist). Usage is inferable rather than explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_catalogue_directoryGet coaching catalogue 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| 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?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the read-only safety profile is covered. The description usefully adds the wholesale-replacement warning that motivates the read, but beyond that it does not disclose return format or pagination behaviour (the latter being a gap, though an output schema exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two paragraphs restate essentially the same content — the second duplicates the first's enumeration of settings, content_md and sub-directories and the wholesale-replacement warning. The only sentence unique to the first paragraph ('how you verify that a session's tags place it in this directory') is buried inside the duplication, so structure and economy are poor.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with a complete output schema, full schema description coverage and strong annotations, the description supplies the needed purpose and read-before-update context. The only shortfall is that the guidance on sibling selection is not spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (id, merchant_id, conversation_id) are already documented in the schema. The description adds no parameter-level meaning of its own, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one catalogue directory in full') and enumerates the returned pieces (settings, content_md, sub-directories, matched sessions). It is clear enough to distinguish from most siblings, though it never explicitly names list_catalogue_directories as the alternative, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use condition: read before updating because content_md, tags_sub and tags_interview_set_filter are replaced wholesale, so the current value is needed to extend rather than overwrite. That is actionable guidance, but it offers no when-not clause and does not contrast against the list sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentationRead a JobMojito documentation 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). | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive behavior, so the description's job is to add beyond that. It does: the two-domain allowlist (developer.jobmojito.com, help.jobmojito.com) and the automatic .md-variant fetch for developer docs are behavioral facts an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the source constraint, then the domain restriction. No filler and no repetition of schema or annotation content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is correctly omitted. The provenance rule, domain allowlist, and format behavior cover what an agent needs to call this successfully; only an explicit 'what if the URL is rejected / not from search_documentation' failure note is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the bar for extra credit is real. The description adds provenance semantics for url (must be a URL returned by search_documentation) and explains why raw vs. rendered content may differ (.md auto-fetch), neither of which is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (a single documentation page) and immediately distinguishes itself from the sibling search_documentation by scoping to one page. An agent can tell exactly which of the 28 siblings this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the prerequisite path explicitly: the URL must come from search_documentation, which tells the agent the correct call order. It also constrains where URLs may point, but does not state an explicit 'do not use this for X' exclusion or what to do when no URL is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interview_definitionGet interview 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
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. |
| environment | Yes | Which webhook environment this interview's results are delivered to. Null for multi-stage positions, whose stages each carry their own. |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| 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). |
| country_availability | No | Portal availability by the candidate's country: {countries_allowed?: string[], countries_allowed_eu?: boolean, countries_blocked?: string[], countries_blocked_eu?: boolean} (ISO 3166-1 alpha-2, EU = EU + EEA + Switzerland; blocked wins), judged by the candidate's IP on the portal; invited candidates keep access. Null = not used, every country. Set it with job-interview-update. |
| 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_spatius`, `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. |
| candidate_notification_channel | Yes | SMS / WhatsApp candidate notifications: null = off, reminders = with both e-mail reminders, last_reminder = only with the final reminder, all = invitation + reminders + pre-screening accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond annotations: access is subject to row-level security, the returned `calc_definition_json` and `questions` array are disclosed, and it warns to preserve unchanged question `id`s.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description restates the same round-trip point twice: the first sentence says questions come back in the format create_interview_from_questions accepts, and the second paragraph repeats that they are in the format accepted so they round-trip into update_interview. Redundancy costs it, though the round-trip concept is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be enumerated, yet the description helpfully sketches the response shape (calc_definition_json, ordered questions, basic metadata) and adds the row-level-security caveat. It is nearly complete for a read tool, with only minor redundancy and no explicit selection guidance between sibling reads.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (position_id and conversation_id) are already documented in the schema itself. The description echoes that position_id can be an interview-definition id or a position id but adds no syntactic or format detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (interview definition/configuration) and clarifies it includes the ordered `questions` array. It implicitly distinguishes itself from siblings like get_interview_result_details and list_interviews by naming the definition/configuration concept and the round-trip consumers create_interview_from_questions and update_interview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the intended workflow: read the definition here, modify the array, send it to update_interview, and names the format-compatible siblings create_interview_from_questions and update_interview. It gives clear context but no explicit when-not-to-use or conditions for choosing between related read tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interview_result_detailsGet interview result detailsARead-onlyIdempotentInspect
[Results] Get full interview result details including transcript and scores. Scores are assistive output for a human reviewer. One result is a large record, so view controls how much of it comes back — the default (standard) omits only the raw machine assessment data.
Returns an interview result with its full transcript and AI assessment. Optionally attaches signed recording URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | How much of the record to return. Handled by the MCP server, not the JobMojito API — it only narrows the response, never the query. - `summary`: scores, the overall AI analysis, and each question with the candidate's answer — no per-answer AI commentary, recording paths or raw assessment data. Use this to review or compare candidates. - `standard`: everything a human reviewer reads: the full transcript with per-answer analysis, scores and recordings, minus the raw machine assessment blobs. This is the default. - `full`: the API response verbatim, including the raw per-answer pronunciation/sentiment data. Large — a long interview can exceed the result limit and fail. Only ask for this if you need those raw fields. | standard |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| ai_analysis_other | No | Session-level AI analyses keyed by analysis name (jsonb). `strengths_concerns`: { strengths: string[], concerns: string[] } (0-4 items each, recruiter-facing; called `hiring_reasons` with `reasons_to_hire` / `reasons_not_to_hire` inside before 2026-09-15, and rows written before then may still carry that shape). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added. |
| 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). Deprecated: a copy of ai_analysis_other.strengths_concerns.strengths, kept for existing integrations. |
| 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). Deprecated: a copy of ai_analysis_other.strengths_concerns.concerns, kept for existing integrations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the bar is lower; the description adds meaningful context beyond them — that a result is a large record, that `view` is server-side narrowing and never affects the query, that `full` can exceed the result limit and fail, and the caveat that scores are assistive output for a human reviewer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the `view` behavior, then the return summary. Slightly redundant — the default-omission point and the transcript/recording summary repeat what the schema and opening sentence already establish — but no sentence is wasted overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description supplies what is still needed: the size caveat for `full`, the meaning of the default view, and the optional signed URLs. Only the absence of explicit sibling routing keeps it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including the detailed `view` enum semantics and `get_signed_recordings`. The description largely restates that ('view controls how much of it comes back', 'Optionally attaches signed recording URLs') rather than adding new parameter meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full interview result details including transcript and scores') and adds scope ('full ... including transcript'). It implicitly contrasts with the sibling list_interview_results by emphasizing 'full ... details' of one record, but never names that sibling, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context: `summary` is for reviewing or comparing candidates, `full` should only be requested when the raw fields are needed, and the default is described. It never explicitly says when to use this tool instead of list_interview_results or get_interview_definition, but the within-tool guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merchant_analyticsGet merchant 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
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 | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description adds real behavioral value beyond that: a 1000-record page cap and, importantly, the zero-suppression rule that absent day/event pairs must be treated as count 0. It doesn't cover auth requirements or rate limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, followed by scope, drill-down, cap, and the sparse-result caveat in a logical order. It is a little dense, and the '[Results]' prefix is unexplained, but every sentence carries weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description still covers scope, pagination cap, drill-down, and the zero-suppression caveat. The conversation_id lifecycle is fully specified in the schema parameter, so the definition is essentially complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters and the baseline is 3. The description reinforces scoping (merchant_id override) and drill-down behavior, but its phrase 'drilled to a single interview' omits the position_def_set case that the schema documents, adding marginal rather than corrective value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieve a merchant's daily event-count time-series over a date range, explicitly tied to the admin-portal analytics events graph. This is clearly distinguishable from siblings like get_merchant_credit_usage and get_merchant_status, which concern billing and account state, not event analytics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: scoped to the token's merchant by default, with merchant_id override restricted to admins/sub-merchant operators, and optional drill-down to an interview/position. It stops short of naming alternative tools or stating when-not to use it, so no explicit alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merchant_credit_usageGet merchant credit 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). | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
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 | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered; the description adds genuinely useful behavior beyond that — result ordering (most recent first), the 1000-record page cap, the admin-only override semantics, and where the consumed credit figure lives (stats.credit_amount). It stops short of describing auth failure modes or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A short bracketed marker, a one-line statement of purpose, then two dense sentences covering scope, ordering, field location and the page cap. Front-loaded and nearly waste-free, though the parenthetical event list ('interview, pre-screening, public avatar, simulation, …') is slightly loose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter coverage, the description only needs to add the things structured fields don't carry — ordering, the 1000-record cap, scoping rules, and where the credit amount is found — and it does all of that. Nothing an agent needs to invoke this read tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, offset, merchant_id, interview_id and conversation_id, including the interview-vs-position detection logic. The description largely restates the merchant scoping rule rather than adding new parameter meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get the merchant's credit usage') and immediately sharpens it into a per-event credit-usage ledger listing every billable analytics event that consumed credits, ordered most recent first. That level of detail lets an agent distinguish it from sibling reporting tools like get_merchant_analytics or get_merchant_status without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives scoping context ('scoped to your token's merchant, or a merchant_id override for admins / sub-merchant operators') and a pagination cap, which implies when the tool applies, but it never names an alternative or states when NOT to use it versus the other merchant/interview reporting tools. Usage is implied rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merchant_statusGet merchant 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| 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 already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description adds genuine behavioral context beyond that: it is scoped to the token's merchant unless an admin override is used, and it echoes back the caller's profile_id, default_merchant_id, and effective merchant_id. It does not, however, discuss rate limits or freshness of the 14-day history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is redundant: the opening sentence and the following paragraph both enumerate the same snapshot contents (credit balances, subscription, pending-work counts, candidate/result totals, invitation headroom). The second paragraph restates the first with minor added detail rather than front-loading new information, wasting space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description needn't explain return values. It adequately conveys scope, admin override behavior, and echoed identifiers, leaving only minor gaps around when to prefer it over sibling reporting tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (including the detailed conversation_id continuity instructions) are fully documented in the schema. The description's mention of merchant_id scoping largely restates the schema and adds no syntax or format detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get a merchant status snapshot') and enumerates what the snapshot contains (credit balances, subscription, pending-work counts, candidate/result totals, invitation headroom). It is clearly distinguishable from a generic read, though it never explicitly contrasts itself with the closest siblings get_merchant_analytics or get_merchant_credit_usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives scoping rules ('Scoped to your token's merchant (or a merchant_id override for admins / sub-merchant operators)') and flags itself as [Admin], which is useful context. However, it offers no explicit when-to-use or when-not-to-use guidance versus the many sibling merchant/reporting tools, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobmojito_configurationChoose a JobMojito 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 |
|---|---|---|---|
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds substantial behavior beyond that: it renders a UI, it requires the agent to STOP and await user selection before proceeding, and it defines a persistent merchant_id propagation rule for all subsequent JobMojito calls. That is exactly the kind of interaction-model context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical directive (render the picker, don't list text) is front-loaded, and every sentence is actionable rather than filler. It is slightly repetitive in restating the trigger as both an ALWAYS and a DO-NOT clause, but the redundancy is purposeful emphasis rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter UI-rendering tool with no output schema, the description covers everything needed: when to invoke, what is displayed, that control returns to the user, and how to use the resulting merchant_id afterward. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter, conversation_id, and the schema already documents it at 100% coverage including the lifecycle rules (pass unchanged, don't invent, don't reset). The description adds no additional meaning about this parameter, so the baseline of 3 applies. The merchant_id mentioned is not a parameter of this tool but downstream guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — it renders an interactive JobMojito merchant picker UI — and implicitly distinguishes itself from text-listing siblings such as list_my_merchants by forbidding that approach. An agent can tell what this tool does and how it differs from list-oriented siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger conditions ('ALWAYS call this when the user wants to choose, switch, or set a merchant, or when a tool needs a merchant_id and none is selected') and explicit exclusions ('Do NOT list merchants as text or ask the user to type a name — render this picker instead'). The post-call routing ('pass merchant_id=<chosen id> on every JobMojito call, omit it for the user's own account') closes the loop on what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_avatarsList avatars and voice templatesARead-onlyIdempotentInspect
[Admin] List available avatar/voice templates. Each item's type decides the interview modality: interactive_elevenlabs = voice-only (no video avatar); interactive_spatius = realtime interactive 3D avatar (rendered in the candidate's browser, 1.25 credits, no early stop); interactive_heygen = premium realtime interactive video avatar; offline_heygen = pre-recorded, non-interactive avatar. An item's id is the interview_template_id you pass to the create-interview tools, so pick the template whose type matches the experience you want. Note: offline_elai and offline_synthesia are legacy integrations that may still appear here but cannot be used to create new interviews. Rows are large, so this returns 15 at a time; page with offset while pagination.has_more is true, or narrow with type/filter_text.
Paginated list of a merchant's avatar templates (the admin-portal avatars list), scoped to your token's merchant (or a merchant_id override). Capped at 1000 records per page.
| 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 |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| include_archived | No | Include archived templates (excluded by default). | false |
| mojito_language_code | No | Filter by platform language code. Omit for all languages. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The merchant's avatar templates for this page, newest-updated first. |
| pagination | Yes | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description is free to add the traits that matter here: large rows returned 15 at a time, paging via `offset` while `pagination.has_more`, a 1000-record page cap, and legacy integrations that render but are unusable for new interviews. These are concrete operational caveats beyond the annotation surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the type taxonomy are front-loaded, and the second paragraph handles scoping and page caps. Pagination is mentioned twice (first and second paragraph), which is a small redundancy, but nearly every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is not needed, and the description still covers scoping (token merchant vs. `merchant_id` override), paging, status/archive filtering, and legacy-type caveats. An agent has everything required to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to the `type` enum (each value's modality, credit cost, and whether it can early-stop) and to paging behavior (`offset` with `pagination.has_more`, `type`/`filter_text` narrowing). That exceeds what the bare enum listing conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('List available avatar/voice templates') and immediately explains what each returned `type` means in terms of interview modality, credits, and interactivity. It also distinguishes this from the create-interview tools by stating that an item's `id` is the `interview_template_id` those tools consume.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly routes usage: 'pick the template whose type matches the experience you want' and warns that `offline_elai`/`offline_synthesia` are legacy and cannot create new interviews. It also explains how to page and narrow. It stops just short of explicitly stating when to call this vs. get_interview_definition or list_languages, so it is clear context without explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_candidatesList 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 | Search on candidate name, email, external id, phone and CV skills. Every word must match (case and accents ignored; longer words tolerate typos). Without order_by, the best matches come first. | |
| 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The merchant's candidates for this page. |
| pagination | Yes | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds that results are paginated and capped at 1000 records per page, which is modest extra context, but says nothing about total counts, auth failures, or ordering interactions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core operation and followed by scope then pagination constraints. The '[Candidates]' tag is minor noise but nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description need not explain return values. It correctly covers scope and pagination cap; the only gap is that it does not position the tool against the many list_* siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters (including enums, defaults and the conversation_id contract) are already documented in the schema. The description only reinforces the merchant_id override, adding no syntax or format detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the merchant's candidates') and disambiguates the term by defining it as the admin-portal candidates list. It is clearly distinguishable from list_interviews / list_interview_results by resource, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description explains the merchant scoping (token's merchant, or a merchant_id override) which tells the caller when the tool applies, but it never states when to prefer this over list_interviews or list_interview_results, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_catalogue_directoriesList coaching catalogue 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. Returns 25 at a time; page with offset while pagination.has_more is true.
Paginated list of the coaching-catalogue directories visible to you: your merchant's own, plus the platform-wide public ones unless you set include_public=false. Use it to find a directory id before updating one, to pick a parent_tag, or to walk the tree with parent_tag. The custom Markdown page is not included — fetch it per directory with catalogue-tag-get.
| 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 |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| mojito_language_code | No | Filter by the directory language. Omit for all languages. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The catalogue directories for this page, ordered by id. |
| pagination | Yes | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description still adds real behavioral value with pagination semantics (25 per page, page with offset while pagination.has_more is true) and the include_public=false scoping behavior, though it doesn't fully explain cursor/result-shape behavior beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description contains two near-identical paragraphs that restate the same points twice — list your own plus public directories, use it to find an id/parent_tag, the Markdown page is excluded. This duplication wastes space, and the second paragraph even cites a non-sibling name (catalogue-tag-get), reducing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations, the description needn't explain return values, and it covers the main use cases and the key scoping caveat. It is slightly incomplete on filtering interaction nuances but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all ten parameters in detail (conversation_id, filter_text, visibility, etc.). The description adds only marginal meaning on a few params (parent_tag nesting, include_public=false), which lands at the baseline for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (coaching-catalogue directories) plus the exact scope: the merchant's own directories plus platform-wide public ones. It explicitly distinguishes itself from get_catalogue_directory, which serves the Markdown page this tool excludes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use triggers: find a directory id before updating, pick a parent_tag for a new directory, or walk the tree with parent_tag. It also names the alternative (get_catalogue_directory) and the condition that selects it (reading the Markdown page).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_interview_resultsList interview resultsARead-onlyIdempotentInspect
[Results] List the merchant's interview results. Rows carry the candidate's scores and recruiter risk flags, so this returns 20 at a time; page with offset while pagination.has_more is true, or narrow with tab/interview_id/filter_text.
Paginated list of a merchant's interview results (the admin-portal results list), scoped to your token's merchant (or a merchant_id override). Capped at 1000 records per page.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Filter by decision/completion state. Omit (or empty) to include all. | |
| step | No | Filter by pipeline step type (pre-screening, interview or meeting). Omit for all. | |
| 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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 | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description earns credit for adding non-obvious behavior: default 20 rows per call, a 1000-record per-page cap, and that results are scoped to the token's merchant unless merchant_id is overridden. It also notes rows carry candidate scores and recruiter risk flags, which helps an agent anticipate payload shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly 85 words is well-sized for a 13-parameter paginated tool, and the paging instruction is front-loaded immediately after the purpose. There is mild redundancy between the opening 'List the merchant's interview results' and the second paragraph's 'Paginated list of a merchant's interview results', but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the things structured fields can't: the paging loop, the per-page cap, and merchant scoping. What's left unstated is minor (e.g. it doesn't flag that `conversation_id` must be echoed back), and that detail is already carried in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 13 parameters (including enums, defaults, and the merchant_id admin restriction), setting the baseline at 3. The description adds only light semantic value by tying paging params together via `offset`/`has_more` and restating the 20-default/1000-cap behavior already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List the merchant's interview results', 'Paginated list of a merchant's interview results') and identifies it as the admin-portal results list, which distinguishes it somewhat from list_interviews/get_interview_result_details. It never names the detail-fetching sibling as the alternative, so the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: page with `offset` while `pagination.has_more` is true, or narrow with `tab`/`interview_id`/`filter_text`. That tells an agent how and when to drive the tool, but no exclusions or named alternatives (e.g. get_interview_result_details for a single record) are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_interviewsList 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The merchant's interview definitions for this page, newest-updated first. |
| pagination | Yes | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely useful operational context on top: the 1000-record per-page cap, the merchant-token scoping default, and the admin-only restriction on merchant_id. It stops short of describing what a page contains or how to page through beyond limit/offset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the resource label, then scope and cap. 'Paginated list' mildly restates the title, but the second sentence carries real information without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, all ten parameters are documented in-schema, and annotations carry the safety profile. The description supplies the remaining missing pieces an agent needs: scope resolution and the page-size ceiling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all ten parameters including enums, defaults, ranges and examples; baseline 3 applies. The description only reinforces scoping (merchant_id override, 1000 cap) and adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the merchant's interview definitions') and clarifies it is the admin-portal interview definition list, which implicitly separates it from list_interview_results. It never explicitly names a sibling, so differentiation is left to the reader's inference between 'definitions' and 'results'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives scoping guidance — the list is bound to the token's merchant unless an admin/sub-merchant operator passes merchant_id — and states the 1000-record page cap. However, it never says when to use this tool instead of get_interview_definition or list_interview_results, and there are no exclusions or prerequisites beyond the scope note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_languagesList supported languagesBRead-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 |
|---|---|---|---|
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| languages | Yes | Supported platform languages, sorted by English name. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the '[Admin]' qualifier and the returned field list, but discloses nothing about permissions, rate limits, or freshness beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence and the follow-up sentence overlap heavily, repeating English/local names and the SVG flag URL, and the second sentence drops the 'per-interface enablement flags' and 'Azure speech accents' items without explanation. Front-loading is fine but the redundancy costs it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only discovery tool with full annotations and an output schema, the definition is essentially complete. The only gap is the missing routing guidance, and the restated return-value prose is redundant against the output schema but not harmful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter (conversation_id) has 100% schema description coverage with detailed protocol instructions, so the schema carries the load. The description mentions 'code' only as a returned field, adding no input-parameter meaning; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List supported platform (mojito) languages') and enumerates the returned fields, so an agent knows exactly what it yields. It is clear but does not need sibling differentiation, since no other tool in the list serves this purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the sentence 'Use the `code` as `mojito_language_code` when creating interviews or personas' tells the agent how to consume the output, not when to call this tool versus alternatives. There is no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_merchantsList merchants you can act 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), yet the description adds genuinely new behavioral context: the fallback trigger condition, the downstream protocol (pick a merchant then pass merchant_id=<chosen id> on later calls, omitting it for the own account), and the anti-pattern to avoid. That multi-step flow context is not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the decisive constraint ('FALLBACK merchant list for clients WITHOUT UI support') before any procedural detail, and every subsequent sentence carries an instruction. It is slightly dense with parentheticals and backticked names, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the remaining burden — fallback condition, alternative tool, follow-up call protocol — is fully covered. Nothing an agent needs in order to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, which sets a baseline of 3. The description goes beyond that by explaining how the returned selection should be threaded into subsequent calls via merchant_id, including the omit-for-own-account case — semantics the schema for this tool cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('merchant list') and immediately qualifies its scope as a FALLBACK path for clients without UI support, which separates it from jobmojito_configuration and list_sub_merchants. An agent knows both what it returns (own account plus sub-merchants) and what it is not for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the preferred alternative (jobmojito_configuration), the condition that selects this tool (client cannot render MCP App UI), and two prohibitions: do not use it to choose/switch merchants when a UI exists, and do not hand-format a merchant list as text. This is textbook when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sub_merchantsList sub-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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The sub-merchants the caller administers for this page. |
| pagination | Yes | |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false, idempotentHint=true), so the safety profile is covered. The description still adds useful non-annotation context: visibility is row-level-security enforced and results are capped at 1000 per page, which tells the agent to paginate rather than expect a full dump.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the admin scope front-loaded and no filler. The parenthetical restating 'the admin-portal sub-merchants list' is mildly redundant with the opening sentence but does not bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no prose, and 100% schema coverage handles parameters. The description supplies the remaining behavioral essentials (admin-only, RLS visibility, page cap) for a read-only paginated list, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter including limit, offset, order_by, filter_text, merchant_id, and conversation_id is already documented in the schema. The description adds no parameter-level meaning beyond that, which is the correct baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List sub-merchants') and scopes it with the '[Admin]' prefix plus 'the sub-merchants the caller administers'. It is clear what the tool returns, but it never names the obvious sibling list_my_merchants, so the agent must infer the boundary between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '[Admin]' marker and 'admin-portal sub-merchants list' phrasing imply when this tool applies, and the merchant_id schema note explains scoping. However, there is no explicit statement of when to prefer this over list_my_merchants or any other list tool, and no prerequisites are called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_users_for_interviewRegister candidates for 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | The input users, each annotated with its registration result and (on success) interview URL. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the bar is lower. The description adds useful context beyond that: it is an upsert ('Registers (or updates)'), returns one-time URLs, and discloses the two auth modes, but it does not say who is notified, whether existing profiles are overwritten, or the consequences of the destructive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and outcome. Mild redundancy in the second sentence (the one-time URL was already implied by 'return their personal interview links'), but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich schema, an output schema, and safety annotations, the description needs only to frame the operation and auth modes — both of which it does. It is complete enough for an agent to call correctly, though it stops short of routing the agent away from overlapping siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter thoroughly (phone semantics, merchant_id auth conditions, conversation_id protocol). The description only restates the merchant_id/service-key rule, adding essentially nothing beyond the structured fields — the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register users/candidates for a specific interview') plus the return value (personal interview links), so the core action is unambiguous. It does not, however, distinguish itself from the sibling 'generate_interview_url', which plausibly overlaps in the 'get a link' space.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives authentication context (Supabase user JWT vs service key, with merchant_id required for the latter), which hints at when the tool is callable, but offers no explicit when-to-use/when-not guidance relative to siblings like generate_interview_url or request_another_interview_attempt. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_another_interview_attemptRe-open interview for another 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 |
|---|---|---|---|
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| interview_result_id | Yes | The interview result to reopen for another attempt. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds genuinely useful detail beyond that: it marks the result unsuccessful, resets it to draft, and clears the recruiter decision — a concrete account of what state is destroyed and changed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, with the action front-loaded and the state-change consequences following. The '[Results]' tag adds categorization value; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the destructive profile. The description covers the mutation's effects well; only permission/auth prerequisites are unstated, a minor gap for a simple two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; interview_result_id is documented in the schema and conversation_id carries an extensive description there. The description adds no parameter syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Re-open a submitted interview result') and frames the outcome ('so the candidate can retry'). The 'interview result' scoping cleanly separates it from sibling interview-level tools like create_interview, set_interview_state, and get_interview_result_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'so the candidate can retry' implies the use case, and 'submitted (active + completed)' narrows the applicable state. But no alternative is named (e.g., vs set_interview_state) and no explicit when-not condition is given, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentationSearch JobMojito 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 |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description still adds real behavioral context beyond them: the search fans out over both sources in parallel and returns a merged, source-labeled result rather than requiring separate calls. It does not discuss pagination or result ranking, keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core claim ('Search ALL JobMojito documentation. This is the single entry point.') before any detail, and the bullet list is dense and informative rather than padding. It runs slightly long for a search tool, costing it the top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-format details are not needed. The description still covers purpose, source semantics, when to invoke versus the read-full-page sibling, and the parallel-search behavior — nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by explaining what the 'developer' and 'help' source values actually cover (API reference/schemas/webhooks vs. recruiter/candidate/admin product guides), which gives semantic meaning the bare enum-less source parameter lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (ALL JobMojito documentation) and explicitly positions itself as 'the single entry point' that searches both sources in parallel. It names get_documentation as the separate follow-up tool, so an agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('whenever you need to understand how a feature, endpoint, field, or workflow works — including before calling an action tool you're unsure about') and names the alternative path (call get_documentation(url) to read the full page). It also removes a decision point by stating the agent need not choose a source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_interview_stateChange interview 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
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 }`. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose destructiveHint, idempotentHint, openWorldHint and non-readonly, so the safety profile is covered. The description adds independent value by disclosing the embed-key side effect (creating vs removing embed keys) and the cross-parameter requirement. Minor confusion: the intro examples 'open, closed' do not appear in the actual enum.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the scope and followed by the values and the at-least-one requirement. No filler, though the duplicated 'e.g. open, closed' example is slightly redundant and inconsistent with the enum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the mutation semantics. The description supplies the lifecycle values, the embed-key side effect and the input constraint, leaving only sibling differentiation as a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents each field. The description adds the cross-parameter constraint that at least one of `status`/`is_embedded` must be supplied and frames the two as an either/or, which is meaning not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (change the lifecycle status of an interview/position) and enumerates the status values plus the embed-key side operation. It is clear what the tool does, but it never distinguishes itself from the sibling update_interview, leaving the agent to guess which one to pick for a status change.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one real usage constraint: 'Provide at least one of `status` or `is_embedded`.' That is useful, but there is no guidance on when to prefer this tool over update_interview or generate_interview_url, and no mention of prerequisites or when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_catalogue_directoryUpdate coaching catalogue 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. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so safety is covered. The description adds real behavioral value beyond that: partial-update semantics ('only the fields present in the request body are written') and the null-clears-a-field rule ('sending null removes the custom page'). It does not expand on the destructive profile (e.g. that replacing tags_sub drops the whole previous list is only in the schema), which keeps it at a solid 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the tool name and operations, but the two paragraphs are largely redundant: 'Only the fields you send are changed' and 'Only the fields present in the request body are written' say the same thing, and the four supported operations are listed twice. The duplication costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the annotations carry the safety profile. The description covers the partial-update contract and the main editable fields, leaving only minor gaps (destructive scope of list replacements is schema-only), so it is nearly complete for a 12-param mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters thoroughly, including enums and examples. The description restates a few field meanings (tags_interview_set_filter, tags_sub, content_md) but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (coaching catalogue directory) and enumerates the concrete operations: rename, re-point session listings, re-order sub-directories, author the Markdown page. Purpose is unambiguous, though it never names its create/get siblings, so differentiation is left to the tool name rather than the prose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to reach for it by listing the field-level operations it supports, but offers no explicit when-to-use/when-not guidance and never names an alternative (e.g. create_catalogue_directory for a new id). Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_interviewUpdate interview or 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. MULTI-STAGE POSITIONS: some per-interview settings do not exist at position level and are rejected with a 422 naming the field — candidate_expectations_json is the one seen in practice. Read the position with get_interview_definition, then update the individual stage you mean instead of sending that field to the position.
Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.
| 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. | |
| environment | No | Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials.. | |
| 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. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.. | |
| interview_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.. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| 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. | |
| country_availability | No | Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows "not available in your region". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. Null = not used, every country. | |
| 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. | |
| candidate_notification_channel | No | SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: "reminders" = with both e-mail reminders (day 1 and day 3); "last_reminder" = only with the final day-3 reminder; "all" = invitation, both reminders and the pre-screening-accepted step. null switches them off. WhatsApp is tried first, SMS when the number is not on WhatsApp. Available on paid plans (Starter and above) and needs a phone number on the candidate. | |
| 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. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, so the safety profile is known, and the description goes well beyond them: partial-update semantics (only sent fields written, null clears nullable), the diff mechanics (match on external_id then id then content; edited questions unlink-and-recreate; nothing is ever deleted because questions are shared records), the active-interview restriction on question edits, and the immutable `mojito_language_code`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and scannable, but the description is essentially written twice: the second paragraph restates the first's points about questions handling, the welcome/thank-you steps, and the multi-stage 422. A large fraction of the text is redundant with itself, which dilutes rather than adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 44-parameter mutation tool with an output schema available, the description covers what the structured fields cannot: partial-write semantics, question-diff behavior and its response field (`questions_diff`), status-dependent editability, and immutable fields. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real operational meaning on top of the schema — the read-edit-resend workflow for `questions`, the fact that re-sending an unchanged array is a no-op, and the `tags`-as-catalogue-mapping key. These are workflow semantics rather than mere parameter restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update the configuration of an existing interview/position') and immediately scopes it: single-stage interview vs multi-stage position, with the exact field families affected (name, description, avatar template, recording, scoring, tags). An agent can distinguish it from create_interview and set_interview_state without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when/when-not guidance: omit `questions` to leave questions alone, read the interview first and send the whole array back, use `tags` for coaching-catalogue placement, and for multi-stage positions update the individual stage rather than sending interview-only fields. It even names the failing field (`candidate_expectations_json`) and the 422 outcome.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_knowledge_base_documentUpload knowledge base 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). | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| knowledge_base_store_id | Yes | The knowledge base store to add the document to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _mcp_instructions | No | Server-issued metadata for this conversation. |
| 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 already declare the mutation/destructive/non-idempotent profile, so the bar is lower. The description still adds real behavioral value beyond them: it discloses that processing is asynchronous ('queues it for processing') and that the file may arrive as multipart binary or JSON base64. It does not address permissions or duplicate-upload consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the bracketed domain tag and the core action, then the processing/format details. No filler and nothing redundant with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the safety profile. The description supplies the async-processing and encoding context an agent needs; only permission/auth requirements and behavior on re-upload of the same document are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description genuinely extends the 'file' parameter by explaining the two accepted encodings (multipart binary vs. application/json base64), which the schema's 'format: binary' alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Upload and process a knowledge base document') and reinforces it with 'Uploads a document to a knowledge base store and queues it for processing.' No sibling tool performs document upload, so the scope is unambiguous even without explicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description (adding a document to a KB store) and the dual content-type note hints at two invocation paths, but there is no explicit when-to-use/when-not guidance or named alternative. Since no sibling competes for this job, the omission is tolerable but still a gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
get_interview_definition1 field changed- added
Output schema / properties / country_availabilityAdded value: +{ + "description": "Portal availability by the candidate's country: {countries_allowed?: string[], countries_allowed_eu?: boolean, countries_blocked?: string[], countries_blocked_eu?: boolean} (ISO 3166-1 alpha-2, EU = EU + EEA + Switzerland; blocked wins), judged by the candidate's IP on the portal; invited candidates keep access. Null = not used, every country. Set it with job-interview-update." +}
- Changed
update_interview1 field changed- added
Input schema / properties / country_availabilityAdded value: +{ + "description": "Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. Null = not used, every country.", + "properties": { + "countries_allowed": { + "description": "Available ONLY to candidates in these countries (ISO 3166-1 alpha-2).", + "example": [ + "PH", + "IN" + ], + "items": { + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "countries_allowed_eu": { + "description": "Adds every EU country (plus EEA and Switzerland) to countries_allowed.", + "type": [ + "boolean", + "null" + ] + }, + "countries_blocked": { + "description": "NOT available to candidates in these countries (ISO 3166-1 alpha-2). Wins over the allowed side.", + "example": [ + "US" + ], + "items": { + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "countries_blocked_eu": { + "description": "Adds every EU country (plus EEA and Switzerland) to countries_blocked.", + "type": [ + "boolean", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] +}
1 tool update
- Changed
list_candidates2 fields changed- changed
Input schema / properties / filter_text / descriptionPrevious value: -"Case-insensitive search on candidate name or email."New value: +"Search on candidate name, email, external id, phone and CV skills. Every word must match (case and accents ignored; longer words tolerate typos). Without order_by, the best matches come first." - added
Output schema / properties / data / items / properties / skillsAdded value: +{ + "description": "Skills read from the candidate's latest CV; null until extracted.", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] +}
29 tool updates
- Changed
create_catalogue_directory1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
create_interview1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
create_interview_from_questions1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
create_persona1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
generate_interview_report1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
generate_interview_url1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
get_catalogue_directory1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
get_documentation1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
get_interview_definition1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
get_interview_result_details1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
get_merchant_analytics1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
get_merchant_credit_usage1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
get_merchant_status1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
jobmojito_configuration1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
list_avatars1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
list_candidates1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
list_catalogue_directories1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
list_interview_results7 fields changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request." - changed
Input schema / properties / step / descriptionPrevious value: -"Filter by pipeline step (pre-screening vs interview). Omit for both."New value: +"Filter by pipeline step type (pre-screening, interview or meeting). Omit for all." - changed
Input schema / properties / step / enumPrevious value: -[ - "pre-screening", - "interview" -]New value: +[ + "pre-screening", + "interview", + "meeting" +] - added
Output schema / properties / data / items / properties / position_def_step_idAdded value: +{ + "description": "Position step definition id the row belongs to (null for single-stage interviews).", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / data / items / properties / position_step_countAdded value: +{ + "description": "Number of steps in the position process.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / data / items / properties / position_step_indexAdded value: +{ + "description": "1-based position of the step in the position process.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / data / items / properties / position_step_nameAdded value: +{ + "description": "Custom name of the position step, null when the step uses its default label.", + "type": [ + "string", + "null" + ] +}
- Changed
list_interviews1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
list_languages1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
list_my_merchants1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
list_sub_merchants1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
register_users_for_interview1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
request_another_interview_attempt1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
search_documentation1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
set_interview_state1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
update_catalogue_directory1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
update_interview1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
- Changed
upload_knowledge_base_document1 field changed- changed
Input schema / properties / conversation_id / descriptionPrevious value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
3 tool updates
- Changed
get_interview_definition2 fields changed- added
Output schema / properties / candidate_notification_channelAdded value: +{ + "description": "SMS / WhatsApp candidate notifications: null = off, reminders = with both e-mail reminders, last_reminder = only with the final reminder, all = invitation + reminders + pre-screening accepted.", + "enum": [ + "reminders", + "last_reminder", + "all", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "name", - "created_at", - "updated_at", - "questions", - "is_multistage", - "status", - "visibility", - "stage", - "type", - "environment", - "code", - "interview_location", - "cover_image_url", - "merchant_id", - "interview_template_id", - "interview_template_type", - "is_voice_only", - "knowledge_base_store_id", - "mojito_language_code", - "speech_language_code", - "speech_language_name", - "recording", - "recording_full_session", - "type_credit", - "result_view", - "candidate_video_introduction", - "description", - "interview_description_long", - "candidate_expectations", - "interview_department", - "interview_salary", - "interview_available_till", - "recruiter_profile_id", - "slug", - "tags", - "coach_plan", - "interview_conversation_speed", - "max_followups", - "max_duration", - "questions_random_subset", - "required_pronunciation", - "result_enable_edit_transcript" -]New value: +[ + "name", + "created_at", + "updated_at", + "questions", + "is_multistage", + "status", + "visibility", + "stage", + "type", + "environment", + "code", + "interview_location", + "cover_image_url", + "merchant_id", + "interview_template_id", + "interview_template_type", + "is_voice_only", + "knowledge_base_store_id", + "mojito_language_code", + "speech_language_code", + "speech_language_name", + "recording", + "recording_full_session", + "type_credit", + "result_view", + "candidate_video_introduction", + "description", + "interview_description_long", + "candidate_expectations", + "interview_department", + "interview_salary", + "interview_available_till", + "candidate_notification_channel", + "recruiter_profile_id", + "slug", + "tags", + "coach_plan", + "interview_conversation_speed", + "max_followups", + "max_duration", + "questions_random_subset", + "required_pronunciation", + "result_enable_edit_transcript" +]
- Changed
register_users_for_interview2 fields changed- added
Input schema / properties / users / items / properties / phoneAdded value: +{ + "description": "Optional mobile number in international format (E.164, e.g. +421903123456). Enables SMS / WhatsApp invitation and reminder notifications when the interview has candidate_notification_channel set. Never overwrites a phone already stored on the candidate.", + "example": "+421903123456", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / phoneAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
update_interview1 field changed- added
Input schema / properties / candidate_notification_channelAdded value: +{ + "description": "SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: \"reminders\" = with both e-mail reminders (day 1 and day 3); \"last_reminder\" = only with the final day-3 reminder; \"all\" = invitation, both reminders and the pre-screening-accepted step. null switches them off. WhatsApp is tried first, SMS when the number is not on WhatsApp. Available on paid plans (Starter and above) and needs a phone number on the candidate.", + "enum": [ + "reminders", + "last_reminder", + "all", + null + ], + "type": [ + "string", + "null" + ] +}
29 tool updates
- Changed
create_catalogue_directory2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
create_interview2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
create_interview_from_questions2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
create_persona2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
generate_interview_report2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
generate_interview_url2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_catalogue_directory2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_documentation2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / propertiesAdded value: +{ + "_mcp_instructions": { + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" + } +}
- Changed
get_interview_definition2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_interview_result_details2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_merchant_analytics2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_merchant_credit_usage2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_merchant_status2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
jobmojito_configuration1 field changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +}
- Changed
list_avatars2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
list_candidates2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
list_catalogue_directories2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
list_interview_results2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
list_interviews2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
list_languages2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
list_my_merchants2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / propertiesAdded value: +{ + "_mcp_instructions": { + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" + } +}
- Changed
list_sub_merchants2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
register_users_for_interview2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
request_another_interview_attempt2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
search_documentation2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / propertiesAdded value: +{ + "_mcp_instructions": { + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" + } +}
- Changed
set_interview_state2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
update_catalogue_directory2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
update_interview2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
- Changed
upload_knowledge_base_document2 fields changed- added
Input schema / properties / conversation_idAdded value: +{ + "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", + "type": "string" +} - added
Output schema / properties / _mcp_instructionsAdded value: +{ + "description": "Server-issued metadata for this conversation.", + "properties": { + "conversation_id": { + "description": "The server-issued conversation identifier.", + "type": "string" + } + }, + "type": "object" +}
5 tool updates
- Changed
create_interview5 fields changed- changed
Input schema / properties / interview_tone / descriptionPrevious value: -"Interview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups; omit to default to relaxed. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default."New value: +"Interview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.." - added
Input schema / properties / interview_tone / enumAdded value: +[ + "relaxed", + "simple", + "professional", + "persuasive", + "exact", + null +] - changed
Input schema / properties / location / descriptionPrevious value: -"Job location."New value: +"Job location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`." - changed
Input schema / properties / pdf_export_auto_config / properties / mojito_language_code / descriptionPrevious value: -"Report language code (platform-languages.json code)."New value: +"Report language code (a platform-languages.json code)." - added
Input schema / properties / pdf_export_auto_config / properties / mojito_language_code / enumAdded value: +[ + "ar", + "bg", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "fil", + "fi", + "fr", + "de", + "el", + "hi", + "hu", + "id", + "it", + "ja", + "ko", + "ms", + "no", + "pl", + "pt", + "br", + "ro", + "ru", + "sk", + "es", + "sv", + "ta", + "th", + "tr", + "uk", + "vi", + null +]
- Changed
create_interview_from_questions5 fields changed- changed
Input schema / properties / interview_tone / descriptionPrevious value: -"Tone — configures the AI avatar's speaking style and the follow-up questions it generates; the base `questions` you supply are not affected. Omit to default to relaxed. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default."New value: +"Tone — configures the AI avatar's speaking style and the follow-up questions it generates; the base `questions` you supply are not affected. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.." - added
Input schema / properties / interview_tone / enumAdded value: +[ + "relaxed", + "simple", + "professional", + "persuasive", + "exact", + null +] - changed
Input schema / properties / location / descriptionPrevious value: -"Interview location."New value: +"Job location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`." - changed
Input schema / properties / pdf_export_auto_config / properties / mojito_language_code / descriptionPrevious value: -"Report language code (platform-languages.json code)."New value: +"Report language code (a platform-languages.json code)." - added
Input schema / properties / pdf_export_auto_config / properties / mojito_language_code / enumAdded value: +[ + "ar", + "bg", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "fil", + "fi", + "fr", + "de", + "el", + "hi", + "hu", + "id", + "it", + "ja", + "ko", + "ms", + "no", + "pl", + "pt", + "br", + "ro", + "ru", + "sk", + "es", + "sv", + "ta", + "th", + "tr", + "uk", + "vi", + null +]
- Changed
list_avatars3 fields changed- changed
Input schema / properties / mojito_language_code / descriptionPrevious value: -"Filter by platform language code."New value: +"Filter by platform language code. Omit for all languages." - added
Input schema / properties / mojito_language_code / enumAdded value: +[ + "ar", + "bg", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "fil", + "fi", + "fr", + "de", + "el", + "hi", + "hu", + "id", + "it", + "ja", + "ko", + "ms", + "no", + "pl", + "pt", + "br", + "ro", + "ru", + "sk", + "es", + "sv", + "ta", + "th", + "tr", + "uk", + "vi" +] - added
Input schema / properties / mojito_language_code / exampleAdded value: +"en"
- Changed
list_catalogue_directories3 fields changed- changed
Input schema / properties / mojito_language_code / descriptionPrevious value: -"Filter by the directory language (a platform-languages.json code, e.g. `en`)."New value: +"Filter by the directory language. Omit for all languages." - added
Input schema / properties / mojito_language_code / enumAdded value: +[ + "ar", + "bg", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "fil", + "fi", + "fr", + "de", + "el", + "hi", + "hu", + "id", + "it", + "ja", + "ko", + "ms", + "no", + "pl", + "pt", + "br", + "ro", + "ru", + "sk", + "es", + "sv", + "ta", + "th", + "tr", + "uk", + "vi" +] - added
Input schema / properties / mojito_language_code / exampleAdded value: +"en"
- Changed
update_interview4 fields changed- changed
Input schema / properties / interview_tone / descriptionPrevious value: -"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default."New value: +"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.." - added
Input schema / properties / interview_tone / enumAdded value: +[ + "relaxed", + "simple", + "professional", + "persuasive", + "exact", + null +] - changed
Input schema / properties / pdf_export_auto_config / properties / mojito_language_code / descriptionPrevious value: -"Report language code (platform-languages.json code)."New value: +"Report language code (a platform-languages.json code)." - added
Input schema / properties / pdf_export_auto_config / properties / mojito_language_code / enumAdded value: +[ + "ar", + "bg", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "fil", + "fi", + "fr", + "de", + "el", + "hi", + "hu", + "id", + "it", + "ja", + "ko", + "ms", + "no", + "pl", + "pt", + "br", + "ro", + "ru", + "sk", + "es", + "sv", + "ta", + "th", + "tr", + "uk", + "vi", + null +]
5 tool updates
- Changed
create_interview1 field changed- added
Input schema / properties / environmentAdded value: +{ + "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..", + "enum": [ + "production", + "uat", + "development", + "demo", + null + ], + "example": "production", + "type": [ + "string", + "null" + ] +}
- Changed
create_interview_from_questions1 field changed- added
Input schema / properties / environmentAdded value: +{ + "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..", + "enum": [ + "production", + "uat", + "development", + "demo", + null + ], + "example": "production", + "type": [ + "string", + "null" + ] +}
- Changed
create_persona1 field changed- added
Input schema / properties / environmentAdded value: +{ + "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..", + "enum": [ + "production", + "uat", + "development", + "demo", + null + ], + "example": "production", + "type": [ + "string", + "null" + ] +}
- Changed
get_interview_definition2 fields changed- added
Output schema / properties / environmentAdded value: +{ + "description": "Which webhook environment this interview's results are delivered to. Null for multi-stage positions, whose stages each carry their own.", + "enum": [ + "production", + "uat", + "development", + "demo", + null + ], + "example": "production", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "name", - "created_at", - "updated_at", - "questions", - "is_multistage", - "status", - "visibility", - "stage", - "type", - "code", - "interview_location", - "cover_image_url", - "merchant_id", - "interview_template_id", - "interview_template_type", - "is_voice_only", - "knowledge_base_store_id", - "mojito_language_code", - "speech_language_code", - "speech_language_name", - "recording", - "recording_full_session", - "type_credit", - "result_view", - "candidate_video_introduction", - "description", - "interview_description_long", - "candidate_expectations", - "interview_department", - "interview_salary", - "interview_available_till", - "recruiter_profile_id", - "slug", - "tags", - "coach_plan", - "interview_conversation_speed", - "max_followups", - "max_duration", - "questions_random_subset", - "required_pronunciation", - "result_enable_edit_transcript" -]New value: +[ + "name", + "created_at", + "updated_at", + "questions", + "is_multistage", + "status", + "visibility", + "stage", + "type", + "environment", + "code", + "interview_location", + "cover_image_url", + "merchant_id", + "interview_template_id", + "interview_template_type", + "is_voice_only", + "knowledge_base_store_id", + "mojito_language_code", + "speech_language_code", + "speech_language_name", + "recording", + "recording_full_session", + "type_credit", + "result_view", + "candidate_video_introduction", + "description", + "interview_description_long", + "candidate_expectations", + "interview_department", + "interview_salary", + "interview_available_till", + "recruiter_profile_id", + "slug", + "tags", + "coach_plan", + "interview_conversation_speed", + "max_followups", + "max_duration", + "questions_random_subset", + "required_pronunciation", + "result_enable_edit_transcript" +]
- Changed
update_interview1 field changed- added
Input schema / properties / environmentAdded value: +{ + "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..", + "enum": [ + "production", + "uat", + "development", + "demo", + null + ], + "example": "production", + "type": [ + "string", + "null" + ] +}
2 tool updates
- Changed
list_catalogue_directories1 field changed- changed
Input schema / properties / limit / defaultPrevious value: -50New value: +25
- Changed
list_interview_results1 field changed- changed
Input schema / properties / limit / defaultPrevious value: -50New value: +20
6 tool updates
- Changed
create_interview1 field changed- changed
Input schema / properties / pdf_export_auto_config / properties / template / descriptionPrevious value: -"Report layout: classic (default), modern, or one_pager."New value: +"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
- Changed
create_interview_from_questions1 field changed- changed
Input schema / properties / pdf_export_auto_config / properties / template / descriptionPrevious value: -"Report layout: classic (default), modern, or one_pager."New value: +"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
- Changed
generate_interview_report1 field changed- changed
Input schema / properties / template / allOfPrevious value: -[ - { - "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.", - "enum": [ - "classic", - "modern", - "one_pager" - ], - "example": "modern", - "type": "string" - }, - { - "description": "Report layout: `classic` (default), `modern` or `one_pager`." - } -]New value: +[ + { + "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.", + "enum": [ + "classic", + "modern", + "one_pager" + ], + "example": "modern", + "type": "string" + }, + { + "description": "Report layout: `classic`, `modern` or `one_pager`. Omit for the merchant default (modern when unset)." + } +]
- Changed
get_interview_definition2 fields changed- changed
Output schema / properties / interview_template_type / descriptionPrevious value: -"Type of the linked interview template. `interactive_elevenlabs` is voice-only; the others (`interactive_heygen`, `offline_heygen`, `offline_elai`, `offline_synthesia`) are avatar-based. Null when the template could not be resolved."New value: +"Type of the linked interview template. `interactive_elevenlabs` is voice-only; the others (`interactive_spatius`, `interactive_heygen`, `offline_heygen`, `offline_elai`, `offline_synthesia`) are avatar-based. Null when the template could not be resolved." - changed
Output schema / properties / interview_template_type / enumPrevious value: -[ - "offline_elai", - "offline_synthesia", - "interactive_heygen", - "offline_heygen", - "interactive_elevenlabs", - null -]New value: +[ + "offline_elai", + "offline_synthesia", + "interactive_heygen", + "offline_heygen", + "interactive_elevenlabs", + "interactive_spatius", + null +]
- Changed
list_avatars1 field changed- changed
Input schema / properties / type / enumPrevious value: -[ - "interactive_heygen", - "interactive_elevenlabs", - "offline_heygen", - "offline_elai", - "offline_synthesia" -]New value: +[ + "interactive_heygen", + "interactive_elevenlabs", + "interactive_spatius", + "offline_heygen", + "offline_elai", + "offline_synthesia" +]
- Changed
update_interview1 field changed- changed
Input schema / properties / pdf_export_auto_config / properties / template / descriptionPrevious value: -"Report layout: classic (default), modern, or one_pager."New value: +"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
1 tool update
- Changed
get_interview_result_details3 fields changed- changed
Output schema / properties / ai_analysis_other / descriptionPrevious value: -"Session-level AI analyses keyed by analysis name (jsonb). `hiring_reasons`: { reasons_to_hire: string[], reasons_not_to_hire: string[] } (0-4 items each, recruiter-facing). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added."New value: +"Session-level AI analyses keyed by analysis name (jsonb). `strengths_concerns`: { strengths: string[], concerns: string[] } (0-4 items each, recruiter-facing; called `hiring_reasons` with `reasons_to_hire` / `reasons_not_to_hire` inside before 2026-09-15, and rows written before then may still carry that shape). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added." - changed
Output schema / properties / ai_analysis_recruiter_why_hire / descriptionPrevious value: -"Reasons to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_to_hire, kept for existing integrations."New value: +"Reasons to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.strengths, kept for existing integrations." - changed
Output schema / properties / ai_analysis_recruiter_why_not_hire / descriptionPrevious value: -"Reasons not to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_not_to_hire, kept for existing integrations."New value: +"Reasons not to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.concerns, kept for existing integrations."
5 tool updates
- Changed
create_interview1 field changed- added
Input schema / properties / pdf_export_auto_config / properties / templateAdded value: +{ + "description": "Report layout: classic (default), modern, or one_pager.", + "enum": [ + "classic", + "modern", + "one_pager", + null + ], + "type": [ + "string", + "null" + ] +}
- Changed
create_interview_from_questions1 field changed- added
Input schema / properties / pdf_export_auto_config / properties / templateAdded value: +{ + "description": "Report layout: classic (default), modern, or one_pager.", + "enum": [ + "classic", + "modern", + "one_pager", + null + ], + "type": [ + "string", + "null" + ] +}
- Changed
generate_interview_report2 fields changed- added
Input schema / properties / export_features_result / properties / templateAdded value: +{ + "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.", + "enum": [ + "classic", + "modern", + "one_pager" + ], + "example": "modern", + "type": "string" +} - added
Input schema / properties / templateAdded value: +{ + "allOf": [ + { + "description": "Report layout for this export. Same values as the top-level `template`; the top-level field wins when both are given. Kept here so a saved auto-export configuration carries its template.", + "enum": [ + "classic", + "modern", + "one_pager" + ], + "example": "modern", + "type": "string" + }, + { + "description": "Report layout: `classic` (default), `modern` or `one_pager`." + } + ] +}
- Changed
get_interview_result_details3 fields changed- added
Output schema / properties / ai_analysis_otherAdded value: +{ + "description": "Session-level AI analyses keyed by analysis name (jsonb). `hiring_reasons`: { reasons_to_hire: string[], reasons_not_to_hire: string[] } (0-4 items each, recruiter-facing). `takeaways`: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; `proof` entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; `fixed` lists the steps from the previous attempt that the learner did this time). `multi_department`: the multi-department-selection analysis. `score_rationale`: the rubric bracket of the session score and evidenced counts. `key_statement`: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added." +} - changed
Output schema / properties / ai_analysis_recruiter_why_hire / descriptionPrevious value: -"Reasons to hire (list/text)."New value: +"Reasons to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_to_hire, kept for existing integrations." - changed
Output schema / properties / ai_analysis_recruiter_why_not_hire / descriptionPrevious value: -"Reasons not to hire (list/text)."New value: +"Reasons not to hire (list). Deprecated: a copy of ai_analysis_other.hiring_reasons.reasons_not_to_hire, kept for existing integrations."
- Changed
update_interview1 field changed- added
Input schema / properties / pdf_export_auto_config / properties / templateAdded value: +{ + "description": "Report layout: classic (default), modern, or one_pager.", + "enum": [ + "classic", + "modern", + "one_pager", + null + ], + "type": [ + "string", + "null" + ] +}
1 tool update
- Changed
get_interview_result_details1 field changed- added
Input schema / properties / viewAdded value: +{ + "default": "standard", + "description": "How much of the record to return. Handled by the MCP server, not the JobMojito API — it only narrows the response, never the query.\n\n- `summary`: scores, the overall AI analysis, and each question with the candidate's answer — no per-answer AI commentary, recording paths or raw assessment data. Use this to review or compare candidates.\n- `standard`: everything a human reviewer reads: the full transcript with per-answer analysis, scores and recordings, minus the raw machine assessment blobs. This is the default.\n- `full`: the API response verbatim, including the raw per-answer pronunciation/sentiment data. Large — a long interview can exceed the result limit and fail. Only ask for this if you need those raw fields.", + "enum": [ + "summary", + "standard", + "full" + ], + "type": "string" +}
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" +]
Related MCP Connectors
- mcpOAuthcom.linatora
AI-powered hiring for recruiters & candidates - video interviews, transcripts, scores, profiles.
AI interview practice and career preparation with user-controlled guidance.
AI voice interviewer: create roles, screen CVs, schedule interviews, read scored reports.
AI screening interviews, resume matching, and evidence-linked scorecards for recruiting teams.
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceJob search assistant and interview prep inside any ai tool via MCP or public skill. Every tool you'll need for your job search in one product.9 npm7MIT- FlicenseNot gradedqualityBmaintenanceGenerate tailored job descriptions, hire senior developers and pull technical interview questions without leaving the conversation.58-
- AlicenseAqualityDmaintenanceEnables interview preparation by analyzing resumes and job descriptions, generating role-specific questions, and evaluating answers using MCP tools integrated with an OpenAI agent.5MIT
- FlicenseNot gradedqualityDmaintenanceIntelligent interview assistant that parses resumes, generates interview questions, records conversations, and produces evaluation reports for technical interviews.9-
Glama MCP Gateway
Add one secure layer between your agents and this server.