[BUG] Claude Code Routines (CCR) with MCP connectors blocked by silent permission gate — regression since ~2026-05-20/21

Status Fixed / completed
Reported on v2.1.146
Maintainer reply ✓ Yes — localden
Activity 4 comments · opened May 21, 2026 · closed May 23, 2026
💡 Likely answer: A maintainer (localden, collaborator) responded on this thread — see the highlighted reply below.

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

Since approximately 2026-05-21 (UTC morning), scheduled Claude Code Routines that use MCP connectors
silently fail to do any work.

The trigger fires correctly (last_fired_at updates on schedule), a session opens on claude.ai and is
visible in the Runs history with a "completed" green checkmark, but the routine cannot actually execute
MCP tool calls without a per-call permission prompt — even for MCP servers that are explicitly attached to
the trigger and that the same routine had used unattended for weeks.

Because the session "completes" cleanly (the model gives up and writes a post-mortem), no failure surfaces
in the UI. The only way to detect the broken state is an external watchdog noticing the missing
downstream effect.

What Should Happen?

MCP tools whose servers are explicitly attached to a Routine trigger should execute without per-call
permission prompts when the routine is invoked by its scheduled cron (or POST
/v1/code/triggers/{id}/run
). This was the behavior in place for weeks before 2026-05-20.

If a new permission gate is intentional, it should be:

  • documented in a changelog;
  • exposed via the trigger API (e.g. a permission_mode / bypassPermissions field on session_context);
  • opt-in, not retroactively enforced on existing triggers.

Error Messages/Logs

Excerpt from the transcript of a session triggered manually at ~2026-05-21 10:00 UTC (after attempted
  config workarounds):
  
    Step 1-3: Execute Health Check Queries
    Utilisé supabase-report: execute sql
    I need to execute SQL queries against your Supabase database to complete the pipeline health check.
    These are read-only queries that inspect the health of your signal ingestion pipeline,
    agent sessions, and system invariants.
    Shall I proceed with executing these queries to complete the health check routine?
    
  The model is interrupting itself mid-routine to ask the user for approval — inside a scheduled job that
  runs while no human is at the keyboard.
  
  `RemoteTrigger get` shows no field that disables this prompt. `permitted_tools` on `mcp_connections`
  exists but does not pre-approve tool calls (see Steps to Reproduce).

Steps to Reproduce

  1. Create a Routine with at least one MCP connector attached (e.g. a Supabase MCP) and a scheduled

trigger.

  1. Make the routine prompt instruct the model to use that MCP, e.g. "Use MCP supabase-report for

execute_sql queries".

  1. Wait for the scheduled run, or call POST /v1/code/triggers/{id}/run.
  2. Observe via the API that last_fired_at updates correctly.
  3. Observe in the claude.ai UI that the session opens and quickly "completes" with a green checkmark.
  4. Observe that no MCP tool calls actually executed — the transcript shows the model asking the user for

approval mid-routine.

Workarounds attempted, all unsuccessful:

  • Setting mcp_connections[].permitted_tools = ["execute_sql"] (bare tool names) → still blocked.
  • Adding mcp__<server>__<tool> entries to job_config.ccr.session_context.allowed_tools (SDK-style

namespaced names) → still blocked.

The exact same routine ran nominally every day for 14 days before 2026-05-20 with zero permitted_tools
and zero MCP entries in allowed_tools. No code or config change on our side between the last successful
run and the first broken run.

Claude Model

Other

Is this a regression?

Yes, this worked in a previous version

Last Working Version

Last successful run: 2026-05-20 06:26:44Z (wrote output to DB at 06:32 UTC). First broken run: 2026-05-21 06:27:29Z (trigger last_fired_at updated, but no session/output produced).

Claude Code Version

2.1.146 (Claude Code)

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

Affected trigger IDs in our account:

  • trig_01AL4PZ6cHqNSDqS2gcTfkAy (pipeline-health-check, cron 27 6 * * *, daily critical sentinel)
  • trig_011Lc7hQKGgrdFviAgoG7ApU (email-harvester, cron 45 6 * * *)

