Skip to content

Commit f04eb35

Browse files
committed
move tool request to mcp_request.go
1 parent cd226aa commit f04eb35

File tree

2 files changed

+73
-52
lines changed

2 files changed

+73
-52
lines changed

cmd/src/mcp.go

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package main
22

33
import (
4-
"bytes"
54
"context"
65
"encoding/json"
76
"flag"
87
"fmt"
9-
"io"
10-
"net/http"
118
"strings"
129

1310
"github.com/sourcegraph/src-cli/internal/api"
@@ -16,8 +13,6 @@ import (
1613
"github.com/sourcegraph/sourcegraph/lib/errors"
1714
)
1815

19-
const McpPath = ".api/mcp/v1"
20-
2116
func init() {
2217
flagSet := flag.NewFlagSet("mcp", flag.ExitOnError)
2318
commands = append(commands, &command{
@@ -60,14 +55,14 @@ func mcpMain(args []string) error {
6055
return printSchemas(tool)
6156
}
6257

63-
flags, vars, err := mcp.BuildToolFlagSet(tool)
58+
flags, vars, err := mcp.BuildArgFlagSet(tool)
6459
if err != nil {
6560
return err
6661
}
6762
if err := flags.Parse(flagArgs); err != nil {
6863
return err
6964
}
70-
sanitizeFlagValues(vars)
65+
mcp.DerefFlagValues(vars)
7166

7267
if err := validateToolArgs(tool.InputSchema, args, vars); err != nil {
7368
return err
@@ -106,58 +101,16 @@ func validateToolArgs(inputSchema mcp.Schema, args []string, vars map[string]any
106101
}
107102

108103
func handleMcpTool(ctx context.Context, client api.Client, tool *mcp.ToolDef, vars map[string]any) error {
109-
jsonRPC := struct {
110-
Version string `json:"jsonrpc"`
111-
ID int `json:"id"`
112-
Method string `json:"method"`
113-
Params any `json:"params"`
114-
}{
115-
Version: "2.0",
116-
ID: 1,
117-
Method: "tools/call",
118-
Params: struct {
119-
Name string `json:"name"`
120-
Arguments map[string]any `json:"arguments"`
121-
}{
122-
Name: tool.RawName,
123-
Arguments: vars,
124-
},
125-
}
126-
127-
buf := bytes.NewBuffer(nil)
128-
data, err := json.Marshal(jsonRPC)
129-
if err != nil {
130-
return err
131-
}
132-
buf.Write(data)
133-
134-
req, err := client.NewHTTPRequest(ctx, http.MethodPost, McpPath, buf)
104+
resp, err := mcp.DoToolRequest(ctx, client, tool, vars)
135105
if err != nil {
136106
return err
137107
}
138-
req.Header.Add("Content-Type", "application/json")
139-
req.Header.Add("Accept", "*/*")
140108

141-
resp, err := client.Do(req)
109+
data, err := mcp.ParseToolResponse(ctx, resp)
142110
if err != nil {
143111
return err
144112
}
145113

146-
jsonData, err := parseSSEResponse(data)
147-
if err != nil {
148-
return err
149-
}
150-
151-
fmt.Println(string(jsonData))
114+
fmt.Printf(string(data))
152115
return nil
153116
}
154-
155-
func parseSSEResponse(data []byte) ([]byte, error) {
156-
lines := bytes.SplitSeq(data, []byte("\n"))
157-
for line := range lines {
158-
if jsonData, ok := bytes.CutPrefix(line, []byte("data: ")); ok {
159-
return jsonData, nil
160-
}
161-
}
162-
return nil, errors.New("no data found in SSE response")
163-
}

internal/mcp/mcp_request.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package mcp
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"encoding/json"
7+
"io"
8+
"net/http"
9+
10+
"github.com/sourcegraph/sourcegraph/lib/errors"
11+
"github.com/sourcegraph/src-cli/internal/api"
12+
)
13+
14+
const McpURLPath = ".api/mcp/v1"
15+
16+
func DoToolRequest(ctx context.Context, client api.Client, tool *ToolDef, vars map[string]any) (*http.Response, error) {
17+
jsonRPC := struct {
18+
Version string `json:"jsonrpc"`
19+
ID int `json:"id"`
20+
Method string `json:"method"`
21+
Params any `json:"params"`
22+
}{
23+
Version: "2.0",
24+
ID: 1,
25+
Method: "tools/call",
26+
Params: struct {
27+
Name string `json:"name"`
28+
Arguments map[string]any `json:"arguments"`
29+
}{
30+
Name: tool.RawName,
31+
Arguments: vars,
32+
},
33+
}
34+
35+
buf := bytes.NewBuffer(nil)
36+
data, err := json.Marshal(jsonRPC)
37+
if err != nil {
38+
return nil, err
39+
}
40+
buf.Write(data)
41+
42+
req, err := client.NewHTTPRequest(ctx, http.MethodPost, McpURLPath, buf)
43+
if err != nil {
44+
return nil, err
45+
}
46+
req.Header.Add("Content-Type", "application/json")
47+
req.Header.Add("Accept", "*/*")
48+
49+
return client.Do(req)
50+
}
51+
52+
func ParseToolResponse(ctx context.Context, resp *http.Response) ([]byte, error) {
53+
data, err := io.ReadAll(resp.Body)
54+
if err != nil {
55+
return nil, err
56+
}
57+
// The response is an SSE reponse
58+
// event:
59+
// data:
60+
lines := bytes.SplitSeq(data, []byte("\n"))
61+
for line := range lines {
62+
if jsonData, ok := bytes.CutPrefix(line, []byte("data: ")); ok {
63+
return jsonData, nil
64+
}
65+
}
66+
return nil, errors.New("no data found in SSE response")
67+
68+
}

0 commit comments

Comments
 (0)