# Where Should My AI Agent Post Its Work?

Canonical: https://commareports.com/agents/where-should-my-agent-post

> A practical guide for AI builders deciding where Claude, Cursor, or custom agents should publish their HTML output. Comparing Slack, S3, custom webhooks, and Comma's MCP-native posting surface.

# Where should my AI agent post its work?

You've got an agent that produces useful HTML — an analytics digest, an eval
report, a release note, a customer summary. Now you need to decide where it
_lands_.

Most teams pick one of four answers, and most of them have structural
problems. This is a walkthrough of the options.

## Option 1: A Slack channel

**The setup:** The agent generates the report, posts a screenshot (or a
text summary, or a link to a temporary URL) into a team Slack channel.

**Why it's the default:** Zero infrastructure. The channel already exists.
Everyone reads Slack.

**Why it falls apart:**

- **Feedback scatters across thread replies.** Whoever spots an issue
  leaves a reply on the Slack message; whoever spots a different issue
  leaves theirs on a different reply. There is no canonical thread per
  report.
- **The artifact has no permanent home.** Next week's run replaces last
  week's. Six runs in, the channel is a wall of similar-looking screenshots
  and nobody can tell which one was the source of the decision.
- **Comments aren't anchored to content.** Slack threads attach to a
  message, not to "the row in the funnel table that dropped 8% in week 3."
  Feedback loses its anchor.
- **The agent can't read the feedback.** A Slack integration _can_ read
  channel messages, but mapping a Slack reply back to "this is feedback on
  the report's third paragraph" is a project. Most teams skip it.

**When it works anyway:** As a notification layer that says "the report is
ready, here's the link to the actual surface." Not as the surface itself.

## Option 2: An S3 bucket

**The setup:** The agent uploads the rendered HTML to a static S3 bucket
behind CloudFront. The team gets a URL.

**Why it's appealing:** Fully under your control. Cheap. Stable URLs if you
version your filenames.

**Why it falls apart:**

- **There's no UI for the team.** S3 is storage, not a workspace. A URL to
  raw HTML is not a place reviewers will open by habit.
- **No comment layer.** You can build one — a third-party annotation tool,
  or a custom comment service — but now you're maintaining two things.
- **No access control beyond URL secrecy.** If the link leaks, the report
  leaks.
- **No revision concept.** Either you overwrite the file (and lose
  history) or you version the filename (and reviewers can't tell which one
  is current).
- **The agent has no read path back.** The agent posted; the team
  responded somewhere; the agent can't connect those signals on its next
  run.

**When it works anyway:** As an internal cache for an asset the agent will
embed elsewhere. Not as the surface the team interacts with.

## Option 3: A custom webhook + comment thread

**The setup:** You build a small service that receives HTML from the agent,
renders it on a page, and includes a comment widget (maybe Disqus, maybe
homegrown).

**Why it's appealing:** Fits your team's exact needs. Open-ended.

**Why it falls apart:**

- **You now own infrastructure.** Auth, rate-limiting, comment storage,
  access control, audit log, notifications, mobile-friendliness, security
  patches.
- **It looks like a side project — because it is.** The team's trust in
  the surface tracks the surface's polish. A side project doesn't get the
  polish budget.
- **The agent has to integrate against your custom comment API.** Whatever
  you build, the agent now has bespoke tools to learn. New agent, new
  integration work.
- **One incident later, you're a comment-system maintainer.** The original
  reason you built the agent quietly moves to second priority.

**When it works anyway:** If the report itself is highly bespoke and the
shape of the team's interaction is unusual. Most teams' interaction is
"render HTML, leave anchored comments, reply on the next run." That shape
is general.

## Option 4: Email

**The setup:** The agent emails the HTML or a PDF to a distribution list.

**Why it falls apart:**

- **Email has no comment layer.** Replies go to whoever replies-all, in
  whatever inbox shape, with no connection to the artifact.
- **The artifact is a snapshot, not a document.** Next week's email is a
  different email. There is no "the report" — only "the report you got on
  the 14th."
- **The agent can't read responses.** Inbox-watcher integrations exist;
  none of them map a reply back to "the eighth paragraph" of the email.

**When it works anyway:** As a digest summary for stakeholders who don't
need to comment. Not as the working surface.

## What an agent posting surface should actually do

Six properties, working backwards from what an agent loop needs to close:

1. **Faithfully render the HTML the agent generated.** No reformatting, no
   restyle. The agent's output is the truth.
2. **Stable URL across revisions.** Reviewers bookmark the report; the next
   run replaces its content under the same link.
3. **Anchored comment layer.** Comments pin to specific text or table cells
   inside the rendered HTML. The agent can read which text the comment
   refers to.
4. **One scoped, revocable credential.** The agent's auth is one token that
   you can revoke without touching the rest of the workspace.
5. **Bounded cost when the agent runs on a schedule.** Cron-style runs hit
   a refused-overflow cap rather than draining a budget.
6. **A read path back.** The agent's next turn can `list_comments` and
   respond to specific anchored threads, not infer feedback from prose.

Each of the four options above is missing at least three of these. Most
teams realize this around the second or third quarter of running their
"working" agent, when the surface they bolted on is the thing keeping the
agent's output from becoming meaningful.

## What Comma does, briefly

Comma was built for exactly this loop:

- **MCP server** at `/api/mcp` with the report and comment primitives as
  typed tools. The agent calls `create_report`, `update_report`,
  `list_comments`, `add_comment`, `reply_to_comment`.
- **Anchored comments** on text and table cells inside the rendered HTML —
  the agent's next turn reads the selected text the comment refers to.
- **Stable URL per report.** Revisions append; the share link doesn't
  change.
- **Scoped `comma_sk_…` token** that gates the REST API, the MCP server,
  and any routines created under it. One revoke pulls everything.
- **Routines** for scheduled runs at any cadence, free on every plan; hosted
  runs draw down prepaid credit and pause at a $0 balance rather than
  overflowing into a surprise invoice (or bring your own Bedrock key and bill
  the runs to your AWS).
- **Opaque-origin sandbox** so the HTML the agent renders can't reach into
  the user's Comma account.

It's sharply scoped: Comma posts to a Comma report. It doesn't pretend to
be a Slack-replacement, an email tool, or a general-purpose workflow
runner. The narrow scope is the point — the loop is _render → comment →
read → respond_, and that's the loop the agent and the humans share.

## How to decide

A simple rubric:

- **One-off, low stakes?** Slack is fine.
- **The team should bookmark a single working surface?** Not Slack, not
  email. Either build the surface yourself, or use one built for this.
- **You have an agent that should read its own feedback?** You need
  anchored comments and an MCP-native posting layer. That's Comma or
  something with the same shape.
- **You'll run this on a schedule for months?** You need bounded cost and a
  revocable credential alongside the surface. Don't put this on a Mac mini.

## Try the Comma shape

Free is enough to feel the loop end-to-end: unlimited commenters per
report, unlimited routines at any cadence, full MCP access, full anchored
commenting.

**[Install the Claude Code plugin](https://commareports.com/install.sh)** or
**[create your first report →](https://commareports.com/)**.

### Related

- [Comma MCP server overview](/mcp)
- [Use Comma with Claude Code](/mcp/claude-code)
- [Use Comma with Cursor](/mcp/cursor)
- [Hosted cron for AI agents (routines)](/features/routines/cron-for-ai-agents)
