@@ -15,6 +15,11 @@ import (
1515const (
1616 DefaultRegistryURL = "https://registry.modelcontextprotocol.io"
1717 TokenFileName = ".mcp_publisher_token" //nolint:gosec // Not a credential, just a filename
18+ MethodGitHub = "github"
19+ MethodGitHubOIDC = "github-oidc"
20+ MethodDNS = "dns"
21+ MethodHTTP = "http"
22+ MethodNone = "none"
1823)
1924
2025type CryptoAlgorithm auth.CryptoAlgorithm
@@ -32,56 +37,82 @@ func (c *CryptoAlgorithm) Set(v string) error {
3237 return fmt .Errorf ("invalid algorithm: %q (allowed: ed25519, ecdsap384)" , v )
3338}
3439
40+ type loginFlags struct {
41+ domain string
42+ privateKey string
43+ cryptoAlgorithm CryptoAlgorithm
44+ registryURL string
45+ token string
46+ }
47+
3548func LoginCommand (args []string ) error {
3649 if len (args ) < 1 {
3750 return errors .New ("authentication method required\n \n Usage: mcp-publisher login <method>\n \n Methods:\n github Interactive GitHub authentication\n github-oidc GitHub Actions OIDC authentication\n dns DNS-based authentication (requires --domain and --private-key)\n http HTTP-based authentication (requires --domain and --private-key)\n none Anonymous authentication (for testing)" )
3851 }
3952
4053 method := args [0 ]
54+ flags , err := parseLoginFlags (method , args [1 :])
55+ if err != nil {
56+ return err
57+ }
58+
59+ authProvider , err := createAuthProvider (method , flags )
60+ if err != nil {
61+ return err
62+ }
4163
42- // Parse remaining flags based on method
43- loginFlags := flag .NewFlagSet ("login" , flag .ExitOnError )
44- var domain string
45- var privateKey string
46- var cryptoAlgorithm = CryptoAlgorithm (auth .AlgorithmEd25519 )
47- var registryURL string
64+ return performLogin (authProvider , method , flags .registryURL )
65+ }
66+
67+ func parseLoginFlags (method string , args []string ) (* loginFlags , error ) {
68+ flags := & loginFlags {
69+ cryptoAlgorithm : CryptoAlgorithm (auth .AlgorithmEd25519 ), // default
70+ }
71+ loginFlagSet := flag .NewFlagSet ("login" , flag .ExitOnError )
4872
49- loginFlags .StringVar (& registryURL , "registry" , DefaultRegistryURL , "Registry URL" )
73+ loginFlagSet .StringVar (& flags . registryURL , "registry" , DefaultRegistryURL , "Registry URL" )
5074
51- if method == "dns" || method == "http" {
52- loginFlags .StringVar (& domain , "domain" , "" , "Domain name" )
53- loginFlags .StringVar (& privateKey , "private-key" , "" , "Private key (hex)" )
54- loginFlags .Var (& cryptoAlgorithm , "algorithm" , "Cryptographic algorithm (ed25519, ecdsap384)" )
75+ if method == MethodGitHub {
76+ loginFlagSet .StringVar (& flags .token , "token" , "" , "GitHub Personal Access Token" )
5577 }
5678
57- if err := loginFlags .Parse (args [1 :]); err != nil {
58- return err
79+ if method == MethodDNS || method == MethodHTTP {
80+ loginFlagSet .StringVar (& flags .domain , "domain" , "" , "Domain name" )
81+ loginFlagSet .StringVar (& flags .privateKey , "private-key" , "" , "Private key (64-char hex)" )
82+ loginFlagSet .Var (& flags .cryptoAlgorithm , "algorithm" , "Cryptographic algorithm (ed25519, ecdsap384)" )
5983 }
6084
61- // Create auth provider based on method
62- var authProvider auth.Provider
85+ if err := loginFlagSet .Parse (args ); err != nil {
86+ return nil , err
87+ }
88+
89+ return flags , nil
90+ }
91+
92+ func createAuthProvider (method string , flags * loginFlags ) (auth.Provider , error ) {
6393 switch method {
64- case "github" :
65- authProvider = auth .NewGitHubATProvider (true , registryURL )
66- case "github-oidc" :
67- authProvider = auth .NewGitHubOIDCProvider (registryURL )
68- case "dns" :
69- if domain == "" || privateKey == "" {
70- return errors .New ("dns authentication requires --domain and --private-key" )
94+ case MethodGitHub :
95+ return auth .NewGitHubATProvider (true , flags . registryURL , flags . token ), nil
96+ case MethodGitHubOIDC :
97+ return auth .NewGitHubOIDCProvider (flags . registryURL ), nil
98+ case MethodDNS :
99+ if flags . domain == "" || flags . privateKey == "" {
100+ return nil , errors .New ("dns authentication requires --domain and --private-key" )
71101 }
72- authProvider = auth .NewDNSProvider (registryURL , domain , privateKey , auth .CryptoAlgorithm (cryptoAlgorithm ))
73- case "http" :
74- if domain == "" || privateKey == "" {
75- return errors .New ("http authentication requires --domain and --private-key" )
102+ return auth .NewDNSProvider (flags . registryURL , flags . domain , flags . privateKey , auth .CryptoAlgorithm (flags . cryptoAlgorithm )), nil
103+ case MethodHTTP :
104+ if flags . domain == "" || flags . privateKey == "" {
105+ return nil , errors .New ("http authentication requires --domain and --private-key" )
76106 }
77- authProvider = auth .NewHTTPProvider (registryURL , domain , privateKey , auth .CryptoAlgorithm (cryptoAlgorithm ))
78- case "none" :
79- authProvider = auth .NewNoneProvider (registryURL )
107+ return auth .NewHTTPProvider (flags . registryURL , flags . domain , flags . privateKey , auth .CryptoAlgorithm (flags . cryptoAlgorithm )), nil
108+ case MethodNone :
109+ return auth .NewNoneProvider (flags . registryURL ), nil
80110 default :
81- return fmt .Errorf ("unknown authentication method: %s\n For a list of available methods, run: mcp-publisher login" , method )
111+ return nil , fmt .Errorf ("unknown authentication method: %s\n For a list of available methods, run: mcp-publisher login" , method )
82112 }
113+ }
83114
84- // Perform login
115+ func performLogin ( authProvider auth. Provider , method , registryURL string ) error {
85116 ctx := context .Background ()
86117 _ , _ = fmt .Fprintf (os .Stdout , "Logging in with %s...\n " , method )
87118
0 commit comments