Skip to main content
Glama
ParitoshMaurya

mcp-repo-search

README.md
# MCP Repo Search

MCP server that clones a Git repo into a temp directory so Cursor (or other MCP clients) can search and read files from another repo for context. The clone is removed automatically after 5 minutes of inactivity.

## Requirements

- Node.js 18+
- Git installed and on `PATH`
- MCP host (e.g. Cursor)

## Install

**Option A – From npm (recommended if you published the package):**

```bash
# Global install (anyone can use it)
npm install -g mcp-repo-search
```

**Option B – With npx (no install; runs from npm cache):**

No install. Use `npx mcp-repo-search` in Cursor config below.

**Option C – From source (clone this repo):**

```bash
cd mcp-repo-search
npm install
npm run build
```

## Cursor configuration

**If you installed globally or use npx**, add to your MCP config (e.g. `.cursor/mcp.json` or Cursor Settings → MCP):

```json
{
  "mcpServers": {
    "repo-search": {
      "command": "npx",
      "args": ["mcp-repo-search"]
    }
  }
}
```

Or with global install:

```json
{
  "mcpServers": {
    "repo-search": {
      "command": "mcp-repo-search"
    }
  }
}
```

**If you use a local clone**, use the absolute path to the built entry point:

```json
{
  "mcpServers": {
    "repo-search": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-repo-search/build/index.js"]
    }
  }
}
```

Example path on macOS/Linux: `/Users/you/projects/multi-repo-mcp/mcp-repo-search/build/index.js`

---

## Tools

| Tool | Description |
|------|-------------|
| **ensure_repo** | Clone a repo (or reuse existing clone). Call this first with `repoUrl` (and optional `branch`). Resets the idle timer. |
| **get_repo_status** | Whether a repo is cloned, its path, URL, and idle TTL. Does not clone. |
| **read_file** | Read a file from the clone (path relative to repo root). Max 512 KB. Resets timer. |
| **list_directory** | List files and dirs under a path (default `"."`). Resets timer. |
| **search_repo** | Text/regex search in the clone. Optional `path` and `fileGlob` (e.g. `*.ts`). Resets timer. |

Typical flow: run **ensure_repo** with the repo URL, then use **search_repo**, **read_file**, or **list_directory** to pull context.

## Environment (optional)

- **`MCP_REPO_SEARCH_TTL_SECONDS`** – Idle timeout in seconds before the clone is deleted (default: `300`, i.e. 5 minutes).
- **`MCP_REPO_SEARCH_TEMP_DIR`** – Base directory for clones (default: `os.tmpdir()/mcp-repo-search`).

## Private repos

Git auth is not handled by this server. For private repos, rely on system Git config (e.g. credential helper, SSH keys, or `GIT_ASKPASS`). Clone is done with a shallow `--depth 1` and optional `--branch`.

## Logging

The server logs to **stderr** only (stdout is used for MCP JSON-RPC). Check your MCP client’s server logs (e.g. Cursor’s MCP server log) for errors.

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: cloning, checking status, reading a file, listing a directory, and searching. ensure_repo and get_repo_status are related but one performs an action while the other reports state, so no ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (ensure_repo, get_repo_status, read_file, list_directory, search_repo), using snake_case throughout. This makes the set predictable and easy to navigate.

Tool Count5/5

Five tools is well-scoped for a repo search server: one setup action, one status query, and three core read/search operations. Each tool earns its place, and the count is within the ideal 3-15 range.

Completeness5/5

The tool surface provides complete lifecycle coverage for the stated purpose of searching within a cloned repo. It supports cloning (with reuse), checking cached state, reading individual files, listing directories, and searching by text/regex—no obvious gaps for this read-only domain.

Maintenance

ActivityInactive
ResponsivenessNo issues