Security Controls
Nova reaches other services for you: MCP servers you add, their sign-in services, Datadog, and public Helm chart repositories. Each of those addresses comes from a person or from another server, so Nova checks it before it connects. This page says what Nova refuses, what you see when it does, and how to fix it.
All of these controls are always on in Nova Cloud. You cannot turn them off, and you do not need to set anything up for them.
What Nova will not connect to
Nova reaches only public https:// services on your behalf, and checks every address before it connects:
- Public addresses only. Private, loopback, link-local (cloud metadata services included) and reserved addresses are refused, for every address a name resolves to, each time Nova connects. A name that later points somewhere private is refused then.
- No credentials in a URL. An address with a user name or password in it is refused; use the server's authentication setting.
- Redirects are checked too. Each redirect is checked like the first address, and your credentials and headers are never sent on to a different site.
- Header names are checked. Headers that control routing, proxies, cookies or cloud metadata cannot be set.
These checks apply to custom MCP servers and every address their sign-in uses, to Datadog, and to the Helm skill's chart repositories. They are always on, and you do not need to set anything up.
Plan gates
Some skills are Enterprise features. Nova checks your plan in the organization you are working in, on the server, every time:
| What you do | Plan needed | Checked when |
|---|---|---|
| Add, change, test or remove a custom MCP server, discover its tools, or connect it with OAuth | Enterprise | Every request |
| Connect a skill from the catalog, or update its connection | The plan the skill lists (for example, Datadog needs Enterprise) | When you connect or update it |
| Use a skill's tools | The plan the skill lists | When Nova loads your skills |
If Nova cannot read your plan for a moment, it refuses with a request to try again rather than guessing.
The Helm skill
The Helm skill finds public charts and shows their metadata, values and rendered manifests. It is limited to that:
- Public sources only. A chart repository, or a chart given as an address, must be
https://oroci://and pass the address checks above. Otherwise a chart is a plain name, such asnginxorbitnami/nginx. A file path is refused. - Only the arguments the tool declares. Nova refuses any argument a tool does not list. A values file Nova uses is one it wrote itself for that run.
- Nothing of Nova's. Helm runs without any of Nova's credentials or settings.
- Files stay in their folder. When Nova checks a chart it wrote with you, every file stays inside that chart's own temporary folder. Absolute paths and
..are refused.
Signing in to a service (OAuth)
When you connect Slack, Datadog or a custom MCP server with OAuth, Nova signs the sign-in request so that only the request it started can complete. In Nova Cloud the signing key is managed for you. If it is ever missing, Nova does not start the sign-in at all rather than use a weaker key.
When a sign-in fails, Nova tells you which step failed in its own words. What the other service answered is kept in Nova's logs and is not shown in the browser.
Error codes and how to debug a refusal
Each refusal has a code. Find the code or message you see, then follow the fix.
Address refusals (EGRESS_BLOCKED)
A connection test shows the code EGRESS_BLOCKED, and a sign-in or chat answer shows one of these messages:
AAAA) records.https:// (for Helm, not https:// or oci://).https:// address. If the server redirects to http://, fix the redirect on the server.user:password@.X-API-Key or Authorization.Header names (header_name_not_allowed)
Adding or changing a custom MCP server fails validation with the reason header_name_not_allowed and the message "Nova does not send the header name". Choose a different name for the API key header or the connection header; most servers accept the key in X-API-Key or Authorization.
Server address rules when you add a server
Adding a custom MCP server fails validation with one of: HTTPS required, Private IP, Blocked host, No credentials in URL, or URL cannot contain a placeholder. Use a public https:// address without credentials or ${...} placeholders.
Connection test codes
The connection test when you add a custom MCP server answers with one of these codes. The message is always Nova's own sentence; what the server answered is not shown.
| Code | What to check |
|---|---|
AUTH_FAILED | The API key or token is wrong or expired. Paste a fresh one, or reconnect with OAuth. |
ACCESS_DENIED | The credential works but lacks permission. Check its scopes on the server. |
TIMEOUT | The server did not answer in time. Check that it is up and reachable from the internet. |
CONNECTION_REFUSED | Nothing is listening at that address and port. |
HOST_NOT_FOUND | The name does not resolve. Check the spelling and the DNS record. |
EGRESS_BLOCKED | See Address refusals. |
CONNECTION_ERROR | Anything else, most often a URL that is not an MCP Streamable HTTP endpoint. Check the endpoint path (often /mcp). |
OAuth sign-in reasons
A failed Connect with OAuth shows a message and one of these reasons:
url_refusedhttps:// address.no_metadataregistration_unsupportedregistration_failedsession_expiredtoken_exchange_failedEGRESS_BLOCKEDIf Connect for Slack or Datadog fails with "Failed to start OAuth flow" every time, the sign-in signing key may be missing. Contact support; nothing on your side needs to change.
Helm (HELM_SOURCE_REFUSED)
Nova reports HELM_SOURCE_REFUSED with the reason. Use a public https:// or oci:// repository and give the chart as a plain name.
File paths (FILE_PATH_REFUSED)
Nova writes the files of a chart, module or manifest set into a private folder before it checks them, and refuses any path that could land outside it. A generated artifact shows the reason under its failed checks; the Helm skill reports FILE_PATH_REFUSED with it.
templates/deployment.yaml. Absolute paths, backslashes and a path that names no file are refused the same way.a and a/b.yaml cannot both exist.Plan (requires_upgrade, plan_unavailable)
| Code | Status | Meaning | Fix |
|---|---|---|---|
requires_upgrade | 403 | Your plan in this organization does not include this skill or feature. The message names the plan it needs. | Upgrade the organization, or switch to an organization on that plan. |
plan_unavailable | 503 | Nova could not read your plan just now. | Try again in a moment. |