Skip to main content
Glama
candrle20

CodeBrain MCP Server

by candrle20
README.md
# ๐Ÿง  CodeBrain MCP Server

**Semantic code search powered by AI embeddings and vector similarity.**

Integrate intelligent code search directly into Claude Desktop and Cursor through the Model Context Protocol (MCP).

## ๐ŸŽฏ What It Does

CodeBrain indexes your codebase using AST-based splitting and AI embeddings, enabling:
- **Semantic search** - Find code by meaning, not just keywords
- **Smart chunking** - AST-aware code splitting (respects functions, classes, etc.)
- **Fast retrieval** - Vector similarity search with pgvector
- **Multi-project** - Index and search across multiple codebases

## ๐Ÿš€ Quick Start

### 1. Prerequisites

```bash
# Docker running (for PostgreSQL + pgvector)
docker ps | grep codebrain

# Node.js 20+
node --version

# Dependencies installed
cd /Users/conorandrle/Documents/Coding/CodeBrainMCP/CodeBrain
pnpm install
```

### 2. Setup Database

```bash
# Start PostgreSQL with pgvector (if not running)
docker run -d \
  --name codebrain \
  -p 5484:5432 \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=codebrain \
  pgvector/pgvector:pg15

# Setup database schema
pnpm db:setup
pnpm db:migrate
```

### 3. Configure Environment

Edit `.env`:
```bash
GEMINI_API_KEY=your_api_key_here
DATABASE_URL=postgresql://postgres:postgres@localhost:5484/codebrain?schema=cbmcp
```

### 4. Test the Server

```bash
# Run tests
pnpm test

# Should show: โœ… 28 tests passed

# Test MCP server starts
npx tsx src/index.ts
# Should output: ๐Ÿš€ CodeBrain MCP Server started (stdio mode)
# Press Ctrl+C to stop
```

## ๐Ÿ”Œ Connect to Cursor/Claude

### For Cursor

1. **Open Cursor Settings** โ†’ MCP Servers
2. **Add server** named `codebrain`
3. **Copy this config:**

```json
{
  "command": "npx",
  "args": [
    "-y",
    "tsx",
    "/Users/conorandrle/Documents/Coding/CodeBrainMCP/CodeBrain/src/index.ts"
  ],
  "env": {
    "GEMINI_API_KEY": "your_key_here",
    "DATABASE_URL": "postgresql://postgres:postgres@localhost:5484/codebrain?schema=cbmcp"
  }
}
```

4. **Restart Cursor**
5. **Verify** - Check MCP panel shows "codebrain" connected

๐Ÿ“– **Detailed guide:** See [CURSOR_SETUP.md](./CURSOR_SETUP.md)

### For Claude Desktop

Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "codebrain": {
      "command": "npx",
      "args": [
        "-y",
        "tsx",
        "/Users/conorandrle/Documents/Coding/CodeBrainMCP/CodeBrain/src/index.ts"
      ],
      "env": {
        "GEMINI_API_KEY": "your_key_here",
        "DATABASE_URL": "postgresql://postgres:postgres@localhost:5484/codebrain?schema=cbmcp"
      }
    }
  }
}
```

Restart Claude Desktop.

## ๐Ÿ› ๏ธ Available MCP Tools

### 1. `index_codebase`
Index a codebase for semantic search.

**Parameters:**
```typescript
{
  projectName: string;   // Unique project identifier
  rootPath: string;      // Absolute path to code
  force?: boolean;       // Re-index existing files
}
```

**Example:**
> "Index my React project at /Users/me/projects/my-app with name 'my-app'"

### 2. `semantic_search`
Search code semantically across indexed projects.

**Parameters:**
```typescript
{
  query: string;         // What to search for
  projectName?: string;  // Filter by project
  topK?: number;        // Number of results (default: 5)
  threshold?: number;   // Similarity threshold (default: 0.5)
}
```

**Example:**
> "Find authentication logic in my-app"

### 3. `list_projects`
List all indexed projects.

**Parameters:** None

**Example:**
> "Show me all indexed projects"

### 4. `get_project_stats`
Get statistics for a project.

**Parameters:**
```typescript
{
  projectName: string;   // Project to query
}
```

**Example:**
> "Show me stats for the my-app project"

## ๐Ÿ“Š Architecture

```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         Cursor / Claude Desktop             โ”‚
โ”‚              (MCP Client)                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚ MCP Protocol (stdio)
                  โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         CodeBrain MCP Server                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  AST Code Splitter                  โ”‚   โ”‚
โ”‚  โ”‚  - JavaScript/TypeScript            โ”‚   โ”‚
โ”‚  โ”‚  - Python, Go, Rust, Java, C++      โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                 โ”‚                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  Gemini Embeddings                  โ”‚   โ”‚
โ”‚  โ”‚  - 768-dimensional vectors          โ”‚   โ”‚
โ”‚  โ”‚  - Semantic descriptions            โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                 โ”‚                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  Vector Search                      โ”‚   โ”‚
โ”‚  โ”‚  - Cosine similarity                โ”‚   โ”‚
โ”‚  โ”‚  - Threshold filtering              โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚      PostgreSQL + pgvector                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  Projects โ†’ Files โ†’ Chunks โ†’ Embeds โ”‚  โ”‚
โ”‚  โ”‚  Normalized relational schema        โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```

## ๐Ÿงช Testing

```bash
# Run all tests
pnpm test

# Watch mode
pnpm test:watch

# Individual test suites
pnpm test:splitter     # AST code splitter
pnpm test:indexing     # Indexing workflow
pnpm test:search       # Semantic search
pnpm test:embedding    # Embedding generation

