MCP tool reference
The full catalog of tools Pact's MCP server exposes, grouped by module, with read/write access and required scope.
Pact's MCP server (https://api.pact.place/mcp) exposes 171 tools across
34 modules — 94 read tools and 77 write/action tools. Every read is
consent-filtered, contact PII is BYOK-decrypted per tenant, and every call is
audited and cost-attributed. Each tool declares a required OAuth scope; a key
or token only sees the tools its scopes allow.
Note
The typed TypeScript and Python clients wrap each tool as a method that returns its structured output directly — you rarely call a tool by raw name. Write and action tools are marked Write below; they follow the same consent, audit, and cost rules as reads.
Access legend: Read = read-only (no side effects); Write = creates, updates, or runs an action.
Core CRM & workspace
Query accounts, contacts, deals, pipeline health, and ask the workspace.
| Tool | Access | Scope | What it does |
|---|---|---|---|
ask_workspace | Read | — | Ask a natural-language question across the tenant's workspace (accounts, contacts, deals, activity) and get a grounded, cited… |
compute_pipeline_metrics | Read | — | Compute pipeline dimensions over the unified data layer: time-in-stage histogram, stage conversion + win rate, deal velocity… |
get_metric_explanation | Read | — | Explain why a KPI moved, grounded in the deals that advanced, slipped, won, or lost in the window (the metric-explainer agent). |
get_trace | Read | — | Fetch the full span tree for a past MCP trace_id — every tool, every sub-tool, every cost, every citation. |
list_agents | Read | — | List the Pact AI agents that can be run via fire_agent. |
predict_cost | Read | — | Estimate cents-per-call and tokens for one Pact MCP tool BEFORE you fire it, so an agent or UI can budget. |
query_accounts | Read | — | Search the tenant's CRM accounts (companies). |
query_activity_ledger | Read | — | Read the unified activity log for an entity: emails, calls, meetings, notes, agent fires, syncs, documents, signatures — with… |
query_contacts | Read | — | Search the tenant's CRM contacts (people). |
query_deals | Read | — | Search the tenant's pipeline deals. |
query_pipeline_health | Read | — | Aggregate pipeline metrics for the tenant: open pipeline value, weighted value, deal count, average deal size, win rate, and a… |
query_stage_history | Read | — | Read the deal/opportunity/account stage-transition log: every move with from/to stage, why (reason_code), days spent in the… |
read_briefing | Read | — | A daily briefing for the calling user, composed from the live pipeline snapshot, the last week's deal activity, and a grounded AI… |
fire_agent | Write | — | Execute a Pact AI agent (see list_agents) and return its output, confidence, and citations. |
replay_trace | Write | — | Re-fire the root tool of a past trace with the same arguments and return a diff (latency / cost / citations) vs the original. |
Core CRM writes
Create and update the core CRM records.
| Tool | Access | Scope | What it does |
|---|---|---|---|
add_note | Write | write:activities | Append a timestamped note (or call/email/meeting/visit log entry) to an account's activity history. |
create_account | Write | — | Create a CRM account (company) in the caller's tenant. |
create_contact | Write | write:contacts | Create a CRM contact. |
create_deal | Write | write:deals | Create a pipeline deal (opportunity) on an account. |
update_account | Write | write:accounts | Update fields on an existing account, addressed by public_id (or legacy integer id). |
update_contact | Write | write:contacts | Update fields on an existing contact, addressed by public_id. |
update_deal | Write | write:deals | Update fields on an existing deal by integer deal_id (from query_deals or create_deal). |
API monetization
API usage, tier, and forecast.
| Tool | Access | Scope | What it does |
|---|---|---|---|
current_tier | Read | — | Return the caller's current tier slug, name, monthly unit allowance, RPS limit, and feature flags. |
forecast_usage | Read | — | Project the caller's month-end API unit consumption from the trailing-7d daily average. |
query_usage | Read | — | Return per-class API usage for the caller's tenant in the supplied period (default: current UTC month). |
Audio & video
Audio/video (Wave) tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
query_sentiment_trend | Read | — | Return the rolling-window sentiment trend (average, slope, direction, points) for one contact or one account. |
query_survey_responses | Read | — | Return survey responses (NPS / CSAT / CES) filtered by survey type, account, contact, or score band ('promoter' / 'passive' /… |
trigger_survey | Write | — | Schedule a one-off survey invitation for a contact, bypassing the lifecycle scanner. |
Call actions
AI-extracted call follow-up actions.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_call_actions | Read | read:activities | List AI-extracted follow-up actions from completed calls (newest first): tasks, decisions, deal-stage-change proposals, follow-up… |
apply_call_action | Write | write:activities | Apply ONE extracted call action by public id: create the task, pin the decision, or apply the deal-stage change (stage changes… |
extract_call_actions | Write | write:activities | Enqueue AI extraction of follow-up actions for one completed call (idempotent — re-running yields the same actions with the same… |
Context & memory
Conversation context and memory.
| Tool | Access | Scope | What it does |
|---|---|---|---|
classify_intent | Read | — | Map a user question to one of Pact's context-engine intents (pipeline_health, deal_inspection, account_360, forecast,… |
get_context_bundle | Read | — | Run the full Pact context engine: classify the question, resolve the bundle, fetch every source (consent-gated), and return a… |
preview_context | Read | — | Classify a question to an intent, resolve the bundle (override or built-in), and return a cost estimate WITHOUT firing the LLM or… |
define_bundle | Write | — | Create a tenant-defined context bundle (or version-bump an existing slug). |
Customer portal
Customer-facing portal operations.
| Tool | Access | Scope | What it does |
|---|---|---|---|
portal_list_change_requests | Read | — | List change-requests proposed by the tenant CRM to portal users on a given account, with optional status filter (pending |… |
portal_list_feedback | Read | — | List feedback submissions filed by portal users across the tenant (kinds: feature | problem | praise | nps_followup). |
portal_list_renewals | Read | — | List renewal / expansion / cancel / change-terms requests filed by portal users for a given account, plus an optional status… |
portal_team_overview | Read | — | List portal members + pending invitations for a given account so the CSM can see who on the customer's side has portal access. |
Customer success
Customer-success and health tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
cs_qbr_compose | Read | — | Compose (or fetch cached) a Quarterly Business Review deck for an account+period combo. |
cs_renewal_brief | Read | — | Compose (or fetch cached) a CSM-grade renewal brief for a specific opportunity. |
cs_save_coach | Read | — | Return the top-N ranked save plays for one account plus the currently-active save runs. |
cs_expansion_scan | Write | — | Run the deterministic expansion-signal scan and return the live feed. |
Data quality
Data-quality checks and fixes.
| Tool | Access | Scope | What it does |
|---|---|---|---|
dq_find_duplicates | Read | — | Return pending dedupe candidates for one entity type — sorted by confidence descending. |
dq_auto_dedupe_run | Write | — | Run one bounded scan over the entity's records under the active match config. |
dq_merge_pair | Write | — | Apply the tenant's survivorship rules to a candidate pair: the survivor side wins per-attribute under each rule's strategy, the… |
dq_score | Write | — | Compute and snapshot per-attribute data quality scores for one entity type. |
Data warehouse
Warehouse sync tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_warehouse_connections | Read | — | List the tenant's BYOK warehouse sync connections (Snowflake / BigQuery / Databricks / Redshift / Postgres) with status, CDC lag,… |
configure_warehouse | Write | — | Update the non-secret settings of an existing warehouse connection: display name, PII mode (include|drop|hash), synced table… |
trigger_warehouse_sync | Write | — | Run a warehouse sync now. |
Deal spaces
Shared deal-space tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
summarize_space | Read | — | Roll up activity, decisions, and commitments in a deal collaboration space over the last day or week. |
pin_decision | Write | — | Promote an existing message in a deal space to the decisions / facts feed. |
post_to_space | Write | — | Insert a message into the deal space tied to an opportunity. |
Decks
Pitch-deck generation tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
deck_templates | Read | — | List the tenant's deck templates (master pptx + slide-plan + brand colors + fonts). |
generate_deck | Write | — | Generate a fully-tailored, grounded pitch deck for one opportunity. |
regenerate_slide | Write | — | Rebuild ONE slide in a deck after the underlying source data (call extractions / content matches / opp record) has moved. |
Enrichment
Run and manage contact/company enrichment.
| Tool | Access | Scope | What it does |
|---|---|---|---|
account_360 | Read | — | Aggregate everything the enrichment platform knows about one account: per-field provenance, structured facts (funding history,… |
enrichment_history | Read | — | For a contact or account, return the per-field provenance trail — which source provided each value, at what confidence, and when. |
enrichment_signals | Read | — | Recent change signals for one account — news, funding rounds, exec moves, tech-stack shifts, hiring surges. |
list_recent_signals | Read | — | Tenant-wide feed of recent change signals — funding rounds, exec moves, hiring surges, tech-stack shifts, news mentions — across… |
bulk_enrich | Write | — | Enroll a set of accounts onto the named tier as Live subscriptions. |
configure_signal_action | Write | — | Create, update, pause or delete a tenant-wide signal action rule ('when a funding_round over $10M is detected, notify the account… |
enrich_account | Write | — | Enroll an account on the named tier (standard|pro|deep|live) as a Live subscription with an immediate first refresh. |
enrich_contact | Write | — | Enroll a contact on the named tier (standard|pro|deep|live) as a Live subscription with an immediate first refresh. |
Enrichment budget
Read and manage enrichment spend.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_enrichment_budgets | Read | — | Every active enrichment budget for the tenant with current-period spend, percent used, threshold config and behavior (alert |… |
predict_enrichment_cost | Read | — | Estimated cost in cents for enriching count records at the given level (L1-L4), and whether the caller's budgets would allow… |
set_enrichment_budget | Write | — | Create a budget (omit budget_id) or update one (pass budget_id). |
Field workspace
Custom field and schema tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
field_today_glance | Read | — | Compose the calling field rep's morning view: route plan, ordered visits with geocoded coords, territory list, and trailing-30d… |
field_visit_brief | Read | — | Generate a grounded pre-visit account brief. |
field_log_visit_note | Write | — | Append the rep's notes (typed + voice-transcript) to a visit and run the grounded post-visit summary. |
field_optimize_route | Write | — | Greedy nearest-neighbour TSP over the calling rep's plan for the given date (defaults to today). |
Identity & access
Users, roles, and access tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
audit_iam_events | Read | — | Most recent IAM-relevant audit events (auth., iam., scim.*). |
list_sessions | Read | — | Recent auth_sessions rows for the tenant. |
grant_jit_role | Write | — | Elevate a user's role for a bounded duration with auto-revoke. |
provision_user | Write | — | Create or update a single tenant_users row by email. |
revoke_session | Write | — | Kill a single auth_sessions row by id (sets ended_at + ended_reason='revoked_by_agent'). |
Inbound
Inbound message and lead handling.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_inbound_webhooks | Read | — | Return every inbound webhook endpoint configured for this tenant — the receiver URL the external system POSTs to, the per-source… |
fire_test_webhook | Write | — | Skips signature verification and dispatches a synthesized payload for the endpoint's source. |
replay_inbound_event | Write | — | Re-fire a previously received webhook event against the CURRENT subscription mapping. |
subscribe_inbound | Write | — | Map an external event_type (or glob pattern, e.g. |
Knowledge base
Knowledge-base search and drafting.
| Tool | Access | Scope | What it does |
|---|---|---|---|
search_kb | Read | — | Hybrid semantic + keyword search over the tenant's KB articles — the same engine behind the /kb browser and the agent reply… |
create_kb_article | Write | — | Persist a new KB article. |
record_kb_helpfulness | Write | — | Record a helpful / not-helpful vote on a KB article (by public id or slug) as the calling user. |
Learning
Enablement and learning tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
learning_status | Read | — | Read-only inspection: returns the open drift signals (cost ↑, latency ↑, guardrail blocks ↑, citation overlap ↓, rating ↓) and… |
propose_variant | Write | — | Run the learning-loop analyzer on this agent over the last 7 days, compare to the prior 14-day baseline, and generate up to 3… |
Marketing
Marketing workspace operations.
| Tool | Access | Scope | What it does |
|---|---|---|---|
compute_attribution | Read | — | Compute multi-touch attribution for won deals in the lookback window. |
search_content_library | Read | — | Semantic-search the tenant's content library by free-form query, optionally filtered by kind or persona. |
generate_campaign_brief | Write | — | Generate a structured campaign brief (goal, audience hypothesis, channels, KPIs, draft subjects, key message) from one NL prompt. |
simulate_persona_read | Write | — | Preview an email body as if a specific persona (VP Finance, Head of Engineering, CMO, etc.) read it. |
Marketplace seed
Marketplace seed handlers.
| Tool | Access | Scope | What it does |
|---|---|---|---|
pact_meeting_prep | Read | — | Return a one-page briefing for an upcoming meeting on an account or contact: snapshot, deal status, last touchpoints, 3 lead-with… |
pact_pipeline_reviewer | Read | — | Scan the caller's active pipeline and return a structured digest of deals at risk — slippage, single-thread exposure, engagement… |
pact_rfp_drafter | Read | — | Parse an uploaded RFP / SOW / questionnaire (PDF, DOCX) and return a structured first draft: each extracted question matched… |
MCP marketplace
Federated MCP marketplace tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
marketplace_recommend | Read | — | Recommend marketplace listings for a stated intent (e.g. |
marketplace_search | Read | — | Search the public Pact MCP marketplace by query string and optional category… |
marketplace_install | Write | — | Install a published listing onto the caller's tenant. |
Meetings
Meeting (Wave) tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
best_time | Read | — | Top-N candidate slots that work for every attendee, considering each one's busy events and stated working hours. |
meeting_notes | Read | — | Read structured AI meeting notes — summary, action items, decisions, and citations back to the source rows that fed them. |
search_decisions | Read | — | Search the tenant-wide rolled-up decision log (meeting decisions + deal-room space decisions + workflow decisions). |
attendee_brief | Write | — | Build a tight, honest pre-meeting one-pager for the caller. |
draft_follow_up | Write | — | Draft a follow-up email + recap note for one meeting. |
Microsoft 365
Microsoft 365 integration tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
m365_calendar_meeting_brief | Read | — | Compose a meeting brief from a list of attendee emails — matched profiles, open opportunities, recent activity. |
m365_outlook_match | Read | — | Match an Outlook counterparty email against Pact's contacts + accounts. |
m365_teams_home_panel | Read | — | Render one tab of the Teams personal-app Home — one of 'today', 'pipeline', 'inbox', 'records'. |
m365_outlook_compose_assist | Write | — | Generate an AI subject / body / agenda / Pact-context block for an Outlook compose window. |
Outbound
Outbound sequence operations.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_subscriptions | Read | — | Return every active subscription this MCP client has wired with subscribe(). |
list_topics | Read | — | Return the catalog of event topics a client can subscribe to via subscribe(), with per-topic filter examples. |
subscribe | Write | — | Subscribe this MCP client to a Pact event topic so the server pushes a notifications/pact/event JSON-RPC notification every… |
unsubscribe | Write | — | Soft-delete a Pact event-push subscription by its subscription_id. |
Quotas & personalization
Quota and personalization controls.
| Tool | Access | Scope | What it does |
|---|---|---|---|
mcp_get_user_preferences | Read | — | Return the caller's MCP preferences (role, tone, surface, timezone, skill levels) plus the currently-applied adapter set. |
mcp_personalization_status | Read | — | Return the personalization adapters currently applied to the caller — combination of explicit preferences + behavior signals —… |
mcp_quota_status | Read | — | Report current spend + remaining + straight-line forecast for the quotas applicable to the caller. |
mcp_request_quota_increase | Write | — | File a request to raise a quota cap. |
mcp_set_quota | Write | — | Upsert one quota subscription — (scope_level, scope_ref, period, cap_cents, behavior). |
mcp_update_user_preferences | Write | — | Partial-update the caller's MCP preferences. |
Recording retention
Call-recording retention controls.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_recordings_pending_deletion | Read | — | Read-only view of the deletion queue: recordings past the tenant retention window (the next daily sweep soft-deletes them) and… |
apply_legal_hold | Write | — | Place a call recording under legal hold. |
release_legal_hold | Write | — | Release a legal hold. |
set_retention_policy | Write | — | Update the tenant's recording retention window (1-2555 days), toggle call recording on/off, and/or set the consent ack mode… |
Sales engineering
RFP drafting, win vault, playbooks, sandboxes, and SE analytics.
| Tool | Access | Scope | What it does |
|---|---|---|---|
get_se_analytics | Read | — | Return the SE lead's team analytics: RFP win-rate by section, sandbox stage funnel, top prospect objections, playbook… |
list_top_objections | Read | — | Return the top prospect objection categories mined from the SE's tech-Q&A inbox (open / escalated / deferred rows), with counts… |
se_get_battlecard | Read | — | Fetch one battlecard by public_id — the rendered body plus the structured sections (proof from won deals, competitive signal, how… |
se_list_battlecards | Read | — | List the tenant's auto-generated competitor battlecards — competitor, title, current version, and when each was last generated. |
se_list_playbook_suggestions | Read | — | List AI-detected playbook gaps — recurring lost-deal themes with no covering playbook in the SE library. |
se_open_rfps | Read | — | List open RFPs for the caller's tenant — sorted by due date. |
se_rfp_prep_sheet | Read | — | Negotiation prep for one scored RFP: per question, the risk band (lose_on/win_on/neutral), objection category, likely objections,… |
se_sandbox_compliance_summary | Read | — | Return the honest compliance description for a regulatory scope (none | hipaa | sox | pci | gdpr) applied to a vertical… |
se_suggest_architecture | Read | — | Compose a deterministic architecture palette + Mermaid block from a prospect-shape input (seats, vertical, SSO flag, residency,… |
search_playbooks | Read | — | Hybrid semantic + keyword search over the tenant's curated SE playbook library (vertical discovery guides, competitor battle… |
search_win_library | Read | — | Semantic + lexical search over the tenant's win library (reusable sales evidence distilled from won deals: quotes, ROI figures,… |
create_playbook | Write | — | Add a markdown playbook to the tenant's curated SE library. |
extract_evidence_from_deal | Write | — | Queue a BYOK-LLM extraction of reusable win evidence from a closed-won deal (its notes, quotes, correspondence, transcripts). |
record_playbook_usage | Write | — | Record that an SE playbook was used, dismissed, or contributed to a won deal — feeds the library's usage analytics so playbooks… |
request_customer_consent_for_evidence | Write | — | Email the quoted customer a one-click request to reuse a verbatim quote from the win library in outward-facing material. |
se_accept_playbook_suggestion | Write | — | Accept a playbook suggestion — creates a real playbook in the SE library and marks the suggestion accepted, linking the two. |
se_create_demo_sandbox | Write | — | Provision a per-prospect demo sandbox. |
se_detect_playbook_gaps | Write | — | Scan LOST deals for recurring themes no playbook covers, and draft a suggestion for each gap. |
se_dismiss_playbook_suggestion | Write | — | Dismiss a playbook suggestion. |
se_generate_battlecard | Write | — | Generate (or regenerate) a battlecard for one competitor from won-deal evidence and competitive signal. |
se_score_rfp | Write | — | Run the SE-7 scoring pass over an RFP: strategic weight, prospect signal, composite score, risk band, and objection category per… |
se_suggest_rfp_answer | Write | — | Run the Wave AX evidence-vault autofill against one RFP. |
Sales management
Manager-level pipeline and team tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
sales_manager_coaching_feed | Read | — | Coaching opportunity feed + per-rep skill scorecards for the manager's direct reports. |
sales_manager_gap_analysis | Read | — | Return the gap-to-plan and the smallest set of pipeline-classified deals (ranked by AI commit-confidence × value) that would… |
sales_manager_today_glance | Read | — | Compose the manager's morning glance: per-rep coverage + open value + at-risk + a stage-stuck coaching feed + forecast totals. |
sales_manager_oneonone_prep | Write | — | Generate (or return cached) AI-assisted 1:1 prep for one of the manager's direct reports, keyed by ISO-week. |
Support & cases
Triage, route, and work support cases.
| Tool | Access | Scope | What it does |
|---|---|---|---|
get_support_dashboard | Read | — | S-6: the team-wide support analytics payload — ticket volume (today/week/window + daily series), avg first-response and… |
list_agent_metrics | Read | — | S-6: per-agent support performance over a trailing window — cases handled/resolved, avg first-response minutes, avg resolution… |
list_at_risk_tickets | Read | — | S-2: open tickets ranked by rolling customer sentiment (EMA over customer messages, -1..+1), bucketed at_risk / recovering /… |
list_queues | Read | — | The tenant's queues (shared lead/support pools) with member counts — the routing-rule targets. |
list_sla_at_risk | Read | — | S-3: open tickets with a running SLA clock, tightest deadline first. |
list_sla_policies | Read | — | S-3: the tenant's SLA policy per priority tier (P1–P4 → urgent/high/normal/low). |
support_queue_today | Read | — | Return the agent's ranked support queue for today: urgent / high-tier / SLA-burning / negative-sentiment cases at the top. |
support_similar_cases | Read | — | Search past resolved cases that look like the open one (lexical similarity over subject + description). |
support_suggest_reply | Read | — | Compose three reply drafts for an open case (empathy / fact / confirmation). |
unified_inbox_search | Read | — | Search support cases across every channel (email / chat / Slack / WhatsApp / SMS / voice) by free text over the subject,… |
classify_ticket | Write | — | Classify a case with the tenant's BYOK LLM — urgency (P1–P4), category, customer sentiment, and language — then apply the verdict… |
configure_escalation_rules | Write | — | S-2: manage the tenant's sentiment-escalation rules. |
configure_sla_policy | Write | — | S-3: set the tenant's SLA policy for one priority tier (P1–P4). |
merge_tickets | Write | — | Fold a secondary case into a primary one — the cross-channel merge that unifies a single customer's threads (e.g. |
route_ticket | Write | — | Re-run only the routing step for a case using its stored triage verdict (category / urgency / sentiment) against the tenant's… |
send_ticket_reply | Write | — | Post an agent reply to a case. |
support_promote_to_kb | Write | — | Compose a KB-article body from a resolved case (symptom + resolution + category). |
Vertical solutions
Industry vertical tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_verticals | Read | — | Return the catalogue of pre-built vertical onboarding templates (FinServ, Healthcare, Real Estate, Manufacturing, Professional… |
vertical_status | Read | — | Return the tenant's installed verticals plus the full catalogue (for picking what's next). |
apply_vertical_template | Write | — | Install the chosen vertical template into the current tenant: creates the pipeline, suggests integrations, seeds compliance… |
Voice agents
Voice-agent configuration and runs.
| Tool | Access | Scope | What it does |
|---|---|---|---|
list_voice_agents | Read | — | List the tenant's configured AI voice agents (receptionist / qualifier / cold_caller) with role, provider, status, budget and… |
configure_voice_agent | Write | — | Create a new AI voice agent (draft) or update an existing one by agent_public_id. |
fire_voice_agent_call | Write | — | Place a net-$0 SIMULATED test call against a voice agent (by agent_public_id) and return the transcript, outcome, sentiment and… |
Voice campaigns
Outbound voice campaign tools.
| Tool | Access | Scope | What it does |
|---|---|---|---|
create_call_campaign | Write | — | Create an outbound call campaign: an ordered sequence of steps (dial | voicemail | sms | wait) with per-step retry/backoff, a… |
Voicemail
Voicemail operations.
| Tool | Access | Scope | What it does |
|---|---|---|---|
get_voicemail_transcript | Read | read:activities | Fetch one voicemail's full transcript plus its reply drafts and matched contact. |
list_voicemails | Read | read:activities | List the tenant's inbound voicemails (newest first): caller number, matched contact, duration, processing status, transcript… |
draft_voicemail_reply | Write | write:activities | (Re)draft the three AI replies for a voicemail — an empathetic email, a factual email, and a call-back SMS — using the tenant's… |