Back to Directory Slack Call Summary - Claude icon

Slack Call Summary - Claude

When Tuple Capture completes, headlessly runs Claude Code to summarize the triggering recording, write a title and summary back onto the call, and DM the summary to Slack.


Headlessly runs Claude Code when Tuple Capture completes: it summarizes the triggering recording, writes a title and summary back onto the call (Tuple's Call History), and DMs the summary to Slack.

Unlike the interactive call-summary-claude trigger, this one runs entirely in the background — no terminal window, no UI. You see nothing except a Slack DM arriving a few minutes after your call ends, and the summary showing up on the call.

It's a one-shot over the finished call — no tuple connect, nothing live to follow. Claude uses the triggering call and recording IDs, reads that recording's stored transcript with the tuple CLI, and does the work.

Prerequisites

  • macOS
  • Claude Code installed so claude works in a new terminal
  • The tuple CLI on your interactive shell PATH (with capture support)
    • Install it from the Tuple app: its Capture settings have an Install button that links tuple onto your PATH.
  • A Slack MCP server or connector available to Claude Code. The claude.ai Slack connector works out of the box — verify with claude mcp list (you should see claude.ai Slack: Connected); connect it from claude.ai → Settings → Connectors, or run /mcp inside Claude Code. Any other Slack MCP works too, as long as its tools are allowed in your Claude Code permission settings (or you add its mcp__<server> rule to the allowlist in call-capture-complete).
  • Tuple Capture enabled for the call

Installation

Drop this directory into your Tuple triggers folder:

~/.tuple/triggers/slack-call-summary-claude/

The trigger fires when call Capture completes.

Configuration

By default the summary is sent as a DM to yourself (the authenticated Slack user). To send to a different person or channel, edit the SLACK_RECIPIENT= line near the top of call-capture-complete:

SLACK_RECIPIENT="${SLACK_RECIPIENT:-#my-channel}"     # a channel
SLACK_RECIPIENT="${SLACK_RECIPIENT:-@jack}"           # another user by handle
SLACK_RECIPIENT="${SLACK_RECIPIENT:-Jack Hannah}"     # another user by display name

Leave it empty (the default) to DM yourself. The environment variable form also works, but Tuple launches triggers outside your shell, so an export in your shell rc won't reach it — use launchctl setenv SLACK_RECIPIENT "#my-channel" if you prefer the environment route.

How it works

call-capture-complete supplies the call and recording IDs through environment variables, not positional arguments. This trigger:

  1. Writes slack-call-summary-claude-prompt.md into a working directory (${TMPDIR:-/tmp}/tuple-slack-call-summary-claude/<timestamp>-<pid>), including the configured recipient and all instructions.
  2. Headlessly launches a login zsh (nohup zsh -lic, so claude and tuple resolve from your normal PATH — no terminal window) that runs claude -p in that directory with the prompt on stdin and a scoped tool allowlist: Read, Bash, Write(slack-call-summary-claude-failed.md), and mcp__claude_ai_Slack. In -p print mode any tool outside the allowlist is auto-denied — Bash lets Claude run the tuple CLI, and the Slack tool lets it send the message; nothing else.
  3. Claude uses the trigger's call and recording IDs, reads transcript and event records with tuple capture show --recording "$TUPLE_TRIGGER_RECORDING_ID" --exclude content --format json, writes the title and summary with tuple call edit, and sends the Slack message.

Troubleshooting

  • Trigger not firing: Check /tmp/tuple-trigger-debug.log — the banner call-capture-complete fired (slack-call-summary-claude) appears each time the trigger runs.
  • No Slack DM and no error: Check slack-call-summary-claude.log in the working directory (printed at launch) for the Claude run output.
  • Slack delivery failed: Look for slack-call-summary-claude-failed.md in the working directory — it contains the composed message and the error.
  • claude not found / tuple not found: Make sure both are on your login-shell PATH (test with zsh -lic 'which claude tuple').
  • Slack connector not available: Run claude mcp list and confirm claude.ai Slack: Connected.

Dry run

To test the trigger without launching Claude, set SLACK_CALL_SUMMARY_CLAUDE_DRY_RUN=1. The trigger generates the prompt file and exits — nothing is sent to Slack. (Output goes to /tmp/tuple-trigger-debug.log.)