verify_and_score
Force-process recent events, recalculate scoring, and return a strict verification diagnosis. Mutating — requires an agent-supplied idempotency_key. Every response includes _request_id in structuredContent.
COMPLETION CONTRACT (read this every time):
The success signal is the envelope's top-level status, NOT verification.scoring_complete. A fresh install can sit at scoring_complete=false indefinitely because of organic metrics (e.g. recovery-rate-based scoring) that mature only as real traffic accumulates — using scoring_complete as the completion gate would mean no install ever appears done. Use status + verification.not_ready_reason (equivalently: not_ready_reason === null) as the gate.
READING status + verification.not_ready_reason — three behavioral classes:
(A) DONE / hand-off-to-user (no retry, transition to Turn 5 scored hand-off):
status='ok'(not_ready_reason === null) — install complete on both sides. Callget_next_stepsto graboverall_progress+next_steps[], thencreate_login_link(target_page=dashboard), then send the Turn 5 scored hand-off (see agent-install.md Step 5).not_ready_reason='awaiting_connector_activation'— your code is done; user activates connector in dashboard. Callcreate_login_link(target_page=connectors), send the scored hand-off naming the connector step, and EXIT.retry.max_retries_recommended === 0.not_ready_reason='awaiting_first_party_mode'— same shape, target_page=dns. EXIT.SERVER RULE for the hand-off: on the main Tracklution server call
create_login_link; on any OTHER connected servernext_action.toolisnullanddata.manual_handoffnames the server — tell the user to open that server's dashboard and STOP. Never callcreate_login_linkfor a container on another server; the MCP refuses it (container_pinned_to_other_server).not_ready_reason='only_pageview_seen'— code is in, loader works, only PageView received. This is the EXPECTED day-0 state for a fresh install: the user hasn't performed a Purchase/Lead yet, and a 30-second wait will NOT make them click 'Buy' on their own site. Do NOT retry. Transition to the Turn 5 scored hand-off, surface the score, and instruct the user to trigger a real event on the live site, then replyverifyfor a re-check.not_ready_reason='missing_bottom_funnel_event'— same semantics asonly_pageview_seen(no bottom-funnel event yet). Do NOT retry. Transition to scored hand-off; user must trigger the missing event on the live site.
(B) TRANSIENT / retry with budget (3 × 30s, then graceful exit):
not_ready_reason='no_events_after_install'— loader hasn't reported yet (post-deploy delay or local-dev environment). Retry perretry.retry_after_seconds/retry.max_retries_recommended. On budget exhaustion, transition to the Turn 5 scored hand-off withevents haven't arrived yet — trigger a PageView on the site and reply 'verify'instead of declaring failure.not_ready_reason='script_not_seen'— bootstrap script not loaded. Same retry shape as above.not_ready_reason='event_not_received_yet'— a specific expected_event hasn't arrived. Same retry shape.not_ready_reason='events_processing'— initial-calculate race. Same retry shape; on exhaustion sayevents are flowing; final scoring will catch up within a few minutesand exit.
(C) CODE-FIX / retry ONCE after fix (do not loop):
not_ready_reason='missing_contact_info'—tlq('set','ContactInfo',...)not seen. Apply the missing snippet (seeget_installation_scripts.framework_snippets.contact_info), then call this tool ONCE more. If still missing, transition to scored hand-off; the next_steps list will nameimplement_contact_infoas a remaining task.not_ready_reason='domain_mismatch'— events arrived from the wrong host. Inspect deploy target, fix, retry ONCE. On failure, transition to scored hand-off.
DATA FIELDS YOU MUST READ:
data.event_names_seen[]— distincttrack-type events received (PageView, Purchase, Lead, ...).data.set_events_seen[]— distinctset-type metadata received (ContactInfo, ...). Do NOT expect ContactInfo to appear inevent_names_seen; it lives ONLY inset_events_seenbecausetlq('set', 'ContactInfo', ...)is metadata, not an event.data.verification.not_ready_reason— stable enum, full list:no_events_after_install,event_not_received_yet,script_not_seen,only_pageview_seen,missing_bottom_funnel_event,missing_contact_info,domain_mismatch,awaiting_connector_activation,awaiting_first_party_mode,events_processing. Map verbatim to user-friendly copy viaverification.message.
IDEMPOTENCY: use the SAME idempotency_key to dedupe within a 30s window (returns the cached response). Use a FRESH idempotency_key after the window to trigger a new force-process pass over recent events.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | ||
| server_name | No | Which connected Tracklution server the container lives on (the server name shown at Connect time, e.g. `Main`). Required when this MCP session is connected to more than one server; pass the SAME server_name on every follow-up installation call for the container — the MCP fills it into `next_action.args` / `next_steps[].tool_args` for you. Ignored when only one server is connected. | |
| container_id | Yes | ||
| container_hash | No | SECRET: required when auth_token is omitted. See get_installation_scripts for the rationale. | |
| expected_domain | No | ||
| expected_events | No | ||
| idempotency_key | Yes | ||
| onboarding_session_id | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| field | No | ||
| errors | No | ||
| status | No | ||
| details | No | ||
| warnings | No | ||
| rate_limit | No | ||
| _request_id | No | ||
| http_status | No | ||
| next_action | No |