← Uday Nallamottu · ubngroup.net

Case Study

Project Neo

Autonomous multi-cloud vulnerability management, built MCP-native and governed by design.

Author Udhaya (Uday) Nallamottu August 2026

01Executive Summary

Enterprise security teams do not have a detection problem. AWS Inspector, Azure Defender, GCP Security Command Center, Nessus, Qualys, and Rapid7 collectively surface between 50,000 and 500,000 findings per quarter at a large organization. The unsolved problem is deciding which twelve to fix this week.

Project Neo is an AI-native vulnerability management platform that answers that question continuously and defensibly. It normalizes findings from seven sources into a single canonical model, scores each on a composite risk formula grounded in real-world exploitation data, and exposes the result to AI agents through the Model Context Protocol.

The scoring model. risk = likelihood × impact × exposure × 100. Likelihood is the EPSS 30-day exploitation probability from FIRST.org. Impact is the CVSS base score weighted by asset business criticality. Exposure reflects network position adjusted for compensating controls. A hard override ensures any CVE on the CISA Known Exploited Vulnerabilities list on a public-facing asset is always P1 — confirmed exploitation is a harder signal than any model.

The AI interface. Neo is built MCP-native rather than retrofitted. Analysts and agents — Claude Code, Claude Desktop, Amazon Bedrock — connect to Neo as an MCP server and call tools in natural language. The agent reasons over live risk context, produces remediation plans, opens GitHub pull requests, and generates board-level posture briefings. The analyst reviews and approves; they do not orchestrate each step.

The governance model. Neo is designed as a governed AI platform under the Governed AI Autonomy framework: an agent’s authority is bounded by architecture, its activity is visible in real time, its decisions are reconstructable by an examiner, and its correctness is measured rather than assumed.

Platform at a glance

Sources AWS Inspector v2, Security Hub, Azure Defender, GCP SCC, Nessus, Qualys, Rapid7
Scoring EPSS × CVSS × Exposure × 100, CISA KEV hard override to P1
Tiers P1 (24h SLA), P2 (7d), P3 (30d), P4 (maintenance window)
AI integration Native MCP server — 7 tools, 3 resources, 5 prompts
Deployment Stateless AWS Lambda, per-tenant Cognito JWT authentication
Tenant security Per-customer KMS keys, customer_id-partitioned DynamoDB, no plaintext credentials at rest
Access posture Read-only in all customer environments, enforced by IAM

02The Problem

Triage does not scale. A Log4Shell exploit on a public-facing EC2 instance and a medium-severity OpenSSL issue on an air-gapped development server arrive in the same queue, labelled with the same severity vocabulary. Translating volume into a ranked, actionable work queue is manual work that grows linearly with the estate.

Severity scales are incompatible across tools. An enterprise running AWS, Azure, GCP, and on-premises Nessus operates four dashboards with four data models. A CVE marked CRITICAL in Qualys may be HIGH in Azure Defender. Teams spend hours weekly correlating findings into spreadsheets — data management work, not security work.

CVSS measures the wrong thing. CVSS scores theoretical severity in a generic environment, with no regard for whether a CVE is actively exploited, whether the asset is reachable, or whether compensating controls exist. When every finding is CRITICAL, the label stops carrying information and engineers learn to ignore the queue. The 2024 Verizon DBIR found 14% of breaches involved vulnerability exploitation, with median time to patch a known-exploited CVE at 55 days.

Existing platforms store findings; they do not reason about them. An analyst wanting to know why a CVE is P1, what the remediation is, how to write the Terraform fix, and what the board-level narrative should be must context-switch across five tools. Incumbent AI features are retrofits — chatbots over proprietary APIs — not an interaction model.


03The Solution

Neo delivers three layers of intelligence: normalization (every source mapped to one canonical Finding model), composite risk scoring (a single 0–100 score and P1P4 tier), and an AI agent interface (an MCP server any compatible agent can query and act through).

The risk model

risk_score = likelihood × impact × exposure_factor × 100

likelihood  = EPSS 30-day probability (0.0–1.0); KEV findings floored at 0.85
impact      = (cvss_base / 10) × criticality_weight
              critical 1.0 · high 0.8 · medium 0.6 · low 0.4 · unknown 0.5
