mcp-sanitizer
Version:
Comprehensive security sanitization library for Model Context Protocol (MCP) servers with trusted security libraries
336 lines (302 loc) • 9.35 kB
JavaScript
/**
* MCP Sanitizer Configuration Module
*
* This module provides the main configuration interface for the MCP Sanitizer.
* It combines default configurations, security policies, and configuration
* management utilities into a single, easy-to-use interface.
*
* Usage Examples:
*
* // Use default configuration
* const { createConfig } = require('./src/config');
* const config = createConfig();
*
* // Use a security policy
* const { createConfigFromPolicy } = require('./src/config');
* const config = createConfigFromPolicy('PRODUCTION');
*
* // Custom configuration
* const config = createConfig({
* maxStringLength: 5000,
* allowedProtocols: ['https', 'mcp']
* });
*
* // Policy with customizations
* const config = createConfigFromPolicy('MODERATE', {
* maxStringLength: 8000
* });
*/
const {
DEFAULT_CONFIG,
CONFIG_SCHEMA,
deepMerge,
mergeConfig,
validateConfig,
createConfig,
getDefaultConfig
} = require('./default-config')
const {
SECURITY_POLICIES,
POLICY_NAMES,
STRICT_POLICY,
MODERATE_POLICY,
PERMISSIVE_POLICY,
DEVELOPMENT_POLICY,
PRODUCTION_POLICY,
getSecurityPolicy,
createCustomPolicy,
getPolicyRecommendation,
validatePolicyRequirements
} = require('./security-policies')
/**
* Create a configuration from a security policy
* @param {string} policyName - Name of the security policy to use
* @param {Object} customizations - Additional customizations to apply
* @returns {Object} Validated configuration object
*/
function createConfigFromPolicy (policyName, customizations = {}) {
const policy = getSecurityPolicy(policyName)
const mergedConfig = mergeConfig({ ...policy, ...customizations })
validateConfig(mergedConfig)
return mergedConfig
}
/**
* Create a configuration with automatic policy recommendation
* @param {string} environment - Environment type ('development', 'staging', 'production')
* @param {string} trustLevel - Trust level ('high', 'medium', 'low')
* @param {Object} customizations - Additional customizations to apply
* @returns {Object} Configuration object with metadata
*/
function createRecommendedConfig (environment = 'production', trustLevel = 'low', customizations = {}) {
const recommendation = getPolicyRecommendation(environment, trustLevel)
const config = createConfigFromPolicy(recommendation.recommended, customizations)
return {
config,
metadata: {
recommendedPolicy: recommendation.recommended,
environment,
trustLevel,
rationale: recommendation.rationale
}
}
}
/**
* Configuration builder class for fluent API
*/
class ConfigBuilder {
constructor () {
this.config = getDefaultConfig()
}
/**
* Set the base security policy
* @param {string} policyName - Name of the security policy
* @returns {ConfigBuilder} Builder instance for chaining
*/
usePolicy (policyName) {
const policy = getSecurityPolicy(policyName)
this.config = mergeConfig(policy)
return this
}
/**
* Set allowed protocols
* @param {string[]} protocols - Array of allowed protocols
* @returns {ConfigBuilder} Builder instance for chaining
*/
allowProtocols (protocols) {
this.config.allowedProtocols = protocols
return this
}
/**
* Set maximum string length
* @param {number} length - Maximum string length
* @returns {ConfigBuilder} Builder instance for chaining
*/
maxStringLength (length) {
this.config.maxStringLength = length
return this
}
/**
* Set maximum object depth
* @param {number} depth - Maximum object depth
* @returns {ConfigBuilder} Builder instance for chaining
*/
maxDepth (depth) {
this.config.maxDepth = depth
return this
}
/**
* Set allowed file extensions
* @param {string[]} extensions - Array of allowed file extensions
* @returns {ConfigBuilder} Builder instance for chaining
*/
allowFileExtensions (extensions) {
this.config.allowedFileExtensions = extensions
return this
}
/**
* Add blocked patterns
* @param {RegExp[]} patterns - Array of regex patterns to block
* @returns {ConfigBuilder} Builder instance for chaining
*/
blockPatterns (patterns) {
this.config.blockedPatterns = [...this.config.blockedPatterns, ...patterns]
return this
}
/**
* Set severity level for automatic blocking
* @param {string} severity - Severity level ('low', 'medium', 'high', 'critical')
* @returns {ConfigBuilder} Builder instance for chaining
*/
blockOnSeverity (severity) {
this.config.blockOnSeverity = severity
return this
}
/**
* Enable or disable strict mode
* @param {boolean} enabled - Whether to enable strict mode
* @returns {ConfigBuilder} Builder instance for chaining
*/
strictMode (enabled = true) {
this.config.strictMode = enabled
return this
}
/**
* Configure pattern detection
* @param {Object} settings - Pattern detection settings
* @returns {ConfigBuilder} Builder instance for chaining
*/
patternDetection (settings) {
this.config.patternDetection = { ...this.config.patternDetection, ...settings }
return this
}
/**
* Apply custom configuration
* @param {Object} customConfig - Custom configuration to merge
* @returns {ConfigBuilder} Builder instance for chaining
*/
custom (customConfig) {
this.config = mergeConfig(this.config, customConfig)
return this
}
/**
* Build and validate the configuration
* @returns {Object} Validated configuration object
*/
build () {
validateConfig(this.config)
return { ...this.config }
}
}
/**
* Create a new configuration builder
* @returns {ConfigBuilder} New configuration builder instance
*/
function createConfigBuilder () {
return new ConfigBuilder()
}
/**
* Get configuration summary for debugging/logging
* @param {Object} config - Configuration to summarize
* @returns {Object} Configuration summary
*/
function getConfigSummary (config) {
return {
security: {
allowedProtocols: config.allowedProtocols,
strictMode: config.strictMode,
blockOnSeverity: config.blockOnSeverity
},
limits: {
maxStringLength: config.maxStringLength,
maxDepth: config.maxDepth,
maxArrayLength: config.maxArrayLength,
maxObjectKeys: config.maxObjectKeys
},
fileSystem: {
allowedFileExtensions: config.allowedFileExtensions?.length || 0,
allowAbsolutePaths: config.contextSettings?.filePath?.allowAbsolutePaths
},
patterns: {
blockedPatterns: config.blockedPatterns?.length || 0,
sqlKeywords: config.sqlKeywords?.length || 0,
blockedCommands: config.blockedCommands?.length || 0
},
detection: config.patternDetection,
performance: config.performance
}
}
/**
* Validate configuration compatibility with environment
* @param {Object} config - Configuration to validate
* @param {string} environment - Target environment
* @returns {Object} Validation result with recommendations
*/
function validateEnvironmentCompatibility (config, environment) {
const result = {
compatible: true,
warnings: [],
recommendations: []
}
if (environment === 'production') {
if (config.allowedProtocols.includes('http')) {
result.warnings.push('HTTP protocol allowed in production environment')
result.recommendations.push('Consider using HTTPS only for production')
}
if (!config.strictMode) {
result.warnings.push('Strict mode disabled in production environment')
result.recommendations.push('Enable strict mode for production security')
}
if (config.blockOnSeverity === 'critical') {
result.warnings.push('Only blocking critical severity in production')
result.recommendations.push('Consider blocking high severity issues in production')
}
if (config.contextSettings?.url?.allowPrivateIPs) {
result.warnings.push('Private IP access allowed in production')
result.recommendations.push('Disable private IP access for production security')
}
}
if (environment === 'development') {
if (config.blockOnSeverity === 'low') {
result.warnings.push('Blocking low severity issues may hinder development')
result.recommendations.push('Consider using medium or high severity blocking for development')
}
if (config.performance?.timeoutMs < 5000) {
result.warnings.push('Short timeout may interrupt debugging')
result.recommendations.push('Consider longer timeout for development environment')
}
}
return result
}
// Export everything needed for configuration management
module.exports = {
// Configuration creation functions
createConfig,
createConfigFromPolicy,
createRecommendedConfig,
createConfigBuilder,
// Configuration utilities
deepMerge,
mergeConfig,
validateConfig,
getDefaultConfig,
getConfigSummary,
validateEnvironmentCompatibility,
// Security policy functions
getSecurityPolicy,
createCustomPolicy,
getPolicyRecommendation,
validatePolicyRequirements,
// Constants and defaults
DEFAULT_CONFIG,
CONFIG_SCHEMA,
SECURITY_POLICIES,
POLICY_NAMES,
// Predefined policies
STRICT_POLICY,
MODERATE_POLICY,
PERMISSIVE_POLICY,
DEVELOPMENT_POLICY,
PRODUCTION_POLICY,
// Builder class
ConfigBuilder
}