{"version":1,"discovery":"Public catalog only. Authenticated tools/list determines visibility; runtime permissions are checked for every target.","tools":[{"name":"list_users","description":"Search tenant users by name, returning user_id, profile_id, name and active status. Paginated. Prefer resolve_user for single-person lookup.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"query":{"type":"string"},"include_inactive":{"type":"boolean"},"limit":{"type":"integer","description":"1..100"},"cursor":{"type":"string","description":"Opaque next_cursor, bound to actor and all filters."}},"required":[],"additionalProperties":false}},{"name":"resolve_user","description":"Resolve a name, user_id or profile_id. Returns status resolved|ambiguous|not_found with matches — never auto-select an ambiguous name. Use me on other tools for the signed-in user.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"name":{"type":"string"},"user_id":{"type":"string"},"profile_id":{"type":"string"}},"required":[],"additionalProperties":false}},{"name":"get_user_activity_report","description":"Alias of get_activity_report with group_by=user. Prefer get_activity_report(group_by=user, include_rows=...).","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"include_activities":{"type":"boolean"},"limit":{"type":"integer","description":"1..100"},"cursor":{"type":"string","description":"Opaque next_cursor, bound to actor and all filters."}},"required":[],"additionalProperties":false}},{"name":"get_activity_report","description":"Activity KPIs with optional group_by (user|event_key|day|week|month), interval buckets and include_rows for drill-down. Replaces get_user_activity_report, list_report_activities and get_time_report.","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"group_by":{"type":"string","enum":["user","event_key","day","week","month"]},"interval":{"type":"string","enum":["day","week","month"]},"include_rows":{"type":"boolean"},"limit":{"type":"integer","description":"1..100"},"cursor":{"type":"string","description":"Opaque next_cursor, bound to actor and all filters."}},"required":[],"additionalProperties":false}},{"name":"list_report_activities","description":"Alias of get_activity_report(include_rows=true). Prefer the unified report tool.","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view","activities.view"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"limit":{"type":"integer","description":"1..100"},"cursor":{"type":"string","description":"Opaque next_cursor, bound to actor and all filters."}},"required":[],"additionalProperties":false}},{"name":"get_time_report","description":"Alias of get_activity_report(interval=day|week|month). Prefer the unified report tool.","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"bucket":{"type":"string","enum":["day","week","month"]}},"required":[],"additionalProperties":false}},{"name":"get_pipeline_report","description":"mode=snapshot (default without dates): current active-project pipeline counts. mode=events: historical status-change events (requires period or from/to). Replaces list_pipeline_transitions.","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"project_ids":{"type":"array","items":{"type":"string"}},"company_ids":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"mode":{"type":"string","enum":["snapshot","events"],"description":"snapshot = current pipeline counts; events = historical transitions (requires period or from/to)"},"limit":{"type":"integer","description":"1..100"},"cursor":{"type":"string","description":"Opaque next_cursor, bound to actor and all filters."}},"required":[],"additionalProperties":false}},{"name":"list_pipeline_transitions","description":"Alias of get_pipeline_report(mode=events). Prefer the unified pipeline tool.","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view","activities.view"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"project_ids":{"type":"array","items":{"type":"string"}},"company_ids":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"limit":{"type":"integer","description":"1..100"},"cursor":{"type":"string","description":"Opaque next_cursor, bound to actor and all filters."}},"required":[],"additionalProperties":false}},{"name":"get_placements","description":"Historical Placement events and authorized relations. Financial details only with mcp.financial.read.","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view","activities.view"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"project_ids":{"type":"array","items":{"type":"string"}},"company_ids":{"type":"array","items":{"type":"string"}},"limit":{"type":"integer","description":"1..100"},"cursor":{"type":"string","description":"Opaque next_cursor, bound to actor and all filters."}},"required":[],"additionalProperties":false}},{"name":"get_deal_value_report","description":"Placement deal values with recruiter splits, consistent with Plyce deal-value reporting. NOT invoiced revenue, cash receipts or realized margin.","phase":"read","scopes":["mcp","reporting:read"],"permissions":["reporting.view","activities.view","mcp.financial.read"],"inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."},"user_ids":{"type":"array","items":{"type":"string"},"description":"Auth user UUIDs; resolve names/profile IDs through resolve_user first."},"event_keys":{"type":"array","items":{"type":"string"}},"exclude_automated":{"type":"boolean"},"exclude_system":{"type":"boolean"},"origins":{"type":"array","items":{"type":"string","enum":["manual","automated","system","bot","bulk","unknown"]}},"project_ids":{"type":"array","items":{"type":"string"}},"company_ids":{"type":"array","items":{"type":"string"}},"breakdown":{"type":"string","enum":["user","company","project","placement","employment_type"]}},"required":[],"additionalProperties":false}},{"name":"find_similar_candidates","description":"Deterministic similarity ranking from structured skills, job title and seniority. Scores disclose weights, evidence, unknown dimensions and search coverage. Uses a bounded literal skill search (no synonym expansion). No LLM.","phase":"read","scopes":["mcp","candidates:read"],"permissions":["candidates.view"],"inputSchema":{"type":"object","properties":{"candidate_id":{"type":"string"},"location":{"type":"string"},"postal_code":{"type":"string"},"radius_km":{"type":"number"},"latitude":{"type":"number"},"longitude":{"type":"number"},"candidate_status":{"type":"string"},"limit":{"type":"integer"}},"required":["candidate_id"],"additionalProperties":false}},{"name":"get_data_catalog","description":"Fallback schema discovery when no business list/overview fits. Prefer list_projects, list_applications and overviews for recruiter questions.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false}},{"name":"get_entity","description":"Read a CRM record by type and id. detail_level=card returns labels and links; full (default) returns allowlisted fields. Prefer this over get_candidate/get_project/get_company/get_contact.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"detail_level":{"type":"string","enum":["card","full"],"description":"card = labels and links; full = allowlisted fields (default full)"}},"required":["type","id"],"additionalProperties":false}},{"name":"get_application","description":"Read an application after checking both candidate and project access. Prefer get_entity(type=application).","phase":"read","scopes":["mcp"],"permissions":["candidates.view","projects.view"],"inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}},{"name":"list_projects","description":"Page projects with filters for status, owner (me), sourcing user, company, employment type, work mode and updated_since. Returns project cards with company when accessible.","phase":"read","scopes":["mcp"],"permissions":["projects.view"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"status":{"type":"string"},"owner_id":{"type":"string","description":"Project owner user UUID, or me for the signed-in user"},"sourcing_user_id":{"type":"string","description":"User UUID in sourcing_users, or me"},"company_id":{"type":"string"},"anstellungsart":{"type":"string"},"work_mode":{"type":"string"},"updated_since":{"type":"string","description":"ISO date/time; inclusive lower bound on updated_at"}},"required":[],"additionalProperties":false}},{"name":"list_applications","description":"Page applications with recruiter filters (company, project status/owner, recruiter, candidate status) and joined candidate/project/company cards so Interview lists need no N+1 lookups. For “currently interviewing” prefer project_status=Aktiv.","phase":"read","scopes":["mcp"],"permissions":["candidates.view","projects.view"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"candidate_id":{"type":"string"},"project_id":{"type":"string"},"company_id":{"type":"string"},"status":{"type":"string"},"project_status":{"type":"string"},"recruiter_id":{"type":"string","description":"Candidate recruiter user UUID, or me"},"project_owner_id":{"type":"string","description":"Project owner user UUID, or me"},"candidate_status":{"type":"string"},"updated_since":{"type":"string","description":"ISO date/time; inclusive lower bound on application updated_at"},"include":{"type":"array","items":{"type":"string"},"description":"Join cards: candidate, project, company. Default all three."}},"required":[],"additionalProperties":false}},{"name":"list_scheduled_interviews","description":"List calendar interviews from activity interview.date/time metadata — not pipeline status Interview. Returns date, time, round, candidate, project and company. One call fills a page or exhausts matches (no empty has_more pages).","phase":"read","scopes":["mcp"],"permissions":["candidates.view","projects.view","activities.view"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day or ISO timestamp"},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day or exclusive ISO timestamp"},"recruiter_id":{"type":"string","description":"Actor user UUID on the interview activity, or me"},"project_id":{"type":"string"},"company_id":{"type":"string"},"candidate_id":{"type":"string"}},"required":[],"additionalProperties":false}},{"name":"get_project_overview","description":"One-call project stand: project, company, hiring manager, owner, sourcing team, pipeline counts, candidates by status, recent activities, open tasks, next interviews.","phase":"read","scopes":["mcp"],"permissions":["projects.view"],"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"}},"required":["project_id"],"additionalProperties":false}},{"name":"get_company_overview","description":"One-call customer stand: company, owner, key contacts, active/on-hold projects, recent placements, pipeline, activities, open tasks.","phase":"read","scopes":["mcp"],"permissions":["companies.view"],"inputSchema":{"type":"object","properties":{"company_id":{"type":"string"}},"required":["company_id"],"additionalProperties":false}},{"name":"get_candidate_history","description":"Candidate history across applications, projects, sent outs, interviews, offers, placements, assignments and recent communication.","phase":"read","scopes":["mcp"],"permissions":["candidates.view"],"inputSchema":{"type":"object","properties":{"candidate_id":{"type":"string"}},"required":["candidate_id"],"additionalProperties":false}},{"name":"get_attention_items","description":"Deterministic follow-up queue. Default types are lean (no candidate_without_followup / project_without_candidates). Definitions returned with items; cap per type.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"user_id":{"type":"string","description":"User UUID or me; defaults to signed-in user"},"types":{"type":"array","items":{"type":"string"},"description":"Optional subset. Default (lean): overdue_task, sentout_without_feedback, interview_without_followup, offer_without_update, active_project_without_activity. Opt-in heavy: candidate_without_followup, project_without_candidates."},"older_than_days":{"type":"integer","description":"Days without update/activity; default 7, max 90"}},"required":[],"additionalProperties":false}},{"name":"list_related_entities","description":"Fallback edge traversal from get_data_catalog when no overview or list tool fits. Prefer list_projects, list_applications and overviews first.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"relation":{"type":"string","description":"Relation name from get_data_catalog"}},"required":["type","id","relation"],"additionalProperties":false}},{"name":"list_entity_activities","description":"Page the activity timeline for one entity (ordered by relation ID). Prefer list_activities. For KPI drill-down use get_activity_report(include_rows=true).","phase":"read","scopes":["mcp"],"permissions":["activities.view"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."}},"required":["type","id"],"additionalProperties":false}},{"name":"list_activities","description":"Page the activity timeline for one entity. Alias of list_entity_activities.","phase":"read","scopes":["mcp"],"permissions":["activities.view"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"period":{"type":"string","enum":["today","yesterday","this_week","last_week","last_7_days","this_month","last_month","this_quarter","last_quarter","this_year"],"description":"Use period OR from + to. Current periods end after today, Europe/Berlin."},"from":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or ISO timestamp with explicit UTC offset."},"to":{"type":"string","description":"YYYY-MM-DD inclusive Berlin day, or exclusive ISO timestamp with explicit offset. Same format as from."}},"required":["type","id"],"additionalProperties":false}},{"name":"get_activity","description":"Read an activity in an authorized entity context. All targets of shared notes must be readable.","phase":"read","scopes":["mcp"],"permissions":["activities.view"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"activity_id":{"type":"string"}},"required":["type","id","activity_id"],"additionalProperties":false}},{"name":"list_entity_documents","description":"Page document metadata for a candidate, project or company.","phase":"read","scopes":["mcp"],"permissions":["mcp.documents.read"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"}},"required":["type","id"],"additionalProperties":false}},{"name":"read_document","description":"Read PDF, DOCX or UTF-8 text from authorized CRM storage in versioned chunks. PDF images require OCR outside this tool. For the original file use get_document_download_url.","phase":"read","scopes":["mcp"],"permissions":["mcp.documents.read","mcp.content.read"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"document_id":{"type":"string"},"chunk":{"type":"integer","description":"Zero-based text chunk; default 0"},"version":{"type":"string","description":"Required after chunk 0; exact content hash from first response"}},"required":["type","id","document_id"],"additionalProperties":false}},{"name":"get_document_download_url","description":"Return a short-lived signed URL for the original file (candidate, project or company). Metadata-only list_entity_documents never includes URLs; text extraction stays on read_document.","phase":"read","scopes":["mcp"],"permissions":["mcp.documents.read","mcp.content.read"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"document_id":{"type":"string"}},"required":["type","id","document_id"],"additionalProperties":false}},{"name":"list_tasks","description":"Page manual tasks by entity, assignee (me), status, due_before or overdue. Replaces list_open_tasks and get_daily_briefing.","phase":"read","scopes":["mcp"],"permissions":["mail_automation.view"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact","application","assignment","job_posting","availability_change","saved_list","staff"]},"id":{"type":"string","description":"Entity UUID"},"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"assigned_to":{"type":"string","description":"Assignee user UUID, or me. Defaults to me when overdue is true and assigned_to omitted."},"status":{"type":"string","enum":["open","completed"]},"due_before":{"type":"string","description":"YYYY-MM-DD, inclusive"},"overdue":{"type":"boolean","description":"Open tasks with due_date before today Europe/Berlin"}},"required":[],"additionalProperties":false}},{"name":"list_saved_lists","description":"Read only this user’s saved lists and permitted filter definitions.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"}},"required":[],"additionalProperties":false}},{"name":"search_candidates","description":"Structured recruiting search: skills, titles, tags, status and radius. For plain name/text lookup use search (search_entities).","phase":"read","scopes":["mcp"],"permissions":["candidates.view"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"1..100, default 25"},"cursor":{"type":"string","description":"next_cursor from the same tool, filters and entity"},"use_synonyms":{"type":"boolean","description":"Default true: disclosed curated related skill terms, not semantic embeddings. Set false for literal skill substrings."},"skills":{"type":"array","items":{"type":"string"}},"skills_mode":{"type":"string","enum":["any","all"]},"job_titles":{"type":"array","items":{"type":"string"}},"keywords":{"type":"string"},"location":{"type":"string","description":"Without radius_km: substring match on city or leave empty and use postal_code. With radius_km: used with postal_code to form the search center (München/Berlin/Hamburg centers are built in; other places are geocoded; ambiguous places require explicit coordinates)."},"postal_code":{"type":"string","description":"Without radius_km: substring match on PLZ. With radius_km: combined with location for the distance center."},"radius_km":{"type":"number","description":"Straight-line distance in km on coordinates (>0..1000). Without radius, location/postal_code are text filters only."},"latitude":{"type":"number"},"longitude":{"type":"number"},"candidate_status":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"career_level":{"type":"string","description":"Match candidates that have this career-level tag (e.g. Senior Level, Mid Level). Stored in tags, not a separate column."},"recruiter_id":{"type":"string","description":"Candidate recruiter user UUID, or me"},"updated_since":{"type":"string","description":"ISO date/time"},"exclude_candidate_ids":{"type":"array","items":{"type":"string"}}},"required":[],"additionalProperties":false}},{"name":"get_current_user_context","description":"Return the logged-in plyce user, tenant, scopes, and which tools they may call.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"get_allowed_values","description":"Enums the agent must use (candidate status, pipeline status, activity types).","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"get_mcp_connection_status","description":"Show this MCP connection (client, scopes, last seen). Admin/diagnostics — not for recruiting questions.","phase":"read","scopes":["mcp:manage"],"permissions":[],"inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"get_mcp_usage","description":"Show remaining shared hourly quota (200 calls across all tools) for this user and MCP client.","phase":"read","scopes":["mcp:manage"],"permissions":[],"inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"revoke_mcp_connection","description":"Revoke this MCP connection immediately.","phase":"read","scopes":["mcp:manage"],"permissions":[],"inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"search_entities","description":"Name/text search over candidates, projects, companies, contacts. Prefer this over search_candidates for plain name lookup.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Full-text query (min 2 characters)"},"types":{"type":"array","items":{"type":"string","enum":["candidate","project","company","contact"]},"description":"Optional entity filter"},"cursor":{"type":"string","description":"Opaque pagination cursor"}},"required":["query"],"additionalProperties":false}},{"name":"search","description":"Alias of search_entities (name/text search). Prefer search_entities; keep search for ChatGPT host compatibility.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Full-text query (min 2 characters)"},"types":{"type":"array","items":{"type":"string","enum":["candidate","project","company","contact"]},"description":"Optional entity filter"},"cursor":{"type":"string","description":"Opaque pagination cursor"}},"required":["query"],"additionalProperties":false}},{"name":"fetch","description":"Alias of get_entity via composite id from search. Prefer get_entity(type, id).","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Composite id like candidate:<uuid>"}},"required":["id"],"additionalProperties":false}},{"name":"get_candidate","description":"Alias of get_entity(type=candidate, detail_level=card). Prefer get_entity.","phase":"read","scopes":["candidates:read"],"permissions":["candidates.view"],"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Candidate UUID"}},"required":["id"],"additionalProperties":false}},{"name":"get_project","description":"Alias of get_entity(type=project, detail_level=card). Prefer get_entity.","phase":"read","scopes":["projects:read"],"permissions":["projects.view"],"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Project UUID"}},"required":["id"],"additionalProperties":false}},{"name":"get_company","description":"Alias of get_entity(type=company, detail_level=card). Prefer get_entity.","phase":"read","scopes":["companies:read"],"permissions":["companies.view"],"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Company UUID"}},"required":["id"],"additionalProperties":false}},{"name":"get_contact","description":"Alias of get_entity(type=contact, detail_level=card). Prefer get_entity.","phase":"read","scopes":["contacts:read"],"permissions":["contacts.view"],"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Contact UUID"}},"required":["id"],"additionalProperties":false}},{"name":"list_open_tasks","description":"Alias of list_tasks(status=open). Prefer list_tasks.","phase":"read","scopes":["mcp"],"permissions":["mail_automation.view"],"inputSchema":{"type":"object","properties":{"assigned_to":{"type":"string"},"limit":{"type":"number"}},"additionalProperties":false}},{"name":"get_daily_briefing","description":"Alias of list_tasks(overdue=true) for the signed-in user. Prefer list_tasks.","phase":"read","scopes":["mcp"],"permissions":["mail_automation.view"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"get_entity_360","description":"Alias of get_project_overview / get_company_overview / get_candidate_history for those types; otherwise a generic relation pack.","phase":"read","scopes":["mcp"],"permissions":[],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","project","company","contact"]},"id":{"type":"string"},"include":{"type":"array","items":{"type":"string"},"description":"Up to six relation names from get_data_catalog"}},"required":["type","id"],"additionalProperties":false}},{"name":"add_note","description":"Store a note written by the user model as candidate|contact|company|project.manual_note.","phase":"write","scopes":["activities:write"],"permissions":["activities.view"],"inputSchema":{"type":"object","properties":{"entity_type":{"type":"string","enum":["candidate","project","company","contact"]},"entity_id":{"type":"string"},"text":{"type":"string","description":"Note body written by the user model, stored as-is"},"idempotency_key":{"type":"string"}},"required":["entity_type","entity_id","text","idempotency_key"],"additionalProperties":false}},{"name":"create_task","description":"Create a manual task (same table as the plyce task dialog). Idempotent.","phase":"write","scopes":["tasks:write"],"permissions":["mail_automation.view"],"inputSchema":{"type":"object","properties":{"entity_type":{"type":"string","enum":["candidate","project","company","contact"]},"entity_id":{"type":"string"},"entity_name":{"type":"string"},"subject":{"type":"string"},"body":{"type":"string"},"due_date":{"type":"string","description":"ISO date YYYY-MM-DD"},"assigned_to":{"type":"string"},"task_type":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["entity_type","entity_id","subject","due_date","idempotency_key"],"additionalProperties":false}},{"name":"set_candidate_tags","description":"Replace manual candidate tags. Conflict if updated_at does not match.","phase":"write","scopes":["candidates:write"],"permissions":["tags.candidates.edit"],"inputSchema":{"type":"object","properties":{"candidate_id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string","description":"Expected candidates.updated_at for conflict check"},"idempotency_key":{"type":"string"}},"required":["candidate_id","tags","idempotency_key"],"additionalProperties":false}},{"name":"update_candidate_availability","description":"Set candidates.availability text. Conflict on updated_at.","phase":"write","scopes":["candidates:write"],"permissions":["candidates.update"],"inputSchema":{"type":"object","properties":{"candidate_id":{"type":"string"},"availability":{"type":"string"},"updated_at":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["candidate_id","availability","idempotency_key"],"additionalProperties":false}},{"name":"prepare_email","description":"Store a client-written subject/body as a draft (MAIL-01: draft). Send only after a human confirms in plyce via email-send.","phase":"prepare","scopes":["email:prepare"],"permissions":["email.send"],"inputSchema":{"type":"object","properties":{"to_entity_type":{"type":"string","enum":["candidate","contact"]},"to_entity_id":{"type":"string"},"to_email":{"type":"string"},"subject":{"type":"string","description":"Written by the user model, not plyce AI"},"body_text":{"type":"string"},"body_html":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["to_entity_type","to_entity_id","to_email","subject","idempotency_key"],"additionalProperties":false}},{"name":"create_candidate","description":"Create a candidate (minimal fields). Returns id and plyce URL.","phase":"write","scopes":["candidates:write"],"permissions":["candidates.create"],"inputSchema":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string","description":"Required; unique per tenant (DB NOT NULL + unique)."},"phone_primary":{"type":"string"},"origin":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"idempotency_key":{"type":"string"}},"required":["first_name","last_name","email","idempotency_key"],"additionalProperties":false}},{"name":"create_company","description":"Create a company. Returns id and plyce URL.","phase":"write","scopes":["companies:write"],"permissions":["companies.create"],"inputSchema":{"type":"object","properties":{"name":{"type":"string"},"website":{"type":"string"},"industry":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["name","idempotency_key"],"additionalProperties":false}},{"name":"create_contact","description":"Create a contact linked to a company. Pass company_id (prefer search first) or rely on a unique email-domain match.","phase":"write","scopes":["contacts:write"],"permissions":["contacts.create"],"inputSchema":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string"},"phone_primary":{"type":"string"},"company_id":{"type":"string","description":"Required unless email domain uniquely matches one company (non-public domains). Prefer search_entities first."},"position":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["first_name","last_name","idempotency_key"],"additionalProperties":false}},{"name":"create_project","description":"Create a project for an existing company (company_id required). Optional start_date, work_mode, contract type, tags, languages, notes and job text fields.","phase":"write","scopes":["projects:write"],"permissions":["projects.create"],"inputSchema":{"type":"object","properties":{"title":{"type":"string"},"company_id":{"type":"string","description":"Required company UUID"},"status":{"type":"string","description":"Default Aktiv"},"start_date":{"type":"string","description":"Projektstart (ISO date YYYY-MM-DD)"},"work_mode":{"type":"string","enum":["Vor Ort","Hybrid","Remote"]},"anstellungsart":{"type":"string","description":"Vertragstyp (tenant-specific label; trimmed, max ~100 chars)"},"tags":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"string"}},"description_rich":{"type":"string","description":"Notes (UI Notes field)"},"requirements_rich":{"type":"string","description":"Stellenbeschreibung"},"anschreiben":{"type":"string","description":"Anschreiben / cover letter text"},"idempotency_key":{"type":"string"}},"required":["title","company_id","idempotency_key"],"additionalProperties":false}},{"name":"add_candidate_to_project","description":"Create an application (default status Long List). Fails on duplicates.","phase":"write","scopes":["candidates:write","projects:write"],"permissions":["applications.create"],"inputSchema":{"type":"object","properties":{"candidate_id":{"type":"string"},"project_id":{"type":"string"},"status":{"type":"string","description":"Default Long List"},"idempotency_key":{"type":"string"}},"required":["candidate_id","project_id","idempotency_key"],"additionalProperties":false}},{"name":"update_application_status","description":"Move an application along allowed pipeline transitions (same rules as plyce UI).","phase":"write","scopes":["candidates:write","projects:write"],"permissions":["applications.update"],"inputSchema":{"type":"object","properties":{"application_id":{"type":"string"},"status":{"type":"string","description":"Target pipeline status (allowed transitions only)"},"updated_at":{"type":"string","description":"Optional conflict check"},"idempotency_key":{"type":"string"}},"required":["application_id","status","idempotency_key"],"additionalProperties":false}},{"name":"send_rejection","description":"Set Absage status and optionally send the rejection email immediately (mailbox or platform_resend). Action-scoped send under mcp_writes_enabled — no separate email flag.","phase":"write","scopes":["candidates:write","email:prepare"],"permissions":["applications.update","email.send"],"inputSchema":{"type":"object","properties":{"application_id":{"type":"string"},"absagegrund":{"type":"string"},"variant":{"type":"string","enum":["sie","du","en"]},"send_email":{"type":"boolean","description":"Must be true to send mail immediately; false = status only"},"new_status":{"type":"string","description":"Absage von: Kunde|Agency|Kandidat (default Kunde)"},"idempotency_key":{"type":"string"}},"required":["application_id","absagegrund","variant","send_email","idempotency_key"],"additionalProperties":false}},{"name":"prepare_document_upload","description":"Create a short-lived signed upload URL for a candidate, company or project document. PUT the file, then call confirm_document_upload.","phase":"write","scopes":["mcp"],"permissions":["documents.upload"],"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["candidate","company","project"]},"id":{"type":"string","description":"Parent entity UUID. Omit with kind=cv to stage a CV before create_candidate_from_cv."},"file_name":{"type":"string"},"mime_type":{"type":"string"},"file_size_bytes":{"type":"integer","description":"Declared size; must match uploaded bytes"},"document_type":{"type":"string","description":"Candidate document type (default resume) or company/project document_type"},"kind":{"type":"string","enum":["document","cv"],"description":"cv allows image OCR types for candidates only; default document"},"idempotency_key":{"type":"string"}},"required":["type","file_name","mime_type","file_size_bytes","idempotency_key"],"additionalProperties":false}},{"name":"confirm_document_upload","description":"Validate the uploaded object (size + magic bytes) and insert the CRM document row. On failure the storage object is deleted.","phase":"write","scopes":["mcp"],"permissions":["documents.upload"],"inputSchema":{"type":"object","properties":{"upload_id":{"type":"string","description":"From prepare_document_upload"},"idempotency_key":{"type":"string"}},"required":["upload_id","idempotency_key"],"additionalProperties":false}},{"name":"create_candidate_from_cv","description":"Finalize a staging CV upload: parse → analyze → create or update candidate by email + attach resume. Uses the AI CV analyzer with the caller JWT.","phase":"write","scopes":["candidates:write"],"permissions":["candidates.create","documents.upload"],"inputSchema":{"type":"object","properties":{"upload_id":{"type":"string","description":"Staging upload_id from prepare_document_upload(kind=cv, no id)"},"first_name":{"type":"string","description":"Override when analyzer returns empty"},"last_name":{"type":"string","description":"Override when analyzer returns empty"},"email":{"type":"string","description":"Override when analyzer returns empty"},"phone_primary":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["upload_id","idempotency_key"],"additionalProperties":false}}]}