Skip to content

perf(server): stop shipping full MCP tool results in thread payloads - #5482

Merged
t3dotgg merged 2 commits into
mainfrom
fix/mcp-tool-call-slimming
Aug 6, 2026
Merged

perf(server): stop shipping full MCP tool results in thread payloads#5482
t3dotgg merged 2 commits into
mainfrom
fix/mcp-tool-call-slimming

Conversation

@t3dotgg

@t3dotgg t3dotgg commented Aug 6, 2026

Copy link
Copy Markdown
Member

MCP tool calls were exempt from activity payload slimming: projectActivityPayload early-returns on itemType === "mcp_tool_call", so the full tool result rides along in every snapshot and live event. On MCP-heavy threads this dominates the wire — one imported thread ships 3.2 MB gzipped, with two-thirds of its post-slimming bytes being unslimmed MCP payloads (worst single call: a GitHub fetch_pr result at 1 MB).

The exemption existed because both clients render payload.data.item in the expanded work-log row. The fix keeps exactly the fields that row renders (tool, server, status, arguments, appContext, error, durationMs, plus toolName/input for the Claude-adapter shape) and summarizes the result to one 84-char line, same as regular tool output. Full payloads stay in SQLite, so an on-demand detail endpoint can be added later without data loss.

Measured against a real db seeded with six representative threads (2,991 MCP activities): 12.2 MB of MCP payload JSON drops to 546 KB (95.6% reduction). Both provider payload shapes (Codex data.item, Claude/OpenCode data.result) verified against real rows.

Note: this trades away in-app access to full historical MCP results (they were previously visible in the expanded row). Per the pagination investigation, that's an accepted temporary loss; the data remains in persistence.


Change made by Claude Fable 5 via Claude Code.


Note

Medium Risk
Changes the shape and fidelity of MCP activity data on thread snapshots and live events (lossy summaries), but scope is limited to projection with strong test coverage and no persistence changes.

Overview
MCP tool calls are no longer exempt from activity payload slimming in projectActivityPayload. Instead of passing mcp_tool_call through unchanged, the server now runs projectMcpToolCallData, which keeps only fields the expanded work-log row uses (tool, server, status, arguments, appContext, error, durationMs, plus Claude-style toolName/input) and replaces full tool results with a one-line summary via the same summarizeToolTextOutput helper used for other tools.

Codex-shaped payloads (data.item.result) and Claude/OpenCode-shaped payloads (data.result blocks) are both handled; internal metadata like _meta and large structuredContent are dropped. Changed file paths can still be collected into a files array. Full MCP results remain in persistence—only snapshot/live thread transports shrink.

Tests now assert large MCP fixtures compress dramatically and that web/mobile derived views stay aligned except for the intentional loss of full historical MCP result text in the expanded row.

Reviewed by Cursor Bugbot for commit 22f7a58. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Stop shipping full MCP tool results in thread payloads

  • Adds projectMcpToolCallData in ActivityPayloadProjection.ts to slim MCP tool-call payloads: only whitelisted fields (tool, server, arguments, etc.) are kept, and result content is replaced with a short text summary.
  • Handles both Codex-shaped (item array) and Claude-shaped (toolName/input/result) MCP data formats.
  • Changed files detected in results are surfaced as a files array on the slimmed payload.
  • Behavioral Change: activities with itemType === "mcp_tool_call" previously passed through unchanged; they now return a slimmed data object, which reduces payload size significantly (tests assert < 500 bytes).

Macroscope summarized 22f7a58.

mcp_tool_call activities bypassed payload slimming entirely, so full tool
results (up to 1 MB per call) shipped in every snapshot and live event.
Keep the fields the expanded-row UI renders and summarize the result like
regular tool output: 12.2 MB -> 546 KB across the seeded real-data db.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0a82014e-4d90-403b-9e56-c837c023198f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 6, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 95ab949. Configure here.

Comment thread apps/server/src/orchestration/ActivityPayloadProjection.ts
The integration test asserted MCP payloads pass through verbatim; it now
asserts the slimmed shape and that the expanded row's rendered fields
survive on both clients.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@macroscopeapp

macroscopeapp Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 22f7a58

Performance optimization extending existing payload slimming to MCP tool calls. The change keeps UI-rendered fields while summarizing bulky result content, with full payloads preserved in persistence. Well-tested and self-contained.

You can customize Macroscope's approvability policy. Learn more.

@t3dotgg
t3dotgg merged commit 3da315e into main Aug 6, 2026
17 checks passed
@t3dotgg
t3dotgg deleted the fix/mcp-tool-call-slimming branch August 6, 2026 09:34
omegent-app Bot added a commit to patroza/t3code that referenced this pull request Aug 6, 2026
Merges upstream directly rather than rebuilding the provenance stack and
importing a tree delta. upstream/main is append-only, so a merge is sound, and
because the previous sync recorded upstream ancestry the merge base is
a2ca89a -- this replays three commits, not the whole divergence:

  a483337 fix: respect time format for sidebar snooze (pingdotgg#4438)
  1ffba70 fix(web): closed plan sidebar stays closed when returning (pingdotgg#5484)
  3da315e perf(server): stop shipping full MCP tool results (pingdotgg#5482)

Two resolutions.

SidebarV2.tsx conflicted three ways. The import block is a union: the fork needs
EnvironmentId, upstream adds TimestampFormat. The other two are useCallback
dependency arrays where upstream adds updateThreadMetadata and timestampFormat;
both identifiers exist in the merged file, so omitting them would leave the
callbacks capturing stale values.

BoardView.tsx did not conflict and still broke. pingdotgg#4438 added a timestampFormat
parameter to resolveSnoozePresets and snoozeWakeDescription and updated its own
call sites, but the board is fork code, so its two calls kept the old arity.
Caught by typecheck, not by git. BoardView already imported useClientSettings,
so the fix is the same one-line hook SidebarV2 uses.

Verified: full recursive typecheck clean; apps/web 2087 tests pass. Two failures
predate this merge and reproduce on fork/dev unmerged -- a Codex structured
output test, and runtimeAbi.test.ts failing to transform a vendored .wasm asset.

Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 6, 2026
## What's Changed
* perf(server): stop shipping full MCP tool results in thread payloads by @t3dotgg in pingdotgg/t3code#5482
* fix(web): closed plan sidebar stays closed when returning to a thread by @t3dotgg in pingdotgg/t3code#5484
* fix: respect time format for sidebar snooze by @huxcrux in pingdotgg/t3code#4438


**Full Changelog**: pingdotgg/t3code@v0.0.32-nightly.20260806.1012...v0.0.32-nightly.20260806.1014

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.32-nightly.20260806.1014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant