Skelpr
Budgeted, cited repository evidence for coding agents and code review.
| Historical Sock Shop MCP A/B | Agent without Skelpr | Agent with Skelpr |
|---|---|---|
| Agent tokens | 766k | 312k (−59%) |
| Cache-read tokens | baseline | −69% |
| File reads | 113 | 27 (−76%) |
| Accuracy (per-task checklist) | 619 / 700 | 621 / 700 — no loss |
Skelpr gives coding agents budgeted repository evidence with source citations. Query retrieval combines BM25, symbol and file lookups, and available vector results. Parser-backed function boundaries and indexed source relationships help select relevant code. See the architecture diagrams.
Contents
- Quick start · Install and upgrade · Requirements
- MCP integration · CLI commands · Troubleshooting
- Architecture and docs · Development · Support · License
- Sock Shop comparisons · Django case study
Quick start
Install Skelpr and activate this machine before indexing. Start Docker for skelpr setup.
pip install "skelpr[mcp,postgres,vector,ast]"
skelpr activate <token>
skelpr license
cd <your-repo>
| Mode | Setup command |
|---|---|
| Coding agent | skelpr setup --no-configure |
| Standalone CLI | skelpr setup in an interactive terminal |
Start the configured embedding endpoint before indexing. The default is a local OpenAI-compatible endpoint on port 1234. See MCP setup for agent registration and the tester guide for persistent storage without Docker.
skelpr init
skelpr index
- Coding agent: Run
skelpr install-mcp, then reconnect the agent. - Standalone CLI: Try
skelpr ask "how does authentication work?".
Interactive CLI model configuration
skelpr setup verifies generation and embeddings, then saves verified settings.
skelpr init writes .skelpr.yaml from them. For provider options, credential storage,
or scripted setup, see configuration.
Why Skelpr?
- Cited source for answering questions, reviewing changes, and preparing edits.
- Bounded context with function-level evidence where parser support allows it.
- Native fallback when an agent needs evidence outside the returned spans.
Two integration modes
Use Agent (MCP) when your coding agent supplies generation. Pick Standalone when you want Skelpr to call your configured generation provider.
| Agent (MCP) | Standalone Package | |
|---|---|---|
| What you get | Surgical codebase access for your existing agent | Full ask/review/fix/validate pipeline |
| Generation | Provided by the agent | Provided by your configured endpoint |
| Commands | Agent calls MCP tools | skelpr ask/fix/review/validate |
| Retrieval | Skelpr (same engine) | Skelpr (same engine) |
| Embeddings | Local or hosted, for vector retrieval | Local or hosted, for vector retrieval |
| Best for | Enhancing Claude Code, Cursor, Windsurf, etc. | Self-contained coding assistant |
🧩 Mode diagrams, the shared retrieval engine, and the fallback hierarchy: docs/ARCHITECTURE.md
MCP integration
After quick start, use skelpr install-mcp --agent <id> to target
one client, or --project-level for a supported repository-local config.
Available MCP tools:
skelpr_search— Budgeted code evidence from BM25, symbol and vector retrieval with RRF, plus focused lookup and edit evidence where supported. Pass{"query": "your question"}. For explicit live file or text checks, useverification.skelpr_get_context— Budgeted context (default 4000 approximate tokens,top_k=8); usemissing_evidenceandexclude_span_idsfor focused follow-ups. Whole functions may be omitted if they cannot fit.skelpr_find_symbol/skelpr_dependencies— Symbol definition and location lookup; structural relationships and dependenciesskelpr_validate— Run configured validation in Docker or with explicitly enabled host fallbackskelpr_apply_ast_patch— Generate a unified diff for review and separate applicationskelpr_health— System health and backend status
📚 Manual registration, project-level config, and troubleshooting: docs/MCP_SETUP.md
Install
# Wheel only, published to PyPI, so a plain `pip install skelpr` resolves anywhere.
pip install skelpr
pip install "skelpr[postgres,vector,ast,server]" # production backends
pip install "skelpr[mcp]" # MCP server support
pip install "skelpr[all]" # everything
# From source — the repository is private, so this needs access to it:
git clone https://github.com/skelpr-thrive360/skelpr.git skelpr && cd skelpr
pip install -e ".[all]" # editable dev install
pip install -e ".[dev]" # + pytest/ruff/mypy
Installing is public; running is licensed. The wheel is published to PyPI, wheel-only, so
pip install skelprworks on any machine with nothing else to configure. There is no source distribution, sopip install --no-binary skelpris unsupported. A machine still needsskelpr activate <token>, and each activation spends a seat. Distribution detail: docs/DISTRIBUTION.md.
Activation. Installing needs no account; running does. One token per person, one seat per machine:
skelpr activate <token>, thenskelpr licenseto check it. Everything else — seats anddeactivate, the lease and its renewal, the environment overrides, and the limits of the mechanism — is in docs/ACCESS.md.pip→activate→license, plus the vendor's half of the handover, is one page: docs/HANDOVER.md.
Upgrading
skelpr upgrade --check # what is published vs what you run (exit 1 when one is available)
skelpr upgrade # install it, through pip, pipx or uv — whichever owns the install
skelpr license also says when a newer release exists. The check is one request a day at
most, never installs anything by itself, and is switched off by SKELPR_NO_UPDATE_CHECK=1 —
for a CI job, or anyone who would rather this build asked nothing. A machine set to
SKELPR_OFFLINE=1 never checks at all.
Restart after upgrading. The files on disk change; the processes already running do not.
Your agent holds the MCP server in its own process, and skelpr watch/skelpr serve are
daemons — each keeps running the old code until it is restarted. Run skelpr index as well if
the release notes mention indexing or embedding changes. An editable install is refused on
purpose: skelpr upgrade never replaces a working copy, so a checkout is updated with git.
Why no auto-update: an unattended upgrade would swap the package under a live MCP server, change what a lease unlocks mid-session, and land migrations against a database the user is running. Better a notice nobody can miss than a version nobody chose.
Requirements
| Requirement | Needed for | Notes |
|---|---|---|
| Python ≥ 3.10 | everything | |
git on PATH |
diff / review / patch | degrades without it for index / ask |
ripgrep |
Live MCP checkout verification and literal scan helpers | Optional for ordinary BM25 query retrieval |
| Docker Desktop, running | skelpr setup, sandboxed validate |
Start Docker Desktop first. skelpr setup checks the daemon, starts Postgres (5434) and Qdrant (6333/6334), and builds skelpr-runner:latest. Memory storage is process-local; host validation requires explicit local-fallback permission. |
| An embeddings server | skelpr index + vector retrieval, in both modes |
LM Studio serving text-embedding-nomic-embed-text-v1.5 (GGUF Q8_0, ~146 MB) at http://127.0.0.1:1234/v1 is the default. Any OpenAI-compatible /v1/embeddings you host works. |
| A generation model server | ask / fix / review / chat (CLI mode) |
LM Studio serving qwen2.5-14b-instruct, or a cloud provider key. Not needed in MCP mode — the agent brings its own model. |
Local models
The default endpoint is http://127.0.0.1:1234/v1.
| Job | Default model | Used for |
|---|---|---|
| Embeddings | text-embedding-nomic-embed-text-v1.5@q8_0 |
Indexing and vector search |
| Generation | qwen2.5-14b-instruct |
Standalone CLI and model-backed HTTP routes |
- Local: Load the models in your server and match its advertised IDs in
.skelpr.yaml. - Hosted: Set the provider and credentials before indexing. An eligible Skelpr lease can mint a credential for the hosted embedding endpoint.
- Endpoint unavailable: Keyless, non-strict initialization can use hashing. Strict indexing needs a working endpoint. BM25 and symbols can still supply search evidence.
See the model configuration guide for setup and verification.
CLI commands
Core
| Command | What it does |
|---|---|
skelpr setup |
Start Docker services (Postgres + Qdrant) and build the sandbox image |
skelpr init |
Create .skelpr.yaml configuration |
skelpr index |
Build/refresh hybrid knowledge base |
skelpr watch |
Index once, then keep both stores fresh in the background: re-embeds changed/removed files and detects clean branch switches (off by default inside serve/MCP — enable with indexing.watch.enabled or SKELPR_AUTO_REINDEX=1) |
skelpr ask |
Ask grounded questions about the repo |
skelpr chat |
Interactive loop for ask/fix (no shell quoting needed) |
skelpr context |
Export token-optimized context chunks to stdout |
skelpr review |
Review a git diff and emit structured findings |
skelpr fix |
Diagnose an issue and generate a minimal patch |
skelpr validate |
Run configured test/lint/typecheck in sandbox |
skelpr serve |
Start the local FastAPI server |
skelpr doctor |
Diagnose the install: repository rows, corpus, freshness, backends, agent wiring. Read-only; exits 1 when something needs fixing |
MCP
| Command | What it does |
|---|---|
skelpr install-mcp / skelpr uninstall-mcp |
Configure/remove the MCP server for detected agents |
skelpr register-agent |
Register a custom MCP-compatible agent (e.g. Antigravity, Devin) |
GitHub integration (opt-in)
| Command | What it does |
|---|---|
skelpr github setup |
Configure GitHub PR review automation (manual/automatic modes) |
skelpr github status |
Show current GitHub review automation status |
Troubleshooting: retrieval returns nothing
- Check that MCP reports the repository you intended to search.
- Run
skelpr doctorfrom that repository. Add--verboseto see passing checks. - Check index freshness and storage. An index built in memory disappears when its process exits.
- Refresh the index if diagnostics show it is missing or stale.
doctor reports duplicate repository rows and backend problems without repairing them.
See MCP troubleshooting.
FAQ
Do I need Docker? Retrieval supports in-memory fallbacks, which do not persist between processes. Docker adds PostgreSQL/Qdrant and isolated validation. Validation without Docker requires sandbox.allow_local_fallback: true and runs on the host.
Do I need an LLM API key? CLI mode: yes — a cloud key or a local OpenAI-compatible server. Agent mode: no — the agent brings its own LLM; local embeddings via LM Studio make the whole setup keyless.
Which languages does it support? AST extraction uses supported tree-sitter grammars with regex fallback. BM25 is language-agnostic; complete-function and dependency analysis depend on parser support, with Python, TypeScript/JavaScript and Go regression fixtures.
Which agents work out of the box? skelpr install-mcp can detect Codex, Claude Code, Cursor, Windsurf, and other supported clients. Codex setup uses its own CLI at user scope. See MCP setup for the client list and manual registration.
How is this different from plain embedding RAG? Skelpr combines BM25 and vector candidates through RRF while preserving explicit symbol/file lookup intent. Bounded import/reference tracing and function-level selection provide cited evidence. Indexed and live-checkout results each describe the scope that was checked. See retrieval design.
⚡ Measured impact
Historical Sock Shop MCP A/B: −59% agent tokens · −76% file reads · accuracy 619 → 621 / 700. See the separate ten-task Django case study for Codex results and methodology.
Self-reported benchmarks: per-task tables, verbatim outputs and the "run it yourself" guide are in docs/BENCHMARK.md; every answer side by side in docs/comparisons/COMP_ANTIGRAVITY.md, and the Codex run in docs/comparisons/COMP_CODEX.md.
Agent mode · A/B: what happens to a real coding agent (MCP integration)
7 tasks x 2 arms (Antigravity · Gemini 3.6 Flash Medium + Skelpr MCP vs. native tools only) on the Sock Shop microservices demo:
- 🧠 Tokens: -59% (766k → 312k) — cache-read tokens, the biggest quota consumer, drop -69%
- 📖 File reads: -76% (113 → 27) — one
skelpr_search(median 0.54s) replaces ~4 native file reads - 🎯 Accuracy: no loss (619 → 621 / 700, every task within the ±5 tolerance) — the run-1 gaps this engine was built to fix (Helm/ingress, the healthcheck step, 3 of 5 image sites) are closed and all 5 image sites are recovered. Not a clean sweep: two single checklist facts traded the other way (session-db ↔ Makefile; kube-state-metrics), and both arms miss the negative task's phrase (60/60). Token and file-read savings are unaffected.
CLI mode · Standalone: agentic multi-turn vs. the hybrid engine
| Pipeline Strategy | Avg. Latency | Avg. Total Tokens | Avg. Cost / Query | Accuracy (0-100) | vs. Agentic Multi-Turn |
|---|---|---|---|---|---|
| Agentic Multi-Turn | 24.39s ⚠️ | 7,573 | $0.00200 | 88.4 / 100 | reference |
| Skelpr Hybrid Engine | 28.90s ⚠️ | 3,925 (−48%) | $0.00099 (−50%) | 85.1 / 100 | 48% fewer tokens · 50% cheaper · 4 of 7 tasks tied |
Same 7 questions, same model (
openai/gpt-oss-120bon Groq), same checkout, scored by the deterministic per-task checklist (0-100); per-task detail in docs/BENCHMARK.md. The hybrid engine retrieves pre-ranked, cited chunks in one pass — one model call per task instead of two — which is where the token and cost savings come from. ⚠️ The latency figures include Groq free-tier rate-limit backoff (the Skelpr arm ran second and absorbed the waits): on the task with no throttling it answered in 1.56s vs 3.55s. Accuracy is near-parity, not better: 4 of 7 tasks tie and the agentic reference leads the other three by 5-10 points.
👀 See it in action
Historical output from the A/B harness (Sock Shop, 2026-09-24, WITH arm). The agent asks whether a recommendations service exists. This older build included a graph summary in search results. Current query retrieval uses the pipeline shown in the architecture guide.
$ skelpr_search "recommendation recommendations inventory service" --top-k 10
## Skelpr Search Results — 10 chunks
[GRAPH] .skelpr/graphify/summary.txt:1-2 architecture graph summary
[LEXICAL] deploy/kubernetes/autoscaling/grafana-service.yaml:1-23 matched 1/4 terms, filename matches 'service'
[LEXICAL] deploy/kubernetes/autoscaling/heapster-service.yaml:1-17 matched 1/4 terms, filename matches 'service'
[LEXICAL] deploy/kubernetes/manifests/02-carts-svc.yml:1-5 ...
$ skelpr_search "recommendationservice inventoryservice recommendation inventory" --top-k 10
## Skelpr Search Results — 1 chunk
[GRAPH] .skelpr/graphify/summary.txt:1-2 architecture graph summary
The agent reported no recommendations service after three searches and one file read. Both arms scored 60/100 because the evaluator required the phrase "does not exist". Current indexed results describe the indexed scope. For explicit live-checkout text and path checks, use MCP verification. The historical answers are in the benchmark report.
Roadmap
- Full deployment isolation for filesystem and sandbox execution (metadata has RLS; Qdrant collections are already tenant-specific)
- More agents pre-registered in
install-mcp - Repeat-run the A/B arms to quantify single-run variance (the fix task has scored 84 / 92 / 84 across identical runs)
Development
pip install -e ".[dev]"
pytest tests/ # run all tests
pytest tests/retrieval/test_indexing.py tests/retrieval/test_retrieval.py tests/mcp/test_mcp_server.py
Test coverage: 92.08% of skelpr, statements and branches, measured with
pytest --cov=skelpr --cov-report=term-missing. CI gates on an 80% floor
(--cov-fail-under=80), so a patch that quietly stops testing something fails the build.
The badge and this figure are rewritten from the coverage report after every merge to
main, so neither is hand-typed.
- Test the MCP server:
python -c "from skelpr.integrations.mcp_server import skelpr_health; print(skelpr_health())", or via the MCP Inspector:npx -y @modelcontextprotocol/inspector@latest python -m skelpr.integrations.mcp_server(connection, health, retrieval, symbols, dependencies, and validation verified). - Observability — optional Langfuse tracing for retrieval benchmarking; each
skelpr_get_contextcall produces a trace with retrieval metrics, timing, context size, and backend status. See docs/observability-and-beta-testing.md. - Benchmarking — an agent-agnostic A/B harness (Antigravity/Cursor/Codex) with per-arm artifacts: benchmarks/README.md, docs/BENCHMARK.md, and the WITH/WITHOUT answers in docs/comparisons/ (one
COMP_<AGENT>.mdper agent). - Plan board — the shortlist of next work as a checkbox list, with one detail file (why now, what to build, done-when) per item: NEXT_STEPS/README.md.
Docs
| I want to… | Read |
|---|---|
| Set up an agent | MCP setup |
| Configure models or storage | Configuration |
| Understand the engine | Architecture diagrams · Retrieval design |
| Check measured results | Django evidence · Sock Shop report |
| Find another guide | Documentation index |
Maintainer development
Maintainers with repository access can find setup and pre-merge checks in the development guide.
Support
Skelpr is sold and supported directly by its vendor: access, seat changes, renewals and bug reports go back through the contact that issued your token, not a public tracker.
- Security: report privately — SECURITY.md says how.
- Response expectations: SUPPORT.md · What is stable: docs/STABILITY.md
License
Proprietary. Skelpr 0.1.2 and later are licensed under the Skelpr End User License Agreement: running needs an access token, the token is issued to a person, and activating a machine spends one of its seats.
Versions 0.1.0 and 0.1.1 were published under Apache-2.0 and remain governed by it — an irrevocable grant that the later change of license does not touch, and that no withdrawal can take back. Those two releases have been taken out of the project's distribution; what that does and does not reach is in docs/DISTRIBUTION.md, and the Apache-2.0 text is kept at LICENSES/Apache-2.0.txt.
See NOTICE for attribution and THIRD_PARTY_NOTICES.md for the dependencies, the benchmark corpus and the model output quoted in the docs.
The release process is in docs/RELEASING.md; releases are the
git tags on main.
Additional benchmark: Django Q1/Q2/Q3 — 2026-11-02
This is a separate, completed single-run Codex comparison, not a replacement for the
historical results above and not evidence of general performance. Run with gpt-6.1-sol at low reasoning; comparable
frozen native baselines were reused for Q1/Q2, Q3 used a fresh pair, native fallback was
allowed and there were no retries. Detail: the
report, protocol, scores and six verbatim answers
and the verification and archive.
| Question | Native total tokens | Skelpr total tokens | Savings | Accuracy native → Skelpr | Latency native → Skelpr |
|---|---|---|---|---|---|
| Q1: qualified-symbol lookup | 14,944 | 13,997 | 6.34% | 3/3 → 3/3 | 24.80 → 42.23 s |
| Q2: multi-file execution flow | 46,686 | 27,322 | 41.48% | 23/24 → 24/24 | 64.33 → 69.75 s |
| Q3: architecture comparison | 42,919 | 43,452 | 1.24% overhead | 23/30 → 25/30 | 40.10 → 82.41 s |
| Overall | 104,549 | 84,771 | 18.92% | Different per-question rubrics | 129.23 → 194.39 s |
Savings sum input and output tokens, cached input included. Native reads fell 22 → 8, model requests 10 → 9, evidence tool calls 7 → 6; cached input 60,672 → 54,272, uncached 41,715 → 28,648. Provider cache state was uncontrolled, so this is not a billing-cost measurement, and Q1's uncached input rose.
Mixed verdict: Q1 and Q2 passed; Q3 missed both goals, with each answer below the frozen 27/30 threshold and total latency up 50.43%. Transaction behaviour stayed incomplete and available evidence went unused, across fallback calls Q3 needed for missing architecture detail. Direct MCP coverage was Q1 3/3, Q2 8/8 and Q3 five complete / five partial; accurate citations and untruncated functions did not close Q3's selection and dependency gaps, and the fixed budgets were not raised. Repeat runs across repositories are needed before generalising.
Django case study · 10 Codex tasks · 2026-11-09
Across ten matched comparisons on the public Django checkout, Skelpr MCP reduced total tokens by 37.27% and native search or read calls from 28 to 9. Combined rubric scores rose from 89/96 to 91/96, and model requests fell from 41 to 31.
| Task | Total tokens native → Skelpr | Token savings | Rubric native → Skelpr | Wall time native → Skelpr |
|---|---|---|---|---|
| Q1 · Middleware lookup | 14,203 → 13,530 | 4.74% | 3/3 → 3/3 | 38.87 → 55.39 s |
| Q2 · Request execution flow | 47,406 → 28,931 | 38.97% | 24/24 → 24/24 | 56.90 → 50.54 s |
| Q3 · WSGI and ASGI architecture | 63,091 → 29,474 | 53.28% | 26/30 → 27/30 | 61.67 → 56.48 s |
| Q4 · QuerySet.exists() behavior | 24,509 → 13,043 | 46.78% | 5/6 → 6/6 | 33.18 → 29.37 s |
| Q5 · Custom CSRF header test | 23,552 → 13,260 | 43.70% | 6/6 → 6/6 | 27.19 → 23.69 s |
| Q6 · Verify absent integrations | 34,206 → 31,154 | 8.92% | 5/6 → 5/6 | 49.72 → 52.81 s |
| Q7 · Cache Vary impact | 71,294 → 44,562 | 37.50% | 7/8 → 7/8 | 61.64 → 70.21 s |
| Q8 · Fix URL scheme validation | 60,019 → 39,048 | 34.94% | 2/2 → 2/2 | 72.63 → 63.64 s |
| Q9 · Savepoint commit hooks | 46,805 → 25,573 | 45.36% | 8/8 → 8/8 | 63.25 → 64.77 s |
| Q10 · Fix multi-batch prefetch | 52,912 → 36,174 | 31.63% | 3/3 → 3/3 | 69.37 → 54.36 s |
| Overall | 437,997 → 274,749 | 37.27% | 89/96 → 91/96 | 534.40 → 521.25 s |
Total tokens include input and output, with cached input counted. Uncached input fell from 134,804 to 87,110 with uncontrolled provider cache state. Wall time includes startup and shutdown. Six tasks finished faster, and summed wall time fell 2.46%. Native search or read counts exclude test runs.
The case study uses Codex CLI with high reasoning and matched settings within each pair. It reports one retained comparison per question across successive Skelpr builds. The questions informed retrieval tuning, and Q8 and Q10 used intentionally seeded defects in isolated Django copies. These observed results describe this case study. A release-wide estimate would require a fresh run on one frozen build and unseen tasks.
Metadata
Release files for skelpr 0.3.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| skelpr-0.3.5-py3-none-any.whl | Python 3 | none | any | Details for skelpr-0.3.5-py3-none-any.whl |
Release files / skelpr-0.3.5-py3-none-any.whl
| Download URL | skelpr-0.3.5-py3-none-any.whl |
|---|---|
| Size | 519.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
72a508ab502fe41bb22678673b80ab8cb6b36ad5680a9527e1df1f778302fb71
|
|
BLAKE2b-256 checksum How to use checksums |
684824834ac4dd152e1fe61f2195ae31909fe542035259d5b2044eda1e698785
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 10, 2026.
Transparency logSecurity for skelpr 0.3.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
1 file in this release has been uploaded with provenance metadata.
Attestation for skelpr-0.3.5-py3-none-any.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 10, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.