Similarityoung commented on code in PR #702: URL: https://github.com/apache/dubbo-go-pixiu/pull/702#discussion_r2225751926
########## pkg/filter/mcp/mcpserver/config.go: ########## @@ -0,0 +1,217 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package mcpserver + +import ( + "regexp" +) + +type ( + // Config MCP Server Filter configuration + Config struct { + ServerInfo ServerInfo `yaml:"server_info" json:"server_info"` + Endpoint string `yaml:"endpoint" json:"endpoint" default:"/mcp"` + Tools []ToolConfig `yaml:"tools,omitempty" json:"tools,omitempty"` + Resources []ResourceConfig `yaml:"resources,omitempty" json:"resources,omitempty"` + ResourceTemplates []ResourceTemplateConfig `yaml:"resource_templates,omitempty" json:"resource_templates,omitempty"` + Prompts []PromptConfig `yaml:"prompts,omitempty" json:"prompts,omitempty"` + } + + // ServerInfo server information + ServerInfo struct { + Name string `yaml:"name" json:"name" default:"Pixiu MCP Server"` + Version string `yaml:"version" json:"version" default:"1.0.0"` + Description string `yaml:"description,omitempty" json:"description,omitempty" default:"MCP Server powered by Apache Dubbo-go-pixiu"` + Instructions string `yaml:"instructions,omitempty" json:"instructions,omitempty" default:"Use the provided tools to interact with backend services."` + } + + // ToolConfig tool configuration + ToolConfig struct { + Name string `yaml:"name" json:"name"` + Description string `yaml:"description" json:"description"` + Cluster string `yaml:"cluster" json:"cluster"` + Request RequestConfig `yaml:"request" json:"request"` + Args []ArgConfig `yaml:"args,omitempty" json:"args,omitempty"` + } + + // RequestConfig request configuration + RequestConfig struct { + Method string `yaml:"method" json:"method" default:"GET"` + Path string `yaml:"path" json:"path"` + Headers map[string]string `yaml:"headers,omitempty" json:"headers,omitempty"` + Timeout string `yaml:"timeout,omitempty" json:"timeout,omitempty" default:"30s"` + } + + // ArgConfig parameter configuration (simplified) + ArgConfig struct { + Name string `yaml:"name" json:"name"` + Type string `yaml:"type" json:"type" default:"string"` + In string `yaml:"in" json:"in"` + Description string `yaml:"description,omitempty" json:"description,omitempty"` + Required bool `yaml:"required,omitempty" json:"required,omitempty"` + Default any `yaml:"default,omitempty" json:"default,omitempty"` + Enum []string `yaml:"enum,omitempty" json:"enum,omitempty"` + } + + // ResourceConfig resource configuration + ResourceConfig struct { + Name string `yaml:"name" json:"name"` + URI string `yaml:"uri" json:"uri"` + Description string `yaml:"description,omitempty" json:"description,omitempty"` + MIMEType string `yaml:"mime_type,omitempty" json:"mime_type,omitempty"` + Source ResourceSource `yaml:"source" json:"source"` + } + + // ResourceSource resource source configuration (simplified) + ResourceSource struct { + Type string `yaml:"type" json:"type"` + Path string `yaml:"path,omitempty" json:"path,omitempty"` // for file type + URL string `yaml:"url,omitempty" json:"url,omitempty"` // for url type + Content string `yaml:"content,omitempty" json:"content,omitempty"` // for inline type + Template string `yaml:"template,omitempty" json:"template,omitempty"` // for template type + } + + // ResourceTemplateConfig resource template configuration + ResourceTemplateConfig struct { + Name string `yaml:"name" json:"name"` + URITemplate string `yaml:"uri_template" json:"uri_template"` + Title string `yaml:"title,omitempty" json:"title,omitempty"` + Description string `yaml:"description,omitempty" json:"description,omitempty"` + MIMEType string `yaml:"mime_type,omitempty" json:"mime_type,omitempty"` + Parameters []ResourceTemplateParameter `yaml:"parameters,omitempty" json:"parameters,omitempty"` + Annotations *ResourceTemplateAnnotations `yaml:"annotations,omitempty" json:"annotations,omitempty"` + } + + // ResourceTemplateParameter resource template parameter + ResourceTemplateParameter struct { + Name string `yaml:"name" json:"name"` + Type string `yaml:"type" json:"type" default:"string"` + Description string `yaml:"description,omitempty" json:"description,omitempty"` + Required bool `yaml:"required,omitempty" json:"required,omitempty" default:"false"` + Enum []string `yaml:"enum,omitempty" json:"enum,omitempty"` + Default any `yaml:"default,omitempty" json:"default,omitempty"` + } + + // ResourceTemplateAnnotations resource template annotations + ResourceTemplateAnnotations struct { + Audience []string `yaml:"audience,omitempty" json:"audience,omitempty"` + Priority *float64 `yaml:"priority,omitempty" json:"priority,omitempty"` + LastModified string `yaml:"last_modified,omitempty" json:"last_modified,omitempty"` + } + + // ComputedParameter computed parameter (for internal processing, simplified) + ComputedParameter struct { + Name string + Type string + In string + Description string + Required bool + Enum []string + Default any + } +) + +// GetAllParameters gets all parameters of the tool +func (tc *ToolConfig) GetAllParameters() ([]ComputedParameter, error) { + var allParams []ComputedParameter + + // 1. Automatically extract path parameters + pathParams := GetPathParameterNames(tc.Request.Path) + for _, paramName := range pathParams { + // Find corresponding arg configuration + var argConfig *ArgConfig + for _, arg := range tc.Args { + if arg.Name == paramName && arg.In == "path" { + argConfig = &arg + break + } + } + + // Create computed parameter + computed := ComputedParameter{ + Name: paramName, + Type: "string", // Default type + In: "path", + Required: true, // Path parameters are always required + } + + // Apply arg configuration + if argConfig != nil { + computed.Type = argConfig.Type + computed.Description = argConfig.Description + // Simplified: removed Pattern and Format fields + } + + allParams = append(allParams, computed) + } + + // 2. Add non-path parameters + for _, arg := range tc.Args { + if arg.In != "path" { + computed := ComputedParameter{ + Name: arg.Name, + Type: arg.Type, + In: arg.In, + Description: arg.Description, + Required: arg.Required, + Enum: arg.Enum, + Default: arg.Default, + // Simplified: removed complex validation fields + } + allParams = append(allParams, computed) + } + } + + return allParams, nil +} + +// GetPathParameterNames gets all parameter names in the path template +func GetPathParameterNames(pathTemplate string) []string { + re := regexp.MustCompile(`\{([^}]+)}`) + matches := re.FindAllStringSubmatch(pathTemplate, -1) + + // Initialize as empty slice instead of nil + names := []string{} Review Comment: it seems not good -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
