Hessan Haiderzada
06/14/2026, 2:36 PMlist email/call activity, list meetings), the Inbox API (list inbox threads, list messages in an inbox thread, categories, meeting-intent), get activities for a contact, contact update with `meetingStatus`/`callStatus`/`isOptedOut`, full Tasks CRUD, and Webhooks (subscriptions + event catalog + delivery logs). The gaps below are therefore mostly expose / stabilise / scale, not "build from scratch."
1. The #1 blocker: surface v3 in the MCP connector
Our agent talks to Reply only through the Reply MCP connector, not raw REST (the agent cannot make arbitrary authenticated HTTP calls). Today the connector exposes ~15 tools — essentially sequences, basic stats, mark_contacts_as_replied, add_contact_to_sequence, and connect_* helpers. None of the rich v3 surface above is reachable.
Ask: Expose the following v3 endpoints as MCP tools (read + write):
• Inbox: list/filter inbox threads, list messages in an inbox thread, thread categories, toggle meeting-intent.
• Reports: get email/call reporting overview, list email activity, list call activity, list meetings.
• Contacts: get/search contacts, get activities for a contact, update a contact (incl. meetingStatus, callStatus, isOptedOut).
• Webhooks: create/list/update subscriptions.
Without this, every read still requires manual copy-paste (today we paste reply text and screenshot the stats dashboard by hand).
2. De-Beta: a stable, versioned contract
Every endpoint we need is flagged "Beta — behavior, parameters and response shapes may change without notice." A production back-office for 100 clients cannot build on that.
Ask: Promote the Reports, Inbox, Contacts, Tasks and Webhooks endpoints to GA with a stable, versioned schema and a published deprecation policy.
3. Reads — the report inputs
3a. Inbound reply content + normalised category (biggest manual step today)
list messages in an inbox thread should return, per message: full body text, subject, sender, direction, timestamp, the canonical contact id + email, and the sequence/client. Add: a normalised reply-category / intent field per thread (e.g. interested, not_interested, out_of_office, referral/redirect, wrong_contact, meeting_request, opt_out) so we don't re-derive it. Make threads filterable by sequence/client, date range, and "unprocessed since X."
3b. Stats as data (so we stop screenshotting the dashboard)
get email reporting overview should return the full funnel as numbers — Total/Contacted, Delivered, Open, Reply, Interested, Meetings booked, Opt-outs, Bounce, Not reached — PLUS the per-sequence breakdown and a daily/weekly time series, all filterable by sequence group / client and date range. Today we paste a screenshot of this exact view; structured data lets us render it ourselves.
3c. Call activity with normalised dispositions
list call activity should return per call: contact id+email, datetime, normalised disposition (connected, no_answer, voicemail, wrong_number, not_interested, callback_requested, meeting_booked, opt_out), free-text note, attempt number, agent. Today these come from external Ringover/Excel exports; if calls flow through Reply, this endpoint removes that dependency. (Disposition normalisation matters — our manual data has 6+ spellings of "wrong number"/"not reached.")
3d. Meetings with full lifecycle
list meetings should include: contact, company, datetime, status lifecycle (booked → held → no_show → rescheduled → cancelled), attendees, sequence/client, source. Our "Meeting Tracker" is cumulative and needs the lifecycle, not a boolean.
3e. Unified "what changed since" feed (the dedup engine)
The single hardest part of weekly reporting is dedup — not re-reporting a prospect already covered, especially in re-engagement campaigns that re-hit prior contacts. Ask: a per-client/sequence activity stream filterable by date range that unifies replies, calls, meetings, opt-outs, and status changes, each stamped with a timestamp and the canonical contact id. ("Give me everything new for Client X between A and B.") This single capability eliminates ~90% of our manual dedup work.
4. Writes — status back to Reply
• Bulk + by-email status setters. Today update a contact is single-contact, by numeric id. We identify contacts by email and act in batches. Provide bulk setters that take a list of ids or emails (mirroring `mark_contacts_as_replied`'s prospectIds[]) for meetingStatus, callStatus, isOptedOut.
• Richer meetingStatus. Currently binary (none / meetingBooked). Extend to the lifecycle in 3d (held, no_show, rescheduled, cancelled) so the write-back matches the Meeting Tracker.
5. Scale & multi-tenancy (100 clients)
• First-class "client / workspace" grouping. Today we infer a client by sequence-name prefix (e.g. Atlas_MW_*, S4U_*). At 100 clients this is brittle. Provide a native client/workspace (or tag/folder) entity that groups sequences + contacts + inbox + stats + calls, and make every reporting endpoint filterable by it.
• List all clients/workspaces + per-client scoping in one call.
• Multi-tenant auth. One managed credential that can act across all client workspaces (or clean centralised per-client key management) — not 100 separate keys pasted around.
• Pagination, bulk, and rate limits sized for a nightly/weekly run across 100 clients (cursor pagination is there; confirm bulk read endpoints and rate-limit headroom for full-portfolio sweeps).
6. Reliability & identity
• Webhook coverage + reliability. Confirm the event catalog covers: reply received (with category), opt-out, meeting booked/updated, call logged (with disposition), bounce, and contact status change — with full payloads, delivery logs, and retry. Webhooks + the §3e activity feed are the real-time backbone of an autonomous loop.
• Canonical contact id everywhere. Surface the same stable contact id (and email) on every inbox message, call, meeting, and activity, so dedup is keyed on id — never on name spelling (we routinely hit "Müller" vs "Mueller", "Höschele" vs "Hoeschele").
Definition of done — the autonomous loop we want to run
For each client, on a schedule, with no human in the loop:
1. Pull the period's new activity (replies + calls + meetings + opt-outs) via the §3e feed/webhooks, scoped to that client.
2. Read reply bodies + categories, call dispositions, and meeting lifecycle (§3a/3c/3d).
3. Dedup against what was already reported, keyed on canonical contact id (§3e/§6).
4. Pull funnel + per-sequence stats as data (§3b) and render the visual.
5. Build the client report.
6. Write back statuses in bulk — meeting booked/held, opt-outs, replied (§4).
7. Human reviews the finished reports and the flagged judgment calls.
Everything above already half-exists in v3. Exposing it in the MCP connector, stabilising it out of Beta, adding a client/workspace dimension, and normalising the reply/call/meeting fields would let us run the whole thing autonomously.Tania
06/15/2026, 8:07 AM