Agents (MCP)
Point an MCP client at a Noite install — the endpoint, the API key, copyable setup, and the tool list.
Noite runs a hosted Model Context Protocol server, so a coding agent can list apps, create one, read its code, follow a deploy, debug it and set variables. The agent runs as the account its API key belongs to, with that account’s collaborator roles.
Endpoint
| URL | https://app.<domain>/mcp (the control UI origin plus /mcp) |
| Method | POST, one JSON-RPC 2.0 message per request |
| Transport | Streamable HTTP in its plain-JSON mode — stateless, no session, no SSE |
| Auth | Authorization: Bearer noite_… |
The server implements protocol revision 2025-06-18 and reports itself as noite. Because the transport is stateless, GET and DELETE answer 405, and a notification answers 202 with no body. A bearer token is required on every request; there is no OAuth and no session.
API key
The key is a normal account API key created on /account with the App Management scope (apps: manage) — the same scope git push uses. A key without it is refused. The key is shown once at creation; keep it secret, since anyone holding it can act as you.
Setup
The Connect an agent card on /account shows all three snippets, filled in with the key you just created and generated from the control UI’s own origin. Paste the one for your client:
Claude Code — one terminal command:
claude mcp add --transport http noite https://app.<domain>/mcp --header "Authorization: Bearer noite_…"
Cursor — .cursor/mcp.json in the project (or ~/.cursor/mcp.json for every project):
{
"mcpServers": {
"noite": {
"headers": {
"Authorization": "Bearer noite_…"
},
"url": "https://app.<domain>/mcp"
}
}
}
Codex — ~/.codex/config.toml (or .codex/config.toml in a trusted project):
[mcp_servers.noite]
url = "https://app.<domain>/mcp"
http_headers = { Authorization = "Bearer noite_…" }
After the key’s first sighting the card shows the placeholder noite_…; mint a new key to get a filled snippet again.
Tools
| Tool | Does | Role |
|---|---|---|
list_apps |
Lists the apps this account can see, with slug, status and URL. | view |
get_app |
One app’s status, your role, URL and git remote. | view |
list_templates |
Lists the templates this Noite ships. | — |
create_app |
Creates an app — blank, a public GitHub import, or a template — and returns push instructions. | app quota |
deploy_status |
An app’s deploy state and recent deploys; poll this after a push. | view |
deploy_log |
One deploy’s build log (the newest by default). | view |
app_logs |
The app’s recent runtime log lines (trailing tail, default 200). | view |
app_errors |
Error issues grouped by fingerprint, with 24-hour counts. | view |
env_list |
Environment variables; values are hidden unless they are 0/1 flags. |
view |
env_set |
Sets an environment variable for the next deploy. | admin |
env_unset |
Removes an environment variable. | admin |
repo_branches |
Branches with tip, last commit and distance from the default branch. | view |
repo_tree |
The file tree at a ref (default: what is deployed, else the default branch). | view |
repo_file |
One file’s contents at a ref. | view |
repo_log |
Commit history, newest first, optionally scoped to a path. | view |
repo_commit |
One commit’s metadata, changed files and patch. | view |
create_app takes a source of blank, { kind: "github", url, ref? } or { kind: "template", template }, and enforces the same per-account app limit as the UI (Limits). A GitHub import obeys the same rules as the UI: public https://github.com/<owner>/<repo> only, one-time copy, 500 MiB and 10 minutes (Create an app).
Pushing instead
create_app is not the only way in. An agent with git access can push to a slug that does not exist yet and create the app that way; it becomes the pusher’s, with them as admin (Create by pushing). For everything else, repo_* reads and the deploy_*, app_* and env_* tools cover the same ground the app detail page does.