fix: support Claude Code MCP protocol version

This commit is contained in:
thibaud-leclere 2026-04-10 15:38:58 +02:00
parent 5dbc073e5c
commit 1472d7a107
2 changed files with 55 additions and 0 deletions

View file

@ -34,6 +34,7 @@ const (
var supportedProtocolVersions = []string{
"2025-03-26",
"2024-11-05",
}
type MailService interface {

View file

@ -287,6 +287,60 @@ func TestRunnerRunWritesToolManifestAndHandlesRequests(t *testing.T) {
}
}
func TestRunnerRunAcceptsClaudeCodeProtocolVersion(t *testing.T) {
store := &storeStub{
credential: secretstore.Credential{
Host: "imap.example.com",
Username: "alice",
Password: "secret",
},
}
input := bytes.NewBufferString("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"claude-code\",\"version\":\"1.0.0\"}}}\n")
output := &bytes.Buffer{}
runner := NewRunner(New(store, serviceStub{
listMailboxes: func(context.Context, secretstore.Credential) ([]imapclient.Mailbox, error) {
t.Fatal("ListMailboxes should not be called")
return nil, nil
},
listMessages: func(context.Context, secretstore.Credential, string, int) ([]imapclient.MessageSummary, error) {
t.Fatal("ListMessages should not be called")
return nil, nil
},
getMessage: func(context.Context, secretstore.Credential, string, uint32) (imapclient.Message, error) {
t.Fatal("GetMessage should not be called")
return imapclient.Message{}, nil
},
}), input, output, &bytes.Buffer{})
if err := runner.Run(context.Background()); err != nil {
t.Fatalf("Run returned error: %v", err)
}
var response struct {
JSONRPC string `json:"jsonrpc"`
ID int `json:"id"`
Result struct {
ProtocolVersion string `json:"protocolVersion"`
} `json:"result"`
Error *struct {
Code int `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(output).Decode(&response); err != nil {
t.Fatalf("failed to decode initialize response: %v", err)
}
if response.Error != nil {
t.Fatalf("expected initialize to succeed, got error %#v", response.Error)
}
if response.JSONRPC != "2.0" || response.ID != 1 {
t.Fatalf("unexpected response envelope: %#v", response)
}
if response.Result.ProtocolVersion != "2024-11-05" {
t.Fatalf("expected negotiated protocol version 2024-11-05, got %#v", response.Result)
}
}
func TestRunnerRunReturnsFriendlyMissingCredentialError(t *testing.T) {
store := &storeStub{
loadErr: kwallet.ErrCredentialNotFound,