fix: support Claude Code MCP protocol version
This commit is contained in:
parent
5dbc073e5c
commit
1472d7a107
2 changed files with 55 additions and 0 deletions
|
|
@ -34,6 +34,7 @@ const (
|
|||
|
||||
var supportedProtocolVersions = []string{
|
||||
"2025-03-26",
|
||||
"2024-11-05",
|
||||
}
|
||||
|
||||
type MailService interface {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue