JobMojito

com.jobmojito由 jobmojito.com 發布官方發布者v2.6.9更新於 Nov 11, 2026

Run AI interviews, simulated personas and coaching sessions on JobMojito.

已驗證Streamable HTTP可網頁執行知識與記憶資料與分析商業與電商

概覽

AI 產生的概覽

JobMojito 託管 MCP 伺服器,讓助理在 JobMojito 招募平台上建立與管理 AI 面試、角色扮演人設、輔導課程、候選人與報表。

可以做什麼
  • 搜尋並閱讀 JobMojito 開發者文件與說明中心文件
  • 建立、更新、列出與發布面試與職缺,包含題目集、流程步驟、面談時段與簽章連結
  • 建立模擬人設與輔導目錄頁面,並以電子郵件邀請候選人
  • 讀取面試結果與逐字稿,產生 HTML/PDF/JSON 報告,記錄外部評測結果
  • 搜尋、檢視、標記、合併與去除重複候選人,並新增備註
  • 定義、儲存並執行自訂與內建報表,上傳媒體到公司素材庫
適用情境
當你在 JobMojito 中工作,希望助理代為建立或調整招募面試與職缺、檢視候選人結果、清理候選人資料,或建立並執行招募報表而不必切換到管理後台時使用。
執行需求
遠端 streamable HTTP 端點,無需本機安裝。每次工具呼叫都需透過服務方的 OAuth(Supabase)登入,操作以登入使用者的權限執行。文件搜尋同樣需要登入。
安裝前請注意
許多工具會變更或刪除資料:邀請會寄送電子郵件並消耗公司的邀請額度,合併候選人不可復原且不會通知當事人,刪除標籤為永久性,時段或狀態變更會通知候選人。部分工具支援 dry_run 或預覽權杖,應先使用。其他語言的報告會消耗額度。面試評分與報告僅供決策參考,並非錄取決定。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 JobMojito,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/com.jobmojito%2Fjobmojito/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "jobmojito": {
      "type": "http",
      "url": "https://mcp.jobmojito.com/mcp"
    }
  }
}

README

JobMojito MCP Server

Welcome

JobMojito runs AI-led conversational sessions in three shapes. The difference between them matters, because one tool builds two of them:

  • Interviews — a scored Q&A for hiring. Generate the questions from a job description or supply your own; run them with a voice-only interviewer, a live video avatar or a pre-recorded one, in 30+ languages, with a fully branded candidate experience.
  • Simulated personas — instead of a question list, the avatar plays a defined character in free-form conversation — a sceptical buyer, an angry customer, a difficult stakeholder — and the person is scored on how they handle it. Same invitation, billing and result flow as an interview, so these land in the recruiter's result list alongside everything else.
  • Coaching — the same persona engine pointed at practice rather than assessment. Learners start sessions themselves from a browsable catalogue, pay per second from their own coaching minutes, and their results stay private from recruiters. Organise it with directories, tag filters and Markdown pages.

The one trap. create_persona builds both the second and the third product, selected by its portal argument — and it defaults to coaching. For anything used to assess or screen, pass portal="interview" explicitly, or you silently get the wrong product: billed to the wrong credits and invisible to the recruiter.

Across all three: register candidates in bulk and give each a personal link, upload documents to a knowledge base the AI draws on, read back transcripts, structured analysis and shareable HTML or PDF reports, and manage workspaces, credits and analytics across merchants and sub-merchants.

Everything the platform produces is decision support for a qualified human reviewer — never the hiring decision itself, and candidates are told AI is part of the process.

Around the product: the admin console at app.jobmojito.com, developer/API docs at developer.jobmojito.com, the help center at help.jobmojito.com, and the hosted MCP endpoint this repo powers at https://mcp.jobmojito.com/mcp.

This repository is the MCP server that puts all of that into AI assistants like Claude and ChatGPT.


An MCP server for the JobMojito API, built with FastMCP and designed to deploy on Prefect Horizon (the MCP platform from the FastMCP team — app.prefect.cloud → Horizon).

It exposes:

  • 50 API tools auto-generated from JobMojito's live OpenAPI spec (interviews, simulated personas and the coaching catalogue, candidates and results, knowledge base, merchant lists/analytics, custom reports, portal configuration). All endpoints — including the GET lists — are surfaced as tools with clean, curated names, each with a title and read-only/destructive annotations.
  • 2 documentation tools (search_documentation, get_documentation) that read the developer docs and help center live — docs stay single-source on their existing platforms; nothing is copied into this repo.
  • Supabase OAuth so end users can log in directly from Claude, ChatGPT, etc. The signed-in user's Supabase JWT is forwarded to the JobMojito API on every call.

How it fits together

MCP client (Claude / ChatGPT)        │  OAuth login (Supabase OAuth Server, DCR)        ▼JobMojito MCP server (this repo, on Horizon)        │  forwards the user's Supabase JWT        ▼JobMojito API  (https://cool.jobmojito.com/functions/v1)
ConcernApproach
API → toolsFastMCP.from_openapi(...), all routes mapped to Tools, curated names via injected operationIds
Spec freshnessFetched live at startup; a runtime cache + committed snapshot are fallbacks
AuthSupabaseProvider (Remote OAuth); per-request JWT forwarding to the upstream API
DocsBuilt-in tools reading developer.jobmojito.com/llms.txt + .md and the help.jobmojito.com (Featurebase) help center

Files

FilePurpose
server.pyEntry point — builds and exposes mcp (point Horizon at server.py:mcp)
config.pyEnvironment-driven settings
openapi_loader.pyLive fetch + cache/snapshot fallback + operationId injection
naming.pyCurated tool names, titles, hints and annotations per endpoint
upstream.pyhttpx2 client that forwards the user's Supabase JWT to the API
middleware.pyCall logging, upstream-error rewriting, result-size guard, annotation backfill
merchants.pyMerchant picker (MCP App UI) + list_my_merchants text fallback
docs_tools.pysearch_documentation / get_documentation
featurebase.pyFeaturebase REST client (help-center articles)
mintlify.pyMintlify developer-docs MCP proxy + client-credentials auth
tests/test_smoke.py (inventory, schema relaxation, docs) + test_listing_readiness.py (directory contract)
docs/Developer docs: architecture, development, deployment
scripts/update_snapshot.pyRefresh the committed fallback spec
scripts/try_docs.pyLocal smoke test for the documentation tools
data/openapi.snapshot.jsonOffline fallback spec (regenerate from your machine)
lazy_auth.pyUnauthenticated capability discovery + scope= on the 401 challenge
wellknown.py/healthz, OpenAI domain challenge, Smithery server card
server.jsonOfficial MCP Registry entry
.github/workflows/publish-registry.ymlPublishes server.json to the MCP Registry when a push to main changes server.py:SERVER_VERSION (or via manual dispatch)

Local development & testing (macOS)

bash
# 1. Set up a virtualenv and install depspython3 -m venv .venv && source .venv/bin/activatepip install -r requirements.txt
# 2. Configure secrets in .env (auto-loaded; gitignored)cp .env.example .env        # then fill in your keys/credentials
# 3. Static check — see exactly what Horizon will deployfastmcp inspect server.py:mcp
# 4. Run the unit tests (offline; uses the snapshot fallback)ENABLE_AUTH=false pytest -q --asyncio-mode=auto
# 5. Smoke-test the docs tools live (Featurebase + Mintlify federation)ENABLE_AUTH=false python scripts/try_docs.py "how do I create an interview"
# 6. Run the server and connect a clientENABLE_AUTH=false python server.py        # → http://localhost:8000/mcp#   then, in another terminal, open the MCP Inspector:npx @modelcontextprotocol/inspector#   transport: "Streamable HTTP", URL: http://localhost:8000/mcp