exposure    = exposure_weight × (1 − compensating_controls_reduction)
              public 1.0 · internal 0.7 · isolated 0.3 · unknown 0.5
              WAF/IDS reduce the factor by up to 0.3

Tiers: P1 ≥ 40 (or KEV + public, always) · P2 ≥ 20 · P3 ≥ 8 · P4 < 8

The consequence is that risk reflects the customer’s environment rather than a generic one. A CVSS 9.8 finding on an isolated development server is P3. A CVSS 7.2 finding on a public production instance in the KEV catalog is P1.

The KEV override

Presence in CISA’s Known Exploited Vulnerabilities catalog means the CVE is being exploited now. The rule is hardcoded: KEV AND public exposure means P1, regardless of CVSS or EPSS. This implements CISA Binding Operational Directive 22-01 directly in the scoring engine, and it is deliberately placed beyond the reach of any model output or agent action.

The MCP interface

Neo exposes seven tools (get_risk_summary, list_findings, get_finding, suppress_finding, list_credentials, trigger_scan, list_scans), three resources (kev://catalog, kev://entry/{cve_id}, epss://score/{cve_id}), and five prompts (triage_finding, remediation_plan, score_explanation, cloud_risk_summary, posture_briefing).

An analyst asks: “What are my P1 vulnerabilities and what should I do first?” The agent calls get_risk_summary, filters list_findings to P1, reads KEV status and EPSS scores per CVE, and invokes triage_finding. It returns prioritized recommendations, remediation steps, and a 24-hour action plan from live data in under ten seconds.


04Architecture

Multi-consumer bus topology with expanded cloud sources MCP clients connect over a shared bus to the Neo MCP server and GitHub MCP server; Neo core scores with threat intel; a pluggable ingest layer normalizes findings from AWS, Azure, GCP, and on-prem discovery. SaaS Portal Bedrock agent Claude Desktop Claude Code Analyst / Auditor Other MCP clients speaks MCP Neo MCP server 7 tools · 3 resources · 5 prompts GitHub MCP server branch · commit · PR wraps API GitHub API Project Neo core normalize · enrich · score Threat intel EPSS · CISA KEV GitHub repositories app code + Terraform normalize Pluggable ingest layer AWS discovery Inspector · Sec Hub member accounts Azure discovery Defender for Cloud subscriptions + tags GCP discovery Security Command Ctr projects + tags On-prem discovery Nessus·Qualys·Rapid7 CMDB + firewall
Multi-consumer bus topology with expanded cloud sources. Any MCP-capable client connects to the same Neo MCP server (7 tools, 3 resources, 5 prompts); any environment plugs into the same pluggable ingest layer. Everything between — the two MCP servers, Neo core, threat intel, scoring — is unchanged whether a finding originates in AWS, Azure, GCP, or on-prem. MCP clients MCP servers Neo engine & sources
Multi-axis scoring data flow with color-coded pathways A finding is enriched along a global axis (threat intel per CVE, yielding likelihood) and a local axis (per-cloud context per resource, yielding exposure). Both converge in the risk engine; a KEV-plus-public override sets P1 after scoring. GLOBAL · one source · per CVE LOCAL · per-cloud resolvers · per resource Vuln finding CVE + resource Global threat intel EPSS · CISA KEV Per-cloud context SG · NSG · VPC-fw · firewall Risk engine likelihood × impact × exposure Scored finding risk 0–100 → P1–P4 KEV + public ⇒ P1 per CVE per resource likelihood exposure
Multi-axis data flow with color-coded pathways. The score has two enrichment axes with different provenance. The global path is keyed by CVE and hits one shared source (EPSS, KEV) to produce likelihood. The local path is keyed by resource and runs a per-cloud context resolver (SG / NSG / VPC firewall / on-prem firewall) to produce exposure. Both converge in the risk engine, and the KEV + public override sets P1 after scoring — beyond the reach of the model. Global axis — per CVE Local axis — per resource Non-overridable policy

Layer 1 — Neo Core (standalone Python package)

The scoring engine runs anywhere with no cloud dependency. It was built first, deliberately, to validate the risk model before any infrastructure existed.

Layer 2 — Local MCP server

neo_mcp_server.py exposes the pipeline via FastMCP over stdio (Claude Code and Desktop), streamable-http, and SSE. Mock mode returns synthetic data with no credentials required. The server was validated against the MCP Inspector before any Lambda deployment.

Layer 3 — SaaS infrastructure

All infrastructure is Terraform-managed in a dedicated AWS account in us-east-1.

Data. Three DynamoDB tables, all partitioned on customer_id with point-in-time recovery: neo_credentials (encrypted source connectors), neo_findings (scored findings with tier, risk score, CVSS, EPSS, KEV flag, suppression status), neo_scans (scan history with status and timing).

Pipeline. EventBridge Scheduler fires neo_scan_trigger every six hours, which queries active sources and emits one SQS message per source. neo_scan_executor processes one message per invocation: decrypt credentials with the tenant KMS key, call the adapter, enrich with EPSS and KEV, score, write findings, update scan record. A dead-letter queue retains failures for 14 days. Each source fails independently — no cascade across tenants or source types.

Security. A per-customer KMS key is created on the Cognito post-confirmation trigger. Credentials are encrypted at the application layer before storage, so a database breach yields only ciphertext. Cross-account IAM roles use ExternalId conditions against confused-deputy attacks and carry read-only permissions on Inspector and Security Hub only.

Layer 4 — Lambda MCP server (AI gateway)

neo_mcp_lambda.py runs FastMCP with stateless_http=True as a Starlette ASGI application, wrapped by Mangum, behind a Lambda Function URL.

CognitoJWTMiddleware validates the Bearer token on every request against the Cognito JWKS endpoint, extracts customer_id from the sub claim, and binds it to a Python contextvar. Every tool function reads that contextvar to scope its DynamoDB queries. Isolation is structural: there is no code path capable of returning another tenant’s findings.

Cold start is approximately 2.1 seconds on 512 MB; warm invocations complete in under 5 milliseconds. Unauthenticated requests are rejected by the middleware before any tool logic executes.

Layer 5 — Customer portal

React 18, Vite, and Tailwind deployed to S3 behind CloudFront with a custom domain and ACM certificate; authentication via the Cognito SDK.

The Vulnerabilities page presents clickable P1P4 tiles and a findings table with tier and KEV badges, CVE, CVSS, risk score, EPSS percentage, and suppress action, plus CSV export. VulnSources manages connectors with per-source-type dynamic forms. The AI Integration page displays the MCP endpoint, reads the live Cognito IdToken with an expiry countdown, and generates ready-to-paste Claude Code and Claude Desktop configuration.


05What Makes Neo Different

MCP-native rather than MCP-retrofitted. Every incumbent platform — Tenable, Qualys, Rapid7, Wiz, Orca — was architected before MCP existed, and their AI capabilities are chatbots layered over proprietary APIs. Neo treats the agent as the primary consumer. That difference enables a complete loop in one reasoning session: summarize risk, identify the P1, check KEV status, generate a remediation plan, commit a Terraform fix, open a pull request.

Composite scoring replacing CVSS-only triage. Three factors — exploitation probability, weighted impact, and environmental exposure — produce a score that reflects the customer’s actual risk rather than a generic one.

Universal multi-source normalization. Seven adapters, one data model, one scale. The apples-to-oranges comparison problem between cloud-native and on-premises scanners is resolved at ingest rather than in a spreadsheet.

Stateless serverless AI gateway. Each request carries its own JWT; no session state, no persistent connections. Cost scales to zero when idle and to thousands of concurrent agent sessions when needed, with no infrastructure to manage.

Per-tenant cryptographic isolation. Credentials are encrypted at the application layer with a dedicated KMS key per customer. Offboarding revokes the key, rendering that tenant’s credential data permanently unreadable.

Zero write access to customer environments. AWS scanning uses read-only cross-account roles; Azure uses Reader and Security Reader; GCP uses Security Center Findings Viewer. Customers can audit this at any time. Neo’s access surface in a customer environment is entirely read-only.


06Governed AI Autonomy

Neo is not only a consumer of AI — it is a governed AI platform. Every agent that connects to Neo operates inside the Governed AI Autonomy framework: Controlled, Observable, Auditable, Evaluable.

These four are not a checklist but a ladder, and the order matters. Controlled bounds what an agent can do at all. Observable lets an operator see what it is doing while it does it. Auditable lets an independent examiner reconstruct what it did months later. Evaluable answers the only question that justifies extending autonomy: was it right, and how often?

Each rung is a precondition for the next increment of trust. An agent that is controlled but not evaluable may act only where the blast radius is zero. An agent that is evaluable but not auditable cannot be deployed in a regulated environment. The four map onto the NIST AI Risk Management Framework functions — Controlled and Auditable serve Govern, Observable serves Manage, Evaluable serves Measure — but are expressed as system architecture rather than organizational process.

Controlled — what can the agent do?

Control is enforced ex ante and outside the model. No pillar of this framework depends on an agent following instructions.

The MCP tool boundary is the control surface. Seven tools are exposed. There is no escape hatch to raw DynamoDB, no passthrough query interface, no admin endpoint. Everything outside the schema is unreachable by any agent regardless of prompt instruction.

Zero write access is enforced by the cloud provider, not by application code. Cross-account roles carry explicit Deny statements for write actions. An agent that is compromised, or simply instructed to modify customer infrastructure, receives AccessDenied from AWS, Azure, or GCP. This is control by capability removal — a stronger claim than a fleet merely forbidden from acting.

Tenant isolation is architectural. JWT validation precedes all tool logic; the customer_id contextvar scopes every query. This is not a row-level security policy that can be misconfigured.

Risk policy is non-overridable. The KEV+public override runs in risk_engine.py before any other logic. No agent, prompt, or analyst suppression can remove a P1 assignment — the tier is recalculated as P1 on the next scan. The principle it encodes is stated plainly: confirmed real-world evidence outweighs probabilistic inference.

Schema validation is input control. suppress_finding requires a suppress_reason, so an agent cannot suppress silently. trigger_scan requires a credential_id already registered to the tenant, so an agent cannot scan a target it did not register.

SLA policy applies identically to humans and agents. P1 means a 24-hour SLA, always, whoever is acting.

Guardrails are not a separate pillar. A guardrail is the mechanism by which control is enforced — the IAM Deny, the schema check, the pre-scoring override. Treating them as a peer category invites the same mechanism to be counted twice.

Observable — what is it doing right now?

Observability serves the engineer in the moment, and is deliberately distinct from auditability, which serves an examiner afterwards.

Live posture. The portal shows current P1P4 counts, refreshed each six-hour cycle, without running a query or waiting on a batch.

Pipeline telemetry. Every run writes a neo_scans record — source, start, completion, status, finding count. Which sources ran, when, how long, and whether any failed are all answerable from the database.

Gateway telemetry on a separate plane. The Lambda MCP server publishes CloudWatch metrics on every invocation — duration, memory, errors, concurrency — and API Gateway logs method, path, status, and latency. The AI integration layer can be observed independently of the scanning pipeline; conflating them hides which layer is degraded.

Failure is visible, never silent. The dead-letter queue retains failed messages for 14 days. Invalid credentials, scanner unavailability, and enrichment timeouts surface as inspectable messages rather than absent data. The absence of a scan completion record is itself a signal.

Deterministic, inspectable scoring. There is no black-box inference in the core scoring path. Given the same inputs, the same score always results, and any analyst can verify a score by inspection. Determinism is a transparency property, not a correctness claim — whether the formula ranks risk well is a question for the Evaluable pillar.

Model inputs are as observable as model outputs. kev://catalog, kev://entry/{cve_id}, and epss://score/{cve_id} expose the exact intelligence that drove any scoring decision.

Reasoning made legible. triage_finding explains why a finding received its tier and what the EPSS probability means in plain language. score_explanation reproduces the arithmetic step by step. posture_briefing generates a board-level assessment from live data.

Stated deliberately: an explanation is not evidence of correctness. A fluent narrative supporting a wrong triage is more dangerous than a bare wrong triage, because it is more persuasive. These prompts make reasoning inspectable so a human can judge it. Whether the reasoning is sound is measured under Evaluable, not asserted here.

Auditable — can an examiner reconstruct it without trusting us?

Auditability is adversarial by design. Observability is built for the engineer who is looking; auditability for the examiner who arrives later, has no context, and has no reason to take the operator’s word for anything.

Agent and human actions share one record. Every state-writing tool call creates a permanent DynamoDB record. There is no separate AI action log — the finding and scan tables are the single source of truth for all platform activity, whoever initiated it. “What did the agent do last Tuesday?” is a query that returns human actions in the same shape, making the two directly comparable.

Suppressions carry mandatory justification. Each records suppressed_at, suppress_reason, customer_id, and finding_id. A reviewer can see not only that a finding was suppressed but what rationale was offered — and can reverse it.

Every finding traces to a named external authority. Scores decompose into EPSS probability, CVSS vector, criticality weight, and exposure factor, each retrievable as of the scan date. A tier assignment is defensible by reference to published third-party intelligence rather than internal judgment.

Capability Status Why it matters
Suppression and scan records in DynamoDB Implemented Actions are attributable and reversible
Session tags on cross-account assume-role calls Planned Pushes agent identity and purpose into CloudTrail — an examiner trusts AWS’s log, not ours
Structured JSON audit logs with correlation IDs at the MCP boundary Planned Joins the agent’s reasoning trace to the provider’s record of what actually happened
Per-caller tool allowlists Planned Records which caller was permitted which capability, when
Defined retention and tamper-evidence posture Planned Retention period, immutability, and legal hold are examiner questions with no current answer

The first three are the difference between we can reconstruct what the agent did from our own application data and the agent’s actions are recorded in a log the examiner already trusts. The distinction is small in engineering effort and large in audit posture.

Evaluable — is it right, and how often?

An evaluation is something that can fail. It produces a number, on data not chosen to flatter the system, that could come back bad. Determinism, policy enforcement, audit trails, and explanations are all valuable — but none can return a failing result, which is why none appear in this pillar.

Neo makes two distinct kinds of claim, so it requires two families of evaluation.

Family A — is the risk model right?

The composite score is a ranking function asserting that findings it ranks high matter more than findings it ranks low. That assertion is falsifiable against history.

Family B — do agents behave correctly against Neo?

The seven-tool surface, fixed tenant fixture, and read-only posture make agent behaviour inexpensive to evaluate: the environment is a seeded dataset, not a live system.

How results are reported. Agent behaviour is stochastic and a single run is not a result. Every Family B evaluation runs n repetitions and reports pass rate, standard deviation, false-suppression rate, and injection-compliance rate. Scenarios passed at 100% across repeated runs are flagged as saturated and retired or hardened, because a suite that only produces green has stopped producing signal.

Status. Family A is specified and buildable from data Neo already ingests. Family B is specified with a defined fixture format; the harness is in development. This pillar is stated as roadmap rather than accomplishment deliberately — claiming evaluation coverage that does not exist is the specific failure the pillar was added to prevent.

Summary

Pillar Question Mechanisms in Neo
Controlled What can it do? Seven-tool MCP boundary; zero-write IAM; JWT tenant isolation; non-overridable KEV policy; schema validation; per-tenant KMS
Observable What is it doing? Posture dashboard; scan telemetry; separated gateway metrics; DLQ; deterministic scoring; KEV and EPSS resources; triage and explanation prompts
Auditable What did it do, and can we prove it? Unified agent/human action records; mandatory suppression rationale; third-party-traceable scoring inputs; (planned) CloudTrail session tags, correlation IDs, per-caller allowlists
Evaluable Is it right, and how often? (in build) KEV backtest and lift; triage agreement; false-suppression rate; injection resistance; override attempt rate

Controlled, Observable, and Auditable are properties of Neo’s architecture today. Evaluable is under construction, and its general absence across the industry is why it is named as a pillar rather than assumed. A platform that cannot state how often its agents are correct has not earned autonomy — it has only been permitted it.


07Compliance Mapping

Framework Requirement How Neo satisfies it
CISA BOD 22-01 Remediate KEV-listed vulnerabilities within mandated timeframes KEV + public asset is always P1 with a 24-hour SLA, enforced in the scoring engine; suppression records document any formal risk acceptance
NIST CSF 2.0 ID.RA risk assessment; PR.IP protection processes; DE.CM continuous monitoring Continuous scored risk assessment with documented methodology; P1P4 tiers operationalize risk-based patching; six-hour scanning with UTC timestamps provides monitoring evidence
SOC 2 Type II CC7.1–CC7.3 — controls operating effectively over 12 months neo_scans evidences control operation without manual log review; per-finding score and tier evidence risk assessment; mandatory suppression reasons provide formal risk acceptance documentation
PCI DSS v4.0 6.3.3 protection from known vulnerabilities; 11.3.1 quarterly scans Six-hour continuous scanning exceeds the quarterly minimum; P1/P2 tiers map to critical vs non-critical; scores, CVSS values, and timestamps supply the QSA evidence trail
ISO 27001 / 27002 A.12.6 technical vulnerability management with risk-based prioritization Composite scoring and SLA framework implement risk-based prioritization; suppression trail satisfies formal risk acceptance; finding IDs are SHA-256 hashes of CVE + resource ID for stable deduplication and tracking
GDPR Article 32 Regular testing and evaluation of security measure effectiveness Continuous scanning with automated scoring constitutes the process; posture_briefing generates an effectiveness assessment suitable for periodic reporting

The practical effect is that vulnerability management evidence becomes a query rather than a project. A SOC 2 evidence request that typically consumes 40–80 consultant hours becomes a filtered export carrying timestamps, scores, tier assignments, and documented risk acceptances.


08Economics

The following are illustrative models built on stated assumptions, not measured customer outcomes. Loaded hourly rates and incident frequencies vary widely by organization; the models are intended to show which variables dominate rather than to predict a specific result.

Mid-market profile — 500–2,000 employees, 3 AWS accounts, on-premises Nessus, 3 analysts.

Driver Assumption Annual value
Triage time recovered 3 hrs/week × 3 analysts × $72/hr × 50 weeks $32,400
Faster P1 remediation 10 P1 events, 13 days saved each $65,000
Compliance evidence preparation 60 hrs × $200/hr $12,000
Total ~$109,400

Enterprise profile — 10,000+ employees, 20+ cloud accounts, Nessus + Qualys + Rapid7, 8 analysts.

Driver Assumption Annual value
Triage time recovered 3 hrs/week × 8 analysts × $85/hr × 50 weeks $102,000
Faster P1 remediation 50 P1 events, 13 days saved each $487,500
Compliance efficiency 200 hrs × $200/hr $40,000
Reduced breach exposure 20% risk reduction against a 1-in-10-year, $4.88M event $97,600
Total ~$727,100

Two caveats worth stating rather than burying. The remediation-acceleration line dominates both models and is the most assumption-sensitive: it depends on P1 event frequency and on engineering time genuinely being redeployed rather than merely reallocated. The breach-reduction line is an expected-value estimate, not a savings — it should be read as directional.

The durable economics are simpler than the models. Findings arrive pre-scored and pre-ranked, so analysts act instead of sorting; and compliance evidence is generated continuously as a by-product of operation rather than assembled retrospectively.


09Competitive Landscape

Platform Strengths Gaps relative to Neo
Tenable (io / sc) Market leader; 70,000+ plugin library; deep enterprise trust No agent interface or MCP; CVSS-centric scoring without EPSS; separate cloud and on-prem products with no unified score; per-asset licensing
Qualys VMDR Feature breadth; strong compliance reporting No MCP integration; no EPSS-native scoring; no environmental exposure factor
Rapid7 InsightVM Good remediation workflow integration; Nexpose scanner Real Risk score is not reproducible or independently explainable; aging on-premises architecture; no agent interface
Wiz / Orca Fast time-to-value for cloud-native estates; agentless Cloud-only — no Nessus, Qualys, or Rapid7 ingestion; MCP support limited to querying rather than acting

Where Neo’s advantage is durable. The composite EPSS × exposure formula is a scoring approach incumbents would need to rebuild rather than configure. MCP-native architecture is a structural head start over retrofits, though a finite one — incumbents will ship MCP interfaces, and the advantage lies in Neo treating the agent as the primary consumer rather than an additional channel. Multi-source normalization onto a single scale is the hardest of the three to replicate, because it requires abandoning a scanner-centric data model.

Where it is not. Neo has no plugin library approaching Tenable’s, no established enterprise procurement relationships, and no third-party validation of scoring accuracy — which is precisely the gap the Evaluable pillar exists to close.


10Roadmap

Immediate — on-premises agent. Many enterprises run Nessus, Qualys, or Rapid7 in isolated networks with no inbound path. A Docker container deployed inside the customer network connects outbound-only to the Neo endpoint, authenticates via STS AssumeRole with ExternalId, decrypts credentials locally with the tenant KMS key, scores locally, and pushes results. No inbound firewall rules, no VPN. This unlocks the hybrid enterprise segment.

Near term (3–6 months). Slack and Teams notifications for P1 findings with inline suppress, acknowledge, and assign actions. Jira and ServiceNow ticket creation with two-way sync, so closing a ticket marks the finding remediated and triggers verification re-scan. A GitHub Action that calls the Neo MCP server in CI, fails builds on introduced P1 dependencies, and comments findings on the pull request.

Medium term (6–18 months). Autonomous remediation pull requests — version bumps with commit messages explaining the CVE and risk score, opened against main, human approval required before merge; the research and implementation are automated, the risk judgment stays human. Expansion into configuration baselines (CIS Benchmarks, AWS Foundations, PCI configuration standards), positioning Neo in the adjacent CSPM market. Bedrock action group deployment for enterprises with existing Bedrock workflows. Risk trend analytics converting Neo from a current-state tool into a posture trajectory platform.

Long term (18–48 months). MSSP multi-tenancy with white-label branding and consolidated reporting. Anonymized aggregate vulnerability intelligence as a data product — patch adoption rates by CVE, MTTD distribution by industry, independent EPSS accuracy validation. Cyber insurance integration using Neo’s risk score as an underwriting input.


11Lessons Learned

Build the pure logic first. neo_core was written as a standalone package with a pure-function scoring engine and a mock mode before any AWS resource existed. That sequencing meant the risk model was validated on a laptop against fixture data, and every later layer — local MCP, Lambda, portal — was an interface over logic already known to work. It also made every subsequent component testable without credentials.

Automate the build pipeline from day one. Cross-platform packaging for Lambda required a two-step pip install to replace Windows binaries with manylinux wheels for compiled dependencies. Solving this manually on each deployment was avoidable friction; it belonged in a Makefile target or CI workflow from the first deploy.

Instrument distributed tracing immediately. Debugging a slow enrichment call across Lambda, SQS, the EPSS API, and DynamoDB with manual timing instrumentation is painful and slow. OpenTelemetry traces exported to X-Ray would have cut investigation time substantially, and retrofitting tracing is materially harder than adding it at the start.

Separate the transparency claim from the correctness claim. The most useful structural insight from building the governance model was recognizing that a deterministic formula, a complete audit trail, and a fluent explanation all describe how a decision can be inspected — none of them establish that it was right. Keeping those claims apart is what produced the evaluation programme rather than a false sense of coverage.


12Appendix — Quick Reference

Risk scoring

risk_score = likelihood × impact × exposure_factor × 100
likelihood = EPSS 30-day (0.0–1.0); KEV floored at 0.85
impact     = (cvss_base / 10) × criticality_weight
             critical 1.0 · high 0.8 · medium 0.6 · low 0.4 · unknown 0.5
exposure   = exposure_weight × (1 − compensating_controls_reduction)
             public 1.0 · internal 0.7 · isolated 0.3 · unknown 0.5
Tiers      = P1 ≥ 40 (or KEV+public) · P2 ≥ 20 · P3 ≥ 8 · P4 < 8

MCP interface

Technology stack

Portal: https://saas.nuratrix.com