{"name":"com.jobmojito/jobmojito","slug":"jobmojito","title":"JobMojito","description":"Run AI interviews, simulated personas and coaching sessions on JobMojito.","url":"https://mcp.market/server/jobmojito","rating":null,"grade":"B","score":81,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":26,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-09-16T10:08:38.000Z","license":"NOASSERTION"},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/JobMojito/mcp","website":"https://jobmojito.com","version":"1.3.0","remotes":[{"type":"streamable-http","url":"https://mcp.jobmojito.com/mcp"}],"packages":[],"tools":[{"name":"create_catalogue_directory","description":"[Coaching catalogue] Create a directory (page) in the coaching portal catalogue. A directory nests other directories (`tags_sub`), lists coaching sessions whose own `tags` match its `tags_interview_set_filter`, and can carry a fully custom Markdown page (`content_md`) with `[sessions]`, `[directory:…]`, `[session:…]` and `[plan-progress]` directives. Coaching-platform feature.\n\nCreates 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":["string","null"],"minLength":1,"pattern":"^[a-z0-9]+(?:(?:-|_)+[a-z0-9]+)*$","description":"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`.","example":"sales-coaching-en"},"name":{"type":["string","null"],"minLength":1,"description":"Display name of the directory, shown as the page title and on its card.","example":"Sales coaching"},"description":{"type":["string","null"],"description":"Short description shown on the directory card.","example":"Practice discovery, objection handling and closing."},"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Language of the directory (one of the platform-languages.json codes). The catalogue groups directories by language; defaults to `en` when omitted.","example":"en"},"visibility":{"type":["string","null"],"enum":["public","merchant_public","merchant_invite","merchant_unlisted",null],"description":"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..","example":"merchant_public"},"status":{"type":["string","null"],"enum":["draft","active","archived",null],"description":"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..","example":"active"},"cover_image_url":{"type":["string","null"],"description":"Cover image URL shown on the directory card."},"coach_plan":{"type":["string","null"],"enum":["demo","screening","2nd","3rd","closing","job-specific","other",null],"description":"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..","example":"screening"},"tags_sub":{"items":{"type":"string"},"type":["array","null"],"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"]},"tags_interview_set_filter":{"items":{"type":"string"},"type":["array","null"],"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"]},"content_md":{"type":["string","null"],"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"},"parent_tag":{"type":["string","null"],"description":"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).","example":"home-employee-en"},"merchant_id":{"type":["string","null"],"description":"Merchant that owns the directory. Admin / sub-merchant callers only; otherwise taken from your token.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"}},"required":["id","name"]}},{"name":"create_interview","description":"[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`.\n\nCreates a new interview / coaching / assessment definition, generates its description, questions and candidate expectations via AI, and provisions default steps. Optionally provisions an embed key.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":["string","null"],"minLength":1,"description":"Interview / position name.","example":"Project manager"},"location":{"type":["string","null"],"minLength":1,"description":"Job location.","example":"remote"},"interview_template_id":{"type":["string","null"],"minLength":1,"format":"uuid","description":"Id of the interview template to base this interview on.","example":"baa3bf7c-6926-46fd-9005-16738a31f72d"},"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Platform language code used for the interview. Must be one of the platform-languages.json codes.","example":"en"},"status":{"type":["string","null"],"enum":["draft","active",null],"description":"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..","example":"active"},"type":{"type":["string","null"],"enum":["interview","coaching","assessment",null],"description":"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..","example":"interview"},"visibility":{"type":["string","null"],"enum":["merchant_public","merchant_invite","merchant_unlisted",null],"description":"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..","example":"merchant_public"},"recording":{"type":["string","null"],"enum":["audio_first_5_answers","audio_all","video_all","video_first_5_answers",null],"description":"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..","example":"video_all"},"recording_full_session":{"type":["string","null"],"enum":["audio_all","video_all",null],"description":"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..","example":"video_all"},"interview_type":{"type":["string","null"],"enum":["pre-screening","pre-screening-with-test-questions","second-interview","remote-freelancer-verification","strength-based-interview","potential-based-interview","process-verification-from-knowledge-base",null],"description":"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..","example":"pre-screening-with-test-questions"},"seniority_level":{"type":["string","null"],"enum":["entry-level","intermediate","senior","managerial","director","executive",null],"description":"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..","example":"senior"},"result_view":{"type":["string","null"],"enum":["none","minimal","minimal_with_score","advanced","full","full_expand_scores",null],"description":"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..","example":"full"},"interview_conversation_speed":{"type":["string","null"],"enum":["slower","normal","faster",null],"description":"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..","example":"normal"},"candidate_video_introduction":{"type":["string","null"],"enum":["optional","required",null],"description":"Whether a candidate video introduction is optional or required.","example":"optional"},"interview_tone":{"type":["string","null"],"description":"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.","example":"professional"},"interview_length":{"anyOf":[{"type":"number"},{"type":"string"},{}],"description":"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.","example":8},"interview_attempts":{"type":["number","null"],"maximum":20,"minimum":1,"description":"Allowed candidate attempts (1-20).","example":1},"max_duration":{"type":["number","null"],"description":"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.","example":1200},"max_followups":{"type":["integer","null"],"maximum":999,"minimum":0,"description":"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).","example":2},"questions_random_subset":{"type":["number","null"],"maximum":0.9,"minimum":0.01,"description":"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.","example":0.5},"code":{"type":["string","null"],"description":"Optional external code/reference for the interview.","example":"my code"},"cover_image_url":{"type":["string","null"],"description":"Cover image URL.","example":"https://example.com/cover.png"},"interview_department":{"type":["string","null"],"description":"Department the position belongs to.","example":"Engineering"},"interview_salary":{"type":["string","null"],"description":"Salary range shown for the position.","example":"$80k - $100k"},"interview_available_till":{"type":["string","null"],"description":"ISO date/time after which the interview is no longer available to candidates. null keeps it always available.","example":"2026-12-31"},"recruiter_profile_id":{"type":["string","null"],"description":"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"hiring_for_company":{"properties":{"name":{"type":["string","null"],"description":"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name.","example":"Unimo Enterprises"},"description":{"type":["string","null"],"description":"Short description of the end employer, used as background context by the agent.","example":"Unimo Enterprises is a leading logistics and supply chain solutions provider."},"location":{"type":["string","null"],"description":"Primary location of the end employer.","example":"Sri Lanka"},"sector":{"type":["string","null"],"description":"Industry / sector of the end employer.","example":"Logistics and Supply Chain"},"company_size":{"type":["string","null"],"description":"Approximate headcount of the end employer.","example":"100-200"}},"type":["object","null"],"description":"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.","example":{"name":"undisclosed"}},"tags":{"items":{"type":"string"},"type":["array","null"],"description":"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.","example":["interview-practice","sales"]},"merchant_id":{"type":["string","null"],"description":"Merchant id. Admin / sub-merchant callers only; otherwise taken from your token.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"knowledge_base_store_id":{"type":["string","null"],"description":"Knowledge base store id to source additional context from."},"description":{"type":["string","null"],"description":"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.","example":"Backend role focused on Python, async APIs, and AWS."},"description_long":{"type":["string","null"],"description":"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"},"candidate_expectations":{"type":["string","null"],"description":"Free-text candidate expectations folded into AI generation."},"welcome_message":{"type":["string","null"],"description":"Custom welcome message shown to the candidate."},"thank_you_message":{"type":["string","null"],"description":"Custom thank-you message shown after the interview."},"additional_context":{"additionalProperties":{},"type":["object","null"],"description":"Arbitrary additional context object merged into AI generation."},"instructional_video_custom_text":{"type":["string","null"],"description":"Custom narration text for the instructional video."},"is_embedded":{"type":["boolean","null"],"description":"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.","example":false},"include_rapport_question":{"type":["boolean","null"],"description":"Include an opening rapport question. Defaults to false.","example":true},"include_closing_prompt":{"type":["boolean","null"],"description":"Include a closing prompt. Defaults to true.","example":true},"instructional_video":{"type":["boolean","null"],"description":"Show an instructional video before approval. Defaults to false.","example":true},"use_enhanced_expectations":{"type":["boolean","null"],"description":"Reserved flag passed through to generation."},"required_pronunciation":{"type":["boolean","null"],"description":"Require pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false.","example":false},"result_enable_edit_transcript":{"type":["boolean","null"],"description":"Allow editing the transcript on the result view. Defaults to true.","example":true},"custom_scoring":{"additionalProperties":{},"type":["object","null"],"description":"Custom result-scoring overrides merged with defaults and template overrides."},"pdf_export_auto_config":{"properties":{"mojito_language_code":{"type":["string","null"],"description":"Report language code (platform-languages.json code).","example":"en"},"contact_details":{"type":["boolean","null"],"description":"Include candidate contact details."},"ai_recruiter_assessment":{"type":["boolean","null"],"description":"Include the AI recruiter assessment."},"ai_scoring_rubric":{"type":["boolean","null"],"description":"Include the AI scoring rubric."},"analytics":{"type":["boolean","null"],"description":"Include analytics."},"files":{"type":["boolean","null"],"description":"Include uploaded candidate files."},"transcript":{"type":["boolean","null"],"description":"Include the interview transcript."},"answer_recording":{"type":["boolean","null"],"description":"Include per-answer recordings."},"session_recording":{"type":["boolean","null"],"description":"Include the full-session recording."},"group_by_question":{"type":["boolean","null"],"description":"Group transcript answers by expected question."},"template":{"type":["string","null"],"enum":["classic","modern","one_pager",null],"description":"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."}},"type":["object","null"],"description":"Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export."}},"required":["name","location","interview_template_id","mojito_language_code","status","type","visibility"]}},{"name":"create_interview_from_questions","description":"[Interviews] Create a new interview from an explicit array of questions.\n\nCreates 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":["string","null"],"minLength":1,"description":"Interview/position name.","example":"Project manager"},"location":{"type":["string","null"],"minLength":1,"description":"Interview location.","example":"remote"},"interview_template_id":{"type":["string","null"],"minLength":1,"description":"Id of the interview template to use. Must reference an existing interview_templates row.","example":"46b98d37-1557-4391-beca-03037ead19f2"},"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Platform language code (one of the platform-languages.json codes); must also resolve to a supported language with an Azure speech mapping.","example":"en"},"description":{"type":["string","null"],"minLength":1,"description":"Short interview description.","example":"Project manager role"},"status":{"type":["string","null"],"enum":["draft","active",null],"description":"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..","example":"active"},"type":{"type":["string","null"],"enum":["interview","coaching","assessment",null],"description":"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..","example":"interview"},"visibility":{"type":["string","null"],"enum":["merchant_public","merchant_invite","merchant_unlisted",null],"description":"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..","example":"merchant_public"},"questions":{"items":{"properties":{"question":{"type":["string","null"],"description":"The question text shown to the candidate."},"id":{"type":["string","null"],"description":"Identifier for this question. job-interview-get returns the question's real id here; send it back to job-interview-update so an unchanged question keeps its existing record (and with it its answer rules and any rendered avatar video). Also the handle another question references via conditional_question_main_id. On job-interview-create-from-array it is a caller-local value, only needed for those references."},"duration":{"type":["number","null"],"description":"Answer duration in seconds for this question."},"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted.","example":"en"},"label":{"type":["string","null"],"description":"Optional label/tag stored on the question."},"is_conditional":{"type":["boolean","null"],"description":"Conditional follow-up question (view 'with listening conditional'). Use with conditional_question_main_id."},"is_without_scoring":{"type":["boolean","null"],"description":"Question is asked but not scored (view 'without scoring')."},"is_candidate_asking_recruiter":{"type":["boolean","null"],"description":"Candidate-asks-recruiter prompt (view 'candidate asking recruiter')."},"is_expert":{"type":["boolean","null"],"description":"Expert listening question (view 'with listening expert')."},"is_multiple_choice":{"type":["boolean","null"],"description":"Multiple-choice question (view 'multiple choice')."},"question_alternatives":{"items":{"type":"string"},"type":["array","null"],"description":"Alternative phrasings for the question."},"conditional_question_main_id":{"type":["string","null"],"description":"For a conditional question, the id (the \"id\" field above) of the parent question in this same array that triggers it. The parent must appear earlier in the array than the conditional question referencing it."},"knowledge_base_id":{"type":["string","null"],"description":"Knowledge-base store id (uuid) the question draws context from."},"external_id":{"type":["string","null"],"description":"External identifier stored on the question. job-interview-update matches on this first, so an ATS that owns stable ids can send its own array and have the diff line up without round-tripping our ids."},"external_data":{"additionalProperties":{},"type":["object","null"],"description":"Arbitrary JSON metadata stored on the question."},"candidate_expectations_json":{"properties":{"weak":{"items":{"type":"string"},"type":["array","null"],"description":"Baseline requirements every viable candidate should meet (table stakes)."},"moderate":{"items":{"type":"string"},"type":["array","null"],"description":"Requirements expected of a solid, competent candidate."},"strong":{"items":{"type":"string"},"type":["array","null"],"description":"High-bar requirements only standout candidates clear."}},"type":["object","null"],"description":"Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved."}},"additionalProperties":{},"type":"object","required":["question"]},"type":["array","null"],"minItems":1,"description":"Ordered list of interview questions to create as steps."},"recording":{"type":["string","null"],"enum":["audio_first_5_answers","audio_all","video_all","video_first_5_answers",null],"description":"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..","example":"video_all"},"recording_full_session":{"type":["string","null"],"enum":["audio_all","video_all",null],"description":"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..","example":"video_all"},"interview_type":{"type":["string","null"],"enum":["pre-screening","pre-screening-with-test-questions","second-interview","remote-freelancer-verification","strength-based-interview","potential-based-interview","process-verification-from-knowledge-base",null],"description":"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..","example":"pre-screening-with-test-questions"},"seniority_level":{"type":["string","null"],"enum":["entry-level","intermediate","senior","managerial","director","executive",null],"description":"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..","example":"senior"},"result_view":{"type":["string","null"],"enum":["none","minimal","minimal_with_score","advanced","full","full_expand_scores",null],"description":"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..","example":"full"},"interview_conversation_speed":{"type":["string","null"],"enum":["slower","normal","faster",null],"description":"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..","example":"normal"},"candidate_video_introduction":{"type":["string","null"],"enum":["optional","required",null],"description":"Whether a candidate video introduction is optional or required."},"interview_tone":{"type":["string","null"],"description":"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.","example":"professional"},"interview_attempts":{"type":["number","null"],"description":"Allowed attempts, 1-20.","example":1},"questions_random_subset":{"type":["number","null"],"description":"Fraction of questions to randomly ask, between 0.01 and 0.9."},"max_followups":{"type":["integer","null"],"maximum":999,"minimum":0,"description":"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).","example":2},"code":{"type":["string","null"],"description":"Optional external code/reference."},"cover_image_url":{"type":["string","null"],"description":"Cover image URL."},"interview_department":{"type":["string","null"],"description":"Department the position belongs to.","example":"Engineering"},"interview_salary":{"type":["string","null"],"description":"Salary range shown for the position.","example":"$80k - $100k"},"interview_available_till":{"type":["string","null"],"description":"ISO date/time after which the interview is no longer available to candidates. null keeps it always available.","example":"2026-12-31"},"recruiter_profile_id":{"type":["string","null"],"description":"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant."},"hiring_for_company":{"properties":{"name":{"type":["string","null"],"description":"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name.","example":"Unimo Enterprises"},"description":{"type":["string","null"],"description":"Short description of the end employer, used as background context by the agent.","example":"Unimo Enterprises is a leading logistics and supply chain solutions provider."},"location":{"type":["string","null"],"description":"Primary location of the end employer.","example":"Sri Lanka"},"sector":{"type":["string","null"],"description":"Industry / sector of the end employer.","example":"Logistics and Supply Chain"},"company_size":{"type":["string","null"],"description":"Approximate headcount of the end employer.","example":"100-200"}},"type":["object","null"],"description":"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.","example":{"name":"undisclosed"}},"tags":{"items":{"type":"string"},"type":["array","null"],"description":"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.","example":["interview-practice","sales"]},"required_pronunciation":{"type":["boolean","null"],"description":"Require pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false.","example":false},"result_enable_edit_transcript":{"type":["boolean","null"],"description":"Allow editing the transcript on the result view. Defaults to true.","example":true},"pdf_export_auto_config":{"properties":{"mojito_language_code":{"type":["string","null"],"description":"Report language code (platform-languages.json code).","example":"en"},"contact_details":{"type":["boolean","null"],"description":"Include candidate contact details."},"ai_recruiter_assessment":{"type":["boolean","null"],"description":"Include the AI recruiter assessment."},"ai_scoring_rubric":{"type":["boolean","null"],"description":"Include the AI scoring rubric."},"analytics":{"type":["boolean","null"],"description":"Include analytics."},"files":{"type":["boolean","null"],"description":"Include uploaded candidate files."},"transcript":{"type":["boolean","null"],"description":"Include the interview transcript."},"answer_recording":{"type":["boolean","null"],"description":"Include per-answer recordings."},"session_recording":{"type":["boolean","null"],"description":"Include the full-session recording."},"group_by_question":{"type":["boolean","null"],"description":"Group transcript answers by expected question."},"template":{"type":["string","null"],"enum":["classic","modern","one_pager",null],"description":"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."}},"type":["object","null"],"description":"Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export."},"knowledge_base_store_id":{"type":["string","null"],"description":"Optional knowledge base store id; validated for existence."},"merchant_id":{"type":["string","null"],"description":"Target merchant id (admins / sub-merchant only)."},"description_long":{"type":["string","null"],"description":"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"},"candidate_expectations":{"type":["string","null"],"description":"Free-text candidate expectations."},"candidate_expectations_json":{"properties":{"weak":{"items":{"type":"string"},"type":["array","null"],"description":"Baseline requirements every viable candidate should meet (table stakes)."},"moderate":{"items":{"type":"string"},"type":["array","null"],"description":"Requirements expected of a solid, competent candidate."},"strong":{"items":{"type":"string"},"type":["array","null"],"description":"High-bar requirements only standout candidates clear."}},"type":["object","null"],"description":"Pre-generated candidate expectations, bucketed by requirement level (weak/moderate/strong); auto-generated when omitted for type=interview. Extra keys are preserved."},"custom_scoring":{"additionalProperties":{},"type":["object","null"],"description":"Custom scoring overrides merged with defaults."},"additional_context":{"additionalProperties":{},"type":["object","null"],"description":"Extra context forwarded to expectation generation."},"instructional_video":{"type":["boolean","null"],"description":"Enable an instructional video before approval."},"instructional_video_custom_text":{"type":["string","null"],"description":"Custom text for the instructional video."},"disable_deduplication":{"type":["boolean","null"],"description":"When true, skip step deduplication on insert."},"welcome_message":{"type":["string","null"],"description":"Custom welcome message."},"thank_you_message":{"type":["string","null"],"description":"Custom thank-you message."},"is_embedded":{"type":["boolean","null"],"description":"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."}},"required":["name","location","interview_template_id","mojito_language_code","description","status","type","visibility","questions"]}},{"name":"create_persona","description":"[Interviews] Create a role-play persona: an avatar that plays a defined role in a free-form conversation instead of a scored Q&A interview. FIRST CHOOSE `portal`, because it selects between two different products: `portal=\"interview\"` builds a SIMULATED PERSONA a recruiter invites candidates to — scored, billed to merchant credits, and listed with the recruiter's other results; `portal=\"coaching\"` (THE DEFAULT) builds a coaching persona learners start themselves from the catalogue, billed to their own coaching credits and never visible to recruiters. Pass `portal=\"interview\"` explicitly for any hiring, screening or assessment use. Then set `persona_role_avatar`/`persona_role_user` for the roles and `opening_line` for the avatar's first spoken line (defaults to a generic 'Hello').\n\nFIRST DECIDE `portal`. This endpoint creates two different products and the default is NOT the recruiter one:\n- `portal: \"interview\"` — an INTERVIEW ROLE-PLAY. Use this whenever the goal is to ASSESS or SCREEN candidates: hiring, assessments, sales role-plays for job applicants, anything a recruiter runs. Candidates are invited through the normal invitation flow, results appear in the recruiter's result list, it is billed against merchant credits, and attempts are capped via `interview_attempts` — exactly like an interview.\n- `portal: \"coaching\"` (THE DEFAULT) — a coaching persona for practice/training on the coaching portal. Consumed against the mentee's own coaching credits, self-started from the catalogue, and its results are NOT visible to recruiters. Omitting `portal` gives you this one, so pass `portal: \"interview\"` explicitly for any recruiting/assessment use case.\nThe conversation itself behaves identically in both.\n\nThe 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":["string","null"],"minLength":1,"description":"Persona / session name.","example":"Difficult customer role-play"},"interview_template_id":{"type":["string","null"],"minLength":1,"format":"uuid","description":"Id of the interview template (avatar) the persona uses.","example":"baa3bf7c-6926-46fd-9005-16738a31f72d"},"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Platform language code used for the conversation. Must be one of the platform-languages.json codes.","example":"en"},"status":{"type":["string","null"],"enum":["draft","active",null],"description":"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..","example":"active"},"visibility":{"type":["string","null"],"enum":["merchant_public","merchant_invite","merchant_unlisted",null],"description":"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..","example":"merchant_public"},"description":{"type":["string","null"],"description":"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.","example":"A quick sales role-play with an unhappy customer. Your goal is to resolve their complaint and keep the account."},"persona_role_avatar":{"type":["string","null"],"minLength":1,"description":"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'.","example":"is to act as a happy customer responding to questions"},"persona_role_user":{"type":["string","null"],"minLength":1,"description":"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'.","example":"is to be a sales person trying to sell an additional product to the customer"},"persona_avatar_who_is":{"type":["string","null"],"description":"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."},"persona_avatar_knowledge":{"type":["string","null"],"description":"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."},"persona_avatar_end_conditions":{"type":["string","null"],"description":"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."},"persona_avatar_progress":{"type":["string","null"],"description":"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.","example":"Mode: turning point\nInitial hold: ...\nUnlocks when: ...\nAfter unlock: ...\nHard limits: ...\nNo goalposts: ...\nGates: ..."},"opening_line":{"type":["string","null"],"description":"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.","example":"Oh, finally — someone actually comes over! I've been waiting for ages. Are you going to help me or not?"},"candidate_expectations":{"type":["string","null"],"maxLength":2100,"description":"Mentee assessment goals — free-text describing what the candidate is expected to achieve (max 2100 chars)."},"recording":{"type":["string","null"],"enum":["audio_first_5_answers","audio_all","video_all","video_first_5_answers",null],"description":"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..","example":"video_all"},"recording_full_session":{"type":["string","null"],"enum":["audio_all","video_all",null],"description":"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..","example":"video_all"},"result_view":{"type":["string","null"],"enum":["none","minimal","minimal_with_score","advanced","full","full_expand_scores",null],"description":"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..","example":"full"},"interview_conversation_speed":{"type":["string","null"],"enum":["slower","normal","faster",null],"description":"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..","example":"normal"},"candidate_video_introduction":{"type":["string","null"],"enum":["optional","required",null],"description":"Whether a candidate video introduction is optional or required.","example":"optional"},"max_duration":{"type":["number","null"],"description":"Maximum conversation duration in seconds. Defaults to 1200 (20 min) when omitted.","example":1200},"code":{"type":["string","null"],"description":"Optional external code/reference for the persona.","example":"my code"},"cover_image_url":{"type":["string","null"],"description":"Cover image URL.","example":"https://example.com/cover.png"},"interview_location":{"type":["string","null"],"description":"Optional location label shown for the session.","example":"remote"},"merchant_id":{"type":["string","null"],"description":"Merchant id. Admin / sub-merchant callers only; otherwise taken from your token.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"recruiter_profile_id":{"type":["string","null"],"description":"Profile id of the recruiter owning this persona. Must be a merchant/merchant_owner/admin profile of the same merchant."},"welcome_message":{"type":["string","null"],"description":"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.","example":"Welcome! You are about to speak with a customer who is unhappy about a recent price increase."},"thank_you_message":{"type":["string","null"],"description":"Custom thank-you message shown after the session — set it; omitting it leaves a generic platform default.","example":"Thanks — your role-play has been recorded and will be reviewed by the hiring team."},"tags":{"items":{"type":"string"},"type":["array","null"],"description":"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.","example":["interview-practice","sales"]},"portal":{"type":["string","null"],"enum":["coaching","interview",null],"description":"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.","example":"interview"},"interview_attempts":{"type":["number","null"],"maximum":20,"minimum":1,"description":"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.","example":3},"is_embedded":{"type":["boolean","null"],"description":"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.","example":false}},"required":["name","interview_template_id","mojito_language_code","status","visibility","persona_role_avatar","persona_role_user"]}},{"name":"generate_interview_report","description":"[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.\n\nGenerates 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"interview_result_id":{"type":["string","null"],"format":"uuid","example":"93c98d21-e04d-4a84-9afa-ed154cf73636"},"interview_result_ids":{"items":{"type":"string","format":"uuid"},"type":["array","null"],"description":"Generate a single combined report for multiple results."},"export_type":{"type":["string","null"],"enum":["pdf","html","json",null]},"export_features_result":{"properties":{"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Report language. Optional: if omitted, the report uses each result's own language code. If provided and it differs from the result's language, the report content is translated, which costs 0.1 credit per result.","example":"en"},"contact_details":{"type":["boolean","null"],"description":"Include the candidate's contact details (email, LinkedIn, phone number, physical address).","default":true},"ai_recruiter_assessment":{"type":["boolean","null"],"description":"Include the AI recruiter assessment: resume analysis, overall AI analysis, and the why-hire / why-not-hire summaries.","default":true},"ai_scoring_rubric":{"type":["boolean","null"],"description":"Include the AI scoring rubric — the candidate-expectation buckets (strong / moderate / weak). Only takes effect when ai_recruiter_assessment is also true.","default":false},"analytics":{"type":["boolean","null"],"description":"Include speech analytics for each answer (speech accuracy, fluency, recognition confidence, sentiment, cadence / words-per-minute).","default":true},"transcript":{"type":["boolean","null"],"description":"Include the full interview transcript: each question, the candidate answer, and the per-answer AI analysis.","default":true},"files":{"type":["boolean","null"],"description":"Include the candidate's uploaded files (resume and cover letter) as signed page URLs.","default":true},"answer_recording":{"type":["boolean","null"],"description":"Include a signed recording URL (audio/video) for each individual answer.","default":false},"session_recording":{"type":["boolean","null"],"description":"Include the full interview session recording and the video introduction as signed URLs.","default":false},"group_by_question":{"type":["boolean","null"],"description":"Group answers under their expected questions (instead of chronological order), including questions that were not reached.","default":false},"template":{"type":"string","enum":["classic","modern","one_pager"],"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.","example":"modern"}},"type":"object"},"template":{"allOf":[{"type":"string","enum":["classic","modern","one_pager"],"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.","example":"modern"},{"description":"Report layout: `classic`, `modern` or `one_pager`. Omit for the merchant default (modern when unset)."}]},"store_file":{"type":["boolean","null"],"description":"When true (pdf only), persist the file to storage and return a signed URL."}},"required":["export_type"]}},{"name":"generate_interview_url","description":"[Interviews] Generate a signed public interview URL/token.\n\nGenerates a public, token-signed URL for an existing interview, profile, or result. The required id fields depend on `type`.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"type":{"type":["string","null"],"enum":["interview-for-profile","results-for-profile","interview-result-candidate","interview-result-talent-seeker","interview-results-for-position",null],"description":"Which kind of signed URL to generate."},"merchant_id":{"type":["string","null"],"description":"Override merchant id (admin / sub-merchant only)."},"interview_profile_id":{"type":["string","null"],"description":"Candidate profile id. Required for interview-for-profile and results-for-profile."},"interview_id":{"type":["string","null"],"description":"Interview or position id. Required for interview-for-profile and interview-results-for-position."},"interview_result_id":{"type":["string","null"],"description":"Interview result id. Required for interview-result-candidate and interview-result-talent-seeker."},"hide_menu":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Pass the string 'false' to show the navigation menu; any other value hides it (default)."}},"required":["type"]}},{"name":"get_catalogue_directory","description":"[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.\n\nReads 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"Id of the catalogue directory to read (the catalogue URL segment).","example":"sales-coaching-en"},"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"}},"required":["id"]}},{"name":"get_documentation","description":"Fetch the full content of a single JobMojito documentation page.\n\nAccepts a URL returned by `search_documentation`. For developer docs the\nclean Markdown (.md) variant is fetched automatically. Only\ndeveloper.jobmojito.com and help.jobmojito.com URLs are allowed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The documentation page URL."},"max_chars":{"default":20000,"type":"integer","description":"Truncate content to this many characters (default 20000)."}},"required":["url"],"additionalProperties":false}},{"name":"get_interview_definition","description":"[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.\n\nRetrieves 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"position_id":{"type":"string","minLength":1,"format":"uuid","description":"Identifier of either an interview definition (single-stage) or a position definition (multi-stage). The function resolves whichever matches.","example":"00000000-0000-0000-0000-000000000000"}},"required":["position_id"]}},{"name":"get_interview_result_details","description":"[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.\n\nReturns an interview result with its full transcript and AI assessment. Optionally attaches signed recording URLs.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"interview_result_id":{"type":"string","minLength":1,"format":"uuid","description":"The interview result to fetch the transcript and details for.","example":"93c98d21-e04d-4a84-9afa-ed154cf73636"},"get_signed_recordings":{"type":"string","enum":["true","false"],"description":"When true, includes short-lived signed recording URLs for the session, the video introduction, and each transcript answer.","default":"false","example":"false"},"view":{"type":"string","enum":["summary","standard","full"],"description":"How much of the record to return. Handled by the MCP server, not the JobMojito API — it only narrows the response, never the query.\n\n- `summary`: scores, the overall AI analysis, and each question with the candidate's answer — no per-answer AI commentary, recording paths or raw assessment data. Use this to review or compare candidates.\n- `standard`: everything a human reviewer reads: the full transcript with per-answer analysis, scores and recordings, minus the raw machine assessment blobs. This is the default.\n- `full`: the API response verbatim, including the raw per-answer pronunciation/sentiment data. Large — a long interview can exceed the result limit and fail. Only ask for this if you need those raw fields.","default":"standard"}},"required":["interview_result_id"]}},{"name":"get_merchant_analytics","description":"[Results] Get the merchant's daily event analytics.\n\nDaily 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"date_from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Start of the date range (inclusive), YYYY-MM-DD.","example":"2026-01-01"},"date_to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"End of the date range (inclusive), YYYY-MM-DD.","example":"2026-01-01"},"interview_id":{"type":"string","format":"uuid","description":"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."},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":50,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":["date_from","date_to"]}},{"name":"get_merchant_credit_usage","description":"[Results] Get the merchant's credit usage.\n\nPer-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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"interview_id":{"type":"string","format":"uuid","description":"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)."},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":50,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":[]}},{"name":"get_merchant_status","description":"[Admin] Get a merchant status snapshot: credit balances, subscription, pending-work counts, candidate/result totals, and invitation headroom.\n\nStatus 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"}},"required":[]}},{"name":"jobmojito_configuration","description":"Show the interactive JobMojito merchant picker (UI).\n\nALWAYS call this when the user wants to choose, switch, or set a\nmerchant, or when a tool needs a `merchant_id` and none is selected.\nIt renders a searchable picker with clickable options. Do NOT list\nmerchants as text or ask the user to type a name — render this\npicker instead. After calling it, STOP and wait for the user's\nselection; then pass `merchant_id=<chosen id>` on every JobMojito\ncall (omit it for the user's own account).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"list_avatars","description":"[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`.\n\nPaginated 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"type":{"type":"string","enum":["interactive_heygen","interactive_elevenlabs","interactive_spatius","offline_heygen","offline_elai","offline_synthesia"],"description":"Filter by avatar template type. Omit for all.","example":"interactive_heygen"},"status":{"type":"string","enum":["active","draft","archived","deleted"],"description":"Filter by status. Omit for all except archived (see include_archived).","example":"active"},"mojito_language_code":{"type":"string","description":"Filter by platform language code."},"filter_text":{"type":"string","description":"Case-insensitive search on template name or voice language name."},"include_archived":{"type":"string","enum":["true","false"],"description":"Include archived templates (excluded by default).","default":"false","example":"false"},"include_public":{"type":"string","enum":["true","false"],"description":"Also include public templates shared across merchants, in addition to this merchant's own.","default":"false","example":"false"},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":15,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":[]}},{"name":"list_candidates","description":"[Candidates] List the merchant's candidates.\n\nPaginated 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"tab":{"type":"string","enum":["interview","pre-screening","no-action","leads",""],"description":"Filter candidates by recent activity. Omit (or empty) to include all.","example":"interview"},"source":{"type":"string","enum":["invited","registered"],"description":"Filter by how the candidate entered: invited or self-registered. Omit for both.","example":"registered"},"order_by":{"type":"string","enum":["name_accending","name_decending","created_at_newest","created_at_oldest"],"description":"Sort order of the result set.","default":"created_at_newest","example":"created_at_newest"},"filter_text":{"type":"string","description":"Case-insensitive search on candidate name or email."},"filter_emoji":{"type":"string","description":"Filter by the candidate emoji marker."},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":50,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":[]}},{"name":"list_catalogue_directories","description":"[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.\n\nPaginated 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"status":{"type":"string","enum":["draft","active","archived"],"description":"Filter by lifecycle status. Omit to include every status you can see (deleted directories are never returned).","example":"active"},"visibility":{"type":"string","enum":["public","merchant_public","merchant_invite","merchant_unlisted"],"description":"Filter by visibility.","example":"merchant_public"},"mojito_language_code":{"type":"string","description":"Filter by the directory language (a platform-languages.json code, e.g. `en`)."},"filter_text":{"type":"string","description":"Case-insensitive search on the directory id, name and description."},"parent_tag":{"type":"string","description":"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."},"include_public":{"type":"string","enum":["true","false"],"description":"Include the platform-wide `public` directories shared across merchants.","default":"true","example":"true"},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":25,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":[]}},{"name":"list_interview_results","description":"[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`.\n\nPaginated 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"type":{"type":"string","enum":["interview","coaching","assessment","public_avatar","persona","persona_interview"],"description":"Product type of results to list.","default":"interview","example":"interview"},"tab":{"type":"string","enum":["decided-rejected","undecided","shortlist","decided-selected","completed","incomplete","archived-interview","public_avatar","archived-public_avatar",""],"description":"Filter by decision/completion state. Omit (or empty) to include all.","example":"undecided"},"step":{"type":"string","enum":["pre-screening","interview"],"description":"Filter by pipeline step (pre-screening vs interview). Omit for both.","example":"interview"},"interview_id":{"type":"string","format":"uuid","description":"Filter to a single interview definition id."},"profile_interview_id":{"type":"string","format":"uuid","description":"Filter to a single candidate (profile_interview) id."},"risks":{"type":"string","description":"Comma-separated list of recruiter-risk keys to filter by (matches any)."},"order_by":{"type":"string","enum":["score","created_at_newest","created_at_oldest","updated_at_newest"],"description":"Sort order of the result set.","default":"created_at_newest","example":"created_at_newest"},"filter_text":{"type":"string","description":"Case-insensitive search on candidate name or email."},"filter_emoji":{"type":"string","description":"Filter by the candidate emoji marker."},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":20,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":[]}},{"name":"list_interviews","description":"[Interviews] List the merchant's interview definitions.\n\nPaginated 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"type":{"type":"string","enum":["interview","coaching","assessment","public_avatar","persona","persona_interview"],"description":"Product type of interviews to list.","default":"interview","example":"interview"},"status":{"type":"string","enum":["draft","active","archived","deleted","preparing","completed"],"description":"Filter by lifecycle status. Omit to include all statuses.","example":"active"},"show_public":{"type":"string","enum":["true","false"],"description":"Include interviews shared publicly across merchants (coaching/avatars).","default":"false","example":"false"},"show_demo":{"type":"string","enum":["true","false"],"description":"Include demo/sample interviews.","default":"false","example":"false"},"filter_text":{"type":"string","description":"Case-insensitive search on the interview name."},"filter_emoji":{"type":"string","description":"Filter by the interview emoji marker."},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":50,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":[]}},{"name":"list_languages","description":"[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.\n\nReturns 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[]}},{"name":"list_my_merchants","description":"FALLBACK merchant list for clients WITHOUT UI support.\n\nDo NOT use this to choose or switch merchants when a UI is available —\ncall `jobmojito_configuration` instead (it renders an interactive picker),\nand do not hand-format a merchant list as text. Use this tool only when the\nclient cannot render MCP App UI. Returns the user's own account plus any\nsub-merchants; after a pick, pass `merchant_id=<chosen id>` on subsequent\ncalls (OMIT for the own account).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"search":{"default":"","type":"string","description":"Optional case-insensitive filter on sub-merchant name."}},"additionalProperties":false}},{"name":"list_sub_merchants","description":"[Admin] List sub-merchants under the merchant account.\n\nPaginated 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"merchant_id":{"type":"string","format":"uuid","description":"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant.","example":"28106cba-1c27-4e53-b149-32113e5e8e31"},"order_by":{"type":"string","enum":["name","created_at_newest","created_at_oldest"],"description":"Sort order of the result set.","default":"created_at_newest","example":"created_at_newest"},"filter_text":{"type":"string","description":"Case-insensitive search on the sub-merchant name."},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return (1–1000).","default":50,"example":50},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip from the start of the result set.","default":0,"example":0}},"required":[]}},{"name":"register_users_for_interview","description":"[Interviews] Register users/candidates for a specific interview and return their personal interview links.\n\nRegisters (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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"users":{"items":{"properties":{"name":{"type":["string","null"],"description":"Display name of the candidate.","example":"Peter Parker"},"email":{"type":["string","null"],"description":"Email used to identify and invite the candidate. Validated per item, not request-level.","example":"peter.parker@example.com"},"external_id":{"type":["string","null"],"description":"Optional caller-supplied id, stored on the candidate profile.","example":"abcd"}},"type":"object"},"type":["array","null"],"description":"Candidates to register for the interview. Each gets a one-time interview URL.","example":[{"name":"Peter Parker","email":"peter.parker@example.com","external_id":"abcd"},{"name":"Mary Jane Watson","email":"mary.jane@example.com"}]},"interview_id":{"type":["string","null"],"minLength":1,"format":"uuid","description":"Interview definition (interview_def_set) or position (position_def_set) id to register users for.","example":"04e09fa5-3fb8-4236-b37d-fca2bcd1cb66"},"merchant_id":{"type":["string","null"],"format":"uuid","description":"Merchant id. Required when authenticating with the service key; for user tokens it is optional and only honored for admin / sub-merchant accounts.","example":"b5201178-46dd-4a20-a1af-7ffd647f834b"},"send_email":{"type":["boolean","null"],"description":"Whether to send an invitation email to each registered candidate."},"hide_menu":{"anyOf":[{"type":"boolean"},{"type":"string"},{}],"description":"When true (or the string \"true\"), the interview UI hides its menu (view_hm)."},"hide_iframe":{"anyOf":[{"type":"boolean"},{"type":"string"},{}],"description":"When true (or the string \"true\"), the interview UI hides its iframe chrome (view_hi)."},"is_test":{"anyOf":[{"type":"boolean"},{"type":"string"},{}],"description":"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\"."}},"required":["users","interview_id"]}},{"name":"request_another_interview_attempt","description":"[Results] Re-open a submitted interview result so the candidate can retry.\n\nMarks a submitted (active + completed) interview result as unsuccessful so the candidate can retake it. Resets the result to draft and clears the recruiter decision.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"interview_result_id":{"type":["string","null"],"minLength":1,"format":"uuid","description":"The interview result to reopen for another attempt.","example":"93c98d21-e04d-4a84-9afa-ed154cf73636"}},"required":["interview_result_id"]}},{"name":"search_documentation","description":"Search ALL JobMojito documentation. This is the single entry point.\n\nOne call searches both documentation sources in parallel and returns a\nmerged, source-labeled list — you do not need to choose a source or call\na separate tool:\n  • \"developer\" — developer.jobmojito.com: API reference, request/response\n    schemas, tables, webhooks, code examples, integration guides.\n  • \"help\" — help.jobmojito.com: recruiter, candidate, and administrator\n    product guides (how the platform behaves for end users).\n\nUse this whenever you need to understand how a feature, endpoint, field,\nor workflow works — including before calling an action tool you're unsure\nabout. Then call `get_documentation(url)` with a returned URL to read the\nfull page.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language search query or keywords."},"source":{"default":"all","type":"string","description":"\"all\" (default), \"developer\", or \"help\" to restrict the search."},"limit":{"default":8,"type":"integer","description":"Max results per source (1-25)."}},"required":["query"],"additionalProperties":false}},{"name":"set_interview_state","description":"[Interviews] Change the state of an interview/position (e.g. open, closed).\n\nChanges 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`.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"position_id":{"type":["string","null"],"minLength":1,"format":"uuid","description":"Interview definition id or position id whose state should change.","example":"00000000-0000-0000-0000-000000000000"},"status":{"type":["string","null"],"enum":["draft","active","archived","deleted","preparing","completed",null],"description":"New lifecycle status to apply."},"is_embedded":{"type":["boolean","null"],"description":"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)."}},"required":["position_id"]}},{"name":"update_catalogue_directory","description":"[Coaching catalogue] Update a coaching catalogue directory: rename it, change which sessions it lists (`tags_interview_set_filter`), re-order its sub-directories (`tags_sub`), or author its custom Markdown page (`content_md`). Only the fields you send are changed. Coaching-platform feature.\n\nUpdates a directory (page) of the coaching portal catalogue. Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. Use it to rename a directory, re-point which sessions it lists (`tags_interview_set_filter`), re-order or replace its sub-directories (`tags_sub`), or author its custom Markdown page (`content_md`).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":["string","null"],"minLength":1,"pattern":"^[a-z0-9]+(?:(?:-|_)+[a-z0-9]+)*$","description":"Id of the directory to update (the catalogue URL segment). The id itself cannot be changed — create a new directory instead.","example":"sales-coaching-en"},"name":{"type":["string","null"],"minLength":1,"description":"Display name of the directory.","example":"Sales coaching"},"description":{"type":["string","null"],"description":"Short description shown on the directory card."},"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Language of the directory (one of the platform-languages.json codes). The catalogue groups directories by language.","example":"en"},"visibility":{"type":["string","null"],"enum":["public","merchant_public","merchant_invite","merchant_unlisted",null],"description":"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..","example":"merchant_public"},"status":{"type":["string","null"],"enum":["draft","active","archived",null],"description":"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..","example":"active"},"cover_image_url":{"type":["string","null"],"description":"Cover image URL shown on the directory card. null clears it."},"coach_plan":{"type":["string","null"],"enum":["demo","screening","2nd","3rd","closing","job-specific","other",null],"description":"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..","example":"screening"},"tags_sub":{"items":{"type":"string"},"type":["array","null"],"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"]},"tags_interview_set_filter":{"items":{"type":"string"},"type":["array","null"],"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"]},"content_md":{"type":["string","null"],"description":"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","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"}},"required":["id"]}},{"name":"update_interview","description":"[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.\n\nUpdates 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"position_id":{"type":["string","null"],"minLength":1,"format":"uuid","description":"Id of the interview definition (single-stage) or position definition (multi-stage) to update. The same id you pass to job-interview-get.","example":"00000000-0000-0000-0000-000000000000"},"status":{"type":["string","null"],"enum":["draft","active","archived","deleted","preparing","completed",null],"description":"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).","example":"active"},"visibility":{"type":["string","null"],"enum":["merchant_public","merchant_invite","merchant_unlisted",null],"description":"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..","example":"merchant_public"},"name":{"type":["string","null"],"description":"Interview / position name.","example":"Project manager"},"code":{"type":["string","null"],"description":"External code/reference. Blank is stored as null."},"location":{"type":["string","null"],"description":"Interview location (column `interview_location`). Blank is stored as null.","example":"remote"},"cover_image_url":{"type":["string","null"],"description":"Cover image URL."},"description":{"type":["string","null"],"description":"Short interview description."},"description_long":{"type":["string","null"],"description":"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_department":{"type":["string","null"],"description":"Department the position belongs to. Blank is stored as null.","example":"Engineering"},"interview_salary":{"type":["string","null"],"description":"Salary range shown for the position. Blank is stored as null.","example":"$80k - $100k"},"interview_available_till":{"type":["string","null"],"description":"ISO date/time after which the interview is no longer available to candidates. null keeps it always available.","example":"2026-12-31"},"recruiter_profile_id":{"type":["string","null"],"description":"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it."},"tags":{"items":{"type":"string"},"type":["array","null"],"description":"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.","example":["interview-practice","sales"]},"questions":{"items":{"properties":{"question":{"type":["string","null"],"description":"The question text shown to the candidate."},"id":{"type":["string","null"],"description":"Identifier for this question. job-interview-get returns the question's real id here; send it back to job-interview-update so an unchanged question keeps its existing record (and with it its answer rules and any rendered avatar video). Also the handle another question references via conditional_question_main_id. On job-interview-create-from-array it is a caller-local value, only needed for those references."},"duration":{"type":["number","null"],"description":"Answer duration in seconds for this question."},"mojito_language_code":{"type":["string","null"],"enum":["ar","bg","zh","hr","cs","da","nl","en","fil","fi","fr","de","el","hi","hu","id","it","ja","ko","ms","no","pl","pt","br","ro","ru","sk","es","sv","ta","th","tr","uk","vi",null],"description":"Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted.","example":"en"},"label":{"type":["string","null"],"description":"Optional label/tag stored on the question."},"is_conditional":{"type":["boolean","null"],"description":"Conditional follow-up question (view 'with listening conditional'). Use with conditional_question_main_id."},"is_without_scoring":{"type":["boolean","null"],"description":"Question is asked but not scored (view 'without scoring')."},"is_candidate_asking_recruiter":{"type":["boolean","null"],"description":"Candidate-asks-recruiter prompt (view 'candidate asking recruiter')."},"is_expert":{"type":["boolean","null"],"description":"Expert listening question (view 'with listening expert')."},"is_multiple_choice":{"type":["boolean","null"],"description":"Multiple-choice question (view 'multiple choice')."},"question_alternatives":{"items":{"type":"string"},"type":["array","null"],"description":"Alternative phrasings for the question."},"conditional_question_main_id":{"type":["string","null"],"description":"For a conditional question, the id (the \"id\" field above) of the parent question in this same array that triggers it. The parent must appear earlier in the array than the conditional question referencing it."},"knowledge_base_id":{"type":["string","null"],"description":"Knowledge-base store id (uuid) the question draws context from."},"external_id":{"type":["string","null"],"description":"External identifier stored on the question. job-interview-update matches on this first, so an ATS that owns stable ids can send its own array and have the diff line up without round-tripping our ids."},"external_data":{"additionalProperties":{},"type":["object","null"],"description":"Arbitrary JSON metadata stored on the question."},"candidate_expectations_json":{"properties":{"weak":{"items":{"type":"string"},"type":["array","null"],"description":"Baseline requirements every viable candidate should meet (table stakes)."},"moderate":{"items":{"type":"string"},"type":["array","null"],"description":"Requirements expected of a solid, competent candidate."},"strong":{"items":{"type":"string"},"type":["array","null"],"description":"High-bar requirements only standout candidates clear."}},"type":["object","null"],"description":"Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved."}},"additionalProperties":{},"type":"object","required":["question"]},"type":["array","null"],"minItems":1,"description":"OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — this endpoint only touches questions when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format job-interview-create-from-array accepts and job-interview-get returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array job-interview-get gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. `questions_diff` in the response reports exactly what was decided. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. The welcome, thank-you and instructional-video steps are not part of this array and are left in place. Single-stage interviews only; for a multi-stage position, update its interview stages individually."},"regenerate_candidate_expectations":{"type":["boolean","null"],"description":"Re-derive the interview-level `candidate_expectations_json` scoring rubric from the resulting question list, the way job-interview-create-from-array derives it at creation time. Only applies when `questions` is sent, the interview type is `interview`, and `candidate_expectations_json` is not also being set explicitly (an explicit value wins).","example":false},"type":{"type":["string","null"],"enum":["interview","coaching","assessment",null],"description":"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.","example":"interview"},"type_credit":{"type":["string","null"],"enum":["resume_check","interview_coach_starter","interview_coach_contributor","interview_coach_manager","cover_letter",null],"description":"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..","example":"interview_coach_manager"},"coach_plan":{"type":["string","null"],"enum":["demo","screening","2nd","3rd","closing","job-specific","other",null],"description":"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..","example":"screening"},"interview_template_id":{"type":["string","null"],"minLength":1,"description":"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.","example":"46b98d37-1557-4391-beca-03037ead19f2"},"knowledge_base_store_id":{"type":["string","null"],"description":"Knowledge base store id the interview draws context from; validated for existence. null unlinks it."},"recording":{"type":["string","null"],"enum":["audio_first_5_answers","audio_all","video_all","video_first_5_answers",null],"description":"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..","example":"video_all"},"recording_full_session":{"type":["string","null"],"enum":["audio_all","video_all",null],"description":"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..","example":"video_all"},"result_view":{"type":["string","null"],"enum":["none","minimal","minimal_with_score","advanced","full","full_expand_scores",null],"description":"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..","example":"full"},"candidate_video_introduction":{"type":["string","null"],"enum":["hidden","optional","required",null],"description":"Whether a candidate video introduction is hidden, optional or required. null is treated like hidden."},"interview_conversation_speed":{"type":["string","null"],"enum":["slower","normal","faster",null],"description":"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..","example":"normal"},"max_followups":{"type":["integer","null"],"maximum":999,"minimum":0,"description":"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).","example":2},"max_duration":{"type":["number","null"],"description":"Live session limit in seconds. Also the basis for the credit multiplier.","example":1200},"questions_random_subset":{"type":["number","null"],"maximum":0.9,"minimum":0.01,"description":"Ask only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions.","example":0.5},"interview_attempts":{"type":["number","null"],"maximum":20,"minimum":1,"description":"Allowed candidate attempts (1-20). Stored as result_scoring.max_retries.","example":1},"required_pronunciation":{"type":["boolean","null"],"description":"Require pronunciation assessment (restricts to pronunciation-capable languages)."},"result_enable_edit_transcript":{"type":["boolean","null"],"description":"Allow editing the transcript on the result view."},"candidate_expectations":{"type":["string","null"],"description":"Free-text candidate expectations."},"candidate_expectations_json":{"properties":{"weak":{"items":{"type":"string"},"type":["array","null"],"description":"Baseline requirements every viable candidate should meet (table stakes)."},"moderate":{"items":{"type":"string"},"type":["array","null"],"description":"Requirements expected of a solid, competent candidate."},"strong":{"items":{"type":"string"},"type":["array","null"],"description":"High-bar requirements only standout candidates clear."}},"type":["object","null"],"description":"Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved."},"custom_scoring":{"additionalProperties":{},"type":["object","null"],"description":"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."},"pdf_export_auto_config":{"properties":{"mojito_language_code":{"type":["string","null"],"description":"Report language code (platform-languages.json code).","example":"en"},"contact_details":{"type":["boolean","null"],"description":"Include candidate contact details."},"ai_recruiter_assessment":{"type":["boolean","null"],"description":"Include the AI recruiter assessment."},"ai_scoring_rubric":{"type":["boolean","null"],"description":"Include the AI scoring rubric."},"analytics":{"type":["boolean","null"],"description":"Include analytics."},"files":{"type":["boolean","null"],"description":"Include uploaded candidate files."},"transcript":{"type":["boolean","null"],"description":"Include the interview transcript."},"answer_recording":{"type":["boolean","null"],"description":"Include per-answer recordings."},"session_recording":{"type":["boolean","null"],"description":"Include the full-session recording."},"group_by_question":{"type":["boolean","null"],"description":"Group transcript answers by expected question."},"template":{"type":["string","null"],"enum":["classic","modern","one_pager",null],"description":"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."}},"type":["object","null"],"description":"Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export."},"interview_type":{"type":["string","null"],"enum":["pre-screening","pre-screening-with-test-questions","second-interview","remote-freelancer-verification","strength-based-interview","potential-based-interview","process-verification-from-knowledge-base",null],"description":"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..","example":"pre-screening-with-test-questions"},"interview_tone":{"type":["string","null"],"description":"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.","example":"professional"},"seniority_level":{"type":["string","null"],"enum":["entry-level","intermediate","senior","managerial","director","executive",null],"description":"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..","example":"senior"},"hiring_for_company":{"properties":{"name":{"type":["string","null"],"description":"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name.","example":"Unimo Enterprises"},"description":{"type":["string","null"],"description":"Short description of the end employer, used as background context by the agent.","example":"Unimo Enterprises is a leading logistics and supply chain solutions provider."},"location":{"type":["string","null"],"description":"Primary location of the end employer.","example":"Sri Lanka"},"sector":{"type":["string","null"],"description":"Industry / sector of the end employer.","example":"Logistics and Supply Chain"},"company_size":{"type":["string","null"],"description":"Approximate headcount of the end employer.","example":"100-200"}},"type":["object","null"],"description":"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.","example":{"name":"undisclosed"}}},"required":["position_id"]}},{"name":"upload_knowledge_base_document","description":"[Knowledge base] Upload and process a knowledge base document (multipart form-data).\n\nUploads 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`).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"knowledge_base_store_id":{"type":["string","null"],"minLength":1,"description":"The knowledge base store to add the document to.","example":"d9d6f121-1230-48fd-b3a7-8b5a1e8db052"},"name":{"type":["string","null"],"description":"Document name (with extension). Falls back to the uploaded file name for multipart."},"merchant_id":{"type":["string","null"],"description":"Override merchant id (admin / sub-merchant only)."},"file":{"type":["string","null"],"format":"binary","description":"The document file (binary)."}},"required":["knowledge_base_store_id","file"]}}],"scan":{"score":81,"grade":"B","scanned_at":"2026-09-19T10:14:33.468Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T10:14:33.434Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1448ms"]},"poisoning":{"score":13,"max":15,"notes":["29 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 7 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 3 days ago"]},"identity":{"score":10,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool create_persona: …[Interviews] Create a role-play persona: an avatar that plays a defined role in a free-form conversation instead of a scored Q&A interview. FIRST CHOOSE `portal`, because it selects between two different products: `portal=\"interview\"` builds a SIMULATED PERSONA a recruiter invites candidates to — scored, billed to merchant credits, and listed with the recruiter's other results; `portal=\"coaching\"` (THE DEFAULT) builds a coaching persona learners start themselves from the catalogue, billed to their own coaching credits and never visible to recruiters. Pass `portal=\"interview\"` explicitly for any hiring, screening or assessment use. Then set `persona_role_avatar`/`persona_role_user` for the roles and `opening_line` for the avatar's first spoken line (defaults to a generic 'Hello'). FIRST DECIDE `portal`. This endpoint creates two different products and the default is NOT the recruiter one: - `portal: \"interview\"` — an INTERVIEW ROLE-PLAY. Use this whenever the goal is to ASSESS or SCREEN candidates: hiring, assessments, sales role-plays for job applicants, anything a recruiter runs. Candidates are invited through the normal invitation flow, results appear in the recruiter's result list, it is billed against merchant credits, and attempts are capped via `interview_attempts` — exactly like an interview. - `portal: \"coaching\"` (THE DEFAULT) — a coaching persona for practice/training on the coaching portal. Consumed against the mentee's own coaching credits, self-started from the catalogue, and its results are NOT visible to recruiters. Omitting `portal` gives you this one, so pass `portal: \"interview\"` explicitly for any recruiting/assessment use case. The conversation itself behaves identically in both. The avatar plays a defined role in a free-form conversation instead of running a scored Q&A interview. No AI question/description generation runs; the persona role fields ARE the configuration. The session runs as: a welcome message → the avatar's OPENING LINE (the first thing it says, set via `opening_line`) → the candidate replies and the free-form role-play begins → a closing message. Because there is no question list, `opening_line` is how the avatar starts the scene — set it to a concrete in-character line; if omitted it defaults to a generic \"Hello\". Set `welcome_message` and `thank_you_message` too — omitting them leaves the generic platform defaults. Also set `candidate_expectations`: it is the yardstick the session is scored against. The four avatar prompts divide up as: `persona_avatar_who_is` (identity and what drives it), `persona_avatar_knowledge` (the private facts it may use), `persona_avatar_progress` (how the conversation is allowed to move forward, and what gates the later personal details), and `persona_avatar_end_conditions` (when to stop). Without `persona_avatar_progress` the avatar has no defined arc and tends to either concede immediately or never concede at all. Provisions the default conversational steps and optionally an embed key.…"}],"inputs":{"probes":[{"url":"https://mcp.jobmojito.com/mcp","reachable":true,"authRequired":false,"latencyMs":1448,"serverInfo":{"name":"JobMojito","version":"1.3.0"}}],"packages":[],"repo":{"found":true,"owner":"JobMojito","repo":"mcp","archived":false,"pushedAt":"2026-09-16T10:08:38Z","stars":1,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/141485367?v=4","ownerCreatedAt":"2023-08-05T08:44:29Z","license":"NOASSERTION"},"icon":{"url":"https://jobmojito.com/favicon.png","source":"registry","width":512,"height":512},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":"NOASSERTION","lastPushAt":"2026-09-16T10:08:38.000Z","score":26}}}},"grade_history":[],"reviews":[]}