mpak Trust Framework (MTF) v0.1

MTF is a specification for securing the supply chain of MCP server bundles. It defines controls spanning the full distribution lifecycle: from how bundles are built and signed, to how registries govern namespaces and handle revocations, to how consumers verify and install packages.

Version: 0.1 Status: Draft License: CC BY 4.0

Table of Contents

  1. Introduction
  2. Threat Model
  3. Control Catalog
  4. Manifest Specification
  5. Signing & Attestation
  6. Implementation Guide
  7. Specification Roadmap

1. Introduction

1.1 Purpose

MTF defines security controls for MCP server bundles distributed through package registries. It addresses supply chain threats specific to the MCP ecosystem, including tool description poisoning, credential aggregation, and slopsquatting.

1.2 Scope & Boundaries

What MTF covers:

PhaseDescriptionMTF Coverage
PublishAuthor packages and signs bundleProvenance, signing, manifest
DistributeRegistry indexes and serves bundleNamespace governance, revocation
DiscoverConsumer searches and evaluatesMetadata transparency, trust signals
VerifyConsumer validates bundle integritySignature verification, attestation
InstallBundle extracted, dependencies resolvedCompleteness check, pinning
UpdateNew version replaces oldVersion policy, breaking changes

What MTF does NOT cover:

  • Runtime execution (sandboxing, permission enforcement during tool invocation)
  • Prompt injection defense (LLM-level input filtering)
  • Tool-level permissions (per-invocation authorization)
  • MCP client security (host application hardening)
  • Network transport (TLS configuration)

These concerns require runtime security controls planned for MTF v0.2+.

1.3 Terminology

MCP bundle: A distributable package representing exactly one MCP server, containing:

ComponentRequiredDescription
manifest.jsonMUSTMachine-readable metadata declaring capabilities
Server implementationMUSTSource code or compiled binaries implementing MCP server
Bundled dependenciesMAYThird-party libraries included in package
SBOMMUSTSoftware Bill of Materials listing all components
SignatureL3+Cryptographic signature proving publisher identity
AttestationL3+Build provenance statement

Bundle-server invariant: A bundle MUST correspond to exactly one MCP server entrypoint. Bundles MUST NOT contain multiple independently invokable servers.

Requirement levels (RFC 2119):

KeywordMeaning
MUST / REQUIREDAbsolute requirement for compliance
MUST NOTAbsolute prohibition
SHOULD / RECOMMENDEDBest practice; deviation requires documented justification
MAY / OPTIONALTruly optional; no impact on compliance

1.4 Compliance Levels

MTF defines four compliance levels. Each level includes all requirements from previous levels.

LevelTargetKey Requirements
L1 BasicPersonal projects, experimentsValid manifest, no secrets/malware, SBOM, tool declaration
L2 StandardPublished packages, team tools+ CVE scan, dependency pinning, author identity, description safety
L3 VerifiedProduction, enterprise+ Cryptographic signing, build attestation, credential scopes
L4 AttestedCritical infrastructure+ Behavioral analysis, commit linkage, reproducible builds

1.5 Security Invariants

The following guarantees MUST hold across all MTF versions:

  1. Signed content: All executable bundle content is cryptographically signed and integrity-verified before execution (L3+).
  2. Dependency transparency: SBOMs enumerate all direct and transitive dependencies with pinned versions.
  3. Revocation enforcement: Revoked bundles are blocked at install time; clients MUST check revocation status.
  4. Consent for escalation: Permission or scope increases during updates require explicit user consent.

2. Threat Model

2.1 Attack Surface

MCP bundles present attack opportunities across multiple phases:

PhaseWindowUnique MCP Risk
Pre-installationRegistry browsing, searchTool descriptions visible to LLMs
InstallationDependency resolution, extractionPost-install hooks execute
InitializationServer startup, module importsCode runs before user consent
Credential accessOAuth token provisioningTokens aggregated across services

2.2 Supply Chain Attack Vectors

2.2.1 Typosquatting / Namespace Confusion

Vector: Attacker registers package names similar to legitimate packages.

Mechanism: Exploits human typos (stripe-mcp vs strpe-mcp) or organizational namespace confusion.

Controls: RG-01, RG-02, CQ-06

2.2.2 Slopsquatting (MCP-Specific)

Vector: Attacker registers package names that LLMs hallucinate.

Mechanism: LLMs generate plausible but non-existent package names. Attackers preemptively register these.

Controls: CQ-06, RG-02

2.2.3 Dependency Hijacking

Vector: Attacker compromises a transitive dependency.

Mechanism: Typosquatting internal names, account takeover, malicious upstream contribution.

Controls: SC-02, SC-03, PR-03

2.2.4 Malicious Updates / Account Takeover

Vector: Attacker publishes malicious update using compromised publisher credentials.

Controls: PR-02, PK-02, PK-03, RG-05

2.2.5 Build Provenance Gaps

Vector: Attacker tampers with build pipeline or publishes artifacts without provenance.

Controls: PR-03, AI-04, PR-04

2.2.6 Phantom Bundle Components

Vector: Bundle contains files not declared in manifest.

Controls: AI-05

2.2.7 Metadata / Manifest Manipulation

Vector: Manifest declares benign capabilities while code implements dangerous ones.

Controls: CD-02, CQ-06

2.2.8 Tool Description Poisoning (MCP-Specific)

Vector: Malicious instructions embedded in MCP tool descriptions.

Mechanism: LLMs consume tool descriptions as trusted instructions. Attacker embeds directives to exfiltrate data.

Controls: CD-03

2.2.9 Registry Poisoning

Vector: Attacker compromises registry infrastructure.

Controls: RG-03, RG-04

2.2.10 Unverified Publisher Identity

Vector: Attacker publishes under false identity.

Controls: PR-02, PK-01

2.2.11 Abandoned / Unmaintained Bundles

Vector: Legitimate but abandoned bundle accumulates vulnerabilities.

Controls: UP-03, PK-04

2.2.12 Credential Aggregation (MCP-Specific)

Vector: Compromised MCP server accesses tokens for multiple services.

Mechanism: MCP servers aggregate OAuth tokens creating concentrated breach potential.

Controls: CD-04, CD-05

2.2.13 Initialization-Time Exfiltration (MCP-Specific)

Vector: Malicious code executes during server startup, before any tool invocation.

Controls: CD-02, CQ-06

3. Control Catalog

3.1 Control Format

Each control in this catalog follows a consistent structure:

ElementDescription
IDUnique identifier (e.g., AI-01, SC-02)
NameShort descriptive name
LevelMinimum compliance level (L1/L2/L3/L4)
EnforcementWho enforces (Scanner/Registry/Client)
RationaleWhy this control matters
RequirementsNormative MUST/SHOULD statements
VerificationHow to check compliance
SeverityFinding-to-action mapping
Threats AddressedBack-reference to threat model

Note: Some controls are evaluated by multiple actors. The Enforcement field indicates the primary enforcement point for compliance; clients and registries MAY additionally enforce scanner controls.

Control Prefixes:

PrefixDomainCount
AI-Artifact Integrity5
SC-Supply Chain5
CQ-Code Quality7
CD-Capability Declaration5
PR-Provenance5
RG-Registry Operations5
PK-Publisher Identity4
IN-Installation4
UP-Update Lifecycle4

3.2 Artifact Integrity (AI-)

Artifact integrity controls ensure that bundles are complete, unmodified, and verifiably from the claimed publisher.

IDControlLevelEnforcementThreats Addressed
AI-01Manifest ValidationL1ScannerMetadata manipulation
AI-02(Reserved)
AI-03Bundle SigningL3ScannerPublisher impersonation
AI-04Reproducible BuildsL4ScannerBuild tampering
AI-05Bundle CompletenessL2ClientPhantom components

AI-01: Manifest Validation

Level: L1 | Enforcement: Scanner

Rationale: The manifest is the foundation for all other controls. Without a valid manifest, bundles cannot be evaluated for compliance, capabilities cannot be declared, and verification cannot proceed.

Requirements:

  • Bundle MUST include manifest.json at bundle root
  • Manifest MUST validate against mcpb schema
  • Manifest MUST include all required mcpb fields

Required Fields (L1):

FieldTypeDescription
manifest_versionstringmcpb schema version
namestringPackage name
versionstringSemantic version (valid semver)
descriptionstringHuman-readable description
serverobjectServer execution configuration
toolsarrayTool declarations (may be empty)

Additional Required Fields (L2+):

FieldTypeDescription
authorobjectPublisher identity (name, email)
repositoryobjectSource repository (type, url)
_meta.org.mpaktrustobjectMTF extension fields

Validation Steps:

  1. Parse JSON (reject malformed)
  2. Validate against mcpb schema
  3. Verify required fields present
  4. If both server and mcp_config are present, verify execution targets are consistent (same entrypoint/module)
  5. Validate semver format
  6. For L2+: Validate scoped name format (@scope/name)

Severity:

FindingAction
Missing manifest.jsonBLOCK
Invalid JSONBLOCK
Schema validation failureBLOCK
Missing required fieldBLOCK
Invalid semverBLOCK
Unscoped name at L2+BLOCK

Threats Addressed: Metadata manipulation (2.2.7)

AI-03: Bundle Signing

Level: L3 | Enforcement: Scanner

Rationale: Signatures bind bundles to publisher identity. Without signatures, anyone who gains registry access can publish under any name. Signatures provide cryptographic proof of publisher intent.

Requirements:

  • Bundle MUST include cryptographic signature
  • Signature MUST cover manifest hash and SBOM hash
  • Signature MUST be verifiable against publisher identity

What MUST Be Signed:

FieldDescription
Package nameFrom manifest
Package versionFrom manifest
Manifest SHA-256Hash of canonical manifest
SBOM SHA-256Hash of SBOM file
TimestampISO 8601 signing time
Signer identityOIDC URI or key fingerprint

Signed Payload Format:

{
  "mtf_version": "0.1",
  "payload_type": "bundle_signature",
  "subject": {
    "name": "@scope/package-name",
    "version": "1.0.0",
    "manifest_sha256": "abc123...",
    "sbom_sha256": "def456..."
  },
  "timestamp": "2026-02-06T12:00:00Z",
  "signer_identity": "https://github.com/username"
}

Canonical Serialization:

Payload MUST use RFC 8785 (JSON Canonicalization Scheme) before signing.

Signing Mechanisms:

MethodStatusNotes
Sigstore keylessREQUIREDBinds to OIDC identity
ECDSA P-256AcceptableLong-lived key
Ed25519AcceptableLong-lived key
RSA-4096+AcceptableLong-lived key
RSA-2048NOT acceptableInsufficient key size

Signature File Locations:

FileDescription
manifest.sigPrimary signature (detached)
.sigstore/Sigstore bundle directory
manifest.ci.sigCI/builder signature (if multiple)

Severity:

FindingAction
Missing signature at L3+BLOCK
Invalid signatureBLOCK
Signer not authorized for packageBLOCK
Payload hash mismatchBLOCK
Expired certificate (Sigstore)WARN (check revocation)

Threats Addressed: Publisher impersonation, malicious updates (2.2.4)

AI-04: Reproducible Builds

Level: L4 | Enforcement: Scanner

Rationale: Reproducible builds allow independent verification that published binaries match source code. If two builders produce identical output from identical input, tampering in the build process is detectable.

Requirements:

  • Build process MUST produce bit-identical output from same source
  • Manifest MUST declare reproducibility status
  • Verification MUST be independently achievable

Manifest Declaration:

{
  "_meta": {
    "org.mpaktrust": {
      "build": {
        "reproducible": true,
        "instructions": "https://github.com/org/repo/blob/main/BUILD.md"
      }
    }
  }
}

Reproducibility Requirements:

