Projekte & Pipeline in einem Call.
Aktive Projekte nach Owner und Kunde. Bewerbungen mit Kandidat, Projekt und Company-Karte – ohne N+1-Lookups.
list_projects · list_applicationsVerbinde plyce mit deinem KI-Assistenten. Stelle Recruiter-Fragen in einem Call – aktive Projekte, Pipeline mit Namen, Interviews und Nachfassen – statt Tabellenbeziehungen zusammenzubauen.
Model Context Protocol · OAuth · Katalog v6 · Tenant-Isolation
Ein Endpoint. Dein Recruiting-Kontext.Für Remote-MCP-Clients mit OAuth-Unterstützung.
https://mcp.plyce.app/mcpDeine KI stellt Recruiting-Fragen. plyce liefert gejointe Karten, Overviews und Nachfassen – strukturiert und nachvollziehbar.
Aktive Projekte nach Owner und Kunde. Bewerbungen mit Kandidat, Projekt und Company-Karte – ohne N+1-Lookups.
list_projects · list_applicationsProjekt-, Kunden- und Kandidaten-Historie mit Pipeline-Counts, Tasks und nächsten Interviews – fest strukturiert.
get_project_overview · get_company_overviewDeterministische Regeln für überfällige Tasks, stille Sent Outs und ruhende Projekte – mit offengelegter Definition.
get_attention_items · list_scheduled_interviewsDas Model Context Protocol ist die gemeinsame Schnittstelle zwischen deinem KI-Client und plyce. Es beschreibt, welche Werkzeuge verfügbar sind und wie sie aufgerufen werden.
Der KI-Client formuliert Antworten und Bewertungen. Der MCP-Server stellt CRM-Daten bereit und prüft bei jedem Abruf deine Zugriffsrechte.
Dein Client startet die OAuth-Anmeldung. Die Identität wird deinem bestehenden Plyce-Benutzer zugeordnet.
Die KI entdeckt erlaubte Tools, sucht Datensätze und folgt den freigegebenen Beziehungen.
Ergebnisse enthalten IDs, Kontext und, wo verfügbar, einen Plyce-Link. Die KI kann Informationen nachladen und Quellen nennen.
Du benötigst einen aktiven Plyce-Benutzer und einen Client, der Remote MCP mit OAuth unterstützt.
https://mcp.plyce.app/mcpWenn die CLI bereits installiert ist:
codex mcp add plyce --url https://mcp.plyce.app/mcp
codex mcp login plyce
codex mcp listUnter Windows PowerShell kannst du codex.cmd statt codex verwenden. Nach erfolgreicher Anmeldung erscheint in der Liste OAuth.
Der Server bestimmt den Tenant aus deiner Identität. Datensätze und verknüpfte Ziele werden darauf eingeschränkt.
OAuth-Scopes, Plyce-Berechtigungen und Datenbankregeln bestimmen gemeinsam, welche Inhalte du lesen kannst.
Volltexte, Dokumente und strukturierte Finanzfelder haben eigene MCP-Berechtigungen. Technische Zugangstokens werden nicht ausgegeben.
Schreibwerkzeuge nur mit Tenant-Freigabe (kein separates E-Mail-Flag). Outbound-Mail action-basiert — heute Absage über send_rejection; weitere Send-Actions können folgen. prepare_email bleibt Entwurf. Kontakte brauchen Unternehmen (ID oder eindeutige Domain). Quota: 200/Stunde/User über alle Tools.
Hier siehst du den implementierten Katalog. Deine tatsächlich erlaubten Werkzeuge liefert nach der Anmeldung tools/list.
Search tenant users by name, returning user_id, profile_id, name and active status. Paginated. Prefer resolve_user for single-person lookup.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}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.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"user_id": {
"type": "string"
},
"profile_id": {
"type": "string"
}
},
"required": [],
"additionalProperties": false
}Alias of get_activity_report with group_by=user. Prefer get_activity_report(group_by=user, include_rows=...).
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}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.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}Alias of get_activity_report(include_rows=true). Prefer the unified report tool.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}Alias of get_activity_report(interval=day|week|month). Prefer the unified report tool.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}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.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}Alias of get_pipeline_report(mode=events). Prefer the unified pipeline tool.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}Historical Placement events and authorized relations. Financial details only with mcp.financial.read.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}Placement deal values with recruiter splits, consistent with Plyce deal-value reporting. NOT invoiced revenue, cash receipts or realized margin.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}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.
No cross-tenant access, invented historical facts, AI generation or write actions.
{
"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
}Fallback schema discovery when no business list/overview fits. Prefer list_projects, list_applications and overviews for recruiter questions.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}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.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Read an application after checking both candidate and project access. Prefer get_entity(type=application).
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}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.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}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.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}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).
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}One-call project stand: project, company, hiring manager, owner, sourcing team, pipeline counts, candidates by status, recent activities, open tasks, next interviews.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"type": "object",
"properties": {
"project_id": {
"type": "string"
}
},
"required": [
"project_id"
],
"additionalProperties": false
}One-call customer stand: company, owner, key contacts, active/on-hold projects, recent placements, pipeline, activities, open tasks.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"type": "object",
"properties": {
"company_id": {
"type": "string"
}
},
"required": [
"company_id"
],
"additionalProperties": false
}Candidate history across applications, projects, sent outs, interviews, offers, placements, assignments and recent communication.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"type": "object",
"properties": {
"candidate_id": {
"type": "string"
}
},
"required": [
"candidate_id"
],
"additionalProperties": false
}Deterministic follow-up queue. Default types are lean (no candidate_without_followup / project_without_candidates). Definitions returned with items; cap per type.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Fallback edge traversal from get_data_catalog when no overview or list tool fits. Prefer list_projects, list_applications and overviews first.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}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).
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Page the activity timeline for one entity. Alias of list_entity_activities.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Read an activity in an authorized entity context. All targets of shared notes must be readable.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Page document metadata for a candidate, project or company.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}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.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}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.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Page manual tasks by entity, assignee (me), status, due_before or overdue. Replaces list_open_tasks and get_daily_briefing.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Read only this user’s saved lists and permitted filter definitions.
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Structured recruiting search: skills, titles, tags, status and radius. For plain name/text lookup use search (search_entities).
No arbitrary SQL, tenant selection, write operation or hidden background AI.
{
"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
}Return the logged-in plyce user, tenant, scopes, and which tools they may call.
Not a way to impersonate another user or list other tenants.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Enums the agent must use (candidate status, pipeline status, activity types).
Not a search and not a schema dump of the database.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Show this MCP connection (client, scopes, last seen). Admin/diagnostics — not for recruiting questions.
Not an admin dump of every connection in the tenant.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Show remaining shared hourly quota (200 calls across all tools) for this user and MCP client.
Not billing and not other users’ usage.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Revoke this MCP connection immediately.
Does not delete CRM data.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Name/text search over candidates, projects, companies, contacts. Prefer this over search_candidates for plain name lookup.
Does not rank against a job ad, does not call plyce matching, does not read CVs. The user model ranks locally.
{
"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
}Alias of search_entities (name/text search). Prefer search_entities; keep search for ChatGPT host compatibility.
Does not rank against a job ad, does not call plyce matching, does not read CVs. The user model ranks locally.
{
"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
}Alias of get_entity via composite id from search. Prefer get_entity(type, id).
Not a SQL proxy and not a document/CV download.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Composite id like candidate:<uuid>"
}
},
"required": [
"id"
],
"additionalProperties": false
}Alias of get_entity(type=candidate, detail_level=card). Prefer get_entity.
No salary, gender, birth date, CV text, or dossier.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Candidate UUID"
}
},
"required": [
"id"
],
"additionalProperties": false
}Alias of get_entity(type=project, detail_level=card). Prefer get_entity.
No salary band or full job-ad HTML (user model must not be fed raw ads as a matching engine).
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
},
"required": [
"id"
],
"additionalProperties": false
}Alias of get_entity(type=company, detail_level=card). Prefer get_entity.
Not news scraping or plyce-AI company research.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Company UUID"
}
},
"required": [
"id"
],
"additionalProperties": false
}Alias of get_entity(type=contact, detail_level=card). Prefer get_entity.
Not an email send.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Contact UUID"
}
},
"required": [
"id"
],
"additionalProperties": false
}Alias of list_tasks(status=open). Prefer list_tasks.
Does not complete or send mail.
{
"type": "object",
"properties": {
"assigned_to": {
"type": "string"
},
"limit": {
"type": "number"
}
},
"additionalProperties": false
}Alias of list_tasks(overdue=true) for the signed-in user. Prefer list_tasks.
Not an LLM summary and not matching.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Alias of get_project_overview / get_company_overview / get_candidate_history for those types; otherwise a generic relation pack.
Not a CV or document viewer.
{
"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
}Store a note written by the user model as candidate|contact|company|project.manual_note.
Does not generate the note text. plyce only stores it. One canonical activity row.
{
"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
}Create a manual task (same table as the plyce task dialog). Idempotent.
Does not email the assignee and does not log an activity until the task is completed in plyce.
{
"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
}Replace manual candidate tags. Conflict if updated_at does not match.
Does not change pipeline auto-tags.
{
"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
}Set candidates.availability text. Conflict on updated_at.
Does not run status automation beyond normal DB triggers.
{
"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
}Store a client-written subject/body as a draft (MAIL-01: draft). Send only after a human confirms in plyce via email-send.
Does not call plyce-AI to write the mail. Does not send. Does not invoke email-send.
{
"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
}Create a candidate (minimal fields). Returns id and plyce URL.
Does not upload CVs or run matching. For CV-based create use create_candidate_from_cv.
{
"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
}Create a company. Returns id and plyce URL.
Does not enrich from the web or invent website data.
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"website": {
"type": "string"
},
"industry": {
"type": "string"
},
"idempotency_key": {
"type": "string"
}
},
"required": [
"name",
"idempotency_key"
],
"additionalProperties": false
}Create a contact linked to a company. Pass company_id (prefer search first) or rely on a unique email-domain match.
Does not create a company automatically. Ambiguous domain matches fail.
{
"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
}Create a project for an existing company (company_id required). Optional start_date, work_mode, contract type, tags, languages, notes and job text fields.
Does not invent job ads or publish to boards.
{
"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
}Create an application (default status Long List). Fails on duplicates.
Does not send introduction emails.
{
"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
}Move an application along allowed pipeline transitions (same rules as plyce UI).
Does not send Absage mail — use send_rejection for that.
{
"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
}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.
Not free-form mail; not delayed Absage (use plyce UI). Requires send_email true to send.
{
"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
}Create a short-lived signed upload URL for a candidate, company or project document. PUT the file, then call confirm_document_upload.
Does not accept file bytes in the tool call. Does not insert a CRM document row until confirm.
{
"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
}Validate the uploaded object (size + magic bytes) and insert the CRM document row. On failure the storage object is deleted.
Does not re-upload bytes; call prepare_document_upload first. Staging CVs use create_candidate_from_cv instead.
{
"type": "object",
"properties": {
"upload_id": {
"type": "string",
"description": "From prepare_document_upload"
},
"idempotency_key": {
"type": "string"
}
},
"required": [
"upload_id",
"idempotency_key"
],
"additionalProperties": false
}Finalize a staging CV upload: parse → analyze → create or update candidate by email + attach resume. Uses the AI CV analyzer with the caller JWT.
Not the minimal create_candidate field form. Does not accept raw file bytes (prepare + PUT first).
{
"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
}Kein Werkzeug gefunden. Versuche einen anderen Suchbegriff.
Der Einstieg für KI-Clients: Authentifizierung, Tool-Schemas, Beziehungen und Regeln zum vollständigen Nachladen. Maschinenlesbare Dokumente werden mit dem Tool-Katalog erzeugt.
// Session
get_current_user_context({})
// Recruiter lists (one call)
list_projects({ "status": "Aktiv", "owner_id": "me" })
list_applications({
"status": "Interview",
"include": ["candidate", "project", "company"]
})
// Follow next_cursor. Prefer overviews over relation walks.Die Anmeldung gilt für den Client, in dem du sie eingerichtet hast. Prüfe dort, ob der Server aktiviert und OAuth abgeschlossen ist. Einige Clients laden die Werkzeuge erst in einer neuen Sitzung. Eine vorhandene CLI-Verbindung aktiviert keine separate ChatGPT-App-Verbindung.
ChatGPT kann einen gespeicherten Stand der App-Werkzeuge und Eingabefelder verwenden. Ein Deployment oder eine erneute OAuth-Anmeldung aktualisiert diesen Stand nicht automatisch. Öffne ChatGPT im Browser und prüfe als Admin die Workspace-Einstellungen → Apps. Bei Enterprise/Edu: Aktionen aktualisieren (Refresh), neue Aktionen prüfen und freigeben. Für bereits veröffentlichte Business-Apps ist laut OpenAI derzeit erneutes Erstellen und Veröffentlichen nötig. Danach einen neuen Chat öffnen und die aktualisierte App auswählen. Aktuelle OpenAI-Anleitung.
Zur Diagnose liefert get_current_user_context die Katalogrevision und die serverseitig erlaubten Tools (allowed_tools / discovery.tool_count). Fehlt ein dort genanntes Tool im Chat — typisch list_entity_documents und read_document bei 36 serverseitig vs. 34 im Host — ist der Host-Katalog veraltet und das Tool noch nicht getestet. Dokument-Tools brauchen zusätzlich mcp.documents.read (und mcp.content.read für read_document). Die alte search-Suche ersetzt keine strukturierte Kandidatensuche. Eine öffentliche Tool-Liste bestätigt weder deine Berechtigungen noch erfolgreiche Datenabfragen.
Ein erster nicht authentifizierter Aufruf kann mit 401 die OAuth-Anmeldung auslösen. Wiederholte 401 nach der Anmeldung sind ein Fehler: Anmeldung erneuern und die Servermeldung prüfen lassen. Eine erfolgreiche OAuth-Anmeldung allein bestätigt noch keinen erfolgreichen CRM-Abruf.
Die KI ruft gezielt verfügbare Werkzeuge auf. Listen werden seitenweise ausgegeben; zusätzliche Beziehungen und Dokumentabschnitte werden gesondert nachgeladen. Sichtbar sind nur die für deinen Benutzer freigegebenen Inhalte.
Die Suche verwendet die Luftlinie vom angegebenen Suchzentrum. Profile ohne Koordinaten werden nicht als Radius-Treffer ausgegeben; ihre Anzahl wird separat gemeldet. Bei mehrdeutigen Orten sind präzisere Ortsangaben oder Koordinaten nötig.
Die Textextraktion unterstützt PDF, DOCX und UTF-8-Text bis 10 MiB; PDFs bis 500 Seiten. Gescannte Seiten ohne Textebene benötigen OCR und werden entsprechend gekennzeichnet. Der Zugriff auf ältere Dateipfade kann eine Bereinigung der Storage-Zuordnung erfordern.
Die Ergebnisse der aufgerufenen Werkzeuge werden an deinen verbundenen KI-Client übermittelt. Dessen Datenverarbeitung und Aufbewahrung richten sich nach deinem Anbieter und Vertrag. Gib deshalb nur die benötigten Inhalte und Berechtigungen frei.
Menschen über Namen finden, Zusammenhänge nachvollziehen und Zahlen mit klarer Bedeutung abrufen.
„Was hat Malin im August gemacht?“ Der MCP löst Namen und Benutzer-IDs innerhalb deines Tenants auf. Mehrere Treffer? Deine KI fragt nach. Auch inaktive Mitarbeiter bleiben für historische Berichte auflösbar.
resolve_user({ "name": "Malin" })Eigene Von-/Bis-Daten, letzte Kalenderwoche, letzter Monat, Quartale und laufendes Jahr – einheitlich in Europe/Berlin, inklusive Sommerzeit. Tagesangaben schließen den Bis-Tag ein.
from: "2026-08-01", to: "2026-08-31"Offengelegte verwandte Skill-Begriffe erweitern die Suche. Ähnliche Kandidaten erhalten einen regelbasierten Vergleich: Skills 60 %, Jobtitel 25 %, Seniorität 15 %. Fehlende Informationen und die Größe des geprüften Kandidatenpools bleiben sichtbar.
Keine Einstellungswahrscheinlichkeit und keine KI-Prognose. Standort und Status filtern den Suchraum.
Sent Outs, Interviews, Offers und Placements aus protokollierten Statuswechseln. Historische Ereignisse und aktuelle Pipeline-Bestände sind ausdrücklich getrennt. Nicht auflösbare Beziehungen werden ausgewiesen.
Placement-Dealwerte nach Recruiter-Split, Kunde, Projekt oder Placement – nur mit Finanzberechtigung. Fehlende Werte und Währungen bleiben erkennbar. Das ist kein fakturierter Umsatz und keine realisierte Marge.
Manuell, automatisiert, System, Bot, Bulk oder unbekannt. Nachweisbare Automationen lassen sich ausschließen. Unbekannte Herkunft bleibt standardmäßig enthalten und wird im Bericht gezählt.
Bei Listen jede Folgeseite nachladen. Ein Benutzerbericht kann KPI-Zahlen und einen zusätzlich berechtigungsgeprüften Aktivitäten-Drilldown liefern. Zeitreihen zählen Aktivitäten, keine Arbeitsstunden.