summaryrefslogtreecommitdiff
path: root/internal/mcp/server_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/mcp/server_test.go')
-rw-r--r--internal/mcp/server_test.go29
1 files changed, 23 insertions, 6 deletions
diff --git a/internal/mcp/server_test.go b/internal/mcp/server_test.go
index 0944f35..4b43f51 100644
--- a/internal/mcp/server_test.go
+++ b/internal/mcp/server_test.go
@@ -73,23 +73,40 @@ func sendRequest(w io.Writer, req Request) error {
}
// readResponse reads a newline-delimited JSON-RPC response (MCP stdio protocol).
+// Skips notification messages (those without an ID) and returns the actual response.
func readResponse(r io.Reader) (*Response, error) {
data, err := io.ReadAll(r)
if err != nil {
return nil, err
}
- // Parse newline-delimited JSON; take the last non-empty line as the response
+ // Parse newline-delimited JSON; find the first line with an ID (skip notifications)
lines := strings.Split(strings.TrimSpace(string(data)), "\n")
if len(lines) == 0 {
return nil, fmt.Errorf("no response data")
}
- body := lines[len(lines)-1]
- var resp Response
- if err := json.Unmarshal([]byte(body), &resp); err != nil {
- return nil, fmt.Errorf("unmarshal response: %w, body: %s", err, body)
+
+ // Try to find a response (message with an ID)
+ for _, line := range lines {
+ if len(line) == 0 {
+ continue
+ }
+
+ // Quick check if this might be a response (has "id" field)
+ if !strings.Contains(line, `"id"`) {
+ continue // Skip notifications
+ }
+
+ var resp Response
+ if err := json.Unmarshal([]byte(line), &resp); err != nil {
+ continue // Not a valid response, try next line
+ }
+
+ // Valid response found
+ return &resp, nil
}
- return &resp, nil
+
+ return nil, fmt.Errorf("no response found in output (only notifications)")
}
func TestServer_Initialize(t *testing.T) {