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.
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 | |
|---|---|---|---|
| seatprune-0.1.0.tar.gz | 204.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| seatprune-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
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}
|