Testing notes:

  • Docs tools (search_documentation, and the mounted Mintlify search_*_developer_* / query_docs_filesystem_*) work with ENABLE_AUTH=false — no Supabase login needed. scripts/try_docs.py is the fastest check.
  • API tools (create_interview, list_candidates, …) call the real JobMojito API and need a Supabase user token. For local testing, set JOBMOJITO_DEV_BEARER_TOKEN in .env to a valid Supabase access token; it's forwarded when ENABLE_AUTH=false. (Never set this in production — there the token comes from the user's OAuth session.)
  • Full OAuth locally is rarely needed; if you want it, run with ENABLE_AUTH=true, set BASE_URL=http://localhost:8000, and connect a client that supports OAuth (it will bounce you through Supabase).

Refresh the fallback snapshot from a network that can reach the API: python scripts/update_snapshot.py (the committed snapshot in this repo is a thin structural fallback; this replaces it with the full live spec).


Supabase OAuth setup

This server uses Supabase's OAuth Server feature (which supports Dynamic Client Registration, so MCP clients self-register). The MCP server is the OAuth resource server — it validates tokens; Supabase issues them.

Project: https://momsbvnltsydezmoesqt.supabase.co SupabaseProvider derives every endpoint from this project URL:

EndpointURL
Authorize…/auth/v1/oauth/authorize
Token…/auth/v1/oauth/token
JWKS…/auth/v1/.well-known/jwks.json
OIDC discovery…/auth/v1/.well-known/openid-configuration

Steps:

  1. Supabase Dashboard → Authentication → OAuth Server
    • Enable the OAuth Server and Allow Dynamic OAuth Apps
    • Site URL: https://app.jobmojito.com
    • Authorization Path: /oauth/consent
  2. Env: SUPABASE_PROJECT_URL=https://momsbvnltsydezmoesqt.supabase.co, BASE_URL=https://mcp.jobmojito.com (public base, no /mcp), SUPABASE_JWT_ALGORITHM=ES256 (switch to RS256 if your JWKS shows RSA keys).
  3. If the JobMojito Edge Functions require an apikey header, set SUPABASE_ANON_KEY.

Consent is handled by Supabase / your app, not this server. Because the Site URL is app.jobmojito.com, Supabase serves the approve/deny screen at https://app.jobmojito.com/oauth/consent, where the user already has a Supabase session. This MCP server is only the OAuth resource server — it does not serve a consent page. SITE_URL and OAUTH_CONSENT_PATH are informational and should match your Supabase OAuth Server settings.

