Use constants instead of hardcoded strings (#330)
<!-- Provide a brief summary of your changes --> ## Motivation and Context <!-- Why is this change needed? What problem does it solve? --> The following PR updates some of the hardcoded references to public constants. ## How Has This Been Tested? <!-- Have you tested this in a real application? Which scenarios were tested? --> Locally ## Breaking Changes <!-- Will users need to update their code or configurations? --> No ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [ ] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [ ] My code follows the repository's style guidelines - [ ] New and existing tests pass locally - [ ] I have added appropriate error handling - [ ] I have added or updated documentation as needed ## Additional context <!-- Add any other context, implementation notes, or design decisions --> Signed-off-by: Radoslav Dimitrov <radoslav@stacklok.com>
This commit is contained in:
parent
e0aecadc24
commit
2a2bbfed84
3 changed files with 53 additions and 24 deletions
|
|
@ -14,11 +14,6 @@ import (
|
||||||
"github.com/modelcontextprotocol/registry/pkg/model"
|
"github.com/modelcontextprotocol/registry/pkg/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
RegistryTypeNPM = "npm"
|
|
||||||
RegistryTypePyPi = "pypi"
|
|
||||||
RegistryTypeOci = "oci"
|
|
||||||
)
|
|
||||||
|
|
||||||
func InitCommand() error {
|
func InitCommand() error {
|
||||||
// Check if server.json already exists
|
// Check if server.json already exists
|
||||||
|
|
@ -193,29 +188,29 @@ func detectRepoURL() string {
|
||||||
func detectPackageType() string {
|
func detectPackageType() string {
|
||||||
// Check for package.json
|
// Check for package.json
|
||||||
if _, err := os.Stat("package.json"); err == nil {
|
if _, err := os.Stat("package.json"); err == nil {
|
||||||
return RegistryTypeNPM
|
return model.RegistryTypeNPM
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for pyproject.toml or setup.py
|
// Check for pyproject.toml or setup.py
|
||||||
if _, err := os.Stat("pyproject.toml"); err == nil {
|
if _, err := os.Stat("pyproject.toml"); err == nil {
|
||||||
return RegistryTypePyPi
|
return model.RegistryTypePyPI
|
||||||
}
|
}
|
||||||
if _, err := os.Stat("setup.py"); err == nil {
|
if _, err := os.Stat("setup.py"); err == nil {
|
||||||
return RegistryTypePyPi
|
return model.RegistryTypePyPI
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for Dockerfile
|
// Check for Dockerfile
|
||||||
if _, err := os.Stat("Dockerfile"); err == nil {
|
if _, err := os.Stat("Dockerfile"); err == nil {
|
||||||
return RegistryTypeOci
|
return model.RegistryTypeOCI
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default to npm as most common
|
// Default to npm as most common
|
||||||
return RegistryTypeNPM
|
return model.RegistryTypeNPM
|
||||||
}
|
}
|
||||||
|
|
||||||
func detectPackageIdentifier(serverName string, packageType string) string {
|
func detectPackageIdentifier(serverName string, packageType string) string {
|
||||||
switch packageType {
|
switch packageType {
|
||||||
case RegistryTypeNPM:
|
case model.RegistryTypeNPM:
|
||||||
// Try to get from package.json
|
// Try to get from package.json
|
||||||
if data, err := os.ReadFile("package.json"); err == nil {
|
if data, err := os.ReadFile("package.json"); err == nil {
|
||||||
var pkg map[string]any
|
var pkg map[string]any
|
||||||
|
|
@ -235,7 +230,7 @@ func detectPackageIdentifier(serverName string, packageType string) string {
|
||||||
}
|
}
|
||||||
return "@your-org/your-package"
|
return "@your-org/your-package"
|
||||||
|
|
||||||
case "pypi":
|
case model.RegistryTypePyPI:
|
||||||
// Try to get from pyproject.toml or setup.py
|
// Try to get from pyproject.toml or setup.py
|
||||||
if data, err := os.ReadFile("pyproject.toml"); err == nil {
|
if data, err := os.ReadFile("pyproject.toml"); err == nil {
|
||||||
// Simple extraction - could be improved with proper TOML parser
|
// Simple extraction - could be improved with proper TOML parser
|
||||||
|
|
@ -254,7 +249,7 @@ func detectPackageIdentifier(serverName string, packageType string) string {
|
||||||
}
|
}
|
||||||
return "your-package"
|
return "your-package"
|
||||||
|
|
||||||
case "docker":
|
case model.RegistryTypeOCI:
|
||||||
// Use a sensible default
|
// Use a sensible default
|
||||||
if strings.Contains(serverName, "/") {
|
if strings.Contains(serverName, "/") {
|
||||||
parts := strings.Split(serverName, "/")
|
parts := strings.Split(serverName, "/")
|
||||||
|
|
@ -275,15 +270,15 @@ func createServerJSON(
|
||||||
// Determine registry type and base URL
|
// Determine registry type and base URL
|
||||||
var registryType, registryBaseURL string
|
var registryType, registryBaseURL string
|
||||||
switch packageType {
|
switch packageType {
|
||||||
case RegistryTypeNPM:
|
case model.RegistryTypeNPM:
|
||||||
registryType = RegistryTypeNPM
|
registryType = model.RegistryTypeNPM
|
||||||
registryBaseURL = "https://registry.npmjs.org"
|
registryBaseURL = model.RegistryURLNPM
|
||||||
case RegistryTypePyPi:
|
case model.RegistryTypePyPI:
|
||||||
registryType = RegistryTypePyPi
|
registryType = model.RegistryTypePyPI
|
||||||
registryBaseURL = "https://pypi.org"
|
registryBaseURL = model.RegistryURLPyPI
|
||||||
case RegistryTypeOci:
|
case model.RegistryTypeOCI:
|
||||||
registryType = RegistryTypeOci
|
registryType = model.RegistryTypeOCI
|
||||||
registryBaseURL = "https://docker.io"
|
registryBaseURL = model.RegistryURLDocker
|
||||||
case "url":
|
case "url":
|
||||||
registryType = "url"
|
registryType = "url"
|
||||||
registryBaseURL = ""
|
registryBaseURL = ""
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,7 @@ func validatePackage(pkg *model.Package) error {
|
||||||
registryType := strings.ToLower(pkg.RegistryType)
|
registryType := strings.ToLower(pkg.RegistryType)
|
||||||
|
|
||||||
// For direct download packages (mcpb or direct URLs)
|
// For direct download packages (mcpb or direct URLs)
|
||||||
if registryType == "mcpb" ||
|
if registryType == model.RegistryTypeMCPB ||
|
||||||
strings.HasPrefix(pkg.Identifier, "http://") || strings.HasPrefix(pkg.Identifier, "https://") {
|
strings.HasPrefix(pkg.Identifier, "http://") || strings.HasPrefix(pkg.Identifier, "https://") {
|
||||||
parsedURL, err := url.Parse(pkg.Identifier)
|
parsedURL, err := url.Parse(pkg.Identifier)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -178,7 +178,7 @@ func validatePackage(pkg *model.Package) error {
|
||||||
host := strings.ToLower(parsedURL.Host)
|
host := strings.ToLower(parsedURL.Host)
|
||||||
|
|
||||||
// For MCPB packages, validate they're from allowed hosts
|
// For MCPB packages, validate they're from allowed hosts
|
||||||
if registryType == "mcpb" {
|
if registryType == model.RegistryTypeMCPB {
|
||||||
return validateMCPBPackage(host)
|
return validateMCPBPackage(host)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
34
pkg/model/constants.go
Normal file
34
pkg/model/constants.go
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
package model
|
||||||
|
|
||||||
|
// Registry Types - supported package registry types
|
||||||
|
const (
|
||||||
|
RegistryTypeNPM = "npm"
|
||||||
|
RegistryTypePyPI = "pypi"
|
||||||
|
RegistryTypeOCI = "oci"
|
||||||
|
RegistryTypeNuGet = "nuget"
|
||||||
|
RegistryTypeMCPB = "mcpb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Registry Base URLs - supported package registry base URLs
|
||||||
|
const (
|
||||||
|
RegistryURLNPM = "https://registry.npmjs.org"
|
||||||
|
RegistryURLPyPI = "https://pypi.org"
|
||||||
|
RegistryURLDocker = "https://docker.io"
|
||||||
|
RegistryURLNuGet = "https://api.nuget.org"
|
||||||
|
RegistryURLGitHub = "https://github.com"
|
||||||
|
RegistryURLGitLab = "https://gitlab.com"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Transport Types - supported remote transport protocols
|
||||||
|
const (
|
||||||
|
TransportTypeStreamable = "streamable"
|
||||||
|
TransportTypeSSE = "sse"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Runtime Hints - supported package runtime hints
|
||||||
|
const (
|
||||||
|
RuntimeHintNPX = "npx"
|
||||||
|
RuntimeHintUVX = "uvx"
|
||||||
|
RuntimeHintDocker = "docker"
|
||||||
|
RuntimeHintDNX = "dnx"
|
||||||
|
)
|
||||||
Loading…
Reference in a new issue