Skip to content

Commit acb6918

Browse files
authored
fix(mcp): use provider from flag/env (#1325)
1 parent 0084358 commit acb6918

File tree

9 files changed

+68
-45
lines changed

9 files changed

+68
-45
lines changed

src/cmd/cli/command/mcp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ set_config - This tool sets or updates configuration variables for a deployed ap
7676

7777
// Setup tools
7878
term.Debug("Setting up tools")
79-
tools.SetupTools(s, getCluster(), authPort)
79+
tools.SetupTools(s, getCluster(), authPort, providerID)
8080

8181
// Start auth server for docker login flow
8282
if authPort != 0 {

src/pkg/mcp/tools/deploy.go

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
)
2020

2121
// setupDeployTool configures and adds the deployment tool to the MCP server
22-
func setupDeployTool(s *server.MCPServer, cluster string) {
22+
func setupDeployTool(s *server.MCPServer, cluster string, providerId cliClient.ProviderID) {
2323
term.Debug("Creating deployment tool")
2424
composeUpTool := mcp.NewTool("deploy",
2525
mcp.WithDescription("Deploy services using defang"),
@@ -65,13 +65,18 @@ func setupDeployTool(s *server.MCPServer, cluster string) {
6565
client.Track("MCP Deploy Tool")
6666

6767
term.Debug("Function invoked: cli.NewProvider")
68-
provider, err := cli.NewProvider(ctx, cliClient.ProviderDefang, client)
68+
provider, err := cli.NewProvider(ctx, providerId, client)
6969
if err != nil {
7070
term.Error("Failed to get new provider", "error", err)
71-
7271
return mcp.NewToolResultErrorFromErr("Failed to get new provider", err), nil
7372
}
7473

74+
err = canIUseProvider(ctx, client, project.Name, provider)
75+
if err != nil {
76+
term.Error("Failed to use provider", "error", err)
77+
return mcp.NewToolResultErrorFromErr("Failed to use provider", err), nil
78+
}
79+
7580
// Deploy the services
7681
term.Debugf("Deploying services for project %s...", project.Name)
7782

@@ -99,27 +104,34 @@ func setupDeployTool(s *server.MCPServer, cluster string) {
99104
return mcp.NewToolResultText(fmt.Sprintf("Failed to deploy services: %v", errors.New("no services deployed"))), nil
100105
}
101106

102-
// Get the portal URL for browser preview
103-
portalURL := "https://portal.defang.io/"
104-
105-
// Open the portal URL in the browser
106-
term.Debugf("Opening portal URL in browser: %s", portalURL)
107-
go func() {
108-
err := browser.OpenURL(portalURL)
109-
if err != nil {
110-
term.Error("Failed to open URL in browser", "error", err, "url", portalURL)
111-
}
112-
}()
113-
114107
// Success case
115108
term.Debugf("Successfully started deployed services with etag: %s", deployResp.Etag)
116109

117110
// Log deployment success
118111
term.Debug("Deployment Started!")
119112
term.Debugf("Deployment ID: %s", deployResp.Etag)
120113

121-
// Log browser preview information
122-
term.Debugf("🌐 %s available", portalURL)
114+
var portal string
115+
if providerId == cliClient.ProviderDefang {
116+
// Get the portal URL for browser preview
117+
portalURL := "https://portal.defang.io/"
118+
119+
// Open the portal URL in the browser
120+
term.Debugf("Opening portal URL in browser: %s", portalURL)
121+
go func() {
122+
err := browser.OpenURL(portalURL)
123+
if err != nil {
124+
term.Error("Failed to open URL in browser", "error", err, "url", portalURL)
125+
}
126+
}()
127+
128+
// Log browser preview information
129+
term.Debugf("🌐 %s available", portalURL)
130+
portal = "Please use the web portal url: %s" + portalURL
131+
} else {
132+
// portalURL := fmt.Sprintf("https://%s.signin.aws.amazon.com/console")
133+
portal = fmt.Sprintf("Please use the %s console", providerId)
134+
}
123135

124136
// Log service details
125137
term.Debug("Services:")
@@ -130,6 +142,6 @@ func setupDeployTool(s *server.MCPServer, cluster string) {
130142
}
131143

132144
// Return the etag data as text
133-
return mcp.NewToolResultText(fmt.Sprintf("Please use the web portal url: %s to follow the deployment of %s, with the deployment ID of %s", portalURL, project.Name, deployResp.Etag)), nil
145+
return mcp.NewToolResultText(fmt.Sprintf("%s to follow the deployment of %s, with the deployment ID of %s", portal, project.Name, deployResp.Etag)), nil
134146
})
135147
}

src/pkg/mcp/tools/destroy.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
)
1717

1818
// setupDestroyTool configures and adds the destroy tool to the MCP server
19-
func setupDestroyTool(s *server.MCPServer, cluster string) {
19+
func setupDestroyTool(s *server.MCPServer, cluster string, providerId cliClient.ProviderID) {
2020
term.Debug("Creating destroy tool")
2121
composeDownTool := mcp.NewTool("destroy",
2222
mcp.WithDescription("Remove services using defang."),
@@ -42,10 +42,9 @@ func setupDestroyTool(s *server.MCPServer, cluster string) {
4242
client.Track("MCP Destroy Tool")
4343

4444
term.Debug("Function invoked: cli.NewProvider")
45-
provider, err := cli.NewProvider(ctx, cliClient.ProviderDefang, client)
45+
provider, err := cli.NewProvider(ctx, providerId, client)
4646
if err != nil {
4747
term.Error("Failed to get new provider", "error", err)
48-
4948
return mcp.NewToolResultErrorFromErr("Failed to get new provider", err), nil
5049
}
5150

@@ -94,16 +93,19 @@ func setupDestroyTool(s *server.MCPServer, cluster string) {
9493
}
9594

9695
func canIUseProvider(ctx context.Context, grpcClient cliClient.FabricClient, projectName string, provider cliClient.Provider) error {
96+
info, err := provider.AccountInfo(ctx)
97+
if err != nil {
98+
return err
99+
}
100+
97101
canUseReq := defangv1.CanIUseRequest{
98102
Project: projectName,
99-
Provider: defangv1.Provider_DEFANG,
103+
Provider: info.Provider.Value(),
100104
}
101-
102105
term.Debug("Function invoked: client.CanIUse")
103106
resp, err := grpcClient.CanIUse(ctx, &canUseReq)
104107
if err != nil {
105-
term.Error("Failed to use provider", "error", err)
106-
return fmt.Errorf("failed to use provider: %w", err)
108+
return err
107109
}
108110

109111
term.Debug("Function invoked: provider.SetCanIUseConfig")

src/pkg/mcp/tools/estimate.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ import (
1717
)
1818

1919
// setupEstimateTool configures and adds the estimate tool to the MCP server
20-
func setupEstimateTool(s *server.MCPServer, cluster string) {
20+
func setupEstimateTool(s *server.MCPServer, cluster string, providerId cliClient.ProviderID) {
21+
if providerId == cliClient.ProviderDefang {
22+
providerId = cliClient.ProviderAWS // Default to AWS
23+
}
24+
2125
term.Debug("Creating estimate tool")
2226
estimateTool := mcp.NewTool("estimate",
2327
mcp.WithDescription("Estimate the cost of a Defang project deployed to AWS"),
@@ -28,7 +32,7 @@ func setupEstimateTool(s *server.MCPServer, cluster string) {
2832

2933
mcp.WithString("provider",
3034
mcp.Description("The cloud provider to estimate costs for. Supported options are AWS or GCP"),
31-
mcp.DefaultString("AWS"),
35+
mcp.DefaultString(strings.ToUpper(providerId.String())),
3236
mcp.Enum("AWS", "GCP"),
3337
),
3438

@@ -61,7 +65,7 @@ func setupEstimateTool(s *server.MCPServer, cluster string) {
6165

6266
providerString, ok := request.Params.Arguments["provider"].(string)
6367
if !ok {
64-
providerString = "aws" // Default to AWS if not provided
68+
providerString = providerId.String()
6569
}
6670

6771
// This logic is replicated from src/cmd/cli/command/mode.go

src/pkg/mcp/tools/listConfig.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
)
1717

1818
// setupSetConfigTool configures and adds the estimate tool to the MCP server
19-
func setupListConfigTool(s *server.MCPServer, cluster string) {
19+
func setupListConfigTool(s *server.MCPServer, cluster string, providerId cliClient.ProviderID) {
2020
term.Debug("Creating list config tool")
2121
listConfigTool := mcp.NewTool("list_configs",
2222
mcp.WithDescription("List all config variables for the defang project"),
@@ -48,7 +48,7 @@ func setupListConfigTool(s *server.MCPServer, cluster string) {
4848
}
4949

5050
term.Debug("Function invoked: cli.NewProvider")
51-
provider, err := cli.NewProvider(ctx, cliClient.ProviderDefang, client)
51+
provider, err := cli.NewProvider(ctx, providerId, client)
5252
if err != nil {
5353
term.Error("Failed to get new provider", "error", err)
5454

src/pkg/mcp/tools/removeConfig.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
)
1717

1818
// setupRemoveConfigTool configures and adds the estimate tool to the MCP server
19-
func setupRemoveConfigTool(s *server.MCPServer, cluster string) {
19+
func setupRemoveConfigTool(s *server.MCPServer, cluster string, providerId cliClient.ProviderID) {
2020
term.Debug("Creating remove config tool")
2121
removeConfigTool := mcp.NewTool("remove_config",
2222
mcp.WithDescription("Remove a config variable for the defang project"),
@@ -58,7 +58,7 @@ func setupRemoveConfigTool(s *server.MCPServer, cluster string) {
5858
}
5959

6060
term.Debug("Function invoked: cli.NewProvider")
61-
provider, err := cli.NewProvider(ctx, cliClient.ProviderDefang, client)
61+
provider, err := cli.NewProvider(ctx, providerId, client)
6262
if err != nil {
6363
term.Error("Failed to get new provider", "error", err)
6464

src/pkg/mcp/tools/services.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
)
2020

2121
// setupServicesTool configures and adds the services tool to the MCP server
22-
func setupServicesTool(s *server.MCPServer, cluster string) {
22+
func setupServicesTool(s *server.MCPServer, cluster string, providerId cliClient.ProviderID) {
2323
term.Debug("Creating services tool")
2424
servicesTool := mcp.NewTool("services",
2525
mcp.WithDescription("List information about services in Defang Playground"),
@@ -53,7 +53,7 @@ func setupServicesTool(s *server.MCPServer, cluster string) {
5353

5454
// Create a Defang client
5555
term.Debug("Function invoked: cli.NewProvider")
56-
provider, err := cli.NewProvider(ctx, cliClient.ProviderDefang, client)
56+
provider, err := cli.NewProvider(ctx, providerId, client)
5757
if err != nil {
5858
term.Error("Failed to create provider", "error", err)
5959
return mcp.NewToolResultErrorFromErr("Failed to create provider", err), nil

src/pkg/mcp/tools/setConfig.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
)
1717

1818
// setupSetConfigTool configures and adds the estimate tool to the MCP server
19-
func setupSetConfigTool(s *server.MCPServer, cluster string) {
19+
func setupSetConfigTool(s *server.MCPServer, cluster string, providerId cliClient.ProviderID) {
2020
term.Debug("Creating set config tool")
2121
setConfigTool := mcp.NewTool("set_config",
2222
mcp.WithDescription("Set a config variable for the defang project"),
@@ -69,7 +69,7 @@ func setupSetConfigTool(s *server.MCPServer, cluster string) {
6969
}
7070

7171
term.Debug("Function invoked: cli.NewProvider")
72-
provider, err := cli.NewProvider(ctx, cliClient.ProviderDefang, client)
72+
provider, err := cli.NewProvider(ctx, providerId, client)
7373
if err != nil {
7474
term.Error("Failed to get new provider", "error", err)
7575

src/pkg/mcp/tools/tools.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,48 @@
11
package tools
22

33
import (
4+
"github.com/DefangLabs/defang/src/pkg/cli/client"
45
"github.com/DefangLabs/defang/src/pkg/term"
56
"github.com/mark3labs/mcp-go/server"
67
)
78

89
// SetupTools configures and adds all the MCP tools to the server
9-
func SetupTools(s *server.MCPServer, cluster string, authPort int) {
10+
func SetupTools(s *server.MCPServer, cluster string, authPort int, providerId client.ProviderID) {
11+
if providerId == "" || providerId == client.ProviderAuto {
12+
providerId = client.ProviderDefang // Default to Defang Playground if not specified
13+
}
14+
1015
// Create a tool for logging in and getting a new token
1116
term.Debug("Setting up login tool")
1217
setupLoginTool(s, cluster, authPort)
1318

1419
// Create a tool for listing services
1520
term.Debug("Setting up services tool")
16-
setupServicesTool(s, cluster)
21+
setupServicesTool(s, cluster, providerId)
1722

1823
// Create a tool for deployment
1924
term.Debug("Setting up deployment tool")
20-
setupDeployTool(s, cluster)
25+
setupDeployTool(s, cluster, providerId)
2126

2227
// Create a tool for destroying services
2328
term.Debug("Setting up destroy tool")
24-
setupDestroyTool(s, cluster)
29+
setupDestroyTool(s, cluster, providerId)
2530

2631
// Create a tool for estimating costs
2732
term.Debug("Setting up estimate tool")
28-
setupEstimateTool(s, cluster)
33+
setupEstimateTool(s, cluster, providerId)
2934

3035
// Create a tool to set config variables
3136
term.Debug("Setting up set config tool")
32-
setupSetConfigTool(s, cluster)
37+
setupSetConfigTool(s, cluster, providerId)
3338

3439
// Create a tool to remove config variables
3540
term.Debug("Setting up remove config tool")
36-
setupRemoveConfigTool(s, cluster)
41+
setupRemoveConfigTool(s, cluster, providerId)
3742

3843
// Create a tool to list config variables
3944
term.Debug("Setting up list config tool")
40-
setupListConfigTool(s, cluster)
45+
setupListConfigTool(s, cluster, providerId)
4146

4247
term.Debug("All MCP tools have been set up successfully")
4348
}

0 commit comments

Comments
 (0)