Token note: SupabaseProvider cannot validate token audience (Supabase Auth doesn't implement RFC 8707 resource indicators yet). This is expected and logged at startup.


Authentication model

Every tool call requires the user to be signed in via Supabase OAuth — including search_documentation and get_documentation. Keep ENABLE_AUTH=true; the signed-in user's token is forwarded to the JobMojito API so calls respect that user's permissions.

The one deliberate exception is capability discovery: with ENABLE_LAZY_AUTH (default true), server/discover (protocol 2026-07-28), initialize and ping (older protocol versions) and the */list methods answer without a token so directory crawlers can render the tool list. No data is reachable that way — every tools/call, resource read and prompt still needs a verified JWT.

Deploy to Prefect Horizon

  1. Push this repo to GitHub.
  2. At horizon.prefect.io, sign in with GitHub and select this repo.
  3. Configure:
    • Entrypoint: server.py:mcp
    • Dependencies: auto-detected from requirements.txt
    • Horizon Authentication: off — this server provides its own Supabase OAuth, so let it be the auth layer.
  4. Set environment variables / secrets:
    • ENABLE_AUTH=true
    • BASE_URL=https://mcp.jobmojito.com — critical. This must be the server's public base URL, with no /mcp and no trailing slash. It's what SupabaseProvider advertises as the OAuth resource; if it's left at the http://localhost:8000 default, clients get 401 invalid_token. The startup log prints base_url=… and warns if it's localhost.
    • SUPABASE_PROJECT_URL=https://momsbvnltsydezmoesqt.supabase.co
    • SUPABASE_ANON_KEY if the Edge Functions need the apikey header.
    • FEATUREBASE_API_KEY for help-center docs.
  5. Deploy. Your MCP endpoint is https://mcp.jobmojito.com/mcp. Horizon redeploys on every push to main.

Testing the login

A 401 on initialize is the normal first step of MCP OAuth — the client is meant to read the discovery metadata and run the Supabase login. Horizon's Inspector / ChatMCP do not perform that login, so they'll show a bare 401. Test by adding https://mcp.jobmojito.com/mcp as a custom connector in Claude.ai, which runs the full OAuth flow and prompts the Supabase login.

Make sure the Supabase side is configured (or the flow 401s regardless): OAuth Server enabled + Dynamic Client Registration on; Site URL https://app.jobmojito.com

  • Authorization Path /oauth/consent; and that consent page hosted on the app.

Because the OpenAPI spec is fetched live at startup, each redeploy picks up the latest JobMojito API automatically.


Keeping documentation single-source

Docs are not duplicated here. search_documentation builds a live index and get_documentation fetches a page on demand, both reading the source platforms directly. Edit docs there and the MCP reflects changes within the cache TTL (DOCS_CACHE_TTL_MINUTES, default 60).

SourceHow it's readCredentials
developer.jobmojito.com (Mintlify)Mintlify MCP mounted into this server (semantic search + query_docs_filesystem, incl. the imported OpenAPI) when client credentials are set; else public llms.txt/.md via the built-in toolsMCP client id/secret (to federate)
help.jobmojito.com (Featurebase)REST API if FEATUREBASE_API_KEY is set (structured articles incl. body), else public-HTML scrapingAPI key (optional)

Why this server and Mintlify

Mintlify imports the OpenAPI, but its MCP is read-only documentation — it lets an agent search and read the API reference. It cannot call the API. This server turns the same OpenAPI into authenticated, callable tools (acting as the signed-in Supabase user). So: Mintlify answers "how does it work?"; this server "does the thing." The federation mounts Mintlify's doc-search tools alongside the action tools so end users get both from one connector.

Developer docs: Mintlify federation

developer.jobmojito.com is a Mintlify site whose MCP exposes search + query_docs_filesystem tools (including the imported OpenAPI). This server mounts it as a proxy. When federated, the built-in developer-llms.txt source is disabled to avoid duplication.

Public by default (no credentials). Mintlify serves a public MCP at /mcp. Because the developer docs are public, DEVELOPER_DOCS_MCP_URL defaults to https://developer.jobmojito.com/mcp and is mounted with no auth — it works out of the box.

Authenticated endpoint (optional). Mintlify also offers an /authed/mcp endpoint with OAuth client-credentials, for group-restricted content. It is not enabled by default — the site's /.well-known/mcp only advertises a public server until you enable it. To use it:

  1. Mintlify dashboard → MCP server page → Enable MCP Server (otherwise /authed/mcp/oauth/token returns 404).
  2. Create a client credential there (MCP client credentials, not Mintlify API keys) → set DEVELOPER_DOCS_MCP_CLIENT_ID / _CLIENT_SECRET.
  3. Set DEVELOPER_DOCS_MCP_URL=https://developer.jobmojito.com/authed/mcp.

Auth is attached only when the URL contains /authed and both credentials are set; the server then exchanges them at {url}/oauth/token and caches/refreshes the token.

Featurebase: which credential is which

Featurebase exposes docs three ways — the credential shape tells you which:

  • REST API → a single API key (sent as Authorization: Bearer <key> and X-API-Key), base https://do.featurebase.app. Create it in the Featurebase dashboard: log in via auth.featurebase.app/choose-org → Settings → Advanced → API → copy the key. (The direct /settings/api URL 404s — you must enter through your org first.) This is what this server uses for the help center (set FEATUREBASE_API_KEY).
  • Hosted MCP (mcp-read.featurebase.app, the Reader connector) → interactive OAuth (authorization code + PKCE, no client secret). Designed for a human to click "Connect" in Claude/ChatGPT. Best added directly as a connector in your AI client, not proxied from this server (there's no machine token / client-credentials grant).
  • Public web → llms.txt / .md (developer docs), no auth.

A Client ID + Client secret pair is not a Featurebase docs credential — neither the REST API (API key) nor the MCP (PKCE, no secret) uses that shape. If you have one, it's likely a Featurebase SSO/identity OAuth app or from a different system. For docs, use the REST API key above.

Featurebase Reader MCP (not federated)

Unlike Mintlify, Featurebase's Reader MCP (mcp-read.featurebase.app) only supports interactive OAuth (no client-credentials), so it isn't mounted here. If you want its native search, add it directly as a connector in your AI client. HELP_DOCS_MCP_URL is kept in config for reference only.


Directory listings & discoverability

The server is built to satisfy the Anthropic connector directory, the OpenAI plugin directory (ChatGPT + Codex) and the official MCP Registry without further code changes. What that means in practice:

RequirementWhere it lives
Every tool has a title + readOnlyHint/destructiveHint, with a written justificationnaming.py::TOOL_META, applied by server.py::_customize_component, backfilled by middleware.ToolMetadataBackfillMiddleware
Read and write are separate tools (no catch-all)naming.py — asserted in tests/test_listing_readiness.py
tools/list works without credentials, so crawlers can show the tool listlazy_auth.py
scopes_supported in the protected-resource metadata, scope= on the 401server.py::_build_auth + lazy_auth.WWWAuthenticateScopeMiddleware
Actionable errors instead of bare 4xx/5xxmiddleware.UpstreamErrorMiddleware
Results stay under the client's size ceilingmiddleware.ResultSizeGuardMiddleware
Health probe for uptime monitoringGET /healthz
OpenAI domain verificationGET /.well-known/openai-apps-challenge (set OPENAI_APPS_CHALLENGE_TOKEN)
MCP Registry entryserver.json + the publish workflow

Generate the annotation justifications OpenAI asks for at submission:

bash
python -c "import naming,json;print(json.dumps(naming.annotation_justifications(),indent=2))"

Verify the public identity after any deploy or hostname change — this is the single most common way an otherwise-healthy server 401s every client:

bash
curl -s https://mcp.jobmojito.com/.well-known/oauth-protected-resource/mcp# "resource" MUST equal "https://mcp.jobmojito.com/mcp"curl -s https://mcp.jobmojito.com/healthz

Where it's listed

DirectoryStatus
Official MCP Registry (com.jobmojito/jobmojito)Published — publish-registry.yml fires when server.py:SERVER_VERSION changes on main, not on a git tag. Registry versions are immutable, so a description change needs a version bump.
OpenAI plugin directory (ChatGPT + Codex)Listed
Anthropic Connectors DirectoryIn review
GlamaListed
SmitheryListed

Still to do outside this repo

The code is ready; these are not code problems:

  1. Allowlist Anthropic's egress range 160.79.104.0/21 on the MCP host and anything in front of Supabase. A blocking WAF is Anthropic's most common documented failure mode.
  2. Cache-bypass at the CDN for /.well-known/*, llms.txt and *.md, and confirm nothing in front of the server buffers SSE.
  3. Keep the reviewer test account usable. Both directories may re-test after listing; an account that runs out of credits fails in a way that looks like a broken server.

來源:README.md,提交 ac944a8

工具

75

search_documentation

Search JobMojito documentation

Search ALL JobMojito documentation. One call searches both documentation sources in parallel and returns a merged, source-labeled list: • "developer" — developer.jobmojito.com: API reference, request/response schemas, tables, webhooks, code examples, integration guides. • "help" — help.jobmojito.com: recruiter, candidate, and administrator product guides (how the platform behaves for end users). For how a feature, endpoint, field or workflow works, including what an action tool will do. `get_documentation(url)` reads a returned page in full.

輸入參數limitquery必填sourcellm_modelconversation_id

get_documentation

Read a JobMojito documentation page

Fetch the full content of a single JobMojito documentation page. Accepts a URL returned by `search_documentation`. For developer docs the clean Markdown (.md) variant is fetched automatically. Only developer.jobmojito.com and help.jobmojito.com URLs are allowed.

輸入參數url必填llm_modelmax_charsconversation_id

list_my_merchants

List merchants you can act as

Text list of the merchant accounts you can act as, for clients that cannot render MCP App UI. `jobmojito_configuration` offers the same accounts as an interactive picker. Returns the user's own account plus any sub-merchants. Later calls for a sub-merchant carry `merchant_id=<chosen id>`; the own account needs none.

輸入參數searchllm_modelconversation_id

invite_candidates

Invite candidates to an interview or position

[Interviews] Invite candidates to an interview or position: e-mails each one their invitation. The same invitation the admin console's Add candidates sends: creates or finds the candidate, uses the company's invitation budget, and queues the invitation e-mail (with the optional recruiter message). Each row comes back with its outcome; only 'Invited' means an e-mail was queued. With send_email=false NOTHING is e-mailed: each candidate is registered and their personal interview_url comes back; nothing is sent. The result's email_sent says which happened. send_email=false sends nothing now or later: no invitation, no reminders, no SMS or WhatsApp, and it does not use the invitation budget. A draft interview is not refused, but candidates can use their links only once it is active; activating it is a separate step (set_interview_state). is_test=true (with send_email=false) gives test links that also work on a draft, for trying the interview yourself; they are not for candidates, whose results would be marked as tests.

輸入參數is_testlanguagellm_modelcandidates必填send_emailmerchant_idinterview_id必填conversation_idmessage_from_recruiter

upload_media_file

Upload a file to the media library

[Admin] Upload a file to the company's media library and return it, ready to use. Sends the file (base64) and has it checked: its real type, the codec of a video, and anything active in an SVG, which is refused rather than cleaned. The returned `file.url` is what page blocks, brand logos and font settings take. The library is public: a file can be reached by anyone with its address. Switched on per company by JobMojito; while it is off this is refused with 403. A file too large to pass as an argument goes through start_media_upload and finish_media_upload, for a client that can send a file to an address.

輸入參數file必填widthfolderheightfile_name必填llm_modelposter_urlmerchant_idcontent_type必填conversation_idduration_secondsreplace_media_id

get_tool_reference

Get a tool's full reference

The full definition of one JobMojito tool: its complete description, and every argument with all its options and examples (part=result: every field it returns). tools/list carries short versions; this one has the options of an argument, its exact format and examples.

輸入參數parttool必填llm_modelconversation_id

create_interview

Create interview

[Interviews] Create a new interview. Without `questions` its question sequence is generated from the position data. With `questions` (an explicit list) they are stored as you wrote them, and in the session the avatar says each one in its tone, rephrased, unless you pass `interview_tone="exact"`, which reads them verbatim (compliance, translated or legally reviewed text). With `questions`, a rapport question is added first unless include_rapport_question=false (3 sent are 4 asked), and the candidate expectations are generated from them. `type` is the product (interview, assessment, coaching); `interview_type` is the style of an interview (pre-screening, second-interview...); invite-only hiring is visibility=merchant_invite. A position's pre-screening STEP (resume and form) is something else: added with set_position_process, configured with update_position_step. The `interview_template_id` also sets the modality (voice-only vs realtime/pre-recorded avatar); `list_avatars` lists the templates. Full-session recording (recording_full_session) and a longer max_duration raise the credit cost. Every argument in full, with examples: get_tool_reference.

輸入參數codename必填tagstype必填status必填location必填llm_modelquestionsrecordingvisibility必填descriptionenvironment另有 44 個

create_persona

Create role-play 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. `portal` selects between two different products: `portal="interview"` builds a SIMULATED PERSONA a recruiter invites candidates to — scored, billed to merchant credits, and listed with the recruiter's other results; `portal="coaching"` (THE DEFAULT) builds a coaching persona learners start themselves from the catalogue, paid per second from their own coaching minutes and never visible to recruiters. Hiring, screening and assessment use `portal="interview"`. `persona_role_avatar`/`persona_role_user` set the roles and `opening_line` the avatar's first spoken line (default: a generic 'Hello'). Full-session recording (recording_full_session) and a longer max_duration raise the credit cost. Every argument in full, with examples: get_tool_reference.

輸入參數codename必填tagsportalstatus必填llm_modelrecordingvisibility必填descriptionenvironmentis_embeddedmerchant_id另有 22 個

get_interview_definition

Get interview definition

[Interviews] Get the definition/configuration of an interview (position), including its ordered `questions` array. The questions come back in the same format create_interview accepts in `questions`, so an array read here and changed goes back to update_interview as it is. Each question's `id` identifies it: a question keeps its stored record while its id stays in the array. For a position add include=process (its steps with their settings and updated_at, for update_position_step), slots (upcoming meeting slots), team, lifecycle, publishing. Every argument in full, with examples: get_tool_reference.

輸入參數includellm_modelposition_id必填conversation_id

update_interview

Update interview or position

[Interviews] Update the configuration of an existing interview/position: name, description, avatar template, recording, scoring, tags, category and the rest of the create-time settings; for a position also its hiring `team` and recruiter. `status` is applied as set_interview_state applies it (archiving an active position can e-mail its open applicants; set_interview_state with dry_run previews that); the vacancy lifecycle and the embed key are set with set_interview_state only. A position's steps are changed with set_position_process and update_position_step. 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: the array get_interview_definition returns is edited and sent back whole. Resending an unchanged array does nothing. On an offline (pre-rendered video) template the questions change only while the interview is `draft`; on an interactive one also while it is `active`. 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 (no tool changes these: the messages and the video screen are changed in the admin, and another language takes a new interview). `tags` places a coaching session into a catalogue directory. MULTI-STAGE POSITIONS: the interview-only settings (recording, knowledge_base_store_id, candidate_expectations_json and the like) do not exist at position level and are refused with a 422 naming the field. They live on the AI interview step's own interview (the step's interview_set_id, from get_interview_definition include=process). A null argument counts as not sent and changes nothing, except on three fields where null is the only way to switch so

輸入參數codenametagsteamtypeemojistatuslocationllm_modelquestionsrecordingcoach_plan另有 39 個

set_interview_state

Change publication status, vacancy lifecycle or embedding

[Interviews] Change an interview's or position's publication `status` (draft, active, archived...), or a position's vacancy `lifecycle` (open, applications_closed, on_hold, filled, cancelled, closed) with an optional reason_id and note, or its embed key (is_embedded). Moving a position to filled, cancelled or closed, or archiving it, e-mails every candidate whose application is still open, when the company has the position-closed notice on. on_hold and cancelled need a reason_id: one of the company's position status reasons from list_reasons type=position_status, whose applies_to has the lifecycle. dry_run=true answers the status change and whether the position-closed e-mail would go out, to how many candidates, without changing anything. A deleted interview can no longer be read or updated; an archived one can. is_embedded=false removes the embed keys, so existing embeds stop working. Every argument in full, with examples: get_tool_reference.

輸入參數notestatusdry_runlifecyclellm_modelreason_idis_embeddedposition_id必填conversation_id

generate_interview_url

Generate shareable interview link

[Interviews] Generate a signed link that works for 30 days and can be opened more than once; nothing is sent. Whoever holds the link gets its access. `type` picks who it is for and the ids it needs: interview-for-profile = one candidate's own interview link (interview_profile_id + interview_id); results-for-profile = that candidate's results (interview_profile_id); interview-result-candidate = one result for the candidate, interview-result-talent-seeker = one result for a reviewer (interview_result_id); interview-results-for-position = every result of an active interview or position for a reviewer (interview_id). interview_profile_id is the candidate's `id` from list_candidates. There is no anonymous link to an interview: invitations are sent by invite_candidates. Every argument in full, with examples: get_tool_reference.

輸入參數type必填llm_modelshow_menumerchant_idinterview_idconversation_idinterview_result_idinterview_profile_id

list_interviews

List interviews and positions

[Interviews] List the merchant's interviews and positions, with lifecycle, category, tags, recruiter and step count; filter by lifecycle, recruiter_profile_id or interview_category. type=interview (the default) also lists multi-stage positions. Every argument in full, with examples: get_tool_reference.

輸入參數typelimitoffsetstatuslifecyclellm_modelshow_demofilter_textmerchant_idshow_publicfilter_emojiconversation_id另有 2 個

set_position_process

Set a position's steps

[Positions] Add, remove or reorder the steps of a DRAFT position (pre-screening, AI interview, meeting, external assessment, Certo verification), sending the whole ordered list. New steps get the admin's defaults; update_position_step changes a step's settings. A step candidates already reached cannot be removed, nor a meeting step that still has slots. get_interview_definition include=process returns the current steps. dry_run=true returns the diff (added, removed, moved, changed) without saving. No tool creates a position from scratch: duplicate_position copies one as a draft, and the admin creates new ones. Every argument in full, with examples: get_tool_reference.

輸入參數steps必填dry_runllm_modelposition_id必填conversation_id

update_position_step

Change a position step's settings

[Positions] Change one step's settings. It takes `step_id`, optionally `name`, `advance` and `kombo`, and only the settings object of the step's type (`meeting`, `certo`, `external_assessment`, `interview`, `pre_screening`); only the keys you send change and null removes a key, but a list you send (pre_screening form_fields, assessment_rules) replaces the whole list: every item to keep is in it. pre_screening id and status are read only. A new form field: {"id": "custom_<timestamp>", "title", "field_type": text|file|radio, "type": required|optional, "options": ["Yes", "No"] for radio}; it goes after the fields get_interview_definition include=process returns. pre_screening all_rules_fulfilled_auto_approve approves a candidate who meets every rule without review; whether they then move on by themselves is `advance` (auto), a separate setting. expected_updated_at takes the step's `updated_at` from get_interview_definition include=process; when the step changed since, the call is refused with 409. Settings are live: candidates already on the step get them at once. dry_run=true shows the changed keys, the candidates on the step, booked meetings and warnings, and saves nothing. Nobody is e-mailed. A new meeting duration applies to slots created afterwards; existing slots keep theirs (manage_meeting_slot changes them). Every argument in full, with examples: get_tool_reference.

輸入參數namecertokomboadvancedry_runmeetingstep_id必填interviewllm_modelpre_screeningconversation_idexpected_updated_at另有 1 個

manage_meeting_slot

Create, change or delete a meeting slot

[Positions] Bookable time slots of a meeting step: action create, update or delete (with start_at, duration_minutes, capacity, location, meeting_url, interviewer and panel). Changing start_at, duration_minutes, location or meeting_url of a booked slot e-mails its booked candidates the new details; deleting one cancels their bookings and e-mails them and the interviewers. dry_run=true lists the booked candidates who would be e-mailed, without writing anything. get_interview_definition include=slots lists the slots. Creating a slot e-mails nobody. start_at is ISO 8601 with the UTC offset of the user's time zone (2026-11-20T14:00:00+01:00) and not in the past. Every argument in full, with examples: get_tool_reference.

輸入參數noteaction必填agendadry_runslot_idstep_idcapacitylocationstart_atllm_modelmeeting_urlconversation_id另有 3 個

duplicate_position

Copy a position

[Positions] Copy a position with its steps and settings as a new draft, optionally with a new name, country, location, openings or availability date, or into another company you manage (target_merchant_id; admins and sub-merchant operators only). Candidates and results are not copied. Needs the company's bulk position feature. Left out, interview_available_till and openings_total keep the original's; null makes the copy open (interview_available_till) or without a number of openings (openings_total). Every argument in full, with examples: get_tool_reference.

輸入參數namecountryllm_modelposition_id必填openings_totalconversation_idinterview_locationtarget_merchant_idinterview_available_till

duplicate_interview

Copy an interview

[Positions] Copy a stand-alone interview (not a position's step) as a new draft, optionally renamed or into another company you manage. Results are not copied. Into another company the avatar must be shared with it. Every argument in full, with examples: get_tool_reference.

輸入參數namellm_modelinterview_id必填conversation_idtarget_merchant_id

save_catalogue_directory

Create or update a coaching catalogue directory

[Coaching catalogue] With action create (the default): 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; the top-level fields are the default language, `translations` adds the others. With action update and `id`: rename it, change which sessions it lists, re-order its sub-directories, author its page, or add, replace or remove a language version (`translations`, per language; null removes one). On update only the fields you send change; a top-level null counts as not sent, except `content_md: null`, the only way to remove the custom page and restore the default grid. Coaching-platform feature. `public` visibility is for platform admins only. Every argument in full, with examples: get_tool_reference.

輸入參數id必填nameactionstatustags_subllm_modelcoach_plancontent_mdparent_tagvisibilitydescriptionmerchant_id另有 5 個

get_catalogue_directory

Get coaching catalogue directory

[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 shows whether a session's `tags` place it in this directory. `content_md`, `tags_sub` and `tags_interview_set_filter` are replaced wholesale on update. Other language versions of the page are in `translations` (`languages` lists them, default first). Every argument in full, with examples: get_tool_reference.

輸入參數id必填llm_modelmerchant_idconversation_idmojito_language_code

list_catalogue_directories

List coaching catalogue directories

[Coaching catalogue] List the coaching-catalogue directories you can see (your merchant's own plus the platform-wide public ones). Returns directory ids, for finding one, picking a parent for a new one, or walking the tree with `parent_tag`; `is_start_directory` marks the page the catalogue opens on. The custom Markdown page is not included; get_catalogue_directory returns it. Returns 25 by default; `limit` and `offset` page through while `pagination.has_more` is true. Every argument in full, with examples: get_tool_reference.

輸入參數limitoffsetstatusllm_modelparent_tagvisibilityfilter_textmerchant_idinclude_publicconversation_idmojito_language_code

get_interview_result_details

Get interview result details

[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. interview_result_id from list_interview_results: a single-stage row's `id`, a multi-stage row's `interview_result_id`. Every argument in full, with examples: get_tool_reference.

輸入參數viewllm_modelconversation_idinterview_result_id必填get_signed_recordings

generate_interview_report

Generate interview report

[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. A report in a language other than the result's is translated, at 0.1 credit per result. interview_result_id from list_interview_results: a single-stage row's `id`, a multi-stage row's `interview_result_id`. Every argument in full, with examples: get_tool_reference.

輸入參數templatellm_modelstore_fileexport_type必填conversation_idinterview_result_idinterview_result_idsexport_features_result

request_another_interview_attempt

Re-open interview for another attempt

[Results] Re-open a submitted interview result so the candidate can take it again: the attempt is marked failed, the same result goes back to draft and the recruiter's decision on it is cleared. The candidate may then continue, keeping the answers already given, or start over from scratch. There is no preview, and this tool notifies nobody, the candidate included. More attempts on the whole interview are set by interview_attempts in update_interview. Company owners, recruiters and platform admins only. interview_result_id from list_interview_results: a single-stage row's `id`, a multi-stage row's `interview_result_id`. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelconversation_idinterview_result_id必填

set_assessment_result

Record an external assessment result

[Results] Record the result of a candidate's external assessment step (status, score, pass / fail, report link). The step then waits for the recruiter's decision. A completed result replaces the recorded score, pass / fail and label, a report link or note replaces the recorded one, and a cancelled assessment ignores it. Nobody is notified. Every argument in full, with examples: get_tool_reference.

輸入參數notescorepassedstatus必填llm_modelscore_maxreport_urlresult_labelconversation_idposition_result_step_id必填

list_interview_results

List interview results

[Results] List the merchant's interview results. Rows carry the candidate's scores and recruiter risk flags, so this returns 20 by default; `offset` pages while `pagination.has_more` is true, and `tab`/`interview_id`/`filter_text`/`owner`/`position_def_step_id` narrow it. extended=true adds the owner, time on the step, outcome and decision reason. tab=shortlist is the shortlisted state of an application, not a candidate tag named Shortlist (list_candidates rules find tagged candidates). Every argument in full, with examples: get_tool_reference.

輸入參數tabsteptypelimitownerrisksoffsetextendedorder_byllm_modelfilter_textmerchant_id另有 6 個

list_report_fields

List report datasets and fields

[Reports] List what a custom report can use on this account: datasets (interview results, invitations, position pipeline, ATS pipeline, credits, coaching sessions - only those the account and your role include), their dimensions (group by / conditions, with allowed values) and measures. A report definition may only use ids listed here. Custom reports are switched on per account by JobMojito; while they are off, every custom report tool is refused with 403 (built-in reports keep working) 'Custom reports are not enabled for this account.' Retrying does not change that; JobMojito switches them on. Every argument in full, with examples: get_tool_reference.

輸入參數datasetllm_modelmerchant_idconversation_id

list_reports

List reports

[Reports] List the reports you can run: custom reports you can open (yours, shared with you), the JobMojito templates, and the built-in reports (kind builtin, id builtin:<name>, with their sections and whether they are available to you). scope=builtin lists only the built-in ones; they are listed even while custom reports are switched off. Every argument in full, with examples: get_tool_reference.

輸入參數scopellm_modelmerchant_idconversation_id

get_report

Get custom report

[Reports] Get a custom report's JSON definition, visibility, your access and its version. save_report with report_id replaces the definition whole and needs this version. Every argument in full, with examples: get_tool_reference.

輸入參數id必填llm_modelmerchant_idconversation_id

run_report

Run a report

[Reports] Run a report and return each block's rows (aggregated numbers, at most 500 rows per block). Three ways: `report_id` of a saved custom report (your saved filters, then `filters`, apply; with `version` a newer report is refused with 409); `report_id` builtin:<name> of a built-in report from list_reports (`section`, `from` / `to`, `position_id` or `interview_id`, `limit` / `offset`; sections that list candidates by name run only with include_candidates=true and are audited); or an unsaved `definition`, which is validated against list_report_fields and run without storing anything: this validates a definition without saving it: a wrong block comes back with ok=false and an error naming the field and the valid ids. Report numbers are decision-support material for a human reviewer. Block types: line needs a date dimension first (with a grain), kpi and funnel take no dimensions. The period filters each dataset on its own date (its description in list_report_fields says which; a snapshot dataset ignores it); left out, the last 30 days. Every argument in full, with examples: get_tool_reference.

輸入參數tofromlimitstageoffsetfilterssectionversionblock_idllm_modelreport_iddefinition另有 5 個

save_report

Save a custom report

[Reports] Without report_id: save a new custom report from a definition (schema jobmojito.report/v1); it is created as Only me and is shared from the returned admin_url. With report_id and the version from get_report: replace that report's whole definition; on a report shared with other people the change is saved as a draft that the owner publishes in the admin, a private report updates at once, whatever `target` says. run_report with a `definition` and no report_id validates one without saving it. Every argument in full, with examples: get_tool_reference.

輸入參數targetversionllm_modelreport_iddefinition必填merchant_idconversation_id

list_candidates

List and search candidates

[Candidates] List the merchant's candidates, filtered by text, activity tab, source, channel, owner, prospect or applicant. To search like the admin's segment builder (tags, positions, steps, status, dates, countries, skills, custom fields...) pass `rules` as an object (or the same JSON as a string) {"match": "all", "rules": [...]}, field ids and values from list_candidate_filters, e.g. '{"match":"all","rules":[{"field":"tag","op":"any","values":["<tag id>"]},{"field":"applied","op":"within_days","value":30}]}' (list operators take `values`, the others `value`); or `segment_id` for a segment's members. Every argument in full, with examples: get_tool_reference.

輸入參數tabkindlimitownerrulesoffsetsourcechannelorder_byllm_modelsegment_idfilter_text另有 4 個

get_candidate

Get a candidate

[Candidates] One candidate in full: profile, applications with their steps and decisions, tags and automatic tags, counts of notes, open tasks, document requests and segments, and the duplicate flag. include=notes,duplicates,documents,tasks,segments adds those lists; a section whose feature is off is named in `unavailable`. Candidate data is decision-support material for a human reviewer. Every argument in full, with examples: get_tool_reference.

輸入參數includellm_modelcandidate_id必填conversation_id

add_candidate_note

Add a note to a candidate

[Candidates] Add a note to a candidate (candidate_id) or to one result (result_id), visible to the team or private to you, optionally mentioning colleagues (each mention gets one e-mail). Notes cannot be changed or deleted through this tool. Every argument in full, with examples: get_tool_reference.

輸入參數text必填llm_modelresult_idvisibilitycandidate_idconversation_idmention_profile_ids

set_candidate_tags

Tag candidates

[Candidates] Add and remove the company's tags on up to 5000 candidates in one call (add_tag_ids, remove_tag_ids; ids from list_candidate_filters). Candidates you cannot see are skipped and counted in not_visible. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modeladd_tag_idsmerchant_idcandidate_ids必填remove_tag_idsconversation_id

manage_candidate_tag

Create, change or delete a candidate tag

[Candidates] The company's candidate tag list: action create, update (rename, recolor) or delete. Rename, recolor and delete are for owners; delete removes the tag from every candidate for good (dry_run=true shows how many carry it). Every argument in full, with examples: get_tool_reference.

輸入參數idnamecoloraction必填dry_runllm_modelmerchant_idconversation_id

list_candidate_filters

List candidate search filters

[Candidates] Every rule field and operator list_candidates accepts in `rules`, and every value with its id: tags with counts, automatic tags, positions with their steps, interviews, countries, sources, statuses, history, and where switched on decision reasons, job categories, skills, seniority and custom fields. Rules and tags use these ids. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelmerchant_idconversation_id

preview_candidate_merge

Preview merging two candidates

[Candidates] Show what merging merge_id into keep_id would do: both values of each field, the records that move, blockers, and `preview_token`. merge_candidates needs that token, and refuses it if either candidate changed since. Every argument in full, with examples: get_tool_reference.

輸入參數keep_id必填merge_id必填llm_modelconversation_id

merge_candidates

Merge two candidates

[Candidates] Merge merge_id into keep_id after preview_candidate_merge (send its preview_token; field_choices picks keep or merge per field). Owners and admins only. IRREVERSIBLE: there is no unmerge. The candidate is not told. It is for two records of the same person. Every argument in full, with examples: get_tool_reference.

輸入參數keep_id必填merge_id必填llm_modelduplicate_idfield_choicespreview_token必填conversation_id

dismiss_candidate_duplicate

Dismiss a possible duplicate

[Candidates] Mark a suggested duplicate pair (duplicate_id from get_candidate include=duplicates) as not the same person, with an optional note. Nobody is notified, and no tool undoes a dismissal. Every argument in full, with examples: get_tool_reference.

輸入參數notellm_modelduplicate_id必填conversation_id

list_segments

List candidate segments

[Candidates] List the company's candidate segments (dynamic, by rules, or static lists) with their size, or with segment_id one segment in full: rules, analytics and linked positions. list_candidates segment_id lists a segment's members. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelsegment_idmerchant_idconversation_id

manage_segment

Create, change or delete a candidate segment

[Candidates] action save (create without id, update with id; name, description, kind, and rules: the same {match, rules} list_candidates takes, as an object or a JSON string), delete, or add_members / remove_members of a static segment (candidate ids). Fields left out keep their value. list_candidates takes the same rules and returns the candidates they match, without saving anything. Sends nothing to candidates. Deleting cannot be undone. Every argument in full, with examples: get_tool_reference.

輸入參數kindnamerulesaction必填llm_modelsegment_iddescriptionmerchant_idcandidate_idsconversation_id

list_tasks

List tasks

[Tasks] The hiring team's follow-up tasks: mine, created by me or all; by candidate, position, assignee, status or due date; with counts. Every argument in full, with examples: get_tool_reference.

輸入參數duelimitscopeoffsetstatusllm_modelmerchant_idposition_idcandidate_idconversation_idassignee_profile_id

save_task

Create or change a task

[Tasks] Without task_id: create a task (title, notes, due date, assignee, about a candidate, application or position: a new task needs one of candidate_id, application_id or position_id). With task_id: change the fields you send, or the status (done, cancelled; a cancelled task stays cancelled). Assigning a task to someone else e-mails them (assignee_notified); assignee_profile_id comes from list_users. due_at is a date and time with the offset of the user's time zone. Hiring managers are read only. Every argument in full, with examples: get_tool_reference.

輸入參數notestitledue_atstatustask_idllm_modelmerchant_idposition_idcandidate_idapplication_idconversation_idassignee_profile_id

list_document_requests

List document requests

[Document requests] Documents asked from candidates: company-wide or for one candidate, by status, or attention=true for the ones that need a look (uploaded, overdue). Every argument in full, with examples: get_tool_reference.

輸入參數limitoffsetstatusattentionllm_modelmerchant_idcandidate_idconversation_id

request_candidate_documents

Ask a candidate for documents

[Document requests] Ask a candidate for up to 10 documents (certificate, reference letter, work sample...) with a message and due date. With notify (the default) the candidate is e-mailed. dry_run=true shows whether the e-mail would go out (will_send, not_requested, no_valid_email, suppressed) and stores nothing. documents[].source_field_id replaces one of the position's own file questions, as its form names it (form_cover_letter, custom_<name>...); without it the request is a plain upload. Every argument in full, with examples: get_tool_reference.

輸入參數notifydry_runmessagedue_datedocuments必填llm_modelmerchant_idcandidate_id必填application_idconversation_id

update_document_request

Cancel a document request or mark it reviewed

[Document requests] action cancel (the candidate can no longer upload) or reviewed (the uploads were checked). A request in the wrong state is refused with 409. Nobody is e-mailed, and no tool reopens a cancelled request. Every argument in full, with examples: get_tool_reference.

輸入參數action必填llm_modelrequest_id必填merchant_idconversation_id

list_reasons

List the company's reasons

[Reasons] The company's decision reasons (why a candidate was rejected or withdrew, kind reject / withdraw) and position status reasons (the reason_id set_interview_state needs for on_hold and cancelled, with the lifecycles each applies_to). type narrows to one; include_archived=true adds the archived ones. A company has six default position status reasons from the moment the position lifecycle is on. Every argument in full, with examples: get_tool_reference.

輸入參數kindtypelanguagellm_modelmerchant_idconversation_idinclude_archived

get_reason

Get one of the company's reasons

[Reasons] One decision or position status reason by id, archived ones included. Every argument in full, with examples: get_tool_reference.

輸入參數typellm_modelreason_id必填merchant_idconversation_id

save_reason

Create, change or archive a reason

[Reasons] Without reason_id: a new reason (decision: kind and label; position_status: label and applies_to). With reason_id: change it; fields left out keep their value; status archived stops offering it, active offers it again (an archived position status reason cannot be restored). Company-wide: a renamed reason is renamed on every past decision too. Owners only. Every argument in full, with examples: get_tool_reference.

輸入參數kindtype必填labelstatusllm_modelreason_idapplies_tosort_ordermerchant_idtranslationsconversation_id

upload_knowledge_base_document

Upload knowledge base document

[Knowledge base] Upload and process a knowledge base document (base64 file, `name` with its extension) into a store from list_knowledge_base_stores. An interview uses a store once create_interview / update_interview set its knowledge_base_store_id: interview_ids can only name interviews already linked to the store. The optional interview_ids limits it to chosen interviews on the same knowledge base: left out it is every interview, [] is none. Returns the limit it set. Every argument in full, with examples: get_tool_reference.

輸入參數file必填name必填llm_modelmerchant_idinterview_idsconversation_idknowledge_base_store_id必填

list_knowledge_base_documents

List knowledge base documents

[Knowledge base] List the company's knowledge base documents, optionally for one store, with the interviews each is limited to. knowledge_base_id narrows it to one document's limit. Every argument in full, with examples: get_tool_reference.

輸入參數limitoffsetllm_modelmerchant_idconversation_idknowledge_base_idknowledge_base_store_id

set_knowledge_base_document_interviews

Change which interviews can use a document

[Knowledge base] Replace the interview limit of an existing knowledge base document. interview_ids is required: a list limits it to those interviews on the same knowledge base, [] to none, and null opens it to every interview on the knowledge base. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelinterview_ids必填conversation_idknowledge_base_id必填

list_knowledge_base_stores

List knowledge base stores

[Knowledge base] The company's knowledge base stores with their document counts: the knowledge_base_store_id create_interview draws on and upload_knowledge_base_document adds to. strict=true means the AI uses only these documents. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelmerchant_idconversation_id

save_knowledge_base_store

Create or change a knowledge base store

[Knowledge base] Without knowledge_base_store_id: a new store (name; strict true by default: the AI uses only its documents). With it: rename it or change strict, which changes how every interview on the store answers. upload_knowledge_base_document adds documents. Every argument in full, with examples: get_tool_reference.

輸入參數namestrictllm_modelmerchant_idconversation_idknowledge_base_store_id

list_sub_merchants

List sub-merchants

[Admin] List the sub-merchants (child companies) under a merchant account, with their details. The accounts the user can act as are listed by jobmojito_configuration and list_my_merchants. Every argument in full, with examples: get_tool_reference.

輸入參數limitoffsetorder_byllm_modelfilter_textmerchant_idconversation_id

list_users

List the company's users

[Admin] The company's users (owners, recruiters, hiring managers, admins) with the profile_id other tools take: a task assignee, a mention, an interviewer, a recruiter, a hiring team member. filter_text searches name and e-mail. role is the company-wide access level (reader = a hiring manager, read only); for who does what on one position pass position_id: only the people on it, each with position_roles (owning_recruiter, and the hiring team roles recruiter, hiring_manager, interviewer...). Every argument in full, with examples: get_tool_reference.

輸入參數rolellm_modelfilter_textmerchant_idposition_idconversation_idinclude_inactive

list_avatars

List avatars and voice templates

[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` of create_interview and create_persona, so the template's type sets the experience. 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 by default; `offset` pages while `pagination.has_more` is true, and `type`/`filter_text` narrow it. The company's own templates only unless include_public=true: no voice template here does not mean there is none. Every argument in full, with examples: get_tool_reference.

輸入參數typelimitoffsetstatusllm_modelfilter_textmerchant_idinclude_publicconversation_idinclude_archivedmojito_language_code

get_merchant_status

Get merchant status

[Admin] Get a merchant status snapshot: credit balances, subscription, pending-work counts, candidate/result totals, and invitation headroom. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelmerchant_idconversation_id

list_languages

List supported languages

[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. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelconversation_id

get_portal_configuration

Get portal configuration

[Admin] Read the company's portal configuration as editable documents: `branding` (portal name, style, colours, logos, e-mail sender name), `interview-portal` (languages, home texts), `coaching-portal` (vertical, feature toggles, labels, languages, home blocks), `brands` (sub-brands, when switched on) and one `jobmojito.portal-site` document per portal (every page's draft content and the theme CSS, plus `style_settings` and `css_files` when switched on). Narrow with `sections` (branding, interview-portal, coaching-portal, interview-pages, coaching-pages, brands): the page documents are the large ones. With page documents the answer also has `block_types`: every block a page can hold, what it is for, when to use it and its fields; a page holds only these block types. The documents are in the format update_portal_configuration takes, and fields a document leaves out keep their value there. Every argument in full, with examples: get_tool_reference.

輸入參數sectionsllm_modelmerchant_idconversation_id

update_portal_configuration

Update portal configuration

[Admin] Import portal configuration documents, the same ones get_portal_configuration returns: branding, interview portal, coaching portal, brands, and portal sites (pages, menu, footer, theme CSS, style settings, CSS files). With `dry_run: true` nothing is written, and the answer has the summary, warnings and changes the same call makes without it. Fields a document omits keep their value, and languages are only ever added. Validation is all-or-nothing: a 422 lists every error and nothing is written. Pages land as drafts the company reviews in the admin; `publish: true` puts the pages and theme live at once, and it also builds and publishes the stylesheet of any brand whose settings or CSS files the documents carry. Brands, style settings and CSS files are switched on per company by JobMojito; while off, those parts are refused with 422. A CSS file's `version`, sent back, makes the call refuse a file someone else changed. Every argument in full, with examples: get_tool_reference.

輸入參數kindportaldry_runpublishdocuments必填llm_modelmerchant_idconversation_id

publish_portal_stylesheet

Publish a brand stylesheet

[Admin] Build one brand's stylesheet from its style settings and CSS files and put it live at once. Without brand_id it is the main brand. It publishes the drafts update_portal_configuration and save_component_style wrote. Publishing is immediate and changes the live site. Returns warnings, notably rules outside .jm-site. Every argument in full, with examples: get_tool_reference.

輸入參數filesportal必填brand_idllm_modelmerchant_idconversation_id

get_component_style_guide

Get the component style guide

[Admin] The reference for designing a style for a kind of page block (hero, cards, faq, ...): the selectors each block renders, its layout variants, the brand's CSS variables, and the styles the editor already offers per block type (written_by agent or company), each with the pages that use it (draft or published). Without brand_id it is the main brand. Every argument in full, with examples: get_tool_reference.

輸入參數portal必填brand_idllm_modelmerchant_idconversation_id

save_component_style

Save a component style

[Admin] Write one named style for a block type as a DRAFT in its own file, components/<block_type>/<style>.css; the company's other CSS files are never changed. The page editor then offers it on every block of that type. Every selector starts from the guide's root plus the style class. styleName on blocks (update_portal_configuration) applies it; it goes live only with publish_portal_stylesheet (files: [file_id]). remove: true deletes a style's file; the guide lists which pages use it, and their blocks go back to the standard look once the stylesheet is published. Every argument in full, with examples: get_tool_reference.

輸入參數cssname必填portal必填removebrand_idllm_modelblock_type必填descriptionmerchant_idconversation_id

generate_component_styles

Generate component style alternatives

[Admin] JobMojito's model proposes a few clearly different looks for one block type, from the block's content (sent as block) and the brand's CSS variables. Returns name, description and CSS ready for save_component_style. Nothing is stored; a look is kept only once save_component_style saves it. get_component_style_guide gives the selectors and variables for writing a style by hand. At most 30 requests an hour per person. Every argument in full, with examples: get_tool_reference.

輸入參數blockcountportal必填brand_idllm_modelblock_type必填instructionmerchant_idconversation_id

list_media_files

List media library files

[Admin] List the company's media library: images, MP4 video, audio and WOFF2 fonts, newest first. A file's `url` is what page blocks, brand logos and font settings take. Filter by `folder` ("" is the top). include_folders=true adds every folder (empty ones included) with how many files each holds; a folder name is the `folder` value here, in start_media_upload and in manage_media_file. A sub-company also sees its parent's files, marked read_only: usable, not changeable. Every argument in full, with examples: get_tool_reference.

輸入參數kindlimitfolderoffsetsearchllm_modelmerchant_idinclude_parentconversation_idinclude_folders

start_media_upload

Start a media upload

[Admin] First step of an upload for a client that can send a file itself: returns a signed upload_url. The file is PUT there with the declared Content-Type, and finish_media_upload completes it. A client that cannot send a file to an address uses upload_media_file. Every argument in full, with examples: get_tool_reference.

輸入參數folderfile_name必填llm_modelsize_bytes必填merchant_idcontent_type必填conversation_idreplace_media_id

finish_media_upload

Finish a media upload

[Admin] Last step of start_media_upload: checks the stored file and makes it usable. A file that is not what was declared, a video that is not H.264, or an SVG with anything active is removed and the error says why. `replaced` says whether a replacement took effect. Every argument in full, with examples: get_tool_reference.

輸入參數widthheightmedia_id必填llm_modelposter_urlconversation_idduration_seconds

manage_media_file

Describe, move or delete a media file

[Admin] With action update (the default): change a file's name, alt text, focal point or poster, or move it to another folder ("" is the top). Fields left out keep their value. alt replaces the whole set of languages. A null focal_x, focal_y or poster_url clears it. A move gives the file a new `url`: live pages keep the old one and page drafts move at once (drafts_updated). With action delete and only media_id: delete the file for good; this cannot be undone. Refused while a page, brand, CSS file, style setting, company logo or branding, interview, position, blog post, avatar or coaching catalogue uses it: the error lists what does, and those uses are changed separately. Every argument in full, with examples: get_tool_reference.

輸入參數altactionfolderfocal_xfocal_ymedia_id必填file_namellm_modelposter_urlconversation_id

manage_media_folder

Create, rename or delete a media folder

[Admin] Create an empty folder, rename one, or delete an empty one. Renaming moves every file in it to a new address: live pages keep the old one and page drafts move at once. A folder is deleted only once its files are moved or deleted. Names: 1 to 60 letters, digits, spaces, "-", "_", ".", "(" and ")"; not starting with ".", "_" or a space, and never "profile". Every argument in full, with examples: get_tool_reference.

輸入參數toaction必填folder必填llm_modelmerchant_idconversation_id

submit_feature_request

Submit feature request

[Feedback] Send a feature request to the JobMojito product team. It is posted on the public feature request board under the signed-in user's name, where they get status updates; the company is not named. It takes a short title and a description of the need and why; everything sent is public. It posts the title and description exactly as given; at most 5 a day. Every argument in full, with examples: get_tool_reference.

輸入參數title必填llm_modeldescription必填conversation_id

report_technical_issue

Report technical issue

[Feedback] Report a technical problem to JobMojito support. It opens a support conversation from the signed-in user's account (their e-mail), with their company and the interview or result ids given; support answers there. The description covers what was done, what was expected and what happened (error text as shown). It sends the description exactly as given; at most 5 a day. Every argument in full, with examples: get_tool_reference.

輸入參數llm_modelresult_iddescription必填interview_idconversation_id

search_merchants

Search sub-merchants

Search, by name, the sub-merchants the signed-in user can act as. Returns up to 50 matches, each with its merchant_id and name. It is the search behind the jobmojito_configuration picker's Search button; list_my_merchants (its `search`) returns the same accounts as text.

輸入參數queryllm_modelconversation_id

jobmojito_configuration

Choose a JobMojito merchant

Interactive picker (MCP App UI) for the JobMojito merchant account a conversation acts as. For choosing, switching or setting the merchant, or for a call that needs a `merchant_id` when none is chosen yet. It renders a searchable list with clickable options, and the user's choice arrives as their next message. Later JobMojito calls then carry `merchant_id=<chosen id>`; the user's own account needs none.

輸入參數llm_modelconversation_id

版本歷史

6
  1. v2.6.9最新Nov 11, 2026
  2. v2.0.0Nov 8, 2026
  3. v1.5.0Nov 3, 2026
  4. v1.3.2Oct 3, 2026
  5. v1.3.1Sep 23, 2026
  6. v1.3.0Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。