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{
|
var supportedProtocolVersions = []string{
|
||||||
"2025-03-26",
|
"2025-03-26",
|
||||||
|
"2024-11-05",
|
||||||
}
|
}
|
||||||
|
|
||||||
type MailService interface {
|
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) {
|
func TestRunnerRunReturnsFriendlyMissingCredentialError(t *testing.T) {
|
||||||
store := &storeStub{
|
store := &storeStub{
|
||||||
loadErr: kwallet.ErrCredentialNotFound,
|
loadErr: kwallet.ErrCredentialNotFound,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue