Skip to main content

An Elixir module search MCP server

Project description

CICADA Logo

CICADA

Code Intelligence: Contextual Analysis, Discovery, and Attribution

Give your AI assistant structured access to your Elixir codebase.

Python Version License: MIT codecov MCP Compatible

Install MCP Server

Quick Install · Security · Developers · AI Assistants · Docs


Why CICADA?

Traditional AI assistants treat your repo like a pile of text. That leads to:

  • Token waste: blind grep dumps that burn 3k+ tokens per question.
  • Hallucinated edits: aliases/imports hide call sites, so refactors miss real usages.
  • No historical context: design intent and PR trade-offs never make it into the prompt.

CICADA is an MCP server that gives assistants AST-level knowledge:

  • Module + function definitions with signatures, specs, docs, owning files.
  • Complete call-site tracking (aliases, imports, dynamic references).
  • Semantic/keyword search so you can ask for "authentication" even if it's called verify_credentials/2.
  • Git + PR attribution to surface why code exists.
  • Dead-code detection and module dependency views for safe refactors.

Result: in our comparison, the same question dropped from 3,127 tokens / 52.8s to 550 tokens / 35s with correct answers.


Quick Install

# 1. Install uv (if needed)
# curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install cicada-mcp

# In your repo 
cicada claude   # or: cicada cursor, cicada vs, cicada gemini, cicada codex, cicada opencode
Try before installing permanently
uvx --from cicada-mcp cicada claude   # or cursor, vs

Runs CICADA on demand (worse indexing quality, but zero install).

Available commands after installation:

  • cicada [claude|cursor|vs|gemini|codex|opencode] - One-command setup per project
  • cicada-mcp - MCP server (auto-started by editor)
  • cicada watch - Watch for file changes and automatically reindex
  • cicada index - Re-index code with custom options (-f/--force + --fast/--regular/--max, --watch)
  • cicada index-pr - Index pull requests for PR attribution
  • cicada find-dead-code - Find potentially unused functions

Ask your assistant:

"Show me the functions in MyApp.User"
"Where is authenticate/2 called?"
"Find code related to API authentication"

Privacy & Security

  • 100% local: parsing + indexing happen on your machine; no cloud uploads.
  • No telemetry: CICADA doesn't collect usage or phone home.
  • Read-only tools: MCP endpoints only read the index; they can't change your repo.
  • Optional GitHub access: PR features rely on gh and your existing OAuth token.
  • Data layout:
    ~/.cicada/projects/<repo_hash>/
    ├─ index.json      # modules, functions, call sites, metadata
    ├─ config.yaml     # indexing options + keyword tier
    ├─ hashes.json     # incremental indexing cache
    └─ pr_index.json   # optional PR metadata + reviews
    
    Your repo only gains an editor config (.mcp.json, .cursor/mcp.json, .vscode/settings.json, .gemini/mcp.json, .codex/mcp.json, or .opencode.json).

For Developers

Wire CICADA into your editor once, and every assistant session inherits the context.

Install & Configure

cd /path/to/project
cicada claude   # or cicada cursor / cicada vs / cicada gemini / cicada codex / cicada opencode

Enable PR Attribution (optional)

brew install gh    # or apt install gh
gh auth login
cicada index-pr .     # incremental
cicada index-pr . --clean   # full rebuild

Unlocks questions like "Which PR introduced line 42?" or "What did reviewers say about billing.ex?"

Automatic Re-indexing with Watch Mode

Enable automatic reindexing when files change by starting the MCP server with the --watch flag:

** .mcp.json**

{
  "mcpServers": {
    "cicada": {
      "command": "cicada-mcp",
      "args": ["--watch"],
      "env": {
        "CICADA_CONFIG_DIR": "/home/user/.cicada/projects/<hash>"
      }
    }
  }
}

When watch mode is enabled:

  • A separate process monitors .ex and .exs files for changes
  • Changes are automatically reindexed (incremental, fast)
  • 2-second debounce prevents excessive reindexing during rapid edits
  • The watch process stops automatically when the MCP server stops
  • Excluded directories: deps, _build, node_modules, .git, assets, priv

CLI Cheat Sheet

Command Purpose Run When
cicada claude Configure MCP + incremental re-index First setup, after local changes
cicada watch Monitor files and auto-reindex on changes During active development
cicada index --force --regular . Full rebuild w/ semantic keywords After large refactors or enabling AI tier
cicada index-pr . Sync PR metadata/reviews After new PRs merge
cicada find-dead-code --min-confidence high List unused public functions Cleanup sprints

Troubleshooting

"Index file not found"

Run the indexer first:

cicada index /path/to/project

Ensure indexing completed successfully. Check for ~/.cicada/projects/<hash>/index.json.

"Module not found"

Use the exact module name as it appears in code (e.g., MyApp.User, not User).

If module was recently added, re-index:

cicada index .
MCP Server Won't Connect

Troubleshooting checklist:

  1. Verify configuration file exists:

    # For Claude Code
    ls -la .mcp.json
    
    # For Cursor
    ls -la .cursor/mcp.json
    
    # For VS Code
    ls -la .vscode/settings.json
    
  2. Check paths are absolute:

    cat .mcp.json
    # Should contain: /absolute/path/to/project
    # Not: ./project or ../project
    
  3. Ensure index exists:

    ls -la ~/.cicada/projects/
    # Should show directory for your project
    
  4. Restart editor completely (not just reload window)

  5. Check editor MCP logs:

    • Claude Code: --debug
    • Cursor: Settings → MCP → View Logs
    • VS Code: Output panel → MCP
PR Features Not Working

Setup GitHub CLI:

# Install GitHub CLI
brew install gh  # macOS
sudo apt install gh  # Ubuntu
# or visit https://cli.github.com/

