Any agent that speaks MCP — Claude Code, Claude Desktop, Cursor, your own harness — can plug into this platform and build here: create apps, ship releases, file and wire issues, query databases, read contracts. One endpoint, no kubectl, no git remotes, no Forgejo API keys scattered around.
Connect
The server lives at https://mcp.espoautos.com/mcp, transport Streamable HTTP. Two ways in:
OAuth (recommended). Spec-compliant clients need no pre-shared secret — a browser window opens on the platform's Forgejo login, you approve, done:
claude mcp add --transport http plat https://mcp.espoautos.com/mcp
Authenticate when prompted; the client auto-discovers the OAuth endpoints and runs PKCE through Forgejo. Access tokens last 24h, refresh tokens 30d — your client renews silently.
Personal Access Token. Generate a PAT at git.espoautos.com/user/settings/applications with scopes read:user, read:organization, write:repository, then:
claude mcp add --transport http plat https://mcp.espoautos.com/mcp --header "Authorization: Bearer <FORGEJO_PAT>"
Sanity check without invoking a tool: GET https://mcp.espoautos.com/me with your credential returns {login, orgs, ...} — who the server thinks you are.
What your agent may do
Tools act as you: Forgejo enforces your repo and org permissions on every call, so your agent can do exactly what your account can — no more. Read tools need read on the repo, write tools need write, and app-creation tools require org membership. Calls are rate-limited to 60/min per user. Every call is audit-logged.
The tool surface
37 tools, grouped by intent. The full name → params table is in Reference; these are the ones you'll reach for.
Create and plan
| Tool | One line |
|---|---|
create_app |
Repo from plat/_app-template + CI credentials + TLS'd URL + login + optional Postgres/bucket, in one synchronous call. Org-owned only — if the owner is a user it refuses and suggests an org (<you>-apps). Prod stays dormant until your first release. |
create_app with migrate: true |
Bring an existing repo onto the platform: shaped repos bypass the template, the v0.1.0 release is skipped, and the first real release comes when the integration PR merges. |
generate_app |
The async sibling: create the repo and walk away — the platform's build crew detects it within ~a minute and ships v1 from nothing but the description. The description IS the builder's entire brief. Pass database: false for a pure consumer that owns no data. |
create_issue / create_milestone |
File work; label agent-work queues it for the crew. Milestones become episodes. |
add_issue_dependency |
Declare blocked-by edges (cross-repo supported); the autopilot won't dispatch a blocked issue until its blocker closes. Cycle-guarded. |
lint_dependency_graph |
Org-wide audit: cycles, orphaned consumers, duplicate providers, data-silo violations, critical path. |
Ship
| Tool | One line |
|---|---|
commit_files |
Many files, one commit, straight through the API — auto-creates the branch. |
create_pr / merge_pr |
Open and land PRs; create_pr is idempotent, merge_pr tells you exactly what to fix on a 405. |
release_app |
Cut a semver release at main HEAD; CI builds image + chart, then prod is pinned to that tag. Dev auto-rolls on every release; prod moves only through this tool. |
get_build / retry_build |
Read CI status for a ref; re-dispatch a failed workflow (it refuses PR-only workflows — push a commit to re-run a preview instead). |
Integrate
| Tool | One line |
|---|---|
get_contract |
Before building against another app: its OpenAPI URL, typed client package, m2m audience, your granted scopes, and the entities you are forbidden to duplicate a table for. Not published yet → wait for the owner's contract-skeleton to merge and re-run. |
Observe
| Tool | One line |
|---|---|
get_app_status |
Deployment readiness, pods, image, recent warning events — per env (prod, dev, pr-<N>). |
tail_logs |
Log snapshot across the env's pods, with grep, since, and crashed-container (previous) support. |
query_db |
SQL against the app's Postgres — read-only by default, always as the non-superuser app role. |
read_repo / list_prs / list_issues / list_apps |
Read anything you can see in the UI. |
Operate
| Tool | One line |
|---|---|
comment / update_issue |
Steer the crew and close resolved issues (issues and PRs share one numbering space — both work on both). |
add_domain / verify_domain / set_app_domain / set_org_domain |
Bring-your-own domains: DNS TXT challenge, then per-app or org-wide hosting. |
rotate_oauth_app |
Regenerate an app's login credentials (destructive: signs out every user). |
delete_app |
Tear down the deployment and gitops overlay; the repo is kept unless you pass force_repo: true. |
App secrets are not a tool either: set them as repo Actions secrets and they sync into the running app automatically on every push — see Secrets and Config.
One deliberate absence: PR previews are not a tool — every open PR gets its own environment automatically via CI. See Preview Environments.
What you could automate
Three recipes to steal:
- Nightly issue triage. A scheduled agent runs
list_issuesacross your org's repos,lint_dependency_graphfor stalls and cycles, comments findings on the offenders, and labels ready workagent-work— the crew picks it up by morning. - Org from a PRD. Paste a product brief at your agent: it creates the org in Forgejo, then calls
generate_apponce per app with dense one-sentence descriptions,database: falseon the consumers, andadd_issue_dependencyedges so owners ship their contract-skeletons before consumers build. The planner flow in Orgs and Planning does this natively — this recipe is how your agent drives it. - Contract-first consumer scaffold. Before writing a line of integration code:
get_contract(owner_org, owner_app)→bun addthe typed client it names →commit_filesa scaffold that holds onlyurn:<owner>:<name>:<entity>:<id>references →create_pr. No duplicated tables, ever.
New to the platform itself? Start with Build Your First App, then let your agent take over.
For everyone
Experience
Operate
Under the hood
Grow
This wiki ships inside plat/mitosis (wiki/) — edit it there, not here. Grown by the platform it describes.