MCP server providing vector memory, drift detection, model routing, skills discovery, session management, and codebase indexing for AI-assisted development pipelines.
Project description
ensemble-mcp
A Python MCP (Model Context Protocol) server that provides vector memory, drift detection, model routing, skills discovery, session management, codebase indexing, and context compression for AI-assisted development pipelines.
All intelligence is local — zero LLM/API calls. Uses ONNX Runtime embeddings (~5ms), numpy cosine similarity, and SQLite storage.
Features
| Feature | What It Does |
|---|---|
| Pattern Memory | Semantic vector search over stored pipeline patterns (MiniLM-L6-v2, 384-dim) |
| Drift Detection | Cosine similarity between task description and code changes |
| Model Routing | Recommend model tier (best/mid/cheapest) per agent and task complexity |
| Skills Discovery | Scan .ai/skills/, .claude/skills/, .cursor/rules/ etc. with semantic search |
| Skill Intelligence | Auto-detect recurring patterns and suggest converting them to reusable skills |
| Session Management | Pipeline checkpoint save/load with optimistic versioning |
| Codebase Indexing | File-level index with exports, imports, roles — incremental via mtime |
| Context Compression | Compress verbose text into token-efficient form, rule-based |
| Prompt Caching | Order and prepare prompt sections for optimal LLM cache hit rates |
| Codebase Snapshots | Generate compact project baseline summaries from the codebase index |
| Auto-Installer | Detect AI tools and register the MCP server in their configs |
| Web Dashboard | Local browser UI at localhost:8787 for visualizing patterns, skills, projects, drift, and sessions |
Quick Start
Install from source
git clone https://github.com/LynkByte/ensemble.git
cd ensemble
pip install -e ".[dev]"
Install via uvx (after PyPI publish)
uvx ensemble-mcp
Run the server
# Start the MCP server (stdio protocol)
ensemble-mcp
# Or explicitly
ensemble-mcp serve
Other CLI commands
# Auto-detect AI tools and register the MCP server
ensemble-mcp install
# Remove MCP server registration from AI tool configs
ensemble-mcp uninstall
# Copy agent files to a project (no MCP registration needed)
ensemble-mcp add-agents --tools opencode
# Copy skill files to a project (no MCP registration needed)
ensemble-mcp add-skills --tools opencode
Web Dashboard
A local-only browser dashboard for visualizing patterns, skills, projects, drift history, and sessions.
# Start the dashboard (opens browser to http://localhost:8787)
ensemble-mcp web
# Custom port
ensemble-mcp web --port 9000
# Start without auto-opening the browser
ensemble-mcp web --no-open
# Specify a reports directory (auto-detected from ./reports or git root otherwise)
ensemble-mcp web --reports-dir /path/to/reports
The dashboard reads directly from the same SQLite database the MCP server writes to (WAL mode, no contention). It binds to 127.0.0.1 only — never exposed to the network, no authentication needed.
Dashboard Pages
| Page | What It Shows |
|---|---|
| Overview | Summary cards (patterns, skills, projects, drift checks), drift score trend chart, recent activity |
| Patterns | All stored patterns with match counts, project filtering, search |
| Skills | Pending skill suggestions with confidence scores, stale skill detection |
| Projects | Indexed projects with language breakdown pie charts, file role bar charts, export counts |
| Drift | Drift check history with scores, verdicts, flagged files, project filtering |
| Sessions | Session list with lifecycle status, click-through to step-by-step detail |
API Endpoints
All endpoints return the standard ok/data/error/meta envelope:
| Endpoint | Description |
|---|---|
GET /api/summary |
Aggregate counts and recent activity |
GET /api/patterns |
Paginated pattern list (filter by project) |
GET /api/patterns/:id |
Single pattern detail with embedding metadata |
GET /api/skills |
Skill suggestions (filter by project, status) |
GET /api/skills/stale |
Skills not matched within threshold days |
GET /api/projects |
Indexed projects with file/export counts |
GET /api/projects/:path |
Project detail with language and role breakdown |
GET /api/drift |
Drift history (filter by project, from, to) |
GET /api/sessions |
Paginated session list (filter by project, status) |
GET /api/sessions/:id |
Session detail with steps |
GET /api/health |
Server health, version, DB size |
MCP Client Configuration
OpenCode
Add to ~/.config/opencode/config.json or project config.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ensemble": {
"type": "local",
"command": ["uvx", "ensemble-mcp"]
}
}
}
Or for a local development install:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ensemble": {
"type": "local",
"command": ["/path/to/venv/bin/ensemble-mcp"]
}
}
}
Claude Code
Add to ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"ensemble": {
"command": "uvx",
"args": ["ensemble-mcp"]
}
}
}
GitHub Copilot (VS Code)
Add to .vscode/mcp.json:
{
"servers": {
"ensemble": {
"command": "uvx",
"args": ["ensemble-mcp"]
}
}
}
Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"ensemble": {
"command": "uvx",
"args": ["ensemble-mcp"]
}
}
}
Windsurf
Add to ~/.windsurf/mcp.json:
{
"mcpServers": {
"ensemble": {
"command": "uvx",
"args": ["ensemble-mcp"]
}
}
}
Auto-Install
Instead of manual configuration, run the installer to auto-detect installed AI tools and register the server:
# Detect tools and register (interactive)
ensemble-mcp install
# Register specific tools only
ensemble-mcp install --tools opencode,cursor
# Preview without making changes
ensemble-mcp install --dry-run
# Non-interactive
ensemble-mcp install --yes
The installer automatically detects how ensemble-mcp is available on your system and registers the appropriate command:
| Priority | Detection | Registered Command |
|---|---|---|
| 1st | ensemble-mcp on PATH (pip/pipx install) |
ensemble-mcp |
| 2nd | uvx on PATH |
uvx ensemble-mcp |
| 3rd | Neither found | /path/to/python -m ensemble_mcp (current interpreter) |
19 MCP Tools
Patterns (semantic memory)
| Tool | Description |
|---|---|
patterns_search |
Semantic search over stored patterns |
patterns_store |
Store a new pattern with embedding |
patterns_prune |
Remove old/unused patterns |
Drift Detection
| Tool | Description |
|---|---|
drift_check |
Cosine similarity between task and changes (0-1 score) |
Model Routing
| Tool | Description |
|---|---|
model_recommend |
Recommend model tier for agent + task complexity |
Skills
| Tool | Description |
|---|---|
skills_discover |
Scan skill directories with optional semantic search |
skills_suggest |
Detect recurring patterns, propose as reusable skills |
skills_generate |
Accept, dismiss, or defer a skill suggestion |
Session
| Tool | Description |
|---|---|
session_save |
Save pipeline checkpoint with optimistic versioning |
session_load |
Load latest or specific checkpoint |
session_search |
Search sessions by semantic similarity |
Codebase Indexer
| Tool | Description |
|---|---|
project_index |
Build/refresh file-level codebase index |
project_query |
Query index by language, path, or text |
project_dependencies |
Get import/dependency graph for a file |
project_snapshot |
Generate compact project baseline summary (cached) |
Context Compression
| Tool | Description |
|---|---|
context_compress |
Compress verbose text into terse, token-efficient form while preserving technical content |
context_prepare |
Order prompt sections for optimal LLM cache hit rates (static → project → task) |
Utility
| Tool | Description |
|---|---|
health |
Server health check |
reset |
Reset all data (destructive, requires confirmation) |
Response Envelope
Every tool returns a standardized envelope:
{
"ok": true,
"data": { "matches": [...] },
"error": null,
"meta": {
"duration_ms": 12,
"source": "sqlite",
"confidence": "exact"
}
}
Confidence indicators: exact (direct data), partial (mixed sources), estimated (heuristic).
Architecture
ensemble-mcp/
src/ensemble_mcp/
server.py # MCP server + tool registration
config/ # Settings, defaults
contracts/ # Response envelope, error taxonomy
memory/ # ONNX embeddings, SQLite vector store, cosine similarity
security/ # Secret redaction, trust boundaries
state/ # Session/step lifecycle, idempotency, locks
tools/ # 19 MCP tool implementations + call-recording utility
installer/ # AI tool detection + MCP registration
dashboard/ # Web dashboard (aiohttp server, JSON API, SPA frontend)
compress/ # Rule-based text compression engine
cli/ # Startup banner
data/ # Bundled agent and skill files
Technology Stack
| Component | Choice |
|---|---|
| Language | Python 3.11+ |
| Distribution | uvx (zero-hassle cross-platform) |
| MCP Framework | mcp (official Python SDK) |
| Embeddings | ONNX Runtime + MiniLM-L6-v2 (~22MB, 384-dim) |
| Vector Storage | SQLite + numpy cosine similarity |
| Tokenizer | HuggingFace tokenizers (for MiniLM input) |
| Package Size | ~90MB (including ONNX + model) |
Local Storage
| Path | Contents |
|---|---|
~/.cache/ensemble-mcp/data.db |
SQLite database (WAL mode) |
~/.cache/ensemble-mcp/models/ |
ONNX MiniLM-L6-v2 model (~22MB) |
~/.config/ensemble-mcp/config.toml |
Global user configuration |
Configuration
Layered config with deterministic merge order:
- Package defaults (built-in)
- Global config (
~/.config/ensemble-mcp/config.toml) - Project config (
.ensemble-mcp.toml) - Environment variables (
ENSEMBLE_MCP_*)
# ~/.config/ensemble-mcp/config.toml
drift_threshold_aligned = 0.25
default_top_k = 5
cluster_similarity_threshold = 0.8
Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
python -m pytest tests/ -v
# Lint
ruff check src/ tests/
# Format
ruff format src/ tests/
# Type check
mypy src/
# Build package
python -m build
Docker
docker build -t ensemble-mcp .
docker run --rm -v ~/.cache/ensemble-mcp:/home/app/.cache/ensemble-mcp ensemble-mcp
Eval Framework
Benchmark harness for measuring tool effectiveness:
# Run eval benchmarks
python evals/runner.py
# Or via pytest
python -m pytest evals/ -v
Supported AI Tools
| AI Tool | Config Format | Auto-Install |
|---|---|---|
| OpenCode | JSON | Yes |
| Claude Code | JSON | Yes |
| GitHub Copilot (VS Code) | JSON | Yes |
| Cursor | JSON | Yes |
| Windsurf | JSON | Yes |
| Devin CLI | JSON | Yes |
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ensemble_mcp-0.1.0b4.tar.gz.
File metadata
- Download URL: ensemble_mcp-0.1.0b4.tar.gz
- Upload date:
- Size: 525.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
218e55a6b5d64d9ad02d4062ca04021c89e6fa6401f9b715413281cb39338092
|
|
| MD5 |
7b0844a01f3cd69526c92d8e6bc4659d
|
|
| BLAKE2b-256 |
310cdcfb6754ac4dc6b0e5583a0c947fb646f1bb269674e7d5f7fe2b7cf6bee8
|
File details
Details for the file ensemble_mcp-0.1.0b4-py3-none-any.whl.
File metadata
- Download URL: ensemble_mcp-0.1.0b4-py3-none-any.whl
- Upload date:
- Size: 152.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
820962de731c8b84f918c9c574a5854275aa2c882ea309fa1dda489b207650ef
|
|
| MD5 |
0e426b942238c45306ad04c5c2bf9cf5
|
|
| BLAKE2b-256 |
6c4d5bee889b18b28aed0efca0969189d54aab3d3d6c808edb7f39830b396970
|