Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/mcp/toolset/shell.go
2606 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package toolset
5
6
import (
7
"bytes"
8
"context"
9
"errors"
10
"os/exec"
11
12
"github.com/modelcontextprotocol/go-sdk/mcp"
13
14
"github.com/lima-vm/lima/v2/pkg/mcp/msi"
15
"github.com/lima-vm/lima/v2/pkg/ptr"
16
)
17
18
func (ts *ToolSet) RunShellCommand(ctx context.Context,
19
_ *mcp.CallToolRequest, args msi.RunShellCommandParams,
20
) (*mcp.CallToolResult, *msi.RunShellCommandResult, error) {
21
if ts.inst == nil {
22
return nil, nil, errors.New("instance not registered")
23
}
24
guestPath, err := ts.TranslateHostPath(args.Directory)
25
if err != nil {
26
return nil, nil, err
27
}
28
cmd := exec.CommandContext(ctx, ts.limactl,
29
append([]string{"shell", "--workdir=" + guestPath, ts.inst.Name},
30
args.Command...)...)
31
var stdout, stderr bytes.Buffer
32
cmd.Stdout = &stdout
33
cmd.Stderr = &stderr
34
cmdErr := cmd.Run()
35
res := &msi.RunShellCommandResult{
36
Stdout: stdout.String(),
37
Stderr: stderr.String(),
38
}
39
if cmdErr == nil {
40
res.ExitCode = ptr.Of(0)
41
} else {
42
res.Error = cmdErr.Error()
43
if st := cmd.ProcessState; st != nil {
44
res.ExitCode = ptr.Of(st.ExitCode())
45
}
46
}
47
return &mcp.CallToolResult{
48
StructuredContent: res,
49
}, res, nil
50
}
51
52