@vruum/mcp 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/tools.json +16 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vruum/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"mcpName": "ai.vruum/mcp",
|
|
5
5
|
"description": "Stdio MCP bridge for the hosted Vruum revenue-platform MCP (https://api.vruum.ai/mcp): serves the advertised tool surface for credential-free introspection and proxies tool calls with your Vruum token.",
|
|
6
6
|
"license": "MIT",
|
package/tools.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"openWorldHint": false,
|
|
10
10
|
"readOnlyHint": true
|
|
11
11
|
},
|
|
12
|
-
"description": "Fetch\n\nFetch one entity (or a small batch) by type + id — the consolidated read tool.\n\nTypes and id semantics:\n- journey_comparison: replay two approved journey observation reads for one\n objective UUID. Required filters: baseline_run_action_id, current_run_action_id,\n baseline_event_cutoff, current_event_cutoff, baseline_knowledge_cutoff,\n current_knowledge_cutoff (all times include a timezone). Same run and event\n window yield recorded evidence changes as knowledge advances, not business\n performance. Different cohorts report missing/mismatched comparison context\n and source coverage with no performance delta. No writes or external calls.\n- claim: one hypothesis-ledger claim by UUID — statement, scope,\n derived confidence, invalidating conditions, linked evidence with\n provenance and liveness, and the append-only verdict history (VRU-840).\n Find ids with search type='claims'.\n- objective_measurement: approved observation, frozen definition, known results, source coverage, and execution progress for an objective UUID. A read never starts work.\n- objective_workspace: shared objective readiness, next decision, source\n coverage and recoverable work (id=objective UUID). Read-only: it does not\n run research, call providers or models, create Actions, or approve launch.\n Discovery requirements are separate from execution readiness. Independent\n observation uses its own reviewed Action without an outreach launch.\n- objective: an objective by UUID — the record + live pins + members\n count + gtm_model (the Revenue Architecture touch level the book pairs\n with the selected offer's price, and the declared motion's alignment;\n a fact, not a rule) (array of UUIDs → per-id map). List objectives with `search`\n type='objectives'; create/update/retire/pause/launch/member changes with\n `manage_outreach`. A paused objective has no direct resume action.\n- plan: a person outreach plan. SCALAR id = the plan UUID; ARRAY id =\n PERSON UUIDs (routes to the native batch person-plans read, returning a\n person_id → plan|null map). Note the scalar/array dimension difference.\n- conversation: full message history for a person (id = person_id).\n- person_research: cached person research (id = person UUID; array → per-id map).\n- customer_impact: account engagements, promise history and verified criterion\n occurrences. Optional filters journey_id, claim_id, occurrence (default 1),\n journey_offset and source_offset (20-row pages). Exact IDs restore history.\n source_ids keeps up to 20 selected source records visible across pages.\n source_context=account reads source choices for a new engagement.\n This is a read only; use manage_account impact actions to record decisions.\n- company_family: immediate parent, subsidiaries, public ownership source,\n and separately labeled parent research (id=company UUID). No CRM adoption.\n- company_research: cached company research (id = company UUID or website/domain string;\n array → native batch lookup).\n Shared-domain lookups return candidates with match_reason=ambiguous.\n Select a candidate company UUID explicitly; never treat parent facts as child facts.\n- account_state: per-account state row (id = company_id).\n- unit_economics: per-account impact × labor 2×2 + delivery-cost\n decomposition (VRU-864). id = company_id, optional — omit for every\n committed-stage account plus any account with labor. Filters:\n {window_days? (default 30), hourly_rate_usd?, horizon_years?}. Each\n account carries its service model, scoped labor limit, labor splits (founder\n repair as its own series), recurring-impact attainment, the 2×2\n quadrant decision, and the Ch10 cost decomposition with per-number\n basis labels; pending_confirmation_dates lists days awaiting the\n daily confirm (see manage_account confirm_labor).\n- growth_formula: the Revenue Architecture Growth Formula (Ch 7 §7.2)\n as a stateless compute — no id; `filters` IS the request body:\n {conversions: [{id, value, basis, label?, numerator?, denominator?,\n source?}] in journey order, input_volume?, list_price?, discount?\n (same factor shape), offer_id? (the catalog offer: its annual list\n price becomes list_price with basis declared, and the median\n discount across this workspace's agreed won deals on that offer\n becomes discount with basis observed, unless either is supplied;\n the reply's `price` block names the currency and unit), target?\n {value, unit: wins|revenue},\n normalize? {per: input|win|revenue, amount}, scenario?\n {input_delta, conversion_deltas: number | {factor_id: number},\n input_volume?}, break_even? {factor_id, discount}}. Every factor\n names its basis (observed | declared | inferred | benchmarked |\n assumed). The reply carries throughput, net price, the bottleneck,\n the chain's weakest basis and, when asked, the forward output, the\n normalized unit economics, the backsolve with every stage rounded UP\n and its coverage, the scenario before/after, and the break-even\n rate. Do the arithmetic here, never in prose; a shape the formula\n cannot compute over is a 422 naming the reason.\n- insights (subtype required): quality | pattern_tags | prompts |\n benchmarks | improve | reply_diagnosis (id = person_id) |\n mcp_patterns | mcp_pattern_detail (id = pattern_id).\n- scoreboard (subtype required): impact | bowtie (id = company_id;\n filters: {window_days?}).\n- settings (subtype required): profile | automation | marketing |\n channel_status | booking_link | objective_delegations | ai_compute\n (no id). ai_compute is READ-ONLY status: which provider/model\n interactive and background runs currently resolve to, the fallback\n behavior, coarse per-source health, and whether the caller's own\n subscription is connected. Connecting, rotating, testing and revoking\n compute credentials is deliberately not reachable from any tool.\n- billing: billing status for your company (no id).\n- publish_readiness: publish pre-check for a LinkedIn draft (id = post_id).\n- research_run: frozen assignment and execution results (id=Action UUID).\n- research_sources: original saved facts and optionally permitted history.\n id=objective UUID; filters={subject_type,subject_id,question_id,company_id?,\n use_history?:false}. No model or provider spend. Returns exact references,\n excerpts and original observation times for research save_answer.\n- research_answers: objective research answers and decision readiness\n (id = objective UUID; filters: {subject_type, subject_id, company_id?,\n stage?}). Subjects: company, person, person_at_company, deal. company_id\n is required only for person_at_company. Stages: qualification, activation\n (default), discovery, purchase, impact. Includes inherited account answers,\n exact question definitions, source quality, stale/conflicting/missing states.\n Readiness covers the brief; existing identity/channel/safety gates still apply.\n- research_playbook: ICP + research workflow (id = optional objective UUID).\n- job: background job status — poll after async tools like\n people create / import_prospects / auto_fill_company_profile (id =\n scalar job UUID; a one-element array is normalized).\n- csv_import: CSV import progress (id = the job id returned by\n import_prospects csv_start).\n- company_resolution_queue: people missing an employer link (depth\n counts only genuinely-unlinked people; silent pin re-verification is\n excluded), oldest age, deferral reason, and projected completion\n horizon (no id).\n- deal: a raw deal row by UUID (for the enriched view use get_deal_360).\n- deal_pipelines: the tenant's configured pipelines and stages (no id;\n filters: {include_archived?}). Returns pipeline/stage IDs, ordering,\n stage kinds, probability defaults, archived state, and the default\n pipeline ID.\n- deal_alerts: at-risk deal alerts (no id).\n- post_analytics: LinkedIn post performance (id = post UUID; omit for\n all posts).\n- seller_signals: the seller signal bundle for content drafting (id =\n author user id, optional; filters: draft_brief/include_* flags).\n- stats (subtype required): outreach (filters: {start_date?, end_date?})\n | plan | person | prose (filters: {days?, default 30, use 7 for a\n weekly cut} — prose-quality trends from the outcome-linked review\n corpus: per-surface reply outcomes + reply rate and per-gate-code\n outcome lift (primary), plus keep/edit/kill/override mix, override\n codes, edit-rate trend vs the prior window, rules_version\n distribution) — aggregate stats snapshots.\n- marketing (subtype required): overview | activity (filters: {days?,\n limit?}).\n- ads (subtype required): attribution (filters: {window_days?,\n objective_id?, by}; by=creative|audience is REQUIRED and\n selects a per-creative or per-audience engagement funnel) |\n | creative (id = ad creative UUID; returns the row + a derived\n `terminal` verdict — failed with a probe-code error prefix means the\n asset itself is bad, re-export and re-store; otherwise `next_call`\n hints the poll/retry) | campaign (id = ad campaign UUID; returns the\n row + spend_today_cents + last_sync_at) | targeting_entities (filters:\n {facet (titles|seniorities|industries|locations|staff_count_ranges),\n q (min 2 chars), integration_id?}; resolves display names into the\n LinkedIn entity URNs the boost audience.facets form requires —\n locations targeting is mandatory on every facet boost).\n- skill: a published skill body (id = skill UUID).\n- relationship_attempt: one durable relationship action (id = the\n `attempt_...` reference returned by manage_relationship_action).\n\nBatch: id arrays are accepted for objective, plan, person_research and\ncompany_research (max 100 ids). Loop batches return ``{id: payload}`` with\nper-id 4xx failures mapped to ``{id: {\"error\": detail}}``; any 5xx aborts\nthe whole call. Errors carry the same status as the underlying endpoint\nwith the detail prefixed ``\"<type> '<id>': ...\"``.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
|
|
12
|
+
"description": "Fetch\n\nFetch one entity (or a small batch) by type + id — the consolidated read tool.\n\nTypes and id semantics:\n- journey_comparison: replay two approved journey observation reads for one\n objective UUID. Required filters: baseline_run_action_id, current_run_action_id,\n baseline_event_cutoff, current_event_cutoff, baseline_knowledge_cutoff,\n current_knowledge_cutoff (all times include a timezone). Same run and event\n window yield recorded evidence changes as knowledge advances, not business\n performance. Different cohorts report missing/mismatched comparison context\n and source coverage with no performance delta. No writes or external calls.\n- claim: one hypothesis-ledger claim by UUID — statement, scope,\n derived confidence, invalidating conditions, linked evidence with\n provenance and liveness, and the append-only verdict history (VRU-840).\n Find ids with search type='claims'.\n- measurement_projects: recorded commercial projects for measurement setup\n (id=optional objective UUID, filters.offer_id required, offset optional; 20-row pages).\n Omit id to select projects before creating an objective.\n Includes sourced commitment bindings and current promise labels. Selection\n uses objective_update; this read does not select projects or approve evidence.\n- objective_measurement: approved observation, frozen definition, known results, source coverage, and execution progress for an objective UUID. A read never starts work.\n- objective_workspace: shared objective readiness, next decision, source\n coverage and recoverable work (id=objective UUID). Read-only: it does not\n run research, call providers or models, create Actions, or approve launch.\n Discovery requirements are separate from execution readiness. Independent\n observation uses its own reviewed Action without an outreach launch.\n- objective: an objective by UUID — the record + live pins + members\n count + gtm_model (the Revenue Architecture touch level the book pairs\n with the selected offer's price, and the declared motion's alignment;\n a fact, not a rule) (array of UUIDs → per-id map). List objectives with `search`\n type='objectives'; create/update/retire/pause/launch/member changes with\n `manage_outreach`. A paused objective has no direct resume action.\n- plan: a person outreach plan. SCALAR id = the plan UUID; ARRAY id =\n PERSON UUIDs (routes to the native batch person-plans read, returning a\n person_id → plan|null map). Note the scalar/array dimension difference.\n- conversation: full message history for a person (id = person_id).\n- person_research: cached person research (id = person UUID; array → per-id map).\n- customer_impact: account engagements, promise history and verified criterion\n occurrences. Optional filters journey_id, claim_id, occurrence (default 1),\n journey_offset and source_offset (20-row pages). Exact IDs restore history.\n source_ids keeps up to 20 selected source records visible across pages.\n source_context=account reads source choices for a new engagement.\n This is a read only; use manage_account impact actions to record decisions.\n- company_family: immediate parent, subsidiaries, public ownership source,\n and separately labeled parent research (id=company UUID). No CRM adoption.\n- company_research: cached company research (id = company UUID or website/domain string;\n array → native batch lookup).\n Shared-domain lookups return candidates with match_reason=ambiguous.\n Select a candidate company UUID explicitly; never treat parent facts as child facts.\n- account_state: per-account state row (id = company_id).\n- unit_economics: per-account impact × labor 2×2 + delivery-cost\n decomposition (VRU-864). id = company_id, optional — omit for every\n committed-stage account plus any account with labor. Filters:\n {window_days? (default 30), hourly_rate_usd?, horizon_years?}. Each\n account carries its service model, scoped labor limit, labor splits (founder\n repair as its own series), recurring-impact attainment, the 2×2\n quadrant decision, and the Ch10 cost decomposition with per-number\n basis labels; pending_confirmation_dates lists days awaiting the\n daily confirm (see manage_account confirm_labor).\n- growth_formula: the Revenue Architecture Growth Formula (Ch 7 §7.2)\n as a stateless compute — no id; `filters` IS the request body:\n {conversions: [{id, value, basis, label?, numerator?, denominator?,\n source?}] in journey order, input_volume?, list_price?, discount?\n (same factor shape), offer_id? (the catalog offer: its annual list\n price becomes list_price with basis declared, and the median\n discount across this workspace's agreed won deals on that offer\n becomes discount with basis observed, unless either is supplied;\n the reply's `price` block names the currency and unit), target?\n {value, unit: wins|revenue},\n normalize? {per: input|win|revenue, amount}, scenario?\n {input_delta, conversion_deltas: number | {factor_id: number},\n input_volume?}, break_even? {factor_id, discount}}. Every factor\n names its basis (observed | declared | inferred | benchmarked |\n assumed). The reply carries throughput, net price, the bottleneck,\n the chain's weakest basis and, when asked, the forward output, the\n normalized unit economics, the backsolve with every stage rounded UP\n and its coverage, the scenario before/after, and the break-even\n rate. Do the arithmetic here, never in prose; a shape the formula\n cannot compute over is a 422 naming the reason.\n- insights (subtype required): quality | pattern_tags | prompts |\n benchmarks | improve | reply_diagnosis (id = person_id) |\n mcp_patterns | mcp_pattern_detail (id = pattern_id).\n- scoreboard (subtype required): impact | bowtie (id = company_id;\n filters: {window_days?}).\n- settings (subtype required): profile | automation | marketing |\n channel_status | booking_link | objective_delegations | ai_compute\n (no id). ai_compute is READ-ONLY status: which provider/model\n interactive and background runs currently resolve to, the fallback\n behavior, coarse per-source health, and whether the caller's own\n subscription is connected. Connecting, rotating, testing and revoking\n compute credentials is deliberately not reachable from any tool.\n- billing: billing status for your company (no id).\n- publish_readiness: publish pre-check for a LinkedIn draft (id = post_id).\n- research_run: frozen assignment and execution results (id=Action UUID).\n- research_sources: original saved facts and optionally permitted history.\n id=objective UUID; filters={subject_type,subject_id,question_id,company_id?,\n use_history?:false}. No model or provider spend. Returns exact references,\n excerpts and original observation times for research save_answer.\n- research_answers: objective research answers and decision readiness\n (id = objective UUID; filters: {subject_type, subject_id, company_id?,\n stage?}). Subjects: company, person, person_at_company, deal. company_id\n is required only for person_at_company. Stages: qualification, activation\n (default), discovery, purchase, impact. Includes inherited account answers,\n exact question definitions, source quality, stale/conflicting/missing states.\n Readiness covers the brief; existing identity/channel/safety gates still apply.\n- research_playbook: ICP + research workflow (id = optional objective UUID).\n- job: background job status — poll after async tools like\n people create / import_prospects / auto_fill_company_profile (id =\n scalar job UUID; a one-element array is normalized).\n- csv_import: CSV import progress (id = the job id returned by\n import_prospects csv_start).\n- company_resolution_queue: people missing an employer link (depth\n counts only genuinely-unlinked people; silent pin re-verification is\n excluded), oldest age, deferral reason, and projected completion\n horizon (no id).\n- deal: a raw deal row by UUID (for the enriched view use get_deal_360).\n- deal_pipelines: the tenant's configured pipelines and stages (no id;\n filters: {include_archived?}). Returns pipeline/stage IDs, ordering,\n stage kinds, probability defaults, archived state, and the default\n pipeline ID.\n- deal_alerts: at-risk deal alerts (no id).\n- post_analytics: LinkedIn post performance (id = post UUID; omit for\n all posts).\n- seller_signals: the seller signal bundle for content drafting (id =\n author user id, optional; filters: draft_brief/include_* flags).\n- stats (subtype required): outreach (filters: {start_date?, end_date?})\n | plan | person | prose (filters: {days?, default 30, use 7 for a\n weekly cut} — prose-quality trends from the outcome-linked review\n corpus: per-surface reply outcomes + reply rate and per-gate-code\n outcome lift (primary), plus keep/edit/kill/override mix, override\n codes, edit-rate trend vs the prior window, rules_version\n distribution) — aggregate stats snapshots.\n- marketing (subtype required): overview | activity (filters: {days?,\n limit?}).\n- ads (subtype required): attribution (filters: {window_days?,\n objective_id?, by}; by=creative|audience is REQUIRED and\n selects a per-creative or per-audience engagement funnel) |\n | creative (id = ad creative UUID; returns the row + a derived\n `terminal` verdict — failed with a probe-code error prefix means the\n asset itself is bad, re-export and re-store; otherwise `next_call`\n hints the poll/retry) | campaign (id = ad campaign UUID; returns the\n row + spend_today_cents + last_sync_at) | targeting_entities (filters:\n {facet (titles|seniorities|industries|locations|staff_count_ranges),\n q (min 2 chars), integration_id?}; resolves display names into the\n LinkedIn entity URNs the boost audience.facets form requires —\n locations targeting is mandatory on every facet boost).\n- skill: a published skill body (id = skill UUID).\n- relationship_attempt: one durable relationship action (id = the\n `attempt_...` reference returned by manage_relationship_action).\n\nBatch: id arrays are accepted for objective, plan, person_research and\ncompany_research (max 100 ids). Loop batches return ``{id: payload}`` with\nper-id 4xx failures mapped to ``{id: {\"error\": detail}}``; any 5xx aborts\nthe whole call. Errors carry the same status as the underlying endpoint\nwith the detail prefixed ``\"<type> '<id>': ...\"``.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
|
|
13
13
|
"inputSchema": {
|
|
14
14
|
"properties": {
|
|
15
15
|
"filters": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"type": "string"
|
|
64
64
|
},
|
|
65
65
|
"type": {
|
|
66
|
-
"description": "Entity type to fetch. One of: journey_comparison, objective_workspace, objective_measurement, research_answers, research_run, research_sources, objective, csv_import, company_resolution_queue, plan, conversation, person_research, company_research, company_family, customer_impact, account_state, unit_economics, growth_formula, insights, scoreboard, settings, billing, publish_readiness, research_playbook, job, skill, deal, deal_pipelines, deal_alerts, post_analytics, seller_signals, stats, marketing, ads, relationship_attempt, claim.",
|
|
66
|
+
"description": "Entity type to fetch. One of: measurement_projects, journey_comparison, objective_workspace, objective_measurement, research_answers, research_run, research_sources, objective, csv_import, company_resolution_queue, plan, conversation, person_research, company_research, company_family, customer_impact, account_state, unit_economics, growth_formula, insights, scoreboard, settings, billing, publish_readiness, research_playbook, job, skill, deal, deal_pipelines, deal_alerts, post_analytics, seller_signals, stats, marketing, ads, relationship_attempt, claim.",
|
|
67
67
|
"title": "type",
|
|
68
68
|
"type": "string"
|
|
69
69
|
}
|
|
@@ -532,7 +532,7 @@
|
|
|
532
532
|
"openWorldHint": false,
|
|
533
533
|
"readOnlyHint": true
|
|
534
534
|
},
|
|
535
|
-
"description": "Get Outreach Review\n\nDefault tool for outreach queue triage — pending messages with full context for review.\n\nStart here when reviewing or managing the outreach queue. Returns pending\nmessages — both 'needs_draft' (unauthored, awaiting harness authoring: write\nvia manage_messages edit) and 'draft' (authored, awaiting approve/reject),\ndisambiguated by each item's `status` — enriched with: person context,\nobjective instructions (tone rules, selling strategy, touch sequence), match\nanalysis (summary, alignment points, recommended approach), company research\nsummary, recent LinkedIn posts, conversation thread, and outreach plan state.\nOne call gives you everything needed to author, approve, or reject.\n\n`channel_holds` reports LinkedIn sender blocks such as daily quota,\nprovider throttling, or reconnect-required state. If\n`channel_holds_degraded` is true, an empty hold list is unknown rather than\nproof that the channel is healthy.\n\nUse content_length='full' for detailed review (capped at 5 items to prevent\nconnection drops from oversized payloads — use offset to paginate),\nor 'preview' (default) for quick scanning with truncated content.\n\nFilter by objective name or ID to review a specific queue (e.g. objective='DFW CFOs').\n\nUse message_ids to fetch specific messages by ID (comma-separated UUIDs, max 20).\nBypasses sorting/pagination — returns full context for exactly those messages.\nUseful for subagent dispatch: pull the lightweight queue first, split into batches,\nthen each subagent calls with its assigned message_ids.\n\nOperators: pass for_company parameter to review a specific client company.\n\nReturns (units in parentheses; scope = messages.status IN ('draft','needs_draft')\nfor this tenant unless message_ids is set):\n items (list of ReviewItem, unit=messages): one entry per pending message\n (not per person — a person with two pending messages shows up twice).\n Each item:\n - message_id, status ('needs_draft' = author it, 'draft' = approve it),\n channel, subject, content, category (initial / followup /\n reply_response), priority_score, created_at\n - expires_at (needs_draft only): when the nightly sweep auto-rejects\n this row if still unauthored (the action's expires_at —\n regenerate grants a fresh window). Author nearest-deadline-first.\n An expired touch shows up later as status='rejected'\n with blank content and ai_decision_context.expired_signal — that is\n GC, NOT an operator rejection; revive via manage_messages\n action=regenerate, then author and edit as normal.\n - person_id, person_name, person_title, person_company, match_score,\n stage (the company_people stage)\n - campaign_name, campaign_tone_instructions, campaign_selling_strategy,\n campaign_touch_sequence (per-touch instructions): VRU-878 — sourced\n from the message's PLAN OBJECTIVE (name / policy_envelope.tone_rules\n / sequence pin), not a campaign row. Field names are fixed by the\n shared ReviewItem schema (app/shared/schemas/mcp_compound.py, out\n of scope here).\n - match_summary, alignment_points, recommended_approach\n - company_summary (recent company research),\n recent_linkedin_posts (last 3 posts; unit=posts)\n - manual_notes (full content only): up to 10 newest-first person\n timeline notes. Each note is capped at 4,000 characters, each\n person at 8,000, and all repeated item payloads at 30,000 total.\n A cut note ends with `...[truncated]`. When objective instructions\n name a saved per-person draft, use it instead of the 200-character\n activity summary.\n - conversation_thread (list of outbound+inbound rows, unit=messages,\n ordered by created_at; truncated to 200 chars when content_length='preview')\n - outreach_plan_id (the linked plan's id — pass straight to\n manage_outreach pause/resume/stop; no get_person_360 needed),\n plan_status, plan_strategy, touches_completed, max_touches,\n plan_next_action_at (when the plan's next touch fires — an\n approved-but-deferred send happens at this time),\n connection_status (the plan's LinkedIn connection state) (from\n the linked outreach_plan; unit=plans)\n - PRIORITIZE WARM ITEMS: a linkedin_message item with\n connection_status='connected' is a follow-up to someone who\n ACCEPTED the connection request — author/approve these before\n any cold lane; they are the highest-EV rows in the queue.\n total_pending (int, unit=messages): EXACT count of actionable pending messages\n matching the objective / message_ids filter for the tenant,\n BEFORE pagination. Filters: status IN ('draft','needs_draft'),\n excludes externally scheduled/reservation-protected rows,\n user_company_id, and the objective filter when set. Does NOT\n date-filter — the queue is \"everything currently pending.\"\n offset (int): echoes the request offset.\n limit (int, unit=messages): echoes the page size. When content_length='full'\n this is capped at 5 (regardless of the requested limit).\n approved_pending_send_count (int, unit=messages): approved rows that\n have NOT sent yet (they no longer show as items). Non-zero after a\n bulk approve means those sends are SCHEDULED (per-person cooldown /\n designed sequence timing) — they are not lost, not sent, and must\n not be re-drafted or manually re-sent.\n externally_scheduled_count (int, unit=messages): Gmail/provider-scheduled\n rows protected by an external-send reservation. They are excluded\n from actionable items and must not be approved or re-drafted.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"items\": [\n {\n \"message_id\": \"Message Id\",\n \"manual_notes\": [\n \"string\"\n ],\n \"conversation_thread\": [\n {}\n ],\n \"attachments\": [\n {}\n ]\n }\n ],\n \"total_pending\": 1,\n \"offset\": 1,\n \"limit\": 1,\n \"approved_pending_send_count\": 1,\n \"externally_scheduled_count\": 1,\n \"channel_holds\": [\n {\n \"channel\": \"Channel\",\n \"state\": \"State\",\n \"reason_code\": \"Reason Code\",\n \"blocking\": true,\n \"retryable\": true,\n \"affected_approved_count\": 1,\n \"next_action\": \"Next Action\"\n }\n ],\n \"channel_holds_degraded\": true\n}\n```",
|
|
535
|
+
"description": "Get Outreach Review\n\nDefault tool for outreach queue triage — pending messages with full context for review.\n\nStart here when reviewing or managing the outreach queue. Returns pending\nmessages — both 'needs_draft' (unauthored, awaiting harness authoring: write\nvia manage_messages edit) and 'draft' (authored, awaiting approve/reject),\ndisambiguated by each item's `status` — enriched with: person context,\nobjective instructions (tone rules, selling strategy, touch sequence), match\nanalysis (summary, alignment points, recommended approach), company research\nsummary, recent LinkedIn posts, conversation thread, and outreach plan state.\nOne call gives you everything needed to author, approve, or reject.\n\n`channel_holds` reports LinkedIn sender blocks such as daily quota,\nprovider throttling, or reconnect-required state. If\n`channel_holds_degraded` is true, an empty hold list is unknown rather than\nproof that the channel is healthy.\n\nUse content_length='full' for detailed review (capped at 5 items to prevent\nconnection drops from oversized payloads — use offset to paginate),\nor 'preview' (default) for quick scanning with truncated content.\n\nFilter by objective name or ID to review a specific queue (e.g. objective='DFW CFOs').\n\nUse message_ids to fetch specific messages by ID (comma-separated UUIDs, max 20).\nBypasses sorting/pagination — returns full context for exactly those messages.\nUseful for subagent dispatch: pull the lightweight queue first, split into batches,\nthen each subagent calls with its assigned message_ids.\n\nOperators: pass for_company parameter to review a specific client company.\n\nReturns (units in parentheses; scope = messages.status IN ('draft','needs_draft')\nfor this tenant unless message_ids is set):\n items (list of ReviewItem, unit=messages): one entry per pending message\n (not per person — a person with two pending messages shows up twice).\n Each item:\n - message_id, status ('needs_draft' = author it, 'draft' = approve it),\n channel, subject, content, category (initial / followup /\n reply_response), priority_score, created_at\n - expires_at (needs_draft only): when the nightly sweep auto-rejects\n this row if still unauthored (the action's expires_at —\n regenerate grants a fresh window). Author nearest-deadline-first.\n An expired touch shows up later as status='rejected'\n with blank content and ai_decision_context.expired_signal — that is\n GC, NOT an operator rejection; revive via manage_messages\n action=regenerate, then author and edit as normal.\n - person_id, person_name, person_title, person_company, match_score,\n stage (the company_people stage)\n - campaign_name, campaign_tone_instructions, campaign_selling_strategy,\n campaign_touch_sequence (per-touch instructions): VRU-878 — sourced\n from the message's PLAN OBJECTIVE (name / policy_envelope.tone_rules\n / sequence pin), not a campaign row. Field names are fixed by the\n shared ReviewItem schema (app/shared/schemas/mcp_compound.py, out\n of scope here).\n - match_summary, alignment_points, recommended_approach\n - company_summary (recent company research),\n recent_linkedin_posts (last 3 posts; unit=posts)\n - manual_notes (full content only): up to 10 newest-first person\n timeline notes. Each note is capped at 4,000 characters, each\n person at 8,000, and all repeated item payloads at 30,000 total.\n A cut note ends with `...[truncated]`. When objective instructions\n name a saved per-person draft, use it instead of the 200-character\n activity summary.\n - conversation_thread (list of outbound+inbound rows, unit=messages,\n ordered by created_at; truncated to 200 chars when content_length='preview')\n - prior_reply (cold touches only: category initial/followup): the\n person's newest human reply {message_id, received_at, channel,\n intent, excerpt}. The prospect already wrote back, so the draft\n is a re-pitch: read the reply, and hold the draft for the\n operator unless they chose to continue the sequence. None when\n the person never replied.\n - outreach_plan_id (the linked plan's id — pass straight to\n manage_outreach pause/resume/stop; no get_person_360 needed),\n plan_status, plan_strategy, touches_completed, max_touches,\n plan_next_action_at (when the plan's next touch fires — an\n approved-but-deferred send happens at this time),\n connection_status (the plan's LinkedIn connection state) (from\n the linked outreach_plan; unit=plans)\n - PRIORITIZE WARM ITEMS: a linkedin_message item with\n connection_status='connected' is a follow-up to someone who\n ACCEPTED the connection request — author/approve these before\n any cold lane; they are the highest-EV rows in the queue.\n total_pending (int, unit=messages): EXACT count of actionable pending messages\n matching the objective / message_ids filter for the tenant,\n BEFORE pagination. Filters: status IN ('draft','needs_draft'),\n excludes externally scheduled/reservation-protected rows,\n user_company_id, and the objective filter when set. Does NOT\n date-filter — the queue is \"everything currently pending.\"\n offset (int): echoes the request offset.\n limit (int, unit=messages): echoes the page size. When content_length='full'\n this is capped at 5 (regardless of the requested limit).\n approved_pending_send_count (int, unit=messages): approved rows that\n have NOT sent yet (they no longer show as items). Non-zero after a\n bulk approve means those sends are SCHEDULED (per-person cooldown /\n designed sequence timing) — they are not lost, not sent, and must\n not be re-drafted or manually re-sent.\n externally_scheduled_count (int, unit=messages): Gmail/provider-scheduled\n rows protected by an external-send reservation. They are excluded\n from actionable items and must not be approved or re-drafted.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"items\": [\n {\n \"message_id\": \"Message Id\",\n \"manual_notes\": [\n \"string\"\n ],\n \"conversation_thread\": [\n {}\n ],\n \"attachments\": [\n {}\n ]\n }\n ],\n \"total_pending\": 1,\n \"offset\": 1,\n \"limit\": 1,\n \"approved_pending_send_count\": 1,\n \"externally_scheduled_count\": 1,\n \"channel_holds\": [\n {\n \"channel\": \"Channel\",\n \"state\": \"State\",\n \"reason_code\": \"Reason Code\",\n \"blocking\": true,\n \"retryable\": true,\n \"affected_approved_count\": 1,\n \"next_action\": \"Next Action\"\n }\n ],\n \"channel_holds_degraded\": true\n}\n```",
|
|
536
536
|
"inputSchema": {
|
|
537
537
|
"properties": {
|
|
538
538
|
"content_length": {
|
|
@@ -707,7 +707,7 @@
|
|
|
707
707
|
"openWorldHint": false,
|
|
708
708
|
"readOnlyHint": true
|
|
709
709
|
},
|
|
710
|
-
"description": "Get Revenue\n\nRead provider revenue and explicitly attested project finance.\n\nViews:\n- connection: provider connection and freshness state.\n- metrics: current gross MRR/ARR, net charge volume, collections and health.\n- evidence: recent immutable ingestion evidence for calculation drilldown.\n- bindings: suggested, confirmed, or rejected commercial-object bindings.\n- account: confirmed USD account revenue, invoices and latest recorded charge.\n- service_margin: finance-attested project margin for an exact closed period.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
|
|
710
|
+
"description": "Get Revenue\n\nRead provider revenue and explicitly attested project finance.\n\nViews:\n- connection: provider connection and freshness state.\n- metrics: current gross MRR/ARR, net charge volume, collections and health.\n- evidence: recent immutable ingestion evidence for calculation drilldown.\n- bindings: suggested, confirmed, or rejected commercial-object bindings.\n- account: confirmed USD account revenue, invoices and latest recorded charge.\n- service_margin: finance-attested project margin for an exact closed period.\n- finance_workspace: current statement, finance documents and account-period labor\n for guided review; offset pages documents and source_ids retain selected records.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
|
|
711
711
|
"inputSchema": {
|
|
712
712
|
"properties": {
|
|
713
713
|
"binding_status": {
|
|
@@ -852,6 +852,15 @@
|
|
|
852
852
|
"title": "period_start",
|
|
853
853
|
"type": "string"
|
|
854
854
|
},
|
|
855
|
+
"source_ids": {
|
|
856
|
+
"items": {
|
|
857
|
+
"format": "uuid",
|
|
858
|
+
"type": "string"
|
|
859
|
+
},
|
|
860
|
+
"maxItems": 20,
|
|
861
|
+
"title": "source_ids",
|
|
862
|
+
"type": "array"
|
|
863
|
+
},
|
|
855
864
|
"view": {
|
|
856
865
|
"enum": [
|
|
857
866
|
"connection",
|
|
@@ -859,7 +868,8 @@
|
|
|
859
868
|
"evidence",
|
|
860
869
|
"bindings",
|
|
861
870
|
"account",
|
|
862
|
-
"service_margin"
|
|
871
|
+
"service_margin",
|
|
872
|
+
"finance_workspace"
|
|
863
873
|
],
|
|
864
874
|
"title": "view",
|
|
865
875
|
"type": "string"
|
|
@@ -1586,7 +1596,7 @@
|
|
|
1586
1596
|
"openWorldHint": false,
|
|
1587
1597
|
"readOnlyHint": false
|
|
1588
1598
|
},
|
|
1589
|
-
"description": "Manage Outreach\n\nStart and steer outreach plans — the consolidated outreach writer.\n\nActions:\n- start: enroll a person in outreach. id = PERSON UUID (scalar starts\n one plan; an id ARRAY routes to the native bulk-start endpoint).\n `payload` optional: {max_touches?, allowed_channels?} — applied to\n every started plan. Enrollment always schedules the first action\n immediately; a `start_immediately` key is ignored (forced true).\n For researched/discovered prospects, call manage_person action=save_discovered\n first with a strong current-company binding and\n start only when its response has `company_bound=true` and the quality\n gates passed. Never use start to bypass an unresolved or name-only\n company save.\n- plan_override: record a user override on a plan (id = plan UUID;\n `payload` = the override fields).\n- channels: legacy plan-local policy action. It returns 409\n `objective_policy_owned`; update the objective policy or use\n `plan_override` for one touch.\n- trigger_touch: queue the plan's next touch now (id = plan UUID; no\n payload). Refused with a structured 409 when the plan's pending\n approved email cannot send now: `email_daily_cap_reached` (the\n conversation's owning mailbox — or, for a first email, the sender\n pool — is at its daily cap; the error carries the capacity numbers,\n when capacity resets, and when the plan retries automatically) or\n `thread_mailbox_unavailable` (the owning mailbox is disconnected,\n resting, or excluded — reconnect it; another mailbox is never\n substituted into an existing conversation). A success here means the\n touch is genuinely queued, not that it may silently re-defer.\n- pause / resume: pause or resume a plan (id = plan UUID; `payload`\n is not needed).\n- update: legacy plan-local policy action. It returns 409\n `objective_policy_owned`; update the objective policy instead.\n- objective_create: create one draft objective (no id; payload carries\n name, goal_statement, target, cohort, and policy_envelope). It does not\n activate or send.\n- objective_setup_context: read Architect inputs (id=objective).\n- objective_setup_list: read saved setup reviews, optionally filtered by action_id.\n- objective_setup_propose: persist SetupProposalRequest for review; no configuration writes.\n- objective_setup_prepare: explicitly invoke the Architect and persist its setup review.\n- objective_setup_apply: apply the saved action_id and expected_version. Saves\n only configuration atomically, never sourcing, enrollment, launch, or sending.\n- objective_setup_reject: reject the saved action_id and expected_version without applying it.\n- objective_update: edit a native draft/paused objective (id = objective\n UUID; payload requires expected_planning_version and carries any of\n name, goal_statement, target, cohort, or policy_envelope). Required\n rates are the one active-objective edit:\n {<metric>: {min_rate: 0-1, min_rate_basis: '<arithmetic>'}}\n for contacted_to_reply | contacted_to_meeting | meeting_to_won, merged\n into target.required_rates (a metric set to null clears it). It is the\n viability loop's first seed basis (VRU-846); never an industry average.\n Without applicable observed conversion, a reviewed calibration pilot uses\n target.pilot = {max_contacts: 1-100, duration_days: 1-28,\n assumed_conversion_rate: >0 and <=1, assumption_basis, measurement_plan}.\n Preserve the saved target fields. A pilot also needs an executable\n sequence saved through objective_pin; target.pilot.claim_id is unsupported.\n- objective_audience: read paginated accounts or people (id = objective UUID;\n payload = {view: \"accounts\"|\"people\", query?, status?, company_id?,\n unresolved?, limit?, offset?}). Counts and account outreach are projections.\n- objective_audience_build: read the deterministic audience volume plan,\n required research facts, and latest saved sourcing run (id = objective UUID;\n optional payload = {pilot_size: 1-100}). Does not attach CRM people,\n invoke a model, or start providers. A pilot is not a meeting forecast.\n Includes brief_context_fingerprint and research_brief_stale for reviewed briefs.\n fact_definitions lists workspace definitions with description, subject_type,\n and answer_schema. For an equivalent public question, copy these as\n fact_definition, subject_type and answer_schema in the reviewed brief.\n Leave fact_definition unset for private conversations and interpretations.\n- objective_research_brief: generate commercial research questions for review\n (id = objective UUID; payload = {expected_planning_version, guidance?}).\n Uses a budgeted model; never saves, researches prospects, assigns, or sends.\n Review/edit the proposal before objective_update saves cohort.research_brief;\n preserve other cohort fields and the proposal's expected_planning_version.\n Your own agent can instead draft the same typed brief using objective and\n company context, with brief_context_fingerprint from objective_audience_build.\n- objective_account: select or deselect an existing CRM account (id = objective\n UUID; payload = {company_id, selected: bool}). Accounts may have zero contacts.\n Selection is planning context, not enrollment or a sourcing restriction.\n Read selected accounts with objective_audience before proposing named-account\n sourcing. Never enroll every employee automatically.\n- objective_members: assign or unassign people (id = objective UUID;\n payload = {action: assign|unassign, person_ids: [...]}, max 100).\n- objective_pin: set one claim-backed hard constraint (id = objective\n UUID; payload = {pin_key, pin_value, statement?}) on a draft/paused objective.\n Creates and links the backing Claim automatically. For an outreach sequence,\n use pin_key=\"sequence\", pin_value=[{step: 1, delay_days: 0,\n channels: [{channel: \"linkedin_connection\"}], instructions: \"...\"}, ...],\n and statement=the sequence rationale. Steps need unique positive step\n numbers and non-empty channels; delay_days and instructions are optional.\n A standalone Claim, verdict, or tone/drafting brief does not save a sequence.\n For a bare connection request, separately pin connection_request_no_note=true.\n Repeating a live pin_key returns the existing pin; it does not replace it.\n- objective_unpin: retire one pin and its Claim (id = objective UUID;\n payload = {pin_key, reason}).\n- objective_forecast: read the current derived path distribution, weekly\n channel load, target math, five sample plans, commitments, abstentions,\n and prior-forecast diff (id = objective UUID; no payload).\n Resolve blocking_reasons before objective_launch. pilot_sequence_claim_required\n means save the reviewed sequence and rationale through objective_pin.\n- objective_retire: end an objective for good (id = objective UUID; no\n payload); its runnable plans stop under objective_retired. Works the\n same for every objective — a former campaign mirror is an ordinary\n objective now.\n- objective_clone: a new draft with the objective's inputs and live pins\n (id = objective UUID; optional payload {name}); members are not\n copied. Works the same for every objective.\n- objective_pause: pause an objective (id = objective UUID; no payload).\n Its runnable plans park under the objective's own stop reason;\n relaunch through forecast and approval restores exactly those. Works\n the same for every objective.\n- objective_observe: propose a measurement review for an observe objective (id = objective UUID; payload = source_bindings and client_request_id). No sender, research, enrollment, or outreach.\n- objective_observe_approve: approve only after the user reviews and confirms the observation definition and sources (payload = action_id and expected_version). This freezes measurement, not execution permissions.\n- objective_cohort_revise: record an explicit, evidenced admission or correction on an approved run (payload = run_action_id and revision). Corrections preserve the previous report and need the user's approval.\n- objective_launch: propose the review-class launch Action over the exact\n current fingerprint (id = objective UUID; no payload). It does not\n activate or send. Requires a ready objective_forecast. For\n pilot_sequence_claim_required, use objective_pin with pin_key=\"sequence\",\n then refresh the forecast. Separate claims/verdicts cannot clear this blocker;\n changing the target metric or pilot duration cannot save the missing sequence.\n- objective_approve: accept that launch Action after a fresh fingerprint\n check (id = objective UUID; payload = {action_id}). A changed forecast\n abandons the action and returns 409. Approval activates the objective,\n enrolls eligible members, and schedules execution under its policy.\n and enqueues the executor, which enrolls the forecast's planned members\n through the research and supply gates; sends then follow the normal\n draft-and-approve path.\n- objective_sourcing_plan: calculate the exact cohort size, live provider\n order, bounded cost and candidate limits, and blocking reasons. Optional\n payload {pilot_size: 1-100} requests an explicit pilot audience size including\n existing eligible members, without an assumed or observed conversion rate.\n- objective_source: propose a review Action for that exact sourcing plan\n (id = objective UUID; optional payload {pilot_size: 1-100}). First checks\n existing live sourcing work; otherwise checks CRM imports and attaches fits, then sizes additional sourcing.\n No new discovery starts until approval. A pilot is one bounded sourcing run,\n not an outreach launch or a forecast of replies. Existing launch gates apply.\n- objective_source_approve: approve the sourcing Action after a fresh\n fingerprint check (id = objective UUID; payload = {action_id}). Approval\n enqueues one bounded cohort build. Only people who pass the existing\n objective fit checks join the objective.\n- objective_sourcing_run: read saved preparation counts and recovery by action_id.\n- objective_sourcing_stop: stop further work with action_id and expected_version; saved results remain.\n- objective_sourcing_recovery: read saved failure phase, resume eligibility,\n and current reviewed_inputs (id = objective UUID; payload = {job_id}).\n- objective_sourcing_resume: explicitly approve recovery of saved work\n (id = objective UUID; payload = {job_id, reviewed_inputs}). Copy reviewed_inputs\n from the recovery read. Changed inputs renew fit on saved candidates without\n discovery or enrichment; the rubric model may run. Unknown provider outcomes\n require reconciliation and cannot be overridden with resume.\n- objective_apply_template: render a touch's template over the\n objective's UNAUTHORED (needs_draft) rows for that touch —\n deterministic substitution of the operator's own template prose\n ({{first_name}}, {{last_name}}, {{company}}, {{title}}), never an LLM\n (id = objective UUID; payload = {step, cursor?}). BATCHED: processes up\n to 500 rows per call and returns {rendered, skipped (first 50),\n skipped_total, skipped_counts, total_unauthored, has_more,\n next_cursor}. While has_more is true you MUST call again with\n payload {step, cursor: <next_cursor>} — repeating without the cursor\n restarts from the beginning and skipped rows block the tail.\n Unrenderable rows are skipped with the reason and stay unauthored\n (missing variable value, channel outside the step's chain,\n email/InMail template without a subject). Set the template first via\n objective_update: a policy_envelope sequence step gains\n {\"template\": {\"subject\"?, \"body\"}}.\n- objective_touch_asset: attach or remove one reusable asset for one\n touch channel (id = objective UUID; payload = {step, channel,\n asset_id} referencing a library entry uploaded through the objective\n assets route; or {step, channel, remove: true}). No inline upload or\n Drive-source fields are accepted. Assets are supported on email,\n linkedin_message, and linkedin_inmail only.\n- objective_delegate: let one member manage every current and future\n objective for a sender (no id; payload = {sender_user_id,\n delegate_user_id}). The sender, owner, or operator can grant access.\n- objective_revoke_delegation: revoke that grant immediately (id =\n delegation UUID). The sender, owner, or operator can revoke access.\n\nBulk: `start` arrays hit the native bulk endpoint; pause/resume/\nplan_override/channels/trigger_touch arrays loop with per-item status —\npartial failure is reported per item, never silent (max 100). Payloads\nare validated by the underlying route's own schema.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
|
|
1599
|
+
"description": "Manage Outreach\n\nStart and steer outreach plans — the consolidated outreach writer.\n\nActions:\n- start: enroll a person in outreach. id = PERSON UUID (scalar starts\n one plan; an id ARRAY routes to the native bulk-start endpoint).\n `payload` optional: {max_touches?, allowed_channels?} — applied to\n every started plan. Enrollment always schedules the first action\n immediately; a `start_immediately` key is ignored (forced true).\n For researched/discovered prospects, call manage_person action=save_discovered\n first with a strong current-company binding and\n start only when its response has `company_bound=true` and the quality\n gates passed. Never use start to bypass an unresolved or name-only\n company save.\n- plan_override: record a user override on a plan (id = plan UUID;\n `payload` = the override fields).\n- channels: legacy plan-local policy action. It returns 409\n `objective_policy_owned`; update the objective policy or use\n `plan_override` for one touch.\n- trigger_touch: queue the plan's next touch now (id = plan UUID; no\n payload). Refused with a structured 409 when the plan's pending\n approved email cannot send now: `email_daily_cap_reached` (the\n conversation's owning mailbox — or, for a first email, the sender\n pool — is at its daily cap; the error carries the capacity numbers,\n when capacity resets, and when the plan retries automatically) or\n `thread_mailbox_unavailable` (the owning mailbox is disconnected,\n resting, or excluded — reconnect it; another mailbox is never\n substituted into an existing conversation). A success here means the\n touch is genuinely queued, not that it may silently re-defer.\n- pause / resume: pause or resume a plan (id = plan UUID). Resume\n re-arms the cold sequence: approved cold messages release and the\n next step queues. A plan that a human reply paused refuses with 409\n `plan_paused_by_reply`, carrying the latest reply, the pending cold\n messages, and the last step fired. Never resume to release a reply:\n replies send without the plan. Pass payload\n {continue_sequence: true} only when the operator decided to keep\n pitching this person; otherwise answer with a reply draft or stop the\n plan. A successful resume reports what it released.\n- update: legacy plan-local policy action. It returns 409\n `objective_policy_owned`; update the objective policy instead.\n- objective_create: create one draft objective (no id; payload carries\n name, goal_statement, target, cohort, and policy_envelope). It does not\n activate or send.\n- objective_setup_context: read Architect inputs (id=objective).\n- objective_setup_list: read saved setup reviews, optionally filtered by action_id.\n- objective_setup_propose: persist SetupProposalRequest for review; no configuration writes.\n- objective_setup_prepare: explicitly invoke the Architect and persist its setup review.\n- objective_setup_apply: apply the saved action_id and expected_version. Saves\n only configuration atomically, never sourcing, enrollment, launch, or sending.\n- objective_setup_reject: reject the saved action_id and expected_version without applying it.\n- objective_update: edit a native draft/paused objective (id = objective\n UUID; payload requires expected_planning_version and carries any of\n name, goal_statement, target, cohort, or policy_envelope). Required\n rates are the one active-objective edit:\n {<metric>: {min_rate: 0-1, min_rate_basis: '<arithmetic>'}}\n for contacted_to_reply | contacted_to_meeting | meeting_to_won, merged\n into target.required_rates (a metric set to null clears it). It is the\n viability loop's first seed basis (VRU-846); never an industry average.\n Without applicable observed conversion, a reviewed calibration pilot uses\n target.pilot = {max_contacts: 1-100, duration_days: 1-28,\n assumed_conversion_rate: >0 and <=1, assumption_basis, measurement_plan}.\n Preserve the saved target fields. A pilot also needs an executable\n sequence saved through objective_pin; target.pilot.claim_id is unsupported.\n- objective_audience: read paginated accounts or people (id = objective UUID;\n payload = {view: \"accounts\"|\"people\", query?, status?, company_id?,\n unresolved?, limit?, offset?}). Counts and account outreach are projections.\n- objective_audience_build: read the deterministic audience volume plan,\n required research facts, and latest saved sourcing run (id = objective UUID;\n optional payload = {pilot_size: 1-100}). Does not attach CRM people,\n invoke a model, or start providers. A pilot is not a meeting forecast.\n Includes brief_context_fingerprint and research_brief_stale for reviewed briefs.\n fact_definitions lists workspace definitions with description, subject_type,\n and answer_schema. For an equivalent public question, copy these as\n fact_definition, subject_type and answer_schema in the reviewed brief.\n Leave fact_definition unset for private conversations and interpretations.\n- objective_research_brief: generate commercial research questions for review\n (id = objective UUID; payload = {expected_planning_version, guidance?}).\n Uses a budgeted model; never saves, researches prospects, assigns, or sends.\n Review/edit the proposal before objective_update saves cohort.research_brief;\n preserve other cohort fields and the proposal's expected_planning_version.\n Your own agent can instead draft the same typed brief using objective and\n company context, with brief_context_fingerprint from objective_audience_build.\n- objective_account: select or deselect an existing CRM account (id = objective\n UUID; payload = {company_id, selected: bool}). Accounts may have zero contacts.\n Selection is planning context, not enrollment or a sourcing restriction.\n Read selected accounts with objective_audience before proposing named-account\n sourcing. Never enroll every employee automatically.\n- objective_members: assign or unassign people (id = objective UUID;\n payload = {action: assign|unassign, person_ids: [...]}, max 100).\n- objective_pin: set one claim-backed hard constraint (id = objective\n UUID; payload = {pin_key, pin_value, statement?}) on a draft/paused objective.\n Creates and links the backing Claim automatically. For an outreach sequence,\n use pin_key=\"sequence\", pin_value=[{step: 1, delay_days: 0,\n channels: [{channel: \"linkedin_connection\"}], instructions: \"...\"}, ...],\n and statement=the sequence rationale. Steps need unique positive step\n numbers and non-empty channels; delay_days and instructions are optional.\n A standalone Claim, verdict, or tone/drafting brief does not save a sequence.\n For a bare connection request, separately pin connection_request_no_note=true.\n Repeating a live pin_key returns the existing pin; it does not replace it.\n- objective_unpin: retire one pin and its Claim (id = objective UUID;\n payload = {pin_key, reason}).\n- objective_forecast: read the current derived path distribution, weekly\n channel load, target math, five sample plans, commitments, abstentions,\n and prior-forecast diff (id = objective UUID; no payload).\n Resolve blocking_reasons before objective_launch. pilot_sequence_claim_required\n means save the reviewed sequence and rationale through objective_pin.\n- objective_retire: end an objective for good (id = objective UUID; no\n payload); its runnable plans stop under objective_retired. Works the\n same for every objective — a former campaign mirror is an ordinary\n objective now.\n- objective_clone: a new draft with the objective's inputs and live pins\n (id = objective UUID; optional payload {name}); members are not\n copied. Works the same for every objective.\n- objective_pause: pause an objective (id = objective UUID; no payload).\n Its runnable plans park under the objective's own stop reason;\n relaunch through forecast and approval restores exactly those. Works\n the same for every objective.\n- objective_observe: propose a measurement review for an observe objective (id = objective UUID; payload = source_bindings and client_request_id). No sender, research, enrollment, or outreach.\n- objective_observe_approve: approve only after the user reviews and confirms the observation definition and sources (payload = action_id and expected_version). This freezes measurement, not execution permissions.\n- objective_cohort_revise: record an explicit, evidenced admission or correction on an approved run (payload = run_action_id and revision). Corrections preserve the previous report and need the user's approval.\n- objective_launch: propose the review-class launch Action over the exact\n current fingerprint (id = objective UUID; no payload). It does not\n activate or send. Requires a ready objective_forecast. For\n pilot_sequence_claim_required, use objective_pin with pin_key=\"sequence\",\n then refresh the forecast. Separate claims/verdicts cannot clear this blocker;\n changing the target metric or pilot duration cannot save the missing sequence.\n- objective_approve: accept that launch Action after a fresh fingerprint\n check (id = objective UUID; payload = {action_id}). A changed forecast\n abandons the action and returns 409. Approval activates the objective,\n enrolls eligible members, and schedules execution under its policy.\n and enqueues the executor, which enrolls the forecast's planned members\n through the research and supply gates; sends then follow the normal\n draft-and-approve path.\n- objective_sourcing_plan: calculate the exact cohort size, live provider\n order, bounded cost and candidate limits, and blocking reasons. Optional\n payload {pilot_size: 1-100} requests an explicit pilot audience size including\n existing eligible members, without an assumed or observed conversion rate.\n- objective_source: propose a review Action for that exact sourcing plan\n (id = objective UUID; optional payload {pilot_size: 1-100}). First checks\n existing live sourcing work; otherwise checks CRM imports and attaches fits, then sizes additional sourcing.\n If existing members cover the requested audience, returns status=satisfied,\n the plan and qualification result, without an Action or approval step.\n No new discovery starts until approval. A pilot is one bounded sourcing run,\n not an outreach launch or a forecast of replies. Existing launch gates apply.\n- objective_source_approve: approve the sourcing Action after a fresh\n fingerprint check (id = objective UUID; payload = {action_id}). Approval\n enqueues one bounded cohort build. Only people who pass the existing\n objective fit checks join the objective.\n- objective_sourcing_run: read saved preparation counts and recovery by action_id.\n- objective_sourcing_stop: stop further work with action_id and expected_version; saved results remain.\n- objective_sourcing_recovery: read saved failure phase, resume eligibility,\n and current reviewed_inputs (id = objective UUID; payload = {job_id}).\n- objective_sourcing_resume: explicitly approve recovery of saved work\n (id = objective UUID; payload = {job_id, reviewed_inputs}). Copy reviewed_inputs\n from the recovery read. Changed inputs renew fit on saved candidates without\n discovery or enrichment; the rubric model may run. Unknown provider outcomes\n require reconciliation and cannot be overridden with resume.\n- objective_apply_template: render a touch's template over the\n objective's UNAUTHORED (needs_draft) rows for that touch —\n deterministic substitution of the operator's own template prose\n ({{first_name}}, {{last_name}}, {{company}}, {{title}}), never an LLM\n (id = objective UUID; payload = {step, cursor?}). BATCHED: processes up\n to 500 rows per call and returns {rendered, skipped (first 50),\n skipped_total, skipped_counts, total_unauthored, has_more,\n next_cursor}. While has_more is true you MUST call again with\n payload {step, cursor: <next_cursor>} — repeating without the cursor\n restarts from the beginning and skipped rows block the tail.\n Unrenderable rows are skipped with the reason and stay unauthored\n (missing variable value, channel outside the step's chain,\n email/InMail template without a subject). Set the template first via\n objective_update: a policy_envelope sequence step gains\n {\"template\": {\"subject\"?, \"body\"}}.\n- objective_touch_asset: attach or remove one reusable asset for one\n touch channel (id = objective UUID; payload = {step, channel,\n asset_id} referencing a library entry uploaded through the objective\n assets route; or {step, channel, remove: true}). No inline upload or\n Drive-source fields are accepted. Assets are supported on email,\n linkedin_message, and linkedin_inmail only.\n- objective_delegate: let one member manage every current and future\n objective for a sender (no id; payload = {sender_user_id,\n delegate_user_id}). The sender, owner, or operator can grant access.\n- objective_revoke_delegation: revoke that grant immediately (id =\n delegation UUID). The sender, owner, or operator can revoke access.\n\nBulk: `start` arrays hit the native bulk endpoint; pause/resume/\nplan_override/channels/trigger_touch arrays loop with per-item status —\npartial failure is reported per item, never silent (max 100). Payloads\nare validated by the underlying route's own schema.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
|
|
1590
1600
|
"inputSchema": {
|
|
1591
1601
|
"properties": {
|
|
1592
1602
|
"action": {
|