Skip to content

Commit 6d95ed3

Browse files
authored
Add missing items property to schema of read_multiple_files tool (mark3labs#23)
* test: split test client creation and tool retrieval into separate functions * fix(read_multple_files): add missing `items` property
1 parent 3f895d6 commit 6d95ed3

File tree

4 files changed

+83
-34
lines changed

4 files changed

+83
-34
lines changed

filesystemserver/inprocess_test.go

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package filesystemserver_test
22

33
import (
4-
"context"
54
"testing"
65

76
"github.com/mark3labs/mcp-filesystem-server/filesystemserver"
8-
"github.com/mark3labs/mcp-go/client"
9-
"github.com/mark3labs/mcp-go/mcp"
107
"github.com/stretchr/testify/assert"
118
"github.com/stretchr/testify/require"
129
)
@@ -15,37 +12,9 @@ func TestInProcess(t *testing.T) {
1512
fss, err := filesystemserver.NewFilesystemServer([]string{"."})
1613
require.NoError(t, err)
1714

18-
mcpClient, err := client.NewInProcessClient(fss)
19-
require.NoError(t, err)
20-
21-
err = mcpClient.Start(context.Background())
22-
require.NoError(t, err)
23-
24-
// Initialize the client
25-
initRequest := mcp.InitializeRequest{}
26-
initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
27-
initRequest.Params.ClientInfo = mcp.Implementation{
28-
Name: "test-client",
29-
Version: "1.0.0",
30-
}
31-
result, err := mcpClient.Initialize(context.Background(), initRequest)
32-
require.NoError(t, err)
33-
assert.Equal(t, "secure-filesystem-server", result.ServerInfo.Name)
34-
assert.Equal(t, filesystemserver.Version, result.ServerInfo.Version)
15+
mcpClient := startTestClient(t, fss)
3516

3617
// just check for a specific tool
37-
toolListResult, err := mcpClient.ListTools(context.Background(), mcp.ListToolsRequest{})
38-
require.NoError(t, err)
39-
assert.NotEmpty(t, toolListResult.Tools)
40-
found := false
41-
for _, tool := range toolListResult.Tools {
42-
if tool.Name == "read_file" {
43-
found = true
44-
break
45-
}
46-
}
47-
assert.True(t, found, "read_file tool not found in the list of tools")
48-
49-
err = mcpClient.Close()
50-
require.NoError(t, err)
18+
tool := getTool(t, mcpClient, "read_file")
19+
assert.NotNil(t, tool, "read_file tool not found in the list of tools")
5120
}

filesystemserver/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ func NewFilesystemServer(allowedDirs []string) (*server.MCPServer, error) {
127127
mcp.WithArray("paths",
128128
mcp.Description("List of file paths to read"),
129129
mcp.Required(),
130+
mcp.Items(map[string]any{"type": "string"}),
130131
),
131132
), h.handleReadMultipleFiles)
132133

filesystemserver/server_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package filesystemserver_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/mark3labs/mcp-filesystem-server/filesystemserver"
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
// regression test for invalid schema => missing items in array definition
12+
func TestReadMultipleFilesSchema(t *testing.T) {
13+
fsserver, err := filesystemserver.NewFilesystemServer([]string{t.TempDir()})
14+
require.NoError(t, err)
15+
16+
mcpClient := startTestClient(t, fsserver)
17+
18+
tool := getTool(t, mcpClient, "read_multiple_files")
19+
require.NotNil(t, tool)
20+
21+
// make sure that the tool has the correct schema
22+
paths, ok := tool.InputSchema.Properties["paths"]
23+
assert.True(t, ok)
24+
pathsMap, ok := paths.(map[string]any)
25+
assert.True(t, ok)
26+
_, ok = pathsMap["items"]
27+
assert.True(t, ok)
28+
}

filesystemserver/utils_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package filesystemserver_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/mark3labs/mcp-filesystem-server/filesystemserver"
8+
"github.com/mark3labs/mcp-go/client"
9+
"github.com/mark3labs/mcp-go/mcp"
10+
"github.com/mark3labs/mcp-go/server"
11+
12+
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/require"
14+
)
15+
16+
func startTestClient(t *testing.T, fss *server.MCPServer) client.MCPClient {
17+
t.Helper()
18+
19+
mcpClient, err := client.NewInProcessClient(fss)
20+
require.NoError(t, err)
21+
t.Cleanup(func() { mcpClient.Close() })
22+
23+
err = mcpClient.Start(context.Background())
24+
require.NoError(t, err)
25+
26+
// Initialize the client
27+
initRequest := mcp.InitializeRequest{}
28+
initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
29+
initRequest.Params.ClientInfo = mcp.Implementation{
30+
Name: "test-client",
31+
Version: "1.0.0",
32+
}
33+
result, err := mcpClient.Initialize(context.Background(), initRequest)
34+
require.NoError(t, err)
35+
assert.Equal(t, "secure-filesystem-server", result.ServerInfo.Name)
36+
assert.Equal(t, filesystemserver.Version, result.ServerInfo.Version)
37+
38+
return mcpClient
39+
}
40+
41+
func getTool(t *testing.T, mcpClient client.MCPClient, toolName string) *mcp.Tool {
42+
result, err := mcpClient.ListTools(context.Background(), mcp.ListToolsRequest{})
43+
require.NoError(t, err)
44+
for _, tool := range result.Tools {
45+
if tool.Name == toolName {
46+
return &tool
47+
}
48+
}
49+
require.Fail(t, "Tool not found", toolName)
50+
return nil
51+
}

0 commit comments

Comments
 (0)