Platform

Platform overviewWorkflow orchestrationGitOps configurationGovernance and AAAAI and MCPRuntime and executionEvidence and monitoring

Use cases

All use casesProduction incidentRelease preparationHotfix to productionSecurity scan triage
Why NopsAIIntegrationsSecurity

Resources

All resourcesAI agent governanceMCP governanceMCP securitySelf-hosted platforms
Pricing

Company

How a run worksAboutContactBook a demo

MCP

MCP security for production environments

Transport, credential references, tool allowlists, confirmation modes and audit — the controls that matter when an MCP server can reach production.

Treat an MCP server as a privileged integration

An MCP server that can reach production is infrastructure with production access. It deserves the review any such integration would get: who operates it, what it can reach, which credentials it holds, how it is upgraded and what happens when it is compromised.

The lightweight developer experience is a feature during prototyping and a liability if it carries into production unexamined.

Credentials by reference, never by value

Workflow definitions should carry a stable credential reference, not a secret. Values belong in an encrypted, versioned registry with access logging, so that rotating a credential does not require editing every workflow that uses it — and so that reading a repository does not disclose one.

Allowlists over discovery

Constrain profiles to named servers and named tools. Broad discovery is convenient during development and unjustifiable in production, where the practical question is not what the server offers but what this step is permitted to call.

Pair the allowlist with live authorization: the list says what is possible, the policy decides what is permitted for this caller right now.

Confirmation modes and redaction

Side-effecting operations should require explicit confirmation, and configuration changes should be proposal-only — a commit-ready plan a human merges, not a silent mutation.

Resolved secrets must be masked from agent logs and execution history. An audit trail that leaks the credential it was recording is worse than no audit trail at all.

The threat model, stated plainly

It helps to name what you are defending against, because MCP security discussions otherwise drift into generalities. There are four realistic threats, and they need different controls.

A malicious or compromised server returning crafted content. A legitimate server reached by a caller who should not have reached it. A compromised reasoning step driving legitimate tools toward damage. And credential exposure through logs, outputs or the context window.

Only the second is an access-control problem in the ordinary sense. The other three are why transport security and authentication, on their own, are not a sufficient answer.

Tool output is untrusted input

This is the control most often missing. Everything an MCP server returns enters the model's context, and a model does not reliably distinguish data from instruction. A tool result containing text shaped like a directive is, functionally, an injection attempt with a trusted-looking delivery path.

You cannot solve this at the prompt layer, and attempts to do so tend to produce false confidence. The defensible position is to assume some tool output will eventually be hostile and to constrain what the reasoning step can do in response.

Concretely: if the step that reads external content holds only read-only tools, hostile content produces a wrong answer rather than an action. Separating retrieval from mutation across different steps with different profiles is the single highest-value structural control available.

Transport and authentication choices

Prefer authenticated HTTP transports with a declared endpoint and a declared authentication type over anything that relies on ambient trust. A server reachable without authentication because it happens to sit on an internal network is trusting the network to be a boundary it has not been for some time.

Set explicit timeouts. An unresponsive server is a more common failure than a malicious one, and without a timeout it consumes budget and holds a run open while producing nothing.

Be deliberate about locally hosted servers. Inside a container, localhost is the container itself; reaching a server on the host generally requires a LAN address or the platform's host alias. This trips people up in exactly the situation where they are least likely to be paying attention — moving something that worked locally into a deployed environment.

Credential custody in detail

"By reference, not by value" is the headline, but the detail is where the security actually lives. A credential registry worth relying on offers envelope encryption with per-version data keys, immutable versions with activation and rollback, expiry, and a log of every consumer that resolved each version.

Purpose-bound resolution matters as much as encryption. A credential resolved for a webhook signature check should not be resolvable by an unrelated tool call. The narrower the resolution contract, the smaller the consequence of any single mistake.

A small set of bootstrap material has to sit outside this model — database authentication, the root key that decrypts everything else, service identity material. That set should be explicitly enumerated, delivered by the deployment platform's own secret mechanism, and unwritable through application configuration. A credential system that can be reconfigured through the interface it protects is not one.

What redaction actually has to cover

Masking secrets in the run log is the obvious half. The less obvious half is everything else that persists: step outputs, error messages, cached tool responses, the context window snapshot, and any evidence record that captures what the model was working from.

Sensitivity should travel with the value rather than being applied at each display point. If a run detail view exposes output names, sizes and sensitivity flags but not stored values, a reader gets the operational information they need without the platform having to decide, per surface, what is safe to render.

Error paths deserve specific attention, because they are written by whichever library failed and rarely reviewed with disclosure in mind. A connection error that helpfully includes the full request URL has disclosed a bearer token in a query string more than once.

Blast radius: assume one server is compromised

The useful exercise is not whether a server can be compromised but what follows if one is. Take each registered server and ask: which scopes could select it, which callers fall inside those scopes, which resources could those callers reach, and what would the record show afterwards?

