1- /* eslint-disable security/detect-object-injection -- all dynamic keys are validated against the fixed SDK runtime allowlist. */
2- const REQUIRED_SDK_RUNTIME = Object . freeze ( {
3- '@modelcontextprotocol/core' : '2.0.0' ,
4- '@modelcontextprotocol/node' : '2.0.0' ,
5- '@modelcontextprotocol/server' : '2.0.0' ,
6- zod : '4.2.0' ,
7- } ) ;
1+ const REQUIRED_SDK_RUNTIME = new Map ( [
2+ [ '@modelcontextprotocol/core' , '2.0.0' ] ,
3+ [ '@modelcontextprotocol/node' , '2.0.0' ] ,
4+ [ '@modelcontextprotocol/server' , '2.0.0' ] ,
5+ [ 'zod' , '4.2.0' ] ,
6+ ] ) ;
87const EXPECTED_TOOLS = Object . freeze ( [
98 'searxng_web_search' ,
109 'web_url_read' ,
@@ -52,10 +51,11 @@ function recordSdkRuntimeVersion(name, dependency, versions) {
5251 fail ( 'unsafe_dependency_tree' , `${ name } is marked extraneous` ) ;
5352 }
5453 parseStableSemver ( dependency . version ) ;
55- if ( dependency . version !== REQUIRED_SDK_RUNTIME [ name ] ) {
54+ const requiredVersion = REQUIRED_SDK_RUNTIME . get ( name ) ;
55+ if ( dependency . version !== requiredVersion ) {
5656 fail (
5757 'unsafe_dependency_tree' ,
58- `${ name } version ${ dependency . version } must be ${ REQUIRED_SDK_RUNTIME [ name ] } ` ,
58+ `${ name } version ${ dependency . version } must be ${ requiredVersion } ` ,
5959 ) ;
6060 }
6161 versions . push ( { name, version : dependency . version } ) ;
@@ -75,7 +75,7 @@ function visitDependencyNode(node, versions) {
7575 dependencyValue ,
7676 `dependency ${ name } is malformed` ,
7777 ) ;
78- if ( Object . hasOwn ( REQUIRED_SDK_RUNTIME , name ) ) {
78+ if ( REQUIRED_SDK_RUNTIME . has ( name ) ) {
7979 recordSdkRuntimeVersion ( name , dependency , versions ) ;
8080 }
8181 visitDependencyNode ( dependency , versions ) ;
@@ -88,7 +88,7 @@ export function assertSafeDependencyTree(tree) {
8888 visitDependencyNode ( tree , versions ) ;
8989 const uniqueVersions = new Map ( versions . map ( ( entry ) => [ entry . name , entry ] ) ) ;
9090 const found = new Set ( uniqueVersions . keys ( ) ) ;
91- const missing = Object . keys ( REQUIRED_SDK_RUNTIME ) . filter ( ( name ) => ! found . has ( name ) ) ;
91+ const missing = [ ... REQUIRED_SDK_RUNTIME . keys ( ) ] . filter ( ( name ) => ! found . has ( name ) ) ;
9292 if ( missing . length > 0 ) {
9393 fail ( 'unsafe_dependency_tree' , `required SDK runtime dependency is missing: ${ missing . join ( ', ' ) } ` ) ;
9494 }
0 commit comments