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 {
@@ -51,14 +46,14 @@ func mcpMain(args []string) error {
5146 return printSchemas (tool )
5247 }
5348
54- flags , vars , err := mcp .BuildToolFlagSet (tool )
49+ flags , vars , err := mcp .BuildArgFlagSet (tool )
5550 if err != nil {
5651 return err
5752 }
5853 if err := flags .Parse (flagArgs ); err != nil {
5954 return err
6055 }
61- sanitizeFlagValues (vars )
56+ mcp . DerefFlagValues (vars )
6257
6358 if err := validateToolArgs (tool .InputSchema , args , vars ); err != nil {
6459 return err
@@ -97,58 +92,16 @@ func validateToolArgs(inputSchema mcp.Schema, args []string, vars map[string]any
9792}
9893
9994func handleMcpTool (ctx context.Context , client api.Client , tool * mcp.ToolDef , vars map [string ]any ) error {
100- jsonRPC := struct {
101- Version string `json:"jsonrpc"`
102- ID int `json:"id"`
103- Method string `json:"method"`
104- Params any `json:"params"`
105- }{
106- Version : "2.0" ,
107- ID : 1 ,
108- Method : "tools/call" ,
109- Params : struct {
110- Name string `json:"name"`
111- Arguments map [string ]any `json:"arguments"`
112- }{
113- Name : tool .RawName ,
114- Arguments : vars ,
115- },
116- }
117-
118- buf := bytes .NewBuffer (nil )
119- data , err := json .Marshal (jsonRPC )
120- if err != nil {
121- return err
122- }
123- buf .Write (data )
124-
125- req , err := client .NewHTTPRequest (ctx , http .MethodPost , McpPath , buf )
95+ resp , err := mcp .DoToolRequest (ctx , client , tool , vars )
12696 if err != nil {
12797 return err
12898 }
129- req .Header .Add ("Content-Type" , "application/json" )
130- req .Header .Add ("Accept" , "*/*" )
13199
132- resp , err := client . Do ( req )
100+ data , err := mcp . ParseToolResponse ( ctx , resp )
133101 if err != nil {
134102 return err
135103 }
136104
137- jsonData , err := parseSSEResponse (data )
138- if err != nil {
139- return err
140- }
141-
142- fmt .Println (string (jsonData ))
105+ fmt .Printf (string (data ))
143106 return nil
144107}
145-
146- func parseSSEResponse (data []byte ) ([]byte , error ) {
147- lines := bytes .SplitSeq (data , []byte ("\n " ))
148- for line := range lines {
149- if jsonData , ok := bytes .CutPrefix (line , []byte ("data: " )); ok {
150- return jsonData , nil
151- }
152- }
153- return nil , errors .New ("no data found in SSE response" )
154- }
0 commit comments