Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 4 additions & 4 deletions cmd/run/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions cmd/run/run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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{}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
66 changes: 66 additions & 0 deletions internal/capabilities/collections/interface.go
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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{}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Loading
Loading