Skip to content

Commit 1d0792a

Browse files
committed
Per-session workspace management
Workspace was previously set globally, since we were only running as an stdio server. Now, when running as a streamable server, we want to have different contexts for different users. When running as an stdio server, we still want the global workspace management.
1 parent acee848 commit 1d0792a

File tree

16 files changed

+267
-38
lines changed

16 files changed

+267
-38
lines changed

cmd/server.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/render-oss/render-mcp-server/pkg/owner"
1414
"github.com/render-oss/render-mcp-server/pkg/postgres"
1515
"github.com/render-oss/render-mcp-server/pkg/service"
16+
"github.com/render-oss/render-mcp-server/pkg/session"
1617
)
1718

1819
func Serve(transport string) *server.MCPServer {
@@ -36,11 +37,11 @@ func Serve(transport string) *server.MCPServer {
3637
s.AddTools(logs.Tools(c)...)
3738

3839
if transport == "http" {
39-
if err := server.NewStreamableHTTPServer(s).Start(":10000"); err != nil {
40+
if err := server.NewStreamableHTTPServer(s, server.WithHTTPContextFunc(session.ContextWithHTTPSession)).Start(":10000"); err != nil {
4041
log.Fatalf("starting server: %w:", err)
4142
}
4243
} else {
43-
if err := server.ServeStdio(s); err != nil {
44+
if err := server.ServeStdio(s, server.WithStdioContextFunc(session.ContextWithStdioSession)); err != nil {
4445
fmt.Printf("Server error: %v\n", err)
4546
}
4647
}

pkg/config/config.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,6 @@ func WorkspaceID() (string, error) {
143143
return workspaceID, nil
144144
}
145145

146-
func IsWorkspaceSet() bool {
147-
id, _ := WorkspaceID()
148-
return id != ""
149-
}
150-
151146
func getAPIConfig() (APIConfig, error) {
152147
cfg, err := Load()
153148
if err != nil {

pkg/keyvalue/repo.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55

66
"github.com/render-oss/render-mcp-server/pkg/client"
7-
"github.com/render-oss/render-mcp-server/pkg/config"
7+
"github.com/render-oss/render-mcp-server/pkg/session"
88
"github.com/render-oss/render-mcp-server/pkg/validate"
99
)
1010

@@ -27,7 +27,7 @@ func NewRepo(c keyValueRepoClient) *Repo {
2727
}
2828

2929
func (r *Repo) ListKeyValue(ctx context.Context, params *client.ListKeyValueParams) ([]*client.KeyValue, error) {
30-
workspace, err := config.WorkspaceID()
30+
workspace, err := session.FromContext(ctx).GetWorkspace()
3131
if err != nil {
3232
return nil, err
3333
}
@@ -65,7 +65,7 @@ func (r *Repo) GetKeyValue(ctx context.Context, id string) (*client.KeyValueDeta
6565
}
6666

6767
func (r *Repo) CreateKeyValue(ctx context.Context, input client.KeyValuePOSTInput) (*client.KeyValueDetail, error) {
68-
if err := validate.WorkspaceMatches(input.OwnerId); err != nil {
68+
if err := validate.WorkspaceMatches(ctx, input.OwnerId); err != nil {
6969
return nil, err
7070
}
7171

pkg/keyvalue/tools.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import (
77
"github.com/mark3labs/mcp-go/mcp"
88
"github.com/mark3labs/mcp-go/server"
99
"github.com/render-oss/render-mcp-server/pkg/client"
10-
"github.com/render-oss/render-mcp-server/pkg/config"
1110
"github.com/render-oss/render-mcp-server/pkg/mcpserver"
1211
"github.com/render-oss/render-mcp-server/pkg/pointers"
12+
"github.com/render-oss/render-mcp-server/pkg/session"
1313
"github.com/render-oss/render-mcp-server/pkg/validate"
1414
)
1515

@@ -126,7 +126,7 @@ func createKeyValue(keyValueRepo *Repo) server.ServerTool {
126126
return mcp.NewToolResultError(err.Error()), nil
127127
}
128128

129-
ownerId, err := config.WorkspaceID()
129+
ownerId, err := session.FromContext(ctx).GetWorkspace()
130130
if err != nil {
131131
return mcp.NewToolResultError(err.Error()), nil
132132
}

pkg/logs/tools.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99
"github.com/mark3labs/mcp-go/server"
1010
"github.com/render-oss/render-mcp-server/pkg/client"
1111
logsclient "github.com/render-oss/render-mcp-server/pkg/client/logs"
12-
"github.com/render-oss/render-mcp-server/pkg/config"
1312
"github.com/render-oss/render-mcp-server/pkg/mcpserver"
1413
"github.com/render-oss/render-mcp-server/pkg/pointers"
14+
"github.com/render-oss/render-mcp-server/pkg/session"
1515
"github.com/render-oss/render-mcp-server/pkg/validate"
1616
)
1717

@@ -114,7 +114,7 @@ func listLogs(logRepo *LogRepo) server.ServerTool {
114114
),
115115
),
116116
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
117-
ownerId, err := config.WorkspaceID()
117+
ownerId, err := session.FromContext(ctx).GetWorkspace()
118118
if err != nil {
119119
return mcp.NewToolResultError(err.Error()), nil
120120
}
@@ -324,7 +324,7 @@ func listLogLabelValues(logRepo *LogRepo) server.ServerTool {
324324
return mcp.NewToolResultError(err.Error()), nil
325325
}
326326

327-
ownerId, err := config.WorkspaceID()
327+
ownerId, err := session.FromContext(ctx).GetWorkspace()
328328
if err != nil {
329329
return mcp.NewToolResultError(err.Error()), nil
330330
}

pkg/owner/tools.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88
"github.com/mark3labs/mcp-go/mcp"
99
"github.com/mark3labs/mcp-go/server"
1010
"github.com/render-oss/render-mcp-server/pkg/client"
11-
"github.com/render-oss/render-mcp-server/pkg/config"
1211
"github.com/render-oss/render-mcp-server/pkg/pointers"
12+
"github.com/render-oss/render-mcp-server/pkg/session"
1313
"github.com/render-oss/render-mcp-server/pkg/validate"
1414
)
1515

@@ -48,7 +48,7 @@ func listWorkspaces(ownerRepo *Repo) server.ServerTool {
4848
resultText := ""
4949

5050
if len(workspaces) == 1 {
51-
err = config.SelectWorkspace(workspaces[0].Id)
51+
err = session.FromContext(ctx).SetWorkspace(workspaces[0].Id)
5252
if err != nil {
5353
return mcp.NewToolResultError(err.Error()), nil
5454
}
@@ -84,7 +84,7 @@ func selectWorkspace() server.ServerTool {
8484
return mcp.NewToolResultError(err.Error()), nil
8585
}
8686

87-
err = config.SelectWorkspace(ownerID)
87+
err = session.FromContext(ctx).SetWorkspace(ownerID)
8888
if err != nil {
8989
return mcp.NewToolResultError(err.Error()), nil
9090
}
@@ -106,7 +106,7 @@ func getSelectedWorkspace() server.ServerTool {
106106
}),
107107
),
108108
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
109-
workspace, err := config.WorkspaceID()
109+
workspace, err := session.FromContext(ctx).GetWorkspace()
110110
if err != nil {
111111
return mcp.NewToolResultError(err.Error()), nil
112112
}

pkg/postgres/repo.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"net/http"
66

77
"github.com/render-oss/render-mcp-server/pkg/client"
8-
"github.com/render-oss/render-mcp-server/pkg/config"
8+
"github.com/render-oss/render-mcp-server/pkg/session"
99
"github.com/render-oss/render-mcp-server/pkg/validate"
1010
)
1111

@@ -29,7 +29,7 @@ func NewRepo(c postgresRepoClient) *Repo {
2929
}
3030

3131
func (r *Repo) ListPostgres(ctx context.Context, params *client.ListPostgresParams) ([]*client.Postgres, error) {
32-
workspace, err := config.WorkspaceID()
32+
workspace, err := session.FromContext(ctx).GetWorkspace()
3333
if err != nil {
3434
return nil, err
3535
}
@@ -88,7 +88,7 @@ func (r *Repo) GetPostgresConnectionInfo(ctx context.Context, id string) (*clien
8888
}
8989

9090
func (r *Repo) CreatePostgres(ctx context.Context, input client.PostgresPOSTInput) (*client.PostgresDetail, error) {
91-
if err := validate.WorkspaceMatches(input.OwnerId); err != nil {
91+
if err := validate.WorkspaceMatches(ctx, input.OwnerId); err != nil {
9292
return nil, err
9393
}
9494

pkg/postgres/tools.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import (
1010
"github.com/mark3labs/mcp-go/server"
1111
"github.com/render-oss/render-mcp-server/pkg/client"
1212
pgclient "github.com/render-oss/render-mcp-server/pkg/client/postgres"
13-
"github.com/render-oss/render-mcp-server/pkg/config"
1413
"github.com/render-oss/render-mcp-server/pkg/mcpserver"
1514
"github.com/render-oss/render-mcp-server/pkg/pointers"
15+
"github.com/render-oss/render-mcp-server/pkg/session"
1616
"github.com/render-oss/render-mcp-server/pkg/validate"
1717
)
1818

@@ -133,7 +133,7 @@ func createPostgres(postgresRepo *Repo) server.ServerTool {
133133
return mcp.NewToolResultError(err.Error()), nil
134134
}
135135

136-
ownerId, err := config.WorkspaceID()
136+
ownerId, err := session.FromContext(ctx).GetWorkspace()
137137
if err != nil {
138138
return mcp.NewToolResultError(err.Error()), nil
139139
}

pkg/service/repo.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import (
44
"context"
55

66
"github.com/render-oss/render-mcp-server/pkg/client"
7-
"github.com/render-oss/render-mcp-server/pkg/config"
87
"github.com/render-oss/render-mcp-server/pkg/pointers"
8+
"github.com/render-oss/render-mcp-server/pkg/session"
99
"github.com/render-oss/render-mcp-server/pkg/validate"
1010
)
1111

@@ -30,7 +30,7 @@ func NewRepo(c serviceRepoClient) *Repo {
3030
}
3131

3232
func (s *Repo) ListServices(ctx context.Context, params *client.ListServicesParams) ([]*client.Service, error) {
33-
workspace, err := config.WorkspaceID()
33+
workspace, err := session.FromContext(ctx).GetWorkspace()
3434
if err != nil {
3535
return nil, err
3636
}
@@ -137,7 +137,7 @@ func (s *Repo) DeployService(ctx context.Context, serviceId string) (*client.Cre
137137
}
138138

139139
func (s *Repo) CreateService(ctx context.Context, data client.CreateServiceJSONRequestBody) (*client.ServiceAndDeploy, error) {
140-
if err := validate.WorkspaceMatches(data.OwnerId); err != nil {
140+
if err := validate.WorkspaceMatches(ctx, data.OwnerId); err != nil {
141141
return nil, err
142142
}
143143

pkg/service/tools.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/render-oss/render-mcp-server/pkg/config"
1111
"github.com/render-oss/render-mcp-server/pkg/mcpserver"
1212
"github.com/render-oss/render-mcp-server/pkg/pointers"
13+
"github.com/render-oss/render-mcp-server/pkg/session"
1314
"github.com/render-oss/render-mcp-server/pkg/validate"
1415
)
1516

@@ -176,7 +177,7 @@ func createWebService(serviceRepo *Repo) server.ServerTool {
176177
),
177178
),
178179
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
179-
requestBody, err := createValidatedWebServiceRequest(request)
180+
requestBody, err := createValidatedWebServiceRequest(ctx, request)
180181
if err != nil {
181182
return mcp.NewToolResultError(err.Error()), nil
182183
}
@@ -196,7 +197,7 @@ func createWebService(serviceRepo *Repo) server.ServerTool {
196197
}
197198
}
198199

199-
func createValidatedWebServiceRequest(request mcp.CallToolRequest) (*client.CreateServiceJSONRequestBody, error) {
200+
func createValidatedWebServiceRequest(ctx context.Context, request mcp.CallToolRequest) (*client.CreateServiceJSONRequestBody, error) {
200201
runtime, err := validate.RequiredToolParam[string](request, "runtime")
201202
if err != nil {
202203
return nil, err
@@ -248,15 +249,15 @@ func createValidatedWebServiceRequest(request mcp.CallToolRequest) (*client.Crea
248249
return nil, err
249250
}
250251

251-
return validatedCreateServiceRequest(request, client.WebService, &serviceDetails)
252+
return validatedCreateServiceRequest(ctx, request, client.WebService, &serviceDetails)
252253
}
253254

254-
func validatedCreateServiceRequest(request mcp.CallToolRequest, serviceType client.ServiceType, serviceDetails *client.ServicePOST_ServiceDetails) (*client.CreateServiceJSONRequestBody, error) {
255+
func validatedCreateServiceRequest(ctx context.Context, request mcp.CallToolRequest, serviceType client.ServiceType, serviceDetails *client.ServicePOST_ServiceDetails) (*client.CreateServiceJSONRequestBody, error) {
255256
name, err := validate.RequiredToolParam[string](request, "name")
256257
if err != nil {
257258
return nil, err
258259
}
259-
ownerId, err := config.WorkspaceID()
260+
ownerId, err := session.FromContext(ctx).GetWorkspace()
260261
if err != nil {
261262
return nil, err
262263
}
@@ -355,7 +356,7 @@ func createStaticSite(serviceRepo *Repo) server.ServerTool {
355356
),
356357
),
357358
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
358-
requestBody, err := createValidatedStaticSiteRequest(request)
359+
requestBody, err := createValidatedStaticSiteRequest(ctx, request)
359360
if err != nil {
360361
return mcp.NewToolResultError(err.Error()), nil
361362
}
@@ -375,7 +376,7 @@ func createStaticSite(serviceRepo *Repo) server.ServerTool {
375376
}
376377
}
377378

378-
func createValidatedStaticSiteRequest(request mcp.CallToolRequest) (*client.CreateServiceJSONRequestBody, error) {
379+
func createValidatedStaticSiteRequest(ctx context.Context, request mcp.CallToolRequest) (*client.CreateServiceJSONRequestBody, error) {
379380
buildCommand, err := validate.RequiredToolParam[string](request, "buildCommand")
380381
if err != nil {
381382
return nil, err
@@ -396,7 +397,7 @@ func createValidatedStaticSiteRequest(request mcp.CallToolRequest) (*client.Crea
396397
return nil, err
397398
}
398399

399-
return validatedCreateServiceRequest(request, client.StaticSite, &serviceDetails)
400+
return validatedCreateServiceRequest(ctx, request, client.StaticSite, &serviceDetails)
400401
}
401402

402403
func updateWebService() server.ServerTool {

0 commit comments

Comments
 (0)