| name | context-tools |
| description | Context management tools for Claude Code - provides intelligent codebase mapping with Python, Rust, and C++ parsing, duplicate detection, and MCP-powered symbol queries. Use this skill when working with large codebases that need automated indexing and context management. |
Context Tools for Claude Code
This skill provides intelligent context management for large codebases through:
- Repository Mapping: Parses Python, Rust, and C++ code to extract classes, functions, and methods
- Duplicate Detection: Identifies similar code patterns using fuzzy matching
- MCP Symbol Server: Enables fast symbol search via
search_symbolsandget_file_symbolstools - Automatic Indexing: Background incremental updates as files change
Using MCP Tools - PRIMARY CODE EXPLORATION METHOD
⚡ DECISION TREE - Ask yourself BEFORE using Grep/Search/Bash:
Am I searching for code symbols (functions, classes, enums, structs, types)?
├─ YES → Use MCP tools (search_symbols / get_symbol_content / get_file_symbols)
│ Example: Finding "enum InstructionData" → search_symbols("InstructionData")
│ Example: Finding "Phi" variant → get_symbol_content("InstructionData")
│
└─ NO → Am I searching for text/comments/strings/config values?
└─ YES → Use Grep/Search
Example: Finding string literals, documentation, JSON values
CRITICAL: Use repo-map tools as your FIRST approach when you need to:
- Find a function/class/method by name or pattern →
search_symbols - Understand how to use a function (parameters, return type) →
search_symbolsorget_symbol_content - Get the source code of a specific function/class →
get_symbol_content - See all code in a file →
get_file_symbols - Discover what functionality exists in the codebase →
search_symbolswith patterns
Do NOT use Grep or Bash for these tasks - the repo-map tools are:
- Faster (pre-indexed SQLite database)
- More accurate (AST-parsed, not regex)
- More informative (includes signatures, docstrings, line ranges)
When to use Grep instead:
- Searching for string literals, comments, or arbitrary text
- Searching in non-code files (markdown, config, etc.)
- Cross-file text pattern searches
Tool availability check:
Before attempting to use MCP tools (mcp__plugin_context-tools_repo-map__*), check if .claude/repo-map.db exists:
- If YES: Try the MCP tool. If it fails (not available), use sqlite3 fallback.
- If NO: The project hasn't been indexed yet. Either wait for indexing or run
/context-tools:repo-mapto generate it.
Fallback order:
- Try MCP tool first
- If tool not found, use sqlite3 fallback to still answer the question
- Explain that session needs restart to load MCP server for future use
Real-World Usage Examples
Example 1: User asks "Can we compare against OSDI?"
Inefficient approach (DON'T DO THIS):
grep -r "setup_model\|setup_instance" jax_spice/devices/*.py
Problems: Slow, error-prone pattern matching, gets interrupted on large codebases.
Efficient approach (DO THIS):
mcp__plugin_context-tools_repo-map__search_symbols
pattern: "setup_*"
Result: Instant list of all setup_model, setup_instance, etc. with locations and signatures.
Example 2: User asks "How does the config loader work?"
Inefficient approach (DON'T DO THIS):
find . -name "*.py" -exec grep -l "class.*Config" {} \;
Efficient approach (DO THIS):
mcp__plugin_context-tools_repo-map__search_symbols
pattern: "*Config*"
kind: "class"
Then get the source:
mcp__plugin_context-tools_repo-map__get_symbol_content
name: "ConfigLoader"
Example 3: User asks "What functions are in utils.py?"
Inefficient approach (DON'T DO THIS):
grep "^def " src/utils.py
Efficient approach (DO THIS):
mcp__plugin_context-tools_repo-map__get_file_symbols
file: "src/utils.py"
Result: Complete list of all functions/classes with signatures and docstrings.
Example 4: Finding Rust enum variants (Real user case)
User needs to check if it's Phi or PhiNode in enum InstructionData.
Inefficient approach (DON'T DO THIS):
grep -n "enum InstructionData" openvaf-py/vendor/OpenVAF/openvaf/mir/src
grep -n "Phi" openvaf-py/vendor/OpenVAF/openvaf/mir/src/instructions.rs
Problems: Multiple searches, manual parsing, easy to miss correct variant.
Efficient approach (DO THIS):
mcp__plugin_context-tools_repo-map__search_symbols
pattern: "InstructionData"
mcp__plugin_context-tools_repo-map__get_symbol_content
name: "InstructionData"
Result: Complete enum with all variants visible, including PhiNode(_).
First Time Setup
IMPORTANT: If the user has just installed this plugin:
"I see you've installed the context-tools plugin. The MCP server should auto-configure on restart. After restarting Claude Code, run
/mcpto verify therepo-mapserver is loaded.If it doesn't load automatically, let me know and I can help troubleshoot using
/context-tools:setup-mcp."
The MCP server auto-configures from the plugin manifest. Only if auto-config fails should you run /context-tools:setup-mcp for troubleshooting.
Included Components
Hooks
- SessionStart: Generates project manifest and displays status
- PreCompact: Refreshes context before compaction
- SessionEnd: Cleanup operations
Note: Indexing is now handled by the MCP server itself (no PreToolUse hook needed).
MCP Server (repo-map)
Database Schema (.claude/repo-map.db):
symbols table columns:
- name (TEXT): Symbol name (function/class/method name)
- kind (TEXT): "function", "class", or "method"
- signature (TEXT): Full function/method signature with parameters and type hints
Examples:
- "extract_symbols_from_python(file_path: Path, relative_to: Path) -> list[Symbol]"
- "analyze_files(files: list[Path], extractor, language: str, root: Path)"
- docstring (TEXT): First line of docstring or full docstring
- file_path (TEXT): Relative path from project root
- line_number (INTEGER): Start line (1-indexed)
- end_line_number (INTEGER): End line (1-indexed)
- parent (TEXT): For methods, the class name
metadata table (v0.7.0+):
- key (TEXT PRIMARY KEY): Metadata key
- value (TEXT): Metadata value
Keys:
- 'status': 'idle' | 'indexing' | 'completed' | 'failed'
- 'index_start_time': ISO8601 timestamp when indexing started
- 'last_indexed': ISO8601 timestamp when last completed
- 'symbol_count': Total symbols indexed (string)
- 'error_message': Error message if status='failed'
Indexing Status and Auto-Wait (v0.7.0+):
- The MCP server tracks indexing status in the metadata table
- Tools automatically wait (up to 60s) if indexing is in progress
- Watchdog: Detects hung indexing (>10 minutes) and resets status to 'failed'
- First Use: On first use in a new codebase, indexing starts automatically
- Behavior: Most tools wait for completion, repo_map_status does not (use to check progress)
Available MCP Tools:
mcp__plugin_context-tools_repo-map__search_symbols- Search symbols by pattern (supports glob wildcards)- Returns: name, kind, signature, file_path, line_number, docstring, parent
- AUTO-WAIT: If indexing is in progress, automatically waits up to 60s for completion
mcp__plugin_context-tools_repo-map__get_file_symbols- Get all symbols in a specific file- Returns: All symbols with full metadata
- AUTO-WAIT: If indexing is in progress, automatically waits up to 60s for completion
mcp__plugin_context-tools_repo-map__get_symbol_content- Get full source code of a symbol by exact name- Returns: symbol metadata + content (source code text) + location
- AUTO-WAIT: If indexing is in progress, automatically waits up to 60s for completion
mcp__plugin_context-tools_repo-map__list_files- List all indexed files, optionally filtered by glob pattern- Returns: list of file paths matching pattern (e.g., ".va", "psp103", "**/devices/")
- MUCH faster than find/ls - queries pre-built index instead of filesystem traversal
- AUTO-WAIT: If indexing is in progress, automatically waits up to 60s for completion
mcp__plugin_context-tools_repo-map__reindex_repo_map- Trigger manual reindex- Does NOT auto-wait (use to force reindex)
mcp__plugin_context-tools_repo-map__repo_map_status- Check indexing status and staleness- Returns: index_status (idle/indexing/completed/failed), symbol_count, last_indexed, indexing_duration_seconds
- Does NOT auto-wait (use to check status)
mcp__plugin_context-tools_repo-map__wait_for_index- Explicitly wait for indexing to complete- Takes: timeout_seconds (default: 60)
- Returns: success (bool), message (str)
- Use when you want to wait longer than the default 60s auto-wait timeout
Fallback when MCP tools unavailable:
Use sqlite3 directly on .claude/repo-map.db:
# Search symbols
sqlite3 .claude/repo-map.db "SELECT name, kind, signature, file_path, line_number FROM symbols WHERE name LIKE 'pattern%' LIMIT 20"
# Get symbol with source
sqlite3 .claude/repo-map.db "SELECT * FROM symbols WHERE name = 'function_name'"
# Then read file_path lines line_number to end_line_number
Slash Commands
/context-tools:repo-map- Regenerate repository map/context-tools:manifest- Refresh project manifest/context-tools:learnings- Manage project learnings/context-tools:status- Show plugin status
Language Support
| Language | Parser | File Extensions |
|---|---|---|
| Python | AST | .py |
| Rust | tree-sitter-rust | .rs |
| C++ | tree-sitter-cpp | .cpp, .cc, .cxx, .hpp, .h, .hxx |