# Integration test (end-to-end)
pnpm test:integration
```

## ๐ŸŒ Graph Viewer (React)

Visualise the code graph in the browser with the React/Vite viewer.

```bash
# Start the Graph API server (serves graph JSON on http://localhost:4000)
pnpm graph:server

# In a separate terminal, install and run the viewer UI
cd apps/graph-viewer
pnpm install
pnpm dev

# Open the browser UI โ†’ http://localhost:5173
```

Override the API target with `VITE_GRAPH_API_URL` (inside `apps/graph-viewer/.env`) if the server runs elsewhere.

## ๐Ÿ“ Project Structure

```
CodeBrain/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ index.ts              # MCP server entry point
โ”‚   โ”œโ”€โ”€ core/
โ”‚   โ”‚   โ”œโ”€โ”€ indexing.ts       # Indexing orchestration
โ”‚   โ”‚   โ”œโ”€โ”€ search.ts         # Semantic search
โ”‚   โ”‚   โ”œโ”€โ”€ splitter.ts       # AST-based code splitting
โ”‚   โ”‚   โ””โ”€โ”€ embedding/
โ”‚   โ”‚       โ”œโ”€โ”€ base-embedding.ts      # Embedding interface
โ”‚   โ”‚       โ””โ”€โ”€ gemini-embedding.ts    # Gemini implementation
โ”‚   โ””โ”€โ”€ test/
โ”‚       โ”œโ”€โ”€ *.test.ts         # Unit tests
โ”‚       โ””โ”€โ”€ utils.ts          # Test utilities
โ”œโ”€โ”€ db/
โ”‚   โ”œโ”€โ”€ index.ts              # Prisma client
โ”‚   โ”œโ”€โ”€ setup.ts              # Database setup script
โ”‚   โ””โ”€โ”€ vector-indexes.ts     # Vector index management
โ”œโ”€โ”€ prisma/
โ”‚   โ””โ”€โ”€ schema.prisma         # Database schema
โ”œโ”€โ”€ .env                      # Environment variables
โ”œโ”€โ”€ mcp-config.json          # MCP configuration template
โ”œโ”€โ”€ CURSOR_SETUP.md          # Cursor integration guide
โ””โ”€โ”€ README.md                # This file
```

## ๐Ÿ—ƒ๏ธ Database Schema

```sql
Project (1) โ”€โ”
             โ”œโ”€> File (N) โ”€โ”
                           โ”œโ”€> Chunk (N) โ”€โ”
                                          โ”œโ”€> Embedding (N)
```

- **Project**: Root container (name, rootPath)
- **File**: Individual source files (path, language, hash)
- **Chunk**: Code segments (text, lines, AST metadata)
- **Embedding**: Vector representations (768-dim, model, similarity search)

## ๐Ÿ”ง Development

### Scripts

```bash
pnpm dev              # Start with auto-reload
pnpm start            # Start server
pnpm build            # Compile TypeScript

pnpm db:setup         # Setup database + pgvector
pnpm db:migrate       # Run migrations
pnpm db:generate      # Generate Prisma client
pnpm db:studio        # Open Prisma Studio
```

### Environment Variables

```bash
# Required
GEMINI_API_KEY=your_gemini_api_key
DATABASE_URL=postgresql://user:pass@host:port/db?schema=cbmcp

# Optional
NODE_ENV=development
```

## ๐Ÿ› Troubleshooting

### MCP Connection Issues

**Problem:** Server won't connect in Cursor

**Solutions:**
1. Test manually: `npx tsx src/index.ts` (should output startup message)
2. Check absolute path in config matches your directory
3. Verify environment variables in MCP config
4. Restart Cursor completely (Cmd+Q, then reopen)
5. Check MCP output panel for error logs

### Database Issues

**Problem:** `type "vector" does not exist`

**Solution:**
```bash
pnpm db:setup  # This installs pgvector in cbmcp schema
```

**Problem:** Connection refused

**Solution:**
```bash
docker ps | grep codebrain  # Verify container running
docker start codebrain      # Start if stopped
```

### Embedding Issues

**Problem:** `GEMINI_API_KEY is required`

**Solution:** Add API key to `.env` and MCP config

### Performance Issues

**Problem:** Indexing is slow

**Solutions:**
- Embeddings are cached - subsequent runs are faster
- Adjust batch size in `indexing.ts` if needed
- Consider excluding large directories (node_modules, etc.)

## ๐Ÿ“ˆ Performance

- **Indexing:** ~2-5 seconds per file (first time, includes embedding generation)
- **Re-indexing:** ~100ms per file (if unchanged, uses hash comparison)
- **Search:** ~500ms per query (includes embedding + vector search)
- **Storage:** ~10KB per code chunk (text + embedding + metadata)

## ๐Ÿ” Security

- API keys stored in environment variables (not in code)
- Database credentials configurable
- MCP runs locally (no external API calls except Gemini)
- Vector embeddings don't leave your machine

## ๐Ÿ“ License

MIT

## ๐Ÿค Contributing

This is a personal project, but feel free to fork and adapt for your needs!

## ๐ŸŽ“ Learn More

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [pgvector](https://github.com/pgvector/pgvector)
- [Gemini Embeddings](https://ai.google.dev/docs/embeddings_guide)
- [Tree-sitter](https://tree-sitter.github.io/tree-sitter/)

## โœ… Status

- โœ… Database setup and migrations
- โœ… AST-based code splitting
- โœ… Gemini embedding integration
- โœ… Vector similarity search
- โœ… MCP server implementation
- โœ… Comprehensive test suite (28 tests)
- โœ… Multi-project support
- โœ… Cursor/Claude integration ready

**Ready for production use!** ๐Ÿš€

Maintenance

ActivityInactive
ResponsivenessNo issues