claude-code-teams

Claude Code Teams

A template for running persistent Claude Code agents as a team, reachable via the messaging channel of your choice.

Supported channels:

Telegram, iMessage, and Discord ride on first-party Claude Code plugins. Slack is a custom MCP server shipped with this repo. You can run any combination — agents can be on one channel, several, or all of them simultaneously.

Each agent runs in a tmux session with its own identity, memory, docs, and messaging credentials. Agents share MCP servers for things like Gmail, Calendar, Drive, and Slack. Recurring tasks run via OS-level crontab that pokes each agent’s session on a schedule.

Quick Start

cd ~    # or wherever you want to install
curl -fsSL https://cct.vantasoft.com/install.sh | bash
cd claude-code-teams/agents/orchestrator
claude --dangerously-skip-permissions

When Claude launches, say hi — any first message triggers the wizard. The orchestrator will walk you through picking a channel, configuring it, and relaunching itself under tmux with that channel connected.

Prerequisites

The orchestrator will install tmux and node for you on first launch if they’re missing.

Where to Run It

We recommend a Mac Mini (or any always-on home server). A cloud VM (EC2, DigitalOcean, etc.) works fine too. The key requirements are:

(iMessage requires macOS specifically. The other channels work on Linux too.)

What You Get

Architecture

claude-code-teams/          # The install directory
├── CLAUDE.md              # Shared config inherited by all agents
├── agents/
│   └── orchestrator/      # Chief of staff (reference agent)
│       ├── CLAUDE.md
│       ├── tasks.md
│       ├── schedules/      # One .md per recurring task, with cron frontmatter
│       ├── docs/
│       ├── memory/
│       ├── scripts/        # Orchestrator-specific tooling
│       │   └── setup-slack.sh   # Kept as standalone script (takes tokens)
│       └── .claude/
├── hooks/                  # Shared Claude Code hooks (channel-reply-reminder, etc.)
└── mcp/
    ├── fleet/              # Cross-agent primitives + orchestrator tools (includes history_search for session jsonl)
    │   ├── server.ts       # MCP server (TypeScript)
    │   └── scripts/        # Shell scripts the fleet MCP shells out to
    │       ├── restart-agent.sh
    │       ├── compact-agent.sh
    │       ├── message-agent.sh
    │       └── create-agent.sh
    ├── google-workspace/  # Gmail, Calendar, Drive, Docs
    └── slack-channel/     # Slack integration (Socket Mode + WebClient)

~/.claude/channels/         # Telegram/Discord/iMessage/Slack channel configs (user home)
~/.config/                  # OAuth tokens, etc. (user home)

Each agent:

Adding Slack

Any agent can be connected to Slack (in addition to or instead of any other channel). See agents/orchestrator/docs/slack-setup.md for the full guide, or use the one-command setup. Kept as a standalone shell script (rather than a fleet MCP tool) because it takes Slack tokens as arguments, which shouldn’t land in an MCP tool call jsonl:

agents/orchestrator/scripts/setup-slack.sh <agent> <xoxb-token> <xapp-token> <your-slack-user-id> [channel-ids...]

This creates a Slack App per agent using Socket Mode (no public URL or webhook needed). Agents can be on any combination of channels — Telegram only, Slack only, both, or all four (Telegram + iMessage + Discord + Slack) simultaneously.

Adding More Agents

Just ask your orchestrator: “Add a coder agent” or “I need a finance agent.” The orchestrator will scaffold the directory, walk you through creating credentials for the new agent’s channel(s), configure them, and launch it.

You shouldn’t need to run scripts manually — the orchestrator handles orchestration.

Back Up Your Team

Your agent team accumulates state over time: CLAUDE.md files, schedules, agent-specific docs, memory files, learned triage rules. Fork this repo and push your team’s state to your fork regularly for:

Ask your orchestrator to set up a nightly git push schedule.

License

MIT