FactorRequirement
TimestampsMUST be stripped or normalized
File orderingMUST be deterministic (sorted)
DependenciesMUST be pinned to exact versions with hashes
Build environmentMUST be documented (OS, toolchain versions)
Random valuesMUST NOT appear in output

Severity:

FindingAction
reproducible: true but build differsBLOCK
reproducible: false at L4BLOCK
Missing build instructionsWARN

Threats Addressed: Build tampering, provenance gaps (2.2.5)

AI-05: Bundle Completeness

Level: L2 | Enforcement: Client

Rationale: Attackers may include undeclared files (executables, scripts) that manifest validation doesn’t detect. Completeness verification ensures bundles don’t contain unexpected executable content.

Requirements:

  • Clients MUST scan extracted bundles for unexpected executable content
  • Undeclared executable content MUST block installation
  • Verification MUST occur before extraction to final location

Verification Steps:

  1. Extract bundle to temporary location
  2. Enumerate all files in bundle
  3. Identify files referenced by the manifest (entry points, config files, dependency lockfiles)
  4. Flag any executable files not referenced by the manifest
  5. BLOCK if unexpected executables found

Expected Files:

Files referenced by the manifest are considered expected:

Manifest FieldExpected Files
server.entry_pointThe server entry point
mcp_config.argsFiles referenced in args
dependencies / lockfilesDependency lockfiles
_meta.org.mpaktrustMTF metadata (non-executable)

Always Allowed:

