The customer conversation happens in your inbox, on your calendar, on the call, and in the deck.

Actionary reads those places directly. Seven adapters ship: Microsoft 365, Microsoft PowerPoint, Google Workspace, Google Slides, Slack, SEC EDGAR, and Companies House. Every touch becomes a durable row in the substrate — an interaction with a transcript, a signal with a summary, a deck the agent can draft, a public-company profile the agent can enrich against.

The connector layer is the seam. It is a typed catalogue in the database.

A typed catalogue

Three tables carry every connector on the platform.

  • app_connector_providers — the platform’s list of available adapters. Each one is a single row.
  • tenant_app_connectors — the per-tenant install. A tenant admin clicks Connect once on /profile/connections; a row lands here.
  • app_connector_oauth_tokens — the per-user OAuth tokens, encrypted at rest with a subsystem key derived from the platform master key.

Four auth shapes cover every adapter shipped and every adapter that ever ships: platform-managed OAuth, dynamic client registration, static OAuth clients, and static tokens. Public data sources like SEC EDGAR carry no auth at all. The provider row declares its shape; the dispatcher reads it. Adding the eighth or twentieth adapter changes zero routing code.

Every adapter returns the same {tool, is_error, content} envelope and raises ConnectorError, so the registry (connectors.py) treats them uniformly. The seven-adapter surface is a code property.

Seven adapters, shipped

Microsoft 365 — mail and calendar through Graph

Read the signed-in user’s recent Outlook messages and upcoming calendar events. Send mail from their own mailbox — the From header carries the operator’s own address. Platform-managed OAuth, per-user token. Tools: list_messages, get_message, list_calendar_events. Outbound send_mail for workflow drafts.

Microsoft PowerPoint — decks in OneDrive

List the user’s PowerPoint files, read metadata, create a blank .pptx ready to author in PowerPoint Online, and mint short-lived download URLs. Platform-managed OAuth on Graph. Tools: powerpoint_list_my_presentations, powerpoint_get_metadata, powerpoint_create_blank, powerpoint_download_url.

Google Workspace — Gmail and Calendar

Read the signed-in user’s recent Gmail messages and upcoming primary-calendar events. Platform-managed OAuth, per-user token. Tools: list_messages, get_message, list_calendar_events.

Google Slides — decks in Drive

Create a new Slides deck, append heading-and-body or image slides, summarize an existing deck, and list the user’s own presentations. Platform-managed OAuth on Google. Tools: slides_create_presentation, slides_add_text_slide, slides_add_image_slide, slides_get_presentation, slides_list_my_presentations.

Slack — channels, messages, and members

List channels the user can see, search messages, look up members, and post as the authorized user. Platform-managed OAuth via bot token. Tools: slack_list_channels, slack_search_messages, slack_post_message, slack_get_user.

SEC EDGAR — US public filings

Look up US public companies by name or ticker, list recent 10-K / 10-Q filings, and fetch parsed XBRL facts (revenue, net income, EPS, cash). No auth — public data, polite User-Agent header. Tools: sec_find_company, sec_list_filings, sec_company_facts. The agent enriches Account records against real filings.

Companies House — UK company register

Search UK companies by name or number, pull the registered profile, list directors and persons of significant control, and read the statutory filing history. Static API key, tenant-supplied. Tools: ch_find_company, ch_company_profile, ch_officers, ch_filing_history.

Adjacent connectors, same shape

Each of the seven lives at services/core_api/application/<vendor>_client.py, registers with the platform through connectors.register(...), and is eagerly imported by connectors._bootstrap(). Adding an eighth is one file, one row, and zero changes to workflows, the agent tool surface, or the signals pipeline.

The workflow engine’s action picker hydrates from the registry catalogue endpoint, so new adapter actions light up in the designer on backend deploy alone. No SPA release ceremony. No hardcoded action lists. The catalogue is data.

Email and meetings become signals

Once the provider is connected, the pipeline runs.

The inbox-signals reference template ships as a working workflow at db/migrations/postgres/198_inbox_signals_workflow_template.sql. It runs every 15 minutes. external_mcp.tool_call pulls unread Outlook or Gmail. agent.run_step classifies each message into structured JSON — decision, risk, commitment, intent, change — and lands the output as a signals row for human triage.

Every classifier output goes through the Signals inbox: Dismiss, Accept, or Create as. The agent proposes; the human confirms; the substrate lands durably. Silent writes never happen.

The same pattern runs for meetings. The in-browser Meeting Recorder captures the call, submits the audio, Whisper transcribes it, the agent summarises it into a TL;DR + Decisions / Action items / Discussion notes block, and the platform writes one interactions row. The audio is transient by default — deleted the moment the transcript lands — with per-tenant retention modes for coaching, dispute evidence, or legal hold. The transcript is the permanent record.

HMAC-signed outbound, PKCE inbound

The connector layer is a two-way street. Traffic flowing out and traffic flowing in both meet the same enterprise bar.

Outbound webhooks carry an HMAC-SHA256 signature in the X-Actionary-Signature header on every delivery. Every retry re-signs; every failure lands in a dead-letter ledger the operator sees at /platform/workflow-dead-letters. A receiver that respects the signature converges to one delivery regardless of how many times the network hiccups.

Vanity domains — the portal.acme.com a tenant points at their public portal — verify through a DNS-TXT ownership challenge before the platform trusts the CNAME. No manual approval, no ticket queue.

Outbound OAuth to every provider carries PKCE on the flow. The tokens that come back are pinned to the specific tenant and stored encrypted at rest via the integration-tokens HKDF-derived key. One platform master key, one HKDF label, one distinct subsystem key — the same substrate cryptography pattern every other subsystem uses.

Tokens never leave in the clear

The per-user OAuth tokens landing in app_connector_oauth_tokens are BYTEA-encrypted at rest. The key derives from PLATFORM_MASTER_KEY through HKDF-SHA256 with the integration-tokens label — a distinct 32-byte key, deterministic across environments that share the master, rotated in one ceremony via POST /api/v1/platform/operations/consolidate-encryption-keys.

The token never touches a log line. Fingerprints (last-4) only. The row-permission contract applies to the tokens the same way it applies to every other row — a caller sees only the tokens they hold, and only within their own tenant.

Automatic materialisation — email in, record out

Once the connector is installed and the workflow is scheduled, the round-trip runs on its own.

Every 15 minutes: unread mail pulled through Graph or Google. The classifier turns each message into a structured signal with a headline, a summary, a signal kind, and a suggested payload. Signals feed drops onto /signals. The operator clicks Accept; the record materialises — task, contact, deal, interaction, activity — in the substrate, with the signal card and the created row linked in the same transaction.

Meetings arrive by a different door. The recorder submits; the interaction row lands; the agent-readable transcript indexes into content_asset_chunks for retrieval. Ask the agent what did Acme commit to on the discovery call? and it retrieves against the chunks with a real time offset — at 08:42 in acme-discovery.wav — under the same row-level visibility gate every other surface uses.

The takeaway

Connectors are the layer where the work you already do becomes the substrate the platform reasons over. Seven adapters ship today: mail and calendar on both Microsoft and Google, decks on both PowerPoint and Slides, chat on Slack, and public-company data through SEC EDGAR and Companies House. Every one returns the same envelope, wears the same HMAC-signed outbound and PKCE inbound, encrypts its tokens through the same HKDF-derived subsystem key. Adding an eighth is one file, one row, zero changes to anything else. The workflows fan out. The signals triage. The agent acts. You keep working where you already work.