sprucelab
Agent-first surface for Sprucelab. One install ships a typed CLI and an MCP server — both wrapping the same public HTTP API. Drop in whichever transport your agent host speaks.
pip install sprucelab
Two transports, one package
sprucelab — typed CLI
For terminal-resident agents (Claude Code, Aider, anything that drives a
shell) and humans at the prompt. Every command supports --json for
machine-readable output; mutations support --dry-run where applicable.
sprucelab auth register --token <YOUR_KEY> --url https://www.sprucelab.io
sprucelab projects list --json
sprucelab files upload ./models/foo.ifc --project-id <uuid> --wait
sprucelab verify --model-id <uuid> --dry-run
Agents move through sprucelab faster than humans do — the rendering is for
humans; agents read the JSON. Once an agent has worked out the right sequence
of calls, the same commands run unattended from cron / GitHub Actions /
Airflow without burning tokens — that's the whole point of headless-first.
The AI budget stays reserved for actual reasoning work (claim extraction,
type classification, verification), not for re-deriving the same script every
run. See sprucelab --help for the full command tree.
sprucelab-mcp — MCP server over stdio
For host-resident agents (Claude Desktop, Cursor, Continue, …) that launch tools as subprocesses and call them as typed tool calls.
{
"mcpServers": {
"sprucelab": {
"command": "sprucelab-mcp",
"env": {
"SPRUCELAB_API_URL": "https://www.sprucelab.io",
"SPRUCELAB_API_TOKEN": "your-token-here"
}
}
}
}
The MCP server is a thin wrapper over the same HTTP surface the CLI talks to — the one advertised at https://www.sprucelab.io/api/capabilities/. No custom protocol, no surprises. If a tool fails, the error body is the literal API response.
Auth
Read-only discovery (capabilities, agent_tools_manifest, EIR catalog,
EIR presets) works without auth on either transport. Everything else needs
a token.
Get one via the web app at https://www.sprucelab.io/agents, then either:
sprucelab auth register --token <YOUR_KEY> --url https://www.sprucelab.io
…or set SPRUCELAB_API_TOKEN in the MCP env block above. The CLI and the
MCP server read the same token store.
For experimentation, the public sandbox token (read-only) is published on https://www.sprucelab.io/agents.
MCP tools
Read-only discovery (no auth):
| Tool | Purpose |
|---|---|
capabilities() |
Fetch the full capabilities manifest. Always start here. |
agent_tools_manifest() |
Fetch /.well-known/agent-tools.json. |
eir_catalog() |
EIR rule grammar — every kind, fields, singleton flag. |
eir_presets(preset?) |
Ready-to-seed EIR bundles. |
Projects + EIR (Bearer):
| Tool | Purpose |
|---|---|
list_projects(), show_project(id) |
Project listing + detail. |
scaffold_project(name, …) |
Create project + seed EIR in one call. |
list_members(id), add_member(id, email, role), remove_member(id, member_id) |
Per-project membership. |
mint_tenant_token(id, name, scope), list_tenant_tokens(id), revoke_tenant_token(id, token_id) |
Project-scoped agent tokens. |
eir_rules(id) |
List the active EIR config's rules. |
eir_apply_preset(id, preset, mode) |
Apply preset in merge or replace mode. |
eir_add_rule(id, kind, config, upsert) |
Append one rule; singleton 409 unless upsert=True. |
eir_remove_rule(id, rule_id) |
Idempotent rule delete. |
eir_set_rules(id, rules) |
Atomic full replace. |
Models + types + verification (Bearer):
| Tool | Purpose |
|---|---|
list_models(project_id?) |
List models in a project. |
list_types(model_id), classify_types(mappings) |
Type list + batch classify. |
verify_dry_run(model_id), verify_model(model_id) |
Verification, with persistence opt-in. |
Files (Bearer):
| Tool | Purpose |
|---|---|
list_files(project_id?), show_file(id) |
List + detail. |
upload_file(project_id, file_path, on_duplicate) |
Multipart upload from a local path. |
reprocess_file(id) |
Trigger a fresh ExtractionRun. |
extraction_log(file_id, run_id?) |
Full ExtractionRun (log_entries + quality_report). |
list_observations(project_id?) |
Layer-1 observation log. |
Issues + scopes (Bearer):
| Tool | Purpose |
|---|---|
list_issues(…), show_issue(id), create_issue(…), update_issue(…), resolve_issue(id) |
Issue CRUD. |
issues_from_verification(model_id) |
Route verification failures into issues. |
list_scopes(project_id, as_tree), create_scope(…) |
Federation scopes. |
Webhooks (Bearer):
| Tool | Purpose |
|---|---|
list_webhooks(project_id?) |
List subscriptions. |
create_webhook(project_id, target_url, events) |
Subscribe + receive signing secret ONCE. |
disable_webhook(id, enable?) |
Toggle is_active. |
delete_webhook(id) |
Permanent delete. |
list_deliveries(id), redeliver(delivery_id), test_webhook(id) |
Delivery log + replay + synthetic test. |
Local-dev surface (sprucelab dev …)
The CLI also ships a dev subcommand that bypasses the API and talks
directly to a local Django install — for working on Sprucelab, not against
prod. Same agent-first invariants (--json everywhere, --dry-run on
mutations).
sprucelab dev env # repo + service status
sprucelab dev db stats --json # row counts for key tables
sprucelab dev db materials --project <uuid> --top 15 # top materials per project
sprucelab dev seed materials --project <uuid> --dry-run # preview seed plan
sprucelab dev test tsc # frontend type-check
sprucelab dev test e2e materials --headed # Playwright smoke
Powered by
Sprucelab's IFC extraction layer is powered by
ifcfast — 25–47× faster than
ifcopenshell on production IFCs. See
https://www.sprucelab.io/benchmarks.
Metadata
Release files for sprucelab 0.1.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sprucelab-0.1.6.0.tar.gz | 150.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sprucelab-0.1.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 248.6 kB
Release files / sprucelab-0.1.6.0.tar.gz
| Download URL | sprucelab-0.1.6.0.tar.gz |
|---|---|
| Size | 150.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cb1831d5e5ae6921ea8b904236efcb70afc79cd32b570bb567e63432e0732d12
|
|
BLAKE2b-256 checksum How to use checksums |
419c48a2225ad75f13c0d5e4666c264cff7c6904850388c1e20485ac2ef58d9e
|
| 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 Aug 1, 2026.
Transparency logRelease files / sprucelab-0.1.6.0-py3-none-any.whl
| Download URL | sprucelab-0.1.6.0-py3-none-any.whl |
|---|---|
| Size | 98.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b912d39e3d6f9d7e3decb14aab29f90551b9a26f75beb9073331bd34fd62a586
|
|
BLAKE2b-256 checksum How to use checksums |
075fabbc352b7fa92673226698716026f62ceb501b5bfb42861a9de898b34847
|
| 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 Aug 1, 2026.
Transparency log