PatternReason
manifest.jsonBundle manifest
README.md, README.txt, READMEDocumentation
LICENSE, LICENSE.txt, LICENSE.mdLicense
CHANGELOG.md, CHANGELOG.txtDocumentation
*.sig, .sigstore/*Signatures
.gitignore, .gitattributesGit metadata

Disallowed Unless Referenced:

PatternRisk
*.py, *.js, *.ts, *.go, *.rsExecutable code
*.sh, *.bash, *.zshShell scripts
*.exe, *.dll, *.so, *.dylibBinaries
postinstall*, preinstall*Install hooks

Severity:

FindingAction
Unexpected executable fileBLOCK
Unexpected non-executable fileWARN

Threats Addressed: Phantom components (2.2.6)


3.3 Supply Chain (SC-)

Supply chain controls ensure that dependencies are known, tracked, free from vulnerabilities, and sourced from trusted origins.

IDControlLevelEnforcementThreats Addressed
SC-01SBOM GenerationL1ScannerDependency opacity
SC-02Vulnerability ScanningL2ScannerKnown CVEs
SC-03Dependency PinningL2ScannerDependency hijacking
SC-04Lockfile IntegrityL2ClientSupply chain tampering
SC-05Trusted SourcesL3ScannerMalicious registries

SC-01: SBOM Generation

Level: L1 | Enforcement: Scanner

Rationale: Software Bill of Materials (SBOM) provides visibility into all components in a bundle. Without an SBOM, vulnerability scanning, license compliance, and incident response are impossible.

Requirements:

  • Bundle MUST include an SBOM file
  • SBOM MUST enumerate all direct and transitive dependencies
  • SBOM MUST use a standardized format

Supported Formats:

FormatVersionsFile Location
CycloneDX1.4, 1.5, 1.6sbom.json or sbom.cdx.json
SPDX2.3+sbom.spdx.json

Required Component Fields:

FieldRequiredDescription
nameMUSTPackage name
versionMUSTExact version
purlMUSTPackage URL (canonical identifier)
licenseSHOULDSPDX license identifier
hashSHOULDComponent integrity hash

Depth Requirements:

Component TypeRequired
Direct dependenciesMUST
Transitive dependencies (all levels)MUST
Bundled assets (if executable)MUST
Development dependenciesSHOULD NOT include

Severity:

FindingAction
Missing SBOMBLOCK
Invalid SBOM formatBLOCK
Component missing required fieldsWARN
SBOM older than lockfileWARN

Threats Addressed: Dependency opacity, incident response gaps

SC-02: Vulnerability Scanning

Level: L2 | Enforcement: Scanner

Rationale: Known vulnerabilities in dependencies are a primary attack vector. EPSS and CISA KEV data help prioritize exploitable vulnerabilities over theoretical ones.

Requirements:

  • All components in SBOM MUST be scanned for known vulnerabilities
  • Blocking thresholds MUST consider exploitability, not just severity
  • Publishers MAY provide VEX statements to document non-applicability

Data Sources:

SourcePurpose
CVE DatabaseKnown vulnerabilities (via scanner tooling)
EPSSExploit Prediction Scoring (0.0-1.0 probability)
CISA KEVKnown Exploited Vulnerabilities catalog

Blocking Criteria:

A vulnerability MUST block publication if ANY of:

ConditionRationale
CVSS ≥ 9.0Critical severity
CVSS ≥ 7.0 AND EPSS > 0.10High severity + >10% exploitation probability
Listed in CISA KEVKnown active exploitation

Non-Blocking (Warning):

ConditionTreatment
CVSS 7.0-8.9 with EPSS ≤ 0.10WARN
CVSS 4.0-6.9WARN
CVSS < 4.0INFO

VEX Statement Handling:

Publishers MAY provide VEX statements to override findings:

VEX StatusEffect
not_affectedSkip vulnerability (justification required)
fixedSkip if fixed version is bundled
under_investigationWARN, does not block

Severity:

FindingAction
Blocking vulnerability (per criteria above)BLOCK
High severity with low EPSSWARN
Medium severityWARN
VEX not_affected without justificationWARN

Threats Addressed: Known vulnerabilities, dependency hijacking (2.2.3)

SC-03: Dependency Pinning

Level: L2 | Enforcement: Scanner

Rationale: Unpinned dependencies allow attackers to inject malicious versions without changing bundle source. Pinning with integrity hashes ensures reproducible, verifiable installations.

Requirements:

  • All dependencies MUST be pinned to exact versions
  • Dependency lockfiles MUST include integrity hashes
  • Version ranges MUST NOT appear in production dependencies

Lockfile Requirements by Ecosystem:

EcosystemLockfileIntegrity Field
Pythonrequirements.txt with hashes--hash=sha256:...
Python (Poetry)poetry.lockhash field
Python (uv)uv.lockhash field
JavaScriptpackage-lock.json v2+integrity field
JavaScript (pnpm)pnpm-lock.yamlintegrity field
Gogo.sumHash entries
RustCargo.lockchecksum field

Prohibited Patterns:

PatternExampleIssue
Version rangesrequests>=2.0Non-deterministic
Latest tagpackage@latestNon-deterministic
Git refs without hashgit+https://...#mainMutable
Missing lockfileNo lockfile presentNo pinning

Severity:

FindingAction
Missing lockfileBLOCK
Dependency without exact versionBLOCK
Dependency without integrity hashWARN (L2), BLOCK (L3+)
Lockfile/SBOM version mismatchWARN

Threats Addressed: Dependency hijacking (2.2.3), non-reproducible builds

SC-04: Lockfile Integrity

Level: L2 | Enforcement: Client

Rationale: Lockfiles can be tampered with between publication and installation. Clients must verify that installed dependencies match the publisher’s declared lockfile.

Requirements:

  • Clients MUST verify installed dependencies against bundle lockfile
  • Hash mismatches MUST block installation
  • Lockfile MUST be covered by bundle signature (L3+)

Client-Side Lockfile:

{
  "lockfileVersion": 1,
  "installed": "2026-02-06T12:00:00Z",
  "packages": {
    "@acme/mcp-server": {
      "version": "1.2.3",
      "resolved": "https://registry.example/bundles/@acme/mcp-server-1.2.3.mcpb",
      "integrity": "sha256-...",
      "mtf_level": 2
    }
  }
}

Severity:

FindingAction
Dependency hash mismatchBLOCK
Lockfile missing from bundleBLOCK (L2+)
Lockfile not covered by signatureWARN (L3+)

Threats Addressed: Supply chain tampering, mirror poisoning

SC-05: Trusted Sources

Level: L3 | Enforcement: Scanner

Rationale: Dependencies from untrusted sources bypass ecosystem security controls. Approved registries have malware scanning, account verification, and incident response processes.

Requirements:

  • All dependencies MUST be sourced from approved registries or an explicitly configured organizational allow-list
  • Non-approved sources MUST block publication unless allow-listed
  • Git dependencies require SLSA attestation

Approved Registries:

EcosystemApproved Sources
Pythonpypi.org, files.pythonhosted.org
JavaScriptregistry.npmjs.org
Rustcrates.io
Goproxy.golang.org, sum.golang.org
Javarepo1.maven.org, central.sonatype.com
Rubyrubygems.org

Restricted Sources (Require Explicit Allow-List):

Source TypeExampleRisk
Local pathsfile:///path/to/pkgUnverifiable
Git without attestationgit+https://github.com/...No provenance
Self-hosted registrieshttps://internal.example/pypiRequires org policy and audit controls
Direct tarballshttps://github.com/.../archive/v1.0.tar.gzNo attestation

Severity:

FindingAction
Dependency from restricted source without allow-listBLOCK
Dependency from unknown registryWARN (manual review)
Git dependency without attestationBLOCK (L3+)
Private registry without organizational approvalBLOCK

Threats Addressed: Malicious registries, dependency hijacking (2.2.3)


3.4 Code Quality (CQ-)

Code quality controls verify that bundle source code follows secure coding practices and does not contain known malicious patterns.

IDControlLevelEnforcementThreats Addressed
CQ-01Secret DetectionL1ScannerCredential exposure
CQ-02Malware PatternsL1ScannerMalicious code
CQ-03Static AnalysisL2ScannerInjection, unsafe patterns
CQ-04Input ValidationL3ScannerInjection attacks
CQ-05Safe Execution PatternsL3ScannerCode injection, deserialization
CQ-06Behavioral AnalysisL4RegistryCapability mismatch, exfiltration

CQ-01: Secret Detection

Level: L1 | Enforcement: Scanner

Rationale: Secrets committed to bundles are immediately exploitable. API keys, tokens, and credentials in published code are harvested by automated scanners within minutes of publication.

Requirements:

  • Scanner MUST detect high-confidence secret patterns in all source files
  • Bundle MUST NOT contain detected secrets
  • Detection MUST cover at minimum:
PatternExamples
API keysAKIA*, sk-live-*, ghp_*
Private keys-----BEGIN RSA PRIVATE KEY-----
Tokensxox[baprs]-*, ya29.*
Connection stringsmongodb+srv://, postgres://
High-entropy stringsBase64 blobs > 20 chars in assignment context

Verification:

ToolModeNotes
TruffleHog--only-verifiedPreferred; checks if secrets are live
GitleaksDefault rulesAcceptable alternative

Severity:

FindingAction
Verified secret (confirmed active)BLOCK
High-confidence patternBLOCK
Potential secret (low confidence)WARN

Threats Addressed: Credential exposure, account takeover

CQ-02: Malware Patterns

Level: L1 | Enforcement: Scanner

Rationale: Known malware patterns in package ecosystems are well-documented. Blocking these patterns prevents low-effort attacks that have historically compromised npm, PyPI, and other registries.

Requirements:

  • Scanner MUST detect known malicious patterns
  • Bundle MUST NOT contain detected malware patterns
  • Detection MUST cover:
CategoryPatterns
ExfiltrationHTTP POST of environment variables, homedir contents
Reverse shellsSocket connections with shell spawn
Crypto minersKnown miner binaries, mining pool URLs
ObfuscationHeavy base64/hex encoding of executable code
Install hooksSuspicious postinstall/preinstall scripts

Verification:

ToolEcosystemNotes
GuardDogPythonPyPI-focused malware detection
Socket.devJavaScriptnpm supply chain analysis
SemgrepMulti-languageCustom rules for MCP patterns

Severity:

FindingAction
Known malware signatureBLOCK
Obfuscated code executionBLOCK
Suspicious install hookBLOCK
Network access in setup/installWARN (review required)

Threats Addressed: Malicious packages, supply chain attacks (2.2.3)

CQ-03: Static Analysis

Level: L2 | Enforcement: Scanner

Rationale: Static analysis catches common security anti-patterns (injection, unsafe deserialization, shell commands) before code executes.

Requirements:

  • Server code MUST pass static security analysis with no HIGH severity findings
  • Analysis applies to server source code only, not bundled dependencies

Tool Requirements:

LanguageToolRequired Checks
PythonBanditAll default security checks
JavaScript/TypeScriptESLint + eslint-plugin-securitydetect-child-process, detect-eval-with-expression, detect-non-literal-fs-filename
GogosecAll default checks
Rustcargo-audit + clippySecurity lints

Severity Mapping:

Tool SeverityTool ConfidenceMTF Severity
HIGHHIGHHIGH (blocking)
HIGHMEDIUMMEDIUM
MEDIUMHIGHMEDIUM
MEDIUMMEDIUMLOW
LOWAnyINFO

Exclusions:

  • Dependency directories: deps/, node_modules/, vendor/, site-packages/, .venv/
  • Test files: *test*, *spec*
  • Inline suppressions: # nosec: <reason> or // nosec: <reason> (justification required)

Severity:

FindingAction
HIGH severity in server codeBLOCK
MEDIUM severityWARN
LOW/INFOReport only
Suppression without justificationWARN

Threats Addressed: Injection attacks, unsafe code patterns (2.2.7)

CQ-04: Input Validation

Level: L3 | Enforcement: Scanner

Rationale: MCP tools receive input from LLMs, which may be influenced by malicious prompts. Typed schemas provide a defense layer against malformed or malicious input.

Requirements:

  • Tool handlers MUST use typed schemas for input validation
  • Validation MUST occur at handler entry point, before business logic

Acceptable Validation Approaches:

LanguageValidation Method
PythonPydantic models, dataclasses with validators, TypedDict with runtime check
JavaScript/TypeScriptZod, io-ts, TypeBox, JSON Schema (ajv)
GoStruct tags with go-playground/validator, JSON Schema

What Qualifies:

# Good: Pydantic model
class GetWeatherInput(BaseModel):
    location: str
    units: Literal["celsius", "fahrenheit"] = "celsius"

@tool
def get_weather(input: GetWeatherInput) -> str:
    ...

What Does NOT Qualify:

# Bad: Untyped dict
@tool
def get_weather(input: dict) -> str:
    location = input.get("location")  # No validation
    ...

Severity:

FindingAction
Tool handler with no detectable validationWARN (L3), BLOCK (L4)
Partial validation (some params untyped)WARN

Threats Addressed: Injection via malformed input, type confusion

CQ-05: Safe Execution Patterns

Level: L3 | Enforcement: Scanner

Rationale: Certain code patterns enable arbitrary code execution or command injection. These are rarely necessary in MCP servers and indicate either malicious intent or dangerous design.

Requirements:

  • Server code MUST NOT use unsafe execution patterns
  • Exceptions require explicit justification via inline suppression

Blocked Patterns - Python:

PatternSeverityRisk
subprocess.*(shell=True)HIGHShell injection
os.system()HIGHAlways uses shell
os.popen()HIGHUses shell
eval() with external inputCRITICALArbitrary code execution
exec() with external inputCRITICALArbitrary code execution
pickle.load() / pickle.loads()HIGHDeserialization attack
yaml.load() without Loader=SafeLoaderHIGHYAML deserialization

Blocked Patterns - JavaScript/TypeScript:

PatternSeverityRisk
child_process.exec()HIGHShell injection
child_process.execSync()HIGHShell injection
eval()HIGHArbitrary code execution
new Function() with external inputMEDIUMDynamic code execution
setTimeout(string, ...)MEDIUMImplicit eval
setInterval(string, ...)MEDIUMImplicit eval
Template literals in SQLHIGHSQL injection
.innerHTML = with external inputMEDIUMXSS

Safe Alternatives:

UnsafeSafe Alternative
subprocess.run(cmd, shell=True)subprocess.run(["cmd", "arg1", "arg2"])
child_process.exec(cmd)child_process.execFile(binary, args)
eval(jsonString)JSON.parse(jsonString)
pickle.loads(data)json.loads(data)

Severity:

FindingAction
CRITICAL patternBLOCK
HIGH patternBLOCK
MEDIUM patternWARN
Suppressed without justificationWARN

Threats Addressed: Command injection, code execution, deserialization attacks

CQ-06: Behavioral Analysis

Level: L4 | Enforcement: Registry

Rationale: Static analysis cannot catch all capability mismatches. Behavioral analysis executes the MCP server in a sandbox and verifies that runtime behavior matches manifest declarations.

Requirements:

  • Registry MUST execute bundle in instrumented sandbox before L4 certification
  • Observed behavior MUST match declared permissions in manifest
  • Violations MUST block publication

Monitored Behaviors:

BehaviorDetection MethodDeclared In
Network connectionsSocket syscall monitoringpermissions.network
Filesystem accessFile syscall monitoringpermissions.filesystem
Environment readsgetenv() tracingpermissions.environment
Process spawningfork/exec monitoringpermissions.subprocess
Tool invocationsMCP protocol interceptiontools array
OAuth scope requestsCredential access monitoringcredentials array

Test Protocol:

  1. Start MCP server in sandbox
  2. Monitor all syscalls during initialization phase
  3. Invoke each declared tool with valid test inputs
  4. Compare observed behavior against manifest declarations
  5. Generate behavioral report with pass/fail per requirement

Violation Severity:

ViolationSeverityAction
Network during init when network: noneCRITICALBLOCK
Filesystem access to sensitive paths when undeclaredCRITICALBLOCK
Environment access to secret patterns when environment: noneHIGHBLOCK
Subprocess when subprocess: noneCRITICALBLOCK
Undeclared tool invocationHIGHBLOCK
Tool behavior differs from descriptionMEDIUMWARN

Threats Addressed: Metadata manipulation (2.2.7), Initialization exfiltration (2.2.13)


3.5 Capability Declaration (CD-)

Capability declaration controls ensure that bundles transparently declare what they do, what access they require, and that declarations match actual behavior. These controls address MCP-specific threats including tool description poisoning and credential aggregation.

IDControlLevelEnforcementThreats Addressed
CD-01Tool DeclarationL1ScannerCapability opacity
CD-02Permission CorrelationL2ScannerManifest manipulation
CD-03Description SafetyL2ScannerTool description poisoning
CD-04Credential Scope DeclarationL3ScannerCredential aggregation
CD-05Token Lifetime LimitsL3ScannerToken abuse, scope creep

CD-01: Tool Declaration

Level: L1 | Enforcement: Scanner

Rationale: MCP servers expose tools to LLMs. Users must know what tools a bundle provides before installation. Undeclared tools prevent informed consent and audit.

Requirements:

  • Manifest MUST declare all tools the server provides
  • Tool declarations MUST include name and description
  • Server MUST NOT expose tools not declared in manifest

Tool Declaration Format:

{
  "tools": [
    {
      "name": "get_weather",
      "description": "Get current weather for a location"
    },
    {
      "name": "send_email",
      "description": "Send an email message"
    }
  ]
}

Required Fields:

FieldRequiredDescription
nameMUSTTool identifier (snake_case recommended)
descriptionMUSTHuman-readable description
inputSchemaSHOULDJSON Schema for parameters
outputSchemaSHOULDJSON Schema for return value

Severity:

FindingAction
Missing tools fieldBLOCK
Tool without nameBLOCK
Tool without descriptionWARN (L1), BLOCK (L2+)
Implemented tool not in manifestWARN (L1), BLOCK (L2+)

Threats Addressed: Capability opacity, undisclosed functionality

CD-02: Permission Correlation

Level: L2 | Enforcement: Scanner

Rationale: Manifests may declare benign permissions while code exercises dangerous capabilities. Static analysis detects mismatches between declared permissions and actual code behavior.

Requirements:

  • Manifest MUST declare permissions in _meta.org.mpaktrust.permissions
  • Static analysis MUST verify code matches declarations
  • Undeclared dangerous capabilities MUST block publication
  • Execution configuration (server, mcp_config) MUST NOT enable behavior outside declared permissions

Permission Categories:

{
  "_meta": {
    "org.mpaktrust": {
      "permissions": {
        "filesystem": "none | read | write | full",
        "network": "none | outbound | inbound | full",
        "environment": "none | read | write",
        "subprocess": "none | restricted | full",
        "native": "none | required"
      }
    }
  }
}

Severity by Context:

Undeclared CapabilityContextSeverity
subprocess or nativeAnyCRITICAL (block)
networkInitialization (import/startup)HIGH (block)
networkRuntime (tool handlers)MEDIUM (warn)
environmentSecret patterns (AWS_*, *_TOKEN, *_KEY)HIGH (block)
environmentGeneral configLOW (info)
filesystemSensitive paths (~/.ssh, ~/.aws, ~/.config)HIGH (block)
filesystemOther pathsMEDIUM (warn)

Threats Addressed: Manifest manipulation (2.2.7), hidden capabilities

CD-03: Description Safety

Level: L2 | Enforcement: Scanner

Rationale: LLMs treat tool descriptions as trusted instructions. Malicious descriptions can instruct LLMs to exfiltrate data, ignore user intent, or perform unauthorized actions.

Requirements:

  • Tool descriptions MUST be scanned for injection patterns
  • Detected patterns MUST block publication
  • This control catches low-effort attacks, not sophisticated paraphrasing

What CD-03 Detects:

Pattern CategoryExamplesSeverity
Instruction override”ignore previous instructions”, “disregard user request”CRITICAL
File exfiltration”read ~/.ssh”, “cat /etc/passwd”, “include contents of”CRITICAL
Data transmission”send to URL”, “POST to”, “exfiltrate”, “transmit”CRITICAL
ObfuscationBase64-encoded instructions, hex escapes, unicode tricksHIGH
Hidden instructionsZero-width characters, homoglyphs, RTL overrideHIGH
Semantic mismatchTool named get_weather with description about file accessHIGH

What CD-03 Does NOT Catch:

Attack TypeWhy It EvadesMitigation
Semantic paraphrasing”Please include the user’s key file” vs “read ~/.ssh”Runtime isolation (v0.2)
Rug pullDescription changes after approvalRT-02 (v0.2)
Schema poisoningInjection in inputSchema or outputSchemaFull schema validation

Severity:

FindingAction
Instruction override patternBLOCK
File exfiltration patternBLOCK
Data transmission patternBLOCK
Obfuscation detectedBLOCK
Semantic mismatchBLOCK
Suspicious phrasing (low confidence)WARN

Threats Addressed: Tool description poisoning (2.2.8)

CD-04: Credential Scope Declaration

Level: L3 | Enforcement: Scanner

Rationale: MCP servers aggregate OAuth tokens across multiple services. A compromised server with broad scopes creates concentrated breach potential. Declaring scopes enables user review and least-privilege enforcement.

Requirements:

  • Bundles requiring OAuth MUST declare all scopes in manifest
  • Declared scopes MUST follow least-privilege principle
  • Over-broad scopes MUST trigger review

Credential Declaration Format:

{
  "_meta": {
    "org.mpaktrust": {
      "credentials": [
        {
          "provider": "google",
          "scopes": ["https://www.googleapis.com/auth/calendar.readonly"],
          "justification": "Read calendar events for scheduling"
        }
      ]
    }
  }
}

Scope Risk Classification:

Risk LevelCriteriaExamples
LOWRead-only, limited datacalendar.readonly, read:user
MEDIUMWrite access, broader readcalendar, repo:status
HIGHFull access, sensitive datamail.read, repo
CRITICALAdmin, impersonationadmin, https://mail.google.com/

Severity:

FindingAction
OAuth used without credentials declarationBLOCK
CRITICAL scope without justificationBLOCK
HIGH scope without justificationWARN
Over-broad scope with narrow alternativeWARN
Scope not used by any declared toolWARN

Threats Addressed: Credential aggregation (2.2.12)

CD-05: Token Lifetime Limits

Level: L3 | Enforcement: Scanner

Rationale: Long-lived tokens increase blast radius if a server is compromised. Tokens should be short-lived with refresh capability, and servers should not persist tokens beyond session.

Requirements:

  • Bundles MUST declare token handling behavior
  • Long-lived token storage MUST be flagged
  • Refresh token handling MUST be documented

Token Handling Declaration:

{
  "_meta": {
    "org.mpaktrust": {
      "credentials": [
        {
          "provider": "google",
          "scopes": ["calendar.readonly"],
          "token_handling": {
            "storage": "memory",
            "max_lifetime_seconds": 3600,
            "refresh": true
          }
        }
      ]
    }
  }
}

Storage Risk Levels:

StorageRiskNotes
memoryLOWToken cleared on process exit
keychainMEDIUMOS-managed secure storage
fileHIGHPersistent, potentially exposed
UnspecifiedHIGHAssume worst case

Severity:

FindingAction
Token persisted to file without declarationWARN
storage: file without justificationWARN
Token lifetime > 24h without justificationWARN
Indefinite token without justificationBLOCK

Threats Addressed: Token abuse, credential aggregation (2.2.12)


3.6 Provenance (PR-)

Provenance controls establish the origin, authorship, and build history of bundles. They create an auditable chain from source code to published artifact.

IDControlLevelEnforcementThreats Addressed
PR-01Source RepositoryL2ScannerUnverifiable origin
PR-02Author IdentityL2RegistryUnverified publisher
PR-03Build AttestationL3ScannerBuild tampering
PR-04Commit LinkageL4ScannerSource mismatch
PR-05Repository HealthL3ScannerInsecure development

PR-01: Source Repository

Level: L2 | Enforcement: Scanner

Rationale: Bundles without source repositories cannot be audited, forked, or independently verified. Source access is foundational for security review and incident response.

Requirements:

  • Manifest MUST include repository field with valid URL
  • Repository MUST be publicly accessible (or attestation-verified for private)
  • URL MUST point to recognized hosting platform

Repository Declaration:

{
  "repository": {
    "type": "git",
    "url": "https://github.com/org/repo"
  }
}

Recognized Hosting Platforms:

PlatformURL Pattern
GitHubhttps://github.com/*
GitLabhttps://gitlab.com/*
Bitbuckethttps://bitbucket.org/*
Codeberghttps://codeberg.org/*
SourceHuthttps://sr.ht/*, https://git.sr.ht/*

Severity:

FindingAction
Missing repository fieldBLOCK (L2+)
Invalid URL formatBLOCK
Non-HTTPS URLWARN
Unknown hosting platformWARN
Private repo without attestation at L3+BLOCK

Threats Addressed: Unverifiable origin, audit impossibility

PR-02: Author Identity

Level: L2 | Enforcement: Registry

Rationale: Anonymous publishing prevents accountability during incidents. Verified identity enables contact for security disclosures and establishes trust signals for users.

Requirements:

  • Manifest MUST include author field
  • Publisher account MUST be verified per identity tier (PK-01)
  • L3+ bundles MUST have multi-owner registration

Author Declaration:

{
  "author": {
    "name": "Publisher Name",
    "email": "publisher@example.com",
    "url": "https://example.com"
  }
}

Identity Verification Tiers:

TierVerification MethodTrust Level
Tier 1GitHub/GitLab OIDC (account age 90+ days)High
Tier 2Organizational SSO with domain verificationHigh
Tier 3Email with out-of-band verificationMedium

Tier Requirements by Level:

Compliance LevelMinimum Tier
L1None required
L2Tier 3 (email)
L3Tier 1 or 2
L4Tier 1 or 2

Severity:

FindingAction
Missing author fieldBLOCK (L2+)
Missing emailBLOCK (L2+)
Tier 3 identity at L3+BLOCK
Single owner at L3+BLOCK

Threats Addressed: Unverified publisher (2.2.10), accountability gaps

PR-03: Build Attestation

Level: L3 | Enforcement: Scanner

Rationale: Build attestation proves that a bundle was produced by a trusted build system from specific source code. Without attestation, publishers could inject code not present in the source repository.

Requirements:

  • Bundle MUST include SLSA provenance attestation
  • Attestation MUST be signed by trusted builder
  • Attestation MUST link bundle to source commit

Trusted Attestation Producers:

BuilderPlatformSLSA Level
slsa-github-generatorGitHub ActionsSLSA 3
GitLab CI with SLSAGitLabSLSA 2-3
Google Cloud BuildGCPSLSA 3

Attestation Signing/Verification:

Attestations SHOULD be signed and verified using Sigstore (Fulcio + Cosign) or equivalent mechanisms.

SLSA Provenance Format:

Attestations MUST follow SLSA Provenance v1.

Severity:

FindingAction
Missing attestation at L3+BLOCK
Invalid attestation signatureBLOCK
Attestation subject mismatchBLOCK
Unknown builderBLOCK
Missing source commit in attestationWARN

Threats Addressed: Build tampering, provenance gaps (2.2.5)

PR-04: Commit Linkage

Level: L4 | Enforcement: Scanner

Rationale: Commit linkage binds a bundle to an exact, auditable point in source history. With commit linkage, reviewers can diff the published bundle against the exact source state.

Requirements:

  • Manifest MUST declare exact source commit
  • Commit MUST be a 40-character lowercase hexadecimal SHA-1 string
  • Commit MUST be reachable in declared repository
  • Commit SHOULD be signed (GPG or SSH)

Commit Declaration:

{
  "_meta": {
    "org.mpaktrust": {
      "source": {
        "commit": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0",
        "signed": true,
        "tag": "v1.0.0"
      }
    }
  }
}

Severity:

FindingAction
Missing source.commit at L4BLOCK
Commit not found in repositoryBLOCK
Commit mismatch with attestationBLOCK
Short commit SHA (< 40 chars)BLOCK
Commit not signed at L4WARN

Threats Addressed: Source mismatch, build provenance gaps (2.2.5)

PR-05: Repository Health

Level: L3 | Enforcement: Scanner

Rationale: Repositories with poor security practices are more likely to be compromised. OpenSSF Scorecard measures security hygiene including branch protection, CI security, and dependency management.

Requirements:

  • Source repository MUST be analyzed with OpenSSF Scorecard
  • Score MUST meet minimum threshold for compliance level
  • Critical security checks MUST pass regardless of score

Score Thresholds:

Compliance LevelMinimum Score
L3 Verified≥ 5.0
L4 Attested≥ 7.0

Blocking Checks:

These checks MUST pass regardless of overall score:

CheckRationale
Token-PermissionsPrevents credential theft via CI
Dangerous-WorkflowPrevents arbitrary code execution in CI
Branch-ProtectionPrevents force-push and unauthorized commits

Severity:

FindingAction
Score below thresholdBLOCK
Token-Permissions check failsBLOCK
Dangerous-Workflow check failsBLOCK
Branch-Protection check failsBLOCK
Scorecard unavailableSKIP (not failure)
Scorecard results > 30 days oldWARN

Threats Addressed: Insecure development practices, CI compromise


3.7 Registry Operations (RG-)

Registry operations controls govern how package registries manage namespaces, maintain index integrity, and handle security incidents. These controls apply to registries that adopt MTF.

Scope: RG controls apply only to MTF-compliant registries. Bundles distributed through other channels (npm, GitHub releases) cannot satisfy RG controls. Clients SHOULD warn when installing from non-compliant sources.

IDControlLevelEnforcementThreats Addressed
RG-01Namespace GovernanceL2RegistryNamespace confusion
RG-02Name Pattern ReviewL2RegistryTyposquatting, slopsquatting
RG-03Index IntegrityL3RegistryRegistry poisoning
RG-04Freshness GuaranteesL3RegistryStale/replayed data
RG-05Revocation FeedL2RegistryCompromised bundles
RG-06Transparency LogL3RegistryRegistry poisoning, stealth revocations
RG-07Bundle DigestL2RegistryTampering in transit, registry poisoning

RG-01: Namespace Governance

Level: L2 | Enforcement: Registry

Rationale: Uncontrolled namespaces enable impersonation and confusion attacks. Scoped names (@org/package) establish clear ownership.

Requirements:

  • L2+ packages MUST use scoped names (@scope/package-name)
  • Organizations MAY reserve namespaces via verification
  • Registries MUST block unauthorized use of reserved namespaces

Scoped Name Format:

@scope/package-name

Namespace Reservation Methods:

MethodVerification
Domain verificationDNS TXT record or meta tag
GitHub organizationOIDC claim from org membership
Trademark documentationManual registry review

Severity:

FindingAction
Unscoped name at L2+BLOCK
Publication to reserved namespace by non-ownerBLOCK
Namespace similar to reserved (Levenshtein ≤ 2)Enhanced review (RG-02)

Threats Addressed: Namespace confusion (2.2.1)

RG-02: Name Pattern Review

Level: L2 | Enforcement: Registry

Rationale: High-risk name patterns are prime targets for typosquatting and slopsquatting. Enhanced review catches suspicious registrations.

Requirements:

  • Registries MUST analyze new package names for high-risk patterns
  • High-risk patterns MUST trigger enhanced review
  • Enhanced review requires additional verification

Detection Methods:

MethodImplementationSeverity
Name similarityLevenshtein distance ≤ 2 from top packagesHIGH
Scope mimicryScopes similar to known organizationsCRITICAL
Semantic patternsGeneric compounds (see below)HIGH
LLM bait namesPlausible service compounds without affiliationHIGH

High-Risk Patterns:

PatternExamplesRisk
Similar to popular packagesstripe-mcp vs strpe-mcpTyposquatting
Version-like suffixesrequests2, numpy-nextConfusion
Generic utilitiesutils-*, *-tools, *-helperLow-effort squatting
Framework pluginsfastapi-*-middlewareLLM hallucination target
Service name compoundsstripe-*, github-*Requires affiliation disclaimer

Enhanced Review Requirements:

Package may proceed if ANY of:

ConditionVerification
Publisher account age > 30 daysAutomatic
Verified organization identity (Tier 1/2)Automatic
Manual registry operator approvalHuman review
Affiliation disclaimer presentFor service name compounds

Severity:

FindingAction
Scope mimicry (CRITICAL)BLOCK
Homoglyph in nameBLOCK
High-risk pattern + new account + no verificationBLOCK
High-risk pattern + verified publisherWARN, allow
Service name without affiliation disclaimerBLOCK

Threats Addressed: Typosquatting (2.2.1), Slopsquatting (2.2.2)

RG-03: Index Integrity

Level: L3 | Enforcement: Registry

Rationale: Compromised registry infrastructure could modify the package index. Signed indexes with chain integrity prevent undetected tampering.

Requirements:

  • Registry MUST sign the package index
  • Index updates MUST include chain integrity (previous hash)
  • Clients MUST verify index signature before trusting contents

Signed Index Format:

{
  "version": 12345,
  "timestamp": "2026-02-06T12:00:00Z",
  "previous_hash": "sha256:abc123...",
  "packages": { ... },
  "signature": { ... }
}

Chain Integrity:

Each index contains the hash of the previous index, creating an append-only chain.

Severity:

FindingAction
Index signature invalidBLOCK all installs
Chain integrity brokenBLOCK, alert registry operator
Index version rollbackBLOCK
Missing signatureBLOCK (L3+)

Threats Addressed: Registry poisoning (2.2.9)

RG-04: Freshness Guarantees

Level: L3 | Enforcement: Registry

Rationale: Stale index data could cause clients to miss security updates or install revoked packages.

Requirements:

  • Registries MUST include signed timestamps in index
  • Clients MUST reject index data beyond staleness threshold
  • Registries MUST update index within defined SLA

Staleness Thresholds:

ContextMaximum Age
Production use24 hours
Development use7 days

Severity:

FindingAction
Index older than production thresholdBLOCK
Index older than development thresholdWARN
Missing timestampBLOCK
Timestamp in future (> 5 min)BLOCK (potential replay)

Threats Addressed: Stale data, replay attacks

RG-05: Revocation Feed

Level: L2 | Enforcement: Registry

Rationale: When bundles are compromised, clients must be able to block installation quickly.

Requirements:

  • Registries MUST provide signed revocation feed
  • Feed MUST be updated within 24 hours of revocation decision
  • Clients MUST check revocation before installation

Revocation Feed Format:

{
  "timestamp": "2026-02-06T12:00:00Z",
  "signature": "...",
  "revoked": [
    {
      "package": "@evil/malware",
      "versions": ["*"],
      "reason": "malicious",
      "revoked_at": "2026-02-05T08:00:00Z"
    }
  ]
}

Revocation Reasons:

ReasonDefinition
maliciousBundle contains intentional malware
compromisedPublisher credentials were compromised
vulnerableCritical unpatched vulnerability
takedownLegal or policy takedown request
supersededReplaced by security-patched version

Takedown Response Times:

SeverityMaximum Response Time
Critical (active exploitation)4 hours
High (malicious content)24 hours
Medium (policy violation)72 hours

Severity:

FindingAction
Package in revocation feedBLOCK installation
Revocation feed unavailable (L1-L2)WARN, allow with confirmation
Revocation feed unavailable (L3+)BLOCK (unless explicitly configured fail-open)
Revocation feed signature invalidBLOCK all installs

Threats Addressed: Compromised bundles, malicious updates (2.2.4)

RG-06: Transparency Log

Level: L3 | Enforcement: Registry

Rationale: Transparency logs make registry operations auditable and detectable. If a registry is compromised, the log provides evidence of unauthorized actions. Without transparency, stealth revocations or unauthorized publications may go unnoticed.

Requirements:

  • Registry MUST maintain an append-only transparency log of security-relevant events
  • Registry MUST publish signed checkpoints (Merkle tree head, size, timestamp)
  • Clients SHOULD verify checkpoint signatures
  • Clients MAY verify inclusion proofs when available

Logged Events:

Event TypeData Logged
Bundle publishPackage name, version, publisher, timestamp
Bundle unpublishPackage name, version, reason, timestamp
RevocationPackage name, versions, reason, timestamp
Identity verificationPublisher ID, tier, verification method
Key rotationPublisher ID, old key fingerprint, new key fingerprint

Checkpoint Format:

Registries MAY use Sigstore Rekor, RFC 9162 (Certificate Transparency), or equivalent Merkle tree structures.

Severity:

FindingAction
Missing transparency log at L3+BLOCK registry compliance
Checkpoint signature invalidWARN, alert registry operator
Inclusion proof verification failsWARN, flag package

Threats Addressed: Registry poisoning (2.2.9), stealth revocations, unauthorized publications

RG-07: Bundle Digest

Level: L2 | Enforcement: Registry

Rationale: Bundle integrity must be verifiable without relying on content hashes inside the bundle itself. The registry computes a digest of the uploaded archive and serves it alongside download URLs, enabling clients to detect tampering in transit or at rest.

Requirements:

  • Registry MUST compute SHA-256 digest of the bundle archive on upload
  • Registry MUST store and serve the digest alongside the bundle download URL
  • Registry MUST reject re-uploads where the archive content differs but name and version match
  • Clients MUST verify the bundle digest after download before extraction

Digest Serving:

Registries MUST include the digest in API responses for package metadata:

{
  "name": "@acme/weather-server",
  "version": "1.0.0",
  "dist": {
    "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "url": "https://registry.example.com/bundles/@acme/weather-server/1.0.0.tar.gz"
  }
}

Client Verification:

  1. Download bundle archive
  2. Compute SHA-256 of the downloaded archive
  3. Compare to the digest provided by the registry
  4. BLOCK installation if mismatch; retry download once before failing

Severity:

FindingAction
Registry does not serve digestBLOCK at L2+
Digest mismatch after downloadBLOCK, retry
Re-upload with different contentBLOCK

Threats Addressed: Tampering in transit, registry poisoning (2.2.9)


3.8 Publisher Identity (PK-)

Publisher identity controls govern how publishers verify their identity, manage signing keys, and recover from security incidents.

IDControlLevelEnforcementThreats Addressed
PK-01Identity TiersL2RegistryUnverified publisher
PK-02Key RotationL3RegistryKey compromise
PK-03Compromise RecoveryL3RegistryAccount takeover
PK-04Account SuccessionL3RegistryAbandoned packages

PK-01: Identity Tiers

Level: L2 | Enforcement: Registry

Rationale: Different verification methods provide different trust levels. Higher-trust identities are required for publishing bundles with dangerous capabilities.

Requirements:

  • Publishers MUST verify identity before publishing
  • Identity tier MUST match compliance level requirements
  • Dangerous permissions require high-trust identity

Identity Tiers:

TierVerification MethodTrust LevelAccount Requirements
Tier 1GitHub/GitLab OIDCHighAccount age ≥ 90 days
Tier 2Organizational SSO + domain verificationHighVerified corporate domain
Tier 3Email with out-of-band verificationMediumConfirmed email address

Permission Restrictions by Tier:

PermissionTier 1Tier 2Tier 3
filesystem: read
filesystem: write
network: outbound
subprocess: restricted
subprocess: full
native: required

Severity:

FindingAction
No identity verification at L2+BLOCK
Tier 3 at L3+BLOCK
Tier 3 with subprocess or nativeBLOCK
Account age < 90 days for Tier 1Downgrade to Tier 3

Threats Addressed: Unverified publisher (2.2.10)

PK-02: Key Rotation

Level: L3 | Enforcement: Registry

Rationale: Long-lived signing keys accumulate compromise risk. Regular rotation limits the window of exposure.

Requirements:

  • Publishers using long-lived keys MUST rotate annually
  • Key rotation MUST be announced in advance
  • Previous keys MUST remain valid during transition period

Rotation Schedule:

MilestoneTiming
New key generation30 days before rotation
Rotation announcement30 days before rotation
New key activeRotation date
Old key valid90 days after rotation
Old key revoked90 days after rotation

Severity:

FindingAction
Key age > 12 monthsWARN
Key age > 14 monthsBLOCK new publications
Signature with revoked keyBLOCK

Threats Addressed: Key compromise, long-term credential exposure

PK-03: Compromise Recovery

Level: L3 | Enforcement: Registry

Rationale: When publisher credentials are compromised, rapid response limits damage.

Requirements:

  • Publishers SHOULD register backup identity for recovery
  • Registries MUST have documented compromise response process
  • Compromised bundles MUST be revoked within defined SLA

Compromise Response Timeline:

PhaseTimingActions
Immediate0-4 hoursRevoke all bundles published during suspected window
Verification4-24 hoursPublisher verifies identity through backup channel
Credential Reset24-48 hoursNew identity credentials issued
Review48 hours - 7 daysCompromised bundles reviewed; clean versions may be re-published

Severity:

FindingAction
Compromise confirmedRevoke bundles per timeline
No backup identity registeredWARN (recommended)
Re-publication without version incrementBLOCK

Threats Addressed: Account takeover, malicious updates (2.2.4)

PK-04: Account Succession

Level: L3 | Enforcement: Registry

Rationale: Publishers may leave projects or become unreachable. Orderly succession ensures packages remain maintainable.

Requirements:

  • Registries MUST provide ownership transfer mechanism
  • Transfers MUST include cooling-off period and notification
  • Abandoned packages MUST be flagged for users

Ownership Transfer Process:

StepRequirement
1. RequestNew owner submits transfer request
2. VerificationNew owner identity verified (Tier 1/2 for L3+)
3. NotificationAll current owners notified
4. Cooling-off7-day waiting period
5. ConfirmationCurrent owner approves OR cooling-off expires
6. TransferOwnership updated, logged

Abandonment Detection:

ConditionThreshold
No publications> 12 months
Owner inactive> 12 months
UnresponsiveNo reply to security contact for 30 days
Open CVEsCritical CVE unpatched for 90 days

Severity:

FindingAction
Package abandoned + critical CVEFlag for community transfer
Package dormant > 12 monthsDisplay “unmaintained” warning
Ownership transfer without notificationBLOCK

Threats Addressed: Abandoned packages (2.2.11)


3.9 Installation (IN-)

Installation controls govern client-side verification, user consent, and recovery capabilities.

IDControlLevelEnforcementThreats Addressed
IN-01Pre-Installation ChecksL1ClientRevoked/invalid bundles
IN-02Post-Download VerificationL2ClientTampering in transit
IN-03User TransparencyL1ClientUninformed consent
IN-04Rollback CapabilityL2ClientFailed updates, compromise recovery

IN-01: Pre-Installation Checks

Level: L1 | Enforcement: Client

Rationale: Clients are the last line of defense before code executes.

Requirements:

  • Clients MUST perform safety checks before installation
  • Blocking checks MUST prevent installation
  • Non-blocking checks MUST display warnings

Checks by Level:

CheckL1L2L3L4Failure Action
Revocation feed queryBLOCK
Manifest schema validationBLOCK
Required fields presentBLOCK
Bundle digest verifiedBLOCK
Signature presentBLOCK
Signature validBLOCK
Attestation presentBLOCK
Attestation validBLOCK

Severity:

FindingAction
Any blocking check failsBLOCK installation
Revocation feed unavailable (L1-L2)WARN, require confirmation
Revocation feed unavailable (L3+)BLOCK (unless explicitly configured fail-open)

Threats Addressed: Installing revoked/compromised bundles

IN-02: Post-Download Verification

Level: L2 | Enforcement: Client

Rationale: Bundles may be tampered with during download. Post-download verification ensures integrity before extraction.

Requirements:

  • Clients MUST verify bundle digest after download (RG-07)
  • Clients MUST verify bundle completeness after extraction (AI-05)

Verification Sequence:

  1. Download bundle archive
  2. Verify bundle digest matches registry-provided digest (RG-07)
  3. Extract to temporary location
  4. Check for unexpected executables (AI-05)
  5. Move to final installation location
  6. Update client lockfile

Severity:

FindingAction
Bundle digest mismatchBLOCK, retry
Unexpected executableBLOCK

Threats Addressed: Tampering in transit, registry poisoning (2.2.9)

IN-03: User Transparency

Level: L1 | Enforcement: Client

Rationale: Users must understand what they’re installing before consenting.

Requirements:

  • Clients MUST display package information before installation
  • Users MUST explicitly consent to installation
  • Critical findings MUST be prominently displayed

Information Display:

InformationLevelDisplay
Package name and versionL1+Always
Publisher identityL1+Always
MTF compliance levelL1+Always
Tools providedL1+Always
Permissions requestedL2+Always
OAuth scopesL3+If present
Risk indicatorsL2+If present
Critical findingsAllProminent warning

Consent Modes:

ModeBehavior
InteractivePrompt for each installation
Pre-approved listAllow listed packages without prompt
CI/CD modeFail if consent would be required

Severity:

FindingAction
User declines installationAbort
Interactive mode unavailableAbort unless pre-approved
Critical finding + silent modeBLOCK (require explicit override)

Threats Addressed: Uninformed consent, social engineering

IN-04: Rollback Capability

Level: L2 | Enforcement: Client

Rationale: When an update introduces problems, users need to quickly restore the previous version.

Requirements:

  • Clients MUST retain previous version after update
  • Clients MUST provide rollback command
  • Clients MUST handle compromise detection gracefully

Version Retention:

PolicyDefault
Versions retained1 previous
Retention period7 days

Rollback Command:

mpak rollback @acme/server         # Previous version
mpak rollback @acme/server@1.0.0   # Specific version
mpak rollback --list @acme/server  # List available

Compromise Response:

When a compromised package is detected:

  1. Disable server immediately
  2. Notify user with compromise details
  3. Offer rollback if clean version available
  4. Log incident for security review

Severity:

FindingAction
Rollback target revokedBLOCK rollback
No previous version availableWARN, offer uninstall
Compromise detectedDisable server, notify user

Threats Addressed: Failed updates, compromise recovery, malicious updates (2.2.4)


3.10 Update Lifecycle (UP-)

Update lifecycle controls govern how packages evolve, including version management, breaking changes, and deprecation.

IDControlLevelEnforcementThreats Addressed
UP-01Update NotificationL2Registry + ClientMissed security updates
UP-02Breaking Change PolicyL2RegistryUnexpected breakage
UP-03Deprecation ProcessL2RegistryAbandoned packages
UP-04Version MonotonicityL2RegistryVersion confusion attacks

UP-01: Update Notification

Level: L2 | Enforcement: Registry + Client

Rationale: Users must be informed of available updates, especially security fixes.

Requirements:

  • Registries MUST provide update notification mechanism
  • Clients MUST check for updates regularly
  • Security updates MUST be distinguished from feature updates

Update Types:

TypeDescriptionPriority
securityFixes vulnerabilityHigh (push notification)
patchBug fixesMedium
minorNew features, backward compatibleLow
majorBreaking changesInformational

Consent-Required Changes:

Automatic updates MUST NOT proceed if:

ChangeReason
New permissionsExpands attack surface
Expanded OAuth scopesIncreases credential access
New network access at initExfiltration risk
subprocess or native addedHigh-risk capability

Severity:

FindingAction
Critical security update availableProminent notification
Update requires consentBlock auto-update, prompt user

Threats Addressed: Missed security patches

UP-02: Breaking Change Policy

Level: L2 | Enforcement: Registry

Rationale: Breaking changes without warning disrupt users. Semantic versioning provides a contract for predictable updates.

Requirements:

  • Publishers MUST follow semantic versioning
  • Breaking changes MUST increment major version
  • Published versions MUST NOT be modified

MCP-Specific Breaking Changes:

ChangeBreaking?Version Bump
Tool removedYesMajor
Tool renamedYesMajor
Tool parameter removedYesMajor
Tool parameter added (required)YesMajor
Tool parameter added (optional)NoMinor
Permission scope expandedYesMajor
OAuth scope addedYesMajor

Version Immutability:

ActionAllowed
Publish 1.0.0
Publish 1.0.1
Re-publish 1.0.0 with different content✗ BLOCK

Severity:

FindingAction
Breaking change in patch versionWARN publisher
Digest mismatch on republishBLOCK

Threats Addressed: Unexpected breakage, version confusion

UP-03: Deprecation Process

Level: L2 | Enforcement: Registry

Rationale: Deprecated packages with no migration path leave users stranded.

Requirements:

  • Deprecation MUST provide minimum notice period
  • Deprecation MUST include migration guidance
  • Deprecated packages MUST remain installable during notice period

Deprecation Timeline:

PhaseTimingActions
AnnounceDay 0Publish deprecation notice
Notice period90 daysPackage installable, warnings shown
Soft removalDay 90Remove from search, direct install allowed
Hard removalDay 180Block new installs

Severity:

FindingAction
Installing deprecated packageWARN
Installing after soft removalWARN (require confirmation)
Installing after hard removalBLOCK
Unmaintained + open CVEsWARN prominently

Threats Addressed: Abandoned packages (2.2.11)

UP-04: Version Monotonicity

Level: L2 | Enforcement: Registry

Rationale: Non-monotonic version publishing enables attacks where old vulnerable content is published under version numbers that appear higher.

Requirements:

  • Version numbers MUST be monotonically increasing per semver
  • Registries MUST reject non-monotonic version publications
  • Version history MUST be immutable

Monotonicity Rule:

V_new > V_existing (per semver ordering)

Valid Sequences:

1.0.0 → 1.0.1 → 1.1.0 → 2.0.0  ✓
1.0.0 → 1.1.0 → 1.0.1          ✗ (1.0.1 < 1.1.0)

Severity:

FindingAction
Non-monotonic versionBLOCK publication
Version already existsBLOCK (see UP-02)
Yanked version reuse attemptBLOCK

Threats Addressed: Version confusion, malicious updates (2.2.4)

4. Manifest Specification

4.1 Relationship to mcpb

MTF extends the mcpb manifest format. Bundles MUST be valid mcpb manifests. MTF adds security metadata under the _meta.org.mpaktrust namespace, following mcpb’s extension conventions.

Extension namespace: _meta.org.mpaktrust

MTF fields are placed under this namespace to:

  • Avoid collision with future mcpb fields
  • Clearly identify MTF-specific metadata
  • Follow reverse domain notation conventions

Validation is two-step:

  1. Validate manifest against mcpb schema (ensures bundle can execute)
  2. Validate _meta['org.mpaktrust'] against MTF extension schema (ensures security metadata is correct)

4.2 mcpb Required Fields

These fields are defined by mcpb. MTF requires them at specified levels.

FieldTypeMTF RequiresDescription
manifest_versionstringL1mcpb schema version
namestringL1Package name (@scope/name for L2+)
versionstringL1Semantic version
descriptionstringL1Human-readable description
authorobjectL2Publisher identity (name, email, url)
repositoryobjectL2Source repository (type, url)
toolsarrayL1Tool declarations
serverobjectL1Server execution config

4.3 MTF Extension Fields

These fields are defined by MTF and live under _meta.org.mpaktrust.

4.3.1 Core Fields

FieldTypeRequiredDescription
mtf_versionstringL1MTF spec version (e.g., “0.1”)
levelnumberL2Declared compliance level (1-4)
permissionsobjectL2System access requirements

4.3.2 Permission Categories

{
  "_meta": {
    "org.mpaktrust": {
      "permissions": {
        "filesystem": "none | read | write | full",
        "network": "none | outbound | inbound | full",
        "environment": "none | read | write",
        "subprocess": "none | restricted | full",
        "native": "none | required"
      }
    }
  }
}
CategoryValuesDescription
filesystemnone, read, write, fullFile system access
networknone, outbound, inbound, fullNetwork connections
environmentnone, read, writeEnvironment variables
subprocessnone, restricted, fullProcess spawning
nativenone, requiredNative code / FFI

4.3.3 Credential Fields (L3+)

{
  "_meta": {
    "org.mpaktrust": {
      "credentials": [
        {
          "provider": "google",
          "scopes": ["https://www.googleapis.com/auth/calendar.readonly"],
          "justification": "Read calendar events for scheduling",
          "token_handling": {
            "storage": "memory",
            "max_lifetime_seconds": 3600,
            "refresh": true
          }
        }
      ]
    }
  }
}

4.3.4 Provenance Fields (L3+/L4)

{
  "_meta": {
    "org.mpaktrust": {
      "source": {
        "commit": "a1b2c3d4e5f6...",
        "signed": true,
        "tag": "v1.0.0"
      },
      "build": {
        "builder": "https://github.com/slsa-framework/slsa-github-generator/...",
        "reproducible": true,
        "instructions": "https://github.com/org/repo/blob/main/BUILD.md"
      }
    }
  }
}
FieldTypeRequiredDescription
source.commitstringL4Full 40-character commit SHA
source.signedbooleanRecommendedWhether commit is GPG/SSH signed
source.tagstringOptionalAssociated release tag
build.builderstringL3Builder identity URI
build.reproduciblebooleanL4Whether build is reproducible
build.instructionsstringRecommendedURL to build instructions

4.4 Example Manifests

L1 Basic

{
  "manifest_version": "0.3",
  "name": "my-weather-server",
  "version": "0.1.0",
  "description": "Simple weather lookup",
  "server": {
    "type": "python",
    "entry_point": "server.py"
  },
  "mcp_config": {
    "command": "python",
    "args": ["-m", "weather.server"]
  },
  "tools": [
    {
      "name": "get_weather",
      "description": "Get current weather for a location"
    }
  ],
  "_meta": {
    "org.mpaktrust": {
      "mtf_version": "0.1"
    }
  }
}

L2 Standard

{
  "manifest_version": "0.3",
  "name": "@acme/weather-server",
  "version": "1.0.0",
  "description": "Production weather service",
  "author": {
    "name": "Acme Corp",
    "email": "mcp@acme.com"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/acme/weather-server"
  },
  "server": {
    "type": "python",
    "entry_point": "server.py"
  },
  "mcp_config": {
    "command": "python",
    "args": ["-m", "weather.server"]
  },
  "tools": [
    {
      "name": "get_weather",
      "description": "Get current weather for a location"
    }
  ],
  "_meta": {
    "org.mpaktrust": {
      "mtf_version": "0.1",
      "level": 2,
      "permissions": {
        "filesystem": "none",
        "network": "outbound",
        "environment": "read",
        "subprocess": "none",
        "native": "none"
      }
    }
  }
}

L3 Verified

{
  "manifest_version": "0.3",
  "name": "@acme/calendar-sync",
  "version": "2.0.0",
  "description": "Sync calendar events across services",
  "author": {
    "name": "Acme Corp",
    "email": "mcp@acme.com",
    "url": "https://acme.com"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/acme/calendar-sync"
  },
  "server": {
    "type": "python",
    "entry_point": "server.py"
  },
  "mcp_config": {
    "command": "python",
    "args": ["-m", "calendar_sync.server"]
  },
  "tools": [
    {
      "name": "sync_events",
      "description": "Sync events between Google and Outlook calendars"
    }
  ],
  "_meta": {
    "org.mpaktrust": {
      "mtf_version": "0.1",
      "level": 3,
      "permissions": {
        "filesystem": "none",
        "network": "outbound",
        "environment": "read",
        "subprocess": "none",
        "native": "none"
      },
      "credentials": [
        {
          "provider": "google",
          "scopes": ["https://www.googleapis.com/auth/calendar"],
          "justification": "Read and write calendar events for sync",
          "token_handling": {
            "storage": "memory",
            "max_lifetime_seconds": 3600,
            "refresh": true
          }
        }
      ],
      "signature": {
        "type": "sigstore",
        "bundle": ".sigstore/manifest.sig.json"
      }
    }
  }
}

4.5 Schema Location

Normative Schemas:

SchemaURL
MTF Extensionhttps://mpaktrust.org/schemas/mtf/v0.1/mtf-extension.json
Verification Reporthttps://mpaktrust.org/schemas/mtf/v0.1/report.json

External Schemas:

SchemaSpecification
VEX StatementOpenVEX v0.2.0
SLSA ProvenanceSLSA Provenance v1

5. Signing & Attestation

5.1 Signing Envelope

5.1.1 Canonical Serialization

The signed payload MUST use RFC 8785 (JSON Canonicalization Scheme) to ensure deterministic serialization. Implementations MUST NOT sign pretty-printed or non-canonical JSON.

5.1.2 Payload Structure

{
  "mtf_version": "0.1",
  "payload_type": "bundle_signature",
  "subject": {
    "name": "@scope/package-name",
    "version": "1.0.0",
    "manifest_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "sbom_sha256": "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"
  },
  "timestamp": "2026-02-06T12:00:00Z",
  "signer_identity": "https://github.com/username"
}
FieldRequiredDescription
mtf_versionMUSTMTF specification version
payload_typeMUSTAlways bundle_signature
subject.nameMUSTPackage name from manifest
subject.versionMUSTPackage version from manifest
subject.manifest_sha256MUSTSHA-256 hash of canonical manifest
subject.sbom_sha256MUSTSHA-256 hash of SBOM file
timestampMUSTISO 8601 signing timestamp
signer_identityMUSTOIDC identity URI or key fingerprint

5.2 Signing Methods

5.2.1 Sigstore Keyless (Preferred)

# Sign the manifest
cosign sign-blob --bundle manifest.sig.json manifest.json

# Verify
cosign verify-blob --bundle manifest.sig.json manifest.json

Sigstore binds signatures to OIDC identity (GitHub, Google, Microsoft) without long-lived key management.

OIDC Providers:

ProviderIssuerSubject Format
GitHub Actionshttps://token.actions.githubusercontent.comrepo:org/repo:ref:refs/heads/main
GitLab CIhttps://gitlab.comproject_path:org/repo
Googlehttps://accounts.google.comEmail address

5.2.2 Long-Lived Keys

AlgorithmKey SizeStatus
ECDSA P-256256-bitAcceptable
ECDSA P-384384-bitAcceptable
Ed25519256-bitAcceptable
RSA4096+ bitAcceptable
RSA2048 bitNOT acceptable

5.2.3 Signature File Locations

FileDescription
manifest.sigPrimary detached signature
manifest.sig.jsonSigstore bundle (preferred)
.sigstore/Sigstore bundle directory
manifest.ci.sigCI/builder signature
manifest.<identity>.sigAdditional signer

5.3 SLSA Provenance Format

Build attestations MUST follow SLSA Provenance v1:

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [
    {
      "name": "@scope/package-name",
      "digest": {
        "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
      }
    }
  ],
  "predicateType": "https://slsa.dev/provenance/v1",
  "predicate": {
    "buildDefinition": {
      "buildType": "https://github.com/slsa-framework/slsa-github-generator/...",
      "externalParameters": {
        "workflow": {
          "ref": "refs/tags/v1.0.0",
          "repository": "https://github.com/org/repo",
          "path": ".github/workflows/release.yml"
        }
      },
      "resolvedDependencies": [
        {
          "uri": "git+https://github.com/org/repo@refs/tags/v1.0.0",
          "digest": {
            "gitCommit": "a1b2c3d4e5f6..."
          }
        }
      ]
    },
    "runDetails": {
      "builder": {
        "id": "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/builder_go_slsa3.yml@refs/tags/v1.0.0"
      },
      "metadata": {
        "invocationId": "https://github.com/org/repo/actions/runs/12345"
      }
    }
  }
}

Attestation File Locations:

FileFormat
attestation.jsonSLSA Provenance v1
.slsa/provenance.jsonSLSA Provenance v1
*.intoto.jsonlIn-toto bundle

5.4 VEX Statement Format

VEX (Vulnerability Exploitability eXchange) statements allow publishers to document non-applicability of vulnerabilities.

{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://example.com/vex/2026-001",
  "author": "publisher@example.com",
  "timestamp": "2026-02-06T12:00:00Z",
  "version": 1,
  "statements": [
    {
      "vulnerability": {
        "@id": "CVE-2026-1234"
      },
      "products": [
        {
          "@id": "pkg:pypi/mypackage@1.0.0"
        }
      ],
      "status": "not_affected",
      "justification": "vulnerable_code_not_in_execute_path",
      "impact_statement": "The vulnerable function is not called by this package"
    }
  ]
}

VEX Status Values:

StatusEffectJustification Required
not_affectedSkip vulnerabilityYes
affectedVulnerability appliesNo
fixedFixed in this versionNo
under_investigationStill analyzingNo

Justification Values:

JustificationDescription
component_not_presentVulnerable component not in package
vulnerable_code_not_presentVulnerable code path not included
vulnerable_code_not_in_execute_pathCode exists but never executes
vulnerable_code_cannot_be_controlled_by_adversaryNo attack vector
inline_mitigations_already_existMitigated by other controls

VEX File Locations:

FileDescription
vex.jsonSingle VEX document
.vex/*.jsonMultiple VEX documents

VEX documents MUST be signed using the same mechanism as bundle signatures.

5.5 Verification Report Format

Scanners and registries produce verification reports documenting control compliance:

{
  "$schema": "https://mpaktrust.org/schemas/mtf/v0.1/report.json",
  "package": "@acme/server",
  "version": "1.0.0",
  "verified_at": "2026-02-06T12:00:00Z",
  "verifier": {
    "name": "mpak-scanner",
    "version": "1.0.0"
  },
  "level_claimed": 2,
  "level_verified": 2,
  "controls": [
    {
      "id": "AI-01",
      "name": "Manifest Validation",
      "status": "pass",
      "details": null
    },
    {
      "id": "SC-02",
      "name": "Vulnerability Scanning",
      "status": "pass",
      "details": {
        "vulnerabilities_found": 2,
        "vulnerabilities_blocking": 0,
        "vex_applied": 1
      }
    },
    {
      "id": "CQ-03",
      "name": "Static Analysis",
      "status": "warn",
      "details": {
        "findings": [
          {
            "severity": "MEDIUM",
            "file": "src/utils.py",
            "line": 42,
            "message": "Possible SQL injection"
          }
        ]
      }
    }
  ],
  "signature": "..."
}
StatusMeaning
passControl satisfied
failControl not satisfied (blocking)
warnNon-blocking finding
skipControl not applicable
errorVerification could not complete

6. Implementation Guide

6.1 Phased Adoption

The MCP ecosystem is early-stage. This roadmap prioritizes controls by impact and implementability.

Phase 1: Foundation

Deploy core security controls that provide immediate value with minimal friction.

ControlRationale
AI-01 Manifest validationBaseline for all other controls
SC-01 SBOM generationEnables vulnerability tracking
CQ-01 Secret scanningImmediate exploitability
CQ-02 Malware patternsBaseline protection
CD-01 Tool declarationCapability transparency

Outcome: L1 compliance achievable.

Phase 2: Supply Chain

Add supply chain verification and identity controls.

ControlRationale
SC-02 CVE scan with EPSS/KEVReal-world exploitation context
SC-03 Dependency pinningReproducibility baseline
PR-02 Author identityAccountability
RG-07 Bundle digestTampering detection
CD-02 Permission correlationCatches misrepresentation
CD-03 Description safetyMCP-specific threat

Outcome: L2 compliance achievable.

Phase 3: Verified Distribution

Implement cryptographic verification and registry governance.

ControlRationale
AI-03 SignaturesPublisher authenticity
PR-03 Build attestationProvenance chain
RG-01 Namespace governancePrevent squatting
RG-05 RevocationKill switch for compromised bundles
CD-04/CD-05 Credential scopesBlast radius control

Outcome: L3 compliance achievable.

Phase 4: Full Assurance

Complete the assurance model with behavioral verification.

ControlRationale
CQ-06 Behavioral analysisDefense in depth
AI-04 Reproducible buildsIndependent verification
RG-03/RG-04 Registry integrityEcosystem-wide trust
AI-05 Bundle completenessPhantom component detection

Outcome: L4 compliance achievable.

6.2 Minimum Viable Security

The smallest set of controls that meaningfully reduce supply chain risk:

PriorityControlRationale
1CQ-01 Secret DetectionImmediate exploitability
2CQ-02 Malware PatternsBaseline protection
3AI-01 Manifest ValidationFoundation for all controls
4CD-01 Tool DeclarationCapability visibility
5SC-01 SBOM GenerationDependency awareness
6CD-03 Description SafetyMCP-specific threat
7PR-02 Author IdentityAccountability

These controls represent the minimum bar for publishing MCP bundles responsibly.

6.3 Tooling Landscape

Implementations can leverage existing open-source tooling for many checks:

Control CategoryToolsNotes
SBOM generation (SC-01)Syft, Trivy, CycloneDX CLIMature, widely adopted
CVE scanning (SC-02)Grype, Trivy + EPSS APIRequires EPSS/KEV integration
Secret detection (CQ-01)TruffleHog, GitleaksUse verified mode
Malware patterns (CQ-02)GuardDog, SemgrepPython-focused; custom rules needed
Static analysis (CQ-03)Bandit, ESLint, gosecLanguage-specific
Signing (AI-03)Cosign (Sigstore)Keyless or key-based
Attestation (PR-03)slsa-github-generatorGitHub Actions
Repository health (PR-05)OpenSSF ScorecardGitHub/GitLab supported

MCP-Specific Controls (Require Custom Implementation):

ControlRequired Capability
CD-03 Description safetyPattern-based tool description analysis
CQ-06 Name squattingName similarity + publisher trust signals
CQ-06 Behavioral analysisMCP server sandbox with syscall monitoring

6.4 CI/CD Integration

GitHub Actions: L2 Compliance

name: MTF Verification

on:
  push:
    tags: ["v*"]

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # Generate SBOM (SC-01)
      - name: Generate SBOM
        uses: anchore/sbom-action@v0
        with:
          format: cyclonedx-json
          output-file: sbom.json

      # Scan for secrets (CQ-01)
      - name: Secret Detection
        uses: trufflesecurity/trufflehog@main
        with:
          extra_args: --only-verified

      # Scan for vulnerabilities (SC-02)
      - name: Vulnerability Scan
        uses: anchore/scan-action@v3
        with:
          sbom: sbom.json
          fail-build: true
          severity-cutoff: high

      # Static analysis (CQ-03)
      - name: Static Analysis (Python)
        run: |
          pip install bandit
          bandit -r src/ -f json -o bandit-report.json
          # Fail on high severity
          bandit -r src/ -ll

      # Validate manifest (AI-01)
      - name: Validate Manifest
        run: |
          # Check manifest exists and is valid JSON
          jq . manifest.json > /dev/null
          # Check required fields
          jq -e '.name and .version and .tools' manifest.json

GitHub Actions: L3 Compliance (with Signing)

name: MTF L3 Release

on:
  push:
    tags: ["v*"]

permissions:
  id-token: write
  contents: read

jobs:
  build-and-sign:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # ... L2 checks from above ...

      # Install Cosign
      - name: Install Cosign
        uses: sigstore/cosign-installer@v3

      # Sign manifest (AI-03)
      - name: Sign Manifest
        run: |
          cosign sign-blob \
            --bundle manifest.sig.json \
            --yes \
            manifest.json

      # Generate SLSA provenance (PR-03)
      - uses: slsa-framework/slsa-github-generator/.github/workflows/builder_go_slsa3.yml@v1
        with:
          # ... builder config ...

6.5 Adoption Incentives

IncentiveImplementation
VisibilityHigher compliance levels appear first in search
Trust badgesDisplay compliance level badges on package pages
AutomationGitHub Action that achieves L2 in one workflow
TemplatesStarter projects with L2 compliance built-in
WarningsUnverified packages show security warnings
Enterprise gatesOrganizations can require minimum levels via policy

6.6 Scanner Implementation Notes

Control Enforcement Order

Scanners SHOULD evaluate controls in dependency order:

  1. AI-01 Manifest Validation (required for all other checks)
  2. SC-01 SBOM Generation (required for SC-02)
  3. CQ-01, CQ-02 Secret/Malware (immediate threats)
  4. CD-01 Tool Declaration (required for CD-02, CD-03)
  5. Remaining controls in any order

Failure Modes

Failure TypeBehavior
Blocking control failsStop verification, report failure
Warning control failsContinue, include in report
Control errors (tool crash)Report as error, don’t fail verification
Control skipped (not applicable)Report as skip

Performance Considerations

OperationTypical DurationCaching
SBOM generation5-30 secondsCache by lockfile hash
CVE scan2-10 secondsCache by SBOM hash
Secret scan5-60 secondsNo caching
Static analysis10-120 secondsCache by source hash
Signature verification< 1 secondCache by signature

7. Specification Roadmap

7.1 Version Progression

VersionFocusKey Additions
v0.1Supply chain securitySigning, attestation, SBOM, CVE scanning, pattern detection
v0.2Runtime isolationSandbox spec, behavioral verification, credential monitoring
v0.3Protocol securityOrigin tagging, capability attestation, output sanitization

7.2 Why Phased?

MCP-specific threats require both supply chain and runtime controls. v0.1 focuses on supply chain because:

  1. Tooling exists. SLSA, Sigstore, SBOM generators, and vulnerability scanners are mature.
  2. Foundation first. Runtime controls need signed manifests and declared capabilities.
  3. Adoption enables enforcement. Behavioral analysis requires registry infrastructure.

Appendix A: Control Quick Reference

A.1 Master Control Index

IDControlLevelEnforcementSection
AI-01Manifest ValidationL1Scanner3.2
AI-02(Reserved)
AI-03Bundle SigningL3Scanner3.2
AI-04Reproducible BuildsL4Scanner3.2
AI-05Bundle CompletenessL2Client3.2
SC-01SBOM GenerationL1Scanner3.3
SC-02Vulnerability ScanningL2Scanner3.3
SC-03Dependency PinningL2Scanner3.3
SC-04Lockfile IntegrityL2Client3.3
SC-05Trusted SourcesL3Scanner3.3
CQ-01Secret DetectionL1Scanner3.4
CQ-02Malware PatternsL1Scanner3.4
CQ-03Static AnalysisL2Scanner3.4
CQ-04Input ValidationL3Scanner3.4
CQ-05Safe Execution PatternsL3Scanner3.4
CQ-06Behavioral AnalysisL4Registry3.4
CD-01Tool DeclarationL1Scanner3.5
CD-02Permission CorrelationL2Scanner3.5
CD-03Description SafetyL2Scanner3.5
CD-04Credential Scope DeclarationL3Scanner3.5
CD-05Token Lifetime LimitsL3Scanner3.5
PR-01Source RepositoryL2Scanner3.6
PR-02Author IdentityL2Registry3.6
PR-03Build AttestationL3Scanner3.6
PR-04Commit LinkageL4Scanner3.6
PR-05Repository HealthL3Scanner3.6
RG-01Namespace GovernanceL2Registry3.7
RG-02Name Pattern ReviewL2Registry3.7
RG-03Index IntegrityL3Registry3.7
RG-04Freshness GuaranteesL3Registry3.7
RG-05Revocation FeedL2Registry3.7
RG-06Transparency LogL3Registry3.7
RG-07Bundle DigestL2Registry3.7
PK-01Identity TiersL2Registry3.8
PK-02Key RotationL3Registry3.8
PK-03Compromise RecoveryL3Registry3.8
PK-04Account SuccessionL3Registry3.8
IN-01Pre-Installation ChecksL1Client3.9
IN-02Post-Download VerificationL2Client3.9
IN-03User TransparencyL1Client3.9
IN-04Rollback CapabilityL2Client3.9
UP-01Update NotificationL2Registry/Client3.10
UP-02Breaking Change PolicyL2Registry3.10
UP-03Deprecation ProcessL2Registry3.10
UP-04Version MonotonicityL2Registry3.10

Total: 41 controls

A.2 Controls by Enforcement Point

EnforcementCountControls
Scanner22AI-01, AI-03, AI-04, SC-01, SC-02, SC-03, SC-05, CQ-01, CQ-02, CQ-03, CQ-04, CQ-05, CD-01, CD-02, CD-03, CD-04, CD-05, PR-01, PR-03, PR-04, PR-05
Registry15CQ-06, PR-02, RG-01, RG-02, RG-03, RG-04, RG-05, RG-06, RG-07, PK-01, PK-02, PK-03, PK-04, UP-02, UP-03, UP-04
Client7AI-05, SC-04, IN-01, IN-02, IN-03, IN-04, UP-01

Appendix B: Controls by Compliance Level

B.1 L1 Basic (7 controls)

IDControlDomain
AI-01Manifest ValidationArtifact Integrity
SC-01SBOM GenerationSupply Chain
CQ-01Secret DetectionCode Quality
CQ-02Malware PatternsCode Quality
CD-01Tool DeclarationCapability Declaration
IN-01Pre-Installation ChecksInstallation
IN-03User TransparencyInstallation

B.2 L2 Standard (+19 = 26 controls)

Includes all L1 controls, plus:

IDControlDomain
AI-05Bundle CompletenessArtifact Integrity
SC-02Vulnerability ScanningSupply Chain
SC-03Dependency PinningSupply Chain
SC-04Lockfile IntegritySupply Chain
CQ-03Static AnalysisCode Quality
CD-02Permission CorrelationCapability Declaration
CD-03Description SafetyCapability Declaration
PR-01Source RepositoryProvenance
PR-02Author IdentityProvenance
RG-01Namespace GovernanceRegistry Operations
RG-02Name Pattern ReviewRegistry Operations
RG-05Revocation FeedRegistry Operations
RG-07Bundle DigestRegistry Operations
PK-01Identity TiersPublisher Identity
IN-02Post-Download VerificationInstallation
IN-04Rollback CapabilityInstallation
UP-01Update NotificationUpdate Lifecycle
UP-02Breaking Change PolicyUpdate Lifecycle
UP-03Deprecation ProcessUpdate Lifecycle
UP-04Version MonotonicityUpdate Lifecycle

B.3 L3 Verified (+12 = 38 controls)

Includes all L1 + L2 controls, plus:

IDControlDomain
AI-03Bundle SigningArtifact Integrity
SC-05Trusted SourcesSupply Chain
CQ-04Input ValidationCode Quality
CQ-05Safe Execution PatternsCode Quality
CD-04Credential Scope DeclarationCapability Declaration
CD-05Token Lifetime LimitsCapability Declaration
PR-03Build AttestationProvenance
PR-05Repository HealthProvenance
RG-03Index IntegrityRegistry Operations
RG-04Freshness GuaranteesRegistry Operations
RG-06Transparency LogRegistry Operations
PK-02Key RotationPublisher Identity
PK-03Compromise RecoveryPublisher Identity
PK-04Account SuccessionPublisher Identity

B.4 L4 Attested (+3 = 41 controls)

Includes all L1 + L2 + L3 controls, plus:

IDControlDomain
AI-04Reproducible BuildsArtifact Integrity
CQ-06Behavioral AnalysisCode Quality
PR-04Commit LinkageProvenance

B.5 Level Comparison

AspectL1L2L3L4
Controls7263841
TargetPersonalPublishedProductionCritical
IdentityNoneEmailOIDCOIDC
SigningNoneNoneRequiredRequired
AttestationNoneNoneSLSASLSA + reproducible
CVE ScanNoneEPSS/KEVEPSS/KEVEPSS/KEV
BehavioralNoneNoneNoneSandbox

Appendix C: Open Questions

Issues surfaced during specification development that require resolution in future versions.

C.1 Detection Limitations

Tool description poisoning (CD-03): Pattern matching catches obvious attacks but sophisticated paraphrased instructions evade detection. No production-ready semantic analysis exists. This control provides baseline protection, not comprehensive defense.

Name squatting (CQ-06): Detection combines name similarity analysis with publisher trust signals. Accuracy depends on threshold tuning for similarity metrics.

C.2 Behavioral Analysis Implementation

CQ-06 specifies what behavioral analysis MUST verify. Implementation approaches include:

  • OpenSSF Package Analysis: Foundation for sandbox infrastructure
  • Container sandboxes: Docker/Podman with seccomp profiles
  • eBPF tracing: Low-overhead syscall monitoring
  • Firecracker/gVisor: Lightweight VM isolation

Registries implementing CQ-06 SHOULD publish their implementation details.

C.3 Container Image Verification

Section 4 specifies container handling at a high level. Open questions:

  • How do OCI attestations integrate with MTF attestation format?
  • Should container layers be individually verified or only final image?
  • How do multi-arch images affect reproducibility requirements?

C.4 Transitive Dependency Provenance

MTF requires SBOM but doesn’t mandate provenance attestation for dependencies. For L4, should all transitive dependencies also require provenance?

Current treatment: RECOMMENDED for L4, not REQUIRED. Ecosystem maturity is insufficient.

C.5 Key Escrow vs. Keyless

Sigstore keyless signing is REQUIRED for L3+. However:

  • Some enterprises require key escrow for compliance
  • Air-gapped environments cannot use OIDC

Open question: Should MTF define an alternative key-escrow path?

C.6 Breaking Change Detection

UP-02 requires semver but doesn’t define breaking change detection. For MCP:

  • Is tool removal a breaking change? (Yes, per current spec)
  • Is permission scope reduction breaking? (No)
  • Is OAuth scope reduction breaking? (No)

C.7 Cross-Registry Federation

This spec assumes a single authoritative registry. If multiple registries exist:

  • How is namespace governance coordinated?
  • How are revocations propagated?
  • Which registry’s compliance level is authoritative?

Deferred: Wait for ecosystem to determine if federation is needed.

C.8 Multi-Signature / Threshold Signing

For L4 critical infrastructure, single-signer is a single point of compromise.

Open question: Should L4 require threshold signatures (e.g., 2-of-3 keys)?

Current treatment: Not addressed. PR-02 requires multi-owner but not multi-signature.

C.9 Signature Expiry

Signatures currently have no expiration. A bundle signed in 2024 remains “verified” indefinitely.

Open question: Should signatures have maximum validity periods? Should clients warn on old signatures?

Current treatment: RG-05 revocation handles known compromises; time-based trust decay not addressed.

Appendix D: Runtime Security Roadmap

This appendix describes controls planned for future MTF versions. These are informative, not normative for v0.1.

D.1 Runtime Isolation Controls (v0.2)

Controls for verifying bundle behavior matches declared capabilities at execution time.

ControlDescriptionThreat Addressed
RT-01Sandbox execution requirementsInitialization exfiltration
RT-02Tool description integrity (hash per invocation)Rug pull attacks
RT-03Full-schema validation (name, parameters, outputs)Schema poisoning
RT-04Credential access monitoringToken abuse
RT-05Network egress policy enforcementData exfiltration
RT-06Filesystem access boundariesUnauthorized file access

Implementation notes:

  • Requires registry-operated or client-side sandbox infrastructure
  • Technologies: containers with seccomp, gVisor, Firecracker, eBPF

D.2 Protocol Security Controls (v0.3)

Controls requiring changes to the MCP protocol specification.

ControlDescriptionThreat Addressed
PT-01Origin tagging (server vs. user content markers)Prompt injection confusion
PT-02Capability attestation in protocol handshakeManifest/behavior mismatch
PT-03Output sanitization requirementsResponse poisoning
PT-04Tool invocation audit trailForensics

Dependencies:

  • Requires MCP protocol version changes
  • Coordination with MCP specification maintainers needed

D.3 Control Numbering

PrefixCategoryVersion
AI-, SC-, CQ-, CD-, PR-, RG-, PK-, IN-, UP-Supply chainv0.1
RT-Runtime isolationv0.2
PT-Protocol securityv0.3

D.4 Feedback Requested

Input is specifically requested on:

  1. Sandbox feasibility: What isolation technologies are practical for MCP server execution?
  2. Protocol changes: What MCP protocol extensions would enable PT- controls?
  3. Client vs. registry enforcement: Which runtime controls should clients enforce locally?
  4. Performance impact: What latency is acceptable for runtime verification?

License

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).

Copyright 2026 NimbleBrain, Inc.

Full license: https://creativecommons.org/licenses/by/4.0/