Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.
Este catálogo contiene las 409 tools no administrativas que el servidor muestra a sesiones MCP de cliente en la revisión fijada. El servidor lista 429 tools en total; aquí se excluyen intencionalmente 20 tools de administración interna.
Cada propósito canónico se copia sin cambios desde el manifest que publica el servidor. Ese campo técnico permanece en inglés para que se pueda comparar de forma literal con tools/list. Los nombres, scopes, argumentos obligatorios de primer nivel, tipos de operación y resguardos contractuales salen del mismo snapshot.
La respuesta tools/list del cliente conectado es la fuente de verdad para el servidor que alcanza e incluye el JSON Schema completo. Si su conteo difiere de este snapshot fijado, revisa la revisión del servidor antes de automatizar escrituras.
El catálogo todavía incluye create_client_tool, update_client_tool, assign_tool_to_workflow, configure_customer_api_tool, create_workflow_tool y update_workflow_tool porque esas tools existen en tools/list. Por ahora, crear, editar o asignar un destino HTTP personalizado no es una operación pública soportada mientras Nexor refuerza la validación de destinos. No uses estas tools para configurar un destino hasta que se retire este aviso.
Lectura significa que el manifest no declara un scope de escritura. Escritura indica que la llamada puede cambiar estado. El resguardo nombra solo lo que expone el contrato de la tool. Sin campo de contrato no autoriza a omitir la aprobación del operador para una acción con consecuencias.
Voz de la tarea (2)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
prepare_agent_task_voice
workflows:write
Escritura
master_workflow_id
Sin campo de contrato
Prepare the selected paused agent’s composed tasks for voice, including template and authored tasks. Queues destination-first flow generation and verifies same-call swaps. Idempotent retries preserve completed work. Does not activate tasks, assign channels/numbers, call leads or book meetings. Preparing is not ready: use get_agent_task_voice_preparation to inspect the result. Calendar/channel setup remains separate.
get_agent_task_voice_preparation
workflows:read
Lectura
master_workflow_id
Sin campo de contrato
Inspect preparation of a paused agent’s composed voice tasks. Top-level status is not_started (nothing queued: call prepare_agent_task_voice), preparing (running: wait), pending (not ready after the last run: call prepare again), failed, republish_required (the prepared voice of the open draft still includes a tool now handled by an automation; preparing again does not fix it, republish the agent) or ready; per-task statuses are informational, from saved flow state and background-job evidence, plus pending workflow and error code. Ready means voice artifacts are prepared, not activated, calendar/channel ready or audio-tested. Inspect after creation or retry; never invent success from a queued job.
Flujos de integración del agente (13)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_agent_hubspot_inbound_options
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read contact properties, including calculated/read-only values, for shared HubSpot intake data. These values go into the shared contact, not private agent fields. Use get_agent_integration_flows to inspect current settings, draft, affected agents and revision. Reading does not import or activate anything.
Prepare/apply HubSpot intake mappings and optional metadata-to-Variable bindings for one task (scope=task). Legacy shared mode must be explicitly reviewed. Read flows and inbound options first. configure saves the complete patch as a draft without changing current imports: phone_priority (ordered property names) and extra_properties (hubspot_property, metadata_key). apply requires confirm=true after explaining the exact draft, the actual affected tasks from the read-back, including changed phone selection; it affects future imports/updates only and does not start intake, replay history or delete stored data. discard removes only the draft. Requires permission over every affected agent; revision, account or legacy-edit conflicts require fresh review. Read committed state before reporting success.
list_agent_kommo_pipelines
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read verified Kommo pipelines and stages for the selected agent before changing an existing route. Returns account identity and available destination stages. Reading never imports or moves cards.
change_agent_kommo_route
workflows:write
Escritura
workflow_id, connection_id, action
confirm: true
Create, configure, pause, activate or remove ONE Kommo route for ONE agent. Read get_agent_integration_flows and list_agent_kommo_pipelines first. create saves a new pipeline/source/destination route paused. configure changes pipeline_id, source_status_id, destination_status_id and optionally ingest_unsorted (primary route only, with expected_ingest_unsorted), pausing changes; it moves the same imported card, not arbitrary CRM records. activate can import existing and new cards from the source stage and start lead contact; explain this before confirm=true. pause stops future intake but does not undo imports or disconnect the account. remove deletes this route and disables unsorted acceptance if it was the primary route; it preserves imported contacts. Activation, pause and removal need operator agreement. Preserve other agents; reread after conflicts; report success from committed read-back. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
list_agent_hubspot_lists
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read the current HubSpot contact-list catalog for an agent mode. Returns verified list IDs, names, connection identity and whether a list is already configured. Choose an unassigned list for change_agent_hubspot_list(action=create); do not invent IDs or duplicate an existing legacy route. Reading this catalog does not import contacts.
list_agent_hubspot_field_options
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read exact source identities for this agent’s fields, canonical lead data and derived activity (status, summary, collected data, last sent message, worked marker), plus writable contact properties and enum options from its HubSpot account. Also reports verified, unknown or denied contact-write permission. Derived activity is limited to the triggering run. Use source IDs as returned; never match an agent field by name alone. Reading does not change contacts.
Configure, activate or pause ONE agent’s HubSpot contact-field output. Read get_agent_integration_flows and list_agent_hubspot_field_options first. configure replaces only this agent’s output mapping, overriding the shared mapping for its leads, and keeps its state: a sending output keeps sending only if activation checks pass, else nothing is saved; a paused one stays paused. Get agreement before changing a sending output. Each mapping: verified source ID (lead and agent fields differ), hubspot_property, optional enum value_mapping, write_once. Activation requires verified write permission and rejects another agent writing the same property; never disable another agent to bypass it. activate/pause require agreement and confirm=true. Activation affects only future changes on linked contacts; no replay or contact creation. Report success only from committed read-back; reread revision conflicts. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
list_agent_hubspot_status_options
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read this agent mode’s status keys and the account’s actual writable hs_lead_status enum options before configuring its status output. No CRM writes or imports.
Configure, activate or pause the hs_lead_status output of ONE agent mode. Read get_agent_integration_flows and list_agent_hubspot_status_options first. configure writes patch.mapping (agent status key to actual HubSpot enum value) and leaves this output paused. Inherited mapping becomes agent-specific. activate/pause require confirm=true after agreement; activation handles future status changes on linked contacts, never creates contacts or enables account activities/field sync. Other agents and shared settings are preserved. Expected revision prevents stale edits. Use the committed read-back to report success. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
get_agent_hubspot_import_status
workflows:read
Lectura
workflow_id, connection_id, route_key
Sin campo de contrato
Read the latest manual import queue job for the exact list and assigned agent. Returns state and aggregate counts only. Completed jobs can still contain record errors; not_found is not proof of success. Automatic membership reconciliation is not presented as a manual import.
Explicitly import existing members of ONE saved, enabled HubSpot list into its assigned agent. Explain that the agent may contact these leads, then require confirm=true. Use exact connection_id, route_key, workflow_id and revision from get_agent_integration_flows. Does not activate recurring intake. Returns queued/job_id, not proof of completion. The existing importer preserves identity and deduplication; an in-progress response must not be retried blindly. A paused entry must first be enabled (it can have recurring=false for manual-only imports). crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
get_agent_integration_flows
workflows:read
Lectura
Ninguno
Sin campo de contrato
Inspect saved intake routes, data mappings and outputs for one agent mode or agent group. Requires workflow_id or agent_group_id; both constrain the scope. Returns exact flow identities, configuration revisions, shared/inherited scope, available operations and affected agents. Configuration is not evidence of a successful execution. Read before changing a flow; never treat an observed lead source or a tool name as proof of a native CRM connection. workflows[] reports each task’s active and paused: a route or output activates only while its task is active and not paused, so run set_workflow_active first. GHL opportunity_outcome flows carry outcome_mode: mapped (status map saved), no_action (this task’s own empty map: it never touches GHL) or category_default (inherited empty map: terminal statuses write Won/Lost by status category). Read outcome_mode before calling an outcome with state=not_configured broken.
Change ONE HubSpot list intake for ONE agent mode, preserving all other routes. Use the connection_id, route_key and revision from get_agent_integration_flows. create requires a v3: list identity and expected_revision=null; it saves paused. configure accepts only name, recurring, pause_on_exit and sync_interval_minutes; behavior changes save paused, name-only changes preserve state. activate observes existing members without importing them, then receives future entries after the first complete scan. Existing-member import is separate and may contact leads. pause/remove affect only this route, never OAuth or existing leads. activate/pause/remove require confirm=true after explaining the exact effect and receiving operator agreement. Returns committed read-back; conflicts require rereading, not retrying blindly. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
Configuración CRM del agente (21)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_agent_variable_bindings
workflows:read
Lectura
Ninguno
Sin campo de contrato
Read task/group Variables, exact field IDs, metadata source paths and intake value conversions. Use before changing bindings; no imports or CRM writes.
set_agent_variable_bindings
workflows:write
Escritura
bindings
Sin campo de contrato
Bind existing Variables to incoming lead metadata for one task or group. Read get_agent_variable_bindings first. Each binding includes its task, field ID and expected current source. metadata_key=null unlinks without deleting stored lead data. Optional intake_value_map replaces value conversions (null clears) and requires expected_intake_value_map. All rows commit atomically; other tasks remain unchanged. Affects future intake, not historical backfill. Read back before reporting success.
list_agent_ghl_pipelines
workflows:read
Lectura
workflow_id, connection_id
Sin campo de contrato
Read verified GHL pipelines and stages for this task and exact connection/location. Use before mapping outcomes or automatic import filters.
list_agent_ghl_intake_options
workflows:read
Lectura
workflow_id, connection_id
Sin campo de contrato
Read unassigned GHL pipeline/workflow/default intake sources and the creation revision for this task and connection. Never invent a source ID or take another task’s default.
Configure one GHL task flow. Read get_agent_integration_flows and catalogs first. create claims an available source paused; pause/activate/remove use its exact route_key. remove (confirm=true) deletes one pipeline:/ghl_workflow:/legacy route this task owns, even shadowed or disconnected, never default; imported leads stay. On crm_recurring_import_active, first configure the returned recurring:<pipeline ID> with enabled=false and current stage_ids/cutover_at. configure on outcome:<task UUID> replaces only that task’s terminal-stage bucket (own empty = no_action). configure on recurring:<pipeline ID> sets automatic-import enabled, stage_ids and cutover_at (ISO or null). Enabling auto-sync requires confirm=true and an active intake. Preserve sibling pipelines. Saves configuration, not an import or proof of execution. Reread after conflicts. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
get_agent_zoho_intake
workflows:read
Lectura
workflow_id, connection_id
Sin campo de contrato
Read task-scoped Zoho organization intake configuration, exact Accounts/Deals/Contacts fields, revision and latest import activity. Output alone does not import leads. Read contact_sources capabilities. Choose the unique Deal contact, the organization, or explicit contact-to-organization fallback when supported. Reads do not import or write CRM records.
Configure, pause or activate automatic organization intake for one task. Read get_agent_zoho_intake first. Uses that task’s Accounts output matching, Variables and allowed Deals.Stage values. Configure saves paused. Activate requires confirm=true and may import existing/future organizations and start outreach. Runs every five minutes, admits each organization once, skips existing contacts rather than transferring them, requires one related Deal. Choose contact_source explicitly. deal_contact_then_organization requires capability support and fallback_fields mapped from Accounts; primary fields use Contacts. Fall back only for absent/unlinked contact or missing/invalid phone; foreign contact or API errors block. Never switch after unanswered outreach. Read back saved configuration and activity; no execution evidence is not success. Does not write Zoho. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
list_agent_zoho_fields
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read Zoho fields, exact options and task Variables with types. Supports Leads (default), Accounts, Deals and Contacts. Leads capabilities.reserved_mapping_destinations must be excluded from mappings; automatic_identity_destinations come from native lead identity. Mobile is separate. Accounts returns account_stage_modules, account_deal_selection, account_field_types, account_multiselect_mode, capabilities.account_stage_field_types and max_text_stage_length. For stage.module=Deals read the Deals catalog and use Stage of the unique related deal; account fields still map to Accounts. Text stage fields have no options; use operator-supplied values only when text is advertised. Never invent field names or values.
change_agent_zoho_flow
workflows:write
Escritura
connection_id, action
confirm: true
Configure Zoho output for one task or group. Read get_agent_integration_flows and list_agent_zoho_fields first. Keep the exact connection, task/group and output revision. fields requires BOTH field_map and agent_fields and replaces that whole section; copy retained attribution mappings. Never send target_module with fields/stages or configure section=all. Leads identity automatically uses First_Name, Last_Name, Email and Phone; Mobile is separate. Exclude reserved catalog destinations. accounts selects Accounts or Leads and saves paused. Accounts never creates organizations. Booked stage requires a saved meeting. Configure-only requests need no lead or preview. Preview Accounts before separately authorized activation; activate/pause requires confirm=true. Read back Nexor settings; saving does not update Zoho records or start intake. On invalid input fix the same scoped command; never retry through account defaults.
list_agent_zoho_preview_leads
workflows:read
Lectura
workflow_id
Sin campo de contrato
List recent leads and exact run IDs for an Accounts preview on one task. Requires workflows:read and leads:read. Does not write to Nexor or Zoho.
preview_agent_zoho_accounts
workflows:read
Lectura
workflow_id, lead_id, workflow_run_id
Sin campo de contrato
Preview saved native Accounts settings for an exact task, lead and run, even while output is paused. Requires workflows:read and leads:read. Reads Zoho and returns proposed fields, stage eligibility, saved booking evidence and last verified update; never writes externally or internally. A preview is not a successful execution. Fix missing identifiers, duplicates, permissions or invalid values before activation.
get_agent_salesforce_setup
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read Salesforce for one task: connection (object Lead/Contact/Opportunity, object_confirmed, stage_field, opt_out_fields, field_map, health), this task intake (null when none), every task intake (to avoid overlaps), active campaigns, stages with closed/won/converted flags and, for Opportunity, pipelines (record types) with their own stages. connected=false: connect first with connect_crm(provider=salesforce). Reads Salesforce, writes nothing.
list_agent_salesforce_fields
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read fields of the connected Salesforce object (name, label, type, updateable, picklist, reference) before setting field_map, opt_out_fields or stage_field. Never invent field names.
preview_agent_salesforce_intake
workflows:read
Lectura
workflow_id, patch
Sin campo de contrato
Count the Salesforce records an intake would match right now (mode campaign or stage; new always counts 0). Use before asking whether existing records should also be contacted. Writes nothing.
change_agent_salesforce_connection
workflows:write
Escritura
workflow_id, patch
confirm: true
Change account-wide Salesforce settings shared by every task: object (Lead, Contact or Opportunity), object_confirmed, stage_field (picklist), opt_out_fields (checkboxes that mark the lead do-not-contact, and that Nexor checks on opt-out) and field_map (Salesforce field path to first_name, last_name, email, phone or company). Read get_agent_salesforce_setup and list_agent_salesforce_fields first. Changing object disables every task intake: the first call returns salesforce_object_change_requires_confirm with affected_workflow_ids; tell the operator and retry with confirm=true only after they agree.
change_agent_salesforce_intake
workflows:write
Escritura
workflow_id, action
confirm: true
Configure which Salesforce records this task contacts and how its statuses flow back. Read get_agent_salesforce_setup first and get_workflow_status for status keys. mode: campaign (campaign_id), stage (stages, exact values; pipeline_id for Opportunity record types; dwell_minutes = minimum minutes in stage) or new (every new record). configure saves without changing on/off (new intakes start paused). activate turns it on and can start outreach; pause stops it; remove deletes it (imported leads stay). Those three require confirm=true. backfill=true (activate only) also contacts records already matching; default contacts only records that match after saving. Write-back: update_stage_enabled + status_map (Nexor status key to Salesforce stage). inbound_stage_map: Salesforce stage to Nexor status key. stop_on_closed: closed-not-won marks the lead lost. convert_status_key (Lead only): converts the Lead at that status. Two tasks cannot claim the same campaign, stage or new records (salesforce_intake_overlap).
Configure HubSpot activity history for exactly one task: enabled, notes, calls, meetings and WhatsApp attempts. Read its activity flow/revision first. Saving enabled=true requires confirm=true; other tasks and contact-field mappings are preserved. This affects future activity, not historical replay.
change_agent_hubspot_intake
workflows:write
Escritura
workflow_id, connection_id, action
confirm: true
Operate this task’s HubSpot portal intake: activate/pause its owned default route, or explicitly import_all/import_selected contacts. Read flows first. Never steal another task’s portal route. Imports and activation can start lead contact and require confirm=true; pause also requires agreement. contact_ids is required for import_selected. A queued job is not completion; inspect get_hubspot_sync_status. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
Change HubSpot inbound data or activity history for an entire agent group atomically. Read group flows and get_agent_variable_bindings; send each member’s exact revision. kind=inbound supports configure draft/apply/discard with phone_priority, extra_properties and optional variable_bindings. kind=history supports configure with history toggles. Apply or enabling history requires confirm=true. Affects only group members; no historical backfill. Reread committed group state.
change_agent_custom_intake
workflows:write
Escritura
workflow_id, action
confirm: true
Create/configure/pause/activate/remove a custom INBOUND lead webhook for exactly one task. This is not an outbound event webhook. Read flows first; edits require the exact connection_id and revision. create saves paused; configure accepts name, field_mapping (payload path to canonical lead field or metadata key) and deduplicate. Activation requires confirm=true and may start outreach. Removal requires confirm=true, invalidates the receiving URL and preserves imported leads. Does not execute an HTTP request. Read back and retrieve the endpoint only when needed. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.
get_agent_custom_intake_endpoint
workflows:read
Lectura
workflow_id, connection_id
Sin campo de contrato
Retrieve the receiving URL for one task-owned custom intake after configuration. This URL contains its access token: share only with the authorized operator for configuring the sender; never put it in agent prompts or logs. Reading does not activate intake.
Cuentas CRM (15)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_crm_intake_details
workflows:read
Lectura
scope, provider, connection_id
Sin campo de contrato
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read the receiving URL of a custom entry or Kommo integration. The URL contains an access token: share only with the authorized operator for sender setup; never place it in prompts or logs. Custom entries also return recent payload paths and types for mapping, without payload values.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Replace the Kommo webhook receiving token after explicit consent. The previous URL stops accepting events once committed. The new URL contains a secret. Preserves routes and imported records; does not run an import. Review the returned configuration and configure external senders with the new URL.
get_crm_import_job
workflows:read
Lectura
scope, provider, connection_id, job_id
Sin campo de contrato
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read the exact queued import job for GHL, Kommo or Odoo. Reports queue state and safe aggregate counters. not_found does not prove completion; completed can still include skipped records or errors. Rejects jobs belonging to another connection or tenant.
get_hubspot_sync_preview
workflows:read
Lectura
scope, provider, connection_id, operation
Sin campo de contrato
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Inspect the saved scope before manually re-running HubSpot deal synchronization or one contact sync. contact requires a Nexor lead_id with one unambiguous active run and returns the current status to review. Neither operation executes during preview. Read both revision and sync_revision; the latter is required as expected_sync_revision.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Execute the previously reviewed HubSpot sync. deals applies saved deal transitions to Nexor and can trigger their effects. contact syncs saved status, unsynced call/note/meeting history and enabled fields for the selected lead, possibly across its history; it is not task-local. Requires fresh get_hubspot_sync_preview, consent and both revisions. Reports skips/partial errors honestly; never retry an ambiguous failure automatically.
list_odoo_sync_conflicts
workflows:read
Lectura
scope, provider, connection_id
Sin campo de contrato
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read Odoo conflicts, allowed resolutions and candidate fingerprints. Follow next_cursor while has_more. Missing provider visibility is not a business choice and cannot be ignored. Reading never resolves a conflict or runs a sync.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Resolve one persisted Odoo conflict with its current candidate_fingerprint. select_opportunity requires an exact opportunity_id offered by that conflict; ignore only when allowed_actions permits it. This records a decision, not an executed sync. A changed candidate, already different decision or unavailable binding rejects the operation.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Prepare Odoo output mappings or request a read-only output preview. configure saves only disabled output configuration; enabling execution is blocked by the backend. preview uses the read-only scanner and may be incomplete; the outbound apply engine remains unavailable. Always report scan_complete and approval_eligible; zero operations from an incomplete scan is not proof that no work exists. Does not write to Odoo, advance a cursor, create activities or quotations, or enable an engine. Keeps incoming configuration intact.
list_crm_account_connections
workflows:read
Lectura
scope
Sin campo de contrato
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. List exact connection IDs for supported CRMs and custom inbound entries, including unassigned entries, before inspecting account configuration.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Preview, configure or pause shared Odoo intake. preview reads records and stores its fingerprint without importing; configure requires that same fresh successful preview and consent; pause needs no provider read. Always preserves task field overrides and output configuration. Legacy connections accept only enabled, cutover_at and routes with team_id/stage_id/workflow_id. For current connections, fields, lifecycle, limits and account ignore/observe rules are supported. An unavailable engine remains blocked. Saving is not an executed import.
get_crm_account_configuration
workflows:read
Lectura
scope, provider, connection_id
Sin campo de contrato
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read account controls/defaults or saved import scope and the complete set of tasks that must be reviewed before a shared change. No credentials, writes or imports.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Replace Zoho defaults for metadata fields, collected Variables and statuses; preserve every per-task override. outbound_enabled controls account output. Resolve exact Zoho fields/options with list_agent_zoho_fields; agent_fields uses collected Variable keys, field_map uses metadata keys. Changes apply to future sync, without historical replay.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Change HubSpot account inbound webhook switch/default task or default activity output switches. Preserve list routes, task overrides and unrelated settings. Enabling intake can allow future incoming contacts to be managed/contacted. This does not import historical contacts or replay activities. Use task-scoped tools for task changes.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Move a custom inbound entry, Kommo route or GoHighLevel route to another existing task. The route is saved paused (saved_paused=true); existing leads do not move. custom uses connection_id only. Kommo: route_key is the route UUID. GoHighLevel: connection_id is the location connection and route_key is an existing route key from get_agent_integration_flows (pipeline:<id>, ghl_workflow:<id>) or default for the catch-all task. Activate separately after reviewing the new task configuration; that task must be active and not paused.
Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Queue a saved GHL dry_run/backfill Kommo run_now or Odoo inbound with the reviewed configuration pinned. GHL dry_run reads only; backfill imports historical contacts without assigning tasks or starting outreach. Kommo run_now scans all enabled routes, may import existing/new cards, move them, and trigger outreach. Odoo inbound uses its existing runtime gates, may enroll/contact leads, and cannot execute outbound sync. Explain those effects and get consent. queued/job_id is not completion. The worker rejects configuration drift. Inspect diagnostics or GHL import history afterward; do not retry an uncertain request blindly.
Agenda del CRM (4)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_agent_crm_booking_choices
workflows:read
Lectura
workflow_id, provider
Sin campo de contrato
List verified HubSpot meeting links or GHL calendars for an appointment task. GHL choices include location_id to distinguish sub-accounts. Resolve names here before setup; never guess a calendar ID. This reads the provider and does not change configuration.
get_agent_crm_booking
workflows:read
Lectura
workflow_id, provider
Sin campo de contrato
Read the task’s saved native CRM booking provider, installed tool IDs, calendar/link IDs, active flags and exact revision. Saved configuration is not a successful booking or runtime verification. Use before configure/remove and reread on conflict. Booking belongs to the appointment goal.
change_agent_crm_booking
workflows:write
Escritura
workflow_id, provider, action, expected_revision
confirm: true
Configure or remove native HubSpot/GHL booking for one appointment task. First read get_agent_crm_booking and list_agent_crm_booking_choices. configure requires a verified choice_id. Both actions require explicit user consent via confirm=true and expected_revision from the read. Installs/removes native booking tools and external-booking configuration atomically, with provider availability checks on setup. Locked tasks, changed revisions, another provider or hand-managed configuration may reject the change. Returns saved readback; does not book, cancel or reschedule a meeting. Never claim a real booking was tested.
get_agent_ghl_import_status
workflows:read
Lectura
workflow_id, connection_id
Sin campo de contrato
Read the latest 20 stored GHL import runs for an exact connection/location, worker state, recurrence state and configuration validity. Resolve connection_id through get_agent_integration_flows. Evidence covers the whole connection, potentially several tasks; never attribute connection counters to this task or claim connected means synced. No stored runs means no execution evidence, not successful sync. Returns safe counters and errors without lead payloads or credentials. Does not start an import. recurring_state: not_configured = auto-sync was never set up (blocker not_configured), not an error; valid; or invalid. configuration_errors only matter when recurring_state=invalid.
Diagnóstico y entradas CRM (6)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_agent_crm_diagnostics
workflows:read
Lectura
workflow_id, connection_id, provider
Sin campo de contrato
Read safe stored execution evidence for an exact HubSpot, GHL, Kommo, Zoho, Odoo or custom inbound connection. Read connection_id from get_agent_integration_flows. Provider counters cover the connection, possibly several tasks; custom evidence covers that task-owned entry. Connected/configured is never proof of successful sync. No history is not success. Raw vendor exceptions, credentials and lead payloads are excluded. Odoo reports actual runtime gates and unavailable outbound execution. Read never_received and last_data_received_at/_source/_scope first: never_received=true (GHL: intake key never used) means the CRM never called Nexor, so check the customer’s CRM webhook/automation, not Nexor data; scope=client is a key shared across connections. GHL adds last_webhook_at, last_webhook_outcome (skipped:* = routing skip, e.g. paused route, not a failure), intake_key_last_used_at, intake_key_active and recurring_state (not_configured = auto-sync never set up, not an error).
list_agent_hubspot_catalog
workflows:read
Lectura
workflow_id, catalog
Sin campo de contrato
Read verified HubSpot owners, lead/deal pipelines, or writable contact/deal property choices before configuring native tools and mappings. These are account choices read in a task context. No writes or imports.
count_agent_kommo_source
workflows:read
Lectura
workflow_id, connection_id, route_key
Sin campo de contrato
Count cards currently in one saved task-owned Kommo source stage without importing or moving anything. has_more=true means the count is a lower bound, not the total. The source can change after this read. Use exact route_key and connection_id from get_agent_integration_flows.
get_agent_odoo_inputs
workflows:read
Lectura
Ninguno
Sin campo de contrato
Read Odoo intake routes, inherited field mappings, lifecycle mappings, verified CRM catalogs and exact revision for one task or group. Reads provider metadata without importing records. Runtime apply availability is reported explicitly; saved configuration does not imply execution. Legacy connections only support route changes.
preview_agent_odoo_inputs
workflows:write
Escritura
connection_id, expected_revision, patch
confirm: true
Preview replacing one Odoo intake section for the selected task/group, preserving sibling tasks and shared ignore/observe rules. First read get_agent_odoo_inputs. routes/lifecycle values must use workflow IDs inside the selected scope. fields maps provider fields to canonical lead fields or metadata; inherit=true restores shared fields. Requires current connection and revision. Reads provider records and stores a preview fingerprint, but never imports or contacts leads. Counts cover the full connection, including preserved sibling routes, not only the selected task. Review counts and blockers before saving. Odoo runtime gates still apply.
change_agent_odoo_inputs
workflows:write
Escritura
connection_id, expected_revision, patch
confirm: true
Save the exact task/group Odoo intake patch after a fresh successful preview and explicit operator consent. Requires confirm=true, current revision and identical previewed patch. Saves through the same guarded service as the panel. Preserves sibling tasks, enforces task locks and available runtime gates. Returns committed scoped readback; never claim an import or outbound sync ran. Does not enable an unavailable Odoo engine.
Metadatos de sesión (1)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
whoami
Clave autenticada
Lectura
Ninguno
Sin campo de contrato
Return the authenticated Nexor client identity and the scopes this API key was granted. Call this first to discover which actions are permitted.
Preparación de la cuenta (1)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_account_readiness
Clave autenticada
Lectura
Ninguno
Sin campo de contrato
MANDATORY FIRST-RUN TOOL. At the start of a new customer conversation, call this before the first substantive reply. Returns account/payment state, granted and missing setup scopes, saved onboarding context, agents/channels/template inventory, a factual readiness checklist, the safest next tools, external human touchpoints, and initial_dialogue with the exact opening behavior. account.sms_eligible reports account-level SMS eligibility: US/CA by default, or the explicit account flag elsewhere; it does not prove a number has SMS enabled or bound. Each appointment-capable agent carries a booking block (meeting_type, hosts with schedule/calendar state, activation blockers such as MEETING_TYPE_REQUIRED / BOOKING_AVAILABILITY_REQUIRED / CALENDLY_BINDING_REQUIRED, timezone warnings, and fix_tools). Follow initial_dialogue; do not ask for facts in resume_context, do not mutate while payment/account access is blocked, and do not claim the account is ready merely because dashboard onboarding was marked complete or because an agent is active: an active agent with booking blockers cannot book.
Tareas (13)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_workflows
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the authenticated client’s workflows (the funnels leads move through), including each agent’s master_workflow_id group assignment, enabled channels, and status ids. Archived (soft-deleted) agents are hidden by default; pass include_archived:true to see them too — each row then carries archived:true and a deleted_at timestamp so you can find an archived agent to restore with restore_workflow.
get_workflow
workflows:read
Lectura
Ninguno
Sin campo de contrato
Fetch one workflow/agent with prompts/config, ordered status summaries, fields, channels and tool execution settings. Each field includes its metadata_key and intake_value_map when configured. Pass workflow_id, or name to resolve a task name or an agent name without calling list_workflows first (an agent name returns each of its tasks as workflows[], up to 4). Status summaries do not include their full gates/timeouts/transfers; pass include_statuses:true to get every status’s full configuration (as get_workflow_status returns it) in the same call. Use both for verification before activation. workflow.escalation_state {enabled, reason} is the runtime answer to whether the agent can hand a lead to a human (Escalated to executive); trust it over raw config keys.
create_workflow
workflows:write
Escritura
name, goal_type, statuses, master_workflow_id
Sin campo de contrato
Opt in with creation_mode:paused_unbound for task composition: no channel inheritance/assignment, newly created tasks mask all four contact channels (including shared availability), no activation, safe existing-task retries returned read-only. Returns composition_contract_version:1. Ordinary omitted mode preserves inherited channels. Create a new PAUSED workflow — ONE MODE (sub-agent) inside an AGENT (master workflow). master_workflow_id is REQUIRED: a workflow never exists without an agent, so create the agent first with create_agent_group (or pick one from list_agent_groups) and pass its id; a call without it is refused before any request is made. Provide an ordered list of statuses; each needs a key plus a name (or its label alias). If no is_initial/is_terminal flags are set, the first and last become entry/exit. Statuses accept the full stage config here — entry_hint, category, color, transition_rules, requires_all_fields/required_field_keys, timeout_config, transfer_config, pause_bot, can_return_on_reply (lost final stages), assignment_config and the is_* flags — so a funnel can be fully configured in one call instead of follow-up update_workflow_status PATCHes. Every non-initial status MUST carry an entry_hint (one sentence: when a lead enters it); a call missing one is refused before any request (status_entry_hint_required, listing the statuses). Unknown status fields are forwarded to the backend as-is. The statuses array is the COMPLETE funnel of YOUR stages: the backend seeds a default pipeline on create, so this tool reads the workflow back, deletes seeded statuses not in your list, and returns the workflow plus a pipeline_reconciliation report. Three core stages (new, contacted, engaged) and the virtual “discarded” stage ALWAYS exist on every agent and are NOT part of the statuses contract: they are never deleted and are listed under seeded_statuses_kept (reason core_stage/virtual) — do not try to remove them. The result carries a top-level status: “created” means the funnel is exactly what you asked; “created_with_warnings” means the report has REAL unresolved warnings (duplicate stage labels, non-core seeded stages that could not be removed, missing requested stages) — you MUST resolve those before telling the user the agent is built. Set prune_unrequested_statuses:false to keep seeded defaults. Pass timezone (IANA) and region_style: when omitted the backend anchors them to the ACCOUNT (country/host schedule), never to a Chilean default — read them back in the returned workflow. BORN WITH (inherited, never asked): the mode inherits its AGENT’s channels, contact schedule, persona name (agent_name = the agent’s human name), language and timezone. The tool resolves them itself before the create: from the agent’s other live modes when it has any, otherwise (first mode) from the account — every channel the account holds a verified resource for — with the backend’s schedule default. It then binds the resources (one WhatsApp number and one SMS route per agent, shared by its modes; the account-wide number for calls; the agent’s email sender on every mode) and returns inheritance (what was inherited and from where) plus channel_bindings (per channel: bound / already_bound_in_group / client_scoped_available / owned_by_other_agent / no_resource). A resource another agent owns is NEVER taken silently — it comes back as owned_by_other_agent for the operator to decide. So OMIT channels, contact_schedule and agent_name unless the operator explicitly asked for something different for this mode. When the first-contact channel has no verified resource on the account, the result carries a channel_not_verified warning with the fix tools (connect_whatsapp_number, provision_phone_number, register_email_sender). Idempotent on the backend (a guarded duplicate returns the existing id; stages holding leads are never deleted, only reported). Each call creates ONE MODE (sub-agent) of an agent; a build is normally 2–3 modes split by intent and register (sell → follow up → discount), never one broad mode unless the operator explicitly asked for exactly one, never 5+. Before the first create call describe_agent_configuration (mode_split) + review_agent_system_plan, resolve clarifications, and obtain explicit user approval of the final plan summary (“Does this look ok? Let me know and I’ll build it.”); never show the plan_fingerprint or the word “fingerprint” to the user. CONTACT HOURS: a mode inherits its agent’s windows when the agent already has modes; the first mode gets Mon–Fri 09:00–18:00 ONLY when nobody said anything about hours. If the operator hinted at hours anywhere (after-hours, overnight, 24/7, weekends, specific times, a use case that only exists outside office hours), pass contact_schedule explicitly — never let the default apply to such an agent. The result carries contact_schedule {source: explicit | inferred_from_description | default_business_hours, windows}: tell the operator what the agent was born with in one line, and if source is default_business_hours for an agent that should not keep business hours, fix it with set_workflow_cadence. CHANNELS AND HOURS ARE NEVER QUESTIONS, for any agent: they are inherited as described above. Tell the operator in one line what the mode was born with (channels, hours) from inheritance.
set_workflow_prompt
workflows:write
Escritura
workflow_id, global_prompt
Sin campo de contrato
Replace a workflow’s base (global) prompt — the business rules and persona the agent follows across channels. Read the current one with get_workflow first if you want to edit rather than overwrite. Channel-specific overrides are not touched — so a BEHAVIOR CHANGE (a new rule, condition, or metadata-driven branch such as ‘if metadata X > 50 do Y’) is not finished here: also write it, in that channel’s register, into every channel prompt that has a body (get_workflow → channel_prompts) with set_channel_prompt, unless the operator scoped the change to one channel or to the base prompt only. SMS and iMessage outbound messages are composed from the channel prompt ALONE when one exists, so a rule left only in the base prompt never reaches them.
set_workflow_active
workflows:write
Escritura
workflow_id, active
Sin campo de contrato
Turn one task on or off. For mutually dependent paused tasks, pass related_workflow_ids only after the operator explicitly agrees to activate every named task together; all are checked before one atomic activation. Activating contacts enrolled, not-yet-contacted leads per cadence (calls wait for the task’s contact hours; messages go right away unless restricted to its hours), and resumes leads paused mid-cadence at their next touchpoint. Do-not-contact leads and reply-only tasks are excluded. Use exact IDs from the selected agent, never another agent. Without related_workflow_ids, only workflow_id changes. Appointment tasks still need booking readiness. On TRANSFER_TARGET_PAUSED a handoff target is only paused, not missing: name the activate_together tasks to the operator, get agreement, then retry once with related_workflow_ids = activate_together plus any IDs already sent.
update_workflow
workflows:write
Escritura
workflow_id
Sin campo de contrato
Update a workflow’s identity, metadata, agent assignment or reply-only switch: rename it, change its description, set the objective of a ‘custom’ goal workflow (goal_statement), move it into another agent (master_workflow_id — never null: a mode always belongs to an agent, so it is moved, not detached), adjust the agent’s identity (language, timezone, region_style, agent_name, agent_role, company_name, begin_message), or set inbound_only (true = the mode NEVER writes first: no first contact and no cadence when a lead enrols or is transferred in, while replies to inbound messages stay immediate; the canonical setting for a support mode). Pass only the fields you want to change. Use list_agent_groups to resolve a group name to its tenant-scoped id.
set_channel_prompt
workflows:write
Escritura
workflow_id, channel, prompt
Sin campo de contrato
Set the per-channel prompt override for a workflow (e.g. WhatsApp vs email tone/format). Merges with existing channel prompts; doesn’t touch the global prompt. Use ‘call’ for the voice/call channel (‘retell’ is still accepted as an alias). For sms and imessage this prompt is the ONLY one the outbound composer reads when it exists, and the call/WhatsApp overlays are what the agent follows turn by turn — so a behavior change the operator asked for without naming a channel goes into the base prompt (set_workflow_prompt) AND into every channel that has a body, one set_channel_prompt per channel, read first so you merge the rule into the existing text instead of replacing it. Name a single channel only when the operator did.
get_workflow_prompt_history
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read one workflow’s prompt version history — snapshots of global + channel prompts, what changed, by whom, and when. workflow_id must be the exact UUID returned by list_workflows/get_workflow; never pass a name, change id, or placeholder text. Pass versions to read specific version numbers, including ones older than the latest 50.
update_workflow_structure
workflows:write
Escritura
workflow_id
Sin campo de contrato
Add or edit a workflow’s basic funnel statuses and/or data fields. Upsert by key — new keys are added, existing ones updated; nothing is deleted. A field’s metadata_key prefills it from lead metadata, and intake_value_map can normalize incoming string values to canonical field values. Status order is deliberately unsupported here: use reorder_workflow_statuses. A new non-initial status needs an entry_hint (refused with status_entry_hint_required otherwise). After creating statuses, use update_workflow_status for qualification gates, timeouts, transfers, pause behavior and trigger flags. To remove one safely, use get_pipeline_impact then delete_workflow_status.
update_workflow_config
workflows:write
Escritura
workflow_id, config
Sin campo de contrato
Update a workflow’s behaviour config (the config bag: flags like gate_outbound_to_hours and other non-prompt settings). Merges top-level keys by default — pass only the keys you want to change; existing keys are preserved. Set replace:true only to overwrite the entire config object (rare). Does not touch the prompt, statuses, fields, or channels. Reserved keys are REFUSED here (400 RESERVED_CONFIG_KEY) because the runtime reads them by exact key and a misspelled key would merge silently: use set_payment_link for payment_link, set_host_assigner for host_assigner and set_external_booking for external_booking — those validate the shape and the referenced tools. HUMAN HAND-OFF: pass escalation:{enabled:true} to turn it on (this also restores a deleted ‘Escalated to executive’ stage) or escalation:{enabled:false} to turn it off, then confirm with escalation_state in the response. escalation is deep-merged, so pass only the keys you change. escalation.trigger_text: the cases that hand off, one per line; it REPLACES the default cases (a question the agent cannot answer, a policy/eligibility question), so restate any default you still want. escalation.signoff_text: guidance for the goodbye/holding message the agent sends when it hands off. escalation.voice_enabled:true also hands off on phone calls (off by default): the agent says goodbye and the team follows up by message. Never emulate hand-off with a custom HTTP tool: only the built-in escalation pauses the agent and notifies the team.
set_opening_message
workflows:write
Escritura
workflow_id, channel
Sin campo de contrato
Set the agent’s FIRST message for one channel — the fixed opener sent/spoken verbatim before the agent improvises. channel ‘call’ (voice): message is the opening line spoken when the call connects (flat variables {{lead_first_name}}, {{lead_full_name}}, {{agent_name}}, {{company_name}}; a variable the lead lacks is sent empty, never spoken; ” clears it and the agent opens with its own greeting from the prompt, e.g. ‘Hola, soy Valentina de Kaufmann. ¿Hablo con Raimundo?’); agent_speaks_first (default true) — set false to make the agent wait for the lead to speak, optionally with silence_ms (1000–30000, default 3000) before it opens anyway. channel ‘email’: a fixed first email subject + body sent verbatim (variables {{first_name}}, {{last_name}}, {{email}}, {{metadata.key}}); enabled:false with empty subject/body removes it so the agent composes the first email itself. channel ‘webchat’: message shown by the widget before the agent speaks. channel ‘sms’: message sent verbatim as the first outbound SMS (same variables as email; a legally required STOP notice is still appended for US numbers). channel ‘messenger’: message sent verbatim as the agent’s first reply in a new Messenger conversation. channel ‘imessage’: message sent verbatim as the first outbound iMessage (Apple Messages for Business: no STOP notice; variables {{first_name}}, {{lead_first_name}}, {{last_name}}, {{full_name}}, {{email}}, {{metadata.key}}, plus {{company_name}} and {{agent_name}}); without it the agent composes the opener from the workflow prompt, the iMessage channel prompt (set_channel_prompt channel ‘imessage’) and the lead’s metadata. For call/webchat/sms/messenger/imessage, ” clears the opener so the agent composes it from the prompt. NOT free text: WhatsApp openers are Meta-approved templates → set_opening_templates; Instagram campaign openers are dashboard-only. Returns the persisted opener as read-back; read every channel’s opener with get_workflow → opening_messages. / Configura el PRIMER mensaje del agente por canal: ‘call’ (línea de apertura de voz + quién habla primero), ‘email’ (asunto + cuerpo fijos), ‘webchat’, ‘sms’, ‘messenger’ e ‘imessage’ (texto fijo del primer mensaje). WhatsApp usa plantillas aprobadas (set_opening_templates).
set_payment_link
workflows:write
Escritura
workflow_id, source
Sin campo de contrato
Set (or clear) where a ‘Send Payment Link’ agent gets the link it sends to leads — the backing for the dashboard’s Payment link section. Pick the source: ‘fixed’ = one static URL for every lead (needs a valid http(s) url; optional label); ‘tool’ = a tool generates a per-lead link (needs the tool name; optional capture dot-path into the tool’s JSON response, e.g. ‘data.url’); ‘lead’ = read the link from a lead metadata field (needs metadata_key, e.g. ‘payment_url’); ‘none’ = clear the configured link. Use this instead of writing config.payment_link through update_workflow_config: this validates the shape and reads the saved value back, so a success here means it actually persisted. / Configura de dónde saca el link de pago un agente de ‘Enviar link de pago’: ‘fixed’ (URL fija http(s), label opcional), ‘tool’ (una herramienta genera el link; capture opcional), ‘lead’ (leer de metadata_key del lead) o ‘none’ (borrar). Devuelve el valor guardado como verificación.
set_conversion_destination
workflows:write
Escritura
destination_workflow_id
Sin campo de contrato
Set (or clear) where a lead goes when it converts — the agent and status Nexor moves it to after create_conversion or the public conversions endpoint fires. Configure it on one agent (workflow_id) or on a whole agent group (agent_group_id): precedence at conversion time is the conversion type’s destination, then the lead’s current agent, then its group; the first one configured wins, and with none the lead stays put. destination_workflow_id may be the same agent (status change only). Pass destination_workflow_id: null to clear (destination_status_key must then be omitted); when set, destination_status_key is required and must be a status of that destination agent. The response is a read-back of what the database now holds (conversion_destination with workflow name, status label and source), so a success here means it persisted. Read the effective value later with get_workflow / get_master_workflow. / Define a qué agente y estado se mueve un lead cuando convierte, en un agente (workflow_id) o en un grupo (agent_group_id). Precedencia: tipo de conversión > agente > grupo. null borra la configuración. Devuelve el valor guardado como verificación.
Herramientas de tareas (7)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_workflow_tools
workflows:read
Lectura
workflow_id
Sin campo de contrato
List a workflow’s custom tools (name, method, url, active, stage gate, on-entry, call-once).
create_workflow_tool
workflows:write
Escritura
workflow_id, name, description, url
Sin campo de contrato
Create a CUSTOM tool that lives only in THIS workflow (no catalog inheritance). Prefer create_client_tool + assign_tool_to_workflow when the tool should be reusable across workflows. name is the snake_case identifier the agent references (immutable). description tells the agent when to call it. parameters is a JSON Schema for the call arguments. URL rule: tool ARGUMENTS go in the url with SINGLE braces (/citas/{id_cita}). Double braces are ONLY for context values resolved before the call: {{env.KEY}} for secrets, {{lead.metadata.X}}, {{lead_id}}. Never {{arg}} for an argument: it is rejected with 400 invalid_url_placeholder and a suggested_url. call_once caches the result per lead; auto_run_on_entry fires it when a lead enters the workflow; available_in_statuses gates it to funnel stages. Create it with is_active=false, run test_workflow_tool, and activate it (update_workflow_tool is_active=true) only after the test returns passed=true.
update_workflow_tool
workflows:write
Escritura
workflow_id, tool_id
Sin campo de contrato
Edit a custom tool’s config (url, method, description, parameters, headers, timeout, flags, is_active). The name cannot change; delete and recreate to rename. URL rule: tool ARGUMENTS go in the url with SINGLE braces (/citas/{id_cita}). Double braces are ONLY for context values resolved before the call: {{env.KEY}} for secrets, {{lead.metadata.X}}, {{lead_id}}. Never {{arg}} for an argument: it is rejected with 400 invalid_url_placeholder and a suggested_url. After changing url, method, parameters, headers or query_parameters, run test_workflow_tool and set is_active=true only after the test returns passed=true.
test_workflow_tool
workflows:write
Escritura
workflow_id, tool_id
Sin campo de contrato
Run one custom HTTP workflow tool once through the same path the agent uses: secrets, context, path and query parameters, and headers. The external system is called for real, but no Nexor lead or run changes. Works on inactive tools. Returns request (secrets redacted), response, what the agent sees, unresolved placeholders, and passed. called=false means the request never left; read agent_sees. Use args for model arguments and lead_metadata for {{lead.metadata.X}}. There is no lead, so test tools that need {{lead_id}} or other lead properties in Playground. GET runs directly. POST, PUT, PATCH, and DELETE need confirm_write=true after explicit operator approval, test data, and a cleanup path defined before execution. Never activate a tool whose test did not pass. Nexor platform tools return internal_tool_not_testable; test them in Playground.
set_workflow_tool_execution
workflows:write
Escritura
workflow_id, tool_id, mode
Sin campo de contrato
Choose exactly how an assigned workflow tool runs. mode=“on_entry” makes it a pre-agent/pre-execution hook: it fires as soon as a lead enters the workflow, before the first agent message, and therefore clears stage gating. mode=“agent_decides” lets the conversational agent call it and optionally gates it to specific status keys. These modes are mutually exclusive. call_once limits successful execution per workflow run; is_active is an independent kill switch.
delete_workflow_tool
workflows:write
Escritura
workflow_id, tool_id
Sin campo de contrato
Remove a custom tool. Soft-disables by default (keeps audit); pass hard=true to delete permanently.
set_tool_stage_gate
workflows:write
Escritura
workflow_id, tool_id
Sin campo de contrato
Gate a tool to specific funnel stages: it becomes callable only when the lead is in one of available_in_statuses. Pass null to clear the gate (callable anywhere).
Tools reutilizables del cliente (6)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_client_tools
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the client’s reusable tool catalog. Tools here can be assigned to multiple workflows and stay in sync.
create_client_tool
workflows:write
Escritura
name, description, url
Sin campo de contrato
Create a reusable tool in the client catalog. This is the RECOMMENDED low-level path for an existing customer API operation that should be available across workflows; configure_customer_api_tool is the guided create-and-assign path. name is the immutable snake_case function identifier. description is loaded into the agent and must say when/how to call the API without containing credentials. parameters is the agent-visible JSON Schema. Use {{env.KEY}} in url/headers for secrets configured with set_function_environment_variable; lead/context placeholders are also supported.
configure_customer_api_tool
workflows:write
Escritura
name, purpose, when_to_use, url
Sin campo de contrato
Turn one operation from an API the customer owns or already uses into a reusable Nexor agent tool, then optionally assign it to workflows. Creates the catalog tool, composes scoped agent instructions from purpose/when-to-use/when-not-to-use/response rules, and configures per-workflow stage gates, call-once behavior, and response-field allowlisting. Model one focused API operation per tool. Store credentials with set_function_environment_variable and reference them as {{env.KEY}} in headers; NEVER put credentials in purpose/instructions/parameter descriptions. This creates a new immutable name; use list_client_tools + update_client_tool when that name already exists.
update_client_tool
workflows:write
Escritura
tool_id
Sin campo de contrato
Edit a catalog tool’s config. Changes propagate to every workflow that has assigned (inherited) this tool. The name cannot change — delete + recreate to rename.
delete_client_tool
workflows:write
Escritura
tool_id
Sin campo de contrato
Remove a tool from the client catalog.
assign_tool_to_workflow
workflows:write
Escritura
client_tool_id, workflow_id
Sin campo de contrato
Assign a catalog tool to a workflow; it inherits and stays in sync with the catalog tool. Idempotent — re-assigning an already-assigned tool returns the existing assignment.
Navegación web (1)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
read_page
workflows:read
Lectura
url
Sin campo de contrato
Read ONE public web page and get its text content back (as markdown) — like the web-fetch tool in Claude/Codex. Use this to reference a website while helping a client build or configure their agent: e.g. read their homepage/services/pricing page so you can summarize it, seed a knowledge base, or draft prompt copy from it. Give the full http(s) URL of a single public page. One page per call, no crawling and no link-following: to read another page (including one linked from this one), call read_page again with that URL. The content is returned to YOU, the assistant — it is never inserted into a lead conversation. Public pages only (login-walled or empty pages come back as an error), and it runs on Nexor’s own scraper, so the client is not charged. Optional max_chars (1-100000, default 50000) caps how much text is returned. For ‘the agent should know my whole site’, use the knowledge base tools instead — that ingests many pages the agent then draws on at answer time.
Leads (17)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_leads
leads:read
Lectura
Ninguno
Sin campo de contrato
Page through the authenticated client’s leads with optional search, workflow and human-assignee filters. When looking up specific people (search), pass include_detail:true: if 3 or fewer leads match, each comes back with its recent history (newest 20 items) and run_state in the same call. A workflow_id includes active and settled/inactive membership by default, matching get_pipeline_impact; pass run_state=active only for current runs. Every lead includes assigned_to plus assigned_user when assigned; use list_team (people:read) for the directory. For recurring polls, pass updated_since with sort_by=updated_at sort_dir=asc and resume from the max updated_at seen. in_support: the lead is waiting on a person (pending escalation or stage handoff) — the agent does not reply, even if is_paused is false; it does not mean someone is assigned.
get_lead
leads:read
Lectura
lead_id
Sin campo de contrato
Fetch one lead by id, including its assigned human owner (assigned_to and assigned_user id/name, or null), field values, per-channel engagement and active workflow run. Use list_team (people:read) for the complete user directory. in_support: the lead is waiting on a person (pending escalation or stage handoff) — the agent does not reply, even if is_paused is false; it does not mean someone is assigned.
get_leads
leads:read
Lectura
lead_ids
Sin campo de contrato
Batch read many leads by id in ONE call (1-500 per call), each with the same field values, per-channel engagement and workflow runs as get_lead. Always prefer this over calling get_lead in a loop — N sequential get_lead calls burn the rate limit. Unknown ids come back in missing_ids. in_support: the lead is waiting on a person (pending escalation or stage handoff) — the agent does not reply, even if is_paused is false; it does not mean someone is assigned.
get_lead_history
leads:read
Lectura
lead_id
Sin campo de contrato
Read what was actually said or sent to ONE lead. The unified timeline returns full WhatsApp and SMS text, email subject/body plus delivery details, and call summary/transcript, with direction and timestamps; it also includes activities, meetings and conversions when unfiltered. Use channel=call,whatsapp,email,sms (one or comma-separated) to isolate communication content. The current stage is in current_stages (one per active run, unaffected by filters and paging; null if unreadable) and get_lead (newest active run only). Never infer it from history: stage changes are stored under the channel that triggered them (many under system), so a channel filter can hide some. Paging mode uses limit/offset and order_by; when pagination.has_more is true, keep paging before claiming the history is complete. Conversation-window mode uses anchor_ts with before/after (0-20 each) to inspect the messages around one moment. Use list_transcripts/get_transcript only for meeting transcripts, not phone calls.
upsert_leads
leads:write
Escritura
leads
Sin campo de contrato
Create or update one or more leads (idempotent upsert on email/phone). When workflow_id is provided, enrollment has MOVE semantics: every other active run is deactivated before the target run is created, and the result is verified by reading each successful lead back. Use assign_lead_to_workflow for an already-known lead id. If the task is ACTIVE, enrolled leads are contacted right away per its cadence (calls wait for the contact hours of the task; messages go right away unless the task restricts messages to its hours); do-not-contact leads and reply-only tasks are excluded. If it is paused, contact starts when it is turned on. WARNING: first_message sends a real outbound message immediately (no agent composition) and also requires messages:send; first_channel only pins the first cadence channel.
update_lead
leads:write
Escritura
lead_id
Sin campo de contrato
Update one lead. Put identity/contact values in standard fields (first_name, last_name, email, phone), and other agent-readable context in metadata. Metadata is shallow-merged and becomes available to the agent on its next execution; it does not change contact destinations or send data externally. Archived leads are rejected.
sync_lead_tags
leads:write
Escritura
tags
Sin campo de contrato
Set the exact tag set for a lead (empty clears all tags). Identify the lead by id or email.
assign_lead_to_workflow
leads:write
Escritura
lead_id, workflow_id
Sin campo de contrato
Move a lead into a workflow: deactivates the current run, creates a fresh run and starts its cadence. If the task is ACTIVE the lead is contacted right away per its cadence (calls wait for the contact hours of the task; messages go right away unless the task restricts messages to its hours); do-not-contact leads and reply-only tasks are excluded. If paused, contact starts when it is turned on.
stop_automation
leads:write
Escritura
lead_id
Sin campo de contrato
Human takeover ON for a lead: pause its cadence and cancel pending scheduled tasks. The active workflow is resolved automatically; only pass workflow_id if the lead is in more than one.
resume_automation
leads:write
Escritura
lead_id
Sin campo de contrato
Human takeover OFF for a lead; optionally reactivate its cadence (may resume outbound contact).
set_lead_status
leads:write
Escritura
lead_id, status_key
Sin campo de contrato
Force a lead’s funnel status (move it forward or back). The active workflow is resolved automatically; pass workflow_id only if the lead is in more than one.
bulk_set_lead_status
leads:write
Escritura
lead_ids, status_key
confirm_transfer_side_effects: true
Set the funnel status for many leads at once (1-500 per call). Applies the same per-lead status change (with history) as set_lead_status; leads that can’t be updated come back in failed with a reason. When the target status auto-messages (transfer_config), those leads are withheld with reason transfer_side_effects_require_confirmation — confirm with the operator, then re-call with confirm_transfer_side_effects=true to include them.
bulk_assign_leads_to_workflow
leads:write
Escritura
lead_ids, workflow_id
Sin campo de contrato
Move many leads (1-500 per call) into a workflow: each gets its current run deactivated and a fresh run with cadence started. If the task is ACTIVE, leads are contacted right away per its cadence (calls wait for the contact hours of the task; messages go right away unless the task restricts messages to its hours); do-not-contact leads and reply-only tasks are excluded. If paused, contact starts when it is turned on. Failures come back per lead in failed.
bulk_archive_leads
leads:write
Escritura
lead_ids
Sin campo de contrato
SOFT delete (archive) many leads at once (1-500 per call). REVERSIBLE: the leads disappear from active views and their automation stops, but the records are kept and can be restored. This does NOT permanently erase anything — for that, use bulk_hard_delete_leads. When the operator asks to “delete”/“remove”/“borrar”/“eliminar” leads and it is not crystal clear whether they mean archive (reversible) or permanent erase (irreversible), ASK before calling either tool. Confirm before calling. Failures come back per lead in failed.
delete_lead
leads:write
Escritura
lead_id
Sin campo de contrato
SOFT delete (archive) one lead. REVERSIBLE: the record is kept and can be restored; this does NOT permanently erase it — for that, use hard_delete_lead. When the operator asks to “delete”/“remove”/“borrar”/“eliminar” a lead and it is not crystal clear whether they mean archive (reversible) or permanent erase (irreversible), ASK before calling either tool.
hard_delete_lead
leads:delete
Escritura
lead_id
confirm: true
PERMANENTLY delete one lead. IRREVERSIBLE AND NOT RECOVERABLE: the lead and ALL of its data — every conversation, message, meeting, call, field value, note, and task — are erased forever. There is no undo and no restore. This is NOT archiving (use delete_lead for reversible archiving). Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms permanent erasure of this exact lead. When “delete”/“remove”/“borrar”/“eliminar” is ambiguous between archive and permanent erase, ASK first — never assume hard delete.
bulk_hard_delete_leads
leads:delete
Escritura
lead_ids
confirm: true
PERMANENTLY delete many leads at once (1-500 per call). IRREVERSIBLE AND NOT RECOVERABLE: each lead and ALL of its data — every conversation, message, meeting, call, field value, note, and task — are erased forever. There is no undo and no restore. This is NOT archiving (use bulk_archive_leads for reversible archiving). Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms permanent erasure of these exact lead ids. When “delete”/“remove”/“borrar”/“eliminar” is ambiguous between archive and permanent erase, ASK first — never assume hard delete. Failures come back per lead in failed.
Reglas (9)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_reminder_catalog
rules:read
Lectura
Ninguno
Sin campo de contrato
The reminder contract for THIS account: channels with per-account availability (available_for_account + reason, e.g. retell needs an active callable number, sms an SMS-enabled number, whatsapp an active WhatsApp number, email a verified sender), trigger events the runtime actually dispatches (with which ones are reconciled onto existing bookings), delay references and default templates. Call it before set_reminder_rule when choosing a channel; pass workflow_id for the workflow-scoped answer.
list_reminder_rules
rules:read
Lectura
Ninguno
Sin campo de contrato
List lead-facing reminder rules (booking confirmations, pre-meeting reminders).
set_reminder_rule
rules:write
Escritura
trigger_event, template_name
Sin campo de contrato
Create or update a lead reminder rule (idempotent). Channels: whatsapp | retell | sms | email — whether each one can actually send on this account comes from get_reminder_catalog (available_for_account); a rule on an unavailable channel is stored but the response carries warning ‘channel_not_available’ until the sender is provisioned. trigger_event ‘call_analyzed’ fires post-CALL, not post-meeting; there is no ‘reschedule’ event (a reschedule re-fires event_created). delay_minutes is signed: negative with delay_reference=‘event_start’ means before the meeting. Example: {trigger_event:‘event_created’, channel:‘whatsapp’, template_name:‘confirm_booking’, delay_minutes:0}.
list_host_reminder_rules
rules:read
Lectura
Ninguno
Sin campo de contrato
List host (sales rep) notification rules. Email-only. Note: cancellation notifications are on by default and may not appear here.
set_host_reminder_rule
rules:write
Escritura
trigger_event, template_name
Sin campo de contrato
Create or update a host booking-notification rule (notify the rep by email when a meeting is booked; idempotent). Omit workflow_id for a global rule. Note: host cancellation and reschedule alerts are already sent by default and are not configured here.
list_recontact_rules
rules:read
Lectura
Ninguno
Sin campo de contrato
List re-engage (recontact) rules that drive the AI scanner re-contacting stale leads. Each rule carries cadence_owned (true when its stage belongs to the initial outreach cadence, so it can never be active).
set_recontact_rule
rules:write
Escritura
name, stale_after_hours
Sin campo de contrato
Create or update a re-engage rule (idempotent). The initial outreach cadence OWNS the stages new, contacted and the workflow’s initial stage: an active rule there returns 409 CADENCE_OWNED_STAGE (fix: target a later custom stage such as engaged/proposal_sent, or send is_active:false). prompt_hint is a binding instruction to the AI. A rule is identified by workflow_id + trigger_status_key: editing an existing one changes only the fields you send and keeps the rest (send prompt_hint "" to clear it). Defaults apply only when creating: stale_reference ‘last_touchpoint_at’ (recommended; ‘last_response_at’ silently freezes silent leads), cooldown 24, max_attempts 5, priority 5, on_exhausted mark_cold, active.
list_status_timeout_rules
rules:read
Lectura
Ninguno
Sin campo de contrato
List status auto-timeout configs: the per-stage delays ({timeout, unit, target_status_key}) that move a lead to another status after time in a stage. This is the native delay primitive — read it before proposing any wait or delayed-handoff timing.
set_status_timeout_rule
rules:write
Escritura
workflow_id, status_key
Sin campo de contrato
Set or clear the auto-timeout on a workflow status — the NATIVE way to add a delay between stages (dashboard: “If the lead does not reply → After N hrs → Move to”). After timeoutunit (minutes|hours|days) counted from the moment the lead entered status_key (a reply does not reset it; a status change does), the lead moves to target_status_key, which must be an existing status key in the SAME workflow. Delayed handoff to another agent: point it at a terminal status that carries transfer_config — the transfer fires on arrival. Chain statuses for multi-step waits (each timer starts on entry). Use this before any Scheduled Function, Background Job or recontact rule for “wait N hours, then move/transfer”. The source status must not be terminal or the goal stage (the timeout would never fire). Pass clear:true to disable.
Personas e invitaciones (7)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_team
people:read
Lectura
Ninguno
Sin campo de contrato
List the authenticated client’s active team members (sales reps / hosts) with user id, name, email, CRM external id and can_receive_escalations (whether escalation routing can assign them); pass include_inactive:true to also get removed members (is_active:false) so you can name a former teammate. Use these user ids with assigned_to filters; lead and conversation reads expose the matching assigned_user by default.
get_team_availability
people:read
Lectura
Ninguno
Sin campo de contrato
Owners and admins only. Read who is Active or Away for lead assignment. Returns members (user_id, name, role, availability active|away, changed_at = since when, changed_by self|idle|admin, last_seen_at = last used the app, in_rule_stage, open_leads, assigned_today), waiting_leads (leads that arrived when nobody in the stage’s list was Active; max 100, oldest first), stages that assign an owner on entry (active_only = whether “only Active” is on, members, active_members) and idle_minutes. How it works (accounts where this answers): new members start Away; a member who does not use the app for idle_minutes is set Away automatically (checked every 5 min); waiting leads are handed out automatically, oldest first, as people turn Active. Going Away never moves leads already assigned. Change the idle time with set_availability_idle_time; set someone Away with set_member_away.
set_member_away
workflows:write
Escritura
user_id
Sin campo de contrato
Owners and admins only. Set a team member Away, so stages with “only Active” stop giving them new leads. Away only: this tool never sets anyone Active; members turn themselves Active in the app. Leads already assigned to them stay with them. Use a user_id from get_team_availability or list_team. Returns { user_id, availability, changed_at, changed_by }.
set_availability_idle_time
workflows:write
Escritura
idle_minutes
Sin campo de contrato
Owners and admins only. Set how many minutes a member can go without using the app before they are set Away automatically (default 50). Whole number from 10 to 480; applies to the whole account. Never sets anyone Active. Read the current value with get_team_availability. Returns { idle_minutes }.
list_pending_invitations
people:read
Lectura
Ninguno
Sin campo de contrato
List outstanding invitations (not yet accepted, not cancelled, not expired). Consult this before inviting to avoid duplicates.
invite_user
invites:write
Escritura
email, role
Vista previa con dry_run
Invite a person to the client’s organization by email and role. Idempotent: a still-valid pending invite to the same email is reused, not re-sent. Returns status: created | reused | already_member.
revoke_invitation
invites:write
Escritura
Ninguno
Sin campo de contrato
Cancel a pending invitation by id or email (preserves audit; does not hard-delete).
Mensajería (8)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_whatsapp_templates
leads:read
Lectura
Ninguno
Sin campo de contrato
List the client’s WhatsApp templates with components, variables, status, internal_type, language, quality_score, rejection_reason, is_in_pool and sync timestamps, plus totals { total, by_status }. Defaults to APPROVED; pass status=ALL for a complete terminal-readable approval dashboard, or select PENDING/REJECTED/etc. Filters: internal_type, language prefix, and q (name/body substring). For fresh Meta state call check_whatsapp_template_approvals.
get_whatsapp_template
whatsapp:read
Lectura
Ninguno
Sin campo de contrato
Fetch one WhatsApp template in full detail: status, internal_type, language, category, components, variables, quality_score, rejection_reason (when Meta rejected it), whether it is in a cadence pool, and sync timestamps. Look it up by template_id (from list_whatsapp_templates) or by exact name.
review_whatsapp_template_drafts
whatsapp:read
Lectura
templates
Sin campo de contrato
Read-only preflight for one or many WhatsApp template drafts. Use it as the conversational back-and-forth loop: generate drafts from the user requirement, call this tool, show errors/warnings and normalized_templates, revise, and repeat. It verifies the connected WhatsApp account, Meta formatting, examples for every variable, buttons, duplicate names/bodies, and cadence purpose. When all_valid=true it returns a review_id; show the exact normalized_templates to the user and get final sign-off before create_whatsapp_templates_batch.
create_whatsapp_templates_batch
whatsapp:write
Escritura
templates, review_id, confirm
confirm: true
Submit 1-20 reviewed WhatsApp templates to Meta in one confirmed operation. REQUIRED FLOW: review_whatsapp_template_drafts → show normalized drafts and review_id → obtain explicit user sign-off → call this tool with those exact drafts, review_id, confirm=true. Never invent confirmation. Meta writes are not atomic, so the result reports every accepted, already-existing, or failed item; then use check_whatsapp_template_approvals to refresh approval states.
create_whatsapp_template
whatsapp:write
Escritura
name, body
Sin campo de contrato
Create a new WhatsApp template and submit it to Meta for approval (usually minutes to 48h). Templates are AGENT-SPECIFIC: first resolve the target agent (ask, or list_workflows) and read it with get_workflow so the copy matches that agent’s persona, goal, product, and language — never write generic copy. After creation, wire the template into THAT agent’s cadence with set_whatsapp_template_purpose plus set_template_pool / set_opening_templates, or it is never auto-used. Body text uses {{variable}} placeholders — variables cannot start/end the text nor be consecutive. Name must be lowercase_with_underscores. PREFER the canonical variable names Nexor auto-resolves at send time: {{nombre}} (lead first name), {{agente}} or {{ejecutivo}} (agent name), {{empresa}} (company), {{producto}} (product), and for meeting reminders {{fecha}}, {{hora}}, {{asesor}}, {{link_reunion}}. Other names still work but fall back to LLM resolution. channel_id is optional when the client has a single WhatsApp business account (use list_whatsapp_numbers to disambiguate).
send_message
messages:send
Escritura
lead_id, channel
Sin campo de contrato
Send an outbound message to a lead. WhatsApp/email/sms/imessage accept free text; outside the 24h WhatsApp window you must pass an approved template_id instead of text. channel=“sms” sends via the workflow’s SMS-enabled number. channel=“imessage” sends a blue-bubble iMessage via the workflow’s bound iMessage number (free text, no templates). channel=“call” triggers an outbound call. workflow_id is optional — it is resolved from the lead’s active run when omitted.
send_whatsapp_template_bulk
messages:send
Escritura
lead_ids, template_id, confirm
confirm: true
Send one APPROVED WhatsApp template to up to 500 leads in one operation. Each lead gets the same send as send_message with a template_id. REQUIRED FLOW: call with confirm=false first. It sends nothing and returns the template (name, language, category) and lead_count. Show that to the user, get explicit sign-off, then call again with the same arguments and confirm=true. Never invent confirmation. The confirmed call returns bulk_id right away and sends in the background, one lead every ~3 s per WhatsApp number (500 leads take ~25 min). Nexor’s warm-up caps do not apply, except on a number with RED quality or a strict safety profile: there, if a cap is hit, the remaining leads are marked not_sent and can be sent later with a new call. Meta’s own daily messaging limit for the number still applies. Variables resolve per lead automatically. workflow_id is optional: omit it to use each lead’s active workflow. Track progress with get_whatsapp_template_bulk_send.
get_whatsapp_template_bulk_send
messages:send
Escritura
bulk_id
Sin campo de contrato
Progress of a bulk send started with send_whatsapp_template_bulk. Returns status (queued | running | completed), lead_count, pending, counts by lead status and every lead’s status: sent (with message_id), failed or not_sent (with error; rate_limit:* means the cap of a RED-quality or strict number was reached), ambiguous_delivery or delivery_pending. Never re-send to an ambiguous_delivery or delivery_pending lead: the message may already have arrived. Results are kept for 7 days.
Cuenta (8)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_lead_meetings
leads:read
Lectura
lead_id
Sin campo de contrato
List a lead’s calendar events with host and meeting type.
create_meeting
meetings:write
Escritura
lead_id, starts_at, ends_at
Sin campo de contrato
Log a booked meeting against an existing lead (no Google Calendar sync). Idempotent via external_event_id.
ingest_meeting_notes
meetings:write
Escritura
external_meeting_id, provider
Sin campo de contrato
Attach an external transcript / summary / action items to an existing meeting. The meeting is resolved via calendar_event_id, external_calendar_provider + external_calendar_event_id, meeting_url, or lead_email (+ optional meeting_date) — at least one is required. external_meeting_id only dedupes the notes (idempotency), it does NOT locate the meeting. Reserved providers (fireflies, diio, gemini, retell) are rejected by the backend.
list_conversion_types
leads:read
Lectura
Ninguno
Sin campo de contrato
List the client’s active conversion types (optional; create_conversion works without one). A type is a named label for reporting plus a currency default; pass its id as conversion_type_id when a conversion should carry that label.
set_conversion_type
leads:write
Escritura
name
Sin campo de contrato
Create or update a conversion type by name (idempotent upsert). Types are optional labels for reporting and a currency default (e.g. ‘Cuenta abierta’, ‘Primer depósito’); create_conversion works without one — untyped events are recorded and filterable on their metadata. Never deletes — deactivate with is_active:false; full removal is dashboard-only. / Crea o edita un tipo de conversión por nombre. Los tipos son etiquetas opcionales para reportes y una moneda por defecto; create_conversion no los necesita.
create_conversion
leads:write
Escritura
Ninguno
Sin campo de contrato
Record that a lead converted. Only a lead identifier is required (exactly one of lead_id, lead_email, lead_phone); conversion_type_id, amount, currency, description and metadata are optional. Put every fact about the conversion (plan, order id, seller, branch, campaign) in metadata: it shows on the lead, reaches Cloud Functions (conversion.detected) and is filterable with list_conversions. Nexor moves the lead to the agent/status configured on the conversion type, else the lead’s current agent, else its group (set_conversion_destination); with no destination anywhere the lead stays where it is. Credit: pass workflow_id to credit one agent, or master_workflow_id alone for a GROUP-level conversion (no agent credited, the group’s destination applies); an explicit target beats the type’s scope, which beats the lead’s active agent. / Registra que un lead convirtió. Solo hace falta un identificador del lead; tipo, monto, moneda, descripción y metadata son opcionales. Pon todos los datos de la conversión en metadata: se ven en el lead, llegan a las Cloud Functions y se pueden filtrar. Nexor mueve el lead al agente/estado del tipo, si no al del agente actual, si no al del grupo (set_conversion_destination).
list_conversions
leads:read
Lectura
Ninguno
Sin campo de contrato
List conversion events for the client, typed and untyped, newest first. Filter by lead, agent (workflow_id), group (master_workflow_id), run, conversion type (conversion_type_id, or ‘none’ for untyped events only) and exact-match top-level metadata keys (metadata: { plan: ‘anual’ }). Use it to verify a conversion landed (list_conversions({ lead_id })) and for revenue/attribution questions. / Lista los eventos de conversión del cliente con filtros por lead, agente, grupo, tipo (‘none’ = sin tipo) y metadata.
list_campaigns
leads:read
Lectura
Ninguno
Sin campo de contrato
List the client’s campaigns.
Background jobs (10)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_background_jobs
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the client’s background jobs (scheduled or forced lead automations).
get_background_job
workflows:read
Lectura
job_id
Sin campo de contrato
Fetch a background job by id with its recent executions.
create_background_job
workflows:write
Escritura
name, steps
Modo de ejecución dry_run
Create a background job: a scheduled/forced automation that filters leads and runs steps on each. trigger_type “cron” needs a cron_expression; “api” runs only when forced (run_background_job). A step can evaluate a date/condition — on a metadata key (evaluate_metadata), a collected funnel field (evaluate_field), or a tag (evaluate_tag) — and act, OR run an action directly. Actions include sending a WhatsApp template (send_message), set_lead_status, assign/transfer workflow. lead_filters/workflow_filters select candidates; max_leads_per_cycle caps each run (≤500); cooldown_minutes avoids re-acting on the same lead; dry_run logs without acting. See the steps field for the full vocabulary and lead_filters / workflow_filters for how candidates are selected. Filters and steps are validated server-side: an unresolvable one is rejected with code invalid_filters / invalid_steps and a details[] naming each problem. Common use: send a survey template once to everyone sitting in a given status.
update_background_job
workflows:write
Escritura
job_id
Modo de ejecución dry_run
Update a background job (any subset of its config). Filters and steps are validated server-side (invalid_filters / invalid_steps with details[]). See lead_filters / workflow_filters for candidate selection and steps for the action vocabulary (send_message, evaluate_field, set_lead_status, …).
set_background_job_active
workflows:write
Escritura
job_id, active
Sin campo de contrato
Pause or activate a Background Job without changing the rest of its configuration. Keep dry_run:true until execution logs are verified.
delete_background_job
workflows:write
Escritura
job_id
Sin campo de contrato
Delete a background job (cascades its execution history).
run_background_job
workflows:write
Escritura
job_id
Aprobación del operador en instrucciones
Force-run a Background Job now (bypasses schedule/active timing). A non-dry-run job can mutate real leads; inspect config and get explicit operator confirmation first.
list_background_job_executions
workflows:read
Lectura
job_id
Sin campo de contrato
A background job’s recent execution history (counts of candidates/acted/errored per run).
get_background_job_execution
workflows:read
Lectura
execution_id
Sin campo de contrato
Get one Background Job execution with every per-lead action, tool response, condition result, mutation result, skip, and error.
analyze_background_job_template
workflows:read
Lectura
template_name
Sin campo de contrato
Inspect an APPROVED WhatsApp template used by send_message: shows each {{variable}}, whether it resolves automatically or via a workflow tool, and configuration errors.
Reportes (12)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_reminder_report
reports:read
Lectura
date_from, date_to
Sin campo de contrato
Reminder scheduling and WhatsApp delivery metrics by total, local day, hour and failure code. Use bucket=total for totals; never sum different buckets. Requires an explicit period of at most 93 days: ISO timestamps with timezone, date_to exclusive. Scheduled reminders (all channels) and tagged WhatsApp message attempts are separate populations; completed jobs do not prove delivery. Includes sent, delivered, read, failed, pending, unique/reached leads and delivery_rate (delivered / recorded attempts). Receipt status is current; untagged historical messages are excluded. Empty rows mean no matching records. Does not measure Teams confirmation or attendance.
export_leads_report
reports:read
Lectura
workflow_ids
Sin campo de contrato
Create a complete CSV export of every active, non-test lead in one or more exact workflows, including each lead current stage. Use for requests such as “todos los leads”, “exporta”, “descarga” or “dame un CSV”. First resolve workflow names to their UUIDs with list_workflows, then pass those UUIDs here. Returns a signed download URL.
query_insights
reports:read
Lectura
Ninguno
Sin campo de contrato
Chart Insights numbers for leads, meetings and the team: rows, spec, range and notices. Prefer a template: it fixes the chart and default period. For period numbers use these ids: leads_new = distinct people created; task_entries = each entry into a task, transfers, reassignments, deleted tasks and HubSpot bulk imports included, split by entry_kind (never call an entry a lead); leads_contacted = distinct leads Nexor contacted, the usage count (contacts on HubSpot bulk-import runs not counted); leads_replied = distinct leads who wrote, answered a call or replied to an email; leads_uncontacted = new leads not contacted yet. Contacted and replied do not add up across days or agents; quote the total. Old ids keep their old meaning and numbers (see metric) and add a METRIC_REPLACED notice. period is in the client timezone; never compute dates for it. Without a template pass metric, x, group_by and a period or from/to. Pass the returned spec and range to the chart. For a period summary use get_period_report.
get_period_report
reports:read
Lectura
date_from, date_to
Sin campo de contrato
Server-computed summary for weekly or period reports. New leads: distinct people created. Task entries: each entry into a task, transfers, reassignments and HubSpot bulk imports included, split into new and existing leads. Contacted leads: same count as usage, a Nexor message or call, or a Nexor move to a contacted stage; a Nexor email counts only through that move, and a contact on a HubSpot bulk-import run is not counted. Replied leads: distinct leads who wrote, answered a call or replied to an email. Days are the account time zone; bare dates are whole days; at most 366 days. as_of before the window end means the period is not complete: say up to when it counts. Only tasks[].entries add up, to totals.entries; lead counts do not add up across tasks, so quote totals.leads. tasks[] kind deleted = deleted tasks, kind none = replies with no task. definitions states each unit. If it returns PERIOD_REPORT_UNAVAILABLE, retry once, then say the report could not be computed; never replace it with other tools.
get_funnel_report
reports:read
Lectura
Ninguno
Sin campo de contrato
Current snapshot of active runs per stage, with how many were contacted/connected, per workflow (or across all workflows). Use for “how many leads are at each stage right now” questions. date_from/date_to filter by lead creation in UTC days. These are not period totals; for a weekly or period summary use get_period_report.
get_field_distribution
reports:read
Lectura
field_key
Sin campo de contrato
Distribution of a captured lead field (e.g. a disqualification reason) with counts per value and an example evidence quote. Ideal for “top reasons why…” style questions.
get_call_stats
reports:read
Lectura
Ninguno
Sin campo de contrato
Call statistics (dials, connected, discovery calls, duration) for a date range, totaled or broken down by day.
get_lead_report
reports:read
Lectura
lead_id
Sin campo de contrato
Full report bundle for ONE lead: profile, current status, captured field values with evidence, insights, a summary of each call and scheduled tasks — all in one call. Prefer this over get_lead + get_lead_history when the goal is writing a report about a lead.
get_engagement_metrics
reports:read
Lectura
Ninguno
Sin campo de contrato
Engagement snapshot for a date range (default: trailing 7 days): total leads, new leads, meetings booked, and outbound/inbound activity. Test leads are excluded. messages_inbound/messages_outbound count MESSAGES, not leads: one lead can send many. For “how many leads replied” or “how many leads we messaged” use leads_inbound/leads_outbound (distinct leads over the same messages, window and filters); definitions states each unit. The counts span every messaging channel together, including call transcript turns (what the lead said on a call counts as inbound), and there is no channel filter, so never attribute a total to one channel. Emails (sent or replied) and Instagram/Messenger DMs are not counted (they live in a separate store). Days are the account time zone. Use it for activity questions; for a weekly or period summary use get_period_report, and for per-status funnel breakdowns use get_funnel_report.
get_seller_assignment_metrics
reports:read
Lectura
Ninguno
Sin campo de contrato
Analyze how the client’s leads are distributed across human sellers. Returns assignment coverage (total, assigned, unassigned and assignment rate) plus one row per seller with assigned leads, share of assigned leads, current funnel-stage breakdown, unanswered conversations, meetings booked/completed, conversions, conversion value and conversion rate. Assignment is a CURRENT-OWNER snapshot: historical activity is attributed to the lead’s current assigned_to seller, not necessarily the seller who owned it when the activity happened. Date filters select leads by created_at and activity by each event’s timestamp. Use list_team (people:read) when you need the complete user directory.
get_team_performance
reports:read
Lectura
Ninguno
Sin campo de contrato
What each teammate did in a period. Per member: leads_assigned_now (current owner snapshot), leads_assigned_in_range (leads newly assigned to them in the period), human_messages (messages the teammate typed in Nexor; WhatsApp Business app replies cannot be tied to a person and are counted in unattributed.business_app_messages), escalations_resolved, escalations_overdue (escalations on their leads that went overdue in the period), escalations_answered and median_first_reply_minutes (median minutes from an escalation opening to the teammate’s first reply; null when none were answered). Default period is the last 30 days, max 92. For current lead ownership, meetings and conversions per seller use get_seller_assignment_metrics.
analyze_lead_fields
reports:read
Lectura
Ninguno
Sin campo de contrato
Statistical analysis of captured lead field values: numeric fields get min/max/mean/median/p25/p75/stddev/outlier_count, boolean/categorical fields get top-15 value frequencies. Filter by workflow, specific field keys, lead statuses, or an explicit lead list (max 50). Ideal for “what is the average budget of qualified leads” or comparing field values across a segment. If your filters match nothing, the response includes available_field_keys as a hint. For a simple one-field value distribution with evidence quotes, prefer get_field_distribution.
Reuniones (8)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_meetings
leads:read
Lectura
Ninguno
Sin campo de contrato
Page through the client’s meetings (booked calls/appointments) with lead, workflow, time and status for each. Ideal for questions like “what meetings are scheduled this week”, “which meetings were no-shows”, or listing a single lead’s meetings. For aggregate counts/rates use get_meeting_stats instead.
get_meeting_stats
reports:read
Lectura
Ninguno
Sin campo de contrato
Aggregate meeting statistics for a date range: totals per status (completed, no_show, cancelled, scheduled, rescheduled) plus show_rate, completion_rate and no_show_rate (0-1, null when the denominator is 0). Ideal for “what is our show rate” or “how many meetings did we book last month” questions. For individual meetings use list_meetings.
set_meeting_status
meetings:write
Escritura
meeting_id, status
Sin campo de contrato
Record the outcome of a meeting: ‘no_show’ (the lead did not attend) or ‘completed’. Runs the same side effects as the dashboard — the no-show re-engagement rule (when configured), the meeting webhook, Cloud Function events and the lead timeline — then reads the meeting back with its provider sync status. Idempotent: re-marking the same outcome is a no-op. meeting_id is the calendar event id from list_meetings / list_lead_meetings. To cancel a meeting use cancel_meeting; to move it use reschedule_meeting.
cancel_meeting
meetings:write
Escritura
meeting_id
confirm: true
Cancel a booked meeting. DESTRUCTIVE and lead-facing: deletes the event from the host’s calendar (provider-first — if that fails nothing is cancelled), releases the slot, cancels lead and host reminders, emails the lead a cancellation and notifies the host, fires the meeting webhook and any cancellation re-engagement rule. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms cancelling this exact meeting. Meetings owned by an external provider (Calendly, GoHighLevel…) come back { status:‘skipped’ }. Reads the meeting back afterwards.
get_workflow_slots
workflows:read
Lectura
workflow_id, from, to
Sin campo de contrato
Free booking slots for a workflow’s hosts between two dates, in the workflow’s timezone — the same slot engine the dashboard meetings board uses (host calendars, availability schedules, buffers, tier rules). Use it to verify a host produces slots and to pick a starts_at for book_meeting / reschedule_meeting. meeting_type_id defaults to the workflow’s first active meeting type; host_id restricts to one host (must be an active agent of the workflow).
book_meeting
meetings:write
Escritura
workflow_id, lead_id, host_id, starts_at
confirm: true
Book a meeting for a lead with a host at starts_at, with the SAME side effects as booking from the dashboard: calendar event on the host’s connected calendar (Google/Outlook/Calendly), conferencing link, lead invite + confirmation email (unless invite_lead:false), host notification and reminders, availability block, and the workflow status transition. Pick starts_at from get_workflow_slots. A slot already taken returns CONFLICT with same-day alternatives. Pass the same idempotency_key to retry safely — a replay returns the original booking without booking again. Preview-then-confirm: when the lead will be invited, call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; call again with confirm:true only after the operator explicitly approves. The response includes provider_sync — check its status; ‘sync_failed’ means the row exists but the calendar write failed.
reschedule_meeting
meetings:write
Escritura
meeting_id
confirm: true
Move a booked meeting to a new time (starts_at, or a slot object from get_workflow_slots). Provider-aware: the host’s calendar event is updated first and the meeting link is kept when the host is unchanged; keep_host:false with a host_id rebooks on the new host (new link). The lead receives a reschedule email and the host is notified. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; call again with confirm:true only after the operator explicitly approves. Meetings owned by an external provider come back CONFLICT/MANAGED_EXTERNALLY. Returns the meeting read-back with provider_sync.
change_meeting_host
meetings:write
Escritura
meeting_id, host_id
confirm: true
Reassign a booked meeting to another host (active agent of the same workflow) without changing the time. Provider-aware: the calendar event is moved to the new host’s calendar first (new organizer/link where the provider requires it); if that move fails nothing changes. The lead’s invite is updated. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; call again with confirm:true only after the operator explicitly approves. Returns the meeting read-back with provider_sync.
Transcripciones (2)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_transcripts
leads:read
Lectura
Ninguno
Sin campo de contrato
Page through meeting transcripts: per row the lead, meeting date, title, a short summary (<=500 chars), whether it has action items, and duration. Ideal for “what was discussed in recent meetings” or finding a transcript by keyword before drilling in with get_transcript.
get_transcript
leads:read
Lectura
transcript_id
Sin campo de contrato
Fetch ONE meeting transcript by id: lead, meeting date, title, full summary, action items and duration. Set include_full_text/include_sentences only when you actually need the verbatim conversation — they can be very large. Use list_transcripts first to find the id.
Conversaciones (3)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
search_conversations
leads:read
Lectura
Ninguno
Sin campo de contrato
Search messages across ALL leads at once (get_lead_history covers a single lead). Results include the lead’s assigned human owner by default (assigned_to plus assigned_user id/name, or null); filter by assigned_to or unassigned_only, and use list_team (people:read) to resolve the full user directory. Two modes: normal mode returns matching messages with lead, channel, direction and a content preview — ideal for “who mentioned pricing this week”. Each normal-mode row is one MESSAGE, not one lead: to count leads, count distinct lead ids (a full page of limit rows means the count may be higher). unanswered=true instead returns leads whose LAST message is an unanswered inbound (waiting on a reply) — ideal for “which leads are waiting on us”.
get_inbox_summary
leads:read
Lectura
Ninguno
Sin campo de contrato
Inbox workload per teammate, plus an unassigned row and totals. Counts: conversations (leads with at least one touchpoint), unanswered (the lead wrote last and no one concluded the conversation), escalated_open (the agent handed the lead to a human and it is still pending), escalated_overdue (leads with an unresolved escalation that passed its response deadline), human_takeover (a teammate took over and the AI is paused). Rows follow the lead’s current owner, sorted by unanswered. Use list_escalations for the escalations themselves, search_conversations with unanswered=true for the waiting leads, and get_team_performance for activity over a period.
list_escalations
leads:read
Lectura
Ninguno
Sin campo de contrato
List escalations: moments the AI agent handed a lead to a human (question, reason, channel). status: open (pending, default), overdue (pending and past its response deadline), resolved, or all. Each row has lead, agent, the lead’s current owner (assigned_to), overdue flag and, once closed, resolved_at, resolution_outcome and resolved_by. Open and overdue are sorted oldest first (longest wait on top); resolved and all newest first. Paginate with limit and offset against total. Use get_inbox_summary for counts per teammate.
Integraciones (1)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_integration_status
workflows:read
Lectura
Ninguno
Sin campo de contrato
One-call health summary of the client’s integrations: connected CRMs (kommo, hubspot, gohighlevel, zoho and odoo; provider, status, connected_at, last_synced_at, error), counts of WhatsApp numbers, phone numbers and email senders, calendars[] (one per host calendar connection: user_id, name, provider google|outlook|calendly, status active|expired|revoked|error|needs_reauth, role, calendar_email, last_error, connected_at) and booking_providers[] (one per appointment-capable agent: provider native|calendly|gohighlevel|external_booker, binding summary, host_count, excluded_hosts = Calendly hosts with no event type bound, which booking silently skips) and google_sheets (active and paused automation counts; detail in get_google_sheets_status). Ideal for “is our CRM synced”, “is the calendar connected” or “why can’t the agent book” questions; drill into a channel with its own list tool (list_whatsapp_numbers, list_phone_numbers, list_email_senders).
Números de teléfono (7)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
search_available_numbers
numbers:read
Lectura
country
Sin campo de contrato
List phone numbers available to buy in a country (ISO code, e.g. “CL”, “MX”). Read-only preview — buying one is provision_phone_number.
list_phone_numbers
numbers:read
Lectura
Ninguno
Sin campo de contrato
List the client’s voice and SMS phone numbers. workflow_id is the call owner; sms_enabled and sms_workflow_id independently show whether SMS is active and which agent receives it. A call assignment alone never proves the number can send SMS. Check get_account_readiness.account.sms_eligible before offering SMS: US/CA are eligible by default; other accounts require client.settings.sms_enabled === true. A number’s country is not the account eligibility test. This list does not report iMessage state; use list_imessage_numbers for that channel.
provision_phone_number
numbers:write
Escritura
phone_number, country_code
Sin campo de contrato
Buy and provision a phone number for the client (Twilio purchase + Retell import). Billable and capped per client (default 3 active). Pass a workflow_id to bind the number to that workflow (workflow-scoped); omit it for an account-wide client-scoped number. Fails with NUMBER_LIMIT_REACHED at the cap — release or deactivate one first. Buying does NOT make the number answer inbound calls: for an agent’s voice task, once that task is active and does not exclude calls (identity and voice come from the agent), connect it with set_inbound_entry_point (channel “phone”, id = the returned number id, destination {type:“group”, id: the agent id}), which also turns the agent’s router on. Never use assign_number_to_workflow for a task that belongs to an agent.
assign_number_to_workflow
numbers:write
Escritura
number_id
Sin campo de contrato
Reassign one of the client’s numbers to a workflow (workflow-scoped) or, with no workflow_id, make it the account-wide client-scoped number. Only reassigns within the client’s own workflows. This does NOT connect inbound calls, and a task that belongs to an agent (has master_workflow_id) is never bound here: connect the number to its agent with set_inbound_entry_point (channel “phone”, destination {type:“group”, id: the agent id}).
set_number_sms
numbers:write
Escritura
number_id, enabled
Sin campo de contrato
Activate SMS on an existing active Twilio number and bind its separate sms_workflow_id to the intended agent. First check get_account_readiness.account.sms_eligible: US/CA accounts are eligible by default; a non-US/CA account needs client.settings.sms_enabled === true. Eligibility does not mean a number is ready. Read list_phone_numbers or get_number_health after activation and verify sms_enabled === true and sms_workflow_id matches the agent. workflow_id only routes calls. Telnyx numbers cannot carry SMS.
get_number_health
numbers:read
Lectura
number_id
Sin campo de contrato
Non-destructive health/read-back for one of the client’s numbers: reports the number’s active state, provider, its call binding and its SMS binding (enabled + owner workflow), and any issues — without placing a call or sending a message.
deactivate_number
numbers:write
Escritura
number_id
Sin campo de contrato
Soft-deactivate one of the client’s numbers (stops it being used; does NOT release it from Twilio, so billing continues). Reversible.
Números de WhatsApp (11)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_whatsapp_numbers
whatsapp:read
Lectura
Ninguno
Sin campo de contrato
List the client’s WhatsApp numbers with connection status, quality rating, messaging-limit tier, account restrictions, last health-check time, connection type, and bound workflow.
connect_whatsapp_number
whatsapp:write
Escritura
Ninguno
Sin campo de contrato
Start connecting a WhatsApp number for the client: returns a hosted Kapso setup link the client opens to finish onboarding (choose dedicated/coexistence, Meta login). IMPORTANT — give the returned setup URL to the user DIRECTLY as a clickable link (e.g. “Connect your WhatsApp number here: <url>”) and tell them to open it; the authorization happens entirely on that page and CANNOT be completed in chat, so never withhold the URL or claim you’ll connect it for them. Works even when a number is already connected — this adds a NEW one (several allowed per client). Once the user finishes on the hosted page, Nexor records the number and registers its inbound webhook + events automatically (no extra call needed); confirm with list_whatsapp_numbers. Capped per client (default 10) — fails with WHATSAPP_LIMIT_REACHED at the cap. Then bind it with assign_whatsapp_to_workflow.
assign_whatsapp_to_workflow
whatsapp:write
Escritura
number_id
Sin campo de contrato
Bind one of the client’s WhatsApp numbers to a workflow (agent) — this is what makes inbound WhatsApp messages on that number reach the agent. Omit workflow_id to unbind. Makes the number the default for that workflow.
deactivate_whatsapp_number
whatsapp:write
Escritura
number_id
Sin campo de contrato
Soft-deactivate one of the client’s WhatsApp numbers (stops it being used; reversible; does NOT disconnect it from Kapso).
rename_whatsapp_number
whatsapp:write
Escritura
number_id, internal_name
Sin campo de contrato
Set the operator-facing internal label of one of the client’s WhatsApp numbers (does not change the WhatsApp display name shown to leads — for that use set_whatsapp_display_name). Pass an empty internal_name to clear it.
reconcile_whatsapp_number
whatsapp:write
Escritura
number_id
Sin campo de contrato
Re-check a WhatsApp number against the provider and repair its route status — the fix for a number that shows a broken/invalid connection or after a failed setup return. Returns the refreshed state; run get_whatsapp_health afterwards to confirm. If the number needs a fresh Meta authorization, reconnect via connect_whatsapp_number (a new hosted setup link).
get_whatsapp_business_profile
whatsapp:read
Lectura
number_id
Sin campo de contrato
Read the WhatsApp business profile shown to leads for one number: display name, its Meta review status (APPROVED / PENDING_REVIEW / etc.), and profile picture. Use before set_whatsapp_display_name to see the current name and whether a review is pending.
set_whatsapp_display_name
whatsapp:write
Escritura
number_id, display_name
Sin campo de contrato
Submit a new WhatsApp display name (the name leads see) to Meta for review. Must be 3-256 characters. Meta review can take minutes to a couple of days; the response reports displayNameStatus=PENDING_REVIEW. Re-check with get_whatsapp_business_profile.
set_whatsapp_profile_photo
whatsapp:write
Escritura
number_id, image_url
Sin campo de contrato
Replace the WhatsApp profile picture for a number from a public HTTPS image URL (Nexor ingests it into Meta). The image must already be hosted at an https:// URL — this tool does not upload local files.
get_whatsapp_business_verification
whatsapp:read
Lectura
number_id
Sin campo de contrato
Read the Meta business verification of the business that owns one WhatsApp number: status (not_verified / in_review / changes_requested / verified / attempts_exhausted / ineligible …), the business legal name Meta expects (business_name), attempts_left of 3, whether a new submission is allowed, accepted file types/limits, and the latest submission with Meta’s rejection_reasons or a last_error (file could not be downloaded, no attempt used). Verified businesses get higher messaging limits. Only numbers connected through Nexor can be verified here; a sandbox number returns not_found.
submit_whatsapp_business_verification
whatsapp:write
Escritura
number_id, documents, authorized
Sin campo de contrato
Send 1-3 documents (PDF/JPG/PNG, max 5 MB each, public HTTPS URLs) to Meta to verify the business that owns a WhatsApp number. Together they must show the legal name AND address exactly as business_name from get_whatsapp_business_verification. IRREVERSIBLE: each submission Meta receives uses 1 of 3 lifetime attempts, so first tell the customer the documents go to Meta and use one attempt, get their explicit confirmation, then pass authorized=true. Returns the submission: state pending (Meta reviews in minutes to hours; re-check with get_whatsapp_business_verification) or failed with last_error (file unreadable, no attempt used).
Salud de WhatsApp (3)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_whatsapp_health
whatsapp:read
Lectura
number_id
Sin campo de contrato
Live health and risk for one WhatsApp number. Returns quality_rating (GREEN/YELLOW/RED — RED means the account is at risk of Meta restriction), messaging_health (can_send_message AVAILABLE/LIMITED/BLOCKED with per-entity WABA/phone errors and suggested fixes), messaging_limit tier + daily ceiling, route_verification (whether the provider route is valid or needs reconnect/resync), and inbound_traffic: messages the provider received vs messages that reached Nexor in the last 7 days, with a verdict. no_inbound_at_provider means nobody is writing to this number, so the ads or the number the business publishes point to another one (a configuration fix, not an outage); provider_received_not_in_nexor is a real delivery incident to escalate; receiving means inbound flows; provider_unavailable means the provider could not be read, so do not conclude either way. This is the tool for ‘is my WhatsApp at risk / why can’t it send / what’s my sending limit / leads say they write and the agent never answers’. One call triggers several Meta calls, so results are briefly cached — don’t poll it in a tight loop.
get_whatsapp_response_timing
whatsapp:read
Lectura
Ninguno
Sin campo de contrato
Read the client’s inbound WhatsApp debounce (buffer window): how long Nexor waits to group a lead’s rapid consecutive messages into a single AI reply. Returns buffer_window_seconds, whether it’s the default, and the allowed min/max.
set_whatsapp_response_timing
whatsapp:write
Escritura
buffer_window_seconds
Sin campo de contrato
Set the client’s inbound WhatsApp debounce (buffer window) in seconds — larger groups more messages into one reply (more natural, slightly slower); smaller replies faster but may fragment. The change fans out to every active number’s webhook; the response reports per-number apply status. Typical range is 5-60 seconds.
Números de iMessage (8)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_imessage_offer
imessage:read
Lectura
Ninguno
Sin campo de contrato
Read the iMessage number add-on offer for the client BEFORE provisioning: the recurring monthly price (USD), the amount charged today (dueTodayUsd — the full first month, never prorated; 0 in a sandbox/test environment where no charge happens), whether the client can buy (canPurchase) and if not why (reason, e.g. no_subscription / trial_not_allowed / no_payment_method / external_billing / purchase_disabled), the card on file (brand + last4), how many iMessage numbers they already own, and a state of active | purchasable | unavailable. ALWAYS call this first and confirm the recurring charge with the user before calling provision_imessage_number. If state is “unavailable” the add-on is not enabled for this client — do not attempt to provision.
list_imessage_numbers
imessage:read
Lectura
Ninguno
Sin campo de contrato
List the client’s iMessage numbers with their E.164 phone number, setupStatus (provisioning | ready | failed), setup error if any, the workflow (agent) each is bound to, display identity (displayFirstName, displayLastName, avatarUrl), and active state. imessageWorkflowId is the single OWNER; owner adds its name and agent group (masterWorkflowId, masterName) and sharedWith lists every sibling agent in that group that already sends and receives through this number without owning one — a number is shared across an agent group exactly like WhatsApp, so an agent listed in sharedWith is connected and needs no assign call. Use this to poll until a freshly provisioned number reaches setupStatus “ready”, and to find a number id for get_imessage_number, assign_imessage_to_workflow, set_imessage_display_name or set_imessage_profile_photo.
provision_imessage_number
imessage:write
Escritura
accept_charge
accept_charge: true
Buy and provision a NEW iMessage number for the client. THIS CHARGES MONEY: it charges the FULL first month today (never prorated) and adds a recurring monthly line (see get_imessage_offer for the exact price) to the client’s Stripe subscription. You MUST first call get_imessage_offer, show the user the recurring price and the amount charged today, and get their explicit confirmation — only then call this with accept_charge:true. Fails with imessage_consent_required if accept_charge is not true, and with an eligibility code (e.g. imessage_no_subscription, imessage_no_payment_method, imessage_purchase_disabled) when the client cannot be charged. The charge is idempotent per call. On success the number provisions asynchronously — poll list_imessage_numbers until setupStatus is “ready”, then bind it with assign_imessage_to_workflow.
assign_imessage_to_workflow
imessage:write
Escritura
number_id
Sin campo de contrato
Bind one of the client’s iMessage numbers to a workflow (agent) — this is what makes inbound iMessages on that number reach the agent. The number is then shared by the agent’s whole agent group (master_workflow_id): every sibling sends and receives through it automatically (new inbound leads land on the owner agent; existing leads follow their active run), so bind ONCE per group and never re-assign it to a sibling that list_imessage_numbers already shows in sharedWith. Unless a display identity was set by hand (set_imessage_display_name), the number’s display name follows the owner agent’s persona. Omit workflow_id to unbind (the number stays owned/billed, just detached). A group (or a standalone agent) keeps at most one iMessage number, so binding a number to an agent whose group already has one replaces it.
get_imessage_number
imessage:read
Lectura
number_id
Sin campo de contrato
Read one iMessage number’s live details: E.164 phone number, setupStatus (provisioning | ready | failed) and setup error, the workflow (agent) it is bound to plus its agent group (owner) and the sibling agents sharing it (sharedWith), and the blue-bubble display identity leads see — firstName, lastName, avatarUrl — plus active state. whatsappStatus “ready” means the same line also runs WhatsApp and shares this identity (whatsappName / whatsappAvatarUrl show what WhatsApp currently displays). Use before set_imessage_display_name / set_imessage_profile_photo to see the current identity. Fails with imessage_number_not_found for a number outside this client.
reconcile_imessage_number
imessage:write
Escritura
number_id
Sin campo de contrato
Re-check one iMessage number against Dial (the provider) and repair its local setupStatus — the fix for a number stuck on “provisioning” or “failed” in list_imessage_numbers even though it is actually ready. list_imessage_numbers reads a locally cached status that is normally advanced only by Dial’s setup webhook, so a single missed webhook leaves the number permanently desynced; get_imessage_number reads the live truth from Dial but does not persist it. This tool fetches the live Dial status and writes it back, so the list/capabilities path matches reality. Returns the refreshed number; re-run list_imessage_numbers or get_imessage_number afterwards to confirm. Fails with imessage_number_not_found for a number outside this client.
set_imessage_display_name
imessage:write
Escritura
number_id
Sin campo de contrato
Set the first and/or last name shown beside an iMessage number’s messages in recipients’ Messages apps (max 30 characters each; pass an empty string to clear one). Propagates to devices within minutes. Once set by hand the identity is authoritative: it no longer follows the agent persona when the number is (re)assigned. If the line also runs WhatsApp (whatsappStatus “ready”) the same name is written to its WhatsApp profile as one line — first + last joined must be at most 25 characters, otherwise the call fails with fieldErrors.whatsappName = too_long and NOTHING changes on either channel. Fails with imessage_number_invalid_fields (+ fieldErrors) when a value is rejected. Read the current identity first with get_imessage_number.
set_imessage_profile_photo
imessage:write
Escritura
number_id, image_url
Sin campo de contrato
Replace the profile photo shown beside an iMessage number’s messages from a public http(s) image URL (jpeg/png/gif/webp, ≤5 MB; the platform mirrors it and returns its stable avatarUrl). Photos can be replaced but NOT removed. This tool does not upload local files — the image must already be hosted; the dashboard’s iMessage identity editor can upload a file from the operator’s computer instead. If the line also runs WhatsApp (whatsappStatus “ready”) the photo is applied to both profiles at once, so it must also satisfy WhatsApp’s rules — a square JPG or PNG between 192 and 640 px — or the call fails with fieldErrors.whatsappAvatarUrl and NOTHING changes on either channel. Propagates to devices within minutes.
Remitentes de correo (9)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_email_senders
senders:read
Lectura
Ninguno
Sin campo de contrato
List the client’s registered email senders (domains and individual mailboxes) with their verification status and whether each can send. Each domain sender carries dns_records[]: the SES records (ownership token, DKIM, return path) are verified by AWS and gate can_send; the SPF (@) and DMARC (_dmarc) entries are checked by Nexor against public DNS on each verify and never affect can_send — status not_set means the record is absent in DNS, mismatch means an SPF exists without include:amazonses.com, verified means a valid policy exists (a third-party DMARC counts). last_checked_at is the time of that lookup.
register_email_domain
senders:write
Escritura
sender_email, sender_name
Sin campo de contrato
Register a sender under a domain the client owns (e.g. sales@acme.com), for sending at scale. Returns the DNS records (SPF/DKIM) the client must add to that domain — adding them is a human step outside this tool. Once added, call verify_email_domain, or poll check_email_sender_status.
register_email_sender
senders:write
Escritura
sender_email, sender_name
Sin campo de contrato
Register a personal mailbox (e.g. Gmail/Outlook) as a sender via a magic-link. Nexor emails a verification link to that mailbox — the mailbox owner must open it and click to confirm; that click is a human step outside this tool. Poll check_email_sender_status afterwards to see when it completes.
check_email_sender_status
senders:read
Lectura
sender_email
Sin campo de contrato
Check whether a sender’s verification (DNS records or magic-link click) has completed and it can now send. Verification itself happens outside this tool, by a human — use this to poll the result after register_email_domain or register_email_sender.
verify_email_domain
senders:write
Escritura
domain
Sin campo de contrato
Trigger a DNS verification check for a domain sender, AFTER the client has already added the DNS records returned by register_email_domain. This tool only checks — adding the records is a human step outside this tool.
get_email_domain_dns_records
senders:read
Lectura
domain
Sin campo de contrato
Re-fetch the DNS records (SPF/DKIM) for a pending domain sender — e.g. if the client lost the ones returned by register_email_domain. Only reads; adding the records to the domain is a human step outside this tool. SPF and DMARC come back with a verdict from Nexor’s own public-DNS lookup (not_set = absent in DNS, mismatch = SPF without include:amazonses.com, verified = valid policy), never from AWS.
resend_email_verification
senders:write
Escritura
sender_email
Sin campo de contrato
Resend the magic-link verification email for a pending sender mailbox.
rename_email_sender
senders:write
Escritura
sender_id, sender_name
Sin campo de contrato
Change the display name leads see on emails from one of the client’s registered senders (the From name, e.g. “Sophie” in Sophie <hi@acme.com>). Only the name changes: the address, verification and DNS stay as they are and the sender keeps sending without interruption. Takes sender_id (from list_email_senders) and sender_name. Never delete and re-register a sender just to change its name — deleting a domain sender removes the domain’s verification.
delete_email_sender
senders:write
Escritura
sender_id
Sin campo de contrato
Remove a registered sender. To change only the display name use rename_email_sender instead; deleting a domain-owner sender removes the domain’s verification at the provider and it must be re-verified with DNS.
Pools de templates (8)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_template_pool
whatsapp:read
Lectura
workflow_id
Sin campo de contrato
Read a workflow’s WhatsApp template pool state in one call: the active rotation pool (name, weight, category), the opening-template config (mode auto|only|subset + names), and what’s available to add (approved openers and all templates with status + internal_type). Use it before set_template_pool / set_opening_templates to see current state. An empty rotation pool does not mean follow-ups stop: they fall back to Nexor-managed backup templates (names starting with nx_) and approved follow-up templates. Before saying templates are not going out, check the lead’s history (get_lead_history lists template sends).
set_template_pool
whatsapp:write
Escritura
workflow_id, templates
Sin campo de contrato
Replace a workflow’s WhatsApp cadence template pool with EXACTLY the given list — full-state replace, so a single call covers adding AND removing (retiring) templates atomically: anything omitted is removed from the pool. Each entry: { name, weight? (0.01-10, default 1) } and must be an APPROVED template on the client’s WhatsApp business account. Read the current pool with get_template_pool first, then send the complete desired list.
set_opening_templates
whatsapp:write
Escritura
workflow_id, mode
Sin campo de contrato
Configure which WhatsApp templates a workflow may use as the OPENING (first-contact) message. mode ‘auto’ lets the cadence pick any eligible opener; ‘only’ locks it to exactly one template (template_names must have exactly 1 entry); ‘subset’ restricts it to the given names (at least 1). Names must be APPROVED templates with internal_type greeting, opening, legacy_greeting or outbound. Fails with WOULD_EMPTY_OPENING if the change would leave the workflow with no valid opener.
sync_whatsapp_templates
whatsapp:write
Escritura
Ninguno
Sin campo de contrato
Pull the latest template state from Meta for all of the client’s WhatsApp business accounts: imports new templates, refreshes statuses (PENDING -> APPROVED/REJECTED) and quality scores. Returns { synced, created, updated, channels, warnings }. Run it when a template you expect is missing from list_whatsapp_templates or its status looks stale.
check_whatsapp_template_approvals
whatsapp:write
Escritura
Ninguno
Sin campo de contrato
Terminal-friendly approval inspection. By default first syncs every connected WhatsApp business account from Meta, then returns ALL templates in one response with status, quality_score, rejection_reason, timestamps, and totals.by_status. Set refresh=false only when you intentionally want the cached local state. Use after batch submission until each template is APPROVED or REJECTED; rejected drafts can be revised through review_whatsapp_template_drafts under a new name.
get_whatsapp_template_approval_status
whatsapp:read
Lectura
Ninguno
Sin campo de contrato
THE tool for “have my templates been approved?” / “how long until they’re approved?” — in Nexor a bare “template” ALWAYS means a WhatsApp template, so route those questions here. Refreshes from Meta by default, then returns a decision-ready summary — NOT a raw dump: counts { total, approved, pending, rejected, … }, all_approved / none flags, each PENDING template with how long it has actually been pending (pending_hours, so you answer with real data instead of a guessed ETA), longest_pending_hours, some_pending_over_24h, each REJECTED template with its Meta reason, and review_window { typical, max_hours }. Also returns numbers[] — ONLY the verified, fully-connected WhatsApp number(s) (a number still finishing setup is excluded), each with phone_number and whether it is bound to an agent. Templates only exist for a fully connected WhatsApp number: if none is connected the response is { no_whatsapp: true, numbers: [] } — then tell the customer to connect a WhatsApp number first (connect_whatsapp_number), do NOT say they have zero templates. Otherwise answer with the counts + the canonical window (approval is asynchronous and Meta-owned: usually minutes to ~1 hour, occasionally up to 24-48h) — never invent a precise time. If some_pending_over_24h is true, say it is taking longer than usual. For the full raw list use list_whatsapp_templates / check_whatsapp_template_approvals; for one template use get_whatsapp_template. Set refresh=false to skip the Meta sync and read cached state.
set_whatsapp_template_purpose
whatsapp:write
Escritura
template_id, internal_type
Sin campo de contrato
Assign the cadence purpose of an existing or Meta-synced WhatsApp template. This is how an already-connected account can make a pre-existing template eligible for opening, follow-up, reminder, or reactivation behavior without recreating it. The template content and Meta approval status are unchanged. Use get_whatsapp_template first; only APPROVED greeting templates can subsequently be selected by set_opening_templates.
delete_whatsapp_template
whatsapp:write
Escritura
template_id, confirm
confirm: true
Soft-delete a WhatsApp template (tenant-scoped; best-effort delete on Meta too). Preview-then-confirm flow: call with confirm=false first — it returns { requires_confirm: true, template: { name, status, internal_type, is_in_pool } } and writes NOTHING, so you can show the user what would be removed (especially whether it is still in a cadence pool). Only after reviewing that preview, call again with confirm=true to actually delete; the response reports removed_from_pools and meta_deleted.
Análisis (3)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_analysis_snapshot
reports:read
Lectura
Ninguno
Sin campo de contrato
Precomputed conversation-quality snapshot for the client (or one workflow): eval summary (scored conversations, average score, per-dimension averages, failure buckets), accuracy signals, seeker findings, the worst conversations (with reasons, transcript excerpts for the top 3) and system context. Fast — use it FIRST for “how is the agent doing” questions; only use run_deep_analysis when you need a fresh investigation of a specific question.
list_analysis_findings
reports:read
Lectura
Ninguno
Sin campo de contrato
List the analysis engine’s stored findings/corrections/preferences for the client: title, summary, class, status, client impact, confidence and recommendation. Defaults to status ‘open’ (actionable backlog); pass status ‘all’ or a specific status to see history. Findings are produced by prior analysis runs — use run_deep_analysis to generate new ones.
run_deep_analysis
reports:read
Lectura
question
Sin campo de contrato
Run a fresh deep analysis of recent conversations to answer a specific question (e.g. “why are leads ghosting after the price question”). LONG-RUNNING: this call is synchronous and may take 1-3 minutes — tell the user it is in progress and do not retry while waiting. Expensive and rate-limited to 5 runs per day per API key; when capped it returns { rate_limited: true } with the most recent run’s findings instead. For a quick health overview prefer get_analysis_snapshot.
Diagnóstico de leads (9)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_test_conversations
leads:read
Lectura
Ninguno
Sin campo de contrato
List the most recent Playground test conversations (the operator’s own tests, which list_leads hides), newest activity first: lead_id, name, the agent mode it ran on (workflow_id, workflow_name), start and last activity, and the last messages. Use it whenever the operator says they tested the agent and something failed or looked wrong: find the test, then read what the agent actually did with list_lead_turns / get_lead_turn on that lead_id BEFORE changing any prompt or tool. Never diagnose a failed test from the saved configuration alone. Filters: workflow_id, limit (1-25, default 10).
send_test_message
workflows:write
Escritura
message
Sin campo de contrato
Run one simulated test turn against an agent mode, like Playground: you write as the lead, the agent answers. Nothing is ever sent on a real channel. Start a conversation with workflow_id (plus optional channel and metadata: first_name, last_name, email, phone set the test lead; other keys become lead data), then continue it by passing the returned conversation_id. Returns reply, messages, tool_calls (name, args, success, error), status (stage key) and conversation_id, which works with list_lead_turns / get_lead_turn. The agent’s HTTP tools run for real with the X-Nexor-Playground: true header. One turn at a time per conversation: on a CONFLICT that says the previous turn is still running, wait and resend; any other CONFLICT names why the agent refused the turn and resending will not change it. On RATE_LIMITED (30 turns/min per key) wait the seconds it says. If a turn fails or times out it may still finish: read it with list_test_conversations before resending.
list_lead_turns
leads:read
Lectura
lead_id
Sin campo de contrato
List a lead’s agent turns (one turn = the agent processing one message): trace id, timestamp, channel, model, message/response previews, tools used, errors, latency and token usage. Two modes: (1) paging — use limit + next_before_ts to walk back in time; (2) search — pass message_text, provider_message_id, direction or around_ts to locate WHICH turn handled a specific message (the response includes match.trace_id with a confidence label). Pass include_detail:true to get the full get_lead_turn detail of the matched turn (search mode) or the newest turn (paging mode) as turn_detail in the same call.
get_lead_turn
leads:read
Lectura
lead_id, trace_id
Sin campo de contrato
Full detail of one agent turn (by trace_id from list_lead_turns): metadata (model, tokens, duration, errors), the lead message + final response + agent reasoning, whether internal content leaked, tools used, the final gate decision, LLM outputs and a step-by-step timeline. Secrets are redacted and URLs reduced to host-only. This is THE tool for “why did the agent say that” questions.
get_lead_run_state
leads:read
Lectura
lead_id
Sin campo de contrato
A lead’s current automation state in one call: the active workflow run (status, pause/human-takeover/escalation/dispatch state, next action time), the agent’s memory (summary + recent interaction log) and the collected field values with confidence + evidence quotes. Use include to fetch only some sections. This is the first stop for “why isn’t the agent messaging this lead” questions.
get_lead_verdicts
leads:read
Lectura
lead_id
Sin campo de contrato
Quality-judge verdicts and alert events for a lead’s conversations: per-turn judge results (pass/fail, score, severity, reason) plus raised alerts (ai / workflow-config / whatsapp categories, redacted previews). Filter by trace_id or run_id to inspect one turn/run, or by a time window. Pairs with get_lead_turn to see WHAT the agent did vs how it was judged.
get_lead_call
leads:read
Lectura
lead_id, call_id
Sin campo de contrato
Full detail of one call with a lead (call id from get_lead_history, which lists the calls): status, duration, success flag, sentiment, disconnection reason, summary, transcript and the AI call analysis.
list_offers
workflows:read
Lectura
Ninguno
Sin campo de contrato
The client’s offer catalog (products/services the agent can pitch): name, description, category, status, source and top items. Pass workflow_id to see only the offers linked to that workflow (an empty result means the workflow has none linked — there is no fallback to the full catalog). Pass offer_id for one offer’s detail including its items.
get_client_profile
workflows:read
Lectura
Ninguno
Sin campo de contrato
The authenticated client’s business profile as the agent sees it: name, industry, company size, country (+ secondary countries), timezone, language, website, primary communication channel, lifecycle stage, notes and which settings keys are configured. Useful context before diagnosing agent behavior or drafting client-facing copy.
Estado de herramientas (1)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_tool_health
workflows:read
Lectura
Ninguno
Sin campo de contrato
How the agent’s tools behaved in REAL conversations and calls over the last N days: per tool calls, ok, failed, empty, blocked, rates, last ok/failure, top errors and redacted samples of args and results. Use it BEFORE saying a tool or integration works, when a client says the agent ‘doesn’t give the info’ or ‘doesn’t book’, and to find silently failing tools (only_problems=true). Filters: workflow_id, tool_name, channel, days (1-14, default 7). Playground/test traffic is excluded; include_test=true returns it separately, labeled, in test_tools: read that before launch, when there are no real conversations yet. Reading it: many empty results on a search/lookup tool can be normal (new patient not found), so check the sample args before blaming parameter names or filters; 401/403 = expired or wrong credential; blocked = the platform stopped the call before the integration (excluded from rates); no rows = never called, which proves nothing. truncated=true: scan capped (window.scanned_from); narrow filters.
Documentación (1)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
search_docs
Clave autenticada
Lectura
Ninguno
Sin campo de contrato
Search Nexor’s product documentation (bundled advanced-feature guides + the live docs site) or read one doc. Pass EXACTLY ONE of: q (search — returns up to 6 results with title, description and path) or path (read — returns the doc content, truncated at ~9000 chars with a marker). Typical flow: search with q and read_top:true to get the best-matching result’s content (top_result, from top_result_path) in the same call; read another path only if that one is not the answer. Public docs only — no tenant data.
Pipeline (2)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
reorder_workflow_statuses
workflows:write
Escritura
workflow_id, ordered_status_keys
Sin campo de contrato
Replace the order of every mutable status after the protected Lead created, Contacted, and Engaged stages. First call get_workflow, then pass every remaining persisted status key exactly once in ordered_status_keys; omission, duplication, an unknown key, or a changed pipeline fails without mutation. The backend keeps the protected head at sort_order 0–2 and assigns the submitted tail contiguously from 3. Read back with get_workflow and compare the exact order before reporting success. Do not include synthetic Discarded stages.
get_pipeline_impact
reports:read
Lectura
workflow_id
Sin campo de contrato
Impact preview of a workflow’s pipeline BEFORE a destructive change (deleting statuses, moving leads, deactivating the workflow): total board-visible leads bucketed by run state — early, active, settled (terminal/inactive collapsed), ai_paused and awaiting_human — plus the top statuses by count. Use it to tell the user “this affects N active leads” and get confirmation. For per-status funnel metrics use get_funnel_report instead.
Bases de conocimiento (15)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_knowledge_bases
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the client’s knowledge bases with status and document/size counts. Pass workflow_id to see only the KBs attached to that workflow, ordered by retrieval priority (each row then includes its priority). Ideal for “what knowledge bases exist”, “which KBs feed this workflow’s agent”, or finding a KB id before attaching or adding documents.
create_knowledge_base
workflows:write
Escritura
name
Sin campo de contrato
Create a new, empty knowledge base for the client. After creating, add content with add_kb_document and make it live for an agent with attach_knowledge_base. Ideal for setting up a fresh document collection (e.g. “Pricing FAQ”, “Product docs”).
update_knowledge_base
workflows:write
Escritura
knowledge_base_id
Sin campo de contrato
Edit a knowledge base’s own fields: its name, its description (what it contains / when the agent should use it), and its status (‘archived’ shelves it so agents stop using it without deleting; ‘active’ restores it). Provide only the fields you want to change; at least one is required. This is the ONLY way to change a KB’s description or rename a KB, there is no dashboard-only field. Returns 404 if the KB does not belong to this client. Ideal for “rename this KB”, “set its description to …”, or “archive the old pricing KB”.
attach_knowledge_base
workflows:write
Escritura
workflow_id, knowledge_base_id
Sin campo de contrato
Attach an existing knowledge base to a workflow so that workflow’s agent can retrieve from it. priority orders retrieval when several KBs are attached (lower = consulted first); omitted, it appends after the current lowest-priority KB. Returns 409 CONFLICT if already attached, 404 if the KB does not belong to this client. Ideal for “make the pricing KB available to the sales workflow”.
detach_knowledge_base
workflows:write
Escritura
workflow_id, knowledge_base_id
Sin campo de contrato
Detach a knowledge base from a workflow. The KB and its documents are NOT deleted — the workflow’s agent just stops retrieving from it. Returns 404 if the KB was not attached to that workflow. Ideal for “stop the sales agent from using the old pricing KB”.
list_kb_documents
workflows:read
Lectura
knowledge_base_id
Sin campo de contrato
Page through the documents inside one knowledge base: name, source type (file/web/text), processing status, chunk count and timestamps. Ideal for “what’s in this KB”, checking whether a just-added document finished processing (status ready), or finding a document id to rename/delete.
add_kb_document
workflows:write
Escritura
knowledge_base_id, name, text
Sin campo de contrato
Add a text document to a knowledge base. The text (max 200KB) is chunked and embedded asynchronously — the response is { document_id, status: “pending” }; poll list_kb_documents until status is “ready”. Ideal for ingesting FAQs, policy text, product descriptions or any copy the agent should be able to cite.
rename_kb_document
workflows:write
Escritura
knowledge_base_id, document_id
Sin campo de contrato
Rename a document and/or replace its text content — this is the ONLY tool that rewrites a document’s text, there is no separate update-text tool. Pass name to rename (embeddings untouched), text to replace the content entirely (max 200KB), or both. Changing content re-indexes the document: it is re-chunked and re-embedded asynchronously, status goes back to ‘pending’ and returns to ‘ready’ when done (poll list_kb_documents). Only text documents (source type ‘text’) accept new content: file/web documents return 409. Returns 404 if the document is not in that KB. Ideal for tidying names after bulk ingestion or updating a FAQ/pricing doc in place.
delete_kb_document
workflows:write
Escritura
knowledge_base_id, document_id
Sin campo de contrato
Permanently delete a document (and its chunks/embeddings) from a knowledge base. The agent stops retrieving it immediately. Returns 404 if the document is not in that KB. Ideal for removing outdated or wrong content the agent keeps citing.
Step 1 of 2 to put a FILE in a knowledge base: mint a short-lived, signed upload target for one file. Upload it with an HTTP POST to upload_url as multipart/form-data: send every entry of the returned fields as form fields, then the file itself as a final field named “file”. Then call add_kb_file_document with the returned storage_path to register it. Supported formats: PDF, TXT, MD, CSV, XLSX, PNG, JPG, WEBP (images are read with OCR and a visual description), max 100MB — storage rejects a larger body. Returns { upload_url, method, fields, storage_path, expires_in_seconds }; the target expires and grants write access to that one object only.
add_kb_file_document
workflows:write
Escritura
knowledge_base_id, storage_path
Sin campo de contrato
Step 2 of 2: register a FILE (PDF, TXT, MD, CSV, XLSX, PNG, JPG or WEBP, max 100MB) you already uploaded to the target from create_kb_upload_url, by its storage_path. This tool never accepts file bytes, base64 or a URL, and cannot read a local path. Text is extracted, chunked and embedded asynchronously: the response is { document_id, status: “pending” }, and the document only starts answering questions once get_kb_document reports “ready”. For plain text you already have, add_kb_document is one call instead of three.
import_kb_website
workflows:write
Escritura
knowledge_base_id, url
Sin campo de contrato
Crawl a public website and ingest it into a knowledge base: Nexor follows up to 30 pages from the given URL, writes their text as one document plus a generated company profile, and embeds both. Asynchronous — poll list_kb_documents or get_kb_document until status is “ready”. EXPENSIVE and rate-limited to 3 crawls per day for the whole account, shared by all its API keys, so do not re-crawl a site that is already ingested. Two different refusals, two different waits: “Rate limit exceeded” means the daily budget is spent (it carries crawl_budget with resets_at — tell the user to try again tomorrow, retrying sooner cannot succeed), while “Too many requests” means another crawl for this client is still running (retry in a few minutes). Only public http(s) URLs are reachable. Ideal for “load our website into the agent’s knowledge”.
get_kb_document
workflows:read
Lectura
knowledge_base_id, document_id
Sin campo de contrato
Read one document: its name, source type (file/web/text), chunk count, timestamps, any ingestion error, and its status — pending, processing, ready or error. The status is the honest one: a document is reported ready only once both its text and its embeddings are in place, so it is answerable by the agent exactly when this says “ready”. Use it to follow an upload, an import or a reindex through to completion. Returns 404 if the document is not in that KB.
reindex_kb_document
workflows:write
Escritura
knowledge_base_id, document_id
Sin campo de contrato
Re-run ingestion for one document: it is re-extracted, re-chunked and re-embedded from its original source, status returns to ‘pending’ and then ‘ready’ (poll get_kb_document). Use it to recover a document stuck in ‘error’, not as routine maintenance: the old chunks are deleted before the new ones are written, so while it runs the agent retrieves fewer chunks from this document (never wrong ones). Content is unchanged — to replace it, pass text to rename_kb_document. Returns 404 if the document is not in that KB.
delete_knowledge_base
workflows:write
Escritura
knowledge_base_id
Sin campo de contrato
Permanently delete a knowledge base AND everything in it: every document, every chunk and every embedding go with it, and any workflow it was attached to stops retrieving from it immediately. There is no undo. To stop an agent using a KB while keeping its content, use update_knowledge_base with status “archived”, or detach_knowledge_base to remove it from one workflow only. Returns 404 if the KB does not belong to this client. Confirm with the user before calling this.
Archivos del agente (4)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_agent_files
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the files your agents can SEND to leads (images and PDFs in the company file library), each with its id, handle, name (label), filename, type and its sending instructions (agent_instruction: when the agent sends it). Pass workflow_id to also get enabled: whether that workflow may send each file. Files are company-wide; a file removed from a workflow is still in the library. legacy_folder_handle is set when an older folder @handle also sends the file. This is not the knowledge base: knowledge documents are read by the agent, these files are attached to messages. Ideal for “which files does this agent send”, finding a file id before renaming, editing or removing it, or spotting duplicates.
update_agent_file
workflows:write
Escritura
file_id
Sin campo de contrato
Rename a file your agents can send and/or rewrite its sending instructions (when the agent sends it). Pass label to rename (the name operators see in Nexor and leads see on a document; the file’s extension is added automatically when sent, so never include or require one; empty string clears it back to the filename) and/or agent_instruction to change when it is sent (cannot be empty). The handle never changes, so rules that reference the file keep working. The file is company-wide: the change applies to every agent that sends it. Returns the updated file; 404 if it does not belong to this client.
set_agent_file_availability
workflows:write
Escritura
file_id, workflow_ids, enabled
Sin campo de contrato
Let or stop specific workflows (tasks) sending one file. enabled:false removes the file from those workflows only; it stays in the library and in every other workflow. enabled:true lets them send it again. To remove a file from an agent (a group of tasks), pass every task id of that agent. Other files’ availability is untouched. Nothing is written if any workflow does not belong to this client (404). Confirm with the user before removing a file from an agent.
delete_agent_file
workflows:write
Escritura
file_id
Sin campo de contrato
Permanently delete a file from the company file library: NO agent can send it afterwards, and any rule that references its handle stops sending it. There is no undo. To stop only one agent sending it, use set_agent_file_availability instead. Returns 404 if the file does not belong to this client. Confirm with the user before calling this, naming the file.
Webhooks (7)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_webhooks
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the client’s outbound webhooks: name, target URL, subscribed events, active flag and delivery health. Secrets are never included. Ideal for “what webhooks are configured”, “is anything listening to meeting.completed”, or finding a webhook id to update/test/delete.
configure_status_webhook
workflows:write
Escritura
workflow_id, status_key, name, url
Sin campo de contrato
Create an outbound webhook that fires only when a lead enters one specific status in one specific workflow/agent. It subscribes to workflow_run.status_changed and installs exact workflow_id + to_status.key filters, plus any extra filters. The signing_secret is returned EXACTLY ONCE. Use one webhook per destination/behavior when different statuses need different payloads or receivers.
get_webhook
workflows:read
Lectura
webhook_id
Sin campo de contrato
Get one webhook’s full configuration: events, filters, auth type, retry setting and payload template. auth_config is redacted to key names and the signing_secret is never returned (it is only shown once, at create time). Ideal for auditing exactly what a webhook sends and when.
create_webhook
workflows:write
Escritura
name, url
Sin campo de contrato
Create an outbound webhook. url must be https and publicly reachable (private/metadata IP ranges are rejected server-side). The response includes the signing_secret EXACTLY ONCE — surface it to the user immediately; it cannot be retrieved later. Ideal for “notify my CRM when a meeting completes” style integrations.
update_webhook
workflows:write
Escritura
webhook_id
Sin campo de contrato
Update an existing webhook. Only the fields you pass change; use is_active to pause (false) or resume (true) deliveries without deleting the webhook. Returns the updated, redacted configuration — the signing_secret is never re-issued. Ideal for pointing a webhook at a new URL, changing its event list, or toggling it.
delete_webhook
workflows:write
Escritura
webhook_id
Sin campo de contrato
Permanently delete a webhook; deliveries stop immediately. Returns 404 if no webhook matched. To pause temporarily instead, use update_webhook with is_active:false.
test_webhook
workflows:write
Escritura
webhook_id
Sin campo de contrato
Fire a synthetic test event at a webhook’s URL and report the outcome: { delivered, response_status, duration_ms, error }. The remote response body is never reflected back. Ideal for verifying a newly created or just-edited webhook actually receives events before relying on it.
Tags (3)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_tags
leads:read
Lectura
Ninguno
Sin campo de contrato
Page through the client’s tag catalog (id, name, slug, description, color). search matches name, slug and description. Ideal for “what tags exist”, finding a tag id before set_tag/delete_tag, or checking a slug before creating a similar tag. To tag an individual lead use sync_lead_tags instead.
set_tag
leads:write
Escritura
Ninguno
Sin campo de contrato
Create or update a tag in the catalog (upsert). OMIT tag_id to CREATE: name is required and slug is auto-generated from it unless given. PASS tag_id to UPDATE that existing tag’s name/slug/description/color (only provided fields change). Returns the tag; 409 CONFLICT if the slug already exists for this client. Leads already carrying an updated tag keep it — renaming is safe. Color is account-wide and applies wherever this tag appears; null restores the name-based default. Read list_tags after editing to verify persistence.
delete_tag
leads:write
Escritura
tag_id
Sin campo de contrato
Permanently delete a tag from the catalog AND remove it from every lead that carries it (cascade). Returns 404 if no tag matched. Ideal for retiring obsolete tags; to merely rename one, use set_tag with tag_id instead.
Procesadores (6)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_processors
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the client’s pre-workflow processors (lead-routing rule engines): name, default workflow, active flag and rule count. Deactivated processors are hidden unless include_inactive is true. Ideal for “how are incoming leads routed”, or finding a processor id before get_processor / set_processor_rule.
get_processor
workflows:read
Lectura
processor_id
Sin campo de contrato
Get one processor with its full rule list: each rule’s conditions, target workflow, evaluation position and active flag. Rules are evaluated in position order (1 first); the first match wins. Ideal for auditing routing logic before editing it with set_processor_rule.
set_processor
workflows:write
Escritura
Ninguno
Sin campo de contrato
Create or update a pre-workflow processor (upsert). OMIT processor_id to CREATE: name and default_workflow_id are required, and you may seed up to 50 rules atomically (if any rule fails, the whole create rolls back). PASS processor_id to UPDATE name/description/default_workflow_id/is_active — rules cannot be passed on update; manage them with set_processor_rule / delete_processor_rule. default_workflow_id must belong to this client.
delete_processor
workflows:write
Escritura
processor_id
Sin campo de contrato
Soft-deactivate a processor: it stops evaluating rules and routing leads, but the processor and its rules are kept (visible via list_processors include_inactive:true) and can be reactivated with set_processor is_active:true. Returns { deactivated: true }.
set_processor_rule
workflows:write
Escritura
processor_id
Sin campo de contrato
Create or update one routing rule on a processor (upsert). OMIT rule_id to CREATE: name, workflow_id and conditions (1-20, ALL must match) are required. PASS rule_id to UPDATE — only provided fields change; passing position (1-based, 1 = evaluated first) also reorders the rule, which is how rules are reordered. workflow_id must belong to this client. Empty condition lists are rejected: they would match every lead.
delete_processor_rule
workflows:write
Escritura
processor_id, rule_id
Sin campo de contrato
Permanently delete one routing rule from a processor. Leads that would have matched it fall through to later rules or the default workflow. Returns 404 if the rule is not on that processor.
Tipos de reunión (5)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_meeting_types
workflows:read
Lectura
workflow_id
Sin campo de contrato
List a workflow’s meeting types exactly as the dashboard form shows them: name, duration, meeting buffer, min notice, max days ahead, calendar title/invite templates, type (video with video_provider google_meet/teams, phone, in_person with location_details), overbooking + maximum per time slot, color, is_active, the free-text agent_selection_criteria and the enforced agent_selection_rules (see set_meeting_type_routing). Ideal for “what appointment kinds can this workflow book” or finding a meeting type id before update_meeting_type / delete_meeting_type.
create_meeting_type
workflows:write
Escritura
workflow_id, name
Sin campo de contrato
Create the first and only meeting type for an appointment workflow that currently has none. Requires a name; omitted fields receive the dashboard defaults (30 min, 15 min buffer, 2 h notice, 14 days ahead, video). The type is created ACTIVE; it becomes bookable once a host with availability is assigned (add_executive). If one already exists, returns it explicitly with status=“existing” and never creates another. If several exist, fails with MULTIPLE_MEETING_TYPES so the operator can consolidate them. Bad values fail with 400 listing the allowed options (e.g. location_type must be video, phone or in_person).
update_meeting_type
workflows:write
Escritura
workflow_id, meeting_type_id
Sin campo de contrato
Update one meeting type by id (at least one field required; only provided fields change) — every field of the dashboard meeting form. Pass null for description / event_description_template / location_details / video_provider / max_bookings_per_slot to clear them. is_active switches the type on or off: activating while another type is active fails with 409 MT_EXISTS; deactivating the only active type of a live appointment agent fails with 409 LAST_ACTIVE_MEETING_TYPE. Bad values fail with 400 listing the allowed options. Returns 404 if the meeting type is not in that workflow. Ideal for “make demos 45 minutes”, “require 24h notice”, “make it in person at the showroom”, “use Teams instead of Meet”.
set_meeting_type_routing
workflows:write
Escritura
workflow_id, agent_selection_rules
Sin campo de contrato
Write the enforced host routing rules (agent_selection_rules) of a meeting type and read them back. Unlike agent_selection_criteria (free text the AI interprets), these rules are applied server-side when slots are offered and booked. Every host reference is validated against the hosts assigned to the meeting type (list_executives; pass user ids, names are resolved to the assigned host and stored by name). Examples: two hosts strictly alternating → {routing:“cycle”, tiers:[{agents:[A,B], mode:“cycle”, pattern:[0,1]}]}; leads with renta >= 50000 to Ana, the rest split 2:1 between Bruno and Carla, below 0 disqualified → {field:“renta”, tiers:[{min:50000, agents:[ana]}, {min:0, agents:[bruno, carla], weights:[2,1]}, {min:-1e9, action:“disqualify”}]}. Pass agent_selection_rules: null to clear. meeting_type_id may be omitted when the workflow has exactly one meeting type. 400 lists what is wrong (unassigned host, unordered tiers, unknown mode).
delete_meeting_type
workflows:write
Escritura
workflow_id, meeting_type_id
Sin campo de contrato
Delete a meeting type from a workflow. The response reports impact: agent_assignments_removed and future_events_orphaned (already-booked meetings keep their calendar events but lose the type link). Returns 409 LAST_APPOINTMENT_TYPE when the workflow’s goal is ‘appointment’ and this is its only remaining type — an appointment workflow must keep at least one. 404 if the id is not in that workflow.
Configuración de tareas (12)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_workflow_status
workflows:read
Lectura
workflow_id, status_key
Sin campo de contrato
Read one workflow status’s complete configuration without changing it: label/category/flags, entry_hint, on_enter_instructions, required-field and transition gates, timeout, transfer, pause and assignment behavior. Use this before update_workflow_status and preserve exact labels/casing unless the user explicitly asks to rename them.
update_workflow_status
workflows:write
Escritura
workflow_id, status_key
Sin campo de contrato
Configure one existing funnel status exactly like the dashboard stage editor. entry_hint is the natural-language qualification/entry gate for that status (required on non-initial statuses: clearing it is refused with status_entry_hint_required); on_enter_instructions is what the agent does once the lead is in that stage (e.g. thank, say you will reconnect later, say goodbye) — never put behavior in entry_hint; requires_all_fields or required_field_keys adds a deterministic variable gate; transition_rules adds structured qualification rules; timeout_config is the per-stage delay (after N minutes/hours/days since entering this status, move to target_status_key in the same workflow — the native way to wait, never a Scheduled Function or Background Job); transfer_config on an is_terminal status hands the lead to another task of the same agent group (conversation history and a read-only snapshot of collected fields carry over) — for a delayed handoff put the timeout on the waiting status and point it at the terminal transfer status; pause_bot stops the current agent; can_return_on_reply (lost final stages only, else 400 can_return_on_reply_requires_lost_stage) lets a lead who writes again come back to an active stage; assignment_config ({mode, agent_ids, restrict_booking_to_assignee}) assigns a human team member on entry — only ONE status per workflow may carry it (409 ASSIGNMENT_CONFIG_EXISTS with holder_status_key; clear it there with assignment_config:null first). On the escalation stage, assignment_config.on_escalation:true routes new escalations to those people; a routing save there returns warnings (routing_off, escalation_off) when it reaches nobody yet. category must be active/won/lost/paused/deferred. System stages other than the escalation stage and the virtual Discarded stage refuse writes with 409 PROTECTED_STATUS. Read get_workflow_status first and change only intended fields; preserve the exact label unless renaming was explicitly requested.
list_workflow_voices
workflows:read
Lectura
workflow_id
Sin campo de contrato
List the voice catalog usable by a workflow’s call agent: public voices plus the client’s private voices, each with id, voice_id, name, provider, language, gender and a preview_url (a playable .mp3 sample link you can hand the user to hear the voice). Use this to pick a voice_id for set_workflow_voice, or to show the user samples before switching.
set_workflow_voice
workflows:write
Escritura
workflow_id
Sin campo de contrato
Switch and/or tune the workflow’s call voice. To CHANGE which voice the lead hears, pass ONE of: gender (‘male’/‘female’ — the server picks a matching voice in the workflow’s language, e.g. a male voice for ‘voz de hombre’), voice_id (an exact id from list_workflow_voices), or voice_name (a name to match). The server writes the effective voice where the call runtime actually reads it and returns resolved_voice with a preview_url (.mp3) you should share with the user so they can hear it. To TUNE the current voice, pass a voice object with knobs (voiceSpeed, voiceTemperature, volume); these are key-level merged and preserved. Provide at least one of gender/voice_id/voice_name/voice. Unknown voice_id or no gender match returns INVALID_VOICE with available_voices. Version-snapshotted.
get_workflow_cadence
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read a workflow’s outreach cadence (block-config): the sequenced contact blocks (channel, delay, templates), timing/business-hours config and retry behaviour.
set_workflow_cadence
workflows:write
Escritura
workflow_id, block_config
Sin campo de contrato
Replace a workflow’s outreach cadence (block-config). Read the current one with get_workflow_cadence first and send the full edited object — this is a whole-document PUT, not a merge. It does NOT set the WhatsApp opening template: dayConfig.config.opening_template is ignored when unchanged and REJECTED when changed (use set_opening_templates, which validates the opener). WhatsApp template names referenced by blocks must exist and be APPROVED on the client’s WABAs; business hours are re-derived server-side.
get_workflow_qualification
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read a workflow’s lead-qualification model (futurology): the scoring categories and the conditions that classify a lead into them.
set_workflow_qualification
workflows:write
Escritura
workflow_id
Sin campo de contrato
Write a workflow’s lead-qualification model (futurology). categories and conditions address the SAME rows under two vocabularies (category_key/category_name/description = condition_key/condition_name/condition_description), so a key may appear once per call. Every row needs its key AND its human name (condition_name / category_name — never invented by the server); threshold_type, timing_type and scope are closed enums and wrong types are refused with 400 naming the index and field. Default is a merge (upsert by key, unsent columns keep their stored value); pass replace:true to clear the whole model and write what you send. get_workflow_qualification returns rows under the same field names, so a read-modify-write needs no translation. Provide at least one of categories/conditions.
delete_workflow_status
workflows:write
Escritura
workflow_id, status_key
Sin campo de contrato
DESTRUCTIVE: permanently delete a funnel status from a workflow. Call get_pipeline_impact FIRST to see how many leads sit on each status. If any leads are on the status you must pass migration_target (the status key those leads are moved to) or the call fails with STATUS_HAS_LEADS and the lead count. The only initial status and the last terminal status can never be deleted. The escalation stage cannot be deleted either (409 escalation_stage_not_deletable): turn escalation off with update_workflow_config (escalation:{enabled:false}) instead.
delete_workflow_field
workflows:write
Escritura
workflow_id, field_key
Sin campo de contrato
DESTRUCTIVE: permanently delete a data field (variable) from a workflow. Leads’ previously collected answers are preserved (detached from the field but kept in history); the field is removed from the funnel and the agent stops collecting it. Refuses with FIELD_IN_USE (409) when the field still gates a status (required fields / transition rules) or a qualification rule — remove those references first, then delete. There is no undo — prefer editing the field with update_workflow_structure over deleting it.
delete_workflow
workflows:write
Escritura
workflow_id
confirm: true
DESTRUCTIVE / IRREVERSIBLE: archive one mode/workflow and release its channels. If it is the last non-archived mode, its master workflow (the named agent) is ALSO deleted, automatically, with no keep-agent option. Before sign-off, read list_workflows and list_agent_groups (paused modes count), name the affected agent and warn explicitly; pass its id as confirm_master_workflow_id after approval. Do not detach the mode to bypass this rule. confirm:false previews without writes; confirm:true deletes after approval. Active pipeline leads block deletion: status:‘blocked’, reason:‘agent_has_leads’, lead_count. Move or discard them explicitly first. / DESTRUCTIVO: archiva un modo. Si es el último, también elimina su agente, sin opción de conservarlo. Antes de confirmar, lee los modos (incluidos pausados) y agentes, nombra al agente y avisa de la eliminación conjunta. No desvincules el modo para evitarla. confirm:false previsualiza; confirm:true elimina tras aprobación. Leads activos bloquean con agent_has_leads.
restore_workflow
workflows:write
Escritura
workflow_id
Sin campo de contrato
Un-archive (restore) an agent that was previously deleted with delete_workflow. Archive is a soft-delete, and this is its inverse: it clears the archive so the agent is listable and editable again. The agent comes back PAUSED and inactive — the channels it had (WhatsApp / phone / Instagram / Meta) were released when it was archived and are NOT re-attached, and its old leads/runs stay paused; reconnect channels and activate explicitly afterwards. Find the archived agent’s id first with list_workflows include_archived:true. Idempotent: restoring an agent that isn’t archived returns { status:‘already_live’ } without error. / Restaura (desarchiva) un agente eliminado con delete_workflow. El borrado es suave y esto es su inverso: el agente vuelve a aparecer y a ser editable, pero PAUSADO e inactivo; sus canales fueron liberados al archivar y NO se reconectan solos. Usa list_workflows include_archived:true para encontrar su id.
Ejecutivos (4)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_executives
workflows:read
Lectura
workflow_id
Sin campo de contrato
List a workflow’s executives — the human hosts who take its meetings — with their user, active flag and assigned meeting types.
add_executive
workflows:write
Escritura
workflow_id, user_id
Sin campo de contrato
Add a team member as an executive (meeting host) of a workflow, optionally restricted to specific meeting types. The user must belong to the client’s team (see get_team); adding someone who is already a host fails with a conflict. Assigning the host to a meeting type that was created inactive (seeded in the dashboard before any host existed) activates it, unless another type is already active; the response lists meeting_types_activated. Pass meeting_type_ids explicitly for that to happen — omitting it links no meeting type.
update_executive
workflows:write
Escritura
workflow_id, executive_id
Sin campo de contrato
Update a workflow executive: toggle is_active and/or replace their full meeting-type set (meeting_type_ids overwrites the current assignments — pass the complete list). Provide at least one field. Linking the host (or switching them back on) activates a meeting type that was created inactive, unless another type is already active; the response lists meeting_types_activated.
remove_executive
workflows:write
Escritura
workflow_id, executive_id
Sin campo de contrato
Remove an executive (meeting host) from a workflow. Their existing meetings are untouched; they just stop receiving new ones.
Avanzado (1)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
describe_advanced_features
workflows:read
Lectura
Ninguno
Sin campo de contrato
Map every surface in the dashboard Advanced hub to its purpose, execution model, MCP tools, and safety considerations. Use this as the entry point for Advanced configuration.
Sistema del agente (2)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
describe_agent_configuration
workflows:read
Lectura
Ninguno
Sin campo de contrato
Complete reference for designing and configuring one or many Nexor agents through MCP: prompts, statuses and qualification gates, variables, cadence, tools, pre-execution hooks, stage gates, webhooks, transfers, Cloud/Scheduled Functions, and the required clarification/sign-off workflow. Call this before proposing a non-trivial or multi-agent build.
review_agent_system_plan
workflows:read
Lectura
plan
Sin campo de contrato
Opt in with plan.composition_policy=task_composition_v1 for 1–20 independent tasks created paused_unbound: validates real graph reachability and forbids activation/channel bindings; missing booking resources are pending_setup, invalid configuration still blocks. Only this opt-in returns composition_contract_version:1. Otherwise: Preflight a complete agent configuration (its modes) before any mutations. Gates mode decomposition deterministically: one mode per intent, 2–3 by default; a single-mode plan is BLOCKED unless plan.decomposition carries the operator’s explicit single-mode instruction, 5+ modes are blocked unless explicitly requested, and every non-entry mode must be reachable by a transfer. Also finds missing identities, goals, status gates, transfer targets, language/timezone (every agent needs an IANA timezone — it anchors booking slots; channels are never asked — a mode inherits its agent’s channels at birth, see birth_defaults in the result), a contact_schedule missing on a mode whose own description hints at after-hours / 24-7 / weekend hours (such a mode must never be born with the Mon–Fri business-hours default), planned channels with no verified resource on the account, webhook destinations, booking prerequisites for appointment agents (meeting type, host, calendar plan or external provider), and operational risks; returns an internal plan_fingerprint (never shown to the user) and the exact final sign-off prompt. Do not create/update agents, tools, hooks, webhooks, functions, schedules, jobs, or transfers until this review is clean and the user explicitly approves the summarized plan (“Does this look ok? Let me know and I’ll build it.”).
Agentes (10)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_agent_inbound_calls
numbers:read
Lectura
agent_group_id
Sin campo de contrato
Read incoming-call settings, eligible numbers, linked numbers affected by the same setting, and activation status for an agent group. Resolve the group with list_agent_groups or the selected task master_workflow_id. Read before changing anything and after saving. status=ready confirms configuration is ready; pending is not active and error requires attention. No call is placed.
set_agent_inbound_calls
numbers:write
Escritura
agent_group_id, number_id, mode, confirm
confirm: true
Configure incoming calls for the whole agent group. The agent keeps its number in every mode. ai = AI answers; ai_human = AI answers and transfers on request; forward = direct forwarding without AI; off = stop incoming calls without changing the router or other channels. ai/ai_human enable a missing or inactive router with AI routing off; an active router stays unchanged. Read get_agent_inbound_calls first. Explain the selected number and linked numbers affected, and obtain consent for the exact mode and destination. Pass an observed number_id; ai_human and forward require an international transfer_to. Do not unassign the number or turn off the router to resolve a conflict. Read back after saving or an error; changes may be partially applied. Report pending as preparation and never claim pending/error is active. This makes the real API request, not a prompt edit. Does not buy numbers, place test calls, or change outbound schedules.
list_agent_groups
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the account’s AGENTS (master workflows — what the operator sees and names in the sidebar, each with its own chat) with their ids, names, descriptions and ivr_navigation (phone-menu navigation on calls, see update_agent_group). This is the answer to “how many agents do I have” and “which agent is X”; never count workflows for that. A workflow is a MODE / sub-agent of one of these agents: list_workflows returns each mode’s agent as master_workflow_id.
create_agent_group
workflows:write
Escritura
Ninguno
Sin campo de contrato
Create an AGENT (a master workflow — the named entry the operator sees in the sidebar). This is the FIRST write of any agent build: every workflow is a mode INSIDE an agent (create_workflow requires master_workflow_id; a workflow never exists without an agent), so create the agent here, then create at least one mode inside it with the returned id — an agent with no modes is unfinished. BORN WITH: Nexor picks the agent’s name — a human first name from its pool, skipping names the account’s other agents already carry — so never ask the operator to name the agent and never pass one (a name argument is ignored and reported back as requested_name_ignored; rename later with update_agent_group only if the operator explicitly asks). The result’s birth_defaults lists the channels the agent has (every channel the account holds a verified resource for) — every mode created inside it inherits those channels, the contact schedule and the agent’s name automatically through create_workflow, so channels and hours are never questions. Modes are created or moved under it afterwards: create_workflow with master_workflow_id = the returned id, or update_workflow with that id; then read back both lists. Plan its modes by intent before creating any: a typical agent has 2–3 modes (one per distinct goal or register, e.g. sell → follow up → discount), one mode only when the operator explicitly asks for exactly one, never 5+; review_agent_system_plan enforces this.
update_agent_group
workflows:write
Escritura
agent_group_id
Sin campo de contrato
Rename an AGENT (master workflow), change its description, or turn phone-menu (IVR) navigation on/off for its calls (ivr_navigation). Pass only the fields to update. This does not move modes (sub-agent workflows) between agents; use update_workflow.master_workflow_id for that.
delete_agent_group
workflows:write
Escritura
agent_group_id
Aprobación del operador en instrucciones
Delete (deactivate) an AGENT — the master workflow the operator sees in the sidebar; “delete this agent” inside that agent’s chat means this tool on that id — only after the operator’s explicit yes to a one-line confirmation. Soft delete: its modes (sub-agent workflows) are detached, not deleted, and their leads stay. To delete one mode use delete_workflow instead. Read back list_agent_groups and list_workflows after the write.
get_agent_group_catalog_settings
workflows:read
Lectura
agent_group_id
Sin campo de contrato
Read the agent group catalog default inherited by its tasks. Null means no group default.
set_agent_group_catalog_settings
workflows:write
Escritura
agent_group_id, enabled, offer_ids
Sin campo de contrato
Set catalog defaults for current and future tasks. Explicit task overrides remain unchanged. enabled=false disables the group default; offer_ids=null selects all active catalogs. Read back after saving.
get_task_catalog_settings
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read effective task catalogs and whether they inherit the agent group default.
set_task_catalog_settings
workflows:write
Escritura
workflow_id, enabled, offer_ids
Sin campo de contrato
Set task catalog override, disable products with enabled=false, or resume the agent group default with inherit_from_group=true. Read back after saving.
Enrutamiento entrante (9)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_inbound_router
workflows:read
Lectura
agent_group_id
Sin campo de contrato
Read an agent group’s inbound router: whether it is on, the default task (the task that answers when no rule or AI decision picks one), AI routing and thresholds, which tasks it may route to, the shared identity, and every task of the group with paused status. Read before any change and after saving. inbound_router_not_enabled means the account does not have the router; say so and stop.
set_inbound_router
workflows:write
Escritura
agent_group_id, confirm
confirm: true
Change an agent group’s inbound router. Pass only changed fields. default_workflow_id must come from get_inbound_router; paused tasks are allowed. Without a default, activation picks the arrival task, else the oldest. Turning the router on does not enable incoming calls. Turning it off stops AI call reception; direct forwarding stays on. Explain this before disabling. Use set_agent_inbound_calls to change call mode while keeping the number assigned. candidate_workflow_ids limits task selection (null = all). confidence_threshold and clarify_threshold are 0-1; clarify must not exceed confidence. Read get_inbound_router first, show before and after, and pass confirm=true only after approval. Read back after saving. New inbound messages fall back to the default task when the router is off; conversations already running stay with their task.
get_inbound_router_rules
workflows:read
Lectura
agent_group_id
Sin campo de contrato
Read the fixed routing rules of an agent group, in evaluation order. A rule sends a new inbound conversation to target_workflow_id when all its conditions match, before AI routing and the default task.
set_inbound_router_rules
workflows:write
Escritura
agent_group_id, rules, confirm
confirm: true
Replace ALL routing rules of an agent group; array order is evaluation order. To add, edit or remove one rule, read get_inbound_router_rules, change that entry, and send the whole list. An empty list removes every rule. target_workflow_id must be a task of the same group. Show the operator the full resulting list and pass confirm=true only after they approve. Read back after saving.
set_inbound_router_identity
workflows:write
Escritura
agent_group_id, confirm
confirm: true
Replace the shared identity every task of the agent group presents to a new inbound lead before routing: name, voice, language, identity prompt and per-channel prompts. Full replacement: read get_inbound_router first and resend fields you keep. Confirm the exact text with the operator and pass confirm=true. Read back after saving.
get_inbound_router_activity
workflows:read
Lectura
agent_group_id
Sin campo de contrato
Read how the router has been deciding: the latest decisions (channel, layer that decided, chosen task, confidence, the first message, any correction) and aggregates for a time window. Use it to explain why a lead landed on a task or to check a change worked.
test_inbound_router
workflows:read
Lectura
agent_group_id, channel, first_message_text
Sin campo de contrato
Dry-run the router with a sample first message and see which task would answer and why. Nothing is sent, no lead is created and no decision is stored. Use it after changing rules, the default task or AI routing. channel is whatsapp, webchat, email or api.
list_inbound_entry_points
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the account’s inbound entry points (WhatsApp, phone, SMS, iMessage, Instagram, Messenger, email senders; with agent_group_id also the group’s website chat and email) and where each one lands today: a single task (type agent), an agent group’s router (type group) or nowhere. available=false comes with unavailable_reason.
set_inbound_entry_point
workflows:write
Escritura
channel, id, destination, confirm
confirm: true
Choose where one inbound entry point lands: destination {type:“group”, id} sends new conversations through that group’s router, {type:“agent”, id} sends them straight to one task, {type:“none”} disconnects it. Use the channel and id from list_inbound_entry_points; email and webchat also need agent_group_id. A 409 with required_confirmation means another number or group is affected: explain conflict to the operator and, only if they approve, retry with confirmation set to required_confirmation exactly as returned. Pass confirm=true only after approval. Read back after saving. A phone number answers calls only once connected: connect a new number (id from provision_phone_number) to an agent with channel “phone” and destination {type:“group”, id: the agent id}; this turns the agent’s router on and needs an active task of the agent that does not exclude calls (else agent_not_active / no_call_task).
Subcuentas (7)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
list_sub_accounts
sub-accounts:read
Lectura
Ninguno
Sin campo de contrato
List the sub-accounts of the connected main account: each one’s id, name, country, owner and invitation, state (active, invited, paused, inactive), agents and leads, plus the family’s usage this period (every sub-account adds to the main account’s plan). A null usage number means the meter could not be read, not zero. Call this first: it also tells you whether the account has sub-accounts at all. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.
Create a sub-account under the connected main account and invite its owner by email (the invitation lasts 7 days). The sub-account starts empty, with no card or plan of its own: its usage adds to the main account. country is ISO 3166-1 alpha-2, language is es or en, timezone is IANA (e.g. America/Santiago). The owner email cannot already belong to the main account’s team. Confirm every field with the operator before passing confirm=true. If the response shows email_sent=false, give the operator invite_url to share. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.
resend_sub_account_invitation
sub-accounts:write
Escritura
sub_account_id, confirm
confirm: true
Send the sub-account owner’s invitation again with a fresh 7-day link. owner_already_accepted means the owner already joined. If email_sent=false, give the operator invite_url to share. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.
copy_agent_to_sub_account
sub-accounts:write
Escritura
sub_account_id, confirm
confirm: true
Copy one of the main account’s agents into a sub-account. Pass exactly one source: master_workflow_id for an agent group, or workflow_id for a single agent (ids from list_agent_groups / list_workflows of the main account). The copy arrives paused, with its configuration, stages, fields, tools and rules. Connections bound to the main account (numbers, channels, integrations) are not copied: next_steps and missing_connections say what the sub-account must connect before going live. status=existed means the same copy was already made. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.
pause_sub_account
sub-accounts:write
Escritura
sub_account_id, confirm
confirm: true
Pause every agent of a sub-account; its team keeps access and nothing is deleted. failed_workflow_ids lists agents that could not be paused. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.
deactivate_sub_account
sub-accounts:write
Escritura
sub_account_id, confirm
confirm: true
Deactivate a sub-account: pauses all its agents and its team stops seeing the account. No data is deleted and reactivate_sub_account undoes it. pause_incomplete means some agents could not be paused and nothing was deactivated. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.
reactivate_sub_account
sub-accounts:write
Escritura
sub_account_id, confirm
confirm: true
Reactivate a deactivated sub-account so its team sees it again. Its agents stay paused until someone resumes them. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.
Calendarios (3)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
connect_calendar
calendars:write
Escritura
user_id, provider
confirm: true
Start connecting a team member’s Google or Outlook calendar (the host’s busy time and conferencing link for bookings). Returns connect_url, expires_at (10 min) and connection_request_id. IMPORTANT — hand connect_url to the user DIRECTLY as a clickable link and say who must open it (the host signs in and grants calendar access there; it cannot be completed in chat). When the target user is NOT the operator you are talking to, you MUST first tell the operator whose calendar will be linked and get an explicit yes, then call again with confirm=true — the backend refuses with CONFLICT/CONFIRMATION_REQUIRED otherwise. Other refusals: USER_NOT_ACCEPTED (fix: invite_user and wait for acceptance), PROVIDER_UNAVAILABLE (Outlook not enabled here), OTHER_PROVIDER_ACTIVE (disconnect the other provider first). Afterwards poll get_calendar_connections until status=active and scopes_ok=true.
get_calendar_connections
calendars:read
Lectura
Ninguno
Sin campo de contrato
List calendar connections (Google, Outlook, Calendly) for the account or one team member: provider, status (active / needs_reauth / revoked / error), role, calendar_email, scopes_ok (false = reconnect with connect_calendar), last_error, connected_at. Poll this after connect_calendar; the host is bookable with busy-time awareness once a row is active with scopes_ok=true.
disconnect_calendar
calendars:write
Escritura
connection_id, confirm
confirm: true
Revoke a host’s calendar connection (the agent stops reading their busy time and creating events there; Outlook accounts are also removed from the provider). Preview-then-confirm: call with confirm=false first — returns { requires_confirm: true, connection } and changes NOTHING; show the operator whose calendar it is, then call again with confirm=true. Reads the connection back after revoking.
Disponibilidad (5)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_host_availability
people:read
Lectura
user_id
Sin campo de contrato
Read a team member’s booking availability: timezone (host’s own or seeded from the account), schedule flags, weekly slots grouped by weekday (0=Sunday), blocked dates, and slot_count. A host with slot_count 0 and no Calendly cannot be booked (BOOKING_AVAILABILITY_REQUIRED).
set_host_schedule
calendars:write
Escritura
user_id, slots
Sin campo de contrato
Replace a team member’s whole weekly schedule in one call (atomic: the previous slots are removed). slots = [{ weekday 0-6, start ‘HH:MM’, end ‘HH:MM’ }] — e.g. Monday-Friday 09:00-17:00 is five entries with weekday 1..5. Overlapping slots on one weekday, end before start, or an unknown IANA timezone are refused with the offending field. timezone defaults to the host’s current one, else the account timezone (seeded). Returns the persisted availability; readiness recomputes and BOOKING_AVAILABILITY_REQUIRED clears once slot_count > 0.
set_host_timezone
calendars:write
Escritura
user_id, timezone
Sin campo de contrato
Set (or clear with null) a team member’s availability timezone without touching their slots. Unknown IANA zones are refused. Setting a zone also turns respect_own_timezone on unless you pass it explicitly. Returns the persisted availability.
set_host_blocks
calendars:write
Escritura
user_id
Sin campo de contrato
Add and/or remove a team member’s blocked dates (time off). add = [{ date ‘YYYY-MM-DD’, start?, end?, all_day?, reason? }] (omit times for all-day); remove = block ids from get_host_availability. Applied in order (removes first, then adds); returns the persisted availability with the final block list.
auto_assign_solo_host
workflows:write
Escritura
workflow_id
Sin campo de contrato
Make a team member the meeting host of an appointment workflow and cover all its meeting types — the one-call setup for a single-host account. Omit user_id when the account has exactly one eligible member (owner/admin/human_agent); with several, the backend answers MULTIPLE_HOSTS with candidates and you pass user_id. Idempotent. Returns the assignment plus that host’s availability; follow with set_host_schedule and connect_calendar if slot_count is 0 or no calendar is active.
Calendly (9)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
connect_calendly
workflows:write
Escritura
Ninguno
Sin campo de contrato
Start connecting the client’s Calendly account: returns a hosted Composio authorization URL (connect_url, expires in ~10 min) the operator opens to grant access. IMPORTANT — give connect_url to the user DIRECTLY as a clickable link and tell them to open it; the authorization happens entirely on that page and CANNOT be completed in chat. After they finish, Nexor registers the webhook subscription and starts provisioning automatically. Poll get_calendly_status until state=connected (plan_required means the Calendly plan has no webhook support). Fails with already_connected when an active connection exists — pass reconnect=true to re-authorize. Next: list_calendly_event_types, then set_calendly_binding per host per meeting type.
get_calendly_status
workflows:read
Lectura
Ninguno
Sin campo de contrato
Read the client’s Calendly connection: state (not_connected / connected / plan_required / disconnected), webhook health_status, plan_tier, host_mode, last provisioning report (per-host outcomes: wired / needs_mapping / no_event_type / primary_conflict) and the Composio account status. The poll target after connect_calendly and the place to read provisioning results.
list_calendly_event_types
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the connected Calendly account’s event types: uri (the API uri set_calendly_binding needs), name, duration_minutes, active, scheduling_url, kind and owner. Defaults to the connecting user’s event types; pass owner_uri (a Calendly user uri from the provisioning report hosts[].uri) to list another host’s. Only an ACTIVE event type whose duration equals the meeting type’s duration can be bound.
Bind a Calendly event type to ONE host for ONE meeting type of a workflow (the per-host model; there is no per-workflow link to manage). The backend validates the event type is active and its duration equals the meeting type’s duration_minutes (400 duration_mismatch otherwise), assigns the host to the workflow/meeting type if needed, writes the binding and reads it back. The first binding on a workflow switches that workflow to Calendly mode: native booking tools are gated and get_available_slots reads Calendly. Pass event_type_uri=null to clear a host’s binding (the host then appears under excluded_hosts). Repeat per host per meeting type; verify with list_calendly_bindings.
list_calendly_bindings
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read a workflow’s Calendly wiring: workflow_mode (calendly / native), the per-host bindings (host, meeting type, event_type_uri) and excluded_hosts — hosts assigned to a meeting type WITHOUT an event type (reason no_event_type_binding) who are silently missing from availability until set_calendly_binding fixes them. Optionally filter by meeting_type_id.
set_calendly_host_mode
workflows:write
Escritura
mode
Sin campo de contrato
Set the Calendly host mode. ‘teams’ is the only value: hosts are the Calendly organization members, each mapped to a Nexor user and wired per meeting type by provisioning. Enqueues a provisioning pass; read the outcome with get_calendly_status or run provision_calendly for an immediate report.
map_calendly_hosts
workflows:write
Escritura
calendly_user_uri, host_user_id
Sin campo de contrato
Map a Calendly host (calendly_user_uri from the provisioning report hosts[] with outcome needs_mapping) to a Nexor user, or pass host_user_id=null to unassign. The uri must come from the last provisioning report — run provision_calendly first. Fails with primary_conflict when the user already books through another calendar (e.g. Google) and cross_client_primary when they are a host in another client. Enqueues a provisioning pass afterwards.
provision_calendly
workflows:write
Escritura
Ninguno
Sin campo de contrato
Run Calendly provisioning now and return the report: discovers the organization’s hosts, maps them to Nexor users (explicit mapping > email match > needs_mapping), resolves each host’s event type and wires workflow_agent_meeting_types for every workflow in Calendly mode. Report hosts[] outcomes: wired / needs_mapping (→ map_calendly_hosts) / no_event_type (→ set_calendly_binding) / primary_conflict / cross_client_primary. Requires host mode set and at least one workflow bound. Pass wait=false to enqueue instead and poll get_calendly_status.
disconnect_calendly
workflows:write
Escritura
Ninguno
confirm: true
Disconnect Calendly for the client: deletes the webhook subscription, deactivates the integration and revokes the Composio account. Workflows bound to Calendly stop receiving Calendly bookings; per-host bindings are kept for a later reconnect. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms.
Ajustes de agenda (8)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_workflow_booking_settings
workflows:read
Lectura
workflow_id
Sin campo de contrato
Read a workflow’s booking settings in one call: default_attendees (people invited to every booked meeting), host_assigner (CRM seller-assigner config) and external_booking (client-owned booker config). Use it before set_default_attendees / set_host_assigner / set_external_booking to see the current state.
set_default_attendees
workflows:write
Escritura
workflow_id, attendees
Sin campo de contrato
Replace the people invited to EVERY meeting booked on this workflow (e.g. a sales manager who sits in on all calls). Full-state: the list sent IS the list afterwards; send [] to clear. Entries are {email, name?}; emails are validated and deduped. They appear on the next booked event’s calendar invite alongside the host and the lead.
get_meeting_confirmation_email
workflows:read
Lectura
workflow_id, meeting_type_id
Sin campo de contrato
Read a meeting type’s lead confirmation email settings (email_config) and the list of allowed keys. Use before set_meeting_confirmation_email; the write replaces the whole object.
set_meeting_confirmation_email
workflows:write
Escritura
workflow_id, meeting_type_id, email_config
Sin campo de contrato
Configure the confirmation email the lead receives when a meeting of this type is booked — subject, title, greeting, CTA label, calendar note, extra sections, disclaimer, sender name, or send_to_lead:false to suppress it. Same keys as the dashboard’s email panel; unknown keys are rejected (400) because the renderer never reads them. Replaces the whole email_config (read it first to keep other fields); null clears it. Use preview_meeting_confirmation_email to see the result before/after saving.
preview_meeting_confirmation_email
workflows:read
Lectura
workflow_id, meeting_type_id
Sin campo de contrato
Render the lead confirmation email (subject + HTML) for a meeting type with sample data, using a draft email_config if given or the persisted one otherwise. Sends nothing. Use it to show the operator what the lead will receive before calling set_meeting_confirmation_email.
set_host_assigner
workflows:write
Escritura
workflow_id
Sin campo de contrato
Declare the workflow’s CRM seller assigner: an existing ACTIVE workflow tool whose response names the seller, so bookings go to that seller’s calendar and the lead’s owner mirrors the CRM. tool = the workflow_tools name; id_field = the response field carrying the seller id; external_key = the client_users.external_ids key that maps it to a Nexor user (e.g. hubspot_owner_id), or identity:true when the tool already returns a Nexor user_id. Validates keys and that the tool exists and is active (400 otherwise), writes config.host_assigner, then RUNS the test connection (real call to the client’s endpoint) and returns its report — the config is persisted even when the test fails (ok:false with the failing step) so you can iterate; test:false skips it. clear:true removes the assigner. Never write host_assigner through update_workflow_config.
test_host_assigner
workflows:write
Escritura
workflow_id
Sin campo de contrato
Dry-run the configured host assigner without touching any lead: calls the assigner tool for real, extracts the seller id (id_field), maps it to a Nexor team member and checks their calendar connection. Returns ok plus per-step checks, the fields the response actually carries (to pick id_field), and the resolved user. Pass tool/id_field/external_key/identity to test a variant before saving with set_host_assigner.
set_external_booking
workflows:write
Escritura
workflow_id, external_booking
Sin campo de contrato
Declare that the client’s OWN booker (their HTTP tools) owns the calendar for this workflow, so Nexor mirrors every booking into a meeting with reminders and confirmation emails. All three verbs are REQUIRED — tool (create), reschedule_tool and cancel_tool — because an omitted verb is silently never mirrored (phantom meetings); reschedule_tool must differ from tool. fields maps dot-paths in the RAW tool response (data.slots.0.start style, never brackets): starts_at is required, ends_at/meeting_url/external_id/title/timezone optional. Every referenced tool (incl. slots_tool/slots_tools) must exist and be active on the workflow (400 TOOL_NOT_FOUND otherwise). provider defaults to external_booker (auto-gates native booking tools); gohighlevel needs no fields. Replaces the whole section and reads it back; null clears. Never write external_booking through update_workflow_config.
Conexiones CRM (3)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
connect_crm
workflows:write
Escritura
provider
Sin campo de contrato
Start connecting the client’s CRM (hubspot, zoho, kommo, gohighlevel, odoo or salesforce). Returns connect_url + connection_request_id. IMPORTANT — give connect_url to the user DIRECTLY as a clickable link and tell them to open it: HubSpot/Zoho/Salesforce authorize on the vendor’s consent page; Kommo/GoHighLevel/Odoo paste their credentials into a Nexor-hosted form. The credentials are entered on that page only — never ask the user to paste a token in chat, and never claim you connected it for them. Then poll get_crm_connection_status with the connection_request_id until status=completed (last_error explains a rejected attempt; the same link stays valid until expires_at). Reconnecting an already-connected CRM issues a fresh link. For Odoo the same URL/database/user preserves configuration while rotating credentials; a different identity is rejected. Odoo output execution is not available.
get_crm_connection_status
workflows:read
Lectura
provider
Sin campo de contrato
Connection state of one CRM provider (account identity, sync status, errors; never tokens). setup_context describes supported configuration options and recorded scope grants: unknown permissions are NOT granted, and execution_readiness=not_checked is not proof an operation will succeed. Zoho supports output only; Kommo output moves the imported card. Ask which agent and which supported input or output the operator wants; do not activate flows or import existing leads merely because a CRM connected. Pass connection_request_id to verify THAT attempt: pending | completed | expired | failed. An existing connected account does not prove a new attempt succeeded. Kommo returns last_sync_at and last_error from its latest sync. Odoo returns connection_id, base_url, connected_at, last_sync_at, last_imported_at, last_error (a machine code), auth_blocked and api_key_expires_at. GoHighLevel returns one entry per location in locations[] with its connection_id. get_integration_status gives the cross-provider summary.
disconnect_crm
workflows:write
Escritura
provider
confirm: true
Disconnect the client’s CRM (stops its sync immediately; configuration is kept so a reconnect restores it). Destructive for the live sync: ask the user first and call with confirm=true only after they explicitly agree. Without confirm=true nothing changes and the response explains what would be disconnected. GoHighLevel only: pass connection_id (from get_crm_connection_status locations[].connection_id) to disconnect one location; without it EVERY location is disconnected, so say so before confirming.
Google Sheets (3)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_google_sheets_status
workflows:read
Lectura
Ninguno
Sin campo de contrato
List the account’s Google Sheets automations (one spreadsheet tab linked to one task) with mode import|write, active, task_running, column_map, imported_rows, and the service_account_email the customer shares sheets with. Pass workflow_id to filter one task. An automation only imports while it is active AND its task runs (task_running). Reading changes nothing.
inspect_google_sheet
workflows:read
Lectura
sheet_url
Sin campo de contrato
Check a Google Sheets URL before connecting it. accessible=false with reason=private means the customer must share the sheet with service_account_email as Editor: give them that address and share_instructions, wait for them to confirm, then inspect again. Without sheet_name it returns the tabs; with sheet_name it returns columns, sample_rows, data_row_count and suggested_column_map. Show the operator the suggested mapping and let them correct it; never save a mapping they did not see. automations lists what this spreadsheet already feeds. Read only.
change_google_sheet_automation
workflows:write
Escritura
action
confirm: true
Create, configure, activate, pause or remove ONE Google Sheets automation. create links sheet_url + sheet_name to workflow_id with mode (import default, or write) and column_map, and saves it PAUSED. import_existing_rows=false imports only rows added from now on. configure changes any of those fields on connection_id. activate first returns confirmation_required with pending_rows: tell the operator how many rows become leads and that a running task may contact them, then repeat with confirm=true. pause stops future imports and keeps the position. remove deletes the automation; imported leads stay. activate, pause and remove need operator agreement. Report success from the returned automation, and say when task_running=false means nothing imports yet.
Odoo (8)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_odoo_connection
workflows:read
Lectura
Ninguno
Sin campo de contrato
Inspect the saved Odoo connection and obtain its secure browser setup entry. Open connect_url when supplied; otherwise open panel_path under the active Nexor platform origin. Browser sign-in is required. Credentials are entered only in that form, never chat or tool arguments. This does not connect or activate anything. Read again after browser setup; stored connection state is not proof of successful synchronization.
get_odoo_outputs
workflows:read
Lectura
Ninguno
Sin campo de contrato
Inspect Odoo output settings, connection revision and actual execution availability. Requires an active account owner/admin/partner key. This is connection-wide, not task-scoped. Saved mappings do not prove synchronization. Credentials belong in the Odoo integration panel; never request or pass a key in chat. Read this before changing or previewing outputs.
set_odoo_outputs
workflows:write
Escritura
connection_id, expected_revision, outputs
Sin campo de contrato
Replace the complete Odoo outputs configuration for the connection while preserving Inputs. Read get_odoo_outputs first and preserve unrelated mappings. Send its exact connection_id and revision. Saves disabled only; existing linked records only. Explain the account-wide scope and obtain agreement before calling. A revision conflict requires a fresh read. Report the committed read-back, never claim Odoo was updated or activated.
preview_odoo_outputs
workflows:read
Lectura
connection_id, expected_revision
Sin campo de contrato
Read actual linked records and preview a candidate Odoo output configuration without writing to Odoo or starting outreach. Omit outputs to preview saved configuration. scan_complete=false means the bounded scan did not finish, never zero changes. Counts and fingerprints are evidence for this revision and expire; approval_eligible=false cannot authorize activation.
get_odoo_output_history
workflows:read
Lectura
Ninguno
Sin campo de contrato
Read persisted Odoo output runs and open conflicts. Queued, partial, uncertain and preview results are not successful synchronization. A verified receipt is required to claim a record was updated. History is connection-wide and requires an account administrator key.
Resume a paused Odoo connection only after explicit agreement. Read get_odoo_outputs first and send its connection_id, revision and status.pause_token unchanged, with confirm=true. Refuses an obsolete pause, unresolved dispatched writes or unavailable execution. Current release gates remain off. Never clear a pause or resend uncertain writes through another tool, and never claim activation from a blocked response.
pause_odoo_outputs
workflows:write
Escritura
connection_id, expected_revision, confirm
confirm: true
Pause new connection-wide Odoo writes after explicit agreement. Requires the connection and revision from get_odoo_outputs and confirm=true. Preserves mappings, revisions and audit history so already admitted changes can finish and reconcile. Report unsettled_count explicitly; a successful pause does not cancel a write already sent.
start_odoo_output_sync
workflows:write
Escritura
connection_id, expected_revision, confirm
confirm: true
Request Odoo output synchronization after explicit agreement. The current release gate blocks execution and returns odoo_outbound_apply_disabled. Never promise execution or bypass that response. Requires the exact connection and revision plus confirm=true; this is not inbound import or calendar setup.
HubSpot (11)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
get_hubspot_config
workflows:read
Lectura
Ninguno
Sin campo de contrato
Read the client’s whole HubSpot post-connect configuration in one call: connection (hub, auth mode, scopes, sync health), default_workflow_id, per-field outbound mappings (field_mappings), the INBOUND property → lead-metadata mapping (inbound_properties), the stage → lifecyclestage mapping (lifecycle_mapping), list routing rules (HubSpot list → workflow), deal_sync settings, sync_back, and owner_mappings (team members with the HubSpot owner id stored on them under external_key). Fails with not_connected until connect_crm(provider=hubspot) completes. Start here before any set_hubspot_* call so you never overwrite what the dashboard configured.
set_hubspot_field_mappings
workflows:write
Escritura
mappings
Sin campo de contrato
Write outbound field mappings (Nexor field → HubSpot contact property), one row per nexor_field; rows not listed are left untouched. hubspot_property=null removes that field’s mapping. Optional per row: nexor_field_type (text/number/date/boolean…), write_once (never overwrite a value already in HubSpot), value_mapping ({ nexor_value: hubspot_option }), is_active, hubspot_property_label, hubspot_property_type. Use get_hubspot_config first; the stage → lifecycle mapping is set_hubspot_lifecycle_mapping, not this. Returns applied rows and the full read-back.
set_hubspot_inbound_properties
workflows:write
Escritura
properties
Sin campo de contrato
Write the INBOUND mapping: HubSpot contact properties copied into lead.metadata by every intake door (list sync, imports, webhooks) — the lever for “bring X from HubSpot so the agent doesn’t re-ask it”. One row per hubspot_property; rows not listed are left untouched; metadata_key=null removes that property’s row. Property names are validated against the portal (404 property_not_found with suggestions) and read-only/calculated properties ARE valid here — form data lives in recent_conversion_event_name / recent_conversion_date / hs_analytics_first_url, and hs_object_id gives the contact id. Applies to leads created or updated from then on; it does not rewrite existing leads. This is NOT set_hubspot_field_mappings (that one is outbound, Nexor → HubSpot). Read get_hubspot_config.inbound_properties first.
set_hubspot_lifecycle_mapping
workflows:write
Escritura
value_mapping
Sin campo de contrato
Set how Nexor stages map onto a HubSpot contact property (default lifecyclestage): value_mapping = { nexor_status_key: hubspot_option_internal_value }, e.g. { qualified: ‘salesqualifiedlead’, booked: ‘opportunity’ }. Pass value_mapping=null to clear. Stage keys come from get_workflow; option values are the HubSpot property’s internal option values. Returns the stored row.
set_hubspot_list_routing
workflows:write
Escritura
rules
Sin campo de contrato
Replace the HubSpot list → workflow routing with the given rules (FULL replace: a list omitted here stops being routed; pass rules=[] to clear). Each rule: list_id (numeric HubSpot list id, or v3:<id>), workflow_id (the agent that receives contacts entering the list), optional name, recurring (keep pulling new members), pause_on_exit (pause the lead when it leaves the list), sync_interval_minutes (supported intervals only). Read the current rules with get_hubspot_config and send them back with your change — this is not a merge. Then run_hubspot_import(list_id) to pull the current members.
set_hubspot_deal_sync
workflows:write
Escritura
enabled
Sin campo de contrato
Configure deal sync (HubSpot deal stage changes → Nexor conversions/lost). enabled=true requires pipeline_id (a HubSpot DEAL pipeline id); active_stages are the stage ids that count as won (creates a conversion of conversion_type_id when the deal reaches them), lost_stages the ones that mark the lead lost. Optional workflow_id pins which agent’s leads are swept (default: the connection’s default workflow). Ids are validated against HubSpot (404 pipeline_not_found / stage_not_found with the available ones). Runtime keys (cursor, last_swept_at) are preserved. Returns the stored deal_sync.
map_hubspot_owners_to_hosts
workflows:write
Escritura
mappings
Sin campo de contrato
Map HubSpot owners (sales reps) to Nexor team members so a lead assigned to a rep routes to that host’s calendar and outbound sync writes the right hubspot_owner_id. Each mapping names the owner (owner_email or owner_id, matched against the portal’s owners) and the member (user_id from list_team, or user_email). Writes the owner id on the member (client_users.external_ids[external_key], the same field the dashboard member form edits, so both resolve the same host). Returns applied, unmatched (owner_not_found / user_not_found) and advisory warnings: no_calendar_connected, calendar_email_mismatch (the member’s connected calendar email differs from the owner’s) — warnings never block. Verify with get_hubspot_config.owner_mappings or list_team.
install_hubspot_agent_tools
workflows:write
Escritura
workflow_id, tools
Sin campo de contrato
Install platform HubSpot tools on an agent with their fixed parameters — the same rows the dashboard HubSpot agent-tools panel creates, so list_workflow_tools / list_hubspot_agent_tools show them. tools: create_contact (no params), create_communication (no params; optional summary_instructions), assign_owner (optional owner = HubSpot owner id for a fixed owner; omitted = the lead’s Nexor assignee), create_deal (REQUIRES pipeline + stage: deal pipeline/stage ids), update_deal (REQUIRES stage; only if the catalog carries it), sync_lead_stage (REQUIRES lead_pipeline + status_map), sync_deal_stage (REQUIRES pipeline + status_map). Ids are validated against HubSpot and status_map keys against the workflow’s stages (400 missing_fixed_parameter lists what is missing per tool; 404 pipeline_not_found / stage_not_found / lead_pipeline_not_found / owner_not_found return the available ids; 409 tool_unavailable = the connection lacks the scope). Idempotent: re-installing updates the fixed params. A booking agent that must log to HubSpot needs at least create_contact + create_communication.
list_hubspot_agent_tools
workflows:read
Lectura
workflow_id
Sin campo de contrato
List the platform HubSpot tools installed on a workflow with their fixed config read back in install vocabulary (create_deal → pipeline/stage; sync_*_stage → pipeline or lead_pipeline + status_map; assign_owner → owner_source; create_communication → summary_instructions), plus is_active, inherited, auto_run_on_entry, tool_available_for_agent and available_in_statuses. Also returns installable (the tool names) and fixed_parameters (required/optional per tool). Same rows list_workflow_tools shows, filtered to HubSpot.
run_hubspot_import
workflows:write
Escritura
Ninguno
confirm: true
Import HubSpot contacts into Nexor as leads. Exactly one selector: list_id (a routed or any HubSpot list; queued in the background, returns job_id), contact_ids (specific contact ids; runs inline and returns stats), or all=true (every contact in the portal; queued, 409 import_in_progress if one is running). Optional workflow_id pins the agent the new leads enter (default: the list’s routing rule, else the connection’s default workflow; null = no auto-assignment). This creates leads and may start outreach — it is an operational run: call with confirm:false (or omit it) to get a needs_confirmation preview that does nothing; only pass confirm:true after the operator explicitly approves. Track with get_hubspot_sync_status.
get_hubspot_sync_status
workflows:read
Lectura
Ninguno
Sin campo de contrato
Read HubSpot sync health: connection (sync_status, last_sync_at, last_sync_error, token_expired), inbound_enabled, import_all progress, per-list import stats for routed lists, deal_sync sweep state (last_swept_at, rate_limited_until), last_7_days counts per direction/status and recent_failures (event, error, contact). The poll target after run_hubspot_import and the first read when a client says HubSpot is not syncing.
Cloud Functions (19)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
describe_cloud_functions
workflows:read
Lectura
Ninguno
Sin campo de contrato
Explain Cloud Functions: supported triggers, runtime globals, buffered effects, environment variables, the draft → test → publish lifecycle, and test safety. Call before authoring code.
list_cloud_functions
workflows:read
Lectura
Ninguno
Sin campo de contrato
List Cloud Functions with trigger, active/deployment health summary, and last-run metadata.
get_cloud_function
workflows:read
Lectura
function_id
Sin campo de contrato
Get one Cloud Function, including its published code and pending draft (code_draft, draft_hash, has_draft).
create_cloud_function
workflows:write
Escritura
name, trigger_event, code
Sin campo de contrato
Create an event-driven Cloud Function, inactive unless is_active is passed. Read the triggering lead from ctx.lead/lead and use native effects instead of refetching it through the public leads API. Test it with test_cloud_function, then activate with update_cloud_function.
update_cloud_function
workflows:write
Escritura
function_id
Sin campo de contrato
Update a Cloud Function. A code change replaces the entire draft code string and returns draft_hash: production keeps the published code until test_cloud_function and a user-approved publish_cloud_function. Other fields save immediately; activation runs the published code, not the draft.
test_cloud_function
workflows:write
Escritura
function_id
Sin campo de contrato
Test the draft (or the published code when there is no draft) without real effects. Pass an event-shaped ctx. HTTP reads go out for real; other methods get a synthetic 200 and are listed in outbound.would_send; Nexor effects are preview-only. Show the user what would be sent and the previewed effects before asking to publish.
publish_cloud_function
workflows:write
Escritura
function_id, expected_draft_hash, confirm
confirm: true
Publish the pending draft of a Cloud Function so production runs it and record a version. Requires confirm:true after the user explicitly approves the tested draft, and expected_draft_hash (the draft_hash from update_cloud_function or get_cloud_function). CONFLICT draft_changed_since_preview: re-read, re-test and ask again. Does not activate an inactive function.
discard_cloud_function_draft
workflows:write
Escritura
function_id
Sin campo de contrato
Discard the pending code draft of a Cloud Function. The published code keeps running. Idempotent. Ask the user first: unpublished edits are lost.
list_cloud_function_versions
workflows:read
Lectura
function_id
Sin campo de contrato
List the published versions of a Cloud Function, newest first, without code. is_published marks the version production runs.
get_cloud_function_version
workflows:read
Lectura
function_id, version_number
Sin campo de contrato
Get one published version of a Cloud Function, including its code.
restore_cloud_function_version
workflows:write
Escritura
function_id, version_number
Sin campo de contrato
Copy a published version of a Cloud Function into the draft. Production is unchanged until the draft is tested and published. A CONFLICT with draft_already_open means unpublished edits exist: pass replace_draft:true only after the user agrees to lose them.
delete_cloud_function
workflows:write
Escritura
function_id
Aprobación del operador en instrucciones
Permanently delete a Cloud Function, its run history, and its deployed Worker. Destructive: confirm with the operator first.
run_cloud_function
workflows:write
Escritura
function_id
Sin campo de contrato
Alias of test_cloud_function kept for existing callers: tests the draft without real effects. Prefer test_cloud_function.
list_cloud_function_runs
workflows:read
Lectura
Ninguno
Sin campo de contrato
List compact Cloud Function run summaries; filter by function, lead, trigger source, or status.
get_cloud_function_run
workflows:read
Lectura
run_id
Sin campo de contrato
Get full Cloud Function trace detail: ctx, logs, result/error, network requests, proposed/applied effects, and lead snapshots.
clear_cloud_function_runs
workflows:write
Escritura
Ninguno
Aprobación del operador en instrucciones
Permanently clear Cloud Function run history, optionally for one function. Destructive: confirm with the operator first.
list_function_environment_variables
workflows:read
Lectura
Ninguno
Sin campo de contrato
List names and timestamps of client-wide, write-only environment variables shared by Cloud and Scheduled Functions. Values are never returned.
set_function_environment_variable
workflows:write
Escritura
key, value
Sin campo de contrato
Create or replace a shared secret. Key must match ^[A-Z][A-Z0-9_]{0,63}$. The value is encrypted, never echoed, and triggers redeployment of active Cloud/Scheduled Functions.
delete_function_environment_variable
workflows:write
Escritura
key
Aprobación del operador en instrucciones
Delete a shared environment variable and redeploy active functions without it. Destructive and may break code that reads env.KEY; confirm first.
Scheduled Functions (18)
Tool
Scope
Tipo
Argumento obligatorio de primer nivel
Resguardo o disponibilidad
Propósito canónico (EN)
describe_scheduled_functions
workflows:read
Lectura
Ninguno
Sin campo de contrato
Explain Scheduled Functions, cohort lookup syntax, runtime/effects, scheduling, the draft → test → publish lifecycle, and the real-effect manual run.
list_scheduled_functions
workflows:read
Lectura
Ninguno
Sin campo de contrato
List Scheduled Functions with cron, timezone, next/last run, active state, and cohort cap.
get_scheduled_function
workflows:read
Lectura
function_id
Sin campo de contrato
Get one Scheduled Function including its published code, pending draft (code_draft, draft_hash, has_draft) and lookup configuration.
create_scheduled_function
workflows:write
Escritura
name, cron_expression, timezone, code
Sin campo de contrato
Create a cron function, inactive unless is_active is passed. Put lead filtering/order/limit in lookup_config, preview the schedule and cohort, then make code consume ctx.leads; never refetch that cohort through the public leads API. Test it with test_scheduled_function before activating.
update_scheduled_function
workflows:write
Escritura
function_id
Sin campo de contrato
Update schedule, cohort, code, metadata, or active state. A code change is saved as a draft and returns draft_hash: production keeps the published code until test_scheduled_function and a user-approved publish_scheduled_function. Other fields save immediately; cron/timezone changes recompute next_run_at; activation runs the published code, not the draft.
test_scheduled_function
workflows:write
Escritura
function_id
Sin campo de contrato
Test the draft (or the published code when there is no draft) without real effects. Without ctx it resolves the saved cohort read-only. HTTP reads go out for real; other methods get a synthetic 200 and are listed in outbound.would_send; Nexor effects are preview-only. Show the user what would be sent and the previewed effects before asking to publish.
publish_scheduled_function
workflows:write
Escritura
function_id, expected_draft_hash, confirm
confirm: true
Publish the pending draft of a Scheduled Function so production runs it and record a version. Requires confirm:true after the user explicitly approves the tested draft, and expected_draft_hash (the draft_hash from update_scheduled_function or get_scheduled_function). CONFLICT draft_changed_since_preview: re-read, re-test and ask again. Does not activate an inactive function.
discard_scheduled_function_draft
workflows:write
Escritura
function_id
Sin campo de contrato
Discard the pending code draft of a Scheduled Function. The published code keeps running. Idempotent. Ask the user first: unpublished edits are lost.
list_scheduled_function_versions
workflows:read
Lectura
function_id
Sin campo de contrato
List the published versions of a Scheduled Function, newest first, without code. is_published marks the version production runs.
get_scheduled_function_version
workflows:read
Lectura
function_id, version_number
Sin campo de contrato
Get one published version of a Scheduled Function, including its code.
restore_scheduled_function_version
workflows:write
Escritura
function_id, version_number
Sin campo de contrato
Copy a published version of a Scheduled Function into the draft. Production is unchanged until the draft is tested and published. A CONFLICT with draft_already_open means unpublished edits exist: pass replace_draft:true only after the user agrees to lose them.
delete_scheduled_function
workflows:write
Escritura
function_id
Aprobación del operador en instrucciones
Permanently delete a Scheduled Function, run history, and Worker. Destructive: confirm first.
preview_scheduled_function_schedule
workflows:read
Lectura
cron_expression, timezone
Sin campo de contrato
Validate a five-field cron in an IANA timezone and return its next 1-10 UTC occurrences.
preview_scheduled_function_cohort
workflows:read
Lectura
lookup_config
Sin campo de contrato
Resolve a lookup_config without running code. Returns matching count and bounded sample so you can verify who would enter ctx.leads.
run_scheduled_function
workflows:write
Escritura
function_id, confirm
confirm: true
Run the PUBLISHED version of a Scheduled Function immediately. WARNING: unlike test_scheduled_function, this applies buffered effects to real tenant data and sends real HTTP writes. Use test_scheduled_function to try a draft. Only call after the operator explicitly confirms the cohort from preview_scheduled_function_cohort; pass confirm:true. The result omits run.ctx (the resolved cohort echoed back); read it with get_scheduled_function_run, or pass include_ctx:true.
list_scheduled_function_runs
workflows:read
Lectura
Ninguno
Sin campo de contrato
List Scheduled Function execution summaries by function/status with pagination.
get_scheduled_function_run
workflows:read
Lectura
run_id
Sin campo de contrato
Get a full Scheduled Function trace: resolved cohort context, logs, network, result/error, and applied/failed effects.
clear_scheduled_function_runs
workflows:write
Escritura
Ninguno
Aprobación del operador en instrucciones
Permanently clear Scheduled Function run history, optionally for one function. Destructive: confirm first.
Generado desde getnexor-ai/nexor-public-mcp en 2ae64b97252d1263472c223bf055d4ee907dbbc6, usando docs/tool-manifest.json (SHA-256 2e64adc926eac7adca75463e0de2aa9b173c821167abfd27148540e26c7be19c).Después de hacer checkout local de ese commit exacto:
npm run mcp:snapshot -- /absolute/path/to/nexor-public-mcpnpm run mcp:check -- /absolute/path/to/nexor-public-mcp
Última modificación el 23 de octubre de 2026
⌘I
{"docsConfig":{"theme":"almond","$schema":"https://mintlify.com/docs.json","name":"Nexor","colors":{"primary":"#0A0A0A","light":"#FAFAFA","dark":"#0A0A0A"},"logo":{"light":"https://mintcdn.com/nexor/f1Gy8zY6i2a68PTn/images/logo-black.svg?fit=max\u0026auto=format\u0026n=f1Gy8zY6i2a68PTn\u0026q=85\u0026s=2a5ea3c97db1c6499f5f24571b593e6f","dark":"https://mintcdn.com/nexor/f1Gy8zY6i2a68PTn/images/logo-white.svg?fit=max\u0026auto=format\u0026n=f1Gy8zY6i2a68PTn\u0026q=85\u0026s=65697db82c09cf7f5a5e76a512981d1e","href":"https://docs.getnexor.ai"},"favicon":{"light":"https://mintcdn.com/nexor/f1Gy8zY6i2a68PTn/images/icon.png?fit=max\u0026auto=format\u0026n=f1Gy8zY6i2a68PTn\u0026q=85\u0026s=321e364fa619df901dc06c5ef29d4125","dark":"https://mintcdn.com/nexor/f1Gy8zY6i2a68PTn/images/icon.png?fit=max\u0026auto=format\u0026n=f1Gy8zY6i2a68PTn\u0026q=85\u0026s=321e364fa619df901dc06c5ef29d4125"},"api":{"openapi":"openapi.json","playground":{"display":"interactive"},"examples":{"prefill":true}},"navbar":{"links":[{"href":"https://app.getnexor.ai","label":"Ir a Nexor →"}]},"fonts":{"family":"Inter"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","latex":true},"contextual":{"options":["copy","assistant"],"display":"header"},"thumbnails":{"fonts":{"family":"Inter"}},"interaction":{"drilldown":true},"metadata":{"timestamp":true},"markdown":{"schema":false},"navigation":{"languages":[{"language":"en","href":"docs/en/guides/getting-started"},{"language":"es","href":"docs/es/guides/getting-started"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nexor","hasAudioNarration":false,"actualSubdomain":"nexor","customDomains":["docs.getnexor.ai"],"gitSource":{"type":"github","owner":"getnexor-ai","repo":"nexor-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"10851a48-ee19-4ec9-abe0-ab50f1e62a1a","liveDeploymentHistoryId":"6adc222c701d8c52726e2015","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adc222c701d8c52726e2015"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adc222c701d8c52726e2015","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"en","tag":"API reference","count":152},{"language":"es","tag":"Referencia API","count":152},{"language":"en","tag":"Leads","count":27},{"language":"es","tag":"Leads","count":27},{"language":"en","tag":"CRM Chat","count":25},{"language":"es","tag":"CRM por chat","count":25},{"language":"en","tag":"Cloud Functions","count":19},{"language":"en","tag":"Agents","count":19},{"language":"es","tag":"Cloud Functions","count":19},{"language":"es","tag":"Agentes","count":19},{"language":"en","tag":"Scheduled Functions","count":18},{"language":"es","tag":"Funciones programadas","count":18},{"language":"en","tag":"Meetings","count":14},{"language":"es","tag":"Reuniones","count":14},{"language":"en","tag":"Support reference","count":11},{"language":"en","tag":"Integrations","count":11},{"language":"es","tag":"Referencia de soporte","count":11},{"language":"es","tag":"Integraciones","count":11},{"language":"en","tag":"Inbound router","count":10},{"language":"es","tag":"Enrutador de entrada","count":10}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"docs/es/api/mcp-server/tools","slug":"/docs/es/api/mcp-server/tools","pageMetadata":{"title":"Catálogo de tools MCP","sidebarTitle":"Catálogo de tools","description":"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.","href":"/docs/es/api/mcp-server/tools"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Accordion,CodeBlock,Heading,Info,Table,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Este catálogo contiene las 409 tools no administrativas que el servidor muestra a sesiones MCP de cliente en la revisión fijada. El servidor lista 429 tools en total; aquí se excluyen intencionalmente 20 tools de administración interna.`}),`\n`,_jsxs(Info,{children:[`Cada propósito canónico se copia sin cambios desde el manifest que publica el servidor. Ese campo técnico permanece en inglés para que se pueda comparar de forma literal con `,_jsx(_components.code,{children:`tools/list`}),`. Los nombres, scopes, argumentos obligatorios de primer nivel, tipos de operación y resguardos contractuales salen del mismo snapshot.`]}),`\n`,_jsxs(Warning,{children:[`La respuesta `,_jsx(_components.code,{children:`tools/list`}),` del cliente conectado es la fuente de verdad para el servidor que alcanza e incluye el JSON Schema completo. Si su conteo difiere de este snapshot fijado, revisa la revisión del servidor antes de automatizar escrituras.`]}),`\n`,_jsxs(Warning,{children:[`El catálogo todavía incluye `,_jsx(_components.code,{children:`create_client_tool`}),`, `,_jsx(_components.code,{children:`update_client_tool`}),`, `,_jsx(_components.code,{children:`assign_tool_to_workflow`}),`, `,_jsx(_components.code,{children:`configure_customer_api_tool`}),`, `,_jsx(_components.code,{children:`create_workflow_tool`}),` y `,_jsx(_components.code,{children:`update_workflow_tool`}),` porque esas tools existen en `,_jsx(_components.code,{children:`tools/list`}),`. Por ahora, crear, editar o asignar un destino HTTP personalizado no es una operación pública soportada mientras Nexor refuerza la validación de destinos. No uses estas tools para configurar un destino hasta que se retire este aviso.`]}),`\n`,_jsx(Heading,{level:`2`,id:`cómo-leer-el-catálogo`,children:`Cómo leer el catálogo`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Lectura`}),` significa que el manifest no declara un scope de escritura. `,_jsx(_components.code,{children:`Escritura`}),` indica que la llamada puede cambiar estado. El resguardo nombra solo lo que expone el contrato de la tool. `,_jsx(_components.code,{children:`Sin campo de contrato`}),` no autoriza a omitir la aprobación del operador para una acción con consecuencias.`]}),`\n`,_jsx(Accordion,{title:`Voz de la tarea (2)`,id:`voz-de-la-tarea-2`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`prepare_agent_task_voice`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`master_workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Prepare the selected paused agent’s composed tasks for voice, including template and authored tasks. Queues destination-first flow generation and verifies same-call swaps. Idempotent retries preserve completed work. Does not activate tasks, assign channels/numbers, call leads or book meetings. Preparing is not ready: use get_agent_task_voice_preparation to inspect the result. Calendar/channel setup remains separate.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_task_voice_preparation`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`master_workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Inspect preparation of a paused agent’s composed voice tasks. Top-level status is not_started (nothing queued: call prepare_agent_task_voice), preparing (running: wait), pending (not ready after the last run: call prepare again), failed, republish_required (the prepared voice of the open draft still includes a tool now handled by an automation; preparing again does not fix it, republish the agent) or ready; per-task statuses are informational, from saved flow state and background-job evidence, plus pending workflow and error code. Ready means voice artifacts are prepared, not activated, calendar/channel ready or audio-tested. Inspect after creation or retry; never invent success from a queued job.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Flujos de integración del agente (13)`,id:`flujos-de-integracion-del-agente-13`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_hubspot_inbound_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read contact properties, including calculated/read-only values, for shared HubSpot intake data. These values go into the shared contact, not private agent fields. Use get_agent_integration_flows to inspect current settings, draft, affected agents and revision. Reading does not import or activate anything.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_hubspot_inbound`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Prepare/apply HubSpot intake mappings and optional metadata-to-Variable bindings for one task (scope=task). Legacy shared mode must be explicitly reviewed. Read flows and inbound options first. configure saves the complete patch as a draft without changing current imports: phone_priority (ordered property names) and extra_properties (hubspot_property, metadata_key). apply requires confirm=true after explaining the exact draft, the actual affected tasks from the read-back, including changed phone selection; it affects future imports/updates only and does not start intake, replay history or delete stored data. discard removes only the draft. Requires permission over every affected agent; revision, account or legacy-edit conflicts require fresh review. Read committed state before reporting success.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_kommo_pipelines`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read verified Kommo pipelines and stages for the selected agent before changing an existing route. Returns account identity and available destination stages. Reading never imports or moves cards.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_kommo_route`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Create, configure, pause, activate or remove ONE Kommo route for ONE agent. Read get_agent_integration_flows and list_agent_kommo_pipelines first. create saves a new pipeline/source/destination route paused. configure changes pipeline_id, source_status_id, destination_status_id and optionally ingest_unsorted (primary route only, with expected_ingest_unsorted), pausing changes; it moves the same imported card, not arbitrary CRM records. activate can import existing and new cards from the source stage and start lead contact; explain this before confirm=true. pause stops future intake but does not undo imports or disconnect the account. remove deletes this route and disables unsorted acceptance if it was the primary route; it preserves imported contacts. Activation, pause and removal need operator agreement. Preserve other agents; reread after conflicts; report success from committed read-back. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_hubspot_lists`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the current HubSpot contact-list catalog for an agent mode. Returns verified list IDs, names, connection identity and whether a list is already configured. Choose an unassigned list for change_agent_hubspot_list(action=create); do not invent IDs or duplicate an existing legacy route. Reading this catalog does not import contacts.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_hubspot_field_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read exact source identities for this agent’s fields, canonical lead data and derived activity (status, summary, collected data, last sent message, worked marker), plus writable contact properties and enum options from its HubSpot account. Also reports verified, unknown or denied contact-write permission. Derived activity is limited to the triggering run. Use source IDs as returned; never match an agent field by name alone. Reading does not change contacts.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_hubspot_fields`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure, activate or pause ONE agent’s HubSpot contact-field output. Read get_agent_integration_flows and list_agent_hubspot_field_options first. configure replaces only this agent’s output mapping, overriding the shared mapping for its leads, and keeps its state: a sending output keeps sending only if activation checks pass, else nothing is saved; a paused one stays paused. Get agreement before changing a sending output. Each mapping: verified source ID (lead and agent fields differ), hubspot_property, optional enum value_mapping, write_once. Activation requires verified write permission and rejects another agent writing the same property; never disable another agent to bypass it. activate/pause require agreement and confirm=true. Activation affects only future changes on linked contacts; no replay or contact creation. Report success only from committed read-back; reread revision conflicts. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_hubspot_status_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read this agent mode’s status keys and the account’s actual writable hs_lead_status enum options before configuring its status output. No CRM writes or imports.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_hubspot_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure, activate or pause the hs_lead_status output of ONE agent mode. Read get_agent_integration_flows and list_agent_hubspot_status_options first. configure writes patch.mapping (agent status key to actual HubSpot enum value) and leaves this output paused. Inherited mapping becomes agent-specific. activate/pause require confirm=true after agreement; activation handles future status changes on linked contacts, never creates contacts or enables account activities/field sync. Other agents and shared settings are preserved. Expected revision prevents stale edits. Use the committed read-back to report success. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_hubspot_import_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`route_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the latest manual import queue job for the exact list and assigned agent. Returns state and aggregate counts only. Completed jobs can still contain record errors; not_found is not proof of success. Automatic membership reconciliation is not presented as a manual import.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`import_agent_hubspot_list`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`route_key`}),`, `,_jsx(_components.code,{children:`expected_revision`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Explicitly import existing members of ONE saved, enabled HubSpot list into its assigned agent. Explain that the agent may contact these leads, then require confirm=true. Use exact connection_id, route_key, workflow_id and revision from get_agent_integration_flows. Does not activate recurring intake. Returns queued/job_id, not proof of completion. The existing importer preserves identity and deduplication; an in-progress response must not be retried blindly. A paused entry must first be enabled (it can have recurring=false for manual-only imports). crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_integration_flows`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Inspect saved intake routes, data mappings and outputs for one agent mode or agent group. Requires workflow_id or agent_group_id; both constrain the scope. Returns exact flow identities, configuration revisions, shared/inherited scope, available operations and affected agents. Configuration is not evidence of a successful execution. Read before changing a flow; never treat an observed lead source or a tool name as proof of a native CRM connection. workflows[] reports each task’s active and paused: a route or output activates only while its task is active and not paused, so run set_workflow_active first. GHL opportunity_outcome flows carry outcome_mode: mapped (status map saved), no_action (this task’s own empty map: it never touches GHL) or category_default (inherited empty map: terminal statuses write Won/Lost by status category). Read outcome_mode before calling an outcome with state=not_configured broken.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_hubspot_list`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`route_key`}),`, `,_jsx(_components.code,{children:`action`}),`, `,_jsx(_components.code,{children:`expected_revision`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Change ONE HubSpot list intake for ONE agent mode, preserving all other routes. Use the connection_id, route_key and revision from get_agent_integration_flows. create requires a v3: list identity and expected_revision=null; it saves paused. configure accepts only name, recurring, pause_on_exit and sync_interval_minutes; behavior changes save paused, name-only changes preserve state. activate observes existing members without importing them, then receives future entries after the first complete scan. Existing-member import is separate and may contact leads. pause/remove affect only this route, never OAuth or existing leads. activate/pause/remove require confirm=true after explaining the exact effect and receiving operator agreement. Returns committed read-back; conflicts require rereading, not retrying blindly. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Configuración CRM del agente (21)`,id:`configuracion-crm-del-agente-21`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_variable_bindings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read task/group Variables, exact field IDs, metadata source paths and intake value conversions. Use before changing bindings; no imports or CRM writes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_agent_variable_bindings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`bindings`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Bind existing Variables to incoming lead metadata for one task or group. Read get_agent_variable_bindings first. Each binding includes its task, field ID and expected current source. metadata_key=null unlinks without deleting stored lead data. Optional intake_value_map replaces value conversions (null clears) and requires expected_intake_value_map. All rows commit atomically; other tasks remain unchanged. Affects future intake, not historical backfill. Read back before reporting success.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_ghl_pipelines`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read verified GHL pipelines and stages for this task and exact connection/location. Use before mapping outcomes or automatic import filters.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_ghl_intake_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read unassigned GHL pipeline/workflow/default intake sources and the creation revision for this task and connection. Never invent a source ID or take another task’s default.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_ghl_flow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`route_key`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure one GHL task flow. Read get_agent_integration_flows and catalogs first. create claims an available source paused; pause/activate/remove use its exact route_key. remove (confirm=true) deletes one pipeline:/ghl_workflow:/legacy route this task owns, even shadowed or disconnected, never default; imported leads stay. On crm_recurring_import_active, first configure the returned recurring:\u003cpipeline ID> with enabled=false and current stage_ids/cutover_at. configure on outcome:\u003ctask UUID> replaces only that task’s terminal-stage bucket (own empty = no_action). configure on recurring:\u003cpipeline ID> sets automatic-import enabled, stage_ids and cutover_at (ISO or null). Enabling auto-sync requires confirm=true and an active intake. Preserve sibling pipelines. Saves configuration, not an import or proof of execution. Reread after conflicts. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_zoho_intake`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read task-scoped Zoho organization intake configuration, exact Accounts/Deals/Contacts fields, revision and latest import activity. Output alone does not import leads. Read contact_sources capabilities. Choose the unique Deal contact, the organization, or explicit contact-to-organization fallback when supported. Reads do not import or write CRM records.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_zoho_intake`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure, pause or activate automatic organization intake for one task. Read get_agent_zoho_intake first. Uses that task’s Accounts output matching, Variables and allowed Deals.Stage values. Configure saves paused. Activate requires confirm=true and may import existing/future organizations and start outreach. Runs every five minutes, admits each organization once, skips existing contacts rather than transferring them, requires one related Deal. Choose contact_source explicitly. deal_contact_then_organization requires capability support and fallback_fields mapped from Accounts; primary fields use Contacts. Fall back only for absent/unlinked contact or missing/invalid phone; foreign contact or API errors block. Never switch after unanswered outreach. Read back saved configuration and activity; no execution evidence is not success. Does not write Zoho. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_zoho_fields`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read Zoho fields, exact options and task Variables with types. Supports Leads (default), Accounts, Deals and Contacts. Leads capabilities.reserved_mapping_destinations must be excluded from mappings; automatic_identity_destinations come from native lead identity. Mobile is separate. Accounts returns account_stage_modules, account_deal_selection, account_field_types, account_multiselect_mode, capabilities.account_stage_field_types and max_text_stage_length. For stage.module=Deals read the Deals catalog and use Stage of the unique related deal; account fields still map to Accounts. Text stage fields have no options; use operator-supplied values only when text is advertised. Never invent field names or values.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_zoho_flow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure Zoho output for one task or group. Read get_agent_integration_flows and list_agent_zoho_fields first. Keep the exact connection, task/group and output revision. fields requires BOTH field_map and agent_fields and replaces that whole section; copy retained attribution mappings. Never send target_module with fields/stages or configure section=all. Leads identity automatically uses First_Name, Last_Name, Email and Phone; Mobile is separate. Exclude reserved catalog destinations. accounts selects Accounts or Leads and saves paused. Accounts never creates organizations. Booked stage requires a saved meeting. Configure-only requests need no lead or preview. Preview Accounts before separately authorized activation; activate/pause requires confirm=true. Read back Nexor settings; saving does not update Zoho records or start intake. On invalid input fix the same scoped command; never retry through account defaults.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_zoho_preview_leads`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List recent leads and exact run IDs for an Accounts preview on one task. Requires workflows:read and leads:read. Does not write to Nexor or Zoho.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`preview_agent_zoho_accounts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`workflow_run_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Preview saved native Accounts settings for an exact task, lead and run, even while output is paused. Requires workflows:read and leads:read. Reads Zoho and returns proposed fields, stage eligibility, saved booking evidence and last verified update; never writes externally or internally. A preview is not a successful execution. Fix missing identifiers, duplicates, permissions or invalid values before activation.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_salesforce_setup`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read Salesforce for one task: connection (object Lead/Contact/Opportunity, object_confirmed, stage_field, opt_out_fields, field_map, health), this task intake (null when none), every task intake (to avoid overlaps), active campaigns, stages with closed/won/converted flags and, for Opportunity, pipelines (record types) with their own stages. connected=false: connect first with connect_crm(provider=salesforce). Reads Salesforce, writes nothing.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_salesforce_fields`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read fields of the connected Salesforce object (name, label, type, updateable, picklist, reference) before setting field_map, opt_out_fields or stage_field. Never invent field names.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`preview_agent_salesforce_intake`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`patch`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Count the Salesforce records an intake would match right now (mode campaign or stage; new always counts 0). Use before asking whether existing records should also be contacted. Writes nothing.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_salesforce_connection`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`patch`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Change account-wide Salesforce settings shared by every task: object (Lead, Contact or Opportunity), object_confirmed, stage_field (picklist), opt_out_fields (checkboxes that mark the lead do-not-contact, and that Nexor checks on opt-out) and field_map (Salesforce field path to first_name, last_name, email, phone or company). Read get_agent_salesforce_setup and list_agent_salesforce_fields first. Changing object disables every task intake: the first call returns salesforce_object_change_requires_confirm with affected_workflow_ids; tell the operator and retry with confirm=true only after they agree.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_salesforce_intake`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure which Salesforce records this task contacts and how its statuses flow back. Read get_agent_salesforce_setup first and get_workflow_status for status keys. mode: campaign (campaign_id), stage (stages, exact values; pipeline_id for Opportunity record types; dwell_minutes = minimum minutes in stage) or new (every new record). configure saves without changing on/off (new intakes start paused). activate turns it on and can start outreach; pause stops it; remove deletes it (imported leads stay). Those three require confirm=true. backfill=true (activate only) also contacts records already matching; default contacts only records that match after saving. Write-back: update_stage_enabled + status_map (Nexor status key to Salesforce stage). inbound_stage_map: Salesforce stage to Nexor status key. stop_on_closed: closed-not-won marks the lead lost. convert_status_key (Lead only): converts the Lead at that status. Two tasks cannot claim the same campaign, stage or new records (salesforce_intake_overlap).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_hubspot_history`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`action`}),`, `,_jsx(_components.code,{children:`patch`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure HubSpot activity history for exactly one task: enabled, notes, calls, meetings and WhatsApp attempts. Read its activity flow/revision first. Saving enabled=true requires confirm=true; other tasks and contact-field mappings are preserved. This affects future activity, not historical replay.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_hubspot_intake`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Operate this task’s HubSpot portal intake: activate/pause its owned default route, or explicitly import_all/import_selected contacts. Read flows first. Never steal another task’s portal route. Imports and activation can start lead contact and require confirm=true; pause also requires agreement. contact_ids is required for import_selected. A queued job is not completion; inspect get_hubspot_sync_status. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_hubspot_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`agent_group_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`revisions`}),`, `,_jsx(_components.code,{children:`kind`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Change HubSpot inbound data or activity history for an entire agent group atomically. Read group flows and get_agent_variable_bindings; send each member’s exact revision. kind=inbound supports configure draft/apply/discard with phone_priority, extra_properties and optional variable_bindings. kind=history supports configure with history toggles. Apply or enabling history requires confirm=true. Affects only group members; no historical backfill. Reread committed group state.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_custom_intake`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Create/configure/pause/activate/remove a custom INBOUND lead webhook for exactly one task. This is not an outbound event webhook. Read flows first; edits require the exact connection_id and revision. create saves paused; configure accepts name, field_mapping (payload path to canonical lead field or metadata key) and deduplicate. Activation requires confirm=true and may start outreach. Removal requires confirm=true, invalidates the receiving URL and preserves imported leads. Does not execute an HTTP request. Read back and retrieve the endpoint only when needed. crm_agent_inactive (next_action=activate_task): with agreement, set_workflow_active on its workflow_id, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_custom_intake_endpoint`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Retrieve the receiving URL for one task-owned custom intake after configuration. This URL contains its access token: share only with the authorized operator for configuring the sender; never put it in agent prompts or logs. Reading does not activate intake.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Cuentas CRM (15)`,id:`cuentas-crm-15`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_crm_intake_details`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read the receiving URL of a custom entry or Kommo integration. The URL contains an access token: share only with the authorized operator for sender setup; never place it in prompts or logs. Custom entries also return recent payload paths and types for mapping, without payload values.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`rotate_kommo_webhook_token`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Replace the Kommo webhook receiving token after explicit consent. The previous URL stops accepting events once committed. The new URL contains a secret. Preserves routes and imported records; does not run an import. Review the returned configuration and configure external senders with the new URL.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_crm_import_job`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`job_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read the exact queued import job for GHL, Kommo or Odoo. Reports queue state and safe aggregate counters. not_found does not prove completion; completed can still include skipped records or errors. Rejects jobs belonging to another connection or tenant.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_hubspot_sync_preview`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`operation`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Inspect the saved scope before manually re-running HubSpot deal synchronization or one contact sync. contact requires a Nexor lead_id with one unambiguous active run and returns the current status to review. Neither operation executes during preview. Read both revision and sync_revision; the latter is required as expected_sync_revision.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_hubspot_sync`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`expected_sync_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`operation`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Execute the previously reviewed HubSpot sync. deals applies saved deal transitions to Nexor and can trigger their effects. contact syncs saved status, unsynced call/note/meeting history and enabled fields for the selected lead, possibly across its history; it is not task-local. Requires fresh get_hubspot_sync_preview, consent and both revisions. Reports skips/partial errors honestly; never retry an ambiguous failure automatically.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_odoo_sync_conflicts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read Odoo conflicts, allowed resolutions and candidate fingerprints. Follow next_cursor while has_more. Missing provider visibility is not a business choice and cannot be ignored. Reading never resolves a conflict or runs a sync.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`resolve_odoo_sync_conflict`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`conflict_id`}),`, `,_jsx(_components.code,{children:`action`}),`, `,_jsx(_components.code,{children:`candidate_fingerprint`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Resolve one persisted Odoo conflict with its current candidate_fingerprint. select_opportunity requires an exact opportunity_id offered by that conflict; ignore only when allowed_actions permits it. This records a decision, not an executed sync. A changed candidate, already different decision or unavailable binding rejects the operation.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_odoo_account_outputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`action`}),`, `,_jsx(_components.code,{children:`outputs`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Prepare Odoo output mappings or request a read-only output preview. configure saves only disabled output configuration; enabling execution is blocked by the backend. preview uses the read-only scanner and may be incomplete; the outbound apply engine remains unavailable. Always report scan_complete and approval_eligible; zero operations from an incomplete scan is not proof that no work exists. Does not write to Odoo, advance a cursor, create activities or quotations, or enable an engine. Keeps incoming configuration intact.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_crm_account_connections`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`scope`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. List exact connection IDs for supported CRMs and custom inbound entries, including unassigned entries, before inspecting account configuration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_odoo_account_inputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`action`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Preview, configure or pause shared Odoo intake. preview reads records and stores its fingerprint without importing; configure requires that same fresh successful preview and consent; pause needs no provider read. Always preserves task field overrides and output configuration. Legacy connections accept only enabled, cutover_at and routes with team_id/stage_id/workflow_id. For current connections, fields, lifecycle, limits and account ignore/observe rules are supported. An unavailable engine remains blocked. Saving is not an executed import.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_crm_account_configuration`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Read account controls/defaults or saved import scope and the complete set of tasks that must be reviewed before a shared change. No credentials, writes or imports.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_zoho_account_defaults`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`patch`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Replace Zoho defaults for metadata fields, collected Variables and statuses; preserve every per-task override. outbound_enabled controls account output. Resolve exact Zoho fields/options with list_agent_zoho_fields; agent_fields uses collected Variable keys, field_map uses metadata keys. Changes apply to future sync, without historical replay.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_hubspot_account_controls`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`patch`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Change HubSpot account inbound webhook switch/default task or default activity output switches. Preserve list routes, task overrides and unrelated settings. Enabling intake can allow future incoming contacts to be managed/contacted. This does not import historical contacts or replay activities. Use task-scoped tools for task changes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reassign_crm_intake`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`target_workflow_id`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Move a custom inbound entry, Kommo route or GoHighLevel route to another existing task. The route is saved paused (saved_paused=true); existing leads do not move. custom uses connection_id only. Kommo: route_key is the route UUID. GoHighLevel: connection_id is the location connection and route_key is an existing route key from get_agent_integration_flows (pipeline:\u003cid>, ghl_workflow:\u003cid>) or default for the catch-all task. Activate separately after reviewing the new task configuration; that task must be active and not paused.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_crm_account_import`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`scope`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`affected_workflow_ids`}),`, `,_jsx(_components.code,{children:`mode`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Account-wide operation, including tasks that inherit defaults and future tasks, even when called from an agent chat. First inspect get_crm_account_configuration and explain all affected_workflows. Writes require their exact IDs, the revision, and explicit confirm=true. Locked tasks or changed configuration reject the whole action. Never drop an affected task to bypass authorization. Queue a saved GHL dry_run/backfill Kommo run_now or Odoo inbound with the reviewed configuration pinned. GHL dry_run reads only; backfill imports historical contacts without assigning tasks or starting outreach. Kommo run_now scans all enabled routes, may import existing/new cards, move them, and trigger outreach. Odoo inbound uses its existing runtime gates, may enroll/contact leads, and cannot execute outbound sync. Explain those effects and get consent. queued/job_id is not completion. The worker rejects configuration drift. Inspect diagnostics or GHL import history afterward; do not retry an uncertain request blindly.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Agenda del CRM (4)`,id:`agenda-del-crm-4`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_crm_booking_choices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`provider`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List verified HubSpot meeting links or GHL calendars for an appointment task. GHL choices include location_id to distinguish sub-accounts. Resolve names here before setup; never guess a calendar ID. This reads the provider and does not change configuration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_crm_booking`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`provider`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the task’s saved native CRM booking provider, installed tool IDs, calendar/link IDs, active flags and exact revision. Saved configuration is not a successful booking or runtime verification. Use before configure/remove and reread on conflict. Booking belongs to the appointment goal.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_crm_booking`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`action`}),`, `,_jsx(_components.code,{children:`expected_revision`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure or remove native HubSpot/GHL booking for one appointment task. First read get_agent_crm_booking and list_agent_crm_booking_choices. configure requires a verified choice_id. Both actions require explicit user consent via confirm=true and expected_revision from the read. Installs/removes native booking tools and external-booking configuration atomically, with provider availability checks on setup. Locked tasks, changed revisions, another provider or hand-managed configuration may reject the change. Returns saved readback; does not book, cancel or reschedule a meeting. Never claim a real booking was tested.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_ghl_import_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the latest 20 stored GHL import runs for an exact connection/location, worker state, recurrence state and configuration validity. Resolve connection_id through get_agent_integration_flows. Evidence covers the whole connection, potentially several tasks; never attribute connection counters to this task or claim connected means synced. No stored runs means no execution evidence, not successful sync. Returns safe counters and errors without lead payloads or credentials. Does not start an import. recurring_state: not_configured = auto-sync was never set up (blocker not_configured), not an error; valid; or invalid. configuration_errors only matter when recurring_state=invalid.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Diagnóstico y entradas CRM (6)`,id:`diagnostico-y-entradas-crm-6`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_crm_diagnostics`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`provider`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read safe stored execution evidence for an exact HubSpot, GHL, Kommo, Zoho, Odoo or custom inbound connection. Read connection_id from get_agent_integration_flows. Provider counters cover the connection, possibly several tasks; custom evidence covers that task-owned entry. Connected/configured is never proof of successful sync. No history is not success. Raw vendor exceptions, credentials and lead payloads are excluded. Odoo reports actual runtime gates and unavailable outbound execution. Read never_received and last_data_received_at/_source/_scope first: never_received=true (GHL: intake key never used) means the CRM never called Nexor, so check the customer’s CRM webhook/automation, not Nexor data; scope=client is a key shared across connections. GHL adds last_webhook_at, last_webhook_outcome (skipped:* = routing skip, e.g. paused route, not a failure), intake_key_last_used_at, intake_key_active and recurring_state (not_configured = auto-sync never set up, not an error).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_hubspot_catalog`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`catalog`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read verified HubSpot owners, lead/deal pipelines, or writable contact/deal property choices before configuring native tools and mappings. These are account choices read in a task context. No writes or imports.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`count_agent_kommo_source`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`route_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Count cards currently in one saved task-owned Kommo source stage without importing or moving anything. has_more=true means the count is a lower bound, not the total. The source can change after this read. Use exact route_key and connection_id from get_agent_integration_flows.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_odoo_inputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read Odoo intake routes, inherited field mappings, lifecycle mappings, verified CRM catalogs and exact revision for one task or group. Reads provider metadata without importing records. Runtime apply availability is reported explicitly; saved configuration does not imply execution. Legacy connections only support route changes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`preview_agent_odoo_inputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`patch`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Preview replacing one Odoo intake section for the selected task/group, preserving sibling tasks and shared ignore/observe rules. First read get_agent_odoo_inputs. routes/lifecycle values must use workflow IDs inside the selected scope. fields maps provider fields to canonical lead fields or metadata; inherit=true restores shared fields. Requires current connection and revision. Reads provider records and stores a preview fingerprint, but never imports or contacts leads. Counts cover the full connection, including preserved sibling routes, not only the selected task. Review counts and blockers before saving. Odoo runtime gates still apply.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_agent_odoo_inputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`patch`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Save the exact task/group Odoo intake patch after a fresh successful preview and explicit operator consent. Requires confirm=true, current revision and identical previewed patch. Saves through the same guarded service as the panel. Preserves sibling tasks, enforces task locks and available runtime gates. Returns committed scoped readback; never claim an import or outbound sync ran. Does not enable an unavailable Odoo engine.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Metadatos de sesión (1)`,id:`metadatos-de-sesion-1`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`whoami`})}),_jsx(_components.td,{children:`Clave autenticada`}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Return the authenticated Nexor client identity and the scopes this API key was granted. Call this first to discover which actions are permitted.`})]})})]})}),`\n`,_jsx(Accordion,{title:`Preparación de la cuenta (1)`,id:`preparacion-de-la-cuenta-1`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_account_readiness`})}),_jsx(_components.td,{children:`Clave autenticada`}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`MANDATORY FIRST-RUN TOOL. At the start of a new customer conversation, call this before the first substantive reply. Returns account/payment state, granted and missing setup scopes, saved onboarding context, agents/channels/template inventory, a factual readiness checklist, the safest next tools, external human touchpoints, and initial_dialogue with the exact opening behavior. account.sms_eligible reports account-level SMS eligibility: US/CA by default, or the explicit account flag elsewhere; it does not prove a number has SMS enabled or bound. Each appointment-capable agent carries a booking block (meeting_type, hosts with schedule/calendar state, activation blockers such as MEETING_TYPE_REQUIRED / BOOKING_AVAILABILITY_REQUIRED / CALENDLY_BINDING_REQUIRED, timezone warnings, and fix_tools). Follow initial_dialogue; do not ask for facts in resume_context, do not mutate while payment/account access is blocked, and do not claim the account is ready merely because dashboard onboarding was marked complete or because an agent is active: an active agent with booking blockers cannot book.`})]})})]})}),`\n`,_jsx(Accordion,{title:`Tareas (13)`,id:`tareas-13`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_workflows`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the authenticated client’s workflows (the funnels leads move through), including each agent’s master_workflow_id group assignment, enabled channels, and status ids. Archived (soft-deleted) agents are hidden by default; pass include_archived:true to see them too — each row then carries archived:true and a deleted_at timestamp so you can find an archived agent to restore with restore_workflow.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Fetch one workflow/agent with prompts/config, ordered status summaries, fields, channels and tool execution settings. Each field includes its metadata_key and intake_value_map when configured. Pass workflow_id, or name to resolve a task name or an agent name without calling list_workflows first (an agent name returns each of its tasks as workflows[], up to 4). Status summaries do not include their full gates/timeouts/transfers; pass include_statuses:true to get every status’s full configuration (as get_workflow_status returns it) in the same call. Use both for verification before activation. workflow.escalation_state {enabled, reason} is the runtime answer to whether the agent can hand a lead to a human (Escalated to executive); trust it over raw config keys.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`goal_type`}),`, `,_jsx(_components.code,{children:`statuses`}),`, `,_jsx(_components.code,{children:`master_workflow_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Opt in with creation_mode:paused_unbound for task composition: no channel inheritance/assignment, newly created tasks mask all four contact channels (including shared availability), no activation, safe existing-task retries returned read-only. Returns composition_contract_version:1. Ordinary omitted mode preserves inherited channels. Create a new PAUSED workflow — ONE MODE (sub-agent) inside an AGENT (master workflow). master_workflow_id is REQUIRED: a workflow never exists without an agent, so create the agent first with create_agent_group (or pick one from list_agent_groups) and pass its id; a call without it is refused before any request is made. Provide an ordered list of statuses; each needs a key plus a name (or its `,_jsx(_components.code,{children:`label`}),` alias). If no is_initial/is_terminal flags are set, the first and last become entry/exit. Statuses accept the full stage config here — entry_hint, category, color, transition_rules, requires_all_fields/required_field_keys, timeout_config, transfer_config, pause_bot, can_return_on_reply (lost final stages), assignment_config and the is_* flags — so a funnel can be fully configured in one call instead of follow-up update_workflow_status PATCHes. Every non-initial status MUST carry an entry_hint (one sentence: when a lead enters it); a call missing one is refused before any request (status_entry_hint_required, listing the statuses). Unknown status fields are forwarded to the backend as-is. The statuses array is the COMPLETE funnel of YOUR stages: the backend seeds a default pipeline on create, so this tool reads the workflow back, deletes seeded statuses not in your list, and returns the workflow plus a pipeline_reconciliation report. Three core stages (new, contacted, engaged) and the virtual “discarded” stage ALWAYS exist on every agent and are NOT part of the statuses contract: they are never deleted and are listed under seeded_statuses_kept (reason core_stage/virtual) — do not try to remove them. The result carries a top-level `,_jsx(_components.code,{children:`status`}),`: “created” means the funnel is exactly what you asked; “created_with_warnings” means the report has REAL unresolved warnings (duplicate stage labels, non-core seeded stages that could not be removed, missing requested stages) — you MUST resolve those before telling the user the agent is built. Set prune_unrequested_statuses:false to keep seeded defaults. Pass timezone (IANA) and region_style: when omitted the backend anchors them to the ACCOUNT (country/host schedule), never to a Chilean default — read them back in the returned workflow. BORN WITH (inherited, never asked): the mode inherits its AGENT’s channels, contact schedule, persona name (agent_name = the agent’s human name), language and timezone. The tool resolves them itself before the create: from the agent’s other live modes when it has any, otherwise (first mode) from the account — every channel the account holds a verified resource for — with the backend’s schedule default. It then binds the resources (one WhatsApp number and one SMS route per agent, shared by its modes; the account-wide number for calls; the agent’s email sender on every mode) and returns `,_jsx(_components.code,{children:`inheritance`}),` (what was inherited and from where) plus `,_jsx(_components.code,{children:`channel_bindings`}),` (per channel: bound / already_bound_in_group / client_scoped_available / owned_by_other_agent / no_resource). A resource another agent owns is NEVER taken silently — it comes back as owned_by_other_agent for the operator to decide. So OMIT channels, contact_schedule and agent_name unless the operator explicitly asked for something different for this mode. When the first-contact channel has no verified resource on the account, the result carries a channel_not_verified warning with the fix tools (connect_whatsapp_number, provision_phone_number, register_email_sender). Idempotent on the backend (a guarded duplicate returns the existing id; stages holding leads are never deleted, only reported). Each call creates ONE MODE (sub-agent) of an agent; a build is normally 2–3 modes split by intent and register (sell → follow up → discount), never one broad mode unless the operator explicitly asked for exactly one, never 5+. Before the first create call describe_agent_configuration (mode_split) + review_agent_system_plan, resolve clarifications, and obtain explicit user approval of the final plan summary (“Does this look ok? Let me know and I’ll build it.”); never show the plan_fingerprint or the word “fingerprint” to the user. CONTACT HOURS: a mode inherits its agent’s windows when the agent already has modes; the first mode gets Mon–Fri 09:00–18:00 ONLY when nobody said anything about hours. If the operator hinted at hours anywhere (after-hours, overnight, 24/7, weekends, specific times, a use case that only exists outside office hours), pass contact_schedule explicitly — never let the default apply to such an agent. The result carries contact_schedule {source: explicit | inferred_from_description | default_business_hours, windows}: tell the operator what the agent was born with in one line, and if source is default_business_hours for an agent that should not keep business hours, fix it with set_workflow_cadence. CHANNELS AND HOURS ARE NEVER QUESTIONS, for any agent: they are inherited as described above. Tell the operator in one line what the mode was born with (channels, hours) from `,_jsx(_components.code,{children:`inheritance`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_workflow_prompt`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`global_prompt`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace a workflow’s base (global) prompt — the business rules and persona the agent follows across channels. Read the current one with get_workflow first if you want to edit rather than overwrite. Channel-specific overrides are not touched — so a BEHAVIOR CHANGE (a new rule, condition, or metadata-driven branch such as ‘if metadata X > 50 do Y’) is not finished here: also write it, in that channel’s register, into every channel prompt that has a body (get_workflow → channel_prompts) with set_channel_prompt, unless the operator scoped the change to one channel or to the base prompt only. SMS and iMessage outbound messages are composed from the channel prompt ALONE when one exists, so a rule left only in the base prompt never reaches them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_workflow_active`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`active`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Turn one task on or off. For mutually dependent paused tasks, pass related_workflow_ids only after the operator explicitly agrees to activate every named task together; all are checked before one atomic activation. Activating contacts enrolled, not-yet-contacted leads per cadence (calls wait for the task’s contact hours; messages go right away unless restricted to its hours), and resumes leads paused mid-cadence at their next touchpoint. Do-not-contact leads and reply-only tasks are excluded. Use exact IDs from the selected agent, never another agent. Without related_workflow_ids, only workflow_id changes. Appointment tasks still need booking readiness. On TRANSFER_TARGET_PAUSED a handoff target is only paused, not missing: name the activate_together tasks to the operator, get agreement, then retry once with related_workflow_ids = activate_together plus any IDs already sent.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Update a workflow’s identity, metadata, agent assignment or reply-only switch: rename it, change its description, set the objective of a ‘custom’ goal workflow (goal_statement), move it into another agent (master_workflow_id — never null: a mode always belongs to an agent, so it is moved, not detached), adjust the agent’s identity (language, timezone, region_style, agent_name, agent_role, company_name, begin_message), or set inbound_only (true = the mode NEVER writes first: no first contact and no cadence when a lead enrols or is transferred in, while replies to inbound messages stay immediate; the canonical setting for a support mode). Pass only the fields you want to change. Use list_agent_groups to resolve a group name to its tenant-scoped id.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_channel_prompt`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`channel`}),`, `,_jsx(_components.code,{children:`prompt`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set the per-channel prompt override for a workflow (e.g. WhatsApp vs email tone/format). Merges with existing channel prompts; doesn’t touch the global prompt. Use ‘call’ for the voice/call channel (‘retell’ is still accepted as an alias). For sms and imessage this prompt is the ONLY one the outbound composer reads when it exists, and the call/WhatsApp overlays are what the agent follows turn by turn — so a behavior change the operator asked for without naming a channel goes into the base prompt (set_workflow_prompt) AND into every channel that has a body, one set_channel_prompt per channel, read first so you merge the rule into the existing text instead of replacing it. Name a single channel only when the operator did.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_workflow_prompt_history`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read one workflow’s prompt version history — snapshots of global + channel prompts, what changed, by whom, and when. workflow_id must be the exact UUID returned by list_workflows/get_workflow; never pass a name, change id, or placeholder text. Pass versions to read specific version numbers, including ones older than the latest 50.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_workflow_structure`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Add or edit a workflow’s basic funnel statuses and/or data fields. Upsert by key — new keys are added, existing ones updated; nothing is deleted. A field’s metadata_key prefills it from lead metadata, and intake_value_map can normalize incoming string values to canonical field values. Status order is deliberately unsupported here: use reorder_workflow_statuses. A new non-initial status needs an entry_hint (refused with status_entry_hint_required otherwise). After creating statuses, use update_workflow_status for qualification gates, timeouts, transfers, pause behavior and trigger flags. To remove one safely, use get_pipeline_impact then delete_workflow_status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_workflow_config`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`config`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Update a workflow’s behaviour config (the `,_jsx(_components.code,{children:`config`}),` bag: flags like gate_outbound_to_hours and other non-prompt settings). Merges top-level keys by default — pass only the keys you want to change; existing keys are preserved. Set replace:true only to overwrite the entire config object (rare). Does not touch the prompt, statuses, fields, or channels. Reserved keys are REFUSED here (400 RESERVED_CONFIG_KEY) because the runtime reads them by exact key and a misspelled key would merge silently: use set_payment_link for payment_link, set_host_assigner for host_assigner and set_external_booking for external_booking — those validate the shape and the referenced tools. HUMAN HAND-OFF: pass escalation:{enabled:true} to turn it on (this also restores a deleted ‘Escalated to executive’ stage) or escalation:{enabled:false} to turn it off, then confirm with escalation_state in the response. escalation is deep-merged, so pass only the keys you change. escalation.trigger_text: the cases that hand off, one per line; it REPLACES the default cases (a question the agent cannot answer, a policy/eligibility question), so restate any default you still want. escalation.signoff_text: guidance for the goodbye/holding message the agent sends when it hands off. escalation.voice_enabled:true also hands off on phone calls (off by default): the agent says goodbye and the team follows up by message. Never emulate hand-off with a custom HTTP tool: only the built-in escalation pauses the agent and notifies the team.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_opening_message`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`channel`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Set the agent’s FIRST message for one channel — the fixed opener sent/spoken verbatim before the agent improvises. channel ‘call’ (voice): `,_jsx(_components.code,{children:`message`}),` is the opening line spoken when the call connects (flat variables {{lead_first_name}}, {{lead_full_name}}, {{agent_name}}, {{company_name}}; a variable the lead lacks is sent empty, never spoken; ” clears it and the agent opens with its own greeting from the prompt, e.g. ‘Hola, soy Valentina de Kaufmann. ¿Hablo con Raimundo?’); `,_jsx(_components.code,{children:`agent_speaks_first`}),` (default true) — set false to make the agent wait for the lead to speak, optionally with `,_jsx(_components.code,{children:`silence_ms`}),` (1000–30000, default 3000) before it opens anyway. channel ‘email’: a fixed first email `,_jsx(_components.code,{children:`subject`}),` + `,_jsx(_components.code,{children:`body`}),` sent verbatim (variables {{first_name}}, {{last_name}}, {{email}}, {{metadata.key}}); `,_jsx(_components.code,{children:`enabled:false`}),` with empty subject/body removes it so the agent composes the first email itself. channel ‘webchat’: `,_jsx(_components.code,{children:`message`}),` shown by the widget before the agent speaks. channel ‘sms’: `,_jsx(_components.code,{children:`message`}),` sent verbatim as the first outbound SMS (same variables as email; a legally required STOP notice is still appended for US numbers). channel ‘messenger’: `,_jsx(_components.code,{children:`message`}),` sent verbatim as the agent’s first reply in a new Messenger conversation. channel ‘imessage’: `,_jsx(_components.code,{children:`message`}),` sent verbatim as the first outbound iMessage (Apple Messages for Business: no STOP notice; variables {{first_name}}, {{lead_first_name}}, {{last_name}}, {{full_name}}, {{email}}, {{metadata.key}}, plus {{company_name}} and {{agent_name}}); without it the agent composes the opener from the workflow prompt, the iMessage channel prompt (set_channel_prompt channel ‘imessage’) and the lead’s metadata. For call/webchat/sms/messenger/imessage, ” clears the opener so the agent composes it from the prompt. NOT free text: WhatsApp openers are Meta-approved templates → set_opening_templates; Instagram campaign openers are dashboard-only. Returns the persisted opener as read-back; read every channel’s opener with get_workflow → opening_messages. / Configura el PRIMER mensaje del agente por canal: ‘call’ (línea de apertura de voz + quién habla primero), ‘email’ (asunto + cuerpo fijos), ‘webchat’, ‘sms’, ‘messenger’ e ‘imessage’ (texto fijo del primer mensaje). WhatsApp usa plantillas aprobadas (set_opening_templates).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_payment_link`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`source`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set (or clear) where a ‘Send Payment Link’ agent gets the link it sends to leads — the backing for the dashboard’s Payment link section. Pick the source: ‘fixed’ = one static URL for every lead (needs a valid http(s) url; optional label); ‘tool’ = a tool generates a per-lead link (needs the tool name; optional capture dot-path into the tool’s JSON response, e.g. ‘data.url’); ‘lead’ = read the link from a lead metadata field (needs metadata_key, e.g. ‘payment_url’); ‘none’ = clear the configured link. Use this instead of writing config.payment_link through update_workflow_config: this validates the shape and reads the saved value back, so a success here means it actually persisted. / Configura de dónde saca el link de pago un agente de ‘Enviar link de pago’: ‘fixed’ (URL fija http(s), label opcional), ‘tool’ (una herramienta genera el link; capture opcional), ‘lead’ (leer de metadata_key del lead) o ‘none’ (borrar). Devuelve el valor guardado como verificación.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_conversion_destination`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`destination_workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set (or clear) where a lead goes when it converts — the agent and status Nexor moves it to after create_conversion or the public conversions endpoint fires. Configure it on one agent (workflow_id) or on a whole agent group (agent_group_id): precedence at conversion time is the conversion type’s destination, then the lead’s current agent, then its group; the first one configured wins, and with none the lead stays put. destination_workflow_id may be the same agent (status change only). Pass destination_workflow_id: null to clear (destination_status_key must then be omitted); when set, destination_status_key is required and must be a status of that destination agent. The response is a read-back of what the database now holds (conversion_destination with workflow name, status label and source), so a success here means it persisted. Read the effective value later with get_workflow / get_master_workflow. / Define a qué agente y estado se mueve un lead cuando convierte, en un agente (workflow_id) o en un grupo (agent_group_id). Precedencia: tipo de conversión > agente > grupo. null borra la configuración. Devuelve el valor guardado como verificación.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Herramientas de tareas (7)`,id:`herramientas-de-tareas-7`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_workflow_tools`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List a workflow’s custom tools (name, method, url, active, stage gate, on-entry, call-once).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_workflow_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`description`}),`, `,_jsx(_components.code,{children:`url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create a CUSTOM tool that lives only in THIS workflow (no catalog inheritance). Prefer create_client_tool + assign_tool_to_workflow when the tool should be reusable across workflows. name is the snake_case identifier the agent references (immutable). description tells the agent when to call it. parameters is a JSON Schema for the call arguments. URL rule: tool ARGUMENTS go in the url with SINGLE braces (/citas/{id_cita}). Double braces are ONLY for context values resolved before the call: {{env.KEY}} for secrets, {{lead.metadata.X}}, {{lead_id}}. Never {{arg}} for an argument: it is rejected with 400 invalid_url_placeholder and a suggested_url. call_once caches the result per lead; auto_run_on_entry fires it when a lead enters the workflow; available_in_statuses gates it to funnel stages. Create it with is_active=false, run test_workflow_tool, and activate it (update_workflow_tool is_active=true) only after the test returns passed=true.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_workflow_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`tool_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Edit a custom tool’s config (url, method, description, parameters, headers, timeout, flags, is_active). The name cannot change; delete and recreate to rename. URL rule: tool ARGUMENTS go in the url with SINGLE braces (/citas/{id_cita}). Double braces are ONLY for context values resolved before the call: {{env.KEY}} for secrets, {{lead.metadata.X}}, {{lead_id}}. Never {{arg}} for an argument: it is rejected with 400 invalid_url_placeholder and a suggested_url. After changing url, method, parameters, headers or query_parameters, run test_workflow_tool and set is_active=true only after the test returns passed=true.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`test_workflow_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`tool_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Run one custom HTTP workflow tool once through the same path the agent uses: secrets, context, path and query parameters, and headers. The external system is called for real, but no Nexor lead or run changes. Works on inactive tools. Returns request (secrets redacted), response, what the agent sees, unresolved placeholders, and passed. called=false means the request never left; read agent_sees. Use args for model arguments and lead_metadata for {{lead.metadata.X}}. There is no lead, so test tools that need {{lead_id}} or other lead properties in Playground. GET runs directly. POST, PUT, PATCH, and DELETE need confirm_write=true after explicit operator approval, test data, and a cleanup path defined before execution. Never activate a tool whose test did not pass. Nexor platform tools return internal_tool_not_testable; test them in Playground.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_workflow_tool_execution`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`tool_id`}),`, `,_jsx(_components.code,{children:`mode`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Choose exactly how an assigned workflow tool runs. mode=“on_entry” makes it a pre-agent/pre-execution hook: it fires as soon as a lead enters the workflow, before the first agent message, and therefore clears stage gating. mode=“agent_decides” lets the conversational agent call it and optionally gates it to specific status keys. These modes are mutually exclusive. call_once limits successful execution per workflow run; is_active is an independent kill switch.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_workflow_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`tool_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Remove a custom tool. Soft-disables by default (keeps audit); pass hard=true to delete permanently.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_tool_stage_gate`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`tool_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Gate a tool to specific funnel stages: it becomes callable only when the lead is in one of available_in_statuses. Pass null to clear the gate (callable anywhere).`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Tools reutilizables del cliente (6)`,id:`tools-reutilizables-del-cliente-6`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_client_tools`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s reusable tool catalog. Tools here can be assigned to multiple workflows and stay in sync.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_client_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`description`}),`, `,_jsx(_components.code,{children:`url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create a reusable tool in the client catalog. This is the RECOMMENDED low-level path for an existing customer API operation that should be available across workflows; configure_customer_api_tool is the guided create-and-assign path. name is the immutable snake_case function identifier. description is loaded into the agent and must say when/how to call the API without containing credentials. parameters is the agent-visible JSON Schema. Use {{env.KEY}} in url/headers for secrets configured with set_function_environment_variable; lead/context placeholders are also supported.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`configure_customer_api_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`purpose`}),`, `,_jsx(_components.code,{children:`when_to_use`}),`, `,_jsx(_components.code,{children:`url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Turn one operation from an API the customer owns or already uses into a reusable Nexor agent tool, then optionally assign it to workflows. Creates the catalog tool, composes scoped agent instructions from purpose/when-to-use/when-not-to-use/response rules, and configures per-workflow stage gates, call-once behavior, and response-field allowlisting. Model one focused API operation per tool. Store credentials with set_function_environment_variable and reference them as {{env.KEY}} in headers; NEVER put credentials in purpose/instructions/parameter descriptions. This creates a new immutable name; use list_client_tools + update_client_tool when that name already exists.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_client_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`tool_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Edit a catalog tool’s config. Changes propagate to every workflow that has assigned (inherited) this tool. The name cannot change — delete + recreate to rename.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_client_tool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`tool_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Remove a tool from the client catalog.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`assign_tool_to_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`client_tool_id`}),`, `,_jsx(_components.code,{children:`workflow_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Assign a catalog tool to a workflow; it inherits and stays in sync with the catalog tool. Idempotent — re-assigning an already-assigned tool returns the existing assignment.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Navegación web (1)`,id:`navegacion-web-1`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`read_page`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`url`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read ONE public web page and get its text content back (as markdown) — like the web-fetch tool in Claude/Codex. Use this to reference a website while helping a client build or configure their agent: e.g. read their homepage/services/pricing page so you can summarize it, seed a knowledge base, or draft prompt copy from it. Give the full http(s) URL of a single public page. One page per call, no crawling and no link-following: to read another page (including one linked from this one), call read_page again with that URL. The content is returned to YOU, the assistant — it is never inserted into a lead conversation. Public pages only (login-walled or empty pages come back as an error), and it runs on Nexor’s own scraper, so the client is not charged. Optional max_chars (1-100000, default 50000) caps how much text is returned. For ‘the agent should know my whole site’, use the knowledge base tools instead — that ingests many pages the agent then draws on at answer time.`})]})})]})}),`\n`,_jsx(Accordion,{title:`Leads (17)`,id:`leads-17`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_leads`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Page through the authenticated client’s leads with optional search, workflow and human-assignee filters. When looking up specific people (search), pass include_detail:true: if 3 or fewer leads match, each comes back with its recent history (newest 20 items) and run_state in the same call. A workflow_id includes active and settled/inactive membership by default, matching get_pipeline_impact; pass run_state=active only for current runs. Every lead includes assigned_to plus assigned_user when assigned; use list_team (people:read) for the directory. For recurring polls, pass updated_since with sort_by=updated_at sort_dir=asc and resume from the max updated_at seen. in_support: the lead is waiting on a person (pending escalation or stage handoff) — the agent does not reply, even if is_paused is false; it does not mean someone is assigned.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_lead`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Fetch one lead by id, including its assigned human owner (assigned_to and assigned_user id/name, or null), field values, per-channel engagement and active workflow run. Use list_team (people:read) for the complete user directory. in_support: the lead is waiting on a person (pending escalation or stage handoff) — the agent does not reply, even if is_paused is false; it does not mean someone is assigned.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_leads`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_ids`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Batch read many leads by id in ONE call (1-500 per call), each with the same field values, per-channel engagement and workflow runs as get_lead. Always prefer this over calling get_lead in a loop — N sequential get_lead calls burn the rate limit. Unknown ids come back in missing_ids. in_support: the lead is waiting on a person (pending escalation or stage handoff) — the agent does not reply, even if is_paused is false; it does not mean someone is assigned.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_lead_history`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read what was actually said or sent to ONE lead. The unified timeline returns full WhatsApp and SMS text, email subject/body plus delivery details, and call summary/transcript, with direction and timestamps; it also includes activities, meetings and conversions when unfiltered. Use channel=call,whatsapp,email,sms (one or comma-separated) to isolate communication content. The current stage is in current_stages (one per active run, unaffected by filters and paging; null if unreadable) and get_lead (newest active run only). Never infer it from history: stage changes are stored under the channel that triggered them (many under system), so a channel filter can hide some. Paging mode uses limit/offset and order_by; when pagination.has_more is true, keep paging before claiming the history is complete. Conversation-window mode uses anchor_ts with before/after (0-20 each) to inspect the messages around one moment. Use list_transcripts/get_transcript only for meeting transcripts, not phone calls.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`upsert_leads`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update one or more leads (idempotent upsert on email/phone). When workflow_id is provided, enrollment has MOVE semantics: every other active run is deactivated before the target run is created, and the result is verified by reading each successful lead back. Use assign_lead_to_workflow for an already-known lead id. If the task is ACTIVE, enrolled leads are contacted right away per its cadence (calls wait for the contact hours of the task; messages go right away unless the task restricts messages to its hours); do-not-contact leads and reply-only tasks are excluded. If it is paused, contact starts when it is turned on. WARNING: first_message sends a real outbound message immediately (no agent composition) and also requires messages:send; first_channel only pins the first cadence channel.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_lead`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Update one lead. Put identity/contact values in standard fields (first_name, last_name, email, phone), and other agent-readable context in metadata. Metadata is shallow-merged and becomes available to the agent on its next execution; it does not change contact destinations or send data externally. Archived leads are rejected.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sync_lead_tags`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`tags`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set the exact tag set for a lead (empty clears all tags). Identify the lead by id or email.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`assign_lead_to_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`workflow_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Move a lead into a workflow: deactivates the current run, creates a fresh run and starts its cadence. If the task is ACTIVE the lead is contacted right away per its cadence (calls wait for the contact hours of the task; messages go right away unless the task restricts messages to its hours); do-not-contact leads and reply-only tasks are excluded. If paused, contact starts when it is turned on.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`stop_automation`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Human takeover ON for a lead: pause its cadence and cancel pending scheduled tasks. The active workflow is resolved automatically; only pass workflow_id if the lead is in more than one.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`resume_automation`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Human takeover OFF for a lead; optionally reactivate its cadence (may resume outbound contact).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_lead_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`status_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Force a lead’s funnel status (move it forward or back). The active workflow is resolved automatically; pass workflow_id only if the lead is in more than one.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`bulk_set_lead_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_ids`}),`, `,_jsx(_components.code,{children:`status_key`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm_transfer_side_effects: true`})}),_jsxs(_components.td,{children:[`Set the funnel status for many leads at once (1-500 per call). Applies the same per-lead status change (with history) as set_lead_status; leads that can’t be updated come back in `,_jsx(_components.code,{children:`failed`}),` with a reason. When the target status auto-messages (transfer_config), those leads are withheld with reason `,_jsx(_components.code,{children:`transfer_side_effects_require_confirmation`}),` — confirm with the operator, then re-call with confirm_transfer_side_effects=true to include them.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`bulk_assign_leads_to_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_ids`}),`, `,_jsx(_components.code,{children:`workflow_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Move many leads (1-500 per call) into a workflow: each gets its current run deactivated and a fresh run with cadence started. If the task is ACTIVE, leads are contacted right away per its cadence (calls wait for the contact hours of the task; messages go right away unless the task restricts messages to its hours); do-not-contact leads and reply-only tasks are excluded. If paused, contact starts when it is turned on. Failures come back per lead in `,_jsx(_components.code,{children:`failed`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`bulk_archive_leads`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_ids`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`SOFT delete (archive) many leads at once (1-500 per call). REVERSIBLE: the leads disappear from active views and their automation stops, but the records are kept and can be restored. This does NOT permanently erase anything — for that, use bulk_hard_delete_leads. When the operator asks to “delete”/“remove”/“borrar”/“eliminar” leads and it is not crystal clear whether they mean archive (reversible) or permanent erase (irreversible), ASK before calling either tool. Confirm before calling. Failures come back per lead in `,_jsx(_components.code,{children:`failed`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_lead`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`SOFT delete (archive) one lead. REVERSIBLE: the record is kept and can be restored; this does NOT permanently erase it — for that, use hard_delete_lead. When the operator asks to “delete”/“remove”/“borrar”/“eliminar” a lead and it is not crystal clear whether they mean archive (reversible) or permanent erase (irreversible), ASK before calling either tool.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`hard_delete_lead`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:delete`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`PERMANENTLY delete one lead. IRREVERSIBLE AND NOT RECOVERABLE: the lead and ALL of its data — every conversation, message, meeting, call, field value, note, and task — are erased forever. There is no undo and no restore. This is NOT archiving (use delete_lead for reversible archiving). Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms permanent erasure of this exact lead. When “delete”/“remove”/“borrar”/“eliminar” is ambiguous between archive and permanent erase, ASK first — never assume hard delete.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`bulk_hard_delete_leads`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:delete`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_ids`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsxs(_components.td,{children:[`PERMANENTLY delete many leads at once (1-500 per call). IRREVERSIBLE AND NOT RECOVERABLE: each lead and ALL of its data — every conversation, message, meeting, call, field value, note, and task — are erased forever. There is no undo and no restore. This is NOT archiving (use bulk_archive_leads for reversible archiving). Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms permanent erasure of these exact lead ids. When “delete”/“remove”/“borrar”/“eliminar” is ambiguous between archive and permanent erase, ASK first — never assume hard delete. Failures come back per lead in `,_jsx(_components.code,{children:`failed`}),`.`]})]})]})]})}),`\n`,_jsx(Accordion,{title:`Reglas (9)`,id:`reglas-9`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_reminder_catalog`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`The reminder contract for THIS account: channels with per-account availability (available_for_account + reason, e.g. retell needs an active callable number, sms an SMS-enabled number, whatsapp an active WhatsApp number, email a verified sender), trigger events the runtime actually dispatches (with which ones are reconciled onto existing bookings), delay references and default templates. Call it before set_reminder_rule when choosing a channel; pass workflow_id for the workflow-scoped answer.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_reminder_rules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List lead-facing reminder rules (booking confirmations, pre-meeting reminders).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_reminder_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`trigger_event`}),`, `,_jsx(_components.code,{children:`template_name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update a lead reminder rule (idempotent). Channels: whatsapp | retell | sms | email — whether each one can actually send on this account comes from get_reminder_catalog (available_for_account); a rule on an unavailable channel is stored but the response carries warning ‘channel_not_available’ until the sender is provisioned. trigger_event ‘call_analyzed’ fires post-CALL, not post-meeting; there is no ‘reschedule’ event (a reschedule re-fires event_created). delay_minutes is signed: negative with delay_reference=‘event_start’ means before the meeting. Example: {trigger_event:‘event_created’, channel:‘whatsapp’, template_name:‘confirm_booking’, delay_minutes:0}.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_host_reminder_rules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List host (sales rep) notification rules. Email-only. Note: cancellation notifications are on by default and may not appear here.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_host_reminder_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`trigger_event`}),`, `,_jsx(_components.code,{children:`template_name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update a host booking-notification rule (notify the rep by email when a meeting is booked; idempotent). Omit workflow_id for a global rule. Note: host cancellation and reschedule alerts are already sent by default and are not configured here.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_recontact_rules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List re-engage (recontact) rules that drive the AI scanner re-contacting stale leads. Each rule carries cadence_owned (true when its stage belongs to the initial outreach cadence, so it can never be active).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_recontact_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`stale_after_hours`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update a re-engage rule (idempotent). The initial outreach cadence OWNS the stages new, contacted and the workflow’s initial stage: an active rule there returns 409 CADENCE_OWNED_STAGE (fix: target a later custom stage such as engaged/proposal_sent, or send is_active:false). prompt_hint is a binding instruction to the AI. A rule is identified by workflow_id + trigger_status_key: editing an existing one changes only the fields you send and keeps the rest (send prompt_hint \"\" to clear it). Defaults apply only when creating: stale_reference ‘last_touchpoint_at’ (recommended; ‘last_response_at’ silently freezes silent leads), cooldown 24, max_attempts 5, priority 5, on_exhausted mark_cold, active.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_status_timeout_rules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List status auto-timeout configs: the per-stage delays ({timeout, unit, target_status_key}) that move a lead to another status after time in a stage. This is the native delay primitive — read it before proposing any wait or delayed-handoff timing.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_status_timeout_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`status_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Set or clear the auto-timeout on a workflow status — the NATIVE way to add a delay between stages (dashboard: “If the lead does not reply → After N hrs → Move to”). After `,_jsx(_components.code,{children:`timeout`}),` `,_jsx(_components.code,{children:`unit`}),` (minutes|hours|days) counted from the moment the lead entered status_key (a reply does not reset it; a status change does), the lead moves to target_status_key, which must be an existing status key in the SAME workflow. Delayed handoff to another agent: point it at a terminal status that carries transfer_config — the transfer fires on arrival. Chain statuses for multi-step waits (each timer starts on entry). Use this before any Scheduled Function, Background Job or recontact rule for “wait N hours, then move/transfer”. The source status must not be terminal or the goal stage (the timeout would never fire). Pass clear:true to disable.`]})]})]})]})}),`\n`,_jsx(Accordion,{title:`Personas e invitaciones (7)`,id:`personas-e-invitaciones-7`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_team`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`people:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the authenticated client’s active team members (sales reps / hosts) with user id, name, email, CRM external id and can_receive_escalations (whether escalation routing can assign them); pass include_inactive:true to also get removed members (is_active:false) so you can name a former teammate. Use these user ids with assigned_to filters; lead and conversation reads expose the matching assigned_user by default.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_team_availability`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`people:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Owners and admins only. Read who is Active or Away for lead assignment. Returns members (user_id, name, role, availability active|away, changed_at = since when, changed_by self|idle|admin, last_seen_at = last used the app, in_rule_stage, open_leads, assigned_today), waiting_leads (leads that arrived when nobody in the stage’s list was Active; max 100, oldest first), stages that assign an owner on entry (active_only = whether “only Active” is on, members, active_members) and idle_minutes. How it works (accounts where this answers): new members start Away; a member who does not use the app for idle_minutes is set Away automatically (checked every 5 min); waiting leads are handed out automatically, oldest first, as people turn Active. Going Away never moves leads already assigned. Change the idle time with set_availability_idle_time; set someone Away with set_member_away.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_member_away`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`user_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Owners and admins only. Set a team member Away, so stages with “only Active” stop giving them new leads. Away only: this tool never sets anyone Active; members turn themselves Active in the app. Leads already assigned to them stay with them. Use a user_id from get_team_availability or list_team. Returns { user_id, availability, changed_at, changed_by }.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_availability_idle_time`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`idle_minutes`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Owners and admins only. Set how many minutes a member can go without using the app before they are set Away automatically (default 50). Whole number from 10 to 480; applies to the whole account. Never sets anyone Active. Read the current value with get_team_availability. Returns { idle_minutes }.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_pending_invitations`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`people:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List outstanding invitations (not yet accepted, not cancelled, not expired). Consult this before inviting to avoid duplicates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`invite_user`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`invites:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`email`}),`, `,_jsx(_components.code,{children:`role`})]}),_jsxs(_components.td,{children:[`Vista previa con `,_jsx(_components.code,{children:`dry_run`})]}),_jsx(_components.td,{children:`Invite a person to the client’s organization by email and role. Idempotent: a still-valid pending invite to the same email is reused, not re-sent. Returns status: created | reused | already_member.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`revoke_invitation`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`invites:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Cancel a pending invitation by id or email (preserves audit; does not hard-delete).`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Mensajería (8)`,id:`mensajeria-8`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_whatsapp_templates`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s WhatsApp templates with components, variables, status, internal_type, language, quality_score, rejection_reason, is_in_pool and sync timestamps, plus totals { total, by_status }. Defaults to APPROVED; pass status=ALL for a complete terminal-readable approval dashboard, or select PENDING/REJECTED/etc. Filters: internal_type, language prefix, and q (name/body substring). For fresh Meta state call check_whatsapp_template_approvals.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_whatsapp_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Fetch one WhatsApp template in full detail: status, internal_type, language, category, components, variables, quality_score, rejection_reason (when Meta rejected it), whether it is in a cadence pool, and sync timestamps. Look it up by template_id (from list_whatsapp_templates) or by exact name.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`review_whatsapp_template_drafts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`templates`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read-only preflight for one or many WhatsApp template drafts. Use it as the conversational back-and-forth loop: generate drafts from the user requirement, call this tool, show errors/warnings and normalized_templates, revise, and repeat. It verifies the connected WhatsApp account, Meta formatting, examples for every variable, buttons, duplicate names/bodies, and cadence purpose. When all_valid=true it returns a review_id; show the exact normalized_templates to the user and get final sign-off before create_whatsapp_templates_batch.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_whatsapp_templates_batch`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`templates`}),`, `,_jsx(_components.code,{children:`review_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Submit 1-20 reviewed WhatsApp templates to Meta in one confirmed operation. REQUIRED FLOW: review_whatsapp_template_drafts → show normalized drafts and review_id → obtain explicit user sign-off → call this tool with those exact drafts, review_id, confirm=true. Never invent confirmation. Meta writes are not atomic, so the result reports every accepted, already-existing, or failed item; then use check_whatsapp_template_approvals to refresh approval states.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_whatsapp_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`body`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create a new WhatsApp template and submit it to Meta for approval (usually minutes to 48h). Templates are AGENT-SPECIFIC: first resolve the target agent (ask, or list_workflows) and read it with get_workflow so the copy matches that agent’s persona, goal, product, and language — never write generic copy. After creation, wire the template into THAT agent’s cadence with set_whatsapp_template_purpose plus set_template_pool / set_opening_templates, or it is never auto-used. Body text uses {{variable}} placeholders — variables cannot start/end the text nor be consecutive. Name must be lowercase_with_underscores. PREFER the canonical variable names Nexor auto-resolves at send time: {{nombre}} (lead first name), {{agente}} or {{ejecutivo}} (agent name), {{empresa}} (company), {{producto}} (product), and for meeting reminders {{fecha}}, {{hora}}, {{asesor}}, {{link_reunion}}. Other names still work but fall back to LLM resolution. channel_id is optional when the client has a single WhatsApp business account (use list_whatsapp_numbers to disambiguate).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`send_message`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`messages:send`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`channel`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Send an outbound message to a lead. WhatsApp/email/sms/imessage accept free text; outside the 24h WhatsApp window you must pass an approved template_id instead of text. channel=“sms” sends via the workflow’s SMS-enabled number. channel=“imessage” sends a blue-bubble iMessage via the workflow’s bound iMessage number (free text, no templates). channel=“call” triggers an outbound call. workflow_id is optional — it is resolved from the lead’s active run when omitted.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`send_whatsapp_template_bulk`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`messages:send`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_ids`}),`, `,_jsx(_components.code,{children:`template_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Send one APPROVED WhatsApp template to up to 500 leads in one operation. Each lead gets the same send as send_message with a template_id. REQUIRED FLOW: call with confirm=false first. It sends nothing and returns the template (name, language, category) and lead_count. Show that to the user, get explicit sign-off, then call again with the same arguments and confirm=true. Never invent confirmation. The confirmed call returns bulk_id right away and sends in the background, one lead every ~3 s per WhatsApp number (500 leads take ~25 min). Nexor’s warm-up caps do not apply, except on a number with RED quality or a strict safety profile: there, if a cap is hit, the remaining leads are marked not_sent and can be sent later with a new call. Meta’s own daily messaging limit for the number still applies. Variables resolve per lead automatically. workflow_id is optional: omit it to use each lead’s active workflow. Track progress with get_whatsapp_template_bulk_send.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_whatsapp_template_bulk_send`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`messages:send`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`bulk_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Progress of a bulk send started with send_whatsapp_template_bulk. Returns status (queued | running | completed), lead_count, pending, counts by lead status and every lead’s status: sent (with message_id), failed or not_sent (with error; rate_limit:* means the cap of a RED-quality or strict number was reached), ambiguous_delivery or delivery_pending. Never re-send to an ambiguous_delivery or delivery_pending lead: the message may already have arrived. Results are kept for 7 days.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Cuenta (8)`,id:`cuenta-8`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_lead_meetings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List a lead’s calendar events with host and meeting type.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meetings:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`starts_at`}),`, `,_jsx(_components.code,{children:`ends_at`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Log a booked meeting against an existing lead (no Google Calendar sync). Idempotent via external_event_id.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ingest_meeting_notes`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meetings:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`external_meeting_id`}),`, `,_jsx(_components.code,{children:`provider`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Attach an external transcript / summary / action items to an existing meeting. The meeting is resolved via calendar_event_id, external_calendar_provider + external_calendar_event_id, meeting_url, or lead_email (+ optional meeting_date) — at least one is required. external_meeting_id only dedupes the notes (idempotency), it does NOT locate the meeting. Reserved providers (fireflies, diio, gemini, retell) are rejected by the backend.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_conversion_types`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s active conversion types (optional; create_conversion works without one). A type is a named label for reporting plus a currency default; pass its id as conversion_type_id when a conversion should carry that label.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_conversion_type`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`name`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update a conversion type by name (idempotent upsert). Types are optional labels for reporting and a currency default (e.g. ‘Cuenta abierta’, ‘Primer depósito’); create_conversion works without one — untyped events are recorded and filterable on their metadata. Never deletes — deactivate with is_active:false; full removal is dashboard-only. / Crea o edita un tipo de conversión por nombre. Los tipos son etiquetas opcionales para reportes y una moneda por defecto; create_conversion no los necesita.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_conversion`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Record that a lead converted. Only a lead identifier is required (exactly one of lead_id, lead_email, lead_phone); conversion_type_id, amount, currency, description and metadata are optional. Put every fact about the conversion (plan, order id, seller, branch, campaign) in metadata: it shows on the lead, reaches Cloud Functions (conversion.detected) and is filterable with list_conversions. Nexor moves the lead to the agent/status configured on the conversion type, else the lead’s current agent, else its group (set_conversion_destination); with no destination anywhere the lead stays where it is. Credit: pass workflow_id to credit one agent, or master_workflow_id alone for a GROUP-level conversion (no agent credited, the group’s destination applies); an explicit target beats the type’s scope, which beats the lead’s active agent. / Registra que un lead convirtió. Solo hace falta un identificador del lead; tipo, monto, moneda, descripción y metadata son opcionales. Pon todos los datos de la conversión en metadata: se ven en el lead, llegan a las Cloud Functions y se pueden filtrar. Nexor mueve el lead al agente/estado del tipo, si no al del agente actual, si no al del grupo (set_conversion_destination).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_conversions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List conversion events for the client, typed and untyped, newest first. Filter by lead, agent (workflow_id), group (master_workflow_id), run, conversion type (conversion_type_id, or ‘none’ for untyped events only) and exact-match top-level metadata keys (metadata: { plan: ‘anual’ }). Use it to verify a conversion landed (list_conversions({ lead_id })) and for revenue/attribution questions. / Lista los eventos de conversión del cliente con filtros por lead, agente, grupo, tipo (‘none’ = sin tipo) y metadata.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_campaigns`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s campaigns.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Background jobs (10)`,id:`background-jobs-10`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_background_jobs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s background jobs (scheduled or forced lead automations).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_background_job`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`job_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Fetch a background job by id with its recent executions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_background_job`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`steps`})]}),_jsxs(_components.td,{children:[`Modo de ejecución `,_jsx(_components.code,{children:`dry_run`})]}),_jsxs(_components.td,{children:[`Create a background job: a scheduled/forced automation that filters leads and runs steps on each. trigger_type “cron” needs a cron_expression; “api” runs only when forced (run_background_job). A step can evaluate a date/condition — on a metadata key (evaluate_metadata), a collected funnel field (evaluate_field), or a tag (evaluate_tag) — and act, OR run an action directly. Actions include sending a WhatsApp template (send_message), set_lead_status, assign/transfer workflow. lead_filters/workflow_filters select candidates; max_leads_per_cycle caps each run (≤500); cooldown_minutes avoids re-acting on the same lead; dry_run logs without acting. See the `,_jsx(_components.code,{children:`steps`}),` field for the full vocabulary and `,_jsx(_components.code,{children:`lead_filters`}),` / `,_jsx(_components.code,{children:`workflow_filters`}),` for how candidates are selected. Filters and steps are validated server-side: an unresolvable one is rejected with code invalid_filters / invalid_steps and a details[] naming each problem. Common use: send a survey template once to everyone sitting in a given status.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_background_job`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`job_id`})}),_jsxs(_components.td,{children:[`Modo de ejecución `,_jsx(_components.code,{children:`dry_run`})]}),_jsxs(_components.td,{children:[`Update a background job (any subset of its config). Filters and steps are validated server-side (invalid_filters / invalid_steps with details[]). See `,_jsx(_components.code,{children:`lead_filters`}),` / `,_jsx(_components.code,{children:`workflow_filters`}),` for candidate selection and `,_jsx(_components.code,{children:`steps`}),` for the action vocabulary (send_message, evaluate_field, set_lead_status, …).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_background_job_active`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`job_id`}),`, `,_jsx(_components.code,{children:`active`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Pause or activate a Background Job without changing the rest of its configuration. Keep dry_run:true until execution logs are verified.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_background_job`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`job_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Delete a background job (cascades its execution history).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_background_job`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`job_id`})}),_jsx(_components.td,{children:`Aprobación del operador en instrucciones`}),_jsx(_components.td,{children:`Force-run a Background Job now (bypasses schedule/active timing). A non-dry-run job can mutate real leads; inspect config and get explicit operator confirmation first.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_background_job_executions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`job_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`A background job’s recent execution history (counts of candidates/acted/errored per run).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_background_job_execution`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`execution_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get one Background Job execution with every per-lead action, tool response, condition result, mutation result, skip, and error.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`analyze_background_job_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`template_name`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Inspect an APPROVED WhatsApp template used by send_message: shows each {{variable}}, whether it resolves automatically or via a workflow tool, and configuration errors.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Reportes (12)`,id:`reportes-12`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_reminder_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`date_from`}),`, `,_jsx(_components.code,{children:`date_to`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Reminder scheduling and WhatsApp delivery metrics by total, local day, hour and failure code. Use bucket=total for totals; never sum different buckets. Requires an explicit period of at most 93 days: ISO timestamps with timezone, date_to exclusive. Scheduled reminders (all channels) and tagged WhatsApp message attempts are separate populations; completed jobs do not prove delivery. Includes sent, delivered, read, failed, pending, unique/reached leads and delivery_rate (delivered / recorded attempts). Receipt status is current; untagged historical messages are excluded. Empty rows mean no matching records. Does not measure Teams confirmation or attendance.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`export_leads_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_ids`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create a complete CSV export of every active, non-test lead in one or more exact workflows, including each lead current stage. Use for requests such as “todos los leads”, “exporta”, “descarga” or “dame un CSV”. First resolve workflow names to their UUIDs with list_workflows, then pass those UUIDs here. Returns a signed download URL.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`query_insights`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Chart Insights numbers for leads, meetings and the team: rows, spec, range and notices. Prefer a template: it fixes the chart and default period. For period numbers use these ids: leads_new = distinct people created; task_entries = each entry into a task, transfers, reassignments, deleted tasks and HubSpot bulk imports included, split by entry_kind (never call an entry a lead); leads_contacted = distinct leads Nexor contacted, the usage count (contacts on HubSpot bulk-import runs not counted); leads_replied = distinct leads who wrote, answered a call or replied to an email; leads_uncontacted = new leads not contacted yet. Contacted and replied do not add up across days or agents; quote the total. Old ids keep their old meaning and numbers (see metric) and add a METRIC_REPLACED notice. period is in the client timezone; never compute dates for it. Without a template pass metric, x, group_by and a period or from/to. Pass the returned spec and range to the chart. For a period summary use get_period_report.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_period_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`date_from`}),`, `,_jsx(_components.code,{children:`date_to`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Server-computed summary for weekly or period reports. New leads: distinct people created. Task entries: each entry into a task, transfers, reassignments and HubSpot bulk imports included, split into new and existing leads. Contacted leads: same count as usage, a Nexor message or call, or a Nexor move to a contacted stage; a Nexor email counts only through that move, and a contact on a HubSpot bulk-import run is not counted. Replied leads: distinct leads who wrote, answered a call or replied to an email. Days are the account time zone; bare dates are whole days; at most 366 days. as_of before the window end means the period is not complete: say up to when it counts. Only tasks[].entries add up, to totals.entries; lead counts do not add up across tasks, so quote totals.leads. tasks[] kind deleted = deleted tasks, kind none = replies with no task. definitions states each unit. If it returns PERIOD_REPORT_UNAVAILABLE, retry once, then say the report could not be computed; never replace it with other tools.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_funnel_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Current snapshot of active runs per stage, with how many were contacted/connected, per workflow (or across all workflows). Use for “how many leads are at each stage right now” questions. date_from/date_to filter by lead creation in UTC days. These are not period totals; for a weekly or period summary use get_period_report.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_field_distribution`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`field_key`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Distribution of a captured lead field (e.g. a disqualification reason) with counts per value and an example evidence quote. Ideal for “top reasons why…” style questions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_call_stats`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Call statistics (dials, connected, discovery calls, duration) for a date range, totaled or broken down by day.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_lead_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Full report bundle for ONE lead: profile, current status, captured field values with evidence, insights, a summary of each call and scheduled tasks — all in one call. Prefer this over get_lead + get_lead_history when the goal is writing a report about a lead.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_engagement_metrics`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Engagement snapshot for a date range (default: trailing 7 days): total leads, new leads, meetings booked, and outbound/inbound activity. Test leads are excluded. messages_inbound/messages_outbound count MESSAGES, not leads: one lead can send many. For “how many leads replied” or “how many leads we messaged” use leads_inbound/leads_outbound (distinct leads over the same messages, window and filters); definitions states each unit. The counts span every messaging channel together, including call transcript turns (what the lead said on a call counts as inbound), and there is no channel filter, so never attribute a total to one channel. Emails (sent or replied) and Instagram/Messenger DMs are not counted (they live in a separate store). Days are the account time zone. Use it for activity questions; for a weekly or period summary use get_period_report, and for per-status funnel breakdowns use get_funnel_report.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_seller_assignment_metrics`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Analyze how the client’s leads are distributed across human sellers. Returns assignment coverage (total, assigned, unassigned and assignment rate) plus one row per seller with assigned leads, share of assigned leads, current funnel-stage breakdown, unanswered conversations, meetings booked/completed, conversions, conversion value and conversion rate. Assignment is a CURRENT-OWNER snapshot: historical activity is attributed to the lead’s current assigned_to seller, not necessarily the seller who owned it when the activity happened. Date filters select leads by created_at and activity by each event’s timestamp. Use list_team (people:read) when you need the complete user directory.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_team_performance`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`What each teammate did in a period. Per member: leads_assigned_now (current owner snapshot), leads_assigned_in_range (leads newly assigned to them in the period), human_messages (messages the teammate typed in Nexor; WhatsApp Business app replies cannot be tied to a person and are counted in unattributed.business_app_messages), escalations_resolved, escalations_overdue (escalations on their leads that went overdue in the period), escalations_answered and median_first_reply_minutes (median minutes from an escalation opening to the teammate’s first reply; null when none were answered). Default period is the last 30 days, max 92. For current lead ownership, meetings and conversions per seller use get_seller_assignment_metrics.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`analyze_lead_fields`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Statistical analysis of captured lead field values: numeric fields get min/max/mean/median/p25/p75/stddev/outlier_count, boolean/categorical fields get top-15 value frequencies. Filter by workflow, specific field keys, lead statuses, or an explicit lead list (max 50). Ideal for “what is the average budget of qualified leads” or comparing field values across a segment. If your filters match nothing, the response includes available_field_keys as a hint. For a simple one-field value distribution with evidence quotes, prefer get_field_distribution.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Reuniones (8)`,id:`reuniones-8`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_meetings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Page through the client’s meetings (booked calls/appointments) with lead, workflow, time and status for each. Ideal for questions like “what meetings are scheduled this week”, “which meetings were no-shows”, or listing a single lead’s meetings. For aggregate counts/rates use get_meeting_stats instead.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_meeting_stats`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Aggregate meeting statistics for a date range: totals per status (completed, no_show, cancelled, scheduled, rescheduled) plus show_rate, completion_rate and no_show_rate (0-1, null when the denominator is 0). Ideal for “what is our show rate” or “how many meetings did we book last month” questions. For individual meetings use list_meetings.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_meeting_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meetings:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`meeting_id`}),`, `,_jsx(_components.code,{children:`status`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Record the outcome of a meeting: ‘no_show’ (the lead did not attend) or ‘completed’. Runs the same side effects as the dashboard — the no-show re-engagement rule (when configured), the meeting webhook, Cloud Function events and the lead timeline — then reads the meeting back with its provider sync status. Idempotent: re-marking the same outcome is a no-op. meeting_id is the calendar event id from list_meetings / list_lead_meetings. To cancel a meeting use cancel_meeting; to move it use reschedule_meeting.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`cancel_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meetings:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meeting_id`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Cancel a booked meeting. DESTRUCTIVE and lead-facing: deletes the event from the host’s calendar (provider-first — if that fails nothing is cancelled), releases the slot, cancels lead and host reminders, emails the lead a cancellation and notifies the host, fires the meeting webhook and any cancellation re-engagement rule. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms cancelling this exact meeting. Meetings owned by an external provider (Calendly, GoHighLevel…) come back { status:‘skipped’ }. Reads the meeting back afterwards.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_workflow_slots`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`from`}),`, `,_jsx(_components.code,{children:`to`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Free booking slots for a workflow’s hosts between two dates, in the workflow’s timezone — the same slot engine the dashboard meetings board uses (host calendars, availability schedules, buffers, tier rules). Use it to verify a host produces slots and to pick a starts_at for book_meeting / reschedule_meeting. meeting_type_id defaults to the workflow’s first active meeting type; host_id restricts to one host (must be an active agent of the workflow).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`book_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meetings:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`host_id`}),`, `,_jsx(_components.code,{children:`starts_at`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Book a meeting for a lead with a host at starts_at, with the SAME side effects as booking from the dashboard: calendar event on the host’s connected calendar (Google/Outlook/Calendly), conferencing link, lead invite + confirmation email (unless invite_lead:false), host notification and reminders, availability block, and the workflow status transition. Pick starts_at from get_workflow_slots. A slot already taken returns CONFLICT with same-day alternatives. Pass the same idempotency_key to retry safely — a replay returns the original booking without booking again. Preview-then-confirm: when the lead will be invited, call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; call again with confirm:true only after the operator explicitly approves. The response includes provider_sync — check its status; ‘sync_failed’ means the row exists but the calendar write failed.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reschedule_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meetings:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meeting_id`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Move a booked meeting to a new time (starts_at, or a slot object from get_workflow_slots). Provider-aware: the host’s calendar event is updated first and the meeting link is kept when the host is unchanged; keep_host:false with a host_id rebooks on the new host (new link). The lead receives a reschedule email and the host is notified. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; call again with confirm:true only after the operator explicitly approves. Meetings owned by an external provider come back CONFLICT/MANAGED_EXTERNALLY. Returns the meeting read-back with provider_sync.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_meeting_host`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`meetings:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`meeting_id`}),`, `,_jsx(_components.code,{children:`host_id`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Reassign a booked meeting to another host (active agent of the same workflow) without changing the time. Provider-aware: the calendar event is moved to the new host’s calendar first (new organizer/link where the provider requires it); if that move fails nothing changes. The lead’s invite is updated. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; call again with confirm:true only after the operator explicitly approves. Returns the meeting read-back with provider_sync.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Transcripciones (2)`,id:`transcripciones-2`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_transcripts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Page through meeting transcripts: per row the lead, meeting date, title, a short summary (\u003c=500 chars), whether it has action items, and duration. Ideal for “what was discussed in recent meetings” or finding a transcript by keyword before drilling in with get_transcript.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_transcript`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transcript_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Fetch ONE meeting transcript by id: lead, meeting date, title, full summary, action items and duration. Set include_full_text/include_sentences only when you actually need the verbatim conversation — they can be very large. Use list_transcripts first to find the id.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Conversaciones (3)`,id:`conversaciones-3`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`search_conversations`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Search messages across ALL leads at once (get_lead_history covers a single lead). Results include the lead’s assigned human owner by default (assigned_to plus assigned_user id/name, or null); filter by assigned_to or unassigned_only, and use list_team (people:read) to resolve the full user directory. Two modes: normal mode returns matching messages with lead, channel, direction and a content preview — ideal for “who mentioned pricing this week”. Each normal-mode row is one MESSAGE, not one lead: to count leads, count distinct lead ids (a full page of limit rows means the count may be higher). unanswered=true instead returns leads whose LAST message is an unanswered inbound (waiting on a reply) — ideal for “which leads are waiting on us”.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_inbox_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Inbox workload per teammate, plus an unassigned row and totals. Counts: conversations (leads with at least one touchpoint), unanswered (the lead wrote last and no one concluded the conversation), escalated_open (the agent handed the lead to a human and it is still pending), escalated_overdue (leads with an unresolved escalation that passed its response deadline), human_takeover (a teammate took over and the AI is paused). Rows follow the lead’s current owner, sorted by unanswered. Use list_escalations for the escalations themselves, search_conversations with unanswered=true for the waiting leads, and get_team_performance for activity over a period.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_escalations`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List escalations: moments the AI agent handed a lead to a human (question, reason, channel). status: open (pending, default), overdue (pending and past its response deadline), resolved, or all. Each row has lead, agent, the lead’s current owner (assigned_to), overdue flag and, once closed, resolved_at, resolution_outcome and resolved_by. Open and overdue are sorted oldest first (longest wait on top); resolved and all newest first. Paginate with limit and offset against total. Use get_inbox_summary for counts per teammate.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Integraciones (1)`,id:`integraciones-1`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_integration_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`One-call health summary of the client’s integrations: connected CRMs (kommo, hubspot, gohighlevel, zoho and odoo; provider, status, connected_at, last_synced_at, error), counts of WhatsApp numbers, phone numbers and email senders, calendars[] (one per host calendar connection: user_id, name, provider google|outlook|calendly, status active|expired|revoked|error|needs_reauth, role, calendar_email, last_error, connected_at) and booking_providers[] (one per appointment-capable agent: provider native|calendly|gohighlevel|external_booker, binding summary, host_count, excluded_hosts = Calendly hosts with no event type bound, which booking silently skips) and google_sheets (active and paused automation counts; detail in get_google_sheets_status). Ideal for “is our CRM synced”, “is the calendar connected” or “why can’t the agent book” questions; drill into a channel with its own list tool (list_whatsapp_numbers, list_phone_numbers, list_email_senders).`})]})})]})}),`\n`,_jsx(Accordion,{title:`Números de teléfono (7)`,id:`numeros-de-telefono-7`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`search_available_numbers`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`country`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List phone numbers available to buy in a country (ISO code, e.g. “CL”, “MX”). Read-only preview — buying one is provision_phone_number.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_phone_numbers`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s voice and SMS phone numbers. workflow_id is the call owner; sms_enabled and sms_workflow_id independently show whether SMS is active and which agent receives it. A call assignment alone never proves the number can send SMS. Check get_account_readiness.account.sms_eligible before offering SMS: US/CA are eligible by default; other accounts require client.settings.sms_enabled === true. A number’s country is not the account eligibility test. This list does not report iMessage state; use list_imessage_numbers for that channel.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`provision_phone_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`phone_number`}),`, `,_jsx(_components.code,{children:`country_code`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Buy and provision a phone number for the client (Twilio purchase + Retell import). Billable and capped per client (default 3 active). Pass a workflow_id to bind the number to that workflow (workflow-scoped); omit it for an account-wide client-scoped number. Fails with NUMBER_LIMIT_REACHED at the cap — release or deactivate one first. Buying does NOT make the number answer inbound calls: for an agent’s voice task, once that task is active and does not exclude calls (identity and voice come from the agent), connect it with set_inbound_entry_point (channel “phone”, id = the returned number id, destination {type:“group”, id: the agent id}), which also turns the agent’s router on. Never use assign_number_to_workflow for a task that belongs to an agent.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`assign_number_to_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Reassign one of the client’s numbers to a workflow (workflow-scoped) or, with no workflow_id, make it the account-wide client-scoped number. Only reassigns within the client’s own workflows. This does NOT connect inbound calls, and a task that belongs to an agent (has master_workflow_id) is never bound here: connect the number to its agent with set_inbound_entry_point (channel “phone”, destination {type:“group”, id: the agent id}).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_number_sms`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`number_id`}),`, `,_jsx(_components.code,{children:`enabled`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Activate SMS on an existing active Twilio number and bind its separate sms_workflow_id to the intended agent. First check get_account_readiness.account.sms_eligible: US/CA accounts are eligible by default; a non-US/CA account needs client.settings.sms_enabled === true. Eligibility does not mean a number is ready. Read list_phone_numbers or get_number_health after activation and verify sms_enabled === true and sms_workflow_id matches the agent. workflow_id only routes calls. Telnyx numbers cannot carry SMS.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_number_health`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Non-destructive health/read-back for one of the client’s numbers: reports the number’s active state, provider, its call binding and its SMS binding (enabled + owner workflow), and any issues — without placing a call or sending a message.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`deactivate_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Soft-deactivate one of the client’s numbers (stops it being used; does NOT release it from Twilio, so billing continues). Reversible.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Números de WhatsApp (11)`,id:`numeros-de-whatsapp-11`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_whatsapp_numbers`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s WhatsApp numbers with connection status, quality rating, messaging-limit tier, account restrictions, last health-check time, connection type, and bound workflow.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`connect_whatsapp_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Start connecting a WhatsApp number for the client: returns a hosted Kapso setup link the client opens to finish onboarding (choose dedicated/coexistence, Meta login). IMPORTANT — give the returned setup URL to the user DIRECTLY as a clickable link (e.g. “Connect your WhatsApp number here: \u003curl>”) and tell them to open it; the authorization happens entirely on that page and CANNOT be completed in chat, so never withhold the URL or claim you’ll connect it for them. Works even when a number is already connected — this adds a NEW one (several allowed per client). Once the user finishes on the hosted page, Nexor records the number and registers its inbound webhook + events automatically (no extra call needed); confirm with list_whatsapp_numbers. Capped per client (default 10) — fails with WHATSAPP_LIMIT_REACHED at the cap. Then bind it with assign_whatsapp_to_workflow.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`assign_whatsapp_to_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Bind one of the client’s WhatsApp numbers to a workflow (agent) — this is what makes inbound WhatsApp messages on that number reach the agent. Omit workflow_id to unbind. Makes the number the default for that workflow.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`deactivate_whatsapp_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Soft-deactivate one of the client’s WhatsApp numbers (stops it being used; reversible; does NOT disconnect it from Kapso).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`rename_whatsapp_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`number_id`}),`, `,_jsx(_components.code,{children:`internal_name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set the operator-facing internal label of one of the client’s WhatsApp numbers (does not change the WhatsApp display name shown to leads — for that use set_whatsapp_display_name). Pass an empty internal_name to clear it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reconcile_whatsapp_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Re-check a WhatsApp number against the provider and repair its route status — the fix for a number that shows a broken/invalid connection or after a failed setup return. Returns the refreshed state; run get_whatsapp_health afterwards to confirm. If the number needs a fresh Meta authorization, reconnect via connect_whatsapp_number (a new hosted setup link).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_whatsapp_business_profile`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the WhatsApp business profile shown to leads for one number: display name, its Meta review status (APPROVED / PENDING_REVIEW / etc.), and profile picture. Use before set_whatsapp_display_name to see the current name and whether a review is pending.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_whatsapp_display_name`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`number_id`}),`, `,_jsx(_components.code,{children:`display_name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Submit a new WhatsApp display name (the name leads see) to Meta for review. Must be 3-256 characters. Meta review can take minutes to a couple of days; the response reports displayNameStatus=PENDING_REVIEW. Re-check with get_whatsapp_business_profile.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_whatsapp_profile_photo`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`number_id`}),`, `,_jsx(_components.code,{children:`image_url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace the WhatsApp profile picture for a number from a public HTTPS image URL (Nexor ingests it into Meta). The image must already be hosted at an https:// URL — this tool does not upload local files.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_whatsapp_business_verification`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the Meta business verification of the business that owns one WhatsApp number: status (not_verified / in_review / changes_requested / verified / attempts_exhausted / ineligible …), the business legal name Meta expects (business_name), attempts_left of 3, whether a new submission is allowed, accepted file types/limits, and the latest submission with Meta’s rejection_reasons or a last_error (file could not be downloaded, no attempt used). Verified businesses get higher messaging limits. Only numbers connected through Nexor can be verified here; a sandbox number returns not_found.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`submit_whatsapp_business_verification`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`number_id`}),`, `,_jsx(_components.code,{children:`documents`}),`, `,_jsx(_components.code,{children:`authorized`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Send 1-3 documents (PDF/JPG/PNG, max 5 MB each, public HTTPS URLs) to Meta to verify the business that owns a WhatsApp number. Together they must show the legal name AND address exactly as business_name from get_whatsapp_business_verification. IRREVERSIBLE: each submission Meta receives uses 1 of 3 lifetime attempts, so first tell the customer the documents go to Meta and use one attempt, get their explicit confirmation, then pass authorized=true. Returns the submission: state pending (Meta reviews in minutes to hours; re-check with get_whatsapp_business_verification) or failed with last_error (file unreadable, no attempt used).`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Salud de WhatsApp (3)`,id:`salud-de-whatsapp-3`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_whatsapp_health`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Live health and risk for one WhatsApp number. Returns quality_rating (GREEN/YELLOW/RED — RED means the account is at risk of Meta restriction), messaging_health (can_send_message AVAILABLE/LIMITED/BLOCKED with per-entity WABA/phone errors and suggested fixes), messaging_limit tier + daily ceiling, route_verification (whether the provider route is valid or needs reconnect/resync), and inbound_traffic: messages the provider received vs messages that reached Nexor in the last 7 days, with a verdict. no_inbound_at_provider means nobody is writing to this number, so the ads or the number the business publishes point to another one (a configuration fix, not an outage); provider_received_not_in_nexor is a real delivery incident to escalate; receiving means inbound flows; provider_unavailable means the provider could not be read, so do not conclude either way. This is the tool for ‘is my WhatsApp at risk / why can’t it send / what’s my sending limit / leads say they write and the agent never answers’. One call triggers several Meta calls, so results are briefly cached — don’t poll it in a tight loop.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_whatsapp_response_timing`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the client’s inbound WhatsApp debounce (buffer window): how long Nexor waits to group a lead’s rapid consecutive messages into a single AI reply. Returns buffer_window_seconds, whether it’s the default, and the allowed min/max.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_whatsapp_response_timing`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`buffer_window_seconds`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set the client’s inbound WhatsApp debounce (buffer window) in seconds — larger groups more messages into one reply (more natural, slightly slower); smaller replies faster but may fragment. The change fans out to every active number’s webhook; the response reports per-number apply status. Typical range is 5-60 seconds.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Números de iMessage (8)`,id:`numeros-de-imessage-8`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_imessage_offer`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the iMessage number add-on offer for the client BEFORE provisioning: the recurring monthly price (USD), the amount charged today (dueTodayUsd — the full first month, never prorated; 0 in a sandbox/test environment where no charge happens), whether the client can buy (canPurchase) and if not why (reason, e.g. no_subscription / trial_not_allowed / no_payment_method / external_billing / purchase_disabled), the card on file (brand + last4), how many iMessage numbers they already own, and a state of active | purchasable | unavailable. ALWAYS call this first and confirm the recurring charge with the user before calling provision_imessage_number. If state is “unavailable” the add-on is not enabled for this client — do not attempt to provision.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_imessage_numbers`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`List the client’s iMessage numbers with their E.164 phone number, setupStatus (provisioning | ready | failed), setup error if any, the workflow (agent) each is bound to, display identity (displayFirstName, displayLastName, avatarUrl), and active state. imessageWorkflowId is the single OWNER; `,_jsx(_components.code,{children:`owner`}),` adds its name and agent group (masterWorkflowId, masterName) and `,_jsx(_components.code,{children:`sharedWith`}),` lists every sibling agent in that group that already sends and receives through this number without owning one — a number is shared across an agent group exactly like WhatsApp, so an agent listed in sharedWith is connected and needs no assign call. Use this to poll until a freshly provisioned number reaches setupStatus “ready”, and to find a number id for get_imessage_number, assign_imessage_to_workflow, set_imessage_display_name or set_imessage_profile_photo.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`provision_imessage_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`accept_charge`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`accept_charge: true`})}),_jsx(_components.td,{children:`Buy and provision a NEW iMessage number for the client. THIS CHARGES MONEY: it charges the FULL first month today (never prorated) and adds a recurring monthly line (see get_imessage_offer for the exact price) to the client’s Stripe subscription. You MUST first call get_imessage_offer, show the user the recurring price and the amount charged today, and get their explicit confirmation — only then call this with accept_charge:true. Fails with imessage_consent_required if accept_charge is not true, and with an eligibility code (e.g. imessage_no_subscription, imessage_no_payment_method, imessage_purchase_disabled) when the client cannot be charged. The charge is idempotent per call. On success the number provisions asynchronously — poll list_imessage_numbers until setupStatus is “ready”, then bind it with assign_imessage_to_workflow.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`assign_imessage_to_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Bind one of the client’s iMessage numbers to a workflow (agent) — this is what makes inbound iMessages on that number reach the agent. The number is then shared by the agent’s whole agent group (master_workflow_id): every sibling sends and receives through it automatically (new inbound leads land on the owner agent; existing leads follow their active run), so bind ONCE per group and never re-assign it to a sibling that list_imessage_numbers already shows in sharedWith. Unless a display identity was set by hand (set_imessage_display_name), the number’s display name follows the owner agent’s persona. Omit workflow_id to unbind (the number stays owned/billed, just detached). A group (or a standalone agent) keeps at most one iMessage number, so binding a number to an agent whose group already has one replaces it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_imessage_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Read one iMessage number’s live details: E.164 phone number, setupStatus (provisioning | ready | failed) and setup error, the workflow (agent) it is bound to plus its agent group (`,_jsx(_components.code,{children:`owner`}),`) and the sibling agents sharing it (`,_jsx(_components.code,{children:`sharedWith`}),`), and the blue-bubble display identity leads see — firstName, lastName, avatarUrl — plus active state. whatsappStatus “ready” means the same line also runs WhatsApp and shares this identity (whatsappName / whatsappAvatarUrl show what WhatsApp currently displays). Use before set_imessage_display_name / set_imessage_profile_photo to see the current identity. Fails with imessage_number_not_found for a number outside this client.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reconcile_imessage_number`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Re-check one iMessage number against Dial (the provider) and repair its local setupStatus — the fix for a number stuck on “provisioning” or “failed” in list_imessage_numbers even though it is actually ready. list_imessage_numbers reads a locally cached status that is normally advanced only by Dial’s setup webhook, so a single missed webhook leaves the number permanently desynced; get_imessage_number reads the live truth from Dial but does not persist it. This tool fetches the live Dial status and writes it back, so the list/capabilities path matches reality. Returns the refreshed number; re-run list_imessage_numbers or get_imessage_number afterwards to confirm. Fails with imessage_number_not_found for a number outside this client.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_imessage_display_name`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`number_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set the first and/or last name shown beside an iMessage number’s messages in recipients’ Messages apps (max 30 characters each; pass an empty string to clear one). Propagates to devices within minutes. Once set by hand the identity is authoritative: it no longer follows the agent persona when the number is (re)assigned. If the line also runs WhatsApp (whatsappStatus “ready”) the same name is written to its WhatsApp profile as one line — first + last joined must be at most 25 characters, otherwise the call fails with fieldErrors.whatsappName = too_long and NOTHING changes on either channel. Fails with imessage_number_invalid_fields (+ fieldErrors) when a value is rejected. Read the current identity first with get_imessage_number.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_imessage_profile_photo`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`imessage:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`number_id`}),`, `,_jsx(_components.code,{children:`image_url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace the profile photo shown beside an iMessage number’s messages from a public http(s) image URL (jpeg/png/gif/webp, ≤5 MB; the platform mirrors it and returns its stable avatarUrl). Photos can be replaced but NOT removed. This tool does not upload local files — the image must already be hosted; the dashboard’s iMessage identity editor can upload a file from the operator’s computer instead. If the line also runs WhatsApp (whatsappStatus “ready”) the photo is applied to both profiles at once, so it must also satisfy WhatsApp’s rules — a square JPG or PNG between 192 and 640 px — or the call fails with fieldErrors.whatsappAvatarUrl and NOTHING changes on either channel. Propagates to devices within minutes.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Remitentes de correo (9)`,id:`remitentes-de-correo-9`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_email_senders`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s registered email senders (domains and individual mailboxes) with their verification status and whether each can send. Each domain sender carries dns_records[]: the SES records (ownership token, DKIM, return path) are verified by AWS and gate can_send; the SPF (@) and DMARC (_dmarc) entries are checked by Nexor against public DNS on each verify and never affect can_send — status not_set means the record is absent in DNS, mismatch means an SPF exists without include:amazonses.com, verified means a valid policy exists (a third-party DMARC counts). last_checked_at is the time of that lookup.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`register_email_domain`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sender_email`}),`, `,_jsx(_components.code,{children:`sender_name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Register a sender under a domain the client owns (e.g. `,_jsx(_components.a,{href:`mailto:sales@acme.com`,children:`sales@acme.com`}),`), for sending at scale. Returns the DNS records (SPF/DKIM) the client must add to that domain — adding them is a human step outside this tool. Once added, call verify_email_domain, or poll check_email_sender_status.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`register_email_sender`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sender_email`}),`, `,_jsx(_components.code,{children:`sender_name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Register a personal mailbox (e.g. Gmail/Outlook) as a sender via a magic-link. Nexor emails a verification link to that mailbox — the mailbox owner must open it and click to confirm; that click is a human step outside this tool. Poll check_email_sender_status afterwards to see when it completes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`check_email_sender_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sender_email`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Check whether a sender’s verification (DNS records or magic-link click) has completed and it can now send. Verification itself happens outside this tool, by a human — use this to poll the result after register_email_domain or register_email_sender.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`verify_email_domain`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`domain`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Trigger a DNS verification check for a domain sender, AFTER the client has already added the DNS records returned by register_email_domain. This tool only checks — adding the records is a human step outside this tool.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_email_domain_dns_records`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`domain`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Re-fetch the DNS records (SPF/DKIM) for a pending domain sender — e.g. if the client lost the ones returned by register_email_domain. Only reads; adding the records to the domain is a human step outside this tool. SPF and DMARC come back with a verdict from Nexor’s own public-DNS lookup (not_set = absent in DNS, mismatch = SPF without include:amazonses.com, verified = valid policy), never from AWS.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`resend_email_verification`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sender_email`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Resend the magic-link verification email for a pending sender mailbox.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`rename_email_sender`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sender_id`}),`, `,_jsx(_components.code,{children:`sender_name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Change the display name leads see on emails from one of the client’s registered senders (the From name, e.g. “Sophie” in Sophie \u003c`,_jsx(_components.a,{href:`mailto:hi@acme.com`,children:`hi@acme.com`}),`>). Only the name changes: the address, verification and DNS stay as they are and the sender keeps sending without interruption. Takes sender_id (from list_email_senders) and sender_name. Never delete and re-register a sender just to change its name — deleting a domain sender removes the domain’s verification.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_email_sender`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`senders:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sender_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Remove a registered sender. To change only the display name use rename_email_sender instead; deleting a domain-owner sender removes the domain’s verification at the provider and it must be re-verified with DNS.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Pools de templates (8)`,id:`pools-de-templates-8`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_template_pool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read a workflow’s WhatsApp template pool state in one call: the active rotation pool (name, weight, category), the opening-template config (mode auto|only|subset + names), and what’s available to add (approved openers and all templates with status + internal_type). Use it before set_template_pool / set_opening_templates to see current state. An empty rotation pool does not mean follow-ups stop: they fall back to Nexor-managed backup templates (names starting with nx_) and approved follow-up templates. Before saying templates are not going out, check the lead’s history (get_lead_history lists template sends).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_template_pool`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`templates`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace a workflow’s WhatsApp cadence template pool with EXACTLY the given list — full-state replace, so a single call covers adding AND removing (retiring) templates atomically: anything omitted is removed from the pool. Each entry: { name, weight? (0.01-10, default 1) } and must be an APPROVED template on the client’s WhatsApp business account. Read the current pool with get_template_pool first, then send the complete desired list.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_opening_templates`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`mode`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Configure which WhatsApp templates a workflow may use as the OPENING (first-contact) message. mode ‘auto’ lets the cadence pick any eligible opener; ‘only’ locks it to exactly one template (template_names must have exactly 1 entry); ‘subset’ restricts it to the given names (at least 1). Names must be APPROVED templates with internal_type greeting, opening, legacy_greeting or outbound. Fails with WOULD_EMPTY_OPENING if the change would leave the workflow with no valid opener.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sync_whatsapp_templates`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Pull the latest template state from Meta for all of the client’s WhatsApp business accounts: imports new templates, refreshes statuses (PENDING -> APPROVED/REJECTED) and quality scores. Returns { synced, created, updated, channels, warnings }. Run it when a template you expect is missing from list_whatsapp_templates or its status looks stale.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`check_whatsapp_template_approvals`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Terminal-friendly approval inspection. By default first syncs every connected WhatsApp business account from Meta, then returns ALL templates in one response with status, quality_score, rejection_reason, timestamps, and totals.by_status. Set refresh=false only when you intentionally want the cached local state. Use after batch submission until each template is APPROVED or REJECTED; rejected drafts can be revised through review_whatsapp_template_drafts under a new name.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_whatsapp_template_approval_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`THE tool for “have my templates been approved?” / “how long until they’re approved?” — in Nexor a bare “template” ALWAYS means a WhatsApp template, so route those questions here. Refreshes from Meta by default, then returns a decision-ready summary — NOT a raw dump: counts { total, approved, pending, rejected, … }, all_approved / none flags, each PENDING template with how long it has actually been pending (pending_hours, so you answer with real data instead of a guessed ETA), longest_pending_hours, some_pending_over_24h, each REJECTED template with its Meta reason, and review_window { typical, max_hours }. Also returns numbers[] — ONLY the verified, fully-connected WhatsApp number(s) (a number still finishing setup is excluded), each with phone_number and whether it is bound to an agent. Templates only exist for a fully connected WhatsApp number: if none is connected the response is { no_whatsapp: true, numbers: [] } — then tell the customer to connect a WhatsApp number first (connect_whatsapp_number), do NOT say they have zero templates. Otherwise answer with the counts + the canonical window (approval is asynchronous and Meta-owned: usually minutes to ~1 hour, occasionally up to 24-48h) — never invent a precise time. If some_pending_over_24h is true, say it is taking longer than usual. For the full raw list use list_whatsapp_templates / check_whatsapp_template_approvals; for one template use get_whatsapp_template. Set refresh=false to skip the Meta sync and read cached state.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_whatsapp_template_purpose`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`template_id`}),`, `,_jsx(_components.code,{children:`internal_type`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Assign the cadence purpose of an existing or Meta-synced WhatsApp template. This is how an already-connected account can make a pre-existing template eligible for opening, follow-up, reminder, or reactivation behavior without recreating it. The template content and Meta approval status are unchanged. Use get_whatsapp_template first; only APPROVED greeting templates can subsequently be selected by set_opening_templates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_whatsapp_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`whatsapp:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`template_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Soft-delete a WhatsApp template (tenant-scoped; best-effort delete on Meta too). Preview-then-confirm flow: call with confirm=false first — it returns { requires_confirm: true, template: { name, status, internal_type, is_in_pool } } and writes NOTHING, so you can show the user what would be removed (especially whether it is still in a cadence pool). Only after reviewing that preview, call again with confirm=true to actually delete; the response reports removed_from_pools and meta_deleted.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Análisis (3)`,id:`analisis-3`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_analysis_snapshot`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Precomputed conversation-quality snapshot for the client (or one workflow): eval summary (scored conversations, average score, per-dimension averages, failure buckets), accuracy signals, seeker findings, the worst conversations (with reasons, transcript excerpts for the top 3) and system context. Fast — use it FIRST for “how is the agent doing” questions; only use run_deep_analysis when you need a fresh investigation of a specific question.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_analysis_findings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the analysis engine’s stored findings/corrections/preferences for the client: title, summary, class, status, client impact, confidence and recommendation. Defaults to status ‘open’ (actionable backlog); pass status ‘all’ or a specific status to see history. Findings are produced by prior analysis runs — use run_deep_analysis to generate new ones.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_deep_analysis`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`question`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Run a fresh deep analysis of recent conversations to answer a specific question (e.g. “why are leads ghosting after the price question”). LONG-RUNNING: this call is synchronous and may take 1-3 minutes — tell the user it is in progress and do not retry while waiting. Expensive and rate-limited to 5 runs per day per API key; when capped it returns { rate_limited: true } with the most recent run’s findings instead. For a quick health overview prefer get_analysis_snapshot.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Diagnóstico de leads (9)`,id:`diagnostico-de-leads-9`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_test_conversations`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the most recent Playground test conversations (the operator’s own tests, which list_leads hides), newest activity first: lead_id, name, the agent mode it ran on (workflow_id, workflow_name), start and last activity, and the last messages. Use it whenever the operator says they tested the agent and something failed or looked wrong: find the test, then read what the agent actually did with list_lead_turns / get_lead_turn on that lead_id BEFORE changing any prompt or tool. Never diagnose a failed test from the saved configuration alone. Filters: workflow_id, limit (1-25, default 10).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`send_test_message`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`message`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Run one simulated test turn against an agent mode, like Playground: you write as the lead, the agent answers. Nothing is ever sent on a real channel. Start a conversation with workflow_id (plus optional channel and metadata: first_name, last_name, email, phone set the test lead; other keys become lead data), then continue it by passing the returned conversation_id. Returns reply, messages, tool_calls (name, args, success, error), status (stage key) and conversation_id, which works with list_lead_turns / get_lead_turn. The agent’s HTTP tools run for real with the X-Nexor-Playground: true header. One turn at a time per conversation: on a CONFLICT that says the previous turn is still running, wait and resend; any other CONFLICT names why the agent refused the turn and resending will not change it. On RATE_LIMITED (30 turns/min per key) wait the seconds it says. If a turn fails or times out it may still finish: read it with list_test_conversations before resending.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_lead_turns`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List a lead’s agent turns (one turn = the agent processing one message): trace id, timestamp, channel, model, message/response previews, tools used, errors, latency and token usage. Two modes: (1) paging — use limit + next_before_ts to walk back in time; (2) search — pass message_text, provider_message_id, direction or around_ts to locate WHICH turn handled a specific message (the response includes match.trace_id with a confidence label). Pass include_detail:true to get the full get_lead_turn detail of the matched turn (search mode) or the newest turn (paging mode) as turn_detail in the same call.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_lead_turn`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`trace_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Full detail of one agent turn (by trace_id from list_lead_turns): metadata (model, tokens, duration, errors), the lead message + final response + agent reasoning, whether internal content leaked, tools used, the final gate decision, LLM outputs and a step-by-step timeline. Secrets are redacted and URLs reduced to host-only. This is THE tool for “why did the agent say that” questions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_lead_run_state`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`A lead’s current automation state in one call: the active workflow run (status, pause/human-takeover/escalation/dispatch state, next action time), the agent’s memory (summary + recent interaction log) and the collected field values with confidence + evidence quotes. Use include to fetch only some sections. This is the first stop for “why isn’t the agent messaging this lead” questions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_lead_verdicts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lead_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Quality-judge verdicts and alert events for a lead’s conversations: per-turn judge results (pass/fail, score, severity, reason) plus raised alerts (ai / workflow-config / whatsapp categories, redacted previews). Filter by trace_id or run_id to inspect one turn/run, or by a time window. Pairs with get_lead_turn to see WHAT the agent did vs how it was judged.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_lead_call`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`lead_id`}),`, `,_jsx(_components.code,{children:`call_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Full detail of one call with a lead (call id from get_lead_history, which lists the calls): status, duration, success flag, sentiment, disconnection reason, summary, transcript and the AI call analysis.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_offers`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`The client’s offer catalog (products/services the agent can pitch): name, description, category, status, source and top items. Pass workflow_id to see only the offers linked to that workflow (an empty result means the workflow has none linked — there is no fallback to the full catalog). Pass offer_id for one offer’s detail including its items.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_client_profile`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`The authenticated client’s business profile as the agent sees it: name, industry, company size, country (+ secondary countries), timezone, language, website, primary communication channel, lifecycle stage, notes and which settings keys are configured. Useful context before diagnosing agent behavior or drafting client-facing copy.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Estado de herramientas (1)`,id:`estado-de-herramientas-1`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_tool_health`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`How the agent’s tools behaved in REAL conversations and calls over the last N days: per tool calls, ok, failed, empty, blocked, rates, last ok/failure, top errors and redacted samples of args and results. Use it BEFORE saying a tool or integration works, when a client says the agent ‘doesn’t give the info’ or ‘doesn’t book’, and to find silently failing tools (only_problems=true). Filters: workflow_id, tool_name, channel, days (1-14, default 7). Playground/test traffic is excluded; include_test=true returns it separately, labeled, in test_tools: read that before launch, when there are no real conversations yet. Reading it: many empty results on a search/lookup tool can be normal (new patient not found), so check the sample args before blaming parameter names or filters; 401/403 = expired or wrong credential; blocked = the platform stopped the call before the integration (excluded from rates); no rows = never called, which proves nothing. truncated=true: scan capped (window.scanned_from); narrow filters.`})]})})]})}),`\n`,_jsx(Accordion,{title:`Documentación (1)`,id:`documentacion-1`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`search_docs`})}),_jsx(_components.td,{children:`Clave autenticada`}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Search Nexor’s product documentation (bundled advanced-feature guides + the live docs site) or read one doc. Pass EXACTLY ONE of: q (search — returns up to 6 results with title, description and path) or path (read — returns the doc content, truncated at ~9000 chars with a marker). Typical flow: search with q and read_top:true to get the best-matching result’s content (top_result, from top_result_path) in the same call; read another path only if that one is not the answer. Public docs only — no tenant data.`})]})})]})}),`\n`,_jsx(Accordion,{title:`Pipeline (2)`,id:`pipeline-2`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reorder_workflow_statuses`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`ordered_status_keys`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace the order of every mutable status after the protected Lead created, Contacted, and Engaged stages. First call get_workflow, then pass every remaining persisted status key exactly once in ordered_status_keys; omission, duplication, an unknown key, or a changed pipeline fails without mutation. The backend keeps the protected head at sort_order 0–2 and assigns the submitted tail contiguously from 3. Read back with get_workflow and compare the exact order before reporting success. Do not include synthetic Discarded stages.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_pipeline_impact`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`reports:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Impact preview of a workflow’s pipeline BEFORE a destructive change (deleting statuses, moving leads, deactivating the workflow): total board-visible leads bucketed by run state — early, active, settled (terminal/inactive collapsed), ai_paused and awaiting_human — plus the top statuses by count. Use it to tell the user “this affects N active leads” and get confirmation. For per-status funnel metrics use get_funnel_report instead.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Bases de conocimiento (15)`,id:`bases-de-conocimiento-15`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_knowledge_bases`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s knowledge bases with status and document/size counts. Pass workflow_id to see only the KBs attached to that workflow, ordered by retrieval priority (each row then includes its priority). Ideal for “what knowledge bases exist”, “which KBs feed this workflow’s agent”, or finding a KB id before attaching or adding documents.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_knowledge_base`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`name`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create a new, empty knowledge base for the client. After creating, add content with add_kb_document and make it live for an agent with attach_knowledge_base. Ideal for setting up a fresh document collection (e.g. “Pricing FAQ”, “Product docs”).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_knowledge_base`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`knowledge_base_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Edit a knowledge base’s own fields: its name, its description (what it contains / when the agent should use it), and its status (‘archived’ shelves it so agents stop using it without deleting; ‘active’ restores it). Provide only the fields you want to change; at least one is required. This is the ONLY way to change a KB’s description or rename a KB, there is no dashboard-only field. Returns 404 if the KB does not belong to this client. Ideal for “rename this KB”, “set its description to …”, or “archive the old pricing KB”.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`attach_knowledge_base`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`knowledge_base_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Attach an existing knowledge base to a workflow so that workflow’s agent can retrieve from it. priority orders retrieval when several KBs are attached (lower = consulted first); omitted, it appends after the current lowest-priority KB. Returns 409 CONFLICT if already attached, 404 if the KB does not belong to this client. Ideal for “make the pricing KB available to the sales workflow”.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`detach_knowledge_base`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`knowledge_base_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Detach a knowledge base from a workflow. The KB and its documents are NOT deleted — the workflow’s agent just stops retrieving from it. Returns 404 if the KB was not attached to that workflow. Ideal for “stop the sales agent from using the old pricing KB”.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_kb_documents`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`knowledge_base_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Page through the documents inside one knowledge base: name, source type (file/web/text), processing status, chunk count and timestamps. Ideal for “what’s in this KB”, checking whether a just-added document finished processing (status ready), or finding a document id to rename/delete.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_kb_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`text`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Add a text document to a knowledge base. The text (max 200KB) is chunked and embedded asynchronously — the response is { document_id, status: “pending” }; poll list_kb_documents until status is “ready”. Ideal for ingesting FAQs, policy text, product descriptions or any copy the agent should be able to cite.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`rename_kb_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`document_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Rename a document and/or replace its text content — this is the ONLY tool that rewrites a document’s text, there is no separate update-text tool. Pass name to rename (embeddings untouched), text to replace the content entirely (max 200KB), or both. Changing content re-indexes the document: it is re-chunked and re-embedded asynchronously, status goes back to ‘pending’ and returns to ‘ready’ when done (poll list_kb_documents). Only text documents (source type ‘text’) accept new content: file/web documents return 409. Returns 404 if the document is not in that KB. Ideal for tidying names after bulk ingestion or updating a FAQ/pricing doc in place.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_kb_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`document_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Permanently delete a document (and its chunks/embeddings) from a knowledge base. The agent stops retrieving it immediately. Returns 404 if the document is not in that KB. Ideal for removing outdated or wrong content the agent keeps citing.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_kb_upload_url`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`filename`}),`, `,_jsx(_components.code,{children:`content_type`}),`, `,_jsx(_components.code,{children:`size_bytes`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Step 1 of 2 to put a FILE in a knowledge base: mint a short-lived, signed upload target for one file. Upload it with an HTTP POST to upload_url as multipart/form-data: send every entry of the returned fields as form fields, then the file itself as a final field named “file”. Then call add_kb_file_document with the returned storage_path to register it. Supported formats: PDF, TXT, MD, CSV, XLSX, PNG, JPG, WEBP (images are read with OCR and a visual description), max 100MB — storage rejects a larger body. Returns { upload_url, method, fields, storage_path, expires_in_seconds }; the target expires and grants write access to that one object only.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_kb_file_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`storage_path`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Step 2 of 2: register a FILE (PDF, TXT, MD, CSV, XLSX, PNG, JPG or WEBP, max 100MB) you already uploaded to the target from create_kb_upload_url, by its storage_path. This tool never accepts file bytes, base64 or a URL, and cannot read a local path. Text is extracted, chunked and embedded asynchronously: the response is { document_id, status: “pending” }, and the document only starts answering questions once get_kb_document reports “ready”. For plain text you already have, add_kb_document is one call instead of three.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`import_kb_website`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Crawl a public website and ingest it into a knowledge base: Nexor follows up to 30 pages from the given URL, writes their text as one document plus a generated company profile, and embeds both. Asynchronous — poll list_kb_documents or get_kb_document until status is “ready”. EXPENSIVE and rate-limited to 3 crawls per day for the whole account, shared by all its API keys, so do not re-crawl a site that is already ingested. Two different refusals, two different waits: “Rate limit exceeded” means the daily budget is spent (it carries crawl_budget with resets_at — tell the user to try again tomorrow, retrying sooner cannot succeed), while “Too many requests” means another crawl for this client is still running (retry in a few minutes). Only public http(s) URLs are reachable. Ideal for “load our website into the agent’s knowledge”.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_kb_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`document_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read one document: its name, source type (file/web/text), chunk count, timestamps, any ingestion error, and its status — pending, processing, ready or error. The status is the honest one: a document is reported ready only once both its text and its embeddings are in place, so it is answerable by the agent exactly when this says “ready”. Use it to follow an upload, an import or a reindex through to completion. Returns 404 if the document is not in that KB.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reindex_kb_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`knowledge_base_id`}),`, `,_jsx(_components.code,{children:`document_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Re-run ingestion for one document: it is re-extracted, re-chunked and re-embedded from its original source, status returns to ‘pending’ and then ‘ready’ (poll get_kb_document). Use it to recover a document stuck in ‘error’, not as routine maintenance: the old chunks are deleted before the new ones are written, so while it runs the agent retrieves fewer chunks from this document (never wrong ones). Content is unchanged — to replace it, pass text to rename_kb_document. Returns 404 if the document is not in that KB.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_knowledge_base`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`knowledge_base_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Permanently delete a knowledge base AND everything in it: every document, every chunk and every embedding go with it, and any workflow it was attached to stops retrieving from it immediately. There is no undo. To stop an agent using a KB while keeping its content, use update_knowledge_base with status “archived”, or detach_knowledge_base to remove it from one workflow only. Returns 404 if the KB does not belong to this client. Confirm with the user before calling this.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Archivos del agente (4)`,id:`archivos-del-agente-4`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_files`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`List the files your agents can SEND to leads (images and PDFs in the company file library), each with its id, handle, name (label), filename, type and its sending instructions (agent_instruction: when the agent sends it). Pass workflow_id to also get `,_jsx(_components.code,{children:`enabled`}),`: whether that workflow may send each file. Files are company-wide; a file removed from a workflow is still in the library. legacy_folder_handle is set when an older folder @handle also sends the file. This is not the knowledge base: knowledge documents are read by the agent, these files are attached to messages. Ideal for “which files does this agent send”, finding a file id before renaming, editing or removing it, or spotting duplicates.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_agent_file`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`file_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Rename a file your agents can send and/or rewrite its sending instructions (when the agent sends it). Pass label to rename (the name operators see in Nexor and leads see on a document; the file’s extension is added automatically when sent, so never include or require one; empty string clears it back to the filename) and/or agent_instruction to change when it is sent (cannot be empty). The handle never changes, so rules that reference the file keep working. The file is company-wide: the change applies to every agent that sends it. Returns the updated file; 404 if it does not belong to this client.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_agent_file_availability`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`file_id`}),`, `,_jsx(_components.code,{children:`workflow_ids`}),`, `,_jsx(_components.code,{children:`enabled`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Let or stop specific workflows (tasks) sending one file. enabled:false removes the file from those workflows only; it stays in the library and in every other workflow. enabled:true lets them send it again. To remove a file from an agent (a group of tasks), pass every task id of that agent. Other files’ availability is untouched. Nothing is written if any workflow does not belong to this client (404). Confirm with the user before removing a file from an agent.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_agent_file`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`file_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Permanently delete a file from the company file library: NO agent can send it afterwards, and any rule that references its handle stops sending it. There is no undo. To stop only one agent sending it, use set_agent_file_availability instead. Returns 404 if the file does not belong to this client. Confirm with the user before calling this, naming the file.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Webhooks (7)`,id:`webhooks-7`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_webhooks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s outbound webhooks: name, target URL, subscribed events, active flag and delivery health. Secrets are never included. Ideal for “what webhooks are configured”, “is anything listening to meeting.completed”, or finding a webhook id to update/test/delete.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`configure_status_webhook`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`status_key`}),`, `,_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create an outbound webhook that fires only when a lead enters one specific status in one specific workflow/agent. It subscribes to workflow_run.status_changed and installs exact workflow_id + to_status.key filters, plus any extra filters. The signing_secret is returned EXACTLY ONCE. Use one webhook per destination/behavior when different statuses need different payloads or receivers.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_webhook`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get one webhook’s full configuration: events, filters, auth type, retry setting and payload template. auth_config is redacted to key names and the signing_secret is never returned (it is only shown once, at create time). Ideal for auditing exactly what a webhook sends and when.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_webhook`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`url`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create an outbound webhook. url must be https and publicly reachable (private/metadata IP ranges are rejected server-side). The response includes the signing_secret EXACTLY ONCE — surface it to the user immediately; it cannot be retrieved later. Ideal for “notify my CRM when a meeting completes” style integrations.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_webhook`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Update an existing webhook. Only the fields you pass change; use is_active to pause (false) or resume (true) deliveries without deleting the webhook. Returns the updated, redacted configuration — the signing_secret is never re-issued. Ideal for pointing a webhook at a new URL, changing its event list, or toggling it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_webhook`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Permanently delete a webhook; deliveries stop immediately. Returns 404 if no webhook matched. To pause temporarily instead, use update_webhook with is_active:false.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`test_webhook`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Fire a synthetic test event at a webhook’s URL and report the outcome: { delivered, response_status, duration_ms, error }. The remote response body is never reflected back. Ideal for verifying a newly created or just-edited webhook actually receives events before relying on it.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Tags (3)`,id:`tags-3`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_tags`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Page through the client’s tag catalog (id, name, slug, description, color). search matches name, slug and description. Ideal for “what tags exist”, finding a tag id before set_tag/delete_tag, or checking a slug before creating a similar tag. To tag an individual lead use sync_lead_tags instead.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_tag`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update a tag in the catalog (upsert). OMIT tag_id to CREATE: name is required and slug is auto-generated from it unless given. PASS tag_id to UPDATE that existing tag’s name/slug/description/color (only provided fields change). Returns the tag; 409 CONFLICT if the slug already exists for this client. Leads already carrying an updated tag keep it — renaming is safe. Color is account-wide and applies wherever this tag appears; null restores the name-based default. Read list_tags after editing to verify persistence.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_tag`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`leads:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`tag_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Permanently delete a tag from the catalog AND remove it from every lead that carries it (cascade). Returns 404 if no tag matched. Ideal for retiring obsolete tags; to merely rename one, use set_tag with tag_id instead.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Procesadores (6)`,id:`procesadores-6`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_processors`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the client’s pre-workflow processors (lead-routing rule engines): name, default workflow, active flag and rule count. Deactivated processors are hidden unless include_inactive is true. Ideal for “how are incoming leads routed”, or finding a processor id before get_processor / set_processor_rule.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_processor`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`processor_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get one processor with its full rule list: each rule’s conditions, target workflow, evaluation position and active flag. Rules are evaluated in position order (1 first); the first match wins. Ideal for auditing routing logic before editing it with set_processor_rule.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_processor`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update a pre-workflow processor (upsert). OMIT processor_id to CREATE: name and default_workflow_id are required, and you may seed up to 50 rules atomically (if any rule fails, the whole create rolls back). PASS processor_id to UPDATE name/description/default_workflow_id/is_active — rules cannot be passed on update; manage them with set_processor_rule / delete_processor_rule. default_workflow_id must belong to this client.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_processor`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`processor_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Soft-deactivate a processor: it stops evaluating rules and routing leads, but the processor and its rules are kept (visible via list_processors include_inactive:true) and can be reactivated with set_processor is_active:true. Returns { deactivated: true }.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_processor_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`processor_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or update one routing rule on a processor (upsert). OMIT rule_id to CREATE: name, workflow_id and conditions (1-20, ALL must match) are required. PASS rule_id to UPDATE — only provided fields change; passing position (1-based, 1 = evaluated first) also reorders the rule, which is how rules are reordered. workflow_id must belong to this client. Empty condition lists are rejected: they would match every lead.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_processor_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`processor_id`}),`, `,_jsx(_components.code,{children:`rule_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Permanently delete one routing rule from a processor. Leads that would have matched it fall through to later rules or the default workflow. Returns 404 if the rule is not on that processor.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Tipos de reunión (5)`,id:`tipos-de-reunion-5`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_meeting_types`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List a workflow’s meeting types exactly as the dashboard form shows them: name, duration, meeting buffer, min notice, max days ahead, calendar title/invite templates, type (video with video_provider google_meet/teams, phone, in_person with location_details), overbooking + maximum per time slot, color, is_active, the free-text agent_selection_criteria and the enforced agent_selection_rules (see set_meeting_type_routing). Ideal for “what appointment kinds can this workflow book” or finding a meeting type id before update_meeting_type / delete_meeting_type.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_meeting_type`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`name`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create the first and only meeting type for an appointment workflow that currently has none. Requires a name; omitted fields receive the dashboard defaults (30 min, 15 min buffer, 2 h notice, 14 days ahead, video). The type is created ACTIVE; it becomes bookable once a host with availability is assigned (add_executive). If one already exists, returns it explicitly with status=“existing” and never creates another. If several exist, fails with MULTIPLE_MEETING_TYPES so the operator can consolidate them. Bad values fail with 400 listing the allowed options (e.g. location_type must be video, phone or in_person).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_meeting_type`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`meeting_type_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Update one meeting type by id (at least one field required; only provided fields change) — every field of the dashboard meeting form. Pass null for description / event_description_template / location_details / video_provider / max_bookings_per_slot to clear them. is_active switches the type on or off: activating while another type is active fails with 409 MT_EXISTS; deactivating the only active type of a live appointment agent fails with 409 LAST_ACTIVE_MEETING_TYPE. Bad values fail with 400 listing the allowed options. Returns 404 if the meeting type is not in that workflow. Ideal for “make demos 45 minutes”, “require 24h notice”, “make it in person at the showroom”, “use Teams instead of Meet”.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_meeting_type_routing`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`agent_selection_rules`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Write the enforced host routing rules (agent_selection_rules) of a meeting type and read them back. Unlike agent_selection_criteria (free text the AI interprets), these rules are applied server-side when slots are offered and booked. Every host reference is validated against the hosts assigned to the meeting type (list_executives; pass user ids, names are resolved to the assigned host and stored by name). Examples: two hosts strictly alternating → {routing:“cycle”, tiers:[{agents:[A,B], mode:“cycle”, pattern:[0,1]}]}; leads with renta >= 50000 to Ana, the rest split 2:1 between Bruno and Carla, below 0 disqualified → {field:“renta”, tiers:[{min:50000, agents:[ana]}, {min:0, agents:[bruno, carla], weights:[2,1]}, {min:-1e9, action:“disqualify”}]}. Pass agent_selection_rules: null to clear. meeting_type_id may be omitted when the workflow has exactly one meeting type. 400 lists what is wrong (unassigned host, unordered tiers, unknown mode).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_meeting_type`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`meeting_type_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Delete a meeting type from a workflow. The response reports impact: agent_assignments_removed and future_events_orphaned (already-booked meetings keep their calendar events but lose the type link). Returns 409 LAST_APPOINTMENT_TYPE when the workflow’s goal is ‘appointment’ and this is its only remaining type — an appointment workflow must keep at least one. 404 if the id is not in that workflow.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Configuración de tareas (12)`,id:`configuracion-de-tareas-12`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_workflow_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`status_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read one workflow status’s complete configuration without changing it: label/category/flags, entry_hint, on_enter_instructions, required-field and transition gates, timeout, transfer, pause and assignment behavior. Use this before update_workflow_status and preserve exact labels/casing unless the user explicitly asks to rename them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_workflow_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`status_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Configure one existing funnel status exactly like the dashboard stage editor. entry_hint is the natural-language qualification/entry gate for that status (required on non-initial statuses: clearing it is refused with status_entry_hint_required); on_enter_instructions is what the agent does once the lead is in that stage (e.g. thank, say you will reconnect later, say goodbye) — never put behavior in entry_hint; requires_all_fields or required_field_keys adds a deterministic variable gate; transition_rules adds structured qualification rules; timeout_config is the per-stage delay (after N minutes/hours/days since entering this status, move to target_status_key in the same workflow — the native way to wait, never a Scheduled Function or Background Job); transfer_config on an is_terminal status hands the lead to another task of the same agent group (conversation history and a read-only snapshot of collected fields carry over) — for a delayed handoff put the timeout on the waiting status and point it at the terminal transfer status; pause_bot stops the current agent; can_return_on_reply (lost final stages only, else 400 can_return_on_reply_requires_lost_stage) lets a lead who writes again come back to an active stage; assignment_config ({mode, agent_ids, restrict_booking_to_assignee}) assigns a human team member on entry — only ONE status per workflow may carry it (409 ASSIGNMENT_CONFIG_EXISTS with holder_status_key; clear it there with assignment_config:null first). On the escalation stage, assignment_config.on_escalation:true routes new escalations to those people; a routing save there returns warnings (routing_off, escalation_off) when it reaches nobody yet. category must be active/won/lost/paused/deferred. System stages other than the escalation stage and the virtual Discarded stage refuse writes with 409 PROTECTED_STATUS. Read get_workflow_status first and change only intended fields; preserve the exact label unless renaming was explicitly requested.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_workflow_voices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the voice catalog usable by a workflow’s call agent: public voices plus the client’s private voices, each with id, voice_id, name, provider, language, gender and a preview_url (a playable .mp3 sample link you can hand the user to hear the voice). Use this to pick a voice_id for set_workflow_voice, or to show the user samples before switching.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_workflow_voice`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Switch and/or tune the workflow’s call voice. To CHANGE which voice the lead hears, pass ONE of: gender (‘male’/‘female’ — the server picks a matching voice in the workflow’s language, e.g. a male voice for ‘voz de hombre’), voice_id (an exact id from list_workflow_voices), or voice_name (a name to match). The server writes the effective voice where the call runtime actually reads it and returns resolved_voice with a preview_url (.mp3) you should share with the user so they can hear it. To TUNE the current voice, pass a voice object with knobs (voiceSpeed, voiceTemperature, volume); these are key-level merged and preserved. Provide at least one of gender/voice_id/voice_name/voice. Unknown voice_id or no gender match returns INVALID_VOICE with available_voices. Version-snapshotted.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_workflow_cadence`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read a workflow’s outreach cadence (block-config): the sequenced contact blocks (channel, delay, templates), timing/business-hours config and retry behaviour.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_workflow_cadence`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`block_config`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace a workflow’s outreach cadence (block-config). Read the current one with get_workflow_cadence first and send the full edited object — this is a whole-document PUT, not a merge. It does NOT set the WhatsApp opening template: dayConfig.config.opening_template is ignored when unchanged and REJECTED when changed (use set_opening_templates, which validates the opener). WhatsApp template names referenced by blocks must exist and be APPROVED on the client’s WABAs; business hours are re-derived server-side.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_workflow_qualification`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read a workflow’s lead-qualification model (futurology): the scoring categories and the conditions that classify a lead into them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_workflow_qualification`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Write a workflow’s lead-qualification model (futurology). categories and conditions address the SAME rows under two vocabularies (category_key/category_name/description = condition_key/condition_name/condition_description), so a key may appear once per call. Every row needs its key AND its human name (condition_name / category_name — never invented by the server); threshold_type, timing_type and scope are closed enums and wrong types are refused with 400 naming the index and field. Default is a merge (upsert by key, unsent columns keep their stored value); pass replace:true to clear the whole model and write what you send. get_workflow_qualification returns rows under the same field names, so a read-modify-write needs no translation. Provide at least one of categories/conditions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_workflow_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`status_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`DESTRUCTIVE: permanently delete a funnel status from a workflow. Call get_pipeline_impact FIRST to see how many leads sit on each status. If any leads are on the status you must pass migration_target (the status key those leads are moved to) or the call fails with STATUS_HAS_LEADS and the lead count. The only initial status and the last terminal status can never be deleted. The escalation stage cannot be deleted either (409 escalation_stage_not_deletable): turn escalation off with update_workflow_config (escalation:{enabled:false}) instead.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_workflow_field`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`field_key`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`DESTRUCTIVE: permanently delete a data field (variable) from a workflow. Leads’ previously collected answers are preserved (detached from the field but kept in history); the field is removed from the funnel and the agent stops collecting it. Refuses with FIELD_IN_USE (409) when the field still gates a status (required fields / transition rules) or a qualification rule — remove those references first, then delete. There is no undo — prefer editing the field with update_workflow_structure over deleting it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`DESTRUCTIVE / IRREVERSIBLE: archive one mode/workflow and release its channels. If it is the last non-archived mode, its master workflow (the named agent) is ALSO deleted, automatically, with no keep-agent option. Before sign-off, read list_workflows and list_agent_groups (paused modes count), name the affected agent and warn explicitly; pass its id as confirm_master_workflow_id after approval. Do not detach the mode to bypass this rule. confirm:false previews without writes; confirm:true deletes after approval. Active pipeline leads block deletion: status:‘blocked’, reason:‘agent_has_leads’, lead_count. Move or discard them explicitly first. / DESTRUCTIVO: archiva un modo. Si es el último, también elimina su agente, sin opción de conservarlo. Antes de confirmar, lee los modos (incluidos pausados) y agentes, nombra al agente y avisa de la eliminación conjunta. No desvincules el modo para evitarla. confirm:false previsualiza; confirm:true elimina tras aprobación. Leads activos bloquean con agent_has_leads.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`restore_workflow`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Un-archive (restore) an agent that was previously deleted with delete_workflow. Archive is a soft-delete, and this is its inverse: it clears the archive so the agent is listable and editable again. The agent comes back PAUSED and inactive — the channels it had (WhatsApp / phone / Instagram / Meta) were released when it was archived and are NOT re-attached, and its old leads/runs stay paused; reconnect channels and activate explicitly afterwards. Find the archived agent’s id first with list_workflows include_archived:true. Idempotent: restoring an agent that isn’t archived returns { status:‘already_live’ } without error. / Restaura (desarchiva) un agente eliminado con delete_workflow. El borrado es suave y esto es su inverso: el agente vuelve a aparecer y a ser editable, pero PAUSADO e inactivo; sus canales fueron liberados al archivar y NO se reconectan solos. Usa list_workflows include_archived:true para encontrar su id.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Ejecutivos (4)`,id:`ejecutivos-4`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_executives`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List a workflow’s executives — the human hosts who take its meetings — with their user, active flag and assigned meeting types.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_executive`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`user_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Add a team member as an executive (meeting host) of a workflow, optionally restricted to specific meeting types. The user must belong to the client’s team (see get_team); adding someone who is already a host fails with a conflict. Assigning the host to a meeting type that was created inactive (seeded in the dashboard before any host existed) activates it, unless another type is already active; the response lists meeting_types_activated. Pass meeting_type_ids explicitly for that to happen — omitting it links no meeting type.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_executive`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`executive_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Update a workflow executive: toggle is_active and/or replace their full meeting-type set (meeting_type_ids overwrites the current assignments — pass the complete list). Provide at least one field. Linking the host (or switching them back on) activates a meeting type that was created inactive, unless another type is already active; the response lists meeting_types_activated.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`remove_executive`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`executive_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Remove an executive (meeting host) from a workflow. Their existing meetings are untouched; they just stop receiving new ones.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Avanzado (1)`,id:`avanzado-1`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`describe_advanced_features`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Map every surface in the dashboard Advanced hub to its purpose, execution model, MCP tools, and safety considerations. Use this as the entry point for Advanced configuration.`})]})})]})}),`\n`,_jsx(Accordion,{title:`Sistema del agente (2)`,id:`sistema-del-agente-2`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`describe_agent_configuration`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Complete reference for designing and configuring one or many Nexor agents through MCP: prompts, statuses and qualification gates, variables, cadence, tools, pre-execution hooks, stage gates, webhooks, transfers, Cloud/Scheduled Functions, and the required clarification/sign-off workflow. Call this before proposing a non-trivial or multi-agent build.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`review_agent_system_plan`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`plan`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Opt in with plan.composition_policy=task_composition_v1 for 1–20 independent tasks created paused_unbound: validates real graph reachability and forbids activation/channel bindings; missing booking resources are pending_setup, invalid configuration still blocks. Only this opt-in returns composition_contract_version:1. Otherwise: Preflight a complete agent configuration (its modes) before any mutations. Gates mode decomposition deterministically: one mode per intent, 2–3 by default; a single-mode plan is BLOCKED unless plan.decomposition carries the operator’s explicit single-mode instruction, 5+ modes are blocked unless explicitly requested, and every non-entry mode must be reachable by a transfer. Also finds missing identities, goals, status gates, transfer targets, language/timezone (every agent needs an IANA timezone — it anchors booking slots; channels are never asked — a mode inherits its agent’s channels at birth, see birth_defaults in the result), a contact_schedule missing on a mode whose own description hints at after-hours / 24-7 / weekend hours (such a mode must never be born with the Mon–Fri business-hours default), planned channels with no verified resource on the account, webhook destinations, booking prerequisites for appointment agents (meeting type, host, calendar plan or external provider), and operational risks; returns an internal plan_fingerprint (never shown to the user) and the exact final sign-off prompt. Do not create/update agents, tools, hooks, webhooks, functions, schedules, jobs, or transfers until this review is clean and the user explicitly approves the summarized plan (“Does this look ok? Let me know and I’ll build it.”).`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Agentes (10)`,id:`agentes-10`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_inbound_calls`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`agent_group_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read incoming-call settings, eligible numbers, linked numbers affected by the same setting, and activation status for an agent group. Resolve the group with list_agent_groups or the selected task master_workflow_id. Read before changing anything and after saving. status=ready confirms configuration is ready; pending is not active and error requires attention. No call is placed.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_agent_inbound_calls`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numbers:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`agent_group_id`}),`, `,_jsx(_components.code,{children:`number_id`}),`, `,_jsx(_components.code,{children:`mode`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Configure incoming calls for the whole agent group. The agent keeps its number in every mode. ai = AI answers; ai_human = AI answers and transfers on request; forward = direct forwarding without AI; off = stop incoming calls without changing the router or other channels. ai/ai_human enable a missing or inactive router with AI routing off; an active router stays unchanged. Read get_agent_inbound_calls first. Explain the selected number and linked numbers affected, and obtain consent for the exact mode and destination. Pass an observed number_id; ai_human and forward require an international transfer_to. Do not unassign the number or turn off the router to resolve a conflict. Read back after saving or an error; changes may be partially applied. Report pending as preparation and never claim pending/error is active. This makes the real API request, not a prompt edit. Does not buy numbers, place test calls, or change outbound schedules.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_agent_groups`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the account’s AGENTS (master workflows — what the operator sees and names in the sidebar, each with its own chat) with their ids, names, descriptions and ivr_navigation (phone-menu navigation on calls, see update_agent_group). This is the answer to “how many agents do I have” and “which agent is X”; never count workflows for that. A workflow is a MODE / sub-agent of one of these agents: list_workflows returns each mode’s agent as master_workflow_id.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_agent_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsxs(_components.td,{children:[`Create an AGENT (a master workflow — the named entry the operator sees in the sidebar). This is the FIRST write of any agent build: every workflow is a mode INSIDE an agent (create_workflow requires master_workflow_id; a workflow never exists without an agent), so create the agent here, then create at least one mode inside it with the returned id — an agent with no modes is unfinished. BORN WITH: Nexor picks the agent’s name — a human first name from its pool, skipping names the account’s other agents already carry — so never ask the operator to name the agent and never pass one (a `,_jsx(_components.code,{children:`name`}),` argument is ignored and reported back as requested_name_ignored; rename later with update_agent_group only if the operator explicitly asks). The result’s birth_defaults lists the channels the agent has (every channel the account holds a verified resource for) — every mode created inside it inherits those channels, the contact schedule and the agent’s name automatically through create_workflow, so channels and hours are never questions. Modes are created or moved under it afterwards: create_workflow with master_workflow_id = the returned id, or update_workflow with that id; then read back both lists. Plan its modes by intent before creating any: a typical agent has 2–3 modes (one per distinct goal or register, e.g. sell → follow up → discount), one mode only when the operator explicitly asks for exactly one, never 5+; review_agent_system_plan enforces this.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_agent_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`agent_group_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Rename an AGENT (master workflow), change its description, or turn phone-menu (IVR) navigation on/off for its calls (ivr_navigation). Pass only the fields to update. This does not move modes (sub-agent workflows) between agents; use update_workflow.master_workflow_id for that.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_agent_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`agent_group_id`})}),_jsx(_components.td,{children:`Aprobación del operador en instrucciones`}),_jsx(_components.td,{children:`Delete (deactivate) an AGENT — the master workflow the operator sees in the sidebar; “delete this agent” inside that agent’s chat means this tool on that id — only after the operator’s explicit yes to a one-line confirmation. Soft delete: its modes (sub-agent workflows) are detached, not deleted, and their leads stay. To delete one mode use delete_workflow instead. Read back list_agent_groups and list_workflows after the write.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_agent_group_catalog_settings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`agent_group_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the agent group catalog default inherited by its tasks. Null means no group default.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_agent_group_catalog_settings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`agent_group_id`}),`, `,_jsx(_components.code,{children:`enabled`}),`, `,_jsx(_components.code,{children:`offer_ids`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set catalog defaults for current and future tasks. Explicit task overrides remain unchanged. enabled=false disables the group default; offer_ids=null selects all active catalogs. Read back after saving.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_task_catalog_settings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read effective task catalogs and whether they inherit the agent group default.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_task_catalog_settings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`enabled`}),`, `,_jsx(_components.code,{children:`offer_ids`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set task catalog override, disable products with enabled=false, or resume the agent group default with inherit_from_group=true. Read back after saving.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Enrutamiento entrante (9)`,id:`enrutamiento-entrante-9`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_inbound_router`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`agent_group_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read an agent group’s inbound router: whether it is on, the default task (the task that answers when no rule or AI decision picks one), AI routing and thresholds, which tasks it may route to, the shared identity, and every task of the group with paused status. Read before any change and after saving. inbound_router_not_enabled means the account does not have the router; say so and stop.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_inbound_router`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`agent_group_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Change an agent group’s inbound router. Pass only changed fields. default_workflow_id must come from get_inbound_router; paused tasks are allowed. Without a default, activation picks the arrival task, else the oldest. Turning the router on does not enable incoming calls. Turning it off stops AI call reception; direct forwarding stays on. Explain this before disabling. Use set_agent_inbound_calls to change call mode while keeping the number assigned. candidate_workflow_ids limits task selection (null = all). confidence_threshold and clarify_threshold are 0-1; clarify must not exceed confidence. Read get_inbound_router first, show before and after, and pass confirm=true only after approval. Read back after saving. New inbound messages fall back to the default task when the router is off; conversations already running stay with their task.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_inbound_router_rules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`agent_group_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the fixed routing rules of an agent group, in evaluation order. A rule sends a new inbound conversation to target_workflow_id when all its conditions match, before AI routing and the default task.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_inbound_router_rules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`agent_group_id`}),`, `,_jsx(_components.code,{children:`rules`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Replace ALL routing rules of an agent group; array order is evaluation order. To add, edit or remove one rule, read get_inbound_router_rules, change that entry, and send the whole list. An empty list removes every rule. target_workflow_id must be a task of the same group. Show the operator the full resulting list and pass confirm=true only after they approve. Read back after saving.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_inbound_router_identity`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`agent_group_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Replace the shared identity every task of the agent group presents to a new inbound lead before routing: name, voice, language, identity prompt and per-channel prompts. Full replacement: read get_inbound_router first and resend fields you keep. Confirm the exact text with the operator and pass confirm=true. Read back after saving.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_inbound_router_activity`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`agent_group_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read how the router has been deciding: the latest decisions (channel, layer that decided, chosen task, confidence, the first message, any correction) and aggregates for a time window. Use it to explain why a lead landed on a task or to check a change worked.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`test_inbound_router`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`agent_group_id`}),`, `,_jsx(_components.code,{children:`channel`}),`, `,_jsx(_components.code,{children:`first_message_text`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Dry-run the router with a sample first message and see which task would answer and why. Nothing is sent, no lead is created and no decision is stored. Use it after changing rules, the default task or AI routing. channel is whatsapp, webchat, email or api.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_inbound_entry_points`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the account’s inbound entry points (WhatsApp, phone, SMS, iMessage, Instagram, Messenger, email senders; with agent_group_id also the group’s website chat and email) and where each one lands today: a single task (type agent), an agent group’s router (type group) or nowhere. available=false comes with unavailable_reason.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_inbound_entry_point`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`channel`}),`, `,_jsx(_components.code,{children:`id`}),`, `,_jsx(_components.code,{children:`destination`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Choose where one inbound entry point lands: destination {type:“group”, id} sends new conversations through that group’s router, {type:“agent”, id} sends them straight to one task, {type:“none”} disconnects it. Use the channel and id from list_inbound_entry_points; email and webchat also need agent_group_id. A 409 with required_confirmation means another number or group is affected: explain conflict to the operator and, only if they approve, retry with confirmation set to required_confirmation exactly as returned. Pass confirm=true only after approval. Read back after saving. A phone number answers calls only once connected: connect a new number (id from provision_phone_number) to an agent with channel “phone” and destination {type:“group”, id: the agent id}; this turns the agent’s router on and needs an active task of the agent that does not exclude calls (else agent_not_active / no_call_task).`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Subcuentas (7)`,id:`subcuentas-7`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_sub_accounts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sub-accounts:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the sub-accounts of the connected main account: each one’s id, name, country, owner and invitation, state (active, invited, paused, inactive), agents and leads, plus the family’s usage this period (every sub-account adds to the main account’s plan). A null usage number means the meter could not be read, not zero. Call this first: it also tells you whether the account has sub-accounts at all. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_sub_account`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sub-accounts:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`country`}),`, `,_jsx(_components.code,{children:`language`}),`, `,_jsx(_components.code,{children:`timezone`}),`, `,_jsx(_components.code,{children:`owner_name`}),`, `,_jsx(_components.code,{children:`owner_email`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Create a sub-account under the connected main account and invite its owner by email (the invitation lasts 7 days). The sub-account starts empty, with no card or plan of its own: its usage adds to the main account. country is ISO 3166-1 alpha-2, language is es or en, timezone is IANA (e.g. America/Santiago). The owner email cannot already belong to the main account’s team. Confirm every field with the operator before passing confirm=true. If the response shows email_sent=false, give the operator invite_url to share. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`resend_sub_account_invitation`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sub-accounts:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sub_account_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Send the sub-account owner’s invitation again with a fresh 7-day link. owner_already_accepted means the owner already joined. If email_sent=false, give the operator invite_url to share. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`copy_agent_to_sub_account`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sub-accounts:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sub_account_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Copy one of the main account’s agents into a sub-account. Pass exactly one source: master_workflow_id for an agent group, or workflow_id for a single agent (ids from list_agent_groups / list_workflows of the main account). The copy arrives paused, with its configuration, stages, fields, tools and rules. Connections bound to the main account (numbers, channels, integrations) are not copied: next_steps and missing_connections say what the sub-account must connect before going live. status=existed means the same copy was already made. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pause_sub_account`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sub-accounts:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sub_account_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Pause every agent of a sub-account; its team keeps access and nothing is deleted. failed_workflow_ids lists agents that could not be paused. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`deactivate_sub_account`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sub-accounts:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sub_account_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Deactivate a sub-account: pauses all its agents and its team stops seeing the account. No data is deleted and reactivate_sub_account undoes it. pause_incomplete means some agents could not be paused and nothing was deactivated. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reactivate_sub_account`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sub-accounts:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sub_account_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Reactivate a deactivated sub-account so its team sees it again. Its agents stay paused until someone resumes them. sub_accounts_not_enabled means this account does not have sub-accounts: tell the user they can ask Nexor support to enable them, and stop. sub_account_cannot_manage_sub_accounts means the connected account is itself a sub-account: tell the user to do this from the main account.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Calendarios (3)`,id:`calendarios-3`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`connect_calendar`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`calendars:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`user_id`}),`, `,_jsx(_components.code,{children:`provider`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Start connecting a team member’s Google or Outlook calendar (the host’s busy time and conferencing link for bookings). Returns connect_url, expires_at (10 min) and connection_request_id. IMPORTANT — hand connect_url to the user DIRECTLY as a clickable link and say who must open it (the host signs in and grants calendar access there; it cannot be completed in chat). When the target user is NOT the operator you are talking to, you MUST first tell the operator whose calendar will be linked and get an explicit yes, then call again with confirm=true — the backend refuses with CONFLICT/CONFIRMATION_REQUIRED otherwise. Other refusals: USER_NOT_ACCEPTED (fix: invite_user and wait for acceptance), PROVIDER_UNAVAILABLE (Outlook not enabled here), OTHER_PROVIDER_ACTIVE (disconnect the other provider first). Afterwards poll get_calendar_connections until status=active and scopes_ok=true.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_calendar_connections`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`calendars:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List calendar connections (Google, Outlook, Calendly) for the account or one team member: provider, status (active / needs_reauth / revoked / error), role, calendar_email, scopes_ok (false = reconnect with connect_calendar), last_error, connected_at. Poll this after connect_calendar; the host is bookable with busy-time awareness once a row is active with scopes_ok=true.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`disconnect_calendar`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`calendars:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Revoke a host’s calendar connection (the agent stops reading their busy time and creating events there; Outlook accounts are also removed from the provider). Preview-then-confirm: call with confirm=false first — returns { requires_confirm: true, connection } and changes NOTHING; show the operator whose calendar it is, then call again with confirm=true. Reads the connection back after revoking.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Disponibilidad (5)`,id:`disponibilidad-5`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_host_availability`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`people:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`user_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read a team member’s booking availability: timezone (host’s own or seeded from the account), schedule flags, weekly slots grouped by weekday (0=Sunday), blocked dates, and slot_count. A host with slot_count 0 and no Calendly cannot be booked (BOOKING_AVAILABILITY_REQUIRED).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_host_schedule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`calendars:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`user_id`}),`, `,_jsx(_components.code,{children:`slots`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace a team member’s whole weekly schedule in one call (atomic: the previous slots are removed). slots = [{ weekday 0-6, start ‘HH:MM’, end ‘HH:MM’ }] — e.g. Monday-Friday 09:00-17:00 is five entries with weekday 1..5. Overlapping slots on one weekday, end before start, or an unknown IANA timezone are refused with the offending field. timezone defaults to the host’s current one, else the account timezone (seeded). Returns the persisted availability; readiness recomputes and BOOKING_AVAILABILITY_REQUIRED clears once slot_count > 0.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_host_timezone`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`calendars:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`user_id`}),`, `,_jsx(_components.code,{children:`timezone`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set (or clear with null) a team member’s availability timezone without touching their slots. Unknown IANA zones are refused. Setting a zone also turns respect_own_timezone on unless you pass it explicitly. Returns the persisted availability.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_host_blocks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`calendars:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`user_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Add and/or remove a team member’s blocked dates (time off). add = [{ date ‘YYYY-MM-DD’, start?, end?, all_day?, reason? }] (omit times for all-day); remove = block ids from get_host_availability. Applied in order (removes first, then adds); returns the persisted availability with the final block list.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`auto_assign_solo_host`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Make a team member the meeting host of an appointment workflow and cover all its meeting types — the one-call setup for a single-host account. Omit user_id when the account has exactly one eligible member (owner/admin/human_agent); with several, the backend answers MULTIPLE_HOSTS with candidates and you pass user_id. Idempotent. Returns the assignment plus that host’s availability; follow with set_host_schedule and connect_calendar if slot_count is 0 or no calendar is active.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Calendly (9)`,id:`calendly-9`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`connect_calendly`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Start connecting the client’s Calendly account: returns a hosted Composio authorization URL (connect_url, expires in ~10 min) the operator opens to grant access. IMPORTANT — give connect_url to the user DIRECTLY as a clickable link and tell them to open it; the authorization happens entirely on that page and CANNOT be completed in chat. After they finish, Nexor registers the webhook subscription and starts provisioning automatically. Poll get_calendly_status until state=connected (plan_required means the Calendly plan has no webhook support). Fails with already_connected when an active connection exists — pass reconnect=true to re-authorize. Next: list_calendly_event_types, then set_calendly_binding per host per meeting type.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_calendly_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the client’s Calendly connection: state (not_connected / connected / plan_required / disconnected), webhook health_status, plan_tier, host_mode, last provisioning report (per-host outcomes: wired / needs_mapping / no_event_type / primary_conflict) and the Composio account status. The poll target after connect_calendly and the place to read provisioning results.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_calendly_event_types`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the connected Calendly account’s event types: uri (the API uri set_calendly_binding needs), name, duration_minutes, active, scheduling_url, kind and owner. Defaults to the connecting user’s event types; pass owner_uri (a Calendly user uri from the provisioning report hosts[].uri) to list another host’s. Only an ACTIVE event type whose duration equals the meeting type’s duration can be bound.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_calendly_binding`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`meeting_type_id`}),`, `,_jsx(_components.code,{children:`host_user_id`}),`, `,_jsx(_components.code,{children:`event_type_uri`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Bind a Calendly event type to ONE host for ONE meeting type of a workflow (the per-host model; there is no per-workflow link to manage). The backend validates the event type is active and its duration equals the meeting type’s duration_minutes (400 duration_mismatch otherwise), assigns the host to the workflow/meeting type if needed, writes the binding and reads it back. The first binding on a workflow switches that workflow to Calendly mode: native booking tools are gated and get_available_slots reads Calendly. Pass event_type_uri=null to clear a host’s binding (the host then appears under excluded_hosts). Repeat per host per meeting type; verify with list_calendly_bindings.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_calendly_bindings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read a workflow’s Calendly wiring: workflow_mode (calendly / native), the per-host bindings (host, meeting type, event_type_uri) and excluded_hosts — hosts assigned to a meeting type WITHOUT an event type (reason no_event_type_binding) who are silently missing from availability until set_calendly_binding fixes them. Optionally filter by meeting_type_id.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_calendly_host_mode`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`mode`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set the Calendly host mode. ‘teams’ is the only value: hosts are the Calendly organization members, each mapped to a Nexor user and wired per meeting type by provisioning. Enqueues a provisioning pass; read the outcome with get_calendly_status or run provision_calendly for an immediate report.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`map_calendly_hosts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`calendly_user_uri`}),`, `,_jsx(_components.code,{children:`host_user_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Map a Calendly host (calendly_user_uri from the provisioning report hosts[] with outcome needs_mapping) to a Nexor user, or pass host_user_id=null to unassign. The uri must come from the last provisioning report — run provision_calendly first. Fails with primary_conflict when the user already books through another calendar (e.g. Google) and cross_client_primary when they are a host in another client. Enqueues a provisioning pass afterwards.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`provision_calendly`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Run Calendly provisioning now and return the report: discovers the organization’s hosts, maps them to Nexor users (explicit mapping > email match > needs_mapping), resolves each host’s event type and wires workflow_agent_meeting_types for every workflow in Calendly mode. Report hosts[] outcomes: wired / needs_mapping (→ map_calendly_hosts) / no_event_type (→ set_calendly_binding) / primary_conflict / cross_client_primary. Requires host mode set and at least one workflow bound. Pass wait=false to enqueue instead and poll get_calendly_status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`disconnect_calendly`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Disconnect Calendly for the client: deletes the webhook subscription, deactivates the integration and revokes the Composio account. Workflows bound to Calendly stop receiving Calendly bookings; per-host bindings are kept for a later reconnect. Preview-then-confirm: call with confirm:false (or omit it) to get a { status:‘needs_confirmation’ } preview that writes NOTHING; only call again with confirm:true after the operator explicitly confirms.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Ajustes de agenda (8)`,id:`ajustes-de-agenda-8`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_workflow_booking_settings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read a workflow’s booking settings in one call: default_attendees (people invited to every booked meeting), host_assigner (CRM seller-assigner config) and external_booking (client-owned booker config). Use it before set_default_attendees / set_host_assigner / set_external_booking to see the current state.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_default_attendees`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`attendees`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace the people invited to EVERY meeting booked on this workflow (e.g. a sales manager who sits in on all calls). Full-state: the list sent IS the list afterwards; send [] to clear. Entries are {email, name?}; emails are validated and deduped. They appear on the next booked event’s calendar invite alongside the host and the lead.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_meeting_confirmation_email`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`meeting_type_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read a meeting type’s lead confirmation email settings (email_config) and the list of allowed keys. Use before set_meeting_confirmation_email; the write replaces the whole object.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_meeting_confirmation_email`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`meeting_type_id`}),`, `,_jsx(_components.code,{children:`email_config`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Configure the confirmation email the lead receives when a meeting of this type is booked — subject, title, greeting, CTA label, calendar note, extra sections, disclaimer, sender name, or send_to_lead:false to suppress it. Same keys as the dashboard’s email panel; unknown keys are rejected (400) because the renderer never reads them. Replaces the whole email_config (read it first to keep other fields); null clears it. Use preview_meeting_confirmation_email to see the result before/after saving.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`preview_meeting_confirmation_email`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`meeting_type_id`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Render the lead confirmation email (subject + HTML) for a meeting type with sample data, using a draft email_config if given or the persisted one otherwise. Sends nothing. Use it to show the operator what the lead will receive before calling set_meeting_confirmation_email.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_host_assigner`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Declare the workflow’s CRM seller assigner: an existing ACTIVE workflow tool whose response names the seller, so bookings go to that seller’s calendar and the lead’s owner mirrors the CRM. tool = the workflow_tools name; id_field = the response field carrying the seller id; external_key = the client_users.external_ids key that maps it to a Nexor user (e.g. hubspot_owner_id), or identity:true when the tool already returns a Nexor user_id. Validates keys and that the tool exists and is active (400 otherwise), writes config.host_assigner, then RUNS the test connection (real call to the client’s endpoint) and returns its report — the config is persisted even when the test fails (ok:false with the failing step) so you can iterate; test:false skips it. clear:true removes the assigner. Never write host_assigner through update_workflow_config.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`test_host_assigner`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Dry-run the configured host assigner without touching any lead: calls the assigner tool for real, extracts the seller id (id_field), maps it to a Nexor team member and checks their calendar connection. Returns ok plus per-step checks, the fields the response actually carries (to pick id_field), and the resolved user. Pass tool/id_field/external_key/identity to test a variant before saving with set_host_assigner.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_external_booking`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`external_booking`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Declare that the client’s OWN booker (their HTTP tools) owns the calendar for this workflow, so Nexor mirrors every booking into a meeting with reminders and confirmation emails. All three verbs are REQUIRED — tool (create), reschedule_tool and cancel_tool — because an omitted verb is silently never mirrored (phantom meetings); reschedule_tool must differ from tool. fields maps dot-paths in the RAW tool response (data.slots.0.start style, never brackets): starts_at is required, ends_at/meeting_url/external_id/title/timezone optional. Every referenced tool (incl. slots_tool/slots_tools) must exist and be active on the workflow (400 TOOL_NOT_FOUND otherwise). provider defaults to external_booker (auto-gates native booking tools); gohighlevel needs no fields. Replaces the whole section and reads it back; null clears. Never write external_booking through update_workflow_config.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Conexiones CRM (3)`,id:`conexiones-crm-3`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`connect_crm`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`provider`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Start connecting the client’s CRM (hubspot, zoho, kommo, gohighlevel, odoo or salesforce). Returns connect_url + connection_request_id. IMPORTANT — give connect_url to the user DIRECTLY as a clickable link and tell them to open it: HubSpot/Zoho/Salesforce authorize on the vendor’s consent page; Kommo/GoHighLevel/Odoo paste their credentials into a Nexor-hosted form. The credentials are entered on that page only — never ask the user to paste a token in chat, and never claim you connected it for them. Then poll get_crm_connection_status with the connection_request_id until status=completed (last_error explains a rejected attempt; the same link stays valid until expires_at). Reconnecting an already-connected CRM issues a fresh link. For Odoo the same URL/database/user preserves configuration while rotating credentials; a different identity is rejected. Odoo output execution is not available.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_crm_connection_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`provider`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Connection state of one CRM provider (account identity, sync status, errors; never tokens). setup_context describes supported configuration options and recorded scope grants: unknown permissions are NOT granted, and execution_readiness=not_checked is not proof an operation will succeed. Zoho supports output only; Kommo output moves the imported card. Ask which agent and which supported input or output the operator wants; do not activate flows or import existing leads merely because a CRM connected. Pass connection_request_id to verify THAT attempt: pending | completed | expired | failed. An existing connected account does not prove a new attempt succeeded. Kommo returns last_sync_at and last_error from its latest sync. Odoo returns connection_id, base_url, connected_at, last_sync_at, last_imported_at, last_error (a machine code), auth_blocked and api_key_expires_at. GoHighLevel returns one entry per location in locations[] with its connection_id. get_integration_status gives the cross-provider summary.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`disconnect_crm`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`provider`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Disconnect the client’s CRM (stops its sync immediately; configuration is kept so a reconnect restores it). Destructive for the live sync: ask the user first and call with confirm=true only after they explicitly agree. Without confirm=true nothing changes and the response explains what would be disconnected. GoHighLevel only: pass connection_id (from get_crm_connection_status locations[].connection_id) to disconnect one location; without it EVERY location is disconnected, so say so before confirming.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Google Sheets (3)`,id:`google-sheets-3`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_google_sheets_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the account’s Google Sheets automations (one spreadsheet tab linked to one task) with mode import|write, active, task_running, column_map, imported_rows, and the service_account_email the customer shares sheets with. Pass workflow_id to filter one task. An automation only imports while it is active AND its task runs (task_running). Reading changes nothing.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`inspect_google_sheet`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sheet_url`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Check a Google Sheets URL before connecting it. accessible=false with reason=private means the customer must share the sheet with service_account_email as Editor: give them that address and share_instructions, wait for them to confirm, then inspect again. Without sheet_name it returns the tabs; with sheet_name it returns columns, sample_rows, data_row_count and suggested_column_map. Show the operator the suggested mapping and let them correct it; never save a mapping they did not see. automations lists what this spreadsheet already feeds. Read only.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`change_google_sheet_automation`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`action`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Create, configure, activate, pause or remove ONE Google Sheets automation. create links sheet_url + sheet_name to workflow_id with mode (import default, or write) and column_map, and saves it PAUSED. import_existing_rows=false imports only rows added from now on. configure changes any of those fields on connection_id. activate first returns confirmation_required with pending_rows: tell the operator how many rows become leads and that a running task may contact them, then repeat with confirm=true. pause stops future imports and keeps the position. remove deletes the automation; imported leads stay. activate, pause and remove need operator agreement. Report success from the returned automation, and say when task_running=false means nothing imports yet.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Odoo (8)`,id:`odoo-8`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_odoo_connection`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Inspect the saved Odoo connection and obtain its secure browser setup entry. Open connect_url when supplied; otherwise open panel_path under the active Nexor platform origin. Browser sign-in is required. Credentials are entered only in that form, never chat or tool arguments. This does not connect or activate anything. Read again after browser setup; stored connection state is not proof of successful synchronization.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_odoo_outputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Inspect Odoo output settings, connection revision and actual execution availability. Requires an active account owner/admin/partner key. This is connection-wide, not task-scoped. Saved mappings do not prove synchronization. Credentials belong in the Odoo integration panel; never request or pass a key in chat. Read this before changing or previewing outputs.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_odoo_outputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`outputs`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace the complete Odoo outputs configuration for the connection while preserving Inputs. Read get_odoo_outputs first and preserve unrelated mappings. Send its exact connection_id and revision. Saves disabled only; existing linked records only. Explain the account-wide scope and obtain agreement before calling. A revision conflict requires a fresh read. Report the committed read-back, never claim Odoo was updated or activated.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`preview_odoo_outputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read actual linked records and preview a candidate Odoo output configuration without writing to Odoo or starting outreach. Omit outputs to preview saved configuration. scan_complete=false means the bounded scan did not finish, never zero changes. Counts and fingerprints are evidence for this revision and expire; approval_eligible=false cannot authorize activation.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_odoo_output_history`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read persisted Odoo output runs and open conflicts. Queued, partial, uncertain and preview results are not successful synchronization. A verified receipt is required to claim a record was updated. History is connection-wide and requires an account administrator key.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`resume_odoo_outputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`expected_pause_token`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Resume a paused Odoo connection only after explicit agreement. Read get_odoo_outputs first and send its connection_id, revision and status.pause_token unchanged, with confirm=true. Refuses an obsolete pause, unresolved dispatched writes or unavailable execution. Current release gates remain off. Never clear a pause or resend uncertain writes through another tool, and never claim activation from a blocked response.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pause_odoo_outputs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Pause new connection-wide Odoo writes after explicit agreement. Requires the connection and revision from get_odoo_outputs and confirm=true. Preserves mappings, revisions and audit history so already admitted changes can finish and reconcile. Report unsettled_count explicitly; a successful pause does not cancel a write already sent.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`start_odoo_output_sync`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`connection_id`}),`, `,_jsx(_components.code,{children:`expected_revision`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Request Odoo output synchronization after explicit agreement. The current release gate blocks execution and returns odoo_outbound_apply_disabled. Never promise execution or bypass that response. Requires the exact connection and revision plus confirm=true; this is not inbound import or calendar setup.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`HubSpot (11)`,id:`hubspot-11`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_hubspot_config`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read the client’s whole HubSpot post-connect configuration in one call: connection (hub, auth mode, scopes, sync health), default_workflow_id, per-field outbound mappings (field_mappings), the INBOUND property → lead-metadata mapping (inbound_properties), the stage → lifecyclestage mapping (lifecycle_mapping), list routing rules (HubSpot list → workflow), deal_sync settings, sync_back, and owner_mappings (team members with the HubSpot owner id stored on them under external_key). Fails with not_connected until connect_crm(provider=hubspot) completes. Start here before any set_hubspot_* call so you never overwrite what the dashboard configured.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_hubspot_field_mappings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`mappings`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Write outbound field mappings (Nexor field → HubSpot contact property), one row per nexor_field; rows not listed are left untouched. hubspot_property=null removes that field’s mapping. Optional per row: nexor_field_type (text/number/date/boolean…), write_once (never overwrite a value already in HubSpot), value_mapping ({ nexor_value: hubspot_option }), is_active, hubspot_property_label, hubspot_property_type. Use get_hubspot_config first; the stage → lifecycle mapping is set_hubspot_lifecycle_mapping, not this. Returns applied rows and the full read-back.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_hubspot_inbound_properties`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`properties`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Write the INBOUND mapping: HubSpot contact properties copied into lead.metadata by every intake door (list sync, imports, webhooks) — the lever for “bring X from HubSpot so the agent doesn’t re-ask it”. One row per hubspot_property; rows not listed are left untouched; metadata_key=null removes that property’s row. Property names are validated against the portal (404 property_not_found with suggestions) and read-only/calculated properties ARE valid here — form data lives in recent_conversion_event_name / recent_conversion_date / hs_analytics_first_url, and hs_object_id gives the contact id. Applies to leads created or updated from then on; it does not rewrite existing leads. This is NOT set_hubspot_field_mappings (that one is outbound, Nexor → HubSpot). Read get_hubspot_config.inbound_properties first.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_hubspot_lifecycle_mapping`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`value_mapping`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Set how Nexor stages map onto a HubSpot contact property (default lifecyclestage): value_mapping = { nexor_status_key: hubspot_option_internal_value }, e.g. { qualified: ‘salesqualifiedlead’, booked: ‘opportunity’ }. Pass value_mapping=null to clear. Stage keys come from get_workflow; option values are the HubSpot property’s internal option values. Returns the stored row.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_hubspot_list_routing`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`rules`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Replace the HubSpot list → workflow routing with the given rules (FULL replace: a list omitted here stops being routed; pass rules=[] to clear). Each rule: list_id (numeric HubSpot list id, or v3:\u003cid>), workflow_id (the agent that receives contacts entering the list), optional name, recurring (keep pulling new members), pause_on_exit (pause the lead when it leaves the list), sync_interval_minutes (supported intervals only). Read the current rules with get_hubspot_config and send them back with your change — this is not a merge. Then run_hubspot_import(list_id) to pull the current members.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_hubspot_deal_sync`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`enabled`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Configure deal sync (HubSpot deal stage changes → Nexor conversions/lost). enabled=true requires pipeline_id (a HubSpot DEAL pipeline id); active_stages are the stage ids that count as won (creates a conversion of conversion_type_id when the deal reaches them), lost_stages the ones that mark the lead lost. Optional workflow_id pins which agent’s leads are swept (default: the connection’s default workflow). Ids are validated against HubSpot (404 pipeline_not_found / stage_not_found with the available ones). Runtime keys (cursor, last_swept_at) are preserved. Returns the stored deal_sync.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`map_hubspot_owners_to_hosts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`mappings`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Map HubSpot owners (sales reps) to Nexor team members so a lead assigned to a rep routes to that host’s calendar and outbound sync writes the right hubspot_owner_id. Each mapping names the owner (owner_email or owner_id, matched against the portal’s owners) and the member (user_id from list_team, or user_email). Writes the owner id on the member (client_users.external_ids[external_key], the same field the dashboard member form edits, so both resolve the same host). Returns applied, unmatched (owner_not_found / user_not_found) and advisory warnings: no_calendar_connected, calendar_email_mismatch (the member’s connected calendar email differs from the owner’s) — warnings never block. Verify with get_hubspot_config.owner_mappings or list_team.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`install_hubspot_agent_tools`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`workflow_id`}),`, `,_jsx(_components.code,{children:`tools`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Install platform HubSpot tools on an agent with their fixed parameters — the same rows the dashboard HubSpot agent-tools panel creates, so list_workflow_tools / list_hubspot_agent_tools show them. tools: create_contact (no params), create_communication (no params; optional summary_instructions), assign_owner (optional owner = HubSpot owner id for a fixed owner; omitted = the lead’s Nexor assignee), create_deal (REQUIRES pipeline + stage: deal pipeline/stage ids), update_deal (REQUIRES stage; only if the catalog carries it), sync_lead_stage (REQUIRES lead_pipeline + status_map), sync_deal_stage (REQUIRES pipeline + status_map). Ids are validated against HubSpot and status_map keys against the workflow’s stages (400 missing_fixed_parameter lists what is missing per tool; 404 pipeline_not_found / stage_not_found / lead_pipeline_not_found / owner_not_found return the available ids; 409 tool_unavailable = the connection lacks the scope). Idempotent: re-installing updates the fixed params. A booking agent that must log to HubSpot needs at least create_contact + create_communication.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_hubspot_agent_tools`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflow_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the platform HubSpot tools installed on a workflow with their fixed config read back in install vocabulary (create_deal → pipeline/stage; sync_*_stage → pipeline or lead_pipeline + status_map; assign_owner → owner_source; create_communication → summary_instructions), plus is_active, inherited, auto_run_on_entry, tool_available_for_agent and available_in_statuses. Also returns installable (the tool names) and fixed_parameters (required/optional per tool). Same rows list_workflow_tools shows, filtered to HubSpot.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_hubspot_import`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Import HubSpot contacts into Nexor as leads. Exactly one selector: list_id (a routed or any HubSpot list; queued in the background, returns job_id), contact_ids (specific contact ids; runs inline and returns stats), or all=true (every contact in the portal; queued, 409 import_in_progress if one is running). Optional workflow_id pins the agent the new leads enter (default: the list’s routing rule, else the connection’s default workflow; null = no auto-assignment). This creates leads and may start outreach — it is an operational run: call with confirm:false (or omit it) to get a needs_confirmation preview that does nothing; only pass confirm:true after the operator explicitly approves. Track with get_hubspot_sync_status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_hubspot_sync_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Read HubSpot sync health: connection (sync_status, last_sync_at, last_sync_error, token_expired), inbound_enabled, import_all progress, per-list import stats for routed lists, deal_sync sweep state (last_swept_at, rate_limited_until), last_7_days counts per direction/status and recent_failures (event, error, contact). The poll target after run_hubspot_import and the first read when a client says HubSpot is not syncing.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Cloud Functions (19)`,id:`cloud-functions-19`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`describe_cloud_functions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Explain Cloud Functions: supported triggers, runtime globals, buffered effects, environment variables, the draft → test → publish lifecycle, and test safety. Call before authoring code.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_cloud_functions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List Cloud Functions with trigger, active/deployment health summary, and last-run metadata.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_cloud_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get one Cloud Function, including its published code and pending draft (code_draft, draft_hash, has_draft).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_cloud_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`trigger_event`}),`, `,_jsx(_components.code,{children:`code`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create an event-driven Cloud Function, inactive unless is_active is passed. Read the triggering lead from ctx.lead/lead and use native effects instead of refetching it through the public leads API. Test it with test_cloud_function, then activate with update_cloud_function.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_cloud_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Update a Cloud Function. A code change replaces the entire draft code string and returns draft_hash: production keeps the published code until test_cloud_function and a user-approved publish_cloud_function. Other fields save immediately; activation runs the published code, not the draft.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`test_cloud_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Test the draft (or the published code when there is no draft) without real effects. Pass an event-shaped ctx. HTTP reads go out for real; other methods get a synthetic 200 and are listed in outbound.would_send; Nexor effects are preview-only. Show the user what would be sent and the previewed effects before asking to publish.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`publish_cloud_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`function_id`}),`, `,_jsx(_components.code,{children:`expected_draft_hash`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Publish the pending draft of a Cloud Function so production runs it and record a version. Requires confirm:true after the user explicitly approves the tested draft, and expected_draft_hash (the draft_hash from update_cloud_function or get_cloud_function). CONFLICT draft_changed_since_preview: re-read, re-test and ask again. Does not activate an inactive function.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`discard_cloud_function_draft`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Discard the pending code draft of a Cloud Function. The published code keeps running. Idempotent. Ask the user first: unpublished edits are lost.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_cloud_function_versions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the published versions of a Cloud Function, newest first, without code. is_published marks the version production runs.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_cloud_function_version`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`function_id`}),`, `,_jsx(_components.code,{children:`version_number`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get one published version of a Cloud Function, including its code.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`restore_cloud_function_version`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`function_id`}),`, `,_jsx(_components.code,{children:`version_number`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Copy a published version of a Cloud Function into the draft. Production is unchanged until the draft is tested and published. A CONFLICT with draft_already_open means unpublished edits exist: pass replace_draft:true only after the user agrees to lose them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_cloud_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Aprobación del operador en instrucciones`}),_jsx(_components.td,{children:`Permanently delete a Cloud Function, its run history, and its deployed Worker. Destructive: confirm with the operator first.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_cloud_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Alias of test_cloud_function kept for existing callers: tests the draft without real effects. Prefer test_cloud_function.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_cloud_function_runs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List compact Cloud Function run summaries; filter by function, lead, trigger source, or status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_cloud_function_run`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`run_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get full Cloud Function trace detail: ctx, logs, result/error, network requests, proposed/applied effects, and lead snapshots.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`clear_cloud_function_runs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Aprobación del operador en instrucciones`}),_jsx(_components.td,{children:`Permanently clear Cloud Function run history, optionally for one function. Destructive: confirm with the operator first.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_function_environment_variables`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List names and timestamps of client-wide, write-only environment variables shared by Cloud and Scheduled Functions. Values are never returned.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_function_environment_variable`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`key`}),`, `,_jsx(_components.code,{children:`value`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create or replace a shared secret. Key must match ^[A-Z][A-Z0-9_]{0,63}$. The value is encrypted, never echoed, and triggers redeployment of active Cloud/Scheduled Functions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_function_environment_variable`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`key`})}),_jsx(_components.td,{children:`Aprobación del operador en instrucciones`}),_jsx(_components.td,{children:`Delete a shared environment variable and redeploy active functions without it. Destructive and may break code that reads env.KEY; confirm first.`})]})]})]})}),`\n`,_jsx(Accordion,{title:`Scheduled Functions (18)`,id:`scheduled-functions-18`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Tipo`}),_jsx(_components.th,{children:`Argumento obligatorio de primer nivel`}),_jsx(_components.th,{children:`Resguardo o disponibilidad`}),_jsx(_components.th,{children:`Propósito canónico (EN)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`describe_scheduled_functions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Explain Scheduled Functions, cohort lookup syntax, runtime/effects, scheduling, the draft → test → publish lifecycle, and the real-effect manual run.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_scheduled_functions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List Scheduled Functions with cron, timezone, next/last run, active state, and cohort cap.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_scheduled_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get one Scheduled Function including its published code, pending draft (code_draft, draft_hash, has_draft) and lookup configuration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_scheduled_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`cron_expression`}),`, `,_jsx(_components.code,{children:`timezone`}),`, `,_jsx(_components.code,{children:`code`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Create a cron function, inactive unless is_active is passed. Put lead filtering/order/limit in lookup_config, preview the schedule and cohort, then make code consume ctx.leads; never refetch that cohort through the public leads API. Test it with test_scheduled_function before activating.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_scheduled_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Update schedule, cohort, code, metadata, or active state. A code change is saved as a draft and returns draft_hash: production keeps the published code until test_scheduled_function and a user-approved publish_scheduled_function. Other fields save immediately; cron/timezone changes recompute next_run_at; activation runs the published code, not the draft.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`test_scheduled_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Test the draft (or the published code when there is no draft) without real effects. Without ctx it resolves the saved cohort read-only. HTTP reads go out for real; other methods get a synthetic 200 and are listed in outbound.would_send; Nexor effects are preview-only. Show the user what would be sent and the previewed effects before asking to publish.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`publish_scheduled_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`function_id`}),`, `,_jsx(_components.code,{children:`expected_draft_hash`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Publish the pending draft of a Scheduled Function so production runs it and record a version. Requires confirm:true after the user explicitly approves the tested draft, and expected_draft_hash (the draft_hash from update_scheduled_function or get_scheduled_function). CONFLICT draft_changed_since_preview: re-read, re-test and ask again. Does not activate an inactive function.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`discard_scheduled_function_draft`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Discard the pending code draft of a Scheduled Function. The published code keeps running. Idempotent. Ask the user first: unpublished edits are lost.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_scheduled_function_versions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List the published versions of a Scheduled Function, newest first, without code. is_published marks the version production runs.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_scheduled_function_version`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`function_id`}),`, `,_jsx(_components.code,{children:`version_number`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get one published version of a Scheduled Function, including its code.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`restore_scheduled_function_version`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`function_id`}),`, `,_jsx(_components.code,{children:`version_number`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Copy a published version of a Scheduled Function into the draft. Production is unchanged until the draft is tested and published. A CONFLICT with draft_already_open means unpublished edits exist: pass replace_draft:true only after the user agrees to lose them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_scheduled_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`function_id`})}),_jsx(_components.td,{children:`Aprobación del operador en instrucciones`}),_jsx(_components.td,{children:`Permanently delete a Scheduled Function, run history, and Worker. Destructive: confirm first.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`preview_scheduled_function_schedule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`cron_expression`}),`, `,_jsx(_components.code,{children:`timezone`})]}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Validate a five-field cron in an IANA timezone and return its next 1-10 UTC occurrences.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`preview_scheduled_function_cohort`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lookup_config`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Resolve a lookup_config without running code. Returns matching count and bounded sample so you can verify who would enter ctx.leads.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_scheduled_function`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`function_id`}),`, `,_jsx(_components.code,{children:`confirm`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`confirm: true`})}),_jsx(_components.td,{children:`Run the PUBLISHED version of a Scheduled Function immediately. WARNING: unlike test_scheduled_function, this applies buffered effects to real tenant data and sends real HTTP writes. Use test_scheduled_function to try a draft. Only call after the operator explicitly confirms the cohort from preview_scheduled_function_cohort; pass confirm:true. The result omits run.ctx (the resolved cohort echoed back); read it with get_scheduled_function_run, or pass include_ctx:true.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_scheduled_function_runs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`List Scheduled Function execution summaries by function/status with pagination.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_scheduled_function_run`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:read`})}),_jsx(_components.td,{children:`Lectura`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`run_id`})}),_jsx(_components.td,{children:`Sin campo de contrato`}),_jsx(_components.td,{children:`Get a full Scheduled Function trace: resolved cohort context, logs, network, result/error, and applied/failed effects.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`clear_scheduled_function_runs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`workflows:write`})}),_jsx(_components.td,{children:`Escritura`}),_jsx(_components.td,{children:`Ninguno`}),_jsx(_components.td,{children:`Aprobación del operador en instrucciones`}),_jsx(_components.td,{children:`Permanently clear Scheduled Function run history, optionally for one function. Destructive: confirm first.`})]})]})]})}),`\n`,_jsx(Heading,{level:`2`,id:`fuente-fijada-y-regeneración`,children:`Fuente fijada y regeneración`}),`\n`,_jsxs(_components.p,{children:[`Generado desde `,_jsx(_components.code,{children:`getnexor-ai/nexor-public-mcp`}),` en `,_jsx(_components.code,{children:`2ae64b97252d1263472c223bf055d4ee907dbbc6`}),`, usando `,_jsx(_components.code,{children:`docs/tool-manifest.json`}),` (SHA-256 `,_jsx(_components.code,{children:`2e64adc926eac7adca75463e0de2aa9b173c821167abfd27148540e26c7be19c`}),`).`]}),`\n`,_jsx(_components.p,{children:`Después de hacer checkout local de ese commit exacto:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` mcp:snapshot`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /absolute/path/to/nexor-public-mcp`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` mcp:check`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /absolute/path/to/nexor-public-mcp`})]}),`\n`]})})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Catálogo de tools MCP","sidebarTitle":"Catálogo de tools","description":"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.","href":"/docs/es/api/mcp-server/tools"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Cómo leer el catálogo","slug":"cómo-leer-el-catálogo","depth":2,"children":[]},{"title":"Fuente fijada y regeneración","slug":"fuente-fijada-y-regeneración","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"nexor","siteName":"Nexor","title":"Catálogo de tools MCP - Nexor","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/docs/en/api/mcp-server/tools","matchLevel":1},"es":{"href":"/docs/es/api/mcp-server/tools","matchLevel":0}}},"lastModified":"2026-10-23T02:35:28.352Z","gitLastModified":"2026-10-23T02:34:53.000Z","originalFileLocation":"docs/es/api/mcp-server/tools.mdx","locale":"es"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Nexor\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Catálogo de tools MCP - Nexor\">\u003cmeta data-mint-head property=\"og:description\" content=\"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Nexor\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nexor.mintlify.app/_mintlify/api/og/v2?division=Servidor+MCP\u0026amp;title=Cat%C3%A1logo+de+tools+MCP\u0026amp;description=Referencia+generada+de+las+409+tools+MCP+no+administrativas+que+el+servidor+p%C3%BAblico+de+Nexor+muestra+a+sesiones+de+cliente.\u0026amp;theme=037d1cc75bf91caea6657ed7\u0026amp;signature=cbaef7752a39ffa856bcbd5db3bd641707b8a80bbfaa649857076558b349a79a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Catálogo de tools MCP - Nexor\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nexor.mintlify.app/_mintlify/api/og/v2?division=Servidor+MCP\u0026amp;title=Cat%C3%A1logo+de+tools+MCP\u0026amp;description=Referencia+generada+de+las+409+tools+MCP+no+administrativas+que+el+servidor+p%C3%BAblico+de+Nexor+muestra+a+sesiones+de+cliente.\u0026amp;theme=037d1cc75bf91caea6657ed7\u0026amp;signature=cbaef7752a39ffa856bcbd5db3bd641707b8a80bbfaa649857076558b349a79a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/nexor/LDGxX4GCDO05TtkY/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Nexor\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0A0A0A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/es/api/mcp-server/tools.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.getnexor.ai/docs/en/api/mcp-server/tools\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.getnexor.ai/docs/en/api/mcp-server/tools\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.getnexor.ai/#organization\",\"name\":\"Nexor\",\"url\":\"https://docs.getnexor.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nexor/f1Gy8zY6i2a68PTn/images/logo-black.svg?fit=max\u0026auto=format\u0026n=f1Gy8zY6i2a68PTn\u0026q=85\u0026s=2a5ea3c97db1c6499f5f24571b593e6f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.getnexor.ai#website\",\"name\":\"Nexor\",\"url\":\"https://docs.getnexor.ai\",\"publisher\":{\"@id\":\"https://docs.getnexor.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools#webpage\",\"url\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools\",\"name\":\"Catálogo de tools MCP\",\"description\":\"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.\",\"dateModified\":\"2026-10-23T02:34:53.000Z\",\"isPartOf\":{\"@id\":\"https://docs.getnexor.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Referencia API\",\"item\":\"https://docs.getnexor.ai/docs/es/api/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Servidor MCP\",\"item\":\"https://docs.getnexor.ai/docs/es/api/mcp-server\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Catálogo de tools MCP\",\"item\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools#article\",\"headline\":\"Catálogo de tools MCP\",\"name\":\"Catálogo de tools MCP\",\"description\":\"Referencia generada de las 409 tools MCP no administrativas que el servidor público de Nexor muestra a sesiones de cliente.\",\"url\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools\",\"mainEntityOfPage\":{\"@id\":\"https://docs.getnexor.ai/docs/es/api/mcp-server/tools#webpage\"},\"dateModified\":\"2026-10-23T02:34:53.000Z\",\"publisher\":{\"@id\":\"https://docs.getnexor.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.getnexor.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Nexor\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Nexor","nav":{"global":null,"languages":[{"language":"en","pages":[{"title":"en","href":"/docs/en/api/mcp-server/tools"}]},{"language":"es","groups":[{"group":"Empieza aquí","pages":[{"title":"Bienvenido a Nexor","sidebarTitle":"Bienvenida","href":"/docs/es/guides/getting-started"},{"title":"Agentes y tareas","sidebarTitle":"Agentes y tareas","href":"/docs/es/guides/getting-started/anatomy-of-an-agent"},{"title":"Changelog","href":"/docs/es/changelog"}]},{"group":"Quickstart","pages":[{"title":"Conecta canales y trae tus leads","sidebarTitle":"Conecta tus canales","href":"/docs/es/guides/getting-started/operate-and-connect-channels"},{"title":"Crea tu primer agente","sidebarTitle":"Configura tu agente","href":"/docs/es/guides/getting-started/overview"},{"title":"Comparte tus leads e integra tus sistemas","sidebarTitle":"Comparte tus leads","href":"/docs/es/guides/integrations/overview"}]},{"group":"Referencia API","pages":[{"title":"Introducción a la API de Nexor","sidebarTitle":"Introducción","href":"/docs/es/api/introduction"},{"title":"Autenticación","sidebarTitle":"Autenticación","href":"/docs/es/api/authentication"},{"title":"SDK de JavaScript","sidebarTitle":"SDK de JavaScript","href":"/docs/es/api/sdk"},{"group":"Servidor MCP","pages":[{"title":"Servidor MCP","sidebarTitle":"Servidor MCP","description":"Conecta Claude, Codex, Cursor o Claude Desktop al servidor MCP con sesión de Nexor, usando claves con scopes y controles explícitos de seguridad. Interpreta las respuestas revisadas en el timeline de cada turno.","href":"/docs/es/api/mcp-server"},{"title":"Catálogo de tools MCP","sidebarTitle":"Catálogo de tools","href":"/docs/es/api/mcp-server/tools"}]},{"group":"Leads","expanded":true,"pages":[{"title":"Crear o actualizar leads","sidebarTitle":"Crear","openapi":"openapi.json POST /leads","description":"Crea o actualiza un lead o un lote con éxito parcial. Nota de seguridad: Esta operación hace upsert: una identidad existente puede actualizarse. move desactiva otros runs, do_not_contact suprime el enrolamiento y los campos de envío forzado pueden contactar de inmediato.","href":"/docs/es/api/leads/create-lead"},{"title":"Forzar Primer Mensaje","sidebarTitle":"Primer mensaje","href":"/docs/es/api/leads/force-first-message"},{"title":"Listar Leads","sidebarTitle":"Listar","openapi":"openapi.json GET /leads","href":"/docs/es/api/leads/list-leads"},{"title":"Listar conversaciones de prueba","sidebarTitle":"Conversaciones de prueba","openapi":"openapi.json GET /test-conversations","href":"/docs/es/api/leads/list-test-conversations"},{"title":"Iniciar una conversación de prueba","sidebarTitle":"Iniciar conversación de prueba","openapi":"openapi.json POST /test-conversations","href":"/docs/es/api/leads/start-test-conversation"},{"title":"Enviar un mensaje en una conversación de prueba","sidebarTitle":"Enviar mensaje de prueba","openapi":"openapi.json POST /test-conversations/{conversation_id}/messages","href":"/docs/es/api/leads/send-test-message"},{"title":"Obtener Lead","sidebarTitle":"Obtener","openapi":"openapi.json GET /leads/{id}","href":"/docs/es/api/leads/get-lead"},{"title":"Actualizar Lead","sidebarTitle":"Actualizar","openapi":"openapi.json PUT /leads/{id}","href":"/docs/es/api/leads/update-lead"},{"title":"Patch Lead","sidebarTitle":"Patch","openapi":"openapi.json PATCH /leads/{id}","href":"/docs/es/api/leads/patch-lead"},{"title":"Forzar Estado del Lead","sidebarTitle":"Forzar Estado","openapi":"openapi.json POST /leads/{id}/status","href":"/docs/es/api/leads/set-status"},{"title":"Patch Tags","sidebarTitle":"Patch tags","openapi":"openapi.json POST /leads/tags","href":"/docs/es/api/leads/patch-tags"},{"title":"Bulk Patch Metadata","sidebarTitle":"Bulk patch metadata","openapi":"openapi.json PATCH /leads/metadata","href":"/docs/es/api/leads/patch-metadata"},{"title":"Archivar un lead","sidebarTitle":"Archivar","openapi":"openapi.json DELETE /leads/{id}","href":"/docs/es/api/leads/delete-leads-by-id"},{"title":"Asignar Agente a Lead","sidebarTitle":"Asignar Agente","openapi":"openapi.json POST /leads/{id}/assign-workflow","href":"/docs/es/api/leads/assign-workflow"},{"title":"Obtener Historial del Lead","sidebarTitle":"Obtener Historial","openapi":"openapi.json GET /leads/{id}/history","href":"/docs/es/api/leads/get-lead-history"},{"title":"Obtener Reuniones del Lead","sidebarTitle":"Obtener Reuniones","openapi":"openapi.json GET /leads/{id}/meetings","href":"/docs/es/api/leads/get-lead-meetings"},{"title":"Detener Automatización","sidebarTitle":"Detener","openapi":"openapi.json POST /leads/{id}/automation/stop","href":"/docs/es/api/leads/stop-automation"},{"title":"Reanudar Automatización","sidebarTitle":"Reanudar","openapi":"openapi.json POST /leads/{id}/automation/resume","href":"/docs/es/api/leads/resume-automation"}]},{"group":"Workflows (tareas)","expanded":true,"pages":[{"title":"Listar Agentes","sidebarTitle":"Listar","openapi":"openapi.json GET /workflows","href":"/docs/es/api/workflows/list-workflows"},{"title":"Consultar un agente","sidebarTitle":"Detalles","openapi":"openapi.json GET /workflows/{id}","href":"/docs/es/api/workflows/get-workflow"},{"title":"Crear un agente","sidebarTitle":"Crear","openapi":"openapi.json POST /workflows","href":"/docs/es/api/workflows/create-workflow"},{"title":"Actualizar un agente","sidebarTitle":"Actualizar","openapi":"openapi.json PATCH /workflows/{id}","href":"/docs/es/api/workflows/update-workflow"},{"title":"Archivar un agente","sidebarTitle":"Archivar","openapi":"openapi.json DELETE /workflows/{id}","href":"/docs/es/api/workflows/delete-workflows-by-id"},{"title":"Actualizar la estructura de un agente","sidebarTitle":"Estructura","openapi":"openapi.json PATCH /workflows/{id}/structure","href":"/docs/es/api/workflows/update-workflow-structure"},{"title":"Probar Workflow Tool","sidebarTitle":"Probar una herramienta","openapi":"openapi.json POST /workflows/{id}/tools/{toolId}/test","href":"/docs/es/api/workflow-tools/test-workflow-tool"}]},{"group":"Mensajes","expanded":true,"pages":[{"title":"Enviar Mensaje","sidebarTitle":"Enviar","openapi":"openapi.json POST /messages","href":"/docs/es/api/messages/send-message"},{"title":"Listar Templates de WhatsApp","sidebarTitle":"Listar plantillas","openapi":"openapi.json GET /templates","href":"/docs/es/api/messages/list-templates"}]},{"group":"Reuniones","expanded":false,"pages":[{"title":"Registrar una Reunión","sidebarTitle":"Registrar","openapi":"openapi.json POST /meetings","href":"/docs/es/api/meetings/create-meeting"},{"title":"Listar reuniones","sidebarTitle":"Listar","openapi":"openapi.json GET /meetings","href":"/docs/es/api/meetings/get-meetings"},{"title":"Consultar una reunión","sidebarTitle":"Detalles","openapi":"openapi.json GET /meetings/{id}","href":"/docs/es/api/meetings/get-meetings-by-id"},{"title":"Cancelar una Reunión","sidebarTitle":"Cancelar","openapi":"openapi.json POST /meetings/{id}/cancel","href":"/docs/es/api/meetings/cancel-meeting"},{"title":"Reprogramar una reunión","sidebarTitle":"Reprogramar","openapi":"openapi.json PATCH /meetings/{id}/reschedule","href":"/docs/es/api/meetings/patch-meetings-by-id-reschedule"},{"title":"Reservar una reunión","sidebarTitle":"Reservar","openapi":"openapi.json POST /meetings/book","href":"/docs/es/api/meetings/post-meetings-book"},{"title":"Consultar horarios disponibles para reuniones","sidebarTitle":"Horarios disponibles","openapi":"openapi.json GET /workflows/{id}/slots","href":"/docs/es/api/meetings/get-workflows-by-id-slots"},{"title":"Marcar una Reunión como No-Show","sidebarTitle":"Marcar como No-show","openapi":"openapi.json POST /meetings/{id}/no-show","href":"/docs/es/api/meetings/mark-no-show"},{"title":"Marcar una Reunión como Completada","sidebarTitle":"Marcar como Completada","openapi":"openapi.json POST /meetings/{id}/complete","href":"/docs/es/api/meetings/complete-meeting"}]},{"group":"Conversiones","expanded":false,"pages":[{"title":"Listar Eventos de Conversión","sidebarTitle":"Listar Eventos","openapi":"openapi.json GET /conversions","href":"/docs/es/api/conversions/list-conversions"},{"title":"Crear Evento de Conversión","sidebarTitle":"Crear Evento","openapi":"openapi.json POST /conversions","href":"/docs/es/api/conversions/create-conversion"},{"title":"Listar Tipos de Conversión","sidebarTitle":"Listar Tipos","openapi":"openapi.json GET /conversion-types","href":"/docs/es/api/conversions/list-conversion-types"}]},{"group":"Reportes","expanded":false,"pages":[{"title":"Reporte de Funnel","sidebarTitle":"Funnel","openapi":"openapi.json GET /reports/funnel","href":"/docs/es/api/reports/get-funnel-report"},{"title":"Reporte de Lead","sidebarTitle":"Lead","openapi":"openapi.json GET /reports/lead/{lead_id}","href":"/docs/es/api/reports/get-lead-report"},{"title":"Consultar estadísticas de reuniones","sidebarTitle":"Estadísticas de reuniones","openapi":"openapi.json GET /reports/meeting-stats","href":"/docs/es/api/reports/get-reports-meeting-stats"},{"title":"Desempeño del equipo","sidebarTitle":"Desempeño del equipo","openapi":"openapi.json GET /reports/team-performance","href":"/docs/es/api/reports/get-team-performance"},{"title":"Salud de las herramientas","sidebarTitle":"Salud de las herramientas","openapi":"openapi.json GET /tool-health","href":"/docs/es/api/reports/get-tool-health"},{"title":"Exportar un reporte de leads","sidebarTitle":"Exportar leads","openapi":"openapi.json POST /reports/leads/export","href":"/docs/es/api/reports/post-reports-leads-export"}]},{"group":"Bandeja de entrada","expanded":false,"pages":[{"title":"Conteos de Inbox","sidebarTitle":"Conteos","openapi":"openapi.json GET /inbox/summary","href":"/docs/es/api/inbox/get-inbox-summary"},{"title":"Listar escalaciones","sidebarTitle":"Escalaciones","openapi":"openapi.json GET /escalations","href":"/docs/es/api/inbox/list-escalations"}]},{"group":"Disponibilidad del equipo","expanded":false,"pages":[{"title":"Consultar la disponibilidad del equipo","sidebarTitle":"Consultar","openapi":"openapi.json GET /team/availability","href":"/docs/es/api/team/get-team-availability"},{"title":"Cambiar el tiempo de inactividad","sidebarTitle":"Cambiar tiempo de inactividad","openapi":"openapi.json PATCH /team/availability/settings","href":"/docs/es/api/team/patch-team-availability-settings"},{"title":"Poner Ausente a un miembro del equipo","sidebarTitle":"Poner Ausente","openapi":"openapi.json PUT /team/availability/{user_id}","href":"/docs/es/api/team/put-team-availability-by-user-id"}]},{"group":"Webhooks","expanded":false,"pages":[{"title":"Descripción general","href":"/docs/es/api/webhooks/overview"},{"title":"Recibir leads por webhook","sidebarTitle":"Leads entrantes","openapi":"openapi.json POST /leads/webhook","href":"/docs/es/api/webhooks/inbound-leads"},{"title":"Evento: Cambio de estado","href":"/docs/es/api/webhooks/status-changed"},{"title":"Evento: Eventos de reunión","href":"/docs/es/api/webhooks/meeting-events"},{"title":"Evento: Outreach fallido","href":"/docs/es/api/webhooks/outreach-failed"},{"title":"Eventos: Mensaje enviado, entregado y recibido","href":"/docs/es/api/webhooks/message-events"},{"title":"Verificación de firmas","href":"/docs/es/api/webhooks/verifying-signatures"},{"title":"Reintentos y manejo de errores","href":"/docs/es/api/webhooks/retries-and-errors"}]},{"group":"Configuración CRM","expanded":false,"pages":[{"title":"Listar opciones de agenda del CRM","sidebarTitle":"Opciones","openapi":"openapi.json GET /crm-management/booking/choices","href":"/docs/es/api/crm-management/list-choices"},{"title":"Consultar agenda nativa del CRM","sidebarTitle":"Consultar configuración","openapi":"openapi.json GET /crm-management/booking","href":"/docs/es/api/crm-management/get-booking"},{"title":"Configurar agenda nativa del CRM","sidebarTitle":"Configurar o retirar","openapi":"openapi.json POST /crm-management/booking","href":"/docs/es/api/crm-management/change-booking"},{"title":"Consultar ejecuciones de importación GHL","sidebarTitle":"Ejecuciones de importación","openapi":"openapi.json GET /crm-management/gohighlevel/import-status","href":"/docs/es/api/crm-management/get-ghl-import-status"}]},{"group":"CRM por chat","expanded":false,"pages":[{"title":"Configurar integraciones CRM por chat","sidebarTitle":"Configuración CRM por chat","href":"/docs/es/guides/integrations/crm-chat-configuration"},{"title":"Consultar URL y campos recibidos","sidebarTitle":"Consultar URL y campos recibidos","openapi":"openapi.json GET /crm-account/intake-details","href":"/docs/es/api/crm-chat/get-crm-intake-details"},{"title":"Renovar URL de recepción de Kommo","sidebarTitle":"Renovar URL de recepción de Kommo","openapi":"openapi.json POST /crm-account/kommo/rotate-token","href":"/docs/es/api/crm-chat/rotate-kommo-webhook-token"},{"title":"Consultar trabajo de importación","sidebarTitle":"Consultar trabajo de importación","openapi":"openapi.json GET /crm-account/import-job","href":"/docs/es/api/crm-chat/get-crm-import-job"},{"title":"Revisar sincronización manual de HubSpot","sidebarTitle":"Revisar sincronización manual de HubSpot","openapi":"openapi.json GET /crm-account/hubspot/sync-preview","href":"/docs/es/api/crm-chat/get-hubspot-sync-preview"},{"title":"Ejecutar sincronización manual de HubSpot","sidebarTitle":"Ejecutar sincronización manual de HubSpot","openapi":"openapi.json POST /crm-account/hubspot/sync","href":"/docs/es/api/crm-chat/run-hubspot-sync"},{"title":"Consultar conflictos de Odoo","sidebarTitle":"Consultar conflictos de Odoo","openapi":"openapi.json GET /crm-account/odoo/conflicts","href":"/docs/es/api/crm-chat/list-odoo-sync-conflicts"},{"title":"Resolver un conflicto de Odoo","sidebarTitle":"Resolver un conflicto de Odoo","openapi":"openapi.json POST /crm-account/odoo/conflicts/resolve","href":"/docs/es/api/crm-chat/resolve-odoo-sync-conflict"},{"title":"Preparar salidas de Odoo","sidebarTitle":"Preparar salidas de Odoo","openapi":"openapi.json POST /crm-account/odoo/outputs","href":"/docs/es/api/crm-chat/change-odoo-account-outputs"},{"title":"Listar conexiones de la cuenta","sidebarTitle":"Listar conexiones de la cuenta","openapi":"openapi.json GET /crm-account/connections","href":"/docs/es/api/crm-chat/list-crm-account-connections"},{"title":"Configurar entradas compartidas de Odoo","sidebarTitle":"Configurar entradas compartidas de Odoo","openapi":"openapi.json POST /crm-account/odoo/inputs","href":"/docs/es/api/crm-chat/change-odoo-account-inputs"},{"title":"Consultar configuración de cuenta","sidebarTitle":"Consultar configuración de cuenta","openapi":"openapi.json GET /crm-account/configuration","href":"/docs/es/api/crm-chat/get-crm-account-configuration"},{"title":"Configurar valores generales de Zoho","sidebarTitle":"Configurar valores generales de Zoho","openapi":"openapi.json POST /crm-account/zoho/defaults","href":"/docs/es/api/crm-chat/change-zoho-account-defaults"},{"title":"Configurar controles generales de HubSpot","sidebarTitle":"Configurar controles generales de HubSpot","openapi":"openapi.json POST /crm-account/hubspot/controls","href":"/docs/es/api/crm-chat/change-hubspot-account-controls"},{"title":"Reasignar una entrada del CRM","sidebarTitle":"Reasignar una entrada del CRM","openapi":"openapi.json POST /crm-account/reassign","href":"/docs/es/api/crm-chat/reassign-crm-intake"},{"title":"Solicitar importación del CRM","sidebarTitle":"Solicitar importación del CRM","openapi":"openapi.json POST /crm-account/import","href":"/docs/es/api/crm-chat/run-crm-account-import"},{"title":"Consultar diagnóstico del CRM","sidebarTitle":"Consultar diagnóstico del CRM","openapi":"openapi.json GET /crm-management/diagnostics","href":"/docs/es/api/crm-chat/get-agent-crm-diagnostics"},{"title":"Consultar opciones de HubSpot","sidebarTitle":"Consultar opciones de HubSpot","openapi":"openapi.json GET /crm-management/hubspot/catalog","href":"/docs/es/api/crm-chat/list-agent-hubspot-catalog"},{"title":"Contar registros de una ruta de Kommo","sidebarTitle":"Contar registros de una ruta de Kommo","openapi":"openapi.json GET /crm-management/kommo/source-count","href":"/docs/es/api/crm-chat/count-agent-kommo-source"},{"title":"Consultar entradas de Odoo por Agente","sidebarTitle":"Consultar entradas de Odoo por Agente","openapi":"openapi.json GET /crm-management/odoo/inputs","href":"/docs/es/api/crm-chat/get-agent-odoo-inputs"},{"title":"Previsualizar entradas de Odoo por Agente","sidebarTitle":"Previsualizar entradas de Odoo por Agente","openapi":"openapi.json POST /crm-management/odoo/inputs/preview","href":"/docs/es/api/crm-chat/preview-agent-odoo-inputs"},{"title":"Guardar entradas de Odoo por Agente","sidebarTitle":"Guardar entradas de Odoo por Agente","openapi":"openapi.json POST /crm-management/odoo/inputs/save","href":"/docs/es/api/crm-chat/change-agent-odoo-inputs"},{"title":"Crear conexión CRM","sidebarTitle":"Crear conexión","openapi":"openapi.json POST /crm-connections/connect","href":"/docs/es/api/integrations/create-crm-connection"},{"title":"Consultar conexión CRM","sidebarTitle":"Estado de conexión","openapi":"openapi.json GET /crm-connections/{provider}","href":"/docs/es/api/integrations/get-crm-connection"},{"title":"Desconectar CRM","sidebarTitle":"Desconectar","openapi":"openapi.json POST /crm-connections/{provider}/disconnect","href":"/docs/es/api/integrations/disconnect-crm"}]},{"group":"Agentes","expanded":false,"pages":[{"title":"Configurar navegación de menús telefónicos","sidebarTitle":"Navegación de menús telefónicos","openapi":"openapi.json PUT /master-workflows/{id}/ivr-navigation","href":"/docs/es/api/master-workflows/set-ivr-navigation"}]},{"group":"Enrutador de entrada","expanded":false,"pages":[{"title":"Consultar enrutador de entrada","sidebarTitle":"Consultar configuración","openapi":"openapi.json GET /master-workflows/{id}/router","href":"/docs/es/api/inbound-router/get-inbound-router"},{"title":"Actualizar enrutador de entrada","sidebarTitle":"Actualizar configuración","openapi":"openapi.json PUT /master-workflows/{id}/router","href":"/docs/es/api/inbound-router/update-inbound-router"},{"title":"Listar reglas de enrutamiento","sidebarTitle":"Listar reglas","openapi":"openapi.json GET /master-workflows/{id}/router/rules","href":"/docs/es/api/inbound-router/list-routing-rules"},{"title":"Reemplazar reglas de enrutamiento","sidebarTitle":"Reemplazar reglas","openapi":"openapi.json PUT /master-workflows/{id}/router/rules","href":"/docs/es/api/inbound-router/replace-routing-rules"},{"title":"Actualizar identidad compartida","sidebarTitle":"Actualizar identidad","openapi":"openapi.json PUT /master-workflows/{id}/router/identity","href":"/docs/es/api/inbound-router/update-agent-identity"},{"title":"Probar un mensaje","sidebarTitle":"Probar un mensaje","openapi":"openapi.json POST /master-workflows/{id}/router/test","href":"/docs/es/api/inbound-router/test-inbound-router"},{"title":"Listar decisiones de enrutamiento","sidebarTitle":"Listar decisiones","openapi":"openapi.json GET /master-workflows/{id}/router/decisions","href":"/docs/es/api/inbound-router/list-routing-decisions"},{"title":"Consultar métricas de enrutamiento","sidebarTitle":"Consultar métricas","openapi":"openapi.json GET /master-workflows/{id}/router/stats","href":"/docs/es/api/inbound-router/get-routing-stats"},{"title":"Listar puntos de entrada","sidebarTitle":"Listar puntos de entrada","openapi":"openapi.json GET /entry-points","href":"/docs/es/api/inbound-router/list-entry-points"},{"title":"Definir el destino de un punto de entrada","sidebarTitle":"Definir destino","openapi":"openapi.json PUT /entry-points/destination","href":"/docs/es/api/inbound-router/set-entry-point-destination"}]},{"group":"Archivos del agente","expanded":false,"pages":[{"title":"Listar archivos del agente","sidebarTitle":"Listar","openapi":"openapi.json GET /file-library/files","href":"/docs/es/api/agent-files/list-agent-files"},{"title":"Consultar archivo del agente","sidebarTitle":"Consultar","openapi":"openapi.json GET /file-library/files/{id}","href":"/docs/es/api/agent-files/get-agent-file"},{"title":"Actualizar archivo del agente","sidebarTitle":"Actualizar","openapi":"openapi.json PATCH /file-library/files/{id}","href":"/docs/es/api/agent-files/update-agent-file"},{"title":"Cambiar disponibilidad del archivo","sidebarTitle":"Cambiar disponibilidad","openapi":"openapi.json PUT /file-library/files/{id}/availability","href":"/docs/es/api/agent-files/set-agent-file-availability"},{"title":"Eliminar archivo del agente","sidebarTitle":"Eliminar","openapi":"openapi.json DELETE /file-library/files/{id}","href":"/docs/es/api/agent-files/delete-agent-file"}]},{"group":"Subcuentas","expanded":false,"pages":[{"title":"Listar subcuentas","sidebarTitle":"Listar","openapi":"openapi.json GET /sub-accounts","href":"/docs/es/api/sub-accounts/list-sub-accounts"},{"title":"Crear subcuenta","sidebarTitle":"Crear","openapi":"openapi.json POST /sub-accounts","href":"/docs/es/api/sub-accounts/create-sub-account"},{"title":"Reenviar invitación de subcuenta","sidebarTitle":"Reenviar invitación","openapi":"openapi.json POST /sub-accounts/{sub_account_id}/invitations/resend","href":"/docs/es/api/sub-accounts/resend-sub-account-invitation"},{"title":"Copiar un agente a una subcuenta","sidebarTitle":"Copiar un agente","openapi":"openapi.json POST /sub-accounts/{sub_account_id}/agents/duplicate","href":"/docs/es/api/sub-accounts/copy-agent-to-sub-account"},{"title":"Pausar subcuenta","sidebarTitle":"Pausar","openapi":"openapi.json POST /sub-accounts/{sub_account_id}/pause","href":"/docs/es/api/sub-accounts/pause-sub-account"},{"title":"Desactivar subcuenta","sidebarTitle":"Desactivar","openapi":"openapi.json POST /sub-accounts/{sub_account_id}/deactivate","href":"/docs/es/api/sub-accounts/deactivate-sub-account"},{"title":"Reactivar subcuenta","sidebarTitle":"Reactivar","openapi":"openapi.json POST /sub-accounts/{sub_account_id}/reactivate","href":"/docs/es/api/sub-accounts/reactivate-sub-account"}]},{"group":"Funciones programadas","expanded":false,"pages":[{"title":"Listar funciones programadas","sidebarTitle":"Listar","openapi":"openapi.json GET /scheduled-functions","href":"/docs/es/api/scheduled-functions/list-scheduled-functions"},{"title":"Consultar una función programada","sidebarTitle":"Detalles","openapi":"openapi.json GET /scheduled-functions/{id}","href":"/docs/es/api/scheduled-functions/get-scheduled-function"},{"title":"Crear una función programada","sidebarTitle":"Crear","openapi":"openapi.json POST /scheduled-functions","href":"/docs/es/api/scheduled-functions/create-scheduled-function"},{"title":"Actualizar una función programada","sidebarTitle":"Actualizar","openapi":"openapi.json PATCH /scheduled-functions/{id}","href":"/docs/es/api/scheduled-functions/update-scheduled-function"},{"title":"Guardar un borrador de función programada","sidebarTitle":"Guardar borrador","openapi":"openapi.json PATCH /scheduled-functions/{id}/draft","href":"/docs/es/api/scheduled-functions/save-draft"},{"title":"Descartar un borrador de función programada","sidebarTitle":"Descartar borrador","openapi":"openapi.json DELETE /scheduled-functions/{id}/draft","href":"/docs/es/api/scheduled-functions/discard-draft"},{"title":"Probar una función programada","sidebarTitle":"Probar","openapi":"openapi.json POST /scheduled-functions/{id}/test","href":"/docs/es/api/scheduled-functions/test-scheduled-function"},{"title":"Publicar un borrador de función programada","sidebarTitle":"Publicar","openapi":"openapi.json POST /scheduled-functions/{id}/publish","href":"/docs/es/api/scheduled-functions/publish-scheduled-function"},{"title":"Listar versiones de una función programada","sidebarTitle":"Versiones","openapi":"openapi.json GET /scheduled-functions/{id}/versions","href":"/docs/es/api/scheduled-functions/list-versions"},{"title":"Consultar una versión de función programada","sidebarTitle":"Detalles de versión","openapi":"openapi.json GET /scheduled-functions/{id}/versions/{versionNumber}","href":"/docs/es/api/scheduled-functions/get-version"},{"title":"Restaurar una versión de función programada","sidebarTitle":"Restaurar versión","openapi":"openapi.json POST /scheduled-functions/{id}/versions/{versionNumber}/restore","href":"/docs/es/api/scheduled-functions/restore-version"},{"title":"Ejecutar una función programada ahora","sidebarTitle":"Ejecutar ahora","openapi":"openapi.json POST /scheduled-functions/{id}/run","href":"/docs/es/api/scheduled-functions/run-scheduled-function"},{"title":"Previsualizar el horario de una función programada","sidebarTitle":"Previsualizar horario","openapi":"openapi.json POST /scheduled-functions/preview-schedule","href":"/docs/es/api/scheduled-functions/preview-schedule"},{"title":"Previsualizar la cohorte de una función programada","sidebarTitle":"Previsualizar cohorte","openapi":"openapi.json POST /scheduled-functions/preview-cohort","href":"/docs/es/api/scheduled-functions/preview-cohort"},{"title":"Consultar la referencia de funciones programadas","sidebarTitle":"Referencia","openapi":"openapi.json GET /scheduled-functions/reference","href":"/docs/es/api/scheduled-functions/reference"},{"title":"Listar ejecuciones de funciones programadas","sidebarTitle":"Historial de ejecuciones","openapi":"openapi.json GET /scheduled-functions/runs","href":"/docs/es/api/scheduled-functions/list-runs"},{"title":"Consultar una ejecución de función programada","sidebarTitle":"Detalles de ejecución","openapi":"openapi.json GET /scheduled-functions/runs/{runId}","href":"/docs/es/api/scheduled-functions/get-run"},{"title":"Borrar el historial de funciones programadas","sidebarTitle":"Borrar historial","openapi":"openapi.json DELETE /scheduled-functions/runs","href":"/docs/es/api/scheduled-functions/clear-runs"}]},{"group":"Cloud Functions","expanded":false,"pages":[{"title":"Listar funciones en la nube","sidebarTitle":"Listar","openapi":"openapi.json GET /cloud-functions","href":"/docs/es/api/cloud-functions/get-cloud-functions"},{"title":"Consultar una función en la nube","sidebarTitle":"Detalles","openapi":"openapi.json GET /cloud-functions/{id}","href":"/docs/es/api/cloud-functions/get-cloud-functions-by-id"},{"title":"Crear una función en la nube","sidebarTitle":"Crear","openapi":"openapi.json POST /cloud-functions","href":"/docs/es/api/cloud-functions/post-cloud-functions"},{"title":"Actualizar una función en la nube","sidebarTitle":"Actualizar","openapi":"openapi.json PATCH /cloud-functions/{id}","href":"/docs/es/api/cloud-functions/patch-cloud-functions-by-id"},{"title":"Eliminar una función en la nube","sidebarTitle":"Eliminar","openapi":"openapi.json DELETE /cloud-functions/{id}","href":"/docs/es/api/cloud-functions/delete-cloud-functions-by-id"},{"title":"Guardar un borrador de función en la nube","sidebarTitle":"Guardar borrador","openapi":"openapi.json PATCH /cloud-functions/{id}/draft","href":"/docs/es/api/cloud-functions/patch-cloud-functions-by-id-draft"},{"title":"Descartar un borrador de función en la nube","sidebarTitle":"Descartar borrador","openapi":"openapi.json DELETE /cloud-functions/{id}/draft","href":"/docs/es/api/cloud-functions/delete-cloud-functions-by-id-draft"},{"title":"Probar una función en la nube","sidebarTitle":"Probar","openapi":"openapi.json POST /cloud-functions/{id}/test","href":"/docs/es/api/cloud-functions/post-cloud-functions-by-id-test"},{"title":"Publicar un borrador de función en la nube","sidebarTitle":"Publicar","openapi":"openapi.json POST /cloud-functions/{id}/publish","href":"/docs/es/api/cloud-functions/post-cloud-functions-by-id-publish"},{"title":"Listar versiones de una función en la nube","sidebarTitle":"Versiones","openapi":"openapi.json GET /cloud-functions/{id}/versions","href":"/docs/es/api/cloud-functions/get-cloud-functions-by-id-versions"},{"title":"Consultar una versión de función en la nube","sidebarTitle":"Detalles de versión","openapi":"openapi.json GET /cloud-functions/{id}/versions/{versionNumber}","href":"/docs/es/api/cloud-functions/get-cloud-functions-by-id-versions-by-version-number"},{"title":"Restaurar una versión de función en la nube","sidebarTitle":"Restaurar versión","openapi":"openapi.json POST /cloud-functions/{id}/versions/{versionNumber}/restore","href":"/docs/es/api/cloud-functions/post-cloud-functions-by-id-versions-by-version-number-restore"},{"title":"Ejecutar una función en la nube","sidebarTitle":"Ejecutar ahora","openapi":"openapi.json POST /cloud-functions/{id}/run","href":"/docs/es/api/cloud-functions/post-cloud-functions-by-id-run"},{"title":"Listar ejecuciones de funciones en la nube","sidebarTitle":"Historial de ejecuciones","openapi":"openapi.json GET /cloud-functions/runs","href":"/docs/es/api/cloud-functions/get-cloud-functions-runs"},{"title":"Consultar una ejecución de función en la nube","sidebarTitle":"Detalles de ejecución","openapi":"openapi.json GET /cloud-functions/runs/{runId}","href":"/docs/es/api/cloud-functions/get-cloud-functions-runs-by-run-id"},{"title":"Borrar el historial de funciones en la nube","sidebarTitle":"Borrar historial","openapi":"openapi.json DELETE /cloud-functions/runs","href":"/docs/es/api/cloud-functions/delete-cloud-functions-runs"},{"title":"Listar variables de entorno de funciones","sidebarTitle":"Variables de entorno","openapi":"openapi.json GET /cloud-functions/environment-variables","href":"/docs/es/api/cloud-functions/get-cloud-functions-environment-variables"},{"title":"Configurar una variable de entorno de funciones","sidebarTitle":"Configurar variable","openapi":"openapi.json PUT /cloud-functions/environment-variables/{key}","href":"/docs/es/api/cloud-functions/put-cloud-functions-environment-variables-by-key"},{"title":"Eliminar una variable de entorno de funciones","sidebarTitle":"Eliminar variable","openapi":"openapi.json DELETE /cloud-functions/environment-variables/{key}","href":"/docs/es/api/cloud-functions/delete-cloud-functions-environment-variables-by-key"}]}]},{"group":"Configura y lanza","pages":[{"title":"Arma y ajusta tus agentes con Nexor AI","sidebarTitle":"Nexor AI","href":"/docs/es/guides/getting-started/build-with-nexorgpt"},{"title":"Prueba tu agente","sidebarTitle":"Prueba tu agente","href":"/docs/es/guides/getting-started/test-in-playground"},{"title":"Tareas que trabajan juntas","sidebarTitle":"Tareas que trabajan juntas","href":"/docs/es/guides/getting-started/connected-agents"},{"title":"Checklist para activar","sidebarTitle":"Checklist para activar","href":"/docs/es/guides/getting-started/launch-checklist"},{"title":"Planifica tu agente","sidebarTitle":"Planifica tu agente","href":"/docs/es/guides/getting-started/define-your-use-case"},{"title":"Para desarrolladores","sidebarTitle":"Para desarrolladores","href":"/docs/es/guides/getting-started/for-developers"}]},{"group":"WhatsApp","pages":[{"title":"Conectar WhatsApp","sidebarTitle":"Conectar WhatsApp","href":"/docs/es/guides/connecting-whatsapp"},{"title":"Plantillas de mensaje de WhatsApp","sidebarTitle":"Plantillas de mensaje","href":"/docs/es/guides/whatsapp/message-templates"},{"title":"Consentimiento y baja en WhatsApp","sidebarTitle":"Consentimiento y baja","href":"/docs/es/guides/whatsapp/consent-and-opt-out"},{"title":"Entrega de mensajes y calidad de la cuenta","sidebarTitle":"Entrega y calidad","href":"/docs/es/guides/whatsapp/delivery-and-quality"},{"title":"Verifica tu negocio en Meta","sidebarTitle":"Verificación del negocio","href":"/docs/es/guides/whatsapp/business-verification"},{"title":"Solución de problemas de conexión de WhatsApp","sidebarTitle":"Solución de problemas","href":"/docs/es/guides/whatsapp/troubleshooting"},{"title":"Referencia de codigos de error de WhatsApp","sidebarTitle":"Codigos de error","href":"/docs/es/guides/whatsapp/error-codes"},{"title":"Precios de WhatsApp","sidebarTitle":"Precios","href":"/docs/es/guides/whatsapp/pricing"}]},{"group":"Canales","pages":[{"title":"Configurar llamadas de voz","sidebarTitle":"Voz","href":"/docs/es/guides/channels/voice"},{"title":"Email","sidebarTitle":"Email","href":"/docs/es/guides/channels/email"},{"title":"Configurar SMS y 10DLC de EE. UU.","sidebarTitle":"SMS y 10DLC","href":"/docs/es/guides/channels/sms-and-10dlc"},{"title":"Chat web","sidebarTitle":"Chat web","href":"/docs/es/guides/channels/web-chat"},{"title":"Conectar Instagram","sidebarTitle":"Instagram","href":"/docs/es/guides/channels/instagram"},{"title":"Conectar Messenger","sidebarTitle":"Messenger","href":"/docs/es/guides/channels/messenger"}]},{"group":"Agentes","pages":[{"title":"Pipeline y operación del Agente","sidebarTitle":"Pipeline","href":"/docs/es/guides/agents/pipeline"},{"title":"Configuración del agente","sidebarTitle":"Ajustes","href":"/docs/es/guides/agents/settings"},{"title":"Mapa del agente: qué pasa cuando entra un lead","sidebarTitle":"Mapa del agente","href":"/docs/es/guides/agents/agent-map"},{"title":"Borradores y versiones: prueba los cambios antes de que los vean tus leads","sidebarTitle":"Borradores y versiones","href":"/docs/es/guides/agents/drafts-and-versions"},{"title":"Enruta los leads entrantes entre tareas","sidebarTitle":"Enrutador","href":"/docs/es/guides/agents/router"},{"title":"Revisión lógica","sidebarTitle":"Revisión lógica","href":"/docs/es/guides/agents/logical-check"},{"title":"Buenas prácticas para los prompts","sidebarTitle":"Buenas prácticas","href":"/docs/es/guides/agents/prompt-best-practices"},{"title":"Base de conocimiento, archivos y catálogos de productos","sidebarTitle":"Base de conocimiento","href":"/docs/es/guides/agents/knowledge-base"},{"title":"Registra conversiones","sidebarTitle":"Conversiones","href":"/docs/es/guides/agents/conversions"},{"group":"Leads","pages":[{"title":"Gestionar leads","sidebarTitle":"Gestionar","href":"/docs/es/guides/agents/leads/manage-leads"},{"title":"Detalle y conversaciones del lead","sidebarTitle":"Detalle y chat","href":"/docs/es/guides/agents/leads/conversations"},{"title":"Organiza leads con tags","sidebarTitle":"Tags","href":"/docs/es/guides/agents/leads/tags"},{"title":"Agregar un lead manualmente","sidebarTitle":"Agregar manualmente","href":"/docs/es/guides/agents/leads/manual-upload"},{"title":"Subir leads desde CSV o Excel","sidebarTitle":"Subir un archivo","href":"/docs/es/guides/agents/leads/csv-upload"},{"title":"Conectar HubSpot","sidebarTitle":"HubSpot","href":"/docs/es/guides/agents/leads/hubspot"},{"title":"Conectar Kommo","href":"/docs/es/guides/agents/leads/kommo"},{"title":"Conecta tu API","href":"/docs/es/guides/agents/leads/api"},{"title":"Leads de prueba","sidebarTitle":"De prueba","href":"/docs/es/guides/agents/leads/test-leads"}]}]},{"group":"Reuniones","pages":[{"title":"Administrar reuniones","sidebarTitle":"Descripción general","href":"/docs/es/guides/meetings/overview"},{"title":"Calendarios y disponibilidad","sidebarTitle":"Calendarios y disponibilidad","href":"/docs/es/guides/meetings/calendars-and-availability"},{"title":"Configurar tipos de reunión y anfitriones","sidebarTitle":"Tipos y anfitriones","href":"/docs/es/guides/meetings/meeting-types-and-hosts"},{"title":"Configurar recordatorios y avisos","sidebarTitle":"Recordatorios y avisos","href":"/docs/es/guides/meetings/reminders-and-alerts"},{"title":"Agenda del CRM desde el chat","sidebarTitle":"Agenda del CRM desde el chat","href":"/docs/es/guides/meetings/crm-booking-chat"}]},{"group":"Integraciones","pages":[{"title":"Google Calendar","sidebarTitle":"Google Calendar","href":"/docs/es/guides/integrations/google-calendar"},{"title":"Outlook Calendar","sidebarTitle":"Outlook Calendar","href":"/docs/es/guides/integrations/outlook-calendar"},{"title":"Conectar Calendly","sidebarTitle":"Calendly","href":"/docs/es/guides/integrations/calendly"},{"title":"Conectar Cal.com","sidebarTitle":"Cal.com","href":"/docs/es/guides/integrations/calcom"},{"title":"Conexión personalizada","sidebarTitle":"Conexión personalizada","href":"/docs/es/guides/integrations/custom-connection"},{"title":"Conectar GoHighLevel","sidebarTitle":"GoHighLevel","href":"/docs/es/guides/integrations/gohighlevel"},{"title":"Conectar Zoho CRM","sidebarTitle":"Zoho CRM","href":"/docs/es/guides/integrations/zoho"},{"title":"Conectar Salesforce","sidebarTitle":"Salesforce","href":"/docs/es/guides/integrations/salesforce"},{"title":"Conectar Odoo","sidebarTitle":"Odoo","href":"/docs/es/guides/integrations/odoo"},{"title":"Conectar Google Sheets","sidebarTitle":"Google Sheets","href":"/docs/es/guides/integrations/google-sheets"},{"title":"Conectar Slack","sidebarTitle":"Slack","href":"/docs/es/guides/integrations/slack"}]},{"group":"Cuenta","pages":[{"title":"Perfil personal y preferencias","sidebarTitle":"Perfil","href":"/docs/es/guides/account/profile"},{"title":"Miembros, roles y acceso","sidebarTitle":"Miembros y roles","href":"/docs/es/guides/account/members-and-roles"},{"title":"Configuración de notificaciones","sidebarTitle":"Notificaciones","href":"/docs/es/guides/account/notifications"},{"title":"Facturación, cuota de leads y facturas","sidebarTitle":"Facturación","href":"/docs/es/guides/account/billing"},{"title":"Reactivar un plan cancelado","sidebarTitle":"Reactivar plan","href":"/docs/es/guides/account/reactivate-plan"},{"title":"Subcuentas","sidebarTitle":"Subcuentas","href":"/docs/es/guides/account/sub-accounts"}]},{"group":"Bandeja de entrada","pages":[{"title":"Resumen de Inbox","sidebarTitle":"Resumen","href":"/docs/es/guides/inbox/overview"},{"title":"Gestiona escalaciones en Inbox","sidebarTitle":"Escalaciones","href":"/docs/es/guides/inbox/escalations"}]},{"group":"Métricas","pages":[{"title":"Dashboards de Métricas","sidebarTitle":"Dashboards","href":"/docs/es/guides/insights/dashboards"}]},{"group":"Herramientas para desarrolladores","pages":[{"title":"Automatización avanzada","sidebarTitle":"Vista general","href":"/docs/es/guides/advanced/overview"},{"title":"Cloud Functions","sidebarTitle":"Cloud Functions","href":"/docs/es/guides/advanced/cloud-functions"},{"title":"Funciones programadas","sidebarTitle":"Funciones programadas","href":"/docs/es/guides/advanced/scheduled-functions"}]},{"group":"Referencia de soporte","pages":[{"title":"Glosario: agente, tarea, grupo y nombres anteriores","sidebarTitle":"Glosario","href":"/docs/es/support/glossary"},{"title":"Alcance de la configuración: cuenta, agente y tarea","sidebarTitle":"Alcance de la configuración","href":"/docs/es/support/settings-scope"},{"title":"Dónde está cada ajuste: v2 y vista clásica (v1)","sidebarTitle":"Dónde está cada ajuste","href":"/docs/es/support/where-is-each-setting"},{"title":"Horarios de contacto, cadencia y seguimientos","sidebarTitle":"Horarios y cadencia","href":"/docs/es/support/contact-hours-and-cadence"},{"title":"Asignar leads solo a miembros Activos (Activo / Ausente)","sidebarTitle":"Solo miembros Activos","href":"/docs/es/support/assign-only-active-agents"},{"title":"CRM y entrada de leads: diagnóstico","sidebarTitle":"CRM y entrada de leads","href":"/docs/es/support/crm-sync-and-lead-intake"},{"title":"WhatsApp Coexistence: los mensajes no aparecen en la app WhatsApp Business","sidebarTitle":"Sincronización de Coexistence","href":"/docs/es/support/whatsapp-coexistence-sync"},{"title":"Dashboard clásico de Resumen (v1): métricas y avisos","sidebarTitle":"Dashboard clásico (v1)","href":"/docs/es/guides/getting-started/dashboard"},{"group":"Cumplimiento en EE. UU.","pages":[{"title":"Cumplimiento en Estados Unidos: consentimiento, llamadas con IA y SMS","sidebarTitle":"Reglas para EE. UU.","href":"/docs/es/guides/compliance/us-outreach-overview"},{"title":"Reglas por estado de EE. UU. para llamadas y SMS","sidebarTitle":"Reglas por estado","href":"/docs/es/guides/compliance/us-state-rules"},{"title":"Aviso de IA y grabación de llamadas para agentes en EE. UU.","sidebarTitle":"Aviso de IA y grabación","href":"/docs/es/guides/compliance/ai-disclosure-and-recording"}]}]}]}]},"title":"Catálogo de tools MCP - Nexor","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":[],"chunks":[]}