# Authenticate
gh auth login

# Index PRs
cicada index-pr

Common issues:

  • "No PR index found" → Run cicada index-pr .
  • "Not a GitHub repository" → Ensure repo has GitHub remote
  • Slow indexing → First-time indexing fetches all PRs; subsequent runs are incremental
  • Rate limiting → GitHub API has rate limits; wait and retry if you hit limits

Force rebuild:

cicada index-pr --clean
Keyword Search Not Working

Error: "Keyword search not available"

Cause: Index was built without keyword extraction.

Solution:

# Re-index with keyword extraction
cicada index .  # or --fast or --max

Verify:

cat ~/.cicada/projects/<hash>/config.yaml
# Should show keyword_extraction: enabled

More detail: docs/PR_INDEXING.md, docs/08-INCREMENTAL_INDEXING.md.


For AI Assistants

CICADA ships 7 focused MCP tools designed for efficient code exploration.

🧭 Which Tool Should You Use?

Need Tool Notes
Start exploring query 🚀 START HERE - Smart discovery with keywords/patterns + filters (scope, recent, path)
View a module's complete API search_module Functions, signatures, specs, docs. Use what_calls_it/what_it_calls for bidirectional analysis
Find where a function is used search_function Definition + all call sites. Supports wildcards (*) and OR (|) patterns
Track git history git_history Unified tool: blame, commits, PRs, function evolution (replaces 4 legacy tools)
Find dead code find_dead_code Identify potentially unused functions with confidence levels
Drill down into results expand_result Auto-expands modules or functions from query results
Advanced index queries query_jq Custom jq queries for power users

Want to see these tools in action? Check out Complete Workflow Examples with pro tips and real-world scenarios.

Core Tools

query - Smart code discovery (your starting point)

  • Automatically detects keywords vs patterns
  • Filters: scope (public/private), recent (last 14 days), filter_type (modules/functions), match_source (docs/strings)
  • Returns snippets with smart next-step suggestions
  • Use path_pattern to filter by location

search_module - Deep module analysis

  • View complete API: functions, signatures, specs, docs
  • Bidirectional analysis:
    • what_calls_it=true → See who uses this module (impact analysis)
    • what_it_calls=true → See what this module depends on
  • Supports wildcards (MyApp.*) and OR patterns (MyApp.User|MyApp.Post)
  • Filter by visibility (public/private/all)

search_function - Function usage tracking

  • Find definitions and all call sites
  • what_calls_it=true (default) → See all callers
  • what_it_calls=true → See all dependencies
  • Include code examples with include_usage_examples=true
  • Filter by usage_type: source, tests, or all

Git History (Unified Tool)

git_history - All git operations in one tool

  • Single line: git_history("file.ex", start_line=42) → blame + PR
  • Line range: git_history("file.ex", start_line=40, end_line=60) → grouped blame
  • Function tracking: git_history("file.ex", function_name="create_user") → evolution
  • File history: git_history("file.ex") → all PRs/commits
  • Time filtering: recent=true (14d), recent=false (>14d), recent=null (all)
  • Author filtering: author="john"
  • Automatic PR index integration when available

Additional Tools

expand_result - Drill down from query results

  • Auto-detects module vs function
  • Shows complete details with usage examples
  • Configure what to include: code, dependencies, callers
  • Convenient wrapper around search_module and search_function

find_dead_code - Code cleanup analysis

  • Three confidence levels (high, medium, low)
  • Smart detection of callbacks and behaviors
  • Recognition of dynamic call patterns
  • Module-level grouping with line numbers
  • Excludes test files and @impl functions

query_jq - Advanced index queries

  • Direct jq queries against the index
  • Schema discovery with | schema
  • Compact (default) or pretty output
  • Sample mode for large results

Detailed parameters + output formats: MCP_TOOLS_REFERENCE.md.

Token-Friendly Responses

All tools return structured Markdown/JSON snippets (signatures, call sites, PR metadata) instead of full files, keeping prompts lean.



Documentation


Roadmap

PYTHON AND TYPESCRIPT!!!


Contributing

git clone https://github.com/wende/cicada.git
cd cicada
uv sync
pytest

Before submitting a PR:

  • Run black cicada tests
  • Ensure tests + coverage pass (pytest --cov=cicada --cov-report=term-missing)
  • Update docs if behaviour changes

We welcome issues/PRs for:

  • New language grammars
  • Tool output improvements
  • Better onboarding docs and tutorials

License

MIT – see LICENSE.

Stop letting your AI search blindly. Give it CICADA.

Get Started · Report Issues

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cicada_mcp-0.4.1.tar.gz (241.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cicada_mcp-0.4.1-py3-none-any.whl (242.9 kB view details)

Uploaded Python 3

File details

Details for the file cicada_mcp-0.4.1.tar.gz.

File metadata

  • Download URL: cicada_mcp-0.4.1.tar.gz
  • Upload date:
  • Size: 241.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cicada_mcp-0.4.1.tar.gz
Algorithm Hash digest
SHA256 03bbf3410b707a4f5f995eea43a8ff613932d5049e88840eefc1762ac0ac67a1
MD5 929108d8bd361e3ea9663d9f8aecd4ed
BLAKE2b-256 a3d993ee7e47e39c1b98d8e261b7f48f664f083add8d31b40a86c3a4450c5c5a

See more details on using hashes here.

File details

Details for the file cicada_mcp-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: cicada_mcp-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 242.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cicada_mcp-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b74b726e5646a75baa85ce0513e13aafd13725b4e01f6493f19481795f4ea825
MD5 54f70e0995f8a611478c7375723a318b
BLAKE2b-256 8764840897b76059abb2cfd6540b6f1bc74dfcd686f06cf2eeb36f0d114b8e4c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page