Skip to content

Security Features

This document outlines the comprehensive security features implemented in the MCP agent system.

Tags-as-OAuth-Scopes Security Model

Core Concept

Tags are mapped to OAuth 2.1 scopes using the format tag:{tag-name} (e.g., tag:web, tag:db). This provides fine-grained access control where clients can only access servers for which they have been explicitly granted scope permissions.

Security Benefits

  • Fine-grained access control: Clients only access authorized servers
  • Standards compliance: Uses OAuth 2.1 scopes properly
  • User consent: Explicit approval of requested permissions via web interface
  • Fail-secure design: Denies access on any validation failure
  • Scope expiration: Scopes expire with access tokens

Scope Validation Security

Input Validation (src/utils/scopeValidation.ts)

  • Strict format validation: Only tag:[a-zA-Z0-9_-]+ patterns allowed
  • Length limits: Maximum scope and tag length enforcement
  • Injection prevention: Blocks path traversal, command injection, and special characters
  • Count limits: Maximum number of scopes per request
  • Duplicate detection: Prevents duplicate scopes in requests

Allowlist Approach

  • Scopes are validated against available server tags only
  • No wildcard or pattern matching allowed
  • Fail-secure validation with comprehensive error logging

Authentication & Authorization

OAuth 2.1 Implementation (src/auth/sdkOAuthServerProvider.ts)

  • PKCE support: Prevents authorization code interception
  • Client registration: Dynamic client registration with validation
  • Token management: Secure token generation, validation, and revocation
  • Session management: Secure session storage with expiration
  • Web-based consent: User-friendly consent interface for scope approval

Scope-Based Authorization Middleware (src/transport/http/middlewares/scopeAuthMiddleware.ts)

  • Token verification: Validates Bearer tokens on every request
  • Scope enforcement: Ensures requested tags are covered by granted scopes
  • Backward compatibility: Works seamlessly when auth is disabled
  • Fail-secure design: Denies access on any error condition

Rate Limiting

Multi-tier Rate Limiting

  1. General OAuth endpoints: Standard rate limiting for OAuth operations
  2. Sensitive operations: Stricter rate limiting for consent and token operations
  3. Adaptive limits: Different limits for different operation types

Rate Limiting Features

  • IP-based limiting: Prevents abuse from specific addresses
  • Time window controls: Configurable time windows for rate limits
  • Security logging: Logs rate limit violations for monitoring
  • Graceful degradation: Proper error responses when limits exceeded

Security Middleware (src/transport/http/middlewares/securityMiddleware.ts)

Security Headers

  • X-Frame-Options: Prevents clickjacking attacks
  • X-Content-Type-Options: Prevents MIME type sniffing
  • X-XSS-Protection: Enables XSS protection in browsers
  • Content-Security-Policy: Restricts resource loading for HTML responses
  • Referrer-Policy: Controls referrer information leakage

Input Validation

  • Injection protection: Detects and blocks common injection patterns
  • Header validation: Validates all HTTP headers for suspicious content
  • Query parameter validation: Validates query parameters for malicious content
  • Body validation: Validates request bodies for POST operations

Session Security

  • Cache control: Prevents caching of sensitive responses
  • Robot exclusion: Prevents indexing of OAuth endpoints
  • Timing attack prevention: Random delays for authentication endpoints

Template Context Trust

Request context is an execution input because template values can reach backend command, args, cwd, and env. The default verified policy accepts context for rendering only when a first-party local Client Surface signs it with the owner-only capability of the selected Runtime Scope. The detached proof binds the readable context hash, runtimeScopeId, and canonical request session.

Unsigned clients are not disconnected: they retain static-server access. Operators can select disabled to ignore all template context, or legacy to restore unsigned rendering. legacy is intentionally unsafe for untrusted clients and requires --confirm-untrusted-template-context on non-loopback HTTP listeners.

Normal audit logs include context source, project name/path, session, context hash, Runtime Scope identity, and verification outcome. Environment and custom values plus user home/email/shell are redacted. General HTTP logs omit raw base64 context and proof signatures.

Audit Logging

Comprehensive Audit Trail (src/utils/scopeValidation.ts)

  • Scope operations: All scope validation and authorization events
  • Client identification: Tracks which clients perform operations
  • Success/failure tracking: Logs both successful and failed operations
  • Timestamp recording: Precise timing for all security events

Security Event Logging

  • Authentication events: Login attempts, token generation, failures
  • Authorization events: Scope grants, denials, violations
  • Rate limiting events: When limits are exceeded
  • Security violations: Injection attempts, suspicious activity

Network Security

Transport Security

  • HTTPS enforcement: All production traffic over encrypted connections
  • CORS configuration: Proper cross-origin request handling
  • Request size limits: Prevents DoS via large requests

Error Handling

  • Secure error responses: No sensitive information in error messages
  • Consistent error format: Standard OAuth 2.1 error format
  • Error logging: Detailed errors logged server-side only

Input Sanitization (src/utils/sanitization.ts)

Context-Aware Sanitization

  • HTML escaping: Prevents XSS in HTML responses
  • URL parameter sanitization: Safe handling of URL parameters
  • Server name sanitization: Prevents injection via server names
  • Error message sanitization: Safe error message display

Backward Compatibility

Auth-Disabled Mode

  • Graceful degradation: Full functionality when auth is disabled
  • Tag filtering preservation: Original tag filtering when auth off
  • Configuration flexibility: Runtime auth enable/disable

Migration Support

  • Incremental adoption: Can enable auth gradually
  • Existing client support: Works with non-OAuth clients when auth disabled

Security Testing

Comprehensive Test Coverage

  • Unit tests: Scope validation, middleware functions
  • Integration tests: Full authentication flows
  • Security tests: Injection attempts, edge cases, timing attacks
  • Performance tests: Load testing for rate limiting and validation

Security Edge Cases

  • Buffer overflow prevention: Input length validation
  • Null byte injection prevention: Input format validation
  • Unicode attack prevention: Character set restrictions
  • Prototype pollution prevention: Safe object handling

Security Best Practices

Development Guidelines

  • Principle of least privilege: Minimal required scopes granted
  • Fail-secure design: Default to deny access
  • Defense in depth: Multiple security layers
  • Regular security audits: Continuous security monitoring

Operational Security

  • Secure configuration defaults: Safe out-of-box configuration
  • Environment-specific settings: Different security levels per environment
  • Security monitoring: Real-time security event monitoring
  • Incident response: Clear procedures for security incidents

Compliance

Standards Adherence

  • OAuth 2.1: Full compliance with OAuth 2.1 specification
  • RFC 7636: PKCE implementation
  • OWASP Top 10: Protection against common web vulnerabilities
  • Security headers: Follows security header best practices

Privacy Protection

  • Data minimization: Only necessary data collected and stored
  • Secure storage: Encrypted session and token storage
  • Access logging: Audit trail without exposing sensitive data
  • User consent: Explicit consent for all data access

Released under the Apache 2.0 License.