Skip to content

Commit 020b5f3

Browse files
authored
Add security schema for nacos mcp (#2847)
1 parent 9a12f0b commit 020b5f3

File tree

2 files changed

+73
-16
lines changed

2 files changed

+73
-16
lines changed

registry/mcp_model.go

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,25 @@ type McpServerRule struct {
4747
}
4848

4949
type ServerConfig struct {
50-
Name string `json:"name,omitempty"`
51-
Config map[string]interface{} `json:"config,omitempty"`
50+
Name string `json:"name,omitempty"`
51+
Config map[string]interface{} `json:"config,omitempty"`
52+
SecuritySchemes []*SecuritySchemes `json:"securitySchemes,omitempty"`
5253
}
5354

5455
type McpTool struct {
55-
Name string `json:"name,omitempty"`
56-
Description string `json:"description,omitempty"`
57-
Args []*ToolArgs `json:"args,omitempty"`
58-
RequestTemplate *RequestTemplate `json:"requestTemplate"`
59-
ResponseTemplate *ResponseTemplate `json:"responseTemplate"`
60-
ErrorResponseTemplate string `json:"errorResponseTemplate,omitempty"`
56+
Name string `json:"name,omitempty"`
57+
Description string `json:"description,omitempty"`
58+
Args []*ToolArgs `json:"args,omitempty"`
59+
RequestTemplate *RequestTemplate `json:"requestTemplate"`
60+
ResponseTemplate *ResponseTemplate `json:"responseTemplate"`
61+
ErrorResponseTemplate string `json:"errorResponseTemplate,omitempty"`
62+
Security *ToolSecurity `json:"security"`
63+
}
64+
65+
type ToolSecurity struct {
66+
Id string `json:"type,omitempty"`
67+
PassThrough bool `json:"passthrough,omitempty"`
68+
Credential string `json:"credential"`
6169
}
6270

6371
type ToolArgs struct {
@@ -80,6 +88,7 @@ type RequestTemplate struct {
8088
ArgsToJsonBody bool `json:"argsToJsonBody,omitempty"`
8189
ArgsToUrlParam bool `json:"argsToUrlParam,omitempty"`
8290
ArgsToFormBody bool `json:"argsToFormBody,omitempty"`
91+
Security *ToolSecurity `json:"security,omitempty"`
8392
}
8493

8594
type RequestTemplateHeaders struct {
@@ -125,8 +134,18 @@ type ServiceRef struct {
125134

126135
// McpToolConfig Struct for mcp tool json unmarshal
127136
type McpToolConfig struct {
128-
Tools []*ToolDescription `json:"tools,omitempty"`
129-
ToolsMeta map[string]*ToolsMeta `json:"toolsMeta,omitempty"`
137+
Tools []*ToolDescription `json:"tools,omitempty"`
138+
ToolsMeta map[string]*ToolsMeta `json:"toolsMeta,omitempty"`
139+
SecuritySchemes []*SecuritySchemes `json:"securitySchemes,omitempty"`
140+
}
141+
142+
type SecuritySchemes struct {
143+
Id string `json:"id,omitempty"`
144+
Type string `json:"type,omitempty"`
145+
Scheme string `json:"scheme,omitempty"`
146+
In string `json:"in,omitempty"`
147+
Name string `json:"name,omitempty"`
148+
DefaultCredential string `json:"defaultCredential,omitempty"`
130149
}
131150

132151
type ToolDescription struct {
@@ -148,8 +167,9 @@ type ToolsMeta struct {
148167
}
149168

150169
type JsonGoTemplate struct {
151-
RequestTemplate RequestTemplate `json:"requestTemplate,omitempty"`
152-
ResponseTemplate ResponseTemplate `json:"responseTemplate,omitempty"`
153-
ArgsPosition map[string]string `json:"argsPosition,omitempty"`
154-
ErrorResponseTemplate string `json:"errorResponseTemplate,omitempty"`
170+
RequestTemplate RequestTemplate `json:"requestTemplate,omitempty"`
171+
ResponseTemplate ResponseTemplate `json:"responseTemplate,omitempty"`
172+
ArgsPosition map[string]string `json:"argsPosition,omitempty"`
173+
ErrorResponseTemplate string `json:"errorResponseTemplate,omitempty"`
174+
Security *ToolSecurity `json:"security,omitempty"`
155175
}

registry/nacos/mcpserver/watcher.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ func NewWatcher(cache memory.Cache, opts ...WatcherOption) (provider.Watcher, er
129129
constant.WithCacheDir(DefaultNacosCacheDir),
130130
constant.WithNotLoadCacheAtStart(DefaultNacosNotLoadCache),
131131
constant.WithLogRollingConfig(&constant.ClientLogRollingConfig{
132-
MaxAge: DefaultNacosLogMaxAge,
133-
MaxSize: DefaultNacosLogMaxSize,
132+
MaxAge: DefaultNacosLogMaxAge,
133+
MaxSize: DefaultNacosLogMaxSize,
134134
MaxBackups: DefaultNacosLogMaxBackups,
135135
}),
136136
constant.WithUpdateCacheWhenEmpty(w.updateCacheWhenEmpty),
@@ -429,6 +429,10 @@ func (w *watcher) processToolConfig(dataId, data string, credentials map[string]
429429
},
430430
}
431431
rule.Server.Config["credentials"] = credentials
432+
// process security schemas
433+
if len(toolsDescription.SecuritySchemes) > 0 {
434+
rule.Server.SecuritySchemes = toolsDescription.SecuritySchemes
435+
}
432436

433437
var allowTools []string
434438
for _, t := range toolsDescription.Tools {
@@ -479,6 +483,15 @@ func (w *watcher) processToolConfig(dataId, data string, credentials map[string]
479483
convertTool.ResponseTemplate = responseTemplate
480484
convertTool.ErrorResponseTemplate = errorResponseTemplate
481485
}
486+
487+
security, err := getSecurityFromToolMeta(toolMeta)
488+
if err != nil {
489+
mcpServerLog.Errorf("get security from tool meta error:%v, tool name %v", err, t.Name)
490+
continue
491+
} else {
492+
convertTool.Security = security
493+
}
494+
482495
rule.Tools = append(rule.Tools, convertTool)
483496
}
484497

@@ -740,6 +753,30 @@ func getResponseTemplateFromToolMeta(toolMeta *provider.ToolsMeta) (*provider.Re
740753
return nil, "", nil
741754
}
742755

756+
func getSecurityFromToolMeta(toolMeta *provider.ToolsMeta) (*provider.ToolSecurity, error) {
757+
if toolMeta == nil {
758+
return nil, nil
759+
}
760+
toolTemplate := toolMeta.Templates
761+
for kind, meta := range toolTemplate {
762+
switch kind {
763+
case provider.JsonGoTemplateType:
764+
templateData, err := json.Marshal(meta)
765+
if err != nil {
766+
return nil, err
767+
}
768+
template := &provider.JsonGoTemplate{}
769+
if err = json.Unmarshal(templateData, template); err != nil {
770+
return nil, err
771+
}
772+
return template.Security, nil
773+
default:
774+
return nil, fmt.Errorf("unsupported tool meta type: %s", kind)
775+
}
776+
}
777+
return nil, nil
778+
}
779+
743780
func mergeMaps(maps ...map[string]string) map[string]string {
744781
if len(maps) == 0 {
745782
return nil

0 commit comments

Comments
 (0)