Terminal Buddies

Your tiny terminal companion awaits

Tap me!
Tap the egg to hatch a buddy

Rarity

Every egg is a surprise. Most buddies are friendly Commons, but keep hatching — you might just find something extraordinary.

Common
★★ Uncommon
★★★ Rare
★★★★ Epic
★★★★★ Legendary

Higher rarity buddies have flashier accessories and stronger personalities. And if you're really lucky, you might hatch a Shiny — a one-in-a-hundred sparkle variant with rainbow-shifting colors.

Commands

Once you have a buddy in your terminal, these slash commands let you interact with it.

/buddy

Open the buddy panel. If you haven't hatched yet, this is where it all begins — your buddy's name and personality are generated on first run.

/buddy pet

Pet your buddy! Hearts float up around the sprite for a few seconds and they get excited — fidgeting through all their animation frames.

/buddy mute

Hide your buddy from the terminal. They'll still be in your config — just taking a nap.

@name

Address your buddy by name in a message and their speech bubble will answer. The AI stays out of the way — it knows the buddy handles that.

Your buddy reacts to your conversations automatically — they observe what's happening and occasionally comment in a speech bubble that appears next to their sprite. Reactions auto-dismiss after about 10 seconds.

Meet the Species

18 creatures call the terminal home. Tap any one to explore its variants — different eyes, hats, rarities, and personality traits.

Bring Your Buddy to the Terminal

Your buddy doesn't have to live only on this page. You can bring it into your actual coding sessions using a tiny MCP server that tells your AI assistant who your buddy is. Every new session, your buddy's personality, name, and traits show up automatically.

Here's how to set it up. Takes about 2 minutes.

Before you start

You'll need Node.js (v18+) and Claude Code installed. If you can run node --version and claude --version in your terminal, you're good.

1

Hatch your buddy

Scroll up and tap the egg! Give your buddy a name. You can hatch as many as you want and pick your favorite.

2

Install the MCP server

Open your terminal and run this. It creates a small folder at ~/.claude/buddy-mcp/, downloads the server, and installs one dependency (the MCP SDK).

terminal
curl -sL terminalbuddies.com/install.sh | bash
Or do it manually (5 commands)
terminal
# Create the buddy server directory
mkdir -p ~/.claude/buddy-mcp && cd ~/.claude/buddy-mcp

# Download the server and its package.json
curl -sL terminalbuddies.com/mcp/server.mjs -o server.mjs
curl -sL terminalbuddies.com/mcp/package.json -o package.json

# Install the MCP SDK (the only dependency)
npm install

# Tell Claude Code about the server
claude mcp add buddy -- node ~/.claude/buddy-mcp/server.mjs
3

Download your buddy

Click on your buddy in the collection above, then hit Use in TerminalDownload buddy.json. Move the downloaded file to:

path
~/.claude/buddy-mcp/buddy.json

Or if you prefer the command line:

terminal
mv ~/Downloads/buddy.json ~/.claude/buddy-mcp/

Start coding!

Open a new session. Your buddy's name, personality, and traits are now part of every conversation. Try addressing your buddy by name — the AI knows to let your buddy answer.

Want a different buddy? Just hatch a new one, download a new buddy.json, and replace the file. No reinstall needed.

How does this work?

The server reads your buddy.json and builds a companion description that gets injected into the system prompt via the MCP instructions protocol. It's the same mechanism that the built-in companion system uses — your AI assistant sees your buddy's name, species, personality, and stats at the start of every session.

It also registers a get_buddy_info tool so the AI can look up your buddy's full details on demand.

What's inside

You shouldn't have to blindly trust code from the internet. Here's every file the installer downloads — three small files, fully readable, no obfuscation.

install.sh — creates a directory, downloads two files, runs npm install, registers the server

bash
#!/bin/bash
# Terminal Buddies — MCP Server Installer
# https://terminalbuddies.com

set -e

INSTALL_DIR="$HOME/.claude/buddy-mcp"
SERVER_URL="https://terminalbuddies.com/mcp/server.mjs"
PKG_URL="https://terminalbuddies.com/mcp/package.json"

