Server data from the Official MCP Registry
Scaffold invite-only Python/FastAPI apps: auth, admin dashboard, dev server, deploy to fly.io.
Scaffold invite-only Python/FastAPI apps: auth, admin dashboard, dev server, deploy to fly.io.
parbaked is a well-structured auth/deployment framework with strong security fundamentals: bcrypt password hashing, JWT with audience-scoped tokens, per-IP rate limiting, CSRF protection, and secure secret handling. Code quality is high with comprehensive test coverage and no evidence of malicious patterns. Minor findings relate to broad exception handling and logging practices that don't materially impact security. Supply chain analysis found 4 known vulnerabilities in dependencies (0 critical, 3 high severity). Package verification found 1 issue.
4 files analyzed · 9 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-saml7n-parbaked": {
"args": [
"parbaked"
],
"command": "uvx"
}
}
}From the project's GitHub README.
The auth, admin dashboard, and fly.io deploy story you'd otherwise write by hand — done. For invite-only Python apps with a small, known audience.
Signup with admin approval, rate limiting, an admin dashboard, and a published off-boarding contract — set up in two commands.
If you ship PoCs on fly.io, two things eventually bite you: anyone on the internet can spin up accounts in a loop (and run up your bill), and you write the same auth boilerplate every time. parbaked is the slice between "I have an idea" and "this is safe to put online."
uv tool install parbaked
parbaked new myapp
cd myapp
parbaked dev
parbaked new scaffolds the project and runs uv sync so the first parbaked dev is instant. Open http://localhost:8000/auth/admin and paste the password from the terminal banner. The admin dashboard, signup/login REST API, and rate-limit middleware are already wired. Drop more .py files in routes/ and they auto-mount.
Once you set PARBAKED_ADMIN_EMAIL, the admin login form switches to a one-time magic-link flow that mails sign-in links to that inbox — no shared password to remember. See Admin auth.
parbaked new scaffoldsmyapp/
├── parbaked.toml
├── routes/
│ └── __init__.py # add .py files here, they auto-mount
├── models.py
├── web/
│ └── index.html # vanilla-JS placeholder — replace freely
├── pyproject.toml
├── .env.example
├── .gitignore
└── README.md
No main.py. No Dockerfile. No fly.toml. The kernel runtime owns the entrypoint; parbaked deploy generates the deploy targets from parbaked.toml. If you ever want to take ownership, parbaked eject hands you everything (see below).
Drop a .py file in routes/ with a module-level router:
# routes/notes.py
from fastapi import APIRouter, Depends
from parbaked import current_user
router = APIRouter()
@router.get("/")
def list_notes(user = Depends(current_user)):
return {"user": user.email, "notes": []}
Restart the dev server (or wait for hot reload) and GET /notes/ returns your handler's response. The auto-discovery rule: file path becomes URL prefix. routes/api/users.py mounts at /api/users. routes/index.py mounts at /.
First-time setup — one command walks you through installing flyctl (if needed), signing in, claiming the app, pushing secrets, and deploying:
parbaked init
parbaked init generates a globally-unique fly app name from your parbaked.toml (<app-name>-<5-char-suffix> — bypasses fly's "name taken" wall on common project names), claims it under your personal org, pushes .env / auto-generated secrets via fly secrets set, then runs the first deploy. The chosen fly app name + first-deploy timestamp are cached to .parbaked/deploy.json, so subsequent redeploys are zero-prompt:
parbaked deploy
That regenerates Dockerfile + fly.toml into .parbaked/build/ from your parbaked.toml, creates the SQLite volume if it doesn't exist, and runs fly deploy against the cached app. The generated fly.toml ships with cost-protection defaults — auto_stop_machines = "stop", min_machines_running = 0, max_machines_running = 2 — so an idle deploy costs nothing and a traffic spike can't autoscale you into a bill.
Other helpers:
parbaked logs # tail fly logs for the cached app
parbaked secrets # push .env entries to fly secrets
parbaked tunnel # cloudflared quick tunnel for sharing localhost
parbaked destroy # permanently destroy the fly app (asks for confirmation)
parbaked init is for the first deploy of a given project. After that, parbaked deploy is the only one-shot you need; the rest are situational. You shouldn't need to run raw fly commands directly — if you do, file an issue.
Every byte parbaked owns is in a public, importable format:
docs/data-format-guarantees.md. Additive changes only between major versions.When you outgrow parbaked, run parbaked eject. You get a parbaked-export/ directory: PostgreSQL-compatible schema.sql, CSV data dumps, the generated Dockerfile + fly.toml, an .env.example listing the env-var contract, and a MANIFEST.md pointing back at the format docs. No vendor-specific decoders. No lobster trap.
Every release adds a section to CHANGELOG.md, and breaking changes ship a migration recipe there.
Everything has sensible defaults. Set in parbaked.toml (non-secret) or via PARBAKED_* env vars (secrets):
| Env var | Default | What it does |
|---|---|---|
PARBAKED_JWT_SECRET | (auto-generated) | Session-token signing key. Required in prod. |
PARBAKED_APPROVAL_TOKEN_SECRET | (auto-generated) | Magic-link signing key. Required in prod. |
PARBAKED_ADMIN_PASSWORD | (auto-generated) | Dashboard login password (no-email mode only — see Admin auth). Ignored when PARBAKED_ADMIN_EMAIL is set. |
PARBAKED_ADMIN_EMAIL | unset | The admin's email address. When set, the admin login form switches to a one-time magic-link flow AND signup-approval emails go to this inbox. |
PARBAKED_APP_NAME | "My App" | Used in email subjects. |
PARBAKED_APP_URL | http://localhost:8000 | Public URL for magic links. |
PARBAKED_RESEND_KEY | — | Set this to send real email via Resend. Unset → emails print to stdout. Get a free key (no card) at https://resend.com/api-keys or run parbaked email setup. |
PARBAKED_MAIL_FROM | onboarding@resend.dev | From address. Default is Resend's sandbox. For real users, verify your domain at resend.com/domains. |
PARBAKED_RATELIMIT_SIGNUP | 5/minute | Per-IP signup limit. |
PARBAKED_RATELIMIT_LOGIN | 10/minute | Per-IP login limit. |
PARBAKED_DATABASE_URL | sqlite:///./parbaked.db | SQLite-only. Standard SQLAlchemy URL. |
Auto-generated secrets get persisted to .parbaked.json (chmod 600). In production, set them as env vars instead.
parbaked has one admin. There are two ways to sign them in, picked per-mode (no hybrids):
PARBAKED_ADMIN_EMAIL is set) — the admin login form asks for the admin email. Submitting the matching address mails a 15-minute magic link to that inbox. Click → admin session cookie set → dashboard. The admin password is unused. Approve / reject buttons in the approval emails still work as before.PARBAKED_ADMIN_EMAIL is unset) — the form asks for the shared PARBAKED_ADMIN_PASSWORD (printed in the boot banner in dev, set as a fly secret in prod). No magic links because there's no transport.Flipping modes is a single env var: add PARBAKED_ADMIN_EMAIL and restart — the login form changes on next boot. No DB migration.
When the admin inbox is unreachable (DNS broke, Resend bouncing, you lost access), shell into the deployment and run parbaked admin signin. It prints a one-time signed URL using the local JWT secret:
# locally
parbaked admin signin
# in prod
fly ssh console -C "parbaked admin signin"
Shell access IS the recovery path; there is no shadow password.
What protects you from a bill:
PARBAKED_ENV=production refuses to boot if any required secret was auto-generated, warns on multi-instance setups, suppresses the admin password in the banner.parbaked assumes one process, one machine — see the single-instance contract in AGENTS.md for what breaks when you scale horizontally.
parbaked dev runs uv run uvicorn parbaked.runtime:create_app --factory (pinning uvicorn + parbaked to the project's pyproject.toml / .venv rather than whatever uvicorn happens to be first on $PATH). For Gunicorn / Hypercorn / Granian, write a 2-line wsgi.py:
from parbaked.runtime import create_app
app = create_app()
Then gunicorn -k uvicorn.workers.UvicornWorker wsgi:app --workers 4. See AGENTS.md for the full advanced section.
The CLI is a uv tool (one-shot scaffold/dev/deploy):
uv tool install parbaked
If you'd rather embed parbaked as a library dependency in an existing project:
uv add parbaked
# or
pip install parbaked
Requires Python 3.11+.
If you want to pull an in-flight alpha or release-candidate (e.g. to test an upcoming 1.4.0a* before it ships stable), opt in with --prerelease=allow and bypass uv's index cache with --refresh:
uv tool install parbaked --prerelease=allow --refresh
# or
uv add parbaked --prerelease=allow
# or
pip install --pre parbaked
These flags are not needed on the stable channel — vanilla uv tool install parbaked is the recommended path.
git clone https://github.com/saml7n/parbaked
cd parbaked
uv sync --extra dev
uv run pytest
Issues and PRs welcome.
Pocketbase is a single Go binary that ships its own auth, admin, realtime, and file storage — drop-and-run. parbaked is a Python scaffolding layer over FastAPI — same single-instance philosophy and admin-dashboard goal, but FastAPI-native (drop in any FastAPI route), no realtime / no file storage primitives, and the data layer is just SQLite + SQLModel so you can parbaked eject to real Postgres without parbaked-specific decoders.
MIT — see LICENSE.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.