SeatPrune: Zero-Config License Reclamation (Worker & MCP Server)
Landing Page Hook: "SeatPrune: The zero-config Cloudflare Worker that audits GitHub, Copilot, and Slack to recover €500+/month in dormant developer licenses."
SeatPrune implements a standardized context-sharing protocol between an Identity Provider (like Okta) and SaaS application utilization logs to audit, reclaim, and downgrade unused or dormant developer seats in real time.
📐 Architecture Flow
sequenceDiagram
autonumber
participant CLI as @seatprune/cli (CLI Client)
participant Worker as seatprune-worker / ghostseat-mcp (Worker)
participant DB as JSON Mock Database (Okta + SaaS Logs)
participant Dashboard as SeatPrune Visual Dashboard
CLI->>Worker: Run npx seatprune audit
Worker->>DB: Query get_okta_users()
DB-->>Worker: Return developer profiles (Active / Suspended)
loop For each developer app (github, copilot, slack)
Worker->>DB: Query get_app_utilization(app_name)
DB-->>Worker: Return usage metadata
end
Note over Worker: Cross-references employee status & activity.<br/>Threshold: Inactive >= 45 days or status == Suspended.
alt Slack License Dormant
Worker->>DB: Call downgrade_profile(slack, email, "Free")
Note over DB: Set Slack tier to "Free" (cost €0/mo)
else GitHub or Copilot License Dormant
Worker->>DB: Call reclaim_license(app, email)
Note over DB: Set seat to "Suspended" (cost €0/mo)
end
Worker->>DB: Call update_financial_registry(app, email, cost, action)
Note over DB: Log savings in Euro (€) & add audit log entry
Note over Dashboard: Dashboard polls seatprune_db.json every 1s
Dashboard->>DB: Fetch database status
DB-->>Dashboard: Return updated DB status
Note over Dashboard: Updates realized savings metrics and log in real time!
🚀 Key Architectural Features
- Standardized Context-Sharing Protocol: Structured JSON schema that maps Okta identity groups (statuses, names, departments) directly to developer tool logs (last active date, cost, tier).
- Worker & MCP Server (
ghostseat-mcp): Runs a FastMCP server exposing database query and reclamation endpoints while hosting the dashboard on port8085. - Package & CLI (
@seatprune/cli): Packaged command execution viaseatprune_cli.py auditimplementing the Antigravity Agent and rule-based fallback controller. - Premium Landing Dashboard: A dark-mode HTML visualizer polling database changes, demonstrating savings (>€500/mo), seat state grids, and real-time audit logs in Euros (€).
🛠️ Exposed MCP Tools & Resources
Tools
get_okta_users(): Returns Okta directories.get_app_utilization(app_name): Returns logs forgithub,copilot, orslack.reclaim_license(app_name, user_email): Deprovisions a user seat (Suspended/€0.00).downgrade_profile(app_name, user_email, target_role): Downgrades user seat (Free/€0.00).update_financial_registry(app_name, user_email, monthly_cost, action_type): Logs monthly and annualized savings.
Resources
seatprune://logs/savings: Retrieves savings registry details.seatprune://audit/summary: Retrieves active seat count and detection summary.
⚡ Running the Simulation
1. Run Scenario Tests
PYTHONPATH=seatprune venv/bin/pytest seatprune/tests/test_seatprune.py
2. Run Scenario Simulation
Run the full scenario validator which resets the database, starts the server, executes the audit CLI command, and checks all savings assertions:
venv/bin/python seatprune/validate_seatprune_scenario.py
3. Start Dashboard Server
Start the server in background:
venv/bin/python seatprune/ghostseat_mcp.py
Open http://localhost:8085 in your browser to view the live dashboard and landing page.
Metadata
Release files for seatprune 0.1.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 | Provenance | Actions |
|---|---|---|---|---|
| seatprune-0.1.0.tar.gz | 204.0 kB | Without provenance | Details for seatprune-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| seatprune-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for seatprune-0.1.0-py3-none-any.whl |
Total release size: 221.1 kB
Release files / seatprune-0.1.0.tar.gz
| Download URL | seatprune-0.1.0.tar.gz |
|---|---|
| Size | 204.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
33b32e2ea9ea5f6e6074e5823e46967e4870c5e9708f5ab2a7a18d30b19076ce
|
|
BLAKE2b-256 checksum How to use checksums |
65bbc0bba1a4fd164b06acf293f634469a5b1c8362cc4b358633e4cd64c7f45c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / seatprune-0.1.0-py3-none-any.whl
| Download URL | seatprune-0.1.0-py3-none-any.whl |
|---|---|
| Size | 17.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
811099b72abf93bbb80cb10baffdc6fce797f1a8794bca09bb0c592ee2a70b3e
|
|
BLAKE2b-256 checksum How to use checksums |
b650409a7283e07359e1103c665329c9d8eec1cc6964fd73a1839e1974ed8fb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for seatprune 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A 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.