@@ -298,12 +298,16 @@ func buildLinearBuiltinConfig(toolValue any) (*RegistryMCPServerConfig, error) {
298298 if ! ok {
299299 return nil , errors .New ("tools.linear must be an object" )
300300 }
301+ if _ , expanded := toolConfig ["type" ]; expanded {
302+ return buildExpandedLinearBuiltinConfig (toolConfig )
303+ }
301304 for field := range toolConfig {
302305 switch field {
303306 case "token" , "toolsets" , "allowed" , "required" :
304307 default :
305308 return nil , fmt .Errorf ("unknown tools.linear property %q" , field )
306309 }
310+
307311 }
308312
309313 token := constants .LinearMCPDefaultTokenExpr
@@ -343,6 +347,50 @@ func buildLinearBuiltinConfig(toolValue any) (*RegistryMCPServerConfig, error) {
343347 return config , nil
344348}
345349
350+ func buildExpandedLinearBuiltinConfig (toolConfig map [string ]any ) (* RegistryMCPServerConfig , error ) {
351+ for field := range toolConfig {
352+ switch field {
353+ case "type" , "url" , "headers" , "allowed" , "required" :
354+ default :
355+ return nil , fmt .Errorf ("unknown expanded tools.linear property %q" , field )
356+ }
357+ }
358+ typeName , ok := toolConfig ["type" ].(string )
359+ if ! ok || typeName != "http" {
360+ return nil , errors .New ("expanded tools.linear type must be http" )
361+ }
362+ url , ok := toolConfig ["url" ].(string )
363+ if ! ok || url == "" {
364+ return nil , errors .New ("expanded tools.linear url must be a non-empty string" )
365+ }
366+ config := & RegistryMCPServerConfig {
367+ BaseMCPServerConfig : types.BaseMCPServerConfig {Type : typeName , URL : url , Headers : map [string ]string {}},
368+ Name : "linear" ,
369+ }
370+ if headers , ok := toolConfig ["headers" ].(map [string ]any ); ok {
371+ for key , value := range headers {
372+ header , ok := value .(string )
373+ if ! ok {
374+ return nil , fmt .Errorf ("expanded tools.linear header %q must be a string" , key )
375+ }
376+ config .Headers [key ] = header
377+ }
378+ }
379+ allowed , err := buildLinearAllowedTools (toolConfig )
380+ if err != nil {
381+ return nil , err
382+ }
383+ config .Allowed = allowed
384+ if requiredValue , exists := toolConfig ["required" ]; exists {
385+ required , ok := requiredValue .(bool )
386+ if ! ok {
387+ return nil , errors .New ("tools.linear.required must be a boolean" )
388+ }
389+ config .Required = & required
390+ }
391+ return config , nil
392+ }
393+
346394func buildLinearAllowedTools (toolConfig map [string ]any ) ([]string , error ) {
347395 var toolsetTools []string
348396 if toolsetsValue , exists := toolConfig ["toolsets" ]; exists {
0 commit comments