JobMojito
Server Details
Run AI interviews, simulated personas and coaching sessions on JobMojito.
- Status
- Healthy
- Uptime
- 99.9% over 65 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 38 tools
Most tools target a distinct resource+action and descriptions actively steer choices (e.g. list_my_merchants vs jobmojito_configuration, create_interview vs create_interview_from_questions). A few cluster around the same object (create_report/preview_report/run_report, and generate_interview_url vs register_users_for_interview both yielding URLs), but the descriptions disambiguate them well enough.
Almost all tools use consistent snake_case verb_noun (list_interviews, create_report, update_interview, set_interview_state). The only real deviation is jobmojito_configuration, which follows no verb_noun pattern, but everything else is predictable.
38 tools is heavy, exceeding the typical well-scoped range, though the server legitimately spans many domains (interviews, results, reports, coaching catalogue, admin, feedback, docs, knowledge base) and each tool within a domain earns its place. It is on the heavy end rather than bloated with duplicates.
Core lifecycles are well covered: interviews (create/read/list/update/state/url/register), results (list/get/report/attempt/analytics/credits), reports (create/get/list/update/preview/run/fields), and full CRUD on catalogue directories. Minor gaps exist (no delete_report, candidates only listable), but agents can work around them.
Available Tools
38 toolscreate_catalogue_directoryCreate coaching catalogue directoryCDestructiveInspect
[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. One directory can hold several languages: the top-level fields are the default language, translations adds the others. 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. | |
| translations | No | Other language versions of the directory, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version is a page of its own (name, Markdown, session filter, sub-directories) shown to learners who pick that language. A key may not equal `mojito_language_code`. | |
| 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 readOnlyHint=false, destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds one genuine behavioral fact beyond the schema: the chosen id becomes the URL segment and 'cannot be changed afterwards'. It does not explain the destructiveHint=true annotation or the permission gates (public visibility, merchant_id being admin-only), 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 description is two paragraphs that substantially restate each other — nesting via tags_sub, session listing via tags_interview_set_filter, and custom content_md appear twice. Only the id-immutability sentence in the second paragraph is new, so roughly half the text is redundant padding rather than earned 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 15 parameters, an output schema, and full annotations, the structured fields carry most of the burden. The description adequately conveys purpose, the language/translations model, and id immutability, but omits the permission constraints and the merchant/language defaults that an agent needs to call it correctly without reading 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 100%, so every one of the 15 parameters is already documented in the schema. The description names a handful of fields (tags_sub, tags_interview_set_filter, content_md, translations, id) but adds no syntax or format meaning beyond what the schema states, 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?
The description states a specific verb+resource ('Create a directory (page) in the coaching portal catalogue') and explains what a directory is structurally (nests sub-directories, lists sessions via tag filter, carries custom Markdown). It never names or contrasts the obvious siblings create/update/get/list_catalogue_directory, so an agent gets a clear purpose but no differentiation signal.
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?
There is no when-to-use guidance, no mention of update_catalogue_directory as the alternative for existing directories, and no stated prerequisites. The trailing 'Coaching-platform feature' is a vague context tag, not usage direction, leaving the agent to infer when this tool is appropriate.
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. Where it runs depends on the type: interviews, assessments and interview role-plays embed on the interview portal (`https://<interview portal domain>/embed?embed_id=...`); coaching sessions and coaching personas embed on the consumer (coaching) portal (`https://<coaching portal domain>/embed?embed_id=...`, a link built on the interview portal is forwarded there). A signed coaching embed (name, email, signature) signs the visitor in as a learner of that portal, and the session is charged to the merchant's interview credits on completion, not to the learner's coaching credits; it cannot start while the merchant has none. | |
| 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. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.. | |
| 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 destructiveHint=true, openWorldHint=true and idempotentHint=false, so the agent knows this is an irreversible outward-facing write. The description adds useful behavioral detail beyond that: AI generation of description/questions/expectations, provisioning of default steps, and optional embed-key provisioning. It still omits consequences of destruction and permission requirements, so it is solid but not rich.
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 tight sentences, front-loaded with the core action and the most consequential parameter behavior. Minor redundancy between the two paragraphs ('Create a new interview' vs 'Creates a new interview/coaching/assessment definition') 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 48 parameters at 100% schema coverage, full annotations, and an output schema, the description need not document fields or return values. It supplies exactly the non-structured context an agent needs: the generative behavior and the embed-key side effect. Nothing material for 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 coverage is 100%, so the baseline is 3. The description contributes extra meaning by explaining that interview_template_id governs modality (voice-only vs avatar) and routing the agent to list_avatars. That is a real value-add beyond the schema's field descriptions, warranting a step above 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+resource ('Create a new interview') and specifies the generative behavior ('auto-generate its question sequence from position data'), which implicitly separates it from create_interview_from_questions. It also clarifies a key driver (interview_template_id sets modality). It does not, however, explicitly name its closest sibling or contrast them, so it stops short of a 5.
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 offers a pointer ('see list_avatars') for choosing a template/modality, which is genuine selection guidance. But it never states when to prefer this tool over create_interview_from_questions or create_persona, nor any prerequisites or exclusions. Usage direction is implied rather than spelled out.
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. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.. | |
| 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 cover the write/destructive/open-world profile, and the description adds real behavior beyond them: the AI rephrases caller wording by default, the tool builds default and generated steps (not just the literal array), and it optionally activates the interview and optionally creates an embed key. It omits credit cost and non-idempotency, but the disclosure is solid given the annotations carry the safety burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and the tone caveat is well placed, but the second sentence largely restates the first ('create ... from an explicit array of questions' vs 'Creates ... from a caller-provided array of questions'), spending a full paragraph on information already conveyed.
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 46 parameters, an output schema present, and safety annotations supplied, the description covers the essential mental model: it is a create-from-array operation with AI rephrasing by default, deferred step generation, and optional activation/embed. Return values are handled by the output schema and parameter details by the fully covered schema, so remaining gaps are minor.
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 baseline is 3, and the description earns an increment by surfacing the single most consequential parameter decision — the default rephrasing vs. interview_tone="exact" for scripted wording — which is the primary way an agent can get this call wrong across 46 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a new interview from an explicit array of questions') and the qualifier 'explicit array of questions' implicitly distinguishes it from the sibling create_interview, which generates questions from a job description. However, it never names that sibling, so the agent must infer the contrast from the phrase 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?
It gives a genuinely useful conditional for one decision — use interview_tone="exact" when the wording is a script (compliance, translated, legally reviewed). But there is no tool-level when-to-use guidance: nothing says when to pick this over create_interview, nor what the prerequisites (template id, language) are. 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.
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, paid per second from their own coaching minutes 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, used to sign the iframe link. Where it runs depends on the type: interviews, assessments and interview role-plays embed on the interview portal (`https://<interview portal domain>/embed?embed_id=...`); coaching sessions and coaching personas embed on the consumer (coaching) portal (`https://<coaching portal domain>/embed?embed_id=...`, a link built on the interview portal is forwarded there). A signed coaching embed (name, email, signature) signs the visitor in as a learner of that portal, and the session is charged to the merchant's interview credits on completion, not to the learner's coaching credits; it cannot start while the merchant has none. | |
| 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 declare destructiveHint=true, openWorldHint=true and non-idempotent, and the description goes well beyond them: it discloses billing (merchant credits vs the mentee's coaching credits), visibility to recruiters, the attempt cap interaction with interview_attempts, the session flow (welcome → opening line → role-play → close), and the effect of omitting optional fields (generic 'Hello' defaults). These are rich, actionable behavioral traits.
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 content is front-loaded and the first sentence frames the tool well, but the portal decision is restated three separate times ('FIRST CHOOSE portal', 'FIRST DECIDE portal', plus the inline paragraph), producing substantial redundancy. Length is partly justified by 33 parameters, but the repetition costs it here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 33-parameter mutation tool with an output schema (so return values need not be described), the definition covers the decisive field (portal), the session mechanics, the persona prompt roles, and the consequences of omitted fields. Nothing essential 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 description coverage is 100%, so the baseline is 3, but the description adds genuine cross-field meaning: it explains that portal selects the whole product and drives billing/visibility/attempt behavior, that opening_line is a literal spoken line rather than a description, and how the four persona_avatar_* prompts divide responsibilities. This is more than restating 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?
It states a specific verb and 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 differentiates the two products it can build, which separates it from the create_interview / create_interview_from_questions siblings.
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 when-to-use routing: use portal="interview" for ANY hiring, screening or assessment use, coaching (the default) for practice/training, and warns repeatedly that the default is NOT the recruiter product. The alternative siblings and the selecting condition are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reportCreate custom reportADestructiveInspect
[Reports] Save a new custom report from a definition (schema jobmojito.report/v1). It is created as Only me: tell the user they can share it from the returned admin_url. Check the definition with preview_report first.
Stores a new custom report. It is created as "Only me" (private to you); share it from the JobMojito admin. Returns its id, version and the admin link to open it. Check the definition with preview_report first.
| Name | Required | Description | Default |
|---|---|---|---|
| definition | Yes | A custom report: report-wide filters and up to 12 blocks. Read report-catalog first for the dataset, field and measure ids. | |
| merchant_id | No | Optional merchant to act on. 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 | |
| version | Yes | Send it back with the next update. |
| admin_url | Yes | Open the report in the JobMojito admin. |
| published | Yes | false when the change was stored as a draft the owner publishes in the admin. |
| _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=false, destructiveHint=true and idempotentHint=false. The description adds genuinely new behavior: the report is created private ('Only me'), it can be shared later from the admin, and the response carries id, version and admin_url — plus a directive to tell the user about sharing.
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 body is duplicated almost verbatim — the 'Only me' privacy note and the preview_report instruction each appear twice, and the second paragraph restates the first wholesale. Front-loading is fine, but half the text fails to earn 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?
For a create tool with an output schema, the description covers the essentials an agent needs: the payload schema, the validation prerequisite, the default privacy state, and the share path. The destructive annotation is never explained, which is a minor remaining 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 schema already documents definition, merchant_id and conversation_id in depth, including nested block semantics. The description adds no parameter meaning beyond restating the definition's schema id, 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 ('Save a new custom report from a definition') and pins the payload contract ('schema jobmojito.report/v1'). An agent can distinguish this from preview_report, update_report and run_report 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?
Explicitly routes the agent to preview_report first ('Check the definition with preview_report first'), which is a real prerequisite. It does not, however, say when to prefer update_report over creating a new report, so one gap remains.
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. Other language versions of the page are in translations (languages lists them, default first).
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). The old id of a renamed directory also works; the response carries its current `id`. | |
| 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. | |
| mojito_language_code | No | Show `sub_directories` and `matched_sessions` for this language version of the directory (one of its `languages`) instead of the default one - how you verify a translation lists the right sessions. |
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. |
| languages | Yes | Every language the directory has, the default (`mojito_language_code`) first. `matched_sessions` and `sub_directories` describe the default language unless the request names another one in `mojito_language_code`. |
| 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. |
| merged_into | Yes | Set when this directory was folded into another as one of its language versions: the directory to edit instead. Its old URL redirects there. |
| translations | Yes | The directory's OTHER language versions, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version here is a page of its own with its own name, Markdown, session filter and sub-directories, shown to learners who pick that language in the catalogue (falling back to English, then the default). A key may not equal `mojito_language_code`. |
| 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. |
| viewed_language | Yes | The language version `sub_directories` and `matched_sessions` were resolved for: the requested `mojito_language_code`, else the default. |
| 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, destructiveHint=false and openWorldHint=true, so safety is covered. The description adds genuine context beyond them: that updates replace content_md/tags_sub/tags_interview_set_filter wholesale (motivating the read), and that other language versions live in `translations` with `languages` defaulting first.
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 restating the same purpose, return fields, and read-before-update rationale. This is pure duplication rather than earned length, though the first sentence is well 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?
With an output schema present, return values need not be explained, and annotations carry the safety profile. The description covers purpose, the read-before-write workflow, and language/translation handling, leaving little an agent needs 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 id, merchant_id, conversation_id and mojito_language_code in detail; baseline is 3. The description adds only marginal nuance (that `languages` lists translations with the default first) beyond the mechanical schema text.
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 exactly what is returned: settings, content_md, resolved sub-directories, and matched sessions. This clearly distinguishes it from the sibling list_catalogue_directories (singular, full read vs. listing).
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 guidance ('Read before updating') tied to the wholesale-replacement semantics of content_md, tags_sub and tags_interview_set_filter, and explains the verification use case for tags. It stops short of naming a specific alternative sibling or stating when not to use it, so it does not reach 5.
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`: every field, including the per-answer raw assessment data — condensed: pronunciation and sentiment scores per recognised segment with the lowest-scoring words, reading/gaze statistics, STT reliability, proctor status and seconds per detected speaker. Word-, character- and frame-level arrays are left out (listed in `_omitted`). Only ask for this if you need those assessment details. | 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?
With annotations already covering readOnly/idempotent/non-destructive, the description adds real value: scores are assistive (not authoritative) output, the record is large, the default view omits raw machine assessment data, and signed recording URLs are optional. It does not mention pagination or auth requirements, but the behavioral additions clearly exceed the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence front-loads the purpose and the size/view tradeoff. The second paragraph slightly restates the first (transcript + AI assessment, signed recordings), which is minor redundancy, but overall the description is tight and appropriately sized.
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-value detail is unnecessary, and the description covers the non-obvious parts: view granularity, the assistive nature of scores, and large record size. Only the sibling-routing question (why this over list_interview_results) is left unaddressed.
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 the view enum is documented in exhaustive detail in the schema itself. The description only restates the default and what it omits, adding little beyond structured data — the expected baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Get full interview result details including transcript and scores") and clarifies the payload scope. It does not explicitly name the nearest sibling (list_interview_results), so an agent must infer the distinction from context rather than being told it.
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 implied guidance via the view-default note and the caution that scores are assistive output for a human reviewer. However, the concrete when-to-use routing (summary for comparing candidates, full only when assessment details are needed) lives in the schema, not the description, and no alternative tool is named.
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.
get_reportGet custom reportARead-onlyIdempotentInspect
[Reports] Get a custom report's JSON definition, visibility, your access and its version. Read it before update_report: the definition is replaced whole and the version must match.
The report's JSON definition, visibility, your access (owner, edit, view) and its version (needed to update it). People who can edit also get the unpublished draft, if any.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Report id (from list_reports). | |
| 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 | |
| title | Yes | |
| access | Yes | |
| version | Yes | |
| admin_url | Yes | |
| definition | No | The published ReportDefinition. |
| visibility | Yes | |
| draft_definition | No | Unpublished edits (only for people who can edit), or null. |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only/idempotent safety profile, and the description adds real behavioral context beyond that: whole-replacement semantics of the definition, the version-match requirement for update, and the conditional fact that editors also receive an unpublished draft. It does not cover rate limits or error/failure behavior, so it stops 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?
The workflow warning is front-loaded, which is good, but the second paragraph largely restates the first ('JSON definition, visibility, your access, its version'), repeating content rather than earning space. The duplication is small but costs 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 description supplies the workflow hook (read-before-update), permission-scoped payload, and version semantics. An agent has everything needed to invoke it correctly, though nothing is said about failure modes.
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 id, merchant_id, and conversation_id are already fully documented in the schema, including who may use merchant_id and the conversation_id protocol. The description adds no parameter-level meaning beyond that, 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 ('Get a custom report's JSON definition, visibility, your access and its version') and enumerates exactly what comes back. It is clearly distinguishable from siblings like list_reports, run_report, preview_report, and update_report.
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 routes the agent: 'Read it before update_report' with the reason (definition is replaced whole, version must match). This names the alternative tool and the condition that selects it, leaving nothing to inference.
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 language: directories whose default language or one of whose language versions is this one. 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 read-only, idempotent, non-destructive, open-world, so the safety bar is pre-cleared. The description adds real behavioral context beyond them: page size of 25, offset paging while `pagination.has_more` is true, that deleted directories are never returned, and that the custom Markdown page is excluded from results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description contains two paragraphs that repeat the same content almost verbatim: 'Start here to find a directory id', 'pick a parent', 'walk the tree with parent_tag', 'The custom Markdown page is not included', and the pagination note all appear twice. Roughly half the text does not earn its place, and the second paragraph buries the new detail (include_public=false, status='public') behind duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description still adds useful paging and result-set facts. For a 10-parameter read tool with full schema coverage, an agent has everything needed to call it correctly; only the duplicated alternative tool name leaves a small 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%, with enums on status/visibility/include_public/mojito_language_code, so the schema already documents all ten parameters. The description restates include_public, parent_tag and offset behavior but adds no syntax or format detail beyond the schema, matching the baseline-3 case.
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 coaching-catalogue directories you can see') and immediately delimits scope ('your merchant's own plus the platform-wide public ones'). It is clearly distinguishable from siblings like get_catalogue_directory, create_catalogue_directory and update_catalogue_directory.
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: 'Start here to find a directory id, to pick a parent for a new one, or to walk the tree with `parent_tag`' and 'find a directory id before updating one'. It also routes around the omission ('The custom Markdown page is not included — read it with get_catalogue_directory'). Minor flaw: the same alternative is later called 'catalogue-tag-get', a name that does not match any sibling, creating ambiguity about which tool to call.
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_report_fieldsList report datasets and fieldsARead-onlyIdempotentInspect
[Reports] List what a custom report can use on this account: datasets (interview results, invitations, position pipeline, ATS pipeline, credits, coaching sessions - only those the account and your role include), their dimensions (group by / conditions, with allowed values) and measures. Call this first: a report definition may only use ids listed here. Custom reports are switched on per account by JobMojito; while they are off, every report tool is refused with 403 'Custom reports are not enabled for this account.' Tell the user to contact JobMojito rather than retrying.
Everything a custom report may use on this account: the datasets (interview results, invitations, position pipeline, ATS pipeline, credits, coaching sessions - only those your account and role include), their dimensions (group by / filter) and measures (numbers), block types, condition operators and period presets. Read this before writing a report definition: ids not listed here are refused.
| 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 |
|---|---|---|
| limits | Yes | |
| schema | Yes | |
| datasets | Yes | Datasets you may use: id, label, description, snapshot (ignores the period), and fields: id, kind (dimension | measure), type, label, description, values (allowed values of a text dimension), grains (date), table_only, format. |
| can_share | Yes | false for hiring managers (read-only role). |
| where_ops | Yes | |
| block_types | Yes | |
| period_presets | 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 going beyond them: it discloses the 403 failure mode when custom reports are disabled and prescribes the correct recovery (tell the user to contact JobMojito, do not retry). It does not discuss rate limits, caching, or response size, so a 4 rather than 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?
The most important instruction ('Call this first') is front-loaded, which is good, but the description then restates the same content twice — the dataset/dimension/measure enumeration appears in paragraph one and again nearly verbatim in paragraph two. Roughly half the text is redundant, wasting budget on a body that should be tight.
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. The description covers scope, the ordering constraint relative to write-ahead report definition tools, and the account-level disabled state — everything an agent needs to call it correctly or route the user appropriately.
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 merchant_id (scoping/auth caveat) and conversation_id (must be echoed unchanged, do not invent, no parallel calls) are fully documented in the schema. The description adds nothing about parameters, 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 (list report datasets and fields) and immediately scopes it to 'what a custom report can use on this account', which separates it from list_reports, get_report, and preview_report. The enumerated dataset types make the scope concrete.
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 ordering ('Call this first') and a hard precondition ('a report definition may only use ids listed here' / 'ids not listed here are refused'), plus a when-not case: while custom reports are off, the tool fails with 403 and the agent should not retry. This is exactly the when/when-not/alternative guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reportsList custom reportsARead-onlyIdempotentInspect
[Reports] List custom reports you can open (yours, shared with you) and the JobMojito templates, with id, title, visibility, your access and version.
Custom reports you can open on this account (yours, the ones shared with you) and the JobMojito templates. Pinned first, then most recently updated.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | all (default), mine, shared (by colleagues) or templates. | all |
| 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 | |
| _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's job is to add context — and it does, disclosing the ordering contract ('Pinned first, then most recently updated') and the access model ('reports you can open'). It stops short of describing pagination or result-size limits, which would matter for a list endpoint with openWorldHint=true.
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 scoping information is front-loaded, but the two sentences substantially duplicate each other: 'yours, shared with you' and 'JobMojito templates' appear verbatim in both, and the second sentence re-states the whole listing scope before adding the ordering detail. Roughly a sentence of redundancy for a short 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-field explanation is not strictly required, and the description still adds the ordering semantics that the output schema would not convey. The gaps — no pagination or result-limit behavior — are minor given full annotation and schema coverage.
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 (scope enum, merchant_id permissions, conversation_id protocol) are fully documented in the schema itself. The description only echoes the scope concept in prose ('yours, shared with you, templates') without adding format or constraint detail beyond it. 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 ('List custom reports') and narrows scope precisely: reports you own, reports shared with you, and JobMojito templates. It also enumerates the returned fields (id, title, visibility, access, version), which separates it cleanly from get_report (single item), list_report_fields (field metadata) and run_report (execution).
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 scope enumeration in the schema and by 'reports you can open,' but the description never says when to prefer this over get_report, list_report_fields, preview_report or run_report. No explicit exclusions or prerequisites are given, so the agent must infer routing from the name alone.
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.
preview_reportCheck and preview a report definitionARead-onlyIdempotentInspect
[Reports] Validate a report definition against the catalogue and run it without saving anything. Use it before create_report / update_report: a block that is wrong comes back with ok=false and an error naming the field and the valid ids.
Validates a report definition against the catalogue and runs it, without storing anything. Use it to check a definition before create_report or update_report. A 422 names the block and field that is wrong and lists the valid ids.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | ||
| block_id | No | Run only this block. | |
| definition | Yes | A custom report: report-wide filters and up to 12 blocks. Read report-catalog first for the dataset, field and measure ids. | |
| merchant_id | No | Optional merchant to act on. 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 |
|---|---|---|
| title | No | |
| blocks | Yes | |
| filters | Yes | The filters the blocks ran with (report defaults, then your saved filters, then the ones you passed). |
| version | No | |
| report_id | No | |
| _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 the safety profile is covered. The description adds real value beyond them: nothing is persisted, validation is against the catalogue, and failure returns ok=false / a 422 naming the offending block and field plus the valid ids. Minor inconsistency in presenting the failure as both 'ok=false' and 'a 422', but not a contradiction of the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence is front-loaded and useful, but the second paragraph is a near-verbatim restatement of the first (validate against catalogue, run, nothing stored, use before create/update, error names the field). Roughly half the text earns no new information, which is a clear structural waste even though the total length is modest.
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, the description needn't explain return values, and annotations cover the safety profile; combined with the purpose, the pre-flight guidance and the error semantics, an agent has enough to call it correctly. It could still mention that the definition's dataset/field/measure ids must come from the catalogue, which lives only in the nested schema description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80% and the nested definition schema is heavily self-documented (block types, measures, filters, grain), so the baseline is 3. The description adds no parameter-level meaning — it never mentions block_id (run a single block), merchant_id scoping, or the required conversation_id handshake, all of which are only explained 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+resource combination — validate a report definition and run it without saving anything — and explicitly frames it as a pre-flight step ahead of create_report / update_report. An agent can distinguish it from the other report siblings (create_report, update_report) 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 gives a clear when-to-use rule: 'Use it before create_report / update_report', which is exactly the decision an agent faces when it has a candidate definition. It does not, however, state when NOT to use it (e.g. to read an already-saved report, where get_report/run_report would apply), so the guidance stops just short of full routing.
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.
report_technical_issueReport technical issueADestructiveInspect
[Feedback] Report a technical problem to JobMojito support. It opens a support conversation from the signed-in user's account (their e-mail), with their company and the interview or result ids given; support answers there. Describe what was done, what was expected and what happened (error text as shown). Confirm the wording with the user first; at most 5 a day.
Reports a technical problem to JobMojito support. It opens a support conversation from your account (your e-mail), with your company and the ids you give; support answers there. At most 5 reports per user in 24 hours. Requires a user token (admin console session or MCP sign-in) of a merchant, merchant owner or admin.
| Name | Required | Description | Default |
|---|---|---|---|
| result_id | No | The interview result the problem is about, if any. | |
| description | Yes | What went wrong: what you did, what you expected, what happened instead (error messages as shown), and since when. Plain text; blank lines separate paragraphs. Do not include passwords or API keys. | |
| interview_id | No | The interview (definition) the problem is about, if any. | |
| 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 | Id of the stored report. |
| status | Yes | `sent`: the support team has it. `queued`: stored, it is sent shortly (support could not be reached right now). |
| reference | Yes | The support conversation number, once sent (e.g. `#592`). |
| _mcp_instructions | No | Server-issued metadata for this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the report becomes a support conversation answered by support, the identity/e-mail and company/ids attached, the 5-per-24h quota, the required auth session type, and the instruction to confirm wording with the user first. Annotations already flag non-idempotent/destructive/open-world, so the description earns credit for the auth, quota and side-effect detail rather than restating safety hints.
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 body contains two near-verbatim paragraphs saying the same thing (opens a support conversation, from the user's e-mail, with company and ids, support answers there, 5/day cap). Roughly half the text is redundant restatement, which dilutes a description that is otherwise 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 explained. The description covers side effects, auth requirements, quota, and user-confirmation duty for a mutation tool; only the conversation_id continuation behavior is left entirely to 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 100%, so all four parameters (including the detailed conversation_id protocol and the description content) are already documented in the schema. The description only loosely gestures at 'the interview or result ids given' and never mentions conversation_id, so it adds little beyond what the schema provides. 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?
States a specific verb and resource: 'Report a technical problem to JobMojito support', and clarifies the mechanism (opens a support conversation from the user's e-mail). It implicitly separates itself from submit_feature_request via the technical-problem framing, but never names that sibling explicitly, so differentiation relies on 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 concrete preconditions: 'Confirm the wording with the user first', a rate limit ('at most 5 a day'), and the required token/role ('merchant, merchant owner or admin'). It does not say when to prefer this over submit_feature_request, which is the closest alternative in the sibling list.
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.
run_reportRun custom reportARead-onlyIdempotentInspect
[Reports] Run a saved custom report and return each block's rows (aggregated numbers, at most 500 rows per block). Optional filters JSON overrides the period / positions / interviews for this run only. Report numbers are decision-support material for a human reviewer.
Runs every block of a saved report and returns its rows. Filters start from the report's defaults, then your own saved filters, then filters if you pass it. Each block runs on its own: a block that fails returns ok=false with an error while the others still return data. Numbers are aggregated; no block returns more than 500 rows.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Report id (from list_reports). | |
| draft | No | Run the unpublished draft instead (only if you can edit the report). | false |
| filters | No | Optional JSON ReportFilters to apply on top, e.g. {"period":{"preset":"last_month"}}. | |
| block_id | No | Run only this block. | |
| 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 |
|---|---|---|
| title | No | |
| blocks | Yes | |
| filters | Yes | The filters the blocks ran with (report defaults, then your saved filters, then the ones you passed). |
| version | No | |
| report_id | No | |
| _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 readOnly/idempotent/non-destructive, but the description adds real behavioral context: per-block failure isolation (ok=false with error while other blocks still return data), a 500-row-per-block cap, and the filter precedence chain (report defaults → saved filters → `filters`). The 'decision-support material for a human reviewer' caveat is a useful framing signal about how much weight to put on the numbers.
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 definition repeats itself: the opening line and the second paragraph both say 'run a saved report and return its rows,' and the 500-row limit is stated twice. Front-loading the verb and resource is good, but roughly a third of the text is restatement rather than new 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 and every parameter documented, the description only needs to cover execution semantics, and it does: partial failure, row caps, filter precedence. Nothing essential for a correct invocation is missing, though the lack of sibling routing is the one remaining hole.
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 baseline is 3; the description earns above that by documenting filter merge order and the per-run-only scope of `filters`, which the schema does not state. It does not add anything for `conversation_id` or `merchant_id` beyond what the schema already says.
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: run a saved custom report and return each block's rows, with the aggregation level and 500-row cap made explicit. It is distinguishable from get_report/preview_report/create_report by the 'run and return rows' framing, though it never names those siblings to draw the boundary 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 implied rather than prescribed: `draft` hints at editing permission, `block_id` at partial runs, and `filters` at per-run overrides. There is no explicit guidance on when to use run_report versus preview_report, get_report, or generate_interview_report, so an agent must infer the routing from names alone.
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 stateBDestructiveIdempotentInspect
[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). Where it runs depends on the type: interviews, assessments and interview role-plays embed on the interview portal (`https://<interview portal domain>/embed?embed_id=...`); coaching sessions and coaching personas embed on the consumer (coaching) portal (`https://<coaching portal domain>/embed?embed_id=...`, a link built on the interview portal is forwarded there). A signed coaching embed (name, email, signature) signs the visitor in as a learner of that portal, and the session is charged to the merchant's interview credits on completion, not to the learner's coaching credits; it cannot start while the merchant has none. | |
| 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 declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the agent knows this is a repeatable mutation. The description adds that it also manages the embed key and requires status-or-embed to be supplied, but it never says what 'deleted' actually destroys or whether that transition is recoverable — the one piece of context annotations can't convey.
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 core action and capped with the calling constraint. There is minor redundancy between 'Change the state' and 'Changes the lifecycle status', but no 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 and parameters are fully documented, so the description need not cover returns. It is nonetheless incomplete for a destructive mutation: no differentiation from `update_interview`, no permission/confirmation expectations, and the illustrative examples '(e.g. open, closed)' do not match the actual enum values (draft/active/archived/deleted/preparing/completed).
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 the `is_embedded` and `conversation_id` entries are already richly documented in the schema, so the schema does the heavy lifting. The description only restates the status value list and the 'at least one of status/is_embedded' rule, adding little beyond structured data — 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?
Specific verb (change state) plus resource (interview/position) and an enumeration of the lifecycle values it can set, so the agent knows it is a status/embed-key mutation rather than a general edit. It does not, however, distinguish itself from the sibling `update_interview`, which an agent must otherwise infer.
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 only real guidance is the precondition 'Provide at least one of `status` or `is_embedded`', which tells the agent how to call it but not when to prefer it over `update_interview` or how to sequence it after `create_interview`/`get_interview_definition`. 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.
submit_feature_requestSubmit feature requestADestructiveInspect
[Feedback] Send a feature request to the JobMojito product team. It is posted on the public feature request board under the signed-in user's name, where they get status updates; the company is not named. Write a short title and a description of the need and why (no candidate data or company names). Confirm the wording with the user before submitting; at most 5 a day.
Sends a feature request to the JobMojito product team. It is posted on the public feature request board under your name (from your account e-mail), where you get status updates and others can vote on it; your company is not named. At most 5 requests per user in 24 hours. Requires a user token (admin console session or MCP sign-in) of a merchant, merchant owner or admin.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | A short summary of the feature, shown as the post title. | |
| description | Yes | What the user needs and why: the problem, how they work around it today, who it would help. Plain text; blank lines separate paragraphs. The board is public: do not include candidate data, company names or other personal information. | |
| 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 | Id of the stored request. |
| status | Yes | `posted`: it is on the feature request board. `queued`: stored, it is posted shortly (the board could not be reached right now). |
| _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 mutation/open-world/non-idempotent profile, but the description adds real context beyond them: the post is public under the user's name, the company is not named, others can vote, and there is a hard rate limit of 5 per 24 hours. It omits what happens on failure or whether a submission can be edited/withdrawn.
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-duplicate paragraphs: both restate that a request is sent to the product team, posted publicly under the user's name, that the company is not named, and the 5/day limit. The duplication wastes tokens even though the second paragraph adds the auth requirement and voting detail.
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 description covers auth requirements, rate limits, content restrictions and public visibility. The main gap is the lack of explicit routing guidance against sibling tools, but for a single-purpose submission tool this is largely 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%, including constraints on title/description and the conversation_id handling, so the schema does the heavy lifting. The description's 'write a short title and a description of the need and why (no candidate data or company names)' only restates constraints already in the schema, 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 and resource ('Send a feature request to the JobMojito product team') and distinguishes itself from siblings like report_technical_issue by naming the destination (public feature request board). An agent can tell what it does 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?
Gives clear usage context: confirm wording with the user before submitting, keep the title short, describe the need and why. It does not explicitly name an alternative tool or state when NOT to use it (e.g., vs. report_technical_issue), so it falls short of the top tier.
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), author its custom Markdown page (content_md), or add, replace or remove a language version (translations, per language; null removes one). 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), author its custom Markdown page (content_md), or add, replace and remove its other language versions (translations).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the directory to update (the catalogue URL segment). The id itself is not changed here — rename a directory in the admin catalogue editor, which moves every link to it. | |
| 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. | |
| translations | No | The directory's OTHER language versions, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version here is a page of its own with its own name, Markdown, session filter and sub-directories, shown to learners who pick that language in the catalogue (falling back to English, then the default). A key may not equal `mojito_language_code`. Only the languages you send change: an object replaces that version, null removes it. Send `translations: null` to remove every version. | |
| 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 the safety profile is covered. The description adds real behavioral context on top: partial-write semantics, that null clears nullable fields, that `content_md: null` restores the default grid, and that `translations: null` removes every language version.
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 is a well front-loaded summary, but the second paragraph restates the same field list almost verbatim, which is genuine redundancy rather than added value. The structure is openable and readable, but a third of the text is duplicated 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?
For a 13-parameter mutation tool with an output schema and rich annotations, the description is reasonably complete: it covers partial-update semantics and null-clearing behavior, which are the main risks an agent must understand. It stops short of stating permission/auth requirements beyond the row-level-security note buried in the `visibility` enum.
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 13 parameters in depth; the description's parameter references (`tags_interview_set_filter`, `tags_sub`, `content_md`, `translations`) merely name fields already fully described. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Update a coaching catalogue directory") and enumerates exactly which aspects can be changed — rename, session filter, sub-directory order, Markdown page, translations. It is unambiguously an update tool rather than create_catalogue_directory or get_catalogue_directory, though it never explicitly names those siblings.
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 solid context for what kinds of edits the tool performs and the partial-update model ("Only the fields you send are changed"), but offers no when-not-to-use guidance and never routes the agent to an alternative such as the admin catalogue editor referenced only inside the `id` schema field.
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. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.. | |
| 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, and the description goes well beyond them: only sent fields are written, null clears nullable fields, questions are diffed by external_id then id then content, edits are unlink-old + create-new so nothing is ever deleted, resending an unchanged array is a no-op, and interview-only fields on a position produce a 422. That is exactly the extra context the annotations cannot carry.
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 well organized, but the two paragraphs substantially repeat each other: the questions-array diff, the welcome/thank-you/instructional-video steps not being questions, the language immutability, and the position-vs-interview 422 all appear twice. Sizeable redundancy costs it credit despite the information being valuable.
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 (so return values need no explanation) and high schema coverage, the description supplies the remaining call-correctness knowledge: prerequisite reads, diff semantics, positional constraints, and the type-specific field restrictions. Nothing needed to invoke 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 description coverage is 100%, so the baseline is 3, but the description adds genuinely useful cross-parameter semantics the schema cannot express: the complete-list contract for questions, the diff-matching order, the fact that only shared identity fields apply to a multi-stage position, and the 422 for position-level rejection of candidate_expectations_json.
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?
Opens with a specific verb and resource ('Update the configuration of an existing interview/position') and enumerates the editable surface: name, description, avatar template, recording, scoring, tags. It also names the read sibling (get_interview_definition) and its create siblings implicitly, so an agent can place it among the other 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?
Explicit routing rules throughout: read the interview first before editing questions, use tags to place a session into a catalogue directory, set the interview back to draft for offline templates, create a new interview instead of changing language, and update individual stages rather than sending interview-only fields to a position. When-not-to-use is stated as clearly as when-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_reportUpdate custom reportADestructiveInspect
[Reports] Replace a custom report's definition (send the whole definition and the version from get_report). On a report shared with other people the change is saved as a draft that the owner publishes in the admin; a private report updates at once.
Replaces the definition of a report you own or may edit. Send the version you read; if someone changed the report since, you get 409 and should get it again. A report shared with others keeps your change as a draft until it is published in the admin, so viewers never see a half-finished report.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Report id (from list_reports). | |
| target | No | published (default) or draft. A private report always publishes. Through the MCP server a shared report always gets a draft that its owner publishes in the admin. | |
| version | Yes | The version you read (get_report / list_reports). A stale version is refused with 409. | |
| definition | Yes | ||
| merchant_id | No | Optional merchant to act on. 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 | |
| version | Yes | Send it back with the next update. |
| admin_url | Yes | Open the report in the JobMojito admin. |
| published | Yes | false when the change was stored as a draft the owner publishes in the admin. |
| _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 safety profile is known. The description adds genuinely non-derivable behavior: shared reports persist the change as a draft until admin publication while private reports update immediately, and stale versions are rejected with 409. It does not discuss auth/permission specifics beyond ownership.
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-loading is good ([Reports] tag and the replace action lead), but the second paragraph largely repeats the first: full replacement, version/409 handling, and the shared-report draft behavior appear twice. Roughly a third of the text is 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 annotations cover the destructive/idempotency profile. The description supplies the ownership scope, conflict handling, and draft-vs-publish semantics an agent needs to call this correctly; only explicit permission/authorization detail is thin.
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 83%, so the schema already documents id, version, target, definition, merchant_id and conversation_id in detail. The description restates "send the whole definition and the version from get_report" but adds no syntax, format, or constraint beyond what the schema already says, including the 409-on-stale-version rule.
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 precise verb+resource: "Replace a custom report's definition," and immediately clarifies it is a full replacement ("send the whole definition"), not a partial patch. It names the sibling get_report as the source of the input, so an agent can distinguish it from create_report, preview_report, and run_report 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 clear preconditions ("a report you own or may edit") and the exact call sequence: read via get_report, then resend the version. It also explains the conflict path (stale version → 409 → re-read). It stops short of explicit when-not guidance, e.g. pointing to create_report for new reports or preview_report for validation.
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.
4 tool updates
- Removed
Report_a_technical_issue - Added
report_technical_issue - Removed
Submit_a_feature_request - Added
submit_feature_request
2 tool updates
- Added
Report_a_technical_issue - Added
Submit_a_feature_request
3 tool updates
- Changed
create_report3 fields changed- changed
Input schema / properties / definition / properties / filters / properties / interview_ids / descriptionPrevious value: -"Only these interviews (interview ids from list_interviews). Empty or missing = all."New value: +"Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all." - changed
Input schema / properties / definition / properties / filters / properties / position_ids / descriptionPrevious value: -"Only these positions (position ids from list_interviews). Empty or missing = all."New value: +"Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all." - added
Input schema / properties / definition / properties / filters / properties / without_positionAdded value: +{ + "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.", + "type": [ + "boolean", + "null" + ] +}
- Changed
preview_report4 fields changed- changed
Input schema / properties / definition / properties / filters / properties / interview_ids / descriptionPrevious value: -"Only these interviews (interview ids from list_interviews). Empty or missing = all."New value: +"Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all." - changed
Input schema / properties / definition / properties / filters / properties / position_ids / descriptionPrevious value: -"Only these positions (position ids from list_interviews). Empty or missing = all."New value: +"Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all." - added
Input schema / properties / definition / properties / filters / properties / without_positionAdded value: +{ + "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.", + "type": [ + "boolean", + "null" + ] +} - changed
Input schema / properties / filters / allOfPrevious value: -[ - { - "additionalProperties": false, - "description": "Filters for every block of the report. Each viewer can override them for themselves.", - "properties": { - "include_test": { - "description": "Include test runs. Default false.", - "type": [ - "boolean", - "null" - ] - }, - "interview_ids": { - "description": "Only these interviews (interview ids from list_interviews). Empty or missing = all.", - "items": { - "format": "uuid", - "type": "string" - }, - "maxItems": 200, - "type": [ - "array", - "null" - ] - }, - "period": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "preset": { - "enum": [ - "last_7_days", - "last_30_days", - "last_90_days", - "this_month", - "last_month", - "this_quarter", - "last_quarter", - "this_year", - "last_year", - "all_time", - null - ], - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "preset" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "from": { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": [ - "string", - "null" - ] - }, - "to": { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - } - ], - "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.", - "example": { - "preset": "last_30_days" - } - }, - "position_ids": { - "description": "Only these positions (position ids from list_interviews). Empty or missing = all.", - "items": { - "format": "uuid", - "type": "string" - }, - "maxItems": 200, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" - }, - { - "description": "Applied on top of definition.filters." - } -]New value: +[ + { + "additionalProperties": false, + "description": "Filters for every block of the report. Each viewer can override them for themselves.", + "properties": { + "include_test": { + "description": "Include test runs. Default false.", + "type": [ + "boolean", + "null" + ] + }, + "interview_ids": { + "description": "Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all.", + "items": { + "format": "uuid", + "type": "string" + }, + "maxItems": 200, + "type": [ + "array", + "null" + ] + }, + "period": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "preset": { + "enum": [ + "last_7_days", + "last_30_days", + "last_90_days", + "this_month", + "last_month", + "this_quarter", + "last_quarter", + "this_year", + "last_year", + "all_time", + null + ], + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "preset" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "from": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": [ + "string", + "null" + ] + }, + "to": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + ], + "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.", + "example": { + "preset": "last_30_days" + } + }, + "position_ids": { + "description": "Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all.", + "items": { + "format": "uuid", + "type": "string" + }, + "maxItems": 200, + "type": [ + "array", + "null" + ] + }, + "without_position": { + "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.", + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" + }, + { + "description": "Applied on top of definition.filters." + } +]
- Changed
update_report1 field changed- changed
Input schema / properties / definition / allOfPrevious value: -[ - { - "additionalProperties": false, - "description": "A custom report: report-wide filters and up to 12 blocks. Read report-catalog first for the dataset, field and measure ids.", - "example": { - "blocks": [ - { - "compare": "previous_period", - "dataset": "interview_results", - "id": "headline", - "measures": [ - "completed", - "avg_score", - "shortlisted" - ], - "type": "kpi" - }, - { - "dataset": "interview_results", - "dimensions": [ - { - "field": "date", - "grain": "week" - } - ], - "id": "trend", - "measures": [ - "completed" - ], - "title": "Completed per week", - "type": "line", - "width": 8 - }, - { - "dataset": "interview_results", - "dimensions": [ - "position" - ], - "id": "by_position", - "limit": 25, - "measures": [ - "completed", - "avg_score", - "shortlisted" - ], - "sort": [ - { - "dir": "desc", - "field": "completed" - } - ], - "title": "By position", - "type": "table" - } - ], - "filters": { - "period": { - "preset": "last_30_days" - } - }, - "schema": "jobmojito.report/v1", - "title": "Weekly hiring pulse" - }, - "properties": { - "blocks": { - "items": { - "additionalProperties": false, - "properties": { - "compare": { - "description": "kpi / funnel only: also return the same numbers for the period before.", - "enum": [ - "previous_period", - null - ], - "type": [ - "string", - "null" - ] - }, - "dataset": { - "description": "Dataset id from report-catalog. Not used by a text block.", - "example": "interview_results", - "type": [ - "string", - "null" - ] - }, - "dimensions": { - "items": { - "anyOf": [ - { - "pattern": "^[a-z][a-z0-9_]{0,40}$", - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "field": { - "pattern": "^[a-z][a-z0-9_]{0,40}$", - "type": [ - "string", - "null" - ] - }, - "grain": { - "description": "For a date field: day (default), week, month, quarter or year.", - "enum": [ - "day", - "week", - "month", - "quarter", - "year", - null - ], - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "field" - ], - "type": "object" - } - ], - "description": "A dimension field id, or {\"field\", \"grain\"} for a date." - }, - "maxItems": 2, - "type": [ - "array", - "null" - ] - }, - "id": { - "example": "by_position", - "pattern": "^[A-Za-z0-9_-]{1,40}$", - "type": [ - "string", - "null" - ] - }, - "limit": { - "description": "Rows for a table / bar / line. Default 100 (line 500).", - "maximum": 500, - "minimum": 1, - "type": [ - "integer", - "null" - ] - }, - "measures": { - "description": "1 to 6 measure ids of the dataset.", - "example": [ - "completed", - "avg_score" - ], - "items": { - "pattern": "^[a-z][a-z0-9_]{0,40}$", - "type": "string" - }, - "maxItems": 6, - "minItems": 1, - "type": [ - "array", - "null" - ] - }, - "sort": { - "items": { - "additionalProperties": false, - "properties": { - "dir": { - "enum": [ - "asc", - "desc", - null - ], - "type": [ - "string", - "null" - ] - }, - "field": { - "description": "A dimension or measure the block selects.", - "pattern": "^[a-z][a-z0-9_]{0,40}$", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "field" - ], - "type": "object" - }, - "maxItems": 3, - "type": [ - "array", - "null" - ] - }, - "text": { - "description": "Text block only: the note (plain text, line breaks kept).", - "maxLength": 4000, - "type": [ - "string", - "null" - ] - }, - "title": { - "maxLength": 120, - "type": [ - "string", - "null" - ] - }, - "type": { - "description": "kpi: one total per measure (no dimensions; add compare previous_period for a change). funnel: 2+ measures as steps (no dimensions). table: 0-2 dimensions. bar: 1-2 dimensions. stacked_bar: exactly 2 dimensions. line: first dimension a date. text: a note, only `text`.", - "enum": [ - "kpi", - "table", - "bar", - "stacked_bar", - "line", - "funnel", - "text", - null - ], - "type": [ - "string", - "null" - ] - }, - "where": { - "items": { - "additionalProperties": false, - "properties": { - "field": { - "description": "A dimension of the block's dataset.", - "pattern": "^[a-z][a-z0-9_]{0,40}$", - "type": [ - "string", - "null" - ] - }, - "op": { - "enum": [ - "eq", - "neq", - "in", - "not_in", - "gt", - "gte", - "lt", - "lte", - "between", - "is_empty", - "is_not_empty", - null - ], - "type": [ - "string", - "null" - ] - }, - "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - }, - "type": "array" - } - ], - "description": "One value for eq / neq / gt / gte / lt / lte, a list for in / not_in, [low, high] for between, nothing for is_empty / is_not_empty." - } - }, - "required": [ - "field", - "op" - ], - "type": "object" - }, - "maxItems": 10, - "type": [ - "array", - "null" - ] - }, - "width": { - "description": "Columns of a 12-column grid. Default 12.", - "maximum": 12, - "minimum": 1, - "type": [ - "integer", - "null" - ] - } - }, - "required": [ - "id", - "type" - ], - "type": "object" - }, - "maxItems": 12, - "type": [ - "array", - "null" - ] - }, - "description": { - "maxLength": 1000, - "type": [ - "string", - "null" - ] - }, - "filters": { - "additionalProperties": false, - "description": "Filters for every block of the report. Each viewer can override them for themselves.", - "properties": { - "include_test": { - "description": "Include test runs. Default false.", - "type": [ - "boolean", - "null" - ] - }, - "interview_ids": { - "description": "Only these interviews (interview ids from list_interviews). Empty or missing = all.", - "items": { - "format": "uuid", - "type": "string" - }, - "maxItems": 200, - "type": [ - "array", - "null" - ] - }, - "period": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "preset": { - "enum": [ - "last_7_days", - "last_30_days", - "last_90_days", - "this_month", - "last_month", - "this_quarter", - "last_quarter", - "this_year", - "last_year", - "all_time", - null - ], - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "preset" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "from": { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": [ - "string", - "null" - ] - }, - "to": { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - } - ], - "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.", - "example": { - "preset": "last_30_days" - } - }, - "position_ids": { - "description": "Only these positions (position ids from list_interviews). Empty or missing = all.", - "items": { - "format": "uuid", - "type": "string" - }, - "maxItems": 200, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" - }, - "schema": { - "description": "Always \"jobmojito.report/v1\".", - "enum": [ - "jobmojito.report/v1", - null - ], - "type": [ - "string", - "null" - ] - }, - "title": { - "maxLength": 120, - "minLength": 1, - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "schema", - "title", - "blocks" - ], - "type": "object" - }, - { - "description": "The whole new definition (it replaces the old one)." - } -]New value: +[ + { + "additionalProperties": false, + "description": "A custom report: report-wide filters and up to 12 blocks. Read report-catalog first for the dataset, field and measure ids.", + "example": { + "blocks": [ + { + "compare": "previous_period", + "dataset": "interview_results", + "id": "headline", + "measures": [ + "completed", + "avg_score", + "shortlisted" + ], + "type": "kpi" + }, + { + "dataset": "interview_results", + "dimensions": [ + { + "field": "date", + "grain": "week" + } + ], + "id": "trend", + "measures": [ + "completed" + ], + "title": "Completed per week", + "type": "line", + "width": 8 + }, + { + "dataset": "interview_results", + "dimensions": [ + "position" + ], + "id": "by_position", + "limit": 25, + "measures": [ + "completed", + "avg_score", + "shortlisted" + ], + "sort": [ + { + "dir": "desc", + "field": "completed" + } + ], + "title": "By position", + "type": "table" + } + ], + "filters": { + "period": { + "preset": "last_30_days" + } + }, + "schema": "jobmojito.report/v1", + "title": "Weekly hiring pulse" + }, + "properties": { + "blocks": { + "items": { + "additionalProperties": false, + "properties": { + "compare": { + "description": "kpi / funnel only: also return the same numbers for the period before.", + "enum": [ + "previous_period", + null + ], + "type": [ + "string", + "null" + ] + }, + "dataset": { + "description": "Dataset id from report-catalog. Not used by a text block.", + "example": "interview_results", + "type": [ + "string", + "null" + ] + }, + "dimensions": { + "items": { + "anyOf": [ + { + "pattern": "^[a-z][a-z0-9_]{0,40}$", + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "field": { + "pattern": "^[a-z][a-z0-9_]{0,40}$", + "type": [ + "string", + "null" + ] + }, + "grain": { + "description": "For a date field: day (default), week, month, quarter or year.", + "enum": [ + "day", + "week", + "month", + "quarter", + "year", + null + ], + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "field" + ], + "type": "object" + } + ], + "description": "A dimension field id, or {\"field\", \"grain\"} for a date." + }, + "maxItems": 2, + "type": [ + "array", + "null" + ] + }, + "id": { + "example": "by_position", + "pattern": "^[A-Za-z0-9_-]{1,40}$", + "type": [ + "string", + "null" + ] + }, + "limit": { + "description": "Rows for a table / bar / line. Default 100 (line 500).", + "maximum": 500, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "measures": { + "description": "1 to 6 measure ids of the dataset.", + "example": [ + "completed", + "avg_score" + ], + "items": { + "pattern": "^[a-z][a-z0-9_]{0,40}$", + "type": "string" + }, + "maxItems": 6, + "minItems": 1, + "type": [ + "array", + "null" + ] + }, + "sort": { + "items": { + "additionalProperties": false, + "properties": { + "dir": { + "enum": [ + "asc", + "desc", + null + ], + "type": [ + "string", + "null" + ] + }, + "field": { + "description": "A dimension or measure the block selects.", + "pattern": "^[a-z][a-z0-9_]{0,40}$", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "maxItems": 3, + "type": [ + "array", + "null" + ] + }, + "text": { + "description": "Text block only: the note (plain text, line breaks kept).", + "maxLength": 4000, + "type": [ + "string", + "null" + ] + }, + "title": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "kpi: one total per measure (no dimensions; add compare previous_period for a change). funnel: 2+ measures as steps (no dimensions). table: 0-2 dimensions. bar: 1-2 dimensions. stacked_bar: exactly 2 dimensions. line: first dimension a date. text: a note, only `text`.", + "enum": [ + "kpi", + "table", + "bar", + "stacked_bar", + "line", + "funnel", + "text", + null + ], + "type": [ + "string", + "null" + ] + }, + "where": { + "items": { + "additionalProperties": false, + "properties": { + "field": { + "description": "A dimension of the block's dataset.", + "pattern": "^[a-z][a-z0-9_]{0,40}$", + "type": [ + "string", + "null" + ] + }, + "op": { + "enum": [ + "eq", + "neq", + "in", + "not_in", + "gt", + "gte", + "lt", + "lte", + "between", + "is_empty", + "is_not_empty", + null + ], + "type": [ + "string", + "null" + ] + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "type": "array" + } + ], + "description": "One value for eq / neq / gt / gte / lt / lte, a list for in / not_in, [low, high] for between, nothing for is_empty / is_not_empty." + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "maxItems": 10, + "type": [ + "array", + "null" + ] + }, + "width": { + "description": "Columns of a 12-column grid. Default 12.", + "maximum": 12, + "minimum": 1, + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "maxItems": 12, + "type": [ + "array", + "null" + ] + }, + "description": { + "maxLength": 1000, + "type": [ + "string", + "null" + ] + }, + "filters": { + "additionalProperties": false, + "description": "Filters for every block of the report. Each viewer can override them for themselves.", + "properties": { + "include_test": { + "description": "Include test runs. Default false.", + "type": [ + "boolean", + "null" + ] + }, + "interview_ids": { + "description": "Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all.", + "items": { + "format": "uuid", + "type": "string" + }, + "maxItems": 200, + "type": [ + "array", + "null" + ] + }, + "period": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "preset": { + "enum": [ + "last_7_days", + "last_30_days", + "last_90_days", + "this_month", + "last_month", + "this_quarter", + "last_quarter", + "this_year", + "last_year", + "all_time", + null + ], + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "preset" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "from": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": [ + "string", + "null" + ] + }, + "to": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + ], + "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.", + "example": { + "preset": "last_30_days" + } + }, + "position_ids": { + "description": "Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all.", + "items": { + "format": "uuid", + "type": "string" + }, + "maxItems": 200, + "type": [ + "array", + "null" + ] + }, + "without_position": { + "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.", + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" + }, + "schema": { + "description": "Always \"jobmojito.report/v1\".", + "enum": [ + "jobmojito.report/v1", + null + ], + "type": [ + "string", + "null" + ] + }, + "title": { + "maxLength": 120, + "minLength": 1, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "schema", + "title", + "blocks" + ], + "type": "object" + }, + { + "description": "The whole new definition (it replaces the old one)." + } +]
7 tool updates
- Added
create_report - Added
get_report - Added
list_report_fields - Added
list_reports - Added
preview_report - Added
run_report - Added
update_report
3 tool updates
- Changed
create_interview2 fields changed- changed
Input schema / properties / interview_type / descriptionPrevious value: -"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.."New value: +"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. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.." - changed
Input schema / properties / interview_type / enumPrevious value: -[ - "pre-screening", - "pre-screening-with-test-questions", - "second-interview", - "remote-freelancer-verification", - "strength-based-interview", - "potential-based-interview", - "process-verification-from-knowledge-base", - null -]New value: +[ + "pre-screening", + "pre-screening-with-test-questions", + "second-interview", + "remote-freelancer-verification", + "strength-based-interview", + "potential-based-interview", + "process-verification-from-knowledge-base", + "knockout-screening", + null +]
- Changed
create_interview_from_questions2 fields changed- changed
Input schema / properties / interview_type / descriptionPrevious value: -"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.."New value: +"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. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.." - changed
Input schema / properties / interview_type / enumPrevious value: -[ - "pre-screening", - "pre-screening-with-test-questions", - "second-interview", - "remote-freelancer-verification", - "strength-based-interview", - "potential-based-interview", - "process-verification-from-knowledge-base", - null -]New value: +[ + "pre-screening", + "pre-screening-with-test-questions", + "second-interview", + "remote-freelancer-verification", + "strength-based-interview", + "potential-based-interview", + "process-verification-from-knowledge-base", + "knockout-screening", + null +]
- Changed
update_interview2 fields changed- changed
Input schema / properties / interview_type / descriptionPrevious value: -"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.."New value: +"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. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.." - changed
Input schema / properties / interview_type / enumPrevious value: -[ - "pre-screening", - "pre-screening-with-test-questions", - "second-interview", - "remote-freelancer-verification", - "strength-based-interview", - "potential-based-interview", - "process-verification-from-knowledge-base", - null -]New value: +[ + "pre-screening", + "pre-screening-with-test-questions", + "second-interview", + "remote-freelancer-verification", + "strength-based-interview", + "potential-based-interview", + "process-verification-from-knowledge-base", + "knockout-screening", + null +]
4 tool updates
- Changed
create_catalogue_directory1 field changed- added
Input schema / properties / translationsAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "content_md": { + "description": "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", + "example": "## 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", + "type": [ + "string", + "null" + ] + }, + "cover_image_url": { + "description": "Cover image for this language. Omit to show the default language's cover.", + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "Card description in this language.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Page title and card name in this language.", + "example": "Obchodný koučing", + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "tags_interview_set_filter": { + "description": "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.", + "example": [ + "sales", + "objection-handling" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "tags_sub": { + "description": "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.", + "example": [ + "sales-coaching-objections-en", + "sales-coaching-closing-en" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "description": "Other language versions of the directory, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version is a page of its own (name, Markdown, session filter, sub-directories) shown to learners who pick that language. A key may not equal `mojito_language_code`.", + "example": { + "sk": { + "name": "Obchodný koučing", + "tags_interview_set_filter": [ + "sales-sk" + ] + } + }, + "type": [ + "object", + "null" + ] +}
- Changed
get_catalogue_directory7 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Id of the catalogue directory to read (the catalogue URL segment)."New value: +"Id of the catalogue directory to read (the catalogue URL segment). The old id of a renamed directory also works; the response carries its current `id`." - added
Input schema / properties / mojito_language_codeAdded value: +{ + "description": "Show `sub_directories` and `matched_sessions` for this language version of the directory (one of its `languages`) instead of the default one - how you verify a translation lists the right sessions.", + "enum": [ + "ar", + "bg", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "fil", + "fi", + "fr", + "de", + "el", + "hi", + "hu", + "id", + "it", + "ja", + "ko", + "ms", + "no", + "pl", + "pt", + "br", + "ro", + "ru", + "sk", + "es", + "sv", + "ta", + "th", + "tr", + "uk", + "vi" + ], + "example": "en", + "type": "string" +} - added
Output schema / properties / languagesAdded value: +{ + "description": "Every language the directory has, the default (`mojito_language_code`) first. `matched_sessions` and `sub_directories` describe the default language unless the request names another one in `mojito_language_code`.", + "example": [ + "en", + "sk" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / merged_intoAdded value: +{ + "description": "Set when this directory was folded into another as one of its language versions: the directory to edit instead. Its old URL redirects there.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / translationsAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "description": "The directory's OTHER language versions, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version here is a page of its own with its own name, Markdown, session filter and sub-directories, shown to learners who pick that language in the catalogue (falling back to English, then the default). A key may not equal `mojito_language_code`.", + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / viewed_languageAdded value: +{ + "description": "The language version `sub_directories` and `matched_sessions` were resolved for: the requested `mojito_language_code`, else the default.", + "example": "sk", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "id", - "name", - "description", - "mojito_language_code", - "visibility", - "status", - "coach_plan", - "cover_image_url", - "merchant_id", - "tags_sub", - "tags_interview_set_filter", - "content_md", - "created_at", - "updated_at", - "catalogue_url", - "is_start_directory", - "sub_directories", - "matched_sessions", - "matched_sessions_truncated" -]New value: +[ + "id", + "name", + "description", + "mojito_language_code", + "visibility", + "status", + "coach_plan", + "cover_image_url", + "merchant_id", + "tags_sub", + "tags_interview_set_filter", + "content_md", + "translations", + "languages", + "viewed_language", + "merged_into", + "created_at", + "updated_at", + "catalogue_url", + "is_start_directory", + "sub_directories", + "matched_sessions", + "matched_sessions_truncated" +]
- Changed
list_catalogue_directories4 fields changed- changed
Input schema / properties / mojito_language_code / descriptionPrevious value: -"Filter by the directory language. Omit for all languages."New value: +"Filter by language: directories whose default language or one of whose language versions is this one. Omit for all languages." - added
Output schema / properties / data / items / properties / languagesAdded value: +{ + "description": "Every language the directory has, its default (`mojito_language_code`) first. Read a version with catalogue-tag-get (`translations`).", + "example": [ + "en", + "sk" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / data / items / properties / merged_intoAdded value: +{ + "description": "Set when this directory was folded into another as one of its language versions (it is archived; its URL redirects there).", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / data / items / requiredPrevious value: -[ - "id", - "has_content_page", - "is_start_directory" -]New value: +[ + "id", + "languages", + "has_content_page", + "is_start_directory" +]
- Changed
update_catalogue_directory2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Id of the directory to update (the catalogue URL segment). The id itself cannot be changed — create a new directory instead."New value: +"Id of the directory to update (the catalogue URL segment). The id itself is not changed here — rename a directory in the admin catalogue editor, which moves every link to it." - added
Input schema / properties / translationsAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "content_md": { + "description": "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", + "example": "## 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", + "type": [ + "string", + "null" + ] + }, + "cover_image_url": { + "description": "Cover image for this language. Omit to show the default language's cover.", + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "Card description in this language.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Page title and card name in this language.", + "example": "Obchodný koučing", + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "tags_interview_set_filter": { + "description": "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.", + "example": [ + "sales", + "objection-handling" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "tags_sub": { + "description": "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.", + "example": [ + "sales-coaching-objections-en", + "sales-coaching-closing-en" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "description": "The directory's OTHER language versions, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version here is a page of its own with its own name, Markdown, session filter and sub-directories, shown to learners who pick that language in the catalogue (falling back to English, then the default). A key may not equal `mojito_language_code`. Only the languages you send change: an object replaces that version, null removes it. Send `translations: null` to remove every version.", + "example": { + "sk": { + "name": "Obchodný koučing", + "tags_interview_set_filter": [ + "sales-sk" + ] + } + }, + "type": [ + "object", + "null" + ] +}
3 tool updates
- Changed
create_interview1 field changed- changed
Input schema / properties / is_embedded / descriptionPrevious value: -"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."New value: +"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. Where it runs depends on the type: interviews, assessments and interview role-plays embed on the interview portal (`https://<interview portal domain>/embed?embed_id=...`); coaching sessions and coaching personas embed on the consumer (coaching) portal (`https://<coaching portal domain>/embed?embed_id=...`, a link built on the interview portal is forwarded there). A signed coaching embed (name, email, signature) signs the visitor in as a learner of that portal, and the session is charged to the merchant's interview credits on completion, not to the learner's coaching credits; it cannot start while the merchant has none."
- Changed
create_persona1 field changed- changed
Input schema / properties / is_embedded / descriptionPrevious value: -"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."New value: +"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, used to sign the iframe link. Where it runs depends on the type: interviews, assessments and interview role-plays embed on the interview portal (`https://<interview portal domain>/embed?embed_id=...`); coaching sessions and coaching personas embed on the consumer (coaching) portal (`https://<coaching portal domain>/embed?embed_id=...`, a link built on the interview portal is forwarded there). A signed coaching embed (name, email, signature) signs the visitor in as a learner of that portal, and the session is charged to the merchant's interview credits on completion, not to the learner's coaching credits; it cannot start while the merchant has none."
- Changed
set_interview_state1 field changed- changed
Input schema / properties / is_embedded / descriptionPrevious value: -"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)."New value: +"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). Where it runs depends on the type: interviews, assessments and interview role-plays embed on the interview portal (`https://<interview portal domain>/embed?embed_id=...`); coaching sessions and coaching personas embed on the consumer (coaching) portal (`https://<coaching portal domain>/embed?embed_id=...`, a link built on the interview portal is forwarded there). A signed coaching embed (name, email, signature) signs the visitor in as a learner of that portal, and the session is charged to the merchant's interview credits on completion, not to the learner's coaching credits; it cannot start while the merchant has none."
1 tool update
- Changed
get_interview_result_details1 field changed- changed
Input schema / properties / view / descriptionPrevious value: -"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."New value: +"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`: every field, including the per-answer raw assessment data — condensed: pronunciation and sentiment scores per recognised segment with the lowest-scoring words, reading/gaze statistics, STT reliability, proctor status and seconds per detected speaker. Word-, character- and frame-level arrays are left out (listed in `_omitted`). Only ask for this if you need those assessment details."
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" + ] +}
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.5 npm8MIT- FlicenseNot gradedqualityBmaintenanceGenerate tailored job descriptions, hire senior developers and pull technical interview questions without leaving the conversation.54-
- 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
- AlicenseNot gradedqualityDmaintenanceIntelligent interview assistant that parses resumes, generates interview questions, records conversations, and produces evaluation reports for technical interviews.9Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.