11package main
22
33import (
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-
2116func 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
108103func 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- }
0 commit comments