Skip to content

Commit eadc258

Browse files
committed
WIP: Generic Tool Abstraction
Signed-off-by: Andrea Luzzardi <[email protected]>
1 parent 7e267e4 commit eadc258

File tree

3 files changed

+269
-90
lines changed

3 files changed

+269
-90
lines changed

mcpserver/args.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package mcpserver
2+
3+
import "github.com/mark3labs/mcp-go/mcp"
4+
5+
var (
6+
explainationArgument = mcp.WithString("explanation",
7+
mcp.Description("One sentence explanation for why this directory is being listed."),
8+
)
9+
environmentSourceArgument = mcp.WithString("environment_source",
10+
mcp.Description("Absolute path to the source git repository for the environment."),
11+
mcp.Required(),
12+
)
13+
environmentIDArgument = mcp.WithString("environment_id",
14+
mcp.Description("The ID of the environment for this command. Must call `environment_create` first."),
15+
mcp.Required(),
16+
)
17+
)
18+
19+
func newRepositoryTool(name string, description string, args ...mcp.ToolOption) mcp.Tool {
20+
opts := []mcp.ToolOption{
21+
mcp.WithDescription(description),
22+
explainationArgument,
23+
environmentSourceArgument,
24+
}
25+
opts = append(opts, args...)
26+
27+
return mcp.NewTool(name, opts...)
28+
}
29+
30+
func newEnvironmentTool(name string, description string, args ...mcp.ToolOption) mcp.Tool {
31+
opts := []mcp.ToolOption{
32+
mcp.WithDescription(description),
33+
explainationArgument,
34+
environmentSourceArgument,
35+
environmentIDArgument,
36+
}
37+
opts = append(opts, args...)
38+
39+
return mcp.NewTool(name, opts...)
40+
}

mcpserver/mcpserver.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package mcpserver
2+
3+
import (
4+
"context"
5+
6+
"dagger.io/dagger"
7+
"github.com/dagger/container-use/environment"
8+
"github.com/dagger/container-use/repository"
9+
)
10+
11+
func dagFromContext(ctx context.Context) *dagger.Client {
12+
dag, ok := ctx.Value(daggerClientKey{}).(*dagger.Client)
13+
if !ok {
14+
panic("dagger client not found in context")
15+
}
16+
return dag
17+
}
18+
19+
type Request interface {
20+
isRequest()
21+
}
22+
23+
type BaseRequest struct {
24+
Explanation string `json:"explanation"`
25+
}
26+
27+
func (BaseRequest) isRequest() {}
28+
29+
type BaseRepositoryRequest struct {
30+
BaseRequest
31+
32+
EnvironmentSource string `json:"environment_source"`
33+
}
34+
35+
type BaseEnvironmentRequest struct {
36+
BaseRepositoryRequest
37+
38+
EnvironmentID string `json:"environment_id"`
39+
}
40+
41+
type Response any
42+
43+
type ToolResponse[T Response] struct {
44+
Message string
45+
Data T
46+
}
47+
48+
func openRepositoryFromRequest(ctx context.Context, request BaseRepositoryRequest) (*repository.Repository, error) {
49+
repo, err := repository.Open(ctx, request.EnvironmentSource)
50+
if err != nil {
51+
return nil, err
52+
}
53+
return repo, nil
54+
}
55+
56+
func openEnvironmentFromRequest(ctx context.Context, request BaseEnvironmentRequest) (*repository.Repository, *environment.Environment, error) {
57+
repo, err := openRepositoryFromRequest(ctx, request.BaseRepositoryRequest)
58+
if err != nil {
59+
return nil, nil, err
60+
}
61+
env, err := repo.Get(ctx, dagFromContext(ctx), request.EnvironmentID)
62+
if err != nil {
63+
return nil, nil, err
64+
}
65+
return repo, env, nil
66+
}

0 commit comments

Comments
 (0)