Orra · MCP for Claude Code

An orchestrator for the Claude Code era.

Multi-worktree development is a coordination problem, not a coding problem. Orra composes a briefing the moment you open Claude — and once armed, keeps checking the work in the background while you focus on yours.

— a morning, with Orra —

You open Claude Code. This is what happens.

claude — orra ▸ morning briefing · 2026-04-18 09:14
orra ▸ Morning. Yesterday's first move was: pick back up on JWT refresh.
       Today's situation:
• Due today: AUTH-142  — in_progress, worktree auth-refactor
• Ready to land: billing-fix  — PR approved, mergeable
• Needs attention: onboarding  — waiting on a permission prompt

orra ▸ New since yesterday:
       JIRA-AUTH-198 was assigned to you, due end of day today.
       Reading the ticket... reproducer included, scoped to the auth middleware —
       looks like a bugfix, ~30min if the repro holds.
Want me to spawn a background agent to investigate and report back while you focus on AUTH-142?
  · pull a fresh worktree from main
  · run the reproducer
  · trace the failure
  · post findings to .orra/memory/notes/AUTH-198.md
you ▸ yes, spawn it. focus is JWT, ship by 4pm.
orra ▸ Spawned agent_3xj, running detached.
       Arming the heartbeat: /loop 5m heartbeat tick
       I'll surface its findings — and any other state changes — every 5 min.
       For now: aligning all suggestions to your 4pm JWT ship.
       Ready when you are.
The problem

“Five worktrees, three blocked agents, two stale rebases, a Jira ticket I just got assigned, and a PR waiting on a review I forgot about. The coding part isn’t the bottleneck anymore.”

— anyone running more than one Claude Code session at a time

What Orra does

Three things, all in service of focus.

Awareness

Scans every worktree, ticket, and agent in one pass. Classifies status, surfaces what's due, and pre-computes summaries — so the briefing is composed before you finish typing.

Learning

A markdown memory layer. Daily notes, commitments, per-worktree context — all persisted across sessions, all grep-friendly. Yesterday's first move shows up in today's briefing.

Side tasks

Spawn detached claude --print agents for routine work — bug investigations, rebases, lint fixes. They run in the background; Orra surfaces their state on the next scan.

Self-pacing

Arm the heartbeat. Orra checks itself.

Orra isn't a daemon — it lives inside your Claude Code session. But arm the heartbeat with one line, and every directive starts firing on its own declared cadence: every 5 min, every 30 min, on session start. While you focus on one thing, Orra's checking the others.

$/loop 5m heartbeat tick
— that's it. Stop with stop heartbeat. Each directive owns its own cadence; /loop is just the engine.
heartbeat · armed at 09:14
09:14 morning-briefing— delivered (on session start)
11:23 pr-shepherd— billing-fix CI passed, mergeable
13:47 monitor-agents— agent_3xj wrote findings note
14:00 stale-cleanup— flagged 2 worktrees idle 3+ days
15:32 linear-deadline-tracker— AUTH-142, 1h to ship
15:35 auto-remediator— rebasing 2 stale branches now...

A heartbeat, not a daemon.

Most MCP tools are reactive — you ask, they answer. Orra inverts that within your session. Each directive declares its own cadence, and the heartbeat tick wakes them on schedule. While you're heads-down on one thing, the other things still get checked.

When the heartbeat surfaces something that needs you, it surfaces. When it doesn't, it stays out of your way — and the timeline keeps building so you can read it back later.

How it composes

Connect any MCP. Make it proactive.

A directive is just a markdown file. If you have an MCP installed (Linear, Slack, Sentry, Jira, your own), write a directive that calls its tools — declare the lane and the cadence, drop it in .orra/directives/, and the heartbeat does the rest. No code, no plugin API.

Ten ship in the box

morning-briefing shutdown-ritual memory-recall linear-tasks linear-deadline-tracker pr-shepherd stale-cleanup monitor-agents auto-remediator wait-time-recycler

Or write your own

sentry-on-call slack-mentions-since-9am deploy-window-watcher jira-blocked-tickets datadog-alert-triage notion-meeting-notes pagerduty-handoff

— illustrative examples; you supply the matching MCP.

--- a directive is just markdown with frontmatter ---
---
name: sentry-on-call
cadence: 5m
lane: incident-watch
memory:
  read: [on-call-rotation.md]
  write: [incidents/YYYY-MM-DD.md]
---

### My Lane
On every heartbeat tick, check the Sentry MCP for new high-priority
issues assigned to whoever's on call. Surface anything new, summarize
the stack trace, suggest spawning an investigation agent if it looks
fixable.