Skip to main content

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.

Download files

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

Source Distribution

sprucelab-0.1.6.0.tar.gz (150.4 kB view details)

Uploaded Source

Built Distribution

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

sprucelab-0.1.6.0-py3-none-any.whl (98.2 kB view details)

Uploaded Python 3

File details

Details for the file sprucelab-0.1.6.0.tar.gz.

File metadata

  • Download URL: sprucelab-0.1.6.0.tar.gz
  • Upload date:
  • Size: 150.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sprucelab-0.1.6.0.tar.gz
Algorithm Hash digest
SHA256 cb1831d5e5ae6921ea8b904236efcb70afc79cd32b570bb567e63432e0732d12
MD5 079876b79e5e25cf68c54e596d4374d7
BLAKE2b-256 419c48a2225ad75f13c0d5e4666c264cff7c6904850388c1e20485ac2ef58d9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for sprucelab-0.1.6.0.tar.gz:

Publisher: release.yml on EdvardGK/sprucelab

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sprucelab-0.1.6.0-py3-none-any.whl.

File metadata

  • Download URL: sprucelab-0.1.6.0-py3-none-any.whl
  • Upload date:
  • Size: 98.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sprucelab-0.1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b912d39e3d6f9d7e3decb14aab29f90551b9a26f75beb9073331bd34fd62a586
MD5 b42a90236ee290f84960f4885a393f6f
BLAKE2b-256 075fabbc352b7fa92673226698716026f62ceb501b5bfb42861a9de898b34847

See more details on using hashes here.

Provenance

The following attestation bundles were made for sprucelab-0.1.6.0-py3-none-any.whl:

Publisher: release.yml on EdvardGK/sprucelab

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.6.0 This release

2 files

0.1.5.0

2 files

0.1.4.4

2 files

0.1.4.3

2 files

0.1.4.2

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

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