Skip to content
Merged
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
4 changes: 2 additions & 2 deletions cmd/registry/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import (
"github.com/modelcontextprotocol/registry/internal/api"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/database"
"github.com/modelcontextprotocol/registry/internal/model"
"github.com/modelcontextprotocol/registry/internal/service"
"github.com/modelcontextprotocol/registry/internal/telemetry"
"github.com/modelcontextprotocol/registry/pkg/model"
)

func main() {
Expand Down Expand Up @@ -46,7 +46,7 @@ func main() {
// Initialize services based on environment
switch cfg.DatabaseType {
case config.DatabaseTypeMemory:
db = database.NewMemoryDB(map[string]*model.ServerDetail{})
db = database.NewMemoryDB(map[string]*model.ServerJSON{})
registryService = service.NewRegistryServiceWithDB(db)
case config.DatabaseTypePostgreSQL:
// Use PostgreSQL for real registry service
Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
)

// DNSTokenExchangeInput represents the input for DNS-based authentication
Expand Down Expand Up @@ -147,7 +146,7 @@ func (h *DNSAuthHandler) ExchangeToken(ctx context.Context, domain, timestamp, s

// Create JWT claims
jwtClaims := auth.JWTClaims{
AuthMethod: model.AuthMethodDNS,
AuthMethod: auth.MethodDNS,
AuthMethodSubject: domain,
Permissions: permissions,
}
Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/dns_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth"
intauth "github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
)

// MockDNSResolver for testing
Expand Down Expand Up @@ -174,7 +173,7 @@ func TestDNSAuthHandler_ExchangeToken(t *testing.T) {
claims, err := jwtManager.ValidateToken(context.Background(), result.RegistryToken)
require.NoError(t, err)

assert.Equal(t, model.AuthMethodDNS, claims.AuthMethod)
assert.Equal(t, intauth.MethodDNS, claims.AuthMethod)
assert.Equal(t, tt.domain, claims.AuthMethodSubject)
assert.Len(t, claims.Permissions, 2) // domain and subdomain permissions

Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/github_at.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
)

// GitHubTokenExchangeInput represents the input for GitHub token exchange
Expand Down Expand Up @@ -86,7 +85,7 @@ func (h *GitHubHandler) ExchangeToken(ctx context.Context, githubToken string) (

// Create JWT claims with GitHub user info
claims := auth.JWTClaims{
AuthMethod: model.AuthMethodGitHubAT,
AuthMethod: auth.MethodGitHubAT,
AuthMethodSubject: user.Login,
Permissions: permissions,
}
Expand Down
11 changes: 5 additions & 6 deletions internal/api/handlers/v0/auth/github_at_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
v0auth "github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -78,7 +77,7 @@ func TestGitHubHandler_ExchangeToken(t *testing.T) {
jwtManager := auth.NewJWTManager(cfg)
claims, err := jwtManager.ValidateToken(ctx, response.RegistryToken)
require.NoError(t, err)
assert.Equal(t, model.AuthMethodGitHubAT, claims.AuthMethod)
assert.Equal(t, auth.MethodGitHubAT, claims.AuthMethod)
assert.Equal(t, "testuser", claims.AuthMethodSubject)
assert.Len(t, claims.Permissions, 1)
assert.Equal(t, auth.PermissionActionPublish, claims.Permissions[0].Action)
Expand Down Expand Up @@ -333,7 +332,7 @@ func TestJWTTokenValidation(t *testing.T) {
t.Run("generate and validate token", func(t *testing.T) {
// Create test claims
claims := auth.JWTClaims{
AuthMethod: model.AuthMethodGitHubAT,
AuthMethod: auth.MethodGitHubAT,
AuthMethodSubject: "testuser",
Permissions: []auth.Permission{
{
Expand All @@ -351,7 +350,7 @@ func TestJWTTokenValidation(t *testing.T) {
// Validate token
validatedClaims, err := jwtManager.ValidateToken(ctx, tokenResponse.RegistryToken)
require.NoError(t, err)
assert.Equal(t, model.AuthMethodGitHubAT, validatedClaims.AuthMethod)
assert.Equal(t, auth.MethodGitHubAT, validatedClaims.AuthMethod)
assert.Equal(t, "testuser", validatedClaims.AuthMethodSubject)
assert.Len(t, validatedClaims.Permissions, 1)
})
Expand All @@ -360,7 +359,7 @@ func TestJWTTokenValidation(t *testing.T) {
// Create claims with past expiration
pastTime := time.Now().Add(-1 * time.Hour)
claims := auth.JWTClaims{
AuthMethod: model.AuthMethodGitHubAT,
AuthMethod: auth.MethodGitHubAT,
AuthMethodSubject: "testuser",
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(pastTime),
Expand All @@ -381,7 +380,7 @@ func TestJWTTokenValidation(t *testing.T) {
t.Run("invalid signature", func(t *testing.T) {
// Create test claims
claims := auth.JWTClaims{
AuthMethod: model.AuthMethodGitHubAT,
AuthMethod: auth.MethodGitHubAT,
AuthMethodSubject: "testuser",
}

Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/github_oidc.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
)

// GitHubOIDCTokenExchangeInput represents the input for GitHub OIDC token exchange
Expand Down Expand Up @@ -263,7 +262,7 @@ func (h *GitHubOIDCHandler) ExchangeToken(ctx context.Context, oidcToken string)

// Create JWT claims with GitHub OIDC info
jwtClaims := auth.JWTClaims{
AuthMethod: model.AuthMethodGitHubOIDC,
AuthMethod: auth.MethodGitHubOIDC,
AuthMethodSubject: claims.Subject, // e.g. "repo:octo-org/octo-repo:environment:prod"
Permissions: permissions,
}
Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/github_oidc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth"
internalauth "github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -106,7 +105,7 @@ func TestGitHubOIDCHandler_ExchangeToken(t *testing.T) {
claims, err := jwtManager.ValidateToken(context.Background(), response.RegistryToken)
require.NoError(t, err)

assert.Equal(t, model.AuthMethodGitHubOIDC, claims.AuthMethod)
assert.Equal(t, internalauth.MethodGitHubOIDC, claims.AuthMethod)
assert.Equal(t, tt.expectedSubject, claims.AuthMethodSubject)
assert.Len(t, claims.Permissions, tt.expectedPerms)

Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
)

// HTTPTokenExchangeInput represents the input for HTTP-based authentication
Expand Down Expand Up @@ -182,7 +181,7 @@ func (h *HTTPAuthHandler) ExchangeToken(ctx context.Context, domain, timestamp,

// Create JWT claims
jwtClaims := auth.JWTClaims{
AuthMethod: model.AuthMethodHTTP,
AuthMethod: auth.MethodHTTP,
AuthMethodSubject: domain,
Permissions: permissions,
}
Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/http_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth"
intauth "github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
)

// MockHTTPKeyFetcher for testing
Expand Down Expand Up @@ -210,7 +209,7 @@ func TestHTTPAuthHandler_ExchangeToken(t *testing.T) {
claims, err := jwtManager.ValidateToken(context.Background(), result.RegistryToken)
require.NoError(t, err)

assert.Equal(t, model.AuthMethodHTTP, claims.AuthMethod)
assert.Equal(t, intauth.MethodHTTP, claims.AuthMethod)
assert.Equal(t, tt.domain, claims.AuthMethodSubject)
assert.Len(t, claims.Permissions, 1) // domain permissions only

Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/none.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
)

// NoneHandler handles anonymous authentication
Expand Down Expand Up @@ -66,7 +65,7 @@ func (h *NoneHandler) GetAnonymousToken(ctx context.Context) (*auth.TokenRespons

// Create JWT claims for anonymous user
claims := auth.JWTClaims{
AuthMethod: model.AuthMethodNone,
AuthMethod: auth.MethodNone,
AuthMethodSubject: "anonymous",
Permissions: permissions,
}
Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/none_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
v0auth "github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -41,7 +40,7 @@ func TestNoneHandler_GetAnonymousToken(t *testing.T) {
require.NoError(t, err)

// Check auth method
assert.Equal(t, model.AuthMethodNone, claims.AuthMethod)
assert.Equal(t, auth.MethodNone, claims.AuthMethod)
assert.Equal(t, "anonymous", claims.AuthMethodSubject)

// Check permissions
Expand Down
3 changes: 1 addition & 2 deletions internal/api/handlers/v0/auth/oidc.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/model"
"golang.org/x/oauth2"
)

Expand Down Expand Up @@ -301,7 +300,7 @@ func (h *OIDCHandler) ExchangeToken(ctx context.Context, oidcToken string) (*aut

// Create JWT claims
jwtClaims := auth.JWTClaims{
AuthMethod: model.AuthMethodOIDC,
AuthMethod: auth.MethodOIDC,
AuthMethodSubject: claims.Subject,
Permissions: permissions,
}
Expand Down
13 changes: 7 additions & 6 deletions internal/api/handlers/v0/edit.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ import (
"github.com/modelcontextprotocol/registry/internal/auth"
"github.com/modelcontextprotocol/registry/internal/config"
"github.com/modelcontextprotocol/registry/internal/database"
"github.com/modelcontextprotocol/registry/internal/model"
"github.com/modelcontextprotocol/registry/internal/service"
"github.com/modelcontextprotocol/registry/internal/validators"
apiv1 "github.com/modelcontextprotocol/registry/pkg/api/v1"
"github.com/modelcontextprotocol/registry/pkg/model"
)

// EditServerInput represents the input for editing a server
Expand All @@ -38,7 +39,7 @@ func RegisterEditEndpoints(api huma.API, registry service.RegistryService, cfg *
Security: []map[string][]string{
{"bearer": {}},
},
}, func(ctx context.Context, input *EditServerInput) (*Response[model.ServerResponse], error) {
}, func(ctx context.Context, input *EditServerInput) (*Response[apiv1.ServerRecord], error) {
// Extract bearer token
const bearerPrefix = "Bearer "
authHeader := input.Authorization
Expand All @@ -54,7 +55,7 @@ func RegisterEditEndpoints(api huma.API, registry service.RegistryService, cfg *
}

// Validate that only allowed extension fields are present
if err := model.ValidatePublishRequestExtensions(input.RawBody); err != nil {
if err := validators.ValidatePublishRequestExtensions(input.RawBody); err != nil {
return nil, huma.Error400BadRequest("Invalid request format", err)
}

Expand All @@ -73,7 +74,7 @@ func RegisterEditEndpoints(api huma.API, registry service.RegistryService, cfg *
}

// Parse the validated request body
var editRequest model.PublishRequest
var editRequest apiv1.PublishRequest
if err := json.Unmarshal(input.RawBody, &editRequest); err != nil {
return nil, huma.Error400BadRequest("Invalid JSON format", err)
}
Expand All @@ -90,7 +91,7 @@ func RegisterEditEndpoints(api huma.API, registry service.RegistryService, cfg *
}

// Prevent undeleting servers - once deleted, they stay deleted
if currentServer.Server.Status == model.ServerStatusDeleted && editRequest.Server.Status != model.ServerStatusDeleted {
if currentServer.Server.Status == model.StatusDeleted && editRequest.Server.Status != model.StatusDeleted {
return nil, huma.Error400BadRequest("Cannot change status of deleted server. Deleted servers cannot be undeleted.")
}

Expand All @@ -103,7 +104,7 @@ func RegisterEditEndpoints(api huma.API, registry service.RegistryService, cfg *
return nil, huma.Error400BadRequest("Failed to edit server", err)
}

return &Response[model.ServerResponse]{
return &Response[apiv1.ServerRecord]{
Body: *updatedServer,
}, nil
})
Expand Down
Loading
Loading