feat: add package indexing to MCP index_revision tool
The options server's index_revision now also indexes packages when running under nixpkgs-search, matching the CLI behavior. The packages server gets its own index_revision tool for standalone package indexing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
|
||||
"git.t-juice.club/torjus/labmcp/internal/database"
|
||||
"git.t-juice.club/torjus/labmcp/internal/nixos"
|
||||
"git.t-juice.club/torjus/labmcp/internal/packages"
|
||||
)
|
||||
|
||||
func TestServerInitialize(t *testing.T) {
|
||||
@@ -145,6 +146,110 @@ func TestServerNotification(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestPackagesServerToolsList(t *testing.T) {
|
||||
store := setupTestStore(t)
|
||||
server := NewServer(store, nil, DefaultNixpkgsPackagesConfig())
|
||||
|
||||
pkgIndexer := packages.NewIndexer(store)
|
||||
server.RegisterPackageHandlers(pkgIndexer)
|
||||
|
||||
input := `{"jsonrpc":"2.0","id":1,"method":"tools/list"}`
|
||||
|
||||
resp := runRequest(t, server, input)
|
||||
|
||||
if resp.Error != nil {
|
||||
t.Fatalf("Unexpected error: %v", resp.Error)
|
||||
}
|
||||
|
||||
result, ok := resp.Result.(map[string]interface{})
|
||||
if !ok {
|
||||
t.Fatalf("Expected map result, got %T", resp.Result)
|
||||
}
|
||||
|
||||
tools, ok := result["tools"].([]interface{})
|
||||
if !ok {
|
||||
t.Fatalf("Expected tools array, got %T", result["tools"])
|
||||
}
|
||||
|
||||
// Should have 6 tools (search_packages, get_package, get_file, index_revision, list_revisions, delete_revision)
|
||||
if len(tools) != 6 {
|
||||
t.Errorf("Expected 6 tools, got %d", len(tools))
|
||||
}
|
||||
|
||||
expectedTools := map[string]bool{
|
||||
"search_packages": false,
|
||||
"get_package": false,
|
||||
"get_file": false,
|
||||
"index_revision": false,
|
||||
"list_revisions": false,
|
||||
"delete_revision": false,
|
||||
}
|
||||
|
||||
for _, tool := range tools {
|
||||
toolMap := tool.(map[string]interface{})
|
||||
name := toolMap["name"].(string)
|
||||
if _, ok := expectedTools[name]; ok {
|
||||
expectedTools[name] = true
|
||||
}
|
||||
}
|
||||
|
||||
for name, found := range expectedTools {
|
||||
if !found {
|
||||
t.Errorf("Tool %q not found in tools list", name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestOptionsServerWithPackagesToolsList(t *testing.T) {
|
||||
store := setupTestStore(t)
|
||||
server := NewServer(store, nil, DefaultNixOSConfig())
|
||||
|
||||
indexer := nixos.NewIndexer(store)
|
||||
pkgIndexer := packages.NewIndexer(store)
|
||||
server.RegisterHandlersWithPackages(indexer, pkgIndexer)
|
||||
|
||||
input := `{"jsonrpc":"2.0","id":1,"method":"tools/list"}`
|
||||
|
||||
resp := runRequest(t, server, input)
|
||||
|
||||
if resp.Error != nil {
|
||||
t.Fatalf("Unexpected error: %v", resp.Error)
|
||||
}
|
||||
|
||||
result, ok := resp.Result.(map[string]interface{})
|
||||
if !ok {
|
||||
t.Fatalf("Expected map result, got %T", resp.Result)
|
||||
}
|
||||
|
||||
tools, ok := result["tools"].([]interface{})
|
||||
if !ok {
|
||||
t.Fatalf("Expected tools array, got %T", result["tools"])
|
||||
}
|
||||
|
||||
// Should still have 6 tools (same as options-only)
|
||||
if len(tools) != 6 {
|
||||
t.Errorf("Expected 6 tools, got %d", len(tools))
|
||||
}
|
||||
|
||||
// Verify index_revision is present
|
||||
found := false
|
||||
for _, tool := range tools {
|
||||
toolMap := tool.(map[string]interface{})
|
||||
if toolMap["name"].(string) == "index_revision" {
|
||||
found = true
|
||||
// For nixpkgs source, description should mention packages
|
||||
desc := toolMap["description"].(string)
|
||||
if !strings.Contains(desc, "packages") {
|
||||
t.Errorf("index_revision description should mention packages, got: %s", desc)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.Error("index_revision tool not found in tools list")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetFilePathValidation(t *testing.T) {
|
||||
store := setupTestStore(t)
|
||||
server := setupTestServer(t, store)
|
||||
|
||||
Reference in New Issue
Block a user