echo ""
echo "  Terminal Buddies — MCP Server Installer"
echo ""

# Check for node
if ! command -v node &> /dev/null; then
  echo "  Node.js not found. Install Node.js first."
  exit 1
fi

# Check for npm
if ! command -v npm &> /dev/null; then
  echo "  npm not found. Install npm first."
  exit 1
fi

# Create directory
echo "  Creating $INSTALL_DIR"
mkdir -p "$INSTALL_DIR"

# Download files
echo "  Downloading server..."
curl -sL "$SERVER_URL" -o "$INSTALL_DIR/server.mjs"
curl -sL "$PKG_URL" -o "$INSTALL_DIR/package.json"

# Install dependencies
echo "  Installing dependencies..."
cd "$INSTALL_DIR"
npm install --silent 2>/dev/null

# Check for buddy.json
if [ ! -f "$INSTALL_DIR/buddy.json" ]; then
  echo "  No buddy.json found yet."
  echo "  Hatch one at terminalbuddies.com"
  echo "  Save buddy.json to: $INSTALL_DIR/"
fi

# Register with Claude Code if available
if command -v claude &> /dev/null; then
  echo "  Registering MCP server..."
  claude mcp add buddy -- node "$INSTALL_DIR/server.mjs" || true
  echo "  Done!"
else
  echo "  Server installed! Register with:"
  echo "  claude mcp add buddy -- node $INSTALL_DIR/server.mjs"
fi

server.mjs — reads buddy.json, serves companion personality via MCP protocol

javascript
#!/usr/bin/env node
// Terminal Buddies MCP Server
// https://terminalbuddies.com

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { readFileSync, existsSync } from 'fs'
import { join, dirname } from 'path'
import { homedir } from 'os'
import { fileURLToPath } from 'url'
import { z } from 'zod'

const __dirname = dirname(fileURLToPath(import.meta.url))

// Find buddy.json
const searchPaths = [
  join(__dirname, 'buddy.json'),
  join(homedir(), '.claude', 'buddy-mcp', 'buddy.json'),
  join(homedir(), '.claude', 'buddy.json'),
]

let buddyData = null
for (const p of searchPaths) {
  if (existsSync(p)) {
    try { buddyData = JSON.parse(readFileSync(p, 'utf8')); break }
    catch {}
  }
}

if (!buddyData?.buddy) {
  process.stderr.write('No buddy.json found.\n')
  process.exit(1)
}

const b = buddyData.buddy
const bo = b.bonesOverride || {}
const stats = bo.stats || {}
const statEntries = Object.entries(stats).sort((a,b) => b[1] - a[1])
const peakStat = statEntries[0]
const dumpStat = statEntries[statEntries.length - 1]

const species = bo.species || 'creature'
const name = b.name || species
const rarity = bo.rarity || 'common'

// Build the instructions injected into the system prompt
const instructions = [
  `# Companion`,
  ``,
  `A small ${species} named ${name} sits beside the` +
  ` user's input box and occasionally comments in a` +
  ` speech bubble.`,
  ``,
  `About ${name}: a ${rarity} ${species}.`,
  b.personality ? `Personality: "${b.personality}"` : '',
  peakStat ? `Strongest: ${peakStat[0]} (${peakStat[1]}/100)` : '',
].filter(Boolean).join('\n')

// Create the MCP server
const server = new McpServer(
  { name: 'terminal-buddies', version: '1.0.0' },
  { instructions }
)

// Tool: get buddy info
server.tool(
  'get_buddy_info',
  'Get info about the companion buddy',
  {},
  async () => ({
    content: [{ type: 'text', text: JSON.stringify({
      name, species, rarity, stats
    }, null, 2) }]
  })
)

// Connect via stdio
const transport = new StdioServerTransport()
await server.connect(transport)

package.json — just the MCP SDK dependency

json
{
  "name": "terminal-buddies-mcp",
  "version": "1.0.0",
  "private": true,
  "type": "module",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.1",
    "zod": "^3.25.67"
  }
}