The answers are frequently worse than expected, usually for a mundane reason — a profile approved for one team accumulated scope over time because it existed and worked.

Two structural mitigations do most of the work. Scope profiles narrowly enough that a compromise is contained to one team and one environment. And keep the write-capable profile separate from the read-only one even when they share a server, so the broadly available surface is also the least consequential one.

Upgrade and supply chain

An MCP server is software with production access, and it gets updated. The questions are the ordinary supply-chain ones, which is precisely why they get skipped: who publishes it, how versions are pinned, what a review of a version bump involves, and whether a compromised update would be noticed.

Third-party servers deserve the same treatment as any third-party dependency with production reach. First-party servers deserve the same treatment as any internal service — including the observation that "we wrote it" is a statement about origin, not about current behaviour.

Licensing is a real consideration too, particularly for anything redistributed. A profile can reference a customer-provided or externally hosted server without the platform bundling that server's code, prompts, schemas or data — and keeping that line clear avoids a category of problem that surfaces at the worst possible moment, during procurement.

A pre-production checklist

Before a server reaches production, some questions are worth answering in writing. Is the transport authenticated and the endpoint declared? Is there a timeout? Does the credential resolve by reference, purpose-bound, with rotation available?

Is the profile constrained to named tools rather than a wildcard? Which scopes can select it, and did someone approve each? Are mutating tools behind explicit confirmation, and are destructive operations behind dedicated paths?

Does any step that reads untrusted content hold write-capable tools? Are resolved secrets masked in logs, outputs and errors? And can you produce, from one record, what a given run called and what came back?

Nine questions. A server that answers all nine is in reasonable shape. One that cannot answer the first four is not ready for a production scope, however useful it looked in development.

Where this leaves you

MCP is a good protocol and the ergonomics are genuinely valuable. The security work is not about resisting it; it is about recognising that a low-friction way to give a model capabilities is also a low-friction way to give it capabilities you did not intend.

The controls that matter are unglamorous and familiar: authenticated transport, referenced credentials, named allowlists, live authorization, confirmation on mutation, redaction that covers every persisted surface, and evidence attached to the run. None of it is novel. It is the same discipline any privileged integration has always deserved, applied to a category of integration that currently tends to skip it.

Isolating the runtime around the call

Tool-level controls bound what an agent may ask for. Runtime isolation bounds what happens if something gets past them, and the two are worth designing together rather than treating the second as infrastructure's problem.

Per-run isolation is the baseline: each run gets its own execution context and workspace rather than sharing a long-lived process. Without it, one run's leftover state — a cached token, a written file, an environment variable — is available to the next, and the boundary you carefully built at the tool layer leaks underneath it.

Placement is the other half. If a run reaching sensitive systems can be constrained to execute only on runners inside a specific network boundary, then a compromised tool call is contained by the network as well as by policy. Two independent controls failing together is considerably less likely than one.

Rate limits and the noisy-neighbour case

Not every problem is an attack. A misconfigured workflow calling a tool in a tight loop produces the same symptoms as abuse: exhausted quota, rate-limited credentials, and a downstream system under unexpected load from an identity it trusts.

Ceilings on tool call counts per run, request rates per source and argument sizes turn these into bounded, attributable events. The attribution matters as much as the ceiling — when a downstream team asks who generated the traffic, "the automation platform" is not an answer anyone can act on.

Timeouts belong in this category too. They are usually framed as a reliability control, but a tool that hangs while holding a credential is also a security-relevant condition, and one that is easy to miss because nothing errors.

Responding when a server is compromised

Assume it happens and work out the response in advance, because the useful version of this plan is short and the improvised version is not.

First: can you disable a server centrally and have every profile referencing it stop working immediately, without editing workflows? If disabling requires touching each pipeline, the response time is measured in however long that takes.

Second: can you enumerate which runs used that server in the exposure window, what they called and what came back? This is the question that determines the blast radius assessment, and it is answerable only if the evidence was captured at the time.

Third: can you rotate the credential the server held without editing every definition that referenced it? Reference-based credentials make this a single operation. Embedded values make it an archaeology project conducted under time pressure.

What to log, and what not to

The instinct under pressure is to log everything, which creates a second problem: a log containing the secrets and customer data you were trying to protect, usually with weaker access controls than the systems it was copied from.

A workable rule is to log the shape and the decision, not the payload. Which tool, which profile, which subject, which resource, allowed or denied, how long it took, how large the response was. That answers nearly every operational and audit question without accumulating a new liability.

Where payload detail is genuinely needed, it belongs in the run's own evidence record under the same authorization as the run — not in an operational log stream with broader readership. And access to the record should itself be recorded, because "who read the audit trail" is a question that eventually gets asked.

Bring one workflow. We will map its controls, runtime, and evidence with you.

The fastest way to evaluate NopsAI is a single real workflow you already run manually and cannot safely hand to an unrestricted agent.