diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c6a2ed..4a7a45c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ Know that: **CRITICAL:** All code must comply with the MCP specification. Key requirements: -- ✅ **Use structured logging** in server code (`internal/server`, `internal/tools`, `internal/sdk`, `internal/auth`) +- ✅ **Use structured logging** in server code (`internal/server`, `internal/capabilities`, `internal/sdk`, `internal/auth`) - ❌ **Never use `fmt.Printf`** in server code (breaks MCP protocol communication) - ✅ **Use `fmt.Printf`** in CLI commands (`cmd/` directory) for user output diff --git a/cmd/run/run.go b/cmd/run/run.go index 759e1f8..4629957 100644 --- a/cmd/run/run.go +++ b/cmd/run/run.go @@ -11,15 +11,15 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/server" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" "github.com/spf13/cobra" ) @@ -120,7 +120,7 @@ The server will communicate over stdin/stdout.`, // warnAboutPotentialWriteToolsFiltered checks if any of the included tools are write tools // and warns the user that they will be filtered out due to read-only mode being enabled func warnAboutPotentialWriteToolsFiltered(ctx context.Context, includedTools []string) { - allTools := tools.ListTools() + allTools := capabilities.ListTools() // Create a map of tool names to their definitions for quick lookup toolMap := make(map[string]*types.ToolDefinition) diff --git a/cmd/run/run_test.go b/cmd/run/run_test.go index f5f5ba7..fe0cb41 100644 --- a/cmd/run/run_test.go +++ b/cmd/run/run_test.go @@ -11,13 +11,13 @@ import ( "time" "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/tools/applications/client_interface.go b/internal/capabilities/applications/client_interface.go similarity index 100% rename from internal/tools/applications/client_interface.go rename to internal/capabilities/applications/client_interface.go diff --git a/internal/tools/applications/client_wrapper.go b/internal/capabilities/applications/client_wrapper.go similarity index 98% rename from internal/tools/applications/client_wrapper.go rename to internal/capabilities/applications/client_wrapper.go index ac70d41..5bd5150 100644 --- a/internal/tools/applications/client_wrapper.go +++ b/internal/capabilities/applications/client_wrapper.go @@ -12,10 +12,10 @@ import ( "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/patrickcping/pingone-go-sdk-v2/pingone" "github.com/pingidentity/pingone-mcp-server/internal/audit" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/collections" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/collections" ) var _ ApplicationsClient = &PingOneClientApplicationsWrapper{} diff --git a/internal/tools/applications/collection.go b/internal/capabilities/applications/collection.go similarity index 80% rename from internal/tools/applications/collection.go rename to internal/capabilities/applications/collection.go index c3f483a..d5cfc70 100644 --- a/internal/tools/applications/collection.go +++ b/internal/capabilities/applications/collection.go @@ -10,13 +10,13 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/collections" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/collections" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) const CollectionName = "applications" @@ -74,3 +74,13 @@ func (c *ApplicationsCollection) ListTools() []types.ToolDefinition { UpdateApplicationDef, } } + +func (c *ApplicationsCollection) RegisterDynamicResources(_ context.Context, _ *mcp.Server, _ legacy.ClientFactory, _ client.AuthClientFactory, _ tokenstore.TokenStore, _ auth.GrantType) error { + // No dynamic resources to register + return nil +} + +func (c *ApplicationsCollection) ListDynamicResources() []types.DynamicResourceDefinition { + // No dynamic resources defined + return []types.DynamicResourceDefinition{} +} diff --git a/internal/tools/applications/collection_test.go b/internal/capabilities/applications/collection_test.go similarity index 96% rename from internal/tools/applications/collection_test.go rename to internal/capabilities/applications/collection_test.go index 856d928..d8d2984 100644 --- a/internal/tools/applications/collection_test.go +++ b/internal/capabilities/applications/collection_test.go @@ -8,10 +8,10 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/tools/applications/mock_client_test.go b/internal/capabilities/applications/mock_client_test.go similarity index 97% rename from internal/tools/applications/mock_client_test.go rename to internal/capabilities/applications/mock_client_test.go index def96c8..62ef9a5 100644 --- a/internal/tools/applications/mock_client_test.go +++ b/internal/capabilities/applications/mock_client_test.go @@ -8,7 +8,7 @@ import ( "github.com/google/uuid" "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" "github.com/stretchr/testify/mock" ) diff --git a/internal/tools/applications/test_helpers_test.go b/internal/capabilities/applications/test_helpers_test.go similarity index 100% rename from internal/tools/applications/test_helpers_test.go rename to internal/capabilities/applications/test_helpers_test.go diff --git a/internal/tools/applications/tool_create_application.go b/internal/capabilities/applications/tool_create_application.go similarity index 93% rename from internal/tools/applications/tool_create_application.go rename to internal/capabilities/applications/tool_create_application.go index 8b8765b..e9d7ff7 100644 --- a/internal/tools/applications/tool_create_application.go +++ b/internal/capabilities/applications/tool_create_application.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var CreateApplicationDef = types.ToolDefinition{ diff --git a/internal/tools/applications/tool_create_application_test.go b/internal/capabilities/applications/tool_create_application_test.go similarity index 99% rename from internal/tools/applications/tool_create_application_test.go rename to internal/capabilities/applications/tool_create_application_test.go index cf0bdf0..12468da 100644 --- a/internal/tools/applications/tool_create_application_test.go +++ b/internal/capabilities/applications/tool_create_application_test.go @@ -13,11 +13,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/applications/tool_get_application.go b/internal/capabilities/applications/tool_get_application.go similarity index 95% rename from internal/tools/applications/tool_get_application.go rename to internal/capabilities/applications/tool_get_application.go index fd83207..073d193 100644 --- a/internal/tools/applications/tool_get_application.go +++ b/internal/capabilities/applications/tool_get_application.go @@ -11,11 +11,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var GetApplicationDef = types.ToolDefinition{ diff --git a/internal/tools/applications/tool_get_application_test.go b/internal/capabilities/applications/tool_get_application_test.go similarity index 98% rename from internal/tools/applications/tool_get_application_test.go rename to internal/capabilities/applications/tool_get_application_test.go index d63b6b4..963085b 100644 --- a/internal/tools/applications/tool_get_application_test.go +++ b/internal/capabilities/applications/tool_get_application_test.go @@ -13,11 +13,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/applications/tool_list_applications.go b/internal/capabilities/applications/tool_list_applications.go similarity index 96% rename from internal/tools/applications/tool_list_applications.go rename to internal/capabilities/applications/tool_list_applications.go index ec93d6d..e60a39a 100644 --- a/internal/tools/applications/tool_list_applications.go +++ b/internal/capabilities/applications/tool_list_applications.go @@ -12,11 +12,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var ListApplicationsDef = types.ToolDefinition{ diff --git a/internal/tools/applications/tool_list_applications_test.go b/internal/capabilities/applications/tool_list_applications_test.go similarity index 99% rename from internal/tools/applications/tool_list_applications_test.go rename to internal/capabilities/applications/tool_list_applications_test.go index 60c79eb..e058567 100644 --- a/internal/tools/applications/tool_list_applications_test.go +++ b/internal/capabilities/applications/tool_list_applications_test.go @@ -13,11 +13,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/applications/tool_update_application.go b/internal/capabilities/applications/tool_update_application.go similarity index 94% rename from internal/tools/applications/tool_update_application.go rename to internal/capabilities/applications/tool_update_application.go index 5d6e077..02eb8f8 100644 --- a/internal/tools/applications/tool_update_application.go +++ b/internal/capabilities/applications/tool_update_application.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var UpdateApplicationDef = types.ToolDefinition{ diff --git a/internal/tools/applications/tool_update_application_test.go b/internal/capabilities/applications/tool_update_application_test.go similarity index 98% rename from internal/tools/applications/tool_update_application_test.go rename to internal/capabilities/applications/tool_update_application_test.go index c902d8e..98e211e 100644 --- a/internal/tools/applications/tool_update_application_test.go +++ b/internal/capabilities/applications/tool_update_application_test.go @@ -14,11 +14,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/collections/client.go b/internal/capabilities/collections/client.go similarity index 100% rename from internal/tools/collections/client.go rename to internal/capabilities/collections/client.go diff --git a/internal/capabilities/collections/interface.go b/internal/capabilities/collections/interface.go new file mode 100644 index 0000000..fdb5615 --- /dev/null +++ b/internal/capabilities/collections/interface.go @@ -0,0 +1,66 @@ +// Copyright © 2025 Ping Identity Corporation + +package collections + +import ( + "context" + + "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" + "github.com/pingidentity/pingone-mcp-server/internal/sdk" + "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" + "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" +) + +type Collection interface { + // Name returns the unique identifier for this collection. + // The returned string is used to identify and organize related tools and resources. + Name() string + + // RegisterDynamicResources registers dynamic resources with the MCP server. + // Dynamic resources are generated at runtime based on the current PingOne environment state. + // The filter determines which resources are registered based on configuration settings. + // This function requires valid authentication credentials through the clientFactory parameter. + RegisterDynamicResources(ctx context.Context, server *mcp.Server, clientFactory sdk.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, grantType auth.GrantType) error + + // RegisterTools registers the tools with the server. + // The filter determines which tools are registered based on read-only mode, included/excluded tools. + // This function requires valid authentication credentials through the clientFactory parameter. + RegisterTools(ctx context.Context, server *mcp.Server, clientFactory sdk.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, toolFilter *filter.Filter, grantType auth.GrantType) error + + // ListDynamicResources returns a slice of all dynamic resource definitions available in this collection. + // Dynamic resources are generated at runtime based on the current PingOne environment state. + ListDynamicResources() []types.DynamicResourceDefinition + + // ListTools returns a slice of all tool definitions available in this collection. + // Tool definitions describe the capabilities and parameters of each tool in the collection. + ListTools() []types.ToolDefinition +} + +type LegacySdkCollection interface { + // Name returns the unique identifier for this collection. + // The returned string is used to identify and organize related tools and resources. + Name() string + + // RegisterDynamicResources registers dynamic resources with the MCP server using the legacy SDK. + // Dynamic resources are generated at runtime based on the current PingOne environment state. + // The filter determines which resources are registered based on configuration settings. + // This function requires valid authentication credentials through the clientFactory parameter. + RegisterDynamicResources(ctx context.Context, server *mcp.Server, clientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, grantType auth.GrantType) error + + // RegisterTools registers the tools with the server using the legacy SDK. + // The filter determines which tools are registered based on read-only mode, included/excluded tools. + // This function requires valid authentication credentials through the clientFactory parameter. + RegisterTools(ctx context.Context, server *mcp.Server, clientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, toolFilter *filter.Filter, grantType auth.GrantType) error + + // ListDynamicResources returns a slice of all dynamic resource definitions available in this collection. + // Dynamic resources are generated at runtime based on the current PingOne environment state. + ListDynamicResources() []types.DynamicResourceDefinition + + // ListTools returns a slice of all tool definitions available in this collection. + // Tool definitions describe the capabilities and parameters of each tool in the collection. + ListTools() []types.ToolDefinition +} diff --git a/internal/tools/environments/client_interface.go b/internal/capabilities/environments/client_interface.go similarity index 100% rename from internal/tools/environments/client_interface.go rename to internal/capabilities/environments/client_interface.go diff --git a/internal/tools/environments/client_wrapper.go b/internal/capabilities/environments/client_wrapper.go similarity index 98% rename from internal/tools/environments/client_wrapper.go rename to internal/capabilities/environments/client_wrapper.go index 77fd2f4..1c14060 100644 --- a/internal/tools/environments/client_wrapper.go +++ b/internal/capabilities/environments/client_wrapper.go @@ -11,10 +11,10 @@ import ( "github.com/google/uuid" "github.com/pingidentity/pingone-go-client/pingone" "github.com/pingidentity/pingone-mcp-server/internal/audit" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/collections" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/collections" ) var _ EnvironmentsClient = &PingOneClientEnvironmentsWrapper{} diff --git a/internal/tools/environments/collection.go b/internal/capabilities/environments/collection.go similarity index 83% rename from internal/tools/environments/collection.go rename to internal/capabilities/environments/collection.go index 02eda7a..ebcb292 100644 --- a/internal/tools/environments/collection.go +++ b/internal/capabilities/environments/collection.go @@ -10,13 +10,13 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/collections" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/collections" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) const CollectionName = "environments" @@ -86,3 +86,13 @@ func (c *EnvironmentsCollection) ListTools() []types.ToolDefinition { UpdateEnvironmentServicesDef, } } + +func (c *EnvironmentsCollection) RegisterDynamicResources(_ context.Context, _ *mcp.Server, _ sdk.ClientFactory, _ client.AuthClientFactory, _ tokenstore.TokenStore, _ auth.GrantType) error { + // No dynamic resources to register + return nil +} + +func (c *EnvironmentsCollection) ListDynamicResources() []types.DynamicResourceDefinition { + // No dynamic resources defined + return []types.DynamicResourceDefinition{} +} diff --git a/internal/tools/environments/collection_test.go b/internal/capabilities/environments/collection_test.go similarity index 96% rename from internal/tools/environments/collection_test.go rename to internal/capabilities/environments/collection_test.go index 20407ff..237b9db 100644 --- a/internal/tools/environments/collection_test.go +++ b/internal/capabilities/environments/collection_test.go @@ -8,10 +8,10 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/tools/environments/test_helpers_test.go b/internal/capabilities/environments/test_helpers_test.go similarity index 98% rename from internal/tools/environments/test_helpers_test.go rename to internal/capabilities/environments/test_helpers_test.go index 9b4802e..e4ffdbf 100644 --- a/internal/tools/environments/test_helpers_test.go +++ b/internal/capabilities/environments/test_helpers_test.go @@ -8,9 +8,9 @@ import ( "github.com/google/uuid" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + envtestutils "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" "github.com/pingidentity/pingone-mcp-server/internal/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - envtestutils "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/environments/testutils/mock_client.go b/internal/capabilities/environments/testutils/mock_client.go similarity index 98% rename from internal/tools/environments/testutils/mock_client.go rename to internal/capabilities/environments/testutils/mock_client.go index 7a49c21..8d86a63 100644 --- a/internal/tools/environments/testutils/mock_client.go +++ b/internal/capabilities/environments/testutils/mock_client.go @@ -9,7 +9,7 @@ import ( "github.com/google/uuid" "github.com/pingidentity/pingone-go-client/pingone" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" "github.com/stretchr/testify/mock" ) diff --git a/internal/tools/environments/tool_create_environment.go b/internal/capabilities/environments/tool_create_environment.go similarity index 95% rename from internal/tools/environments/tool_create_environment.go rename to internal/capabilities/environments/tool_create_environment.go index e40bbb3..d8daa0a 100644 --- a/internal/tools/environments/tool_create_environment.go +++ b/internal/capabilities/environments/tool_create_environment.go @@ -9,11 +9,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var CreateEnvironmentDef = types.ToolDefinition{ diff --git a/internal/tools/environments/tool_create_environment_test.go b/internal/capabilities/environments/tool_create_environment_test.go similarity index 99% rename from internal/tools/environments/tool_create_environment_test.go rename to internal/capabilities/environments/tool_create_environment_test.go index 7613f6f..0eed1f4 100644 --- a/internal/tools/environments/tool_create_environment_test.go +++ b/internal/capabilities/environments/tool_create_environment_test.go @@ -13,12 +13,12 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + envtestutils "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - envtestutils "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/environments/tool_get_environment.go b/internal/capabilities/environments/tool_get_environment.go similarity index 93% rename from internal/tools/environments/tool_get_environment.go rename to internal/capabilities/environments/tool_get_environment.go index 1604e51..02f3ccf 100644 --- a/internal/tools/environments/tool_get_environment.go +++ b/internal/capabilities/environments/tool_get_environment.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var GetEnvironmentDef = types.ToolDefinition{ diff --git a/internal/tools/environments/tool_get_environment_services.go b/internal/capabilities/environments/tool_get_environment_services.go similarity index 94% rename from internal/tools/environments/tool_get_environment_services.go rename to internal/capabilities/environments/tool_get_environment_services.go index 4bf2a66..d2b08b9 100644 --- a/internal/tools/environments/tool_get_environment_services.go +++ b/internal/capabilities/environments/tool_get_environment_services.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var GetEnvironmentServicesDef = types.ToolDefinition{ diff --git a/internal/tools/environments/tool_get_environment_services_test.go b/internal/capabilities/environments/tool_get_environment_services_test.go similarity index 98% rename from internal/tools/environments/tool_get_environment_services_test.go rename to internal/capabilities/environments/tool_get_environment_services_test.go index 65c2c05..63b8ef1 100644 --- a/internal/tools/environments/tool_get_environment_services_test.go +++ b/internal/capabilities/environments/tool_get_environment_services_test.go @@ -12,11 +12,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + envtestutils "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - envtestutils "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/tools/environments/tool_get_environment_test.go b/internal/capabilities/environments/tool_get_environment_test.go similarity index 98% rename from internal/tools/environments/tool_get_environment_test.go rename to internal/capabilities/environments/tool_get_environment_test.go index 90b01eb..e45eac9 100644 --- a/internal/tools/environments/tool_get_environment_test.go +++ b/internal/capabilities/environments/tool_get_environment_test.go @@ -13,12 +13,12 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + envtestutils "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - envtestutils "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/environments/tool_list_environments.go b/internal/capabilities/environments/tool_list_environments.go similarity index 95% rename from internal/tools/environments/tool_list_environments.go rename to internal/capabilities/environments/tool_list_environments.go index af7c175..852d6f4 100644 --- a/internal/tools/environments/tool_list_environments.go +++ b/internal/capabilities/environments/tool_list_environments.go @@ -11,11 +11,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var ListEnvironmentsDef = types.ToolDefinition{ diff --git a/internal/tools/environments/tool_list_environments_test.go b/internal/capabilities/environments/tool_list_environments_test.go similarity index 98% rename from internal/tools/environments/tool_list_environments_test.go rename to internal/capabilities/environments/tool_list_environments_test.go index 66bc12a..3a27b7c 100644 --- a/internal/tools/environments/tool_list_environments_test.go +++ b/internal/capabilities/environments/tool_list_environments_test.go @@ -25,12 +25,12 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + envtestutils "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - envtestutils "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/environments/tool_update_environment.go b/internal/capabilities/environments/tool_update_environment.go similarity index 96% rename from internal/tools/environments/tool_update_environment.go rename to internal/capabilities/environments/tool_update_environment.go index 2f172dc..f81e2fd 100644 --- a/internal/tools/environments/tool_update_environment.go +++ b/internal/capabilities/environments/tool_update_environment.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var UpdateEnvironmentDef = types.ToolDefinition{ diff --git a/internal/tools/environments/tool_update_environment_services.go b/internal/capabilities/environments/tool_update_environment_services.go similarity index 97% rename from internal/tools/environments/tool_update_environment_services.go rename to internal/capabilities/environments/tool_update_environment_services.go index 6046e65..df7887d 100644 --- a/internal/tools/environments/tool_update_environment_services.go +++ b/internal/capabilities/environments/tool_update_environment_services.go @@ -11,11 +11,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var UpdateEnvironmentServicesDef = types.ToolDefinition{ diff --git a/internal/tools/environments/tool_update_environment_services_test.go b/internal/capabilities/environments/tool_update_environment_services_test.go similarity index 99% rename from internal/tools/environments/tool_update_environment_services_test.go rename to internal/capabilities/environments/tool_update_environment_services_test.go index b44c696..1edf38e 100644 --- a/internal/tools/environments/tool_update_environment_services_test.go +++ b/internal/capabilities/environments/tool_update_environment_services_test.go @@ -11,11 +11,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + envtestutils "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - envtestutils "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/tools/environments/tool_update_environment_test.go b/internal/capabilities/environments/tool_update_environment_test.go similarity index 99% rename from internal/tools/environments/tool_update_environment_test.go rename to internal/capabilities/environments/tool_update_environment_test.go index c898d57..e2a35f8 100644 --- a/internal/tools/environments/tool_update_environment_test.go +++ b/internal/capabilities/environments/tool_update_environment_test.go @@ -13,12 +13,12 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-go-client/pingone" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + envtestutils "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - envtestutils "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/filter/filter.go b/internal/capabilities/filter/filter.go similarity index 96% rename from internal/tools/filter/filter.go rename to internal/capabilities/filter/filter.go index 8ee4fce..2912a93 100644 --- a/internal/tools/filter/filter.go +++ b/internal/capabilities/filter/filter.go @@ -3,7 +3,7 @@ package filter import ( - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" ) // Filter holds configuration for filtering which tools and tool collections to make available in the server diff --git a/internal/tools/filter/filter_test.go b/internal/capabilities/filter/filter_test.go similarity index 97% rename from internal/tools/filter/filter_test.go rename to internal/capabilities/filter/filter_test.go index d5e0696..1e9183f 100644 --- a/internal/tools/filter/filter_test.go +++ b/internal/capabilities/filter/filter_test.go @@ -6,8 +6,8 @@ import ( "testing" "github.com/modelcontextprotocol/go-sdk/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" ) func TestFilter(t *testing.T) { diff --git a/internal/tools/initialize/auth_context.go b/internal/capabilities/initialize/auth_context.go similarity index 100% rename from internal/tools/initialize/auth_context.go rename to internal/capabilities/initialize/auth_context.go diff --git a/internal/tools/initialize/initialize.go b/internal/capabilities/initialize/initialize.go similarity index 100% rename from internal/tools/initialize/initialize.go rename to internal/capabilities/initialize/initialize.go diff --git a/internal/tools/populations/client_interface.go b/internal/capabilities/populations/client_interface.go similarity index 100% rename from internal/tools/populations/client_interface.go rename to internal/capabilities/populations/client_interface.go diff --git a/internal/tools/populations/client_wrapper.go b/internal/capabilities/populations/client_wrapper.go similarity index 98% rename from internal/tools/populations/client_wrapper.go rename to internal/capabilities/populations/client_wrapper.go index 2fc05e9..752815d 100644 --- a/internal/tools/populations/client_wrapper.go +++ b/internal/capabilities/populations/client_wrapper.go @@ -12,10 +12,10 @@ import ( "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/patrickcping/pingone-go-sdk-v2/pingone" "github.com/pingidentity/pingone-mcp-server/internal/audit" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/collections" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/collections" ) var _ PopulationsClient = &PingOneClientPopulationsWrapper{} diff --git a/internal/tools/populations/collection.go b/internal/capabilities/populations/collection.go similarity index 80% rename from internal/tools/populations/collection.go rename to internal/capabilities/populations/collection.go index 8039ed0..23a64ce 100644 --- a/internal/tools/populations/collection.go +++ b/internal/capabilities/populations/collection.go @@ -10,13 +10,13 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/collections" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/collections" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) const CollectionName = "populations" @@ -74,3 +74,13 @@ func (c *PopulationsCollection) ListTools() []types.ToolDefinition { UpdatePopulationDef, } } + +func (c *PopulationsCollection) RegisterDynamicResources(_ context.Context, _ *mcp.Server, _ legacy.ClientFactory, _ client.AuthClientFactory, _ tokenstore.TokenStore, _ auth.GrantType) error { + // No dynamic resources to register + return nil +} + +func (c *PopulationsCollection) ListDynamicResources() []types.DynamicResourceDefinition { + // No dynamic resources defined + return []types.DynamicResourceDefinition{} +} diff --git a/internal/tools/populations/collection_test.go b/internal/capabilities/populations/collection_test.go similarity index 96% rename from internal/tools/populations/collection_test.go rename to internal/capabilities/populations/collection_test.go index ed8e336..2b338a6 100644 --- a/internal/tools/populations/collection_test.go +++ b/internal/capabilities/populations/collection_test.go @@ -8,10 +8,10 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/tools/populations/mock_client_test.go b/internal/capabilities/populations/mock_client_test.go similarity index 97% rename from internal/tools/populations/mock_client_test.go rename to internal/capabilities/populations/mock_client_test.go index b966b49..7c00c0b 100644 --- a/internal/tools/populations/mock_client_test.go +++ b/internal/capabilities/populations/mock_client_test.go @@ -8,7 +8,7 @@ import ( "github.com/google/uuid" "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/stretchr/testify/mock" ) diff --git a/internal/tools/populations/test_helpers_test.go b/internal/capabilities/populations/test_helpers_test.go similarity index 98% rename from internal/tools/populations/test_helpers_test.go rename to internal/capabilities/populations/test_helpers_test.go index 389f44c..fe8eb21 100644 --- a/internal/tools/populations/test_helpers_test.go +++ b/internal/capabilities/populations/test_helpers_test.go @@ -7,8 +7,8 @@ import ( "github.com/google/uuid" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/pingidentity/pingone-mcp-server/internal/testutils" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/tools/populations/tool_create_population.go b/internal/capabilities/populations/tool_create_population.go similarity index 95% rename from internal/tools/populations/tool_create_population.go rename to internal/capabilities/populations/tool_create_population.go index 4897298..eee43a3 100644 --- a/internal/tools/populations/tool_create_population.go +++ b/internal/capabilities/populations/tool_create_population.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var CreatePopulationDef = types.ToolDefinition{ diff --git a/internal/tools/populations/tool_create_population_test.go b/internal/capabilities/populations/tool_create_population_test.go similarity index 99% rename from internal/tools/populations/tool_create_population_test.go rename to internal/capabilities/populations/tool_create_population_test.go index 6e0f779..19caa41 100644 --- a/internal/tools/populations/tool_create_population_test.go +++ b/internal/capabilities/populations/tool_create_population_test.go @@ -15,11 +15,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/populations/tool_get_population.go b/internal/capabilities/populations/tool_get_population.go similarity index 94% rename from internal/tools/populations/tool_get_population.go rename to internal/capabilities/populations/tool_get_population.go index e3edbca..4ac3d93 100644 --- a/internal/tools/populations/tool_get_population.go +++ b/internal/capabilities/populations/tool_get_population.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var GetPopulationDef = types.ToolDefinition{ diff --git a/internal/tools/populations/tool_get_population_test.go b/internal/capabilities/populations/tool_get_population_test.go similarity index 98% rename from internal/tools/populations/tool_get_population_test.go rename to internal/capabilities/populations/tool_get_population_test.go index e7f58a4..aff5252 100644 --- a/internal/tools/populations/tool_get_population_test.go +++ b/internal/capabilities/populations/tool_get_population_test.go @@ -14,11 +14,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/populations/tool_list_populations.go b/internal/capabilities/populations/tool_list_populations.go similarity index 95% rename from internal/tools/populations/tool_list_populations.go rename to internal/capabilities/populations/tool_list_populations.go index 0920e23..d4b2d98 100644 --- a/internal/tools/populations/tool_list_populations.go +++ b/internal/capabilities/populations/tool_list_populations.go @@ -9,11 +9,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var ListPopulationsDef = types.ToolDefinition{ diff --git a/internal/tools/populations/tool_list_populations_test.go b/internal/capabilities/populations/tool_list_populations_test.go similarity index 98% rename from internal/tools/populations/tool_list_populations_test.go rename to internal/capabilities/populations/tool_list_populations_test.go index be778c8..580ab1c 100644 --- a/internal/tools/populations/tool_list_populations_test.go +++ b/internal/capabilities/populations/tool_list_populations_test.go @@ -13,11 +13,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/populations/tool_update_population.go b/internal/capabilities/populations/tool_update_population.go similarity index 95% rename from internal/tools/populations/tool_update_population.go rename to internal/capabilities/populations/tool_update_population.go index 477776f..6efc540 100644 --- a/internal/tools/populations/tool_update_population.go +++ b/internal/capabilities/populations/tool_update_population.go @@ -10,11 +10,11 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) var UpdatePopulationDef = types.ToolDefinition{ diff --git a/internal/tools/populations/tool_update_population_test.go b/internal/capabilities/populations/tool_update_population_test.go similarity index 98% rename from internal/tools/populations/tool_update_population_test.go rename to internal/capabilities/populations/tool_update_population_test.go index 32bf742..193361f 100644 --- a/internal/tools/populations/tool_update_population_test.go +++ b/internal/capabilities/populations/tool_update_population_test.go @@ -14,11 +14,11 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/capabilities/prompts.go b/internal/capabilities/prompts.go new file mode 100644 index 0000000..5cb1afd --- /dev/null +++ b/internal/capabilities/prompts.go @@ -0,0 +1,14 @@ +// Copyright © 2025 Ping Identity Corporation + +package capabilities + +import ( + "context" + + "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/prompts" +) + +func RegisterPrompts(ctx context.Context, server *mcp.Server) error { + return prompts.RegisterPrompts(ctx, server) +} diff --git a/internal/capabilities/prompts/prompts.go b/internal/capabilities/prompts/prompts.go new file mode 100644 index 0000000..e25c581 --- /dev/null +++ b/internal/capabilities/prompts/prompts.go @@ -0,0 +1,18 @@ +package prompts + +import ( + "context" + + "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" +) + +func RegisterPrompts(_ context.Context, _ *mcp.Server) error { + // No prompts to register + return nil +} + +func ListPrompts() []types.PromptDefinition { + // No prompts defined + return []types.PromptDefinition{} +} diff --git a/internal/capabilities/register.go b/internal/capabilities/register.go new file mode 100644 index 0000000..b1f7374 --- /dev/null +++ b/internal/capabilities/register.go @@ -0,0 +1,23 @@ +package capabilities + +import ( + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/collections" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" +) + +// getDefaultCollections creates SDK collections +func getDefaultCollections() []collections.Collection { + return []collections.Collection{ + &environments.EnvironmentsCollection{}, + } +} + +// getLegacySdkCollections creates legacy SDK collections +func getLegacySdkCollections() []collections.LegacySdkCollection { + return []collections.LegacySdkCollection{ + &populations.PopulationsCollection{}, + &applications.ApplicationsCollection{}, + } +} diff --git a/internal/capabilities/resources.go b/internal/capabilities/resources.go new file mode 100644 index 0000000..04a7679 --- /dev/null +++ b/internal/capabilities/resources.go @@ -0,0 +1,80 @@ +// Copyright © 2025 Ping Identity Corporation + +package capabilities + +import ( + "context" + "log/slog" + + "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/staticresources" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" + "github.com/pingidentity/pingone-mcp-server/internal/logger" + "github.com/pingidentity/pingone-mcp-server/internal/sdk" + "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" + "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" +) + +func RegisterResources(ctx context.Context, server *mcp.Server, clientFactory sdk.ClientFactory, legacySdkClientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, grantType auth.GrantType) error { + err := RegisterStaticResources(ctx, server) + if err != nil { + return err + } + + err = RegisterDynamicResources(ctx, server, clientFactory, legacySdkClientFactory, authClientFactory, tokenStore, grantType) + if err != nil { + return err + } + + return nil +} + +func RegisterStaticResources(ctx context.Context, server *mcp.Server) error { + return staticresources.RegisterStaticResources(ctx, server) +} + +func ListStaticResources() []types.StaticResourceDefinition { + return staticresources.ListStaticResources() +} + +func RegisterDynamicResources(ctx context.Context, server *mcp.Server, clientFactory sdk.ClientFactory, legacySdkClientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, grantType auth.GrantType) error { + // Get SDK collections + defaultCollections := getDefaultCollections() + + for _, collection := range defaultCollections { + logger.FromContext(ctx).Debug("Registering MCP dynamic resources", slog.String("collection", collection.Name())) + + if err := collection.RegisterDynamicResources(ctx, server, clientFactory, authClientFactory, tokenStore, grantType); err != nil { + return err + } + } + + // Get legacy SDK collections + legacyCollections := getLegacySdkCollections() + + for _, collection := range legacyCollections { + logger.FromContext(ctx).Debug("Registering MCP dynamic resources", slog.String("collection", collection.Name())) + + if err := collection.RegisterDynamicResources(ctx, server, legacySdkClientFactory, authClientFactory, tokenStore, grantType); err != nil { + return err + } + } + return nil +} + +func ListDynamicResources() []types.DynamicResourceDefinition { + var tools []types.DynamicResourceDefinition + defaultCollections := getDefaultCollections() + for _, collection := range defaultCollections { + tools = append(tools, collection.ListDynamicResources()...) + } + + // List tools from legacy collections + legacyCollections := getLegacySdkCollections() + for _, collection := range legacyCollections { + tools = append(tools, collection.ListDynamicResources()...) + } + return tools +} diff --git a/internal/capabilities/resources_test.go b/internal/capabilities/resources_test.go new file mode 100644 index 0000000..51605c3 --- /dev/null +++ b/internal/capabilities/resources_test.go @@ -0,0 +1,51 @@ +// Copyright © 2025 Ping Identity Corporation + +package capabilities_test + +import ( + "testing" + + "github.com/pingidentity/pingone-mcp-server/internal/capabilities" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" +) + +func TestAllDynamicResourcesRegistered(t *testing.T) { + // Get tools from ListDynamicResources that are actually registered with the server + allDynamicResources := capabilities.ListDynamicResources() + + // Get tools from individual collections + var expectedDynamicResources []types.DynamicResourceDefinition + expectedDynamicResources = append(expectedDynamicResources, (&environments.EnvironmentsCollection{}).ListDynamicResources()...) + expectedDynamicResources = append(expectedDynamicResources, (&populations.PopulationsCollection{}).ListDynamicResources()...) + expectedDynamicResources = append(expectedDynamicResources, (&applications.ApplicationsCollection{}).ListDynamicResources()...) + + // Verify lists match + if len(allDynamicResources) != len(expectedDynamicResources) { + t.Errorf("ListDynamicResources() returned %d dynamic resources, but individual collections returned %d dynamic resources", len(allDynamicResources), len(expectedDynamicResources)) + } + + expectedToolNames := make(map[string]bool) + for _, tool := range expectedDynamicResources { + expectedToolNames[tool.McpResource.Name] = true + } + + for _, tool := range allDynamicResources { + if !expectedToolNames[tool.McpResource.Name] { + t.Errorf("ListDynamicResources() returned unexpected dynamic resource: %s", tool.McpResource.Name) + } + } + + actualToolNames := make(map[string]bool) + for _, tool := range allDynamicResources { + actualToolNames[tool.McpResource.Name] = true + } + + for _, tool := range expectedDynamicResources { + if !actualToolNames[tool.McpResource.Name] { + t.Errorf("ListDynamicResources() missing expected dynamic resource, collection may not be registered: %s", tool.McpResource.Name) + } + } +} diff --git a/internal/tools/schema/schema_helpers.go b/internal/capabilities/schema/schema_helpers.go similarity index 100% rename from internal/tools/schema/schema_helpers.go rename to internal/capabilities/schema/schema_helpers.go diff --git a/internal/capabilities/staticresources/resources.go b/internal/capabilities/staticresources/resources.go new file mode 100644 index 0000000..00b1e42 --- /dev/null +++ b/internal/capabilities/staticresources/resources.go @@ -0,0 +1,18 @@ +package staticresources + +import ( + "context" + + "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" +) + +func RegisterStaticResources(_ context.Context, _ *mcp.Server) error { + // No static resources to register + return nil +} + +func ListStaticResources() []types.StaticResourceDefinition { + // No static resources defined + return []types.StaticResourceDefinition{} +} diff --git a/internal/tools/register.go b/internal/capabilities/tools.go similarity index 64% rename from internal/tools/register.go rename to internal/capabilities/tools.go index 1da0819..9055d22 100644 --- a/internal/tools/register.go +++ b/internal/capabilities/tools.go @@ -1,6 +1,6 @@ // Copyright © 2025 Ping Identity Corporation -package tools +package capabilities import ( "context" @@ -9,34 +9,15 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" - "github.com/pingidentity/pingone-mcp-server/internal/tools/collections" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) -// getDefaultCollections creates SDK collections -func getDefaultCollections() []collections.Collection { - return []collections.Collection{ - &environments.EnvironmentsCollection{}, - } -} - -// getLegacySdkCollections creates legacy SDK collections -func getLegacySdkCollections() []collections.LegacySdkCollection { - return []collections.LegacySdkCollection{ - &populations.PopulationsCollection{}, - &applications.ApplicationsCollection{}, - } -} - -func RegisterCollections(ctx context.Context, server *mcp.Server, clientFactory sdk.ClientFactory, legacySdkClientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, toolFilter *filter.Filter, grantType auth.GrantType) error { +func RegisterToolCollections(ctx context.Context, server *mcp.Server, clientFactory sdk.ClientFactory, legacySdkClientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, toolFilter *filter.Filter, grantType auth.GrantType) error { // Get SDK collections defaultCollections := getDefaultCollections() diff --git a/internal/tools/register_test.go b/internal/capabilities/tools_test.go similarity index 78% rename from internal/tools/register_test.go rename to internal/capabilities/tools_test.go index 2e348a5..fa16930 100644 --- a/internal/tools/register_test.go +++ b/internal/capabilities/tools_test.go @@ -1,22 +1,22 @@ // Copyright © 2025 Ping Identity Corporation -package tools_test +package capabilities_test import ( "testing" - "github.com/pingidentity/pingone-mcp-server/internal/tools" - "github.com/pingidentity/pingone-mcp-server/internal/tools/applications" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/populations" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/applications" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/populations" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestAllToolsRegistered(t *testing.T) { // Get tools from ListTools that are actually registered with the server - allTools := tools.ListTools() + allTools := capabilities.ListTools() // Get tools from individual collections var expectedTools []types.ToolDefinition @@ -53,7 +53,7 @@ func TestAllToolsRegistered(t *testing.T) { } func TestAllToolsHaveSchemas(t *testing.T) { - for _, toolDef := range tools.ListTools() { + for _, toolDef := range capabilities.ListTools() { t.Run(toolDef.McpTool.Name, func(t *testing.T) { require.NotNil(t, toolDef.McpTool, "McpTool should not be nil for tool %s", toolDef.McpTool.Name) assert.NotNil(t, toolDef.McpTool.InputSchema, "tool InputSchema should not be nil for tool %s", toolDef.McpTool.Name) diff --git a/internal/capabilities/types/dynamic_resource_definition.go b/internal/capabilities/types/dynamic_resource_definition.go new file mode 100644 index 0000000..58ecc4c --- /dev/null +++ b/internal/capabilities/types/dynamic_resource_definition.go @@ -0,0 +1,9 @@ +// Copyright © 2025 Ping Identity Corporation + +package types + +type DynamicResourceDefinition struct { + StaticResourceDefinition + // ValidationPolicy allows modification of in-built validation rules and constraints for the tool's execution + ValidationPolicy *DynamicResourceValidationPolicy +} diff --git a/internal/capabilities/types/dynamic_resource_validation_definition.go b/internal/capabilities/types/dynamic_resource_validation_definition.go new file mode 100644 index 0000000..9f946d5 --- /dev/null +++ b/internal/capabilities/types/dynamic_resource_validation_definition.go @@ -0,0 +1,15 @@ +// Copyright © 2025 Ping Identity Corporation + +package types + +type DynamicResourceValidationPolicy struct { + // AllowProductionEnvironmentRead when set to true, allows the tool to make read operations on production-type environments. + // When false (default), read operations on PRODUCTION environments are blocked. + // This modifier only applies to READ operations; WRITE operations are governed by AllowProductionEnvironmentWrite. + AllowProductionEnvironmentRead bool + // ProductionEnvironmentNotApplicable when set to true, indicates that the tool does not operate on environments + // and therefore production environment validation should be skipped entirely. + // This is typically used for tools that don't have an environmentId parameter (e.g., list_environments) or operate at the organization level. + // When true, both AllowProductionEnvironmentWrite and AllowProductionEnvironmentRead are ignored. + ProductionEnvironmentNotApplicable bool +} diff --git a/internal/capabilities/types/prompt_definition.go b/internal/capabilities/types/prompt_definition.go new file mode 100644 index 0000000..e40e6ae --- /dev/null +++ b/internal/capabilities/types/prompt_definition.go @@ -0,0 +1,12 @@ +// Copyright © 2025 Ping Identity Corporation + +package types + +import ( + "github.com/modelcontextprotocol/go-sdk/mcp" +) + +type PromptDefinition struct { + // McpPrompt is the MCP prompt definition (including name and description) + McpPrompt *mcp.Prompt +} diff --git a/internal/capabilities/types/static_resource_definition.go b/internal/capabilities/types/static_resource_definition.go new file mode 100644 index 0000000..8c147a1 --- /dev/null +++ b/internal/capabilities/types/static_resource_definition.go @@ -0,0 +1,12 @@ +// Copyright © 2025 Ping Identity Corporation + +package types + +import ( + "github.com/modelcontextprotocol/go-sdk/mcp" +) + +type StaticResourceDefinition struct { + // McpResource is the MCP resource definition (including name and description) + McpResource *mcp.Resource +} diff --git a/internal/tools/types/tool_definition.go b/internal/capabilities/types/tool_definition.go similarity index 100% rename from internal/tools/types/tool_definition.go rename to internal/capabilities/types/tool_definition.go diff --git a/internal/tools/types/tool_definition_test.go b/internal/capabilities/types/tool_definition_test.go similarity index 100% rename from internal/tools/types/tool_definition_test.go rename to internal/capabilities/types/tool_definition_test.go diff --git a/internal/tools/types/tool_validation_definition.go b/internal/capabilities/types/tool_validation_definition.go similarity index 100% rename from internal/tools/types/tool_validation_definition.go rename to internal/capabilities/types/tool_validation_definition.go diff --git a/internal/tools/validation/environment_validator.go b/internal/capabilities/validation/environment_validator.go similarity index 97% rename from internal/tools/validation/environment_validator.go rename to internal/capabilities/validation/environment_validator.go index 0bd4a9d..51db505 100644 --- a/internal/tools/validation/environment_validator.go +++ b/internal/capabilities/validation/environment_validator.go @@ -9,10 +9,10 @@ import ( "github.com/google/uuid" "github.com/pingidentity/pingone-go-client/pingone" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" "github.com/pingidentity/pingone-mcp-server/internal/errs" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" ) // OperationType represents the type of operation being performed on an environment. diff --git a/internal/tools/validation/environment_validator_test.go b/internal/capabilities/validation/environment_validator_test.go similarity index 98% rename from internal/tools/validation/environment_validator_test.go rename to internal/capabilities/validation/environment_validator_test.go index 3146c2b..1aef6bc 100644 --- a/internal/tools/validation/environment_validator_test.go +++ b/internal/capabilities/validation/environment_validator_test.go @@ -10,8 +10,8 @@ import ( "github.com/google/uuid" "github.com/pingidentity/pingone-go-client/pingone" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments/testutils" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments/testutils" "github.com/stretchr/testify/assert" ) diff --git a/internal/tools/validation/middleware.go b/internal/capabilities/validation/middleware.go similarity index 99% rename from internal/tools/validation/middleware.go rename to internal/capabilities/validation/middleware.go index 575add5..2a55902 100644 --- a/internal/tools/validation/middleware.go +++ b/internal/capabilities/validation/middleware.go @@ -10,8 +10,8 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/pingidentity/pingone-mcp-server/internal/logger" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" ) // ToolRegistry provides access to tool definitions for middleware. diff --git a/internal/tools/validation/middleware_integration_test.go b/internal/capabilities/validation/middleware_integration_test.go similarity index 98% rename from internal/tools/validation/middleware_integration_test.go rename to internal/capabilities/validation/middleware_integration_test.go index 0cba710..3067afd 100644 --- a/internal/tools/validation/middleware_integration_test.go +++ b/internal/capabilities/validation/middleware_integration_test.go @@ -10,10 +10,10 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/schema" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/validation" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/schema" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" - "github.com/pingidentity/pingone-mcp-server/internal/tools/validation" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/tools/validation/middleware_test.go b/internal/capabilities/validation/middleware_test.go similarity index 99% rename from internal/tools/validation/middleware_test.go rename to internal/capabilities/validation/middleware_test.go index 1beac9f..344d1c5 100644 --- a/internal/tools/validation/middleware_test.go +++ b/internal/capabilities/validation/middleware_test.go @@ -10,7 +10,7 @@ import ( "github.com/google/uuid" "github.com/modelcontextprotocol/go-sdk/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/internal/server/server.go b/internal/server/server.go index 51f389c..08b30ba 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -9,15 +9,15 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" "github.com/pingidentity/pingone-mcp-server/internal/auth/client" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/initialize" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/validation" "github.com/pingidentity/pingone-mcp-server/internal/logger" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/initialize" - "github.com/pingidentity/pingone-mcp-server/internal/tools/validation" ) func Start(ctx context.Context, transport mcp.Transport, clientFactory sdk.ClientFactory, legacySdkClientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, toolFilter *filter.Filter, grantType auth.GrantType) error { @@ -25,11 +25,26 @@ func Start(ctx context.Context, transport mcp.Transport, clientFactory sdk.Clien Name: "pingone-mcp-server", Version: "v0.0.1", }, &mcp.ServerOptions{ - Logger: logger.FromContext(ctx), + Logger: logger.FromContext(ctx), + HasPrompts: false, // to flip on first prompt + HasResources: false, // to flip on first resource + HasTools: true, }) logger.FromContext(ctx).Debug("Registering MCP tool collections") - err := tools.RegisterCollections(ctx, server, clientFactory, legacySdkClientFactory, authClientFactory, tokenStore, toolFilter, grantType) + err := capabilities.RegisterToolCollections(ctx, server, clientFactory, legacySdkClientFactory, authClientFactory, tokenStore, toolFilter, grantType) + if err != nil { + return err + } + + logger.FromContext(ctx).Debug("Registering MCP resources") + err = capabilities.RegisterResources(ctx, server, clientFactory, legacySdkClientFactory, authClientFactory, tokenStore, grantType) + if err != nil { + return err + } + + logger.FromContext(ctx).Debug("Registering MCP prompts") + err = capabilities.RegisterPrompts(ctx, server) if err != nil { return err } @@ -39,7 +54,7 @@ func Start(ctx context.Context, transport mcp.Transport, clientFactory sdk.Clien // 1. Environment exists and is accessible // 2. Write operations are not performed on PRODUCTION environments logger.FromContext(ctx).Debug("Setting up environment validation middleware") - allTools := tools.ListTools() + allTools := capabilities.ListTools() toolRegistry := validation.NewToolRegistry(allTools) environmentsFactory := environments.NewPingOneClientEnvironmentsWrapperFactory(clientFactory, tokenStore) initializeAuthContext := initialize.AuthContextInitializer(authClientFactory, tokenStore, grantType) diff --git a/internal/server/server_test.go b/internal/server/server_test.go index 38a7e51..afea6d1 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -9,13 +9,13 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/pingidentity/pingone-mcp-server/internal/auth" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/environments" + "github.com/pingidentity/pingone-mcp-server/internal/capabilities/filter" "github.com/pingidentity/pingone-mcp-server/internal/sdk" "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" "github.com/pingidentity/pingone-mcp-server/internal/server" "github.com/pingidentity/pingone-mcp-server/internal/testutils" mcptestutils "github.com/pingidentity/pingone-mcp-server/internal/testutils/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/tools/environments" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/internal/testutils/tools.go b/internal/testutils/tools.go index 64b2d44..a4ea77b 100644 --- a/internal/testutils/tools.go +++ b/internal/testutils/tools.go @@ -2,7 +2,7 @@ package testutils -import "github.com/pingidentity/pingone-mcp-server/internal/tools" +import tools "github.com/pingidentity/pingone-mcp-server/internal/capabilities" func AllServerToolNames() []string { allTools := tools.ListTools() diff --git a/internal/tools/collections/interface.go b/internal/tools/collections/interface.go deleted file mode 100644 index c380466..0000000 --- a/internal/tools/collections/interface.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package collections - -import ( - "context" - - "github.com/modelcontextprotocol/go-sdk/mcp" - "github.com/pingidentity/pingone-mcp-server/internal/auth" - "github.com/pingidentity/pingone-mcp-server/internal/auth/client" - "github.com/pingidentity/pingone-mcp-server/internal/sdk" - "github.com/pingidentity/pingone-mcp-server/internal/sdk/legacy" - "github.com/pingidentity/pingone-mcp-server/internal/tokenstore" - "github.com/pingidentity/pingone-mcp-server/internal/tools/filter" - "github.com/pingidentity/pingone-mcp-server/internal/tools/types" -) - -type Collection interface { - Name() string - // RegisterTools registers the tools with the server. - // The filter determines which tools are registered based on read-only mode, included/excluded tools. - RegisterTools(ctx context.Context, server *mcp.Server, clientFactory sdk.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, toolFilter *filter.Filter, grantType auth.GrantType) error - ListTools() []types.ToolDefinition -} - -type LegacySdkCollection interface { - Name() string - // RegisterTools registers the tools with the server. - // The filter determines which tools are registered based on read-only mode, included/excluded tools. - RegisterTools(ctx context.Context, server *mcp.Server, clientFactory legacy.ClientFactory, authClientFactory client.AuthClientFactory, tokenStore tokenstore.TokenStore, toolFilter *filter.Filter, grantType auth.GrantType) error - ListTools() []types.ToolDefinition -}