If this connection lists call_platform_tool instead of the tools this workflow names, find each named tool with search_platform_tools, describe it with describe_platform_tool, then run it with call_platform_tool and the same arguments. Whether a tool exists for you is decided by describe_platform_tool with its exact name, not by tools/list or one page of search results: a name returned in not_found is unavailable to you, so say so rather than guess. The call itself still checks your access. When execute is also listed, a multi-step read may run in execute with tools.search, tools.describe and tools.call on platform--<tool name> paths. End each execute run at a confirmation point and ask the user before any write.
Use this workflow when someone wants the Speakeasy AI Control Plane (AICP) to classify conversation messages into reusable labels, exclusive choices, or ordered scores. Sensors perform classification; they do not enforce access policies.
Discover
- Successfully call
list_projectsthrough this client's authenticated Speakeasy connection. Have the user select the exact project. Package installation alone grants no authority. These tools require signals intelligence enabled and live project permissions; they are currently external-user-only. - Call
find_sensorsandfind_signalsfor that project, searching and following pagination as needed. Present candidates rather than silently selecting a name match. Reuse a signal only after the user agrees its full criteria fit. - For an existing sensor, call
get_sensorand inspect its complete ordered definitions. For a shared signal change, useupdate_signalwithconfirmed:falseto inspect the affected sensors before asking for confirmation.
Choose the definition
- Agree the mode:
multi_labelevaluates independent labels;exclusivechooses one option;ordered_scoreuses two to ten levels ordered from low to high, each with classifier criteria. Agree instructions, display names, optional slugs, and reusable signal definitions. Agree whether the sensor should be enabled.proposal.enableddefaults to true on creation; omission on update preserves the current state. Disabled sensors remain visible and editable but skip new evaluations; evaluations already in progress may finish. Agree message context separately from classification mode:proposal.input_strategyissingle_messageby default, orsliding_window.proposal.window_sizeis 2–10 total messages, default 5, including the target. System messages are excluded for every strategy and do not count toward window size. Sliding context includes non-system roles in timestamp order within the target's conversation generation. Only the target is classified; preceding messages provide context. Short histories use available messages. Omitted update fields preserve settings, including window size when switching strategies. - Agree the matching expression. Omission on creation defaults to
message.role == "user". Onlymessage.roleis exposed; do not invent actor, department, cohort, replay, or tool fields. Conversation ingestion currently evaluates original user/assistant creation events, including historical imports. Transcript copies, synthetic summaries and unknown rewrites are not new targets. - Optionally call
preview_sensor_matchwith bounded, caller-supplied role examples. Report matched, not matched, and errors separately. Missing message context is unbound, not an empty role. This tests metadata eligibility, not classification quality, and neither retrieves transcripts nor runs inference.
Preview and confirm
- Prefer
create_sensorwith aproposalcontaining existing signal IDs and/or inlinenew_signaldefinitions. The operation creates new signals and the sensor together atomically. Usecreate_signalwhen the user only wants a reusable catalog definition. Useupdate_sensorfor a selected sensor's own fields or ordered membership, andupdate_signalto deliberately change a shared definition. Setproposal.operationto the tool name. - Call with
confirmed:false. Show the normalized configuration, matching expression, enabled state, message context and window size, complete signal order, draft reasons, and every affected sensor returned for a shared-signal update. Preview creation IDs are provisional and are not committed resources. Omitted update fields are preserved; a supplied signals list replaces the entire membership, and an empty list clears it. - Obtain explicit confirmation of that exact proposal and its shared impact.
Resend the identical proposal with
confirmed:true, the returnedexpected_version(fromversion) andpreview_token, and a stableidempotency_key. Keep that key and all inputs unchanged when retrying an uncertain request. A version conflict requires another read, preview, and confirmation; the version covers the whole project's configuration.
Verify
- For a sensor, call
get_sensorusing the committed ID. For a standalone signal, callfind_signalsand verify its exact ID and definition. Report committed enabled state and configuration readiness separately from active inference or observed readings, which these tools cannot prove. For observed measurements, use theexplore-signal-patternsworkflow and the shared analytics tools with an explicit matching rule and time window. - A committed receipt with
snapshot_scope: verification_unavailablemeans the write succeeded but the fresh read failed. Keep the same retry key and inputs; retry verification rather than creating again. A falsetarget_availablein this state does not prove deletion. A replayed receipt proves a historical write, not current existence. Checktarget_availableand the fresh target state; do not recreate a deleted target by changing the retry key. Present the returned dashboard path when available. If the capability is unavailable, stop rather than bypassing its permissions or inventing another tool.
Never ask for API keys, passwords, tokens, OAuth codes, client secrets, or secret
headers. Use synthetic examples rather than requesting private transcripts. If
the user wants to report workflow feedback, obtain consent before calling
send_platform_mcp_feedback.