Account UUID: cd2c5c63-fd1a-44e5-bc1e-aec312eb9a11

Manual re-runs via POST /run on 2026-05-21 at 09:25 UTC and 10:00 UTC: same symptom, blocked on MCP
permission prompt after two config workaround attempts (both reverted).

Happy to share full transcripts or trigger configs privately if useful.

View original on GitHub ↗

4 Comments

github-actions[bot] · 3 months ago

Found 3 possible duplicate issues:

  1. https://github.com/anthropics/claude-code/issues/61015
  2. https://github.com/anthropics/claude-code/issues/61027
  3. https://github.com/anthropics/claude-code/issues/61044

This issue will be automatically closed as a duplicate in 3 days.

  • If your issue is a duplicate, please close it and 👍 the existing issue instead
  • To prevent auto-closure, add a comment or 👎 this comment

🤖 Generated with Claude Code

yurukusa · 3 months ago

Concrete repro and clean diagnostic — your "the only way to detect the broken state is an external watchdog noticing the missing downstream effect" line is the exact operator-side defense pattern this class of failure requires, regardless of when (or whether) the runtime regression gets reverted.

A few notes from running adjacent cases:

Structural pattern. This is a clean instance of what @suwayama named recognition-without-arrest in #60226: the system honors the named token at the surface (Routine completes, green checkmark, runs history entry) but the runtime did not execute the intended effect. The defense surface is exactly what you've identified: verify the effect, not the status field.

Operator-side watchdog template (until the regression is reverted or the perm gate is documented):

#!/usr/bin/env bash
# routine-effect-watchdog.sh — alert when a Routine "completes" without producing its expected effect
ROUTINE_ID="<your routine id>"
EXPECTED_EFFECT_CHECK='/path/to/check-downstream-effect.sh'   # exit 0 = effect verified, exit 1 = effect missing
WINDOW_MIN=10                                                  # check within N minutes of last_fired_at

last_fired=$(curl -s -H "Authorization: Bearer $CLAUDE_TOKEN" \
  "https://api.anthropic.com/v1/code/triggers/$ROUTINE_ID" | jq -r '.last_fired_at')
last_run_status=$(curl -s -H "Authorization: Bearer $CLAUDE_TOKEN" \
  "https://api.anthropic.com/v1/code/triggers/$ROUTINE_ID/runs?limit=1" | jq -r '.runs[0].status')

if [ "$last_run_status" = "completed" ]; then
  if ! bash "$EXPECTED_EFFECT_CHECK"; then
    echo "ALERT: Routine $ROUTINE_ID completed (last_fired_at=$last_fired) but downstream effect missing." | mail -s "Routine silent failure" you@example.com
  fi
fi

Run this on a cron 5-10 minutes after each scheduled fire. The check-downstream-effect.sh is the verification primitive that actually binds: e.g., for a Shopify-MCP-using routine, a curl against the Shopify endpoint for the resource the routine was supposed to update, comparing the timestamp against last_fired_at. The point is to reduce trust in any single surface signal (UI status, runs history, exit code) and instead bind to the downstream effect the operator actually cares about.

Cluster context. Your report is one of five v2.1.145–v2.1.146 silent-failure reports filed today across permissions, Routines, and the Chrome bridge. I've organized them as one cluster here: https://gist.github.com/yurukusa/cbcfef810dc865057b8e86294b3a3df7 — three of five are MCP-pipeline related and converge on the same ~2026-05-20 regression window. If you're seeing the regression on a specific MCP server (Shopify, Supermetrics, etc.), adding that detail to the thread helps the cluster narrow.

Disclosure. I maintain cc-safe-setup and a corpus on this failure family. The watchdog template above is reproducible from this comment alone and does not depend on either.

localden collaborator · 3 months ago

Thanks for the report. This was a server-side issue affecting MCP connector calls in scheduled and remote routine sessions. It was resolved on May 21. Please retry your routine. Tracking in #61044.

github-actions[bot] · 1 month ago

This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.