Skip to content

Conversation

@rdimitrov
Copy link
Member

Motivation and Context

The following PR makes the test output less verbose by leveraging gotestsum.

How Has This Been Tested?

After:

➜  registry git:(less-verbose-test-output) ✗ make test-unit
Starting PostgreSQL for unit tests...
Waiting for PostgreSQL to be ready...

Running unit tests...
✓  internal/api (cached) (coverage: 46.7% of statements)
✓  internal/telemetry (cached) (coverage: 31.7% of statements)
✓  internal/importer (cached) (coverage: 72.2% of statements)
✓  internal/auth (cached) (coverage: 91.8% of statements)
✓  internal/database (cached) (coverage: 75.2% of statements)
✓  internal/validators/registries (cached) (coverage: 64.1% of statements)
✓  internal/service (cached) (coverage: 81.3% of statements)
✓  internal/api/handlers/v0 (cached) (coverage: 88.7% of statements)
✓  internal/api/handlers/v0/auth (cached) (coverage: 62.1% of statements)
✓  internal/validators (cached) (coverage: 88.4% of statements)
✓  cmd/publisher/commands (cached) (coverage: 5.8% of statements)
∅  cmd/registry (205ms) (coverage: 0.0% of statements)
∅  internal/api/router (267ms) (coverage: 0.0% of statements)
∅  internal/config (267ms) (coverage: 0.0% of statements)
∅  cmd/publisher/auth (262ms) (coverage: 0.0% of statements)
∅  cmd/publisher (265ms) (coverage: 0.0% of statements)

=== Skipped
=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/empty_package_identifier_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/empty_package_version_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/both_empty_identifier_and_version_should_fail_with_identifier_error_first (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/non-existent_image_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/real_image_without_MCP_annotation_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/real_image_with_specific_tag_without_MCP_annotation_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/namespaced_image_without_MCP_annotation_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/real_image_with_correct_MCP_annotation_should_pass (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/GHCR_image_without_MCP_annotation_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/real_GHCR_image_without_MCP_annotation_should_fail (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

=== SKIP: internal/validators/registries TestValidateOCI_RealPackages/GHCR_image_with_correct_MCP_annotation_should_pass (0.00s)
    oci_test.go:117: Skipping OCI registry tests because we keep hitting DockerHub rate limits

DONE 693 tests, 11 skipped in 0.306s

✅ Coverage report: coverage.html
total:                                                                                          (statements)                            52.4%

✅ Tests complete

Before (trimmed down):

➜  registry git:(main) make test-unit
Starting PostgreSQL for unit tests...
[+] Running 2/2
 ✔ Network registry_default  Created                                                                       0.0s 
 ✔ Container postgres        Started                                                                       0.1s 
Waiting for PostgreSQL to be ready...
Running unit tests...
go test -v -race -coverprofile=coverage.out -covermode=atomic ./internal/... ./cmd/...
# github.com/modelcontextprotocol/registry/internal/api.test
ld: warning: '/private/var/folders/18/wz5f_4216xv47hb68ynhhzjh0000gn/T/go-link-4223962944/000013.o' has malformed LC_DYSYMTAB, expected 98 undefined symbols to start at index 1626, found 95 undefined symbols starting at index 1626
# github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth.test
ld: warning: '/private/var/folders/18/wz5f_4216xv47hb68ynhhzjh0000gn/T/go-link-1127076382/000013.o' has malformed LC_DYSYMTAB, expected 98 undefined symbols to start at index 1626, found 95 undefined symbols starting at index 1626
# github.com/modelcontextprotocol/registry/internal/telemetry.test
ld: warning: '/private/var/folders/18/wz5f_4216xv47hb68ynhhzjh0000gn/T/go-link-3368022265/000013.o' has malformed LC_DYSYMTAB, expected 98 undefined symbols to start at index 1626, found 95 undefined symbols starting at index 1626
=== RUN   TestOpenAPIEndpointCompliance
    openapi_compliance_test.go:91: ✅ All 4 reference endpoints are implemented
    openapi_compliance_test.go:109: + 7 additional endpoints in served API: [/v0/auth/dns /v0/auth/github-at /v0/auth/github-oidc /v0/auth/http /v0/health /v0/ping /v0/version]
--- PASS: TestOpenAPIEndpointCompliance (0.10s)
=== RUN   TestTrailingSlashMiddleware
=== RUN   TestTrailingSlashMiddleware/root_path_should_not_redirect
=== RUN   TestTrailingSlashMiddleware/path_without_trailing_slash_should_pass_through
=== RUN   TestTrailingSlashMiddleware/path_with_trailing_slash_should_redirect
=== RUN   TestTrailingSlashMiddleware/nested_path_with_trailing_slash_should_redirect
=== RUN   TestTrailingSlashMiddleware/deep_nested_path_with_trailing_slash_should_redirect
=== RUN   TestTrailingSlashMiddleware/path_with_query_params_and_no_trailing_slash_should_pass_through
=== RUN   TestTrailingSlashMiddleware/path_with_query_params_and_trailing_slash_should_redirect_preserving_query_params
--- PASS: TestTrailingSlashMiddleware (0.00s)
    --- PASS: TestTrailingSlashMiddleware/root_path_should_not_redirect (0.00s)
    --- PASS: TestTrailingSlashMiddleware/path_without_trailing_slash_should_pass_through (0.00s)
    --- PASS: TestTrailingSlashMiddleware/path_with_trailing_slash_should_redirect (0.00s)
    --- PASS: TestTrailingSlashMiddleware/nested_path_with_trailing_slash_should_redirect (0.00s)
    --- PASS: TestTrailingSlashMiddleware/deep_nested_path_with_trailing_slash_should_redirect (0.00s)
    --- PASS: TestTrailingSlashMiddleware/path_with_query_params_and_no_trailing_slash_should_pass_through (0.00s)
    --- PASS: TestTrailingSlashMiddleware/path_with_query_params_and_trailing_slash_should_redirect_preserving_query_params (0.00s)
PASS
coverage: 46.7% of statements
ok      github.com/modelcontextprotocol/registry/internal/api   (cached)        coverage: 46.7% of statements
# github.com/modelcontextprotocol/registry/internal/api/handlers/v0.test
ld: warning: '/private/var/folders/18/wz5f_4216xv47hb68ynhhzjh0000gn/T/go-link-3461000984/000013.o' has malformed LC_DYSYMTAB, expected 98 undefined symbols to start at index 1626, found 95 undefined symbols starting at index 1626
=== RUN   TestEditServerEndpoint
2025/10/24 22:50:51 Applying 10 pending migrations
2025/10/24 22:50:51 Applied migration 1: 001_initial_schema
2025/10/24 22:50:51 Applied migration 2: 002_add_server_extensions
2025/10/24 22:50:51 Applied migration 3: 003_simplify_to_key_value
2025/10/24 22:50:51 Applied migration 4: 004_update_meta_field_format
2025/10/24 22:50:51 Applied migration 5: 005_add_server_id_rename_version_id
2025/10/24 22:50:51 Applied migration 6: 006_migrate_server_json_camelcase
2025/10/24 22:50:51 Applied migration 7: 007_add_publish_constraints
2025/10/24 22:50:51 Applied migration 8: 008_clean_invalid_data
2025/10/24 22:50:51 Applied migration 9: 009_separate_official_metadata
2025/10/24 22:50:51 Applied migration 10: 010_migrate_canonical_package_refs
2025/10/24 22:50:51 All migrations applied successfully
2025/10/24 22:50:51 No pending migrations
=== RUN   TestEditServerEndpoint/successful_edit_with_valid_permissions
=== RUN   TestEditServerEndpoint/successful_edit_with_status_change
=== RUN   TestEditServerEndpoint/missing_authorization_header
=== RUN   TestEditServerEndpoint/invalid_authorization_header_format
=== RUN   TestEditServerEndpoint/invalid_token
=== RUN   TestEditServerEndpoint/permission_denied_-_no_edit_permissions
=== RUN   TestEditServerEndpoint/permission_denied_-_wrong_namespace
=== RUN   TestEditServerEndpoint/server_not_found
=== RUN   TestEditServerEndpoint/attempt_to_rename_server_should_fail
=== RUN   TestEditServerEndpoint/version_in_body_must_match_URL_parameter
=== RUN   TestEditServerEndpoint/attempt_to_undelete_server_should_fail
=== RUN   TestEditServerEndpoint/successful_edit_of_version_with_build_metadata_(URL_encoded)
--- PASS: TestEditServerEndpoint (0.27s)
    --- PASS: TestEditServerEndpoint/successful_edit_with_valid_permissions (0.01s)
    --- PASS: TestEditServerEndpoint/successful_edit_with_status_change (0.01s)
    --- PASS: TestEditServerEndpoint/missing_authorization_header (0.00s)
    --- PASS: TestEditServerEndpoint/invalid_authorization_header_format (0.00s)
    --- PASS: TestEditServerEndpoint/invalid_token (0.00s)
    --- PASS: TestEditServerEndpoint/permission_denied_-_no_edit_permissions (0.00s)
    --- PASS: TestEditServerEndpoint/permission_denied_-_wrong_namespace (0.00s)
    --- PASS: TestEditServerEndpoint/server_not_found (0.00s)
    --- PASS: TestEditServerEndpoint/attempt_to_rename_server_should_fail (0.00s)
    --- PASS: TestEditServerEndpoint/version_in_body_must_match_URL_parameter (0.00s)
    --- PASS: TestEditServerEndpoint/attempt_to_undelete_server_should_fail (0.00s)
    --- PASS: TestEditServerEndpoint/successful_edit_of_version_with_build_metadata_(URL_encoded) (0.01s)
=== RUN   TestEditServerEndpointEdgeCases
2025/10/24 22:50:51 No pending migrations
=== RUN   TestEditServerEndpointEdgeCases/status_transitions
=== RUN   TestEditServerEndpointEdgeCases/status_transitions/active_to_deprecated
=== RUN   TestEditServerEndpointEdgeCases/status_transitions/deprecated_to_active
=== RUN   TestEditServerEndpointEdgeCases/status_transitions/active_to_deleted
=== RUN   TestEditServerEndpointEdgeCases/status_transitions/invalid_status
=== RUN   TestEditServerEndpointEdgeCases/URL_encoding_edge_cases
=== RUN   TestEditServerEndpointEdgeCases/version-specific_editing
--- PASS: TestEditServerEndpointEdgeCases (0.08s)
    --- PASS: TestEditServerEndpointEdgeCases/status_transitions (0.01s)
        --- PASS: TestEditServerEndpointEdgeCases/status_transitions/active_to_deprecated (0.00s)
        --- PASS: TestEditServerEndpointEdgeCases/status_transitions/deprecated_to_active (0.00s)
        --- PASS: TestEditServerEndpointEdgeCases/status_transitions/active_to_deleted (0.00s)
        --- PASS: TestEditServerEndpointEdgeCases/status_transitions/invalid_status (0.00s)
    --- PASS: TestEditServerEndpointEdgeCases/URL_encoding_edge_cases (0.00s)
    --- PASS: TestEditServerEndpointEdgeCases/version-specific_editing (0.00s)
=== RUN   TestHealthEndpoint
=== RUN   TestHealthEndpoint/returns_health_status_with_github_client_id
=== RUN   TestHealthEndpoint/returns_health_status_without_github_client_id
--- PASS: TestHealthEndpoint (0.00s)
    --- PASS: TestHealthEndpoint/returns_health_status_with_github_client_id (0.00s)
    --- PASS: TestHealthEndpoint/returns_health_status_without_github_client_id (0.00s)
=== RUN   TestPingEndpoint
--- PASS: TestPingEndpoint (0.00s)
=== RUN   TestPublishIntegration
2025/10/24 22:50:51 No pending migrations
=== RUN   TestPublishIntegration/successful_publish_with_GitHub_auth
=== RUN   TestPublishIntegration/successful_publish_with_none_auth_(no_prefix)
=== RUN   TestPublishIntegration/publish_fails_with_missing_authorization_header
=== RUN   TestPublishIntegration/publish_fails_with_invalid_token
=== RUN   TestPublishIntegration/publish_fails_when_permission_denied
=== RUN   TestPublishIntegration/publish_succeeds_with_MCPB_package
--- PASS: TestPublishIntegration (0.07s)
    --- PASS: TestPublishIntegration/successful_publish_with_GitHub_auth (0.01s)
    --- PASS: TestPublishIntegration/successful_publish_with_none_auth_(no_prefix) (0.00s)
    --- PASS: TestPublishIntegration/publish_fails_with_missing_authorization_header (0.00s)
    --- PASS: TestPublishIntegration/publish_fails_with_invalid_token (0.00s)
    --- PASS: TestPublishIntegration/publish_fails_when_permission_denied (0.00s)
    --- PASS: TestPublishIntegration/publish_succeeds_with_MCPB_package (0.00s)
=== RUN   TestPublishRegistryValidation
2025/10/24 22:50:51 No pending migrations
=== RUN   TestPublishRegistryValidation/publish_fails_with_npm_registry_validation_error
=== RUN   TestPublishRegistryValidation/publish_succeeds_with_MCPB_package_(registry_validation_enabled)
=== RUN   TestPublishRegistryValidation/publish_fails_when_second_package_fails_npm_validation
=== RUN   TestPublishRegistryValidation/publish_fails_when_first_package_fails_validation
--- PASS: TestPublishRegistryValidation (1.39s)
    --- PASS: TestPublishRegistryValidation/publish_fails_with_npm_registry_validation_error (0.30s)
    --- PASS: TestPublishRegistryValidation/publish_succeeds_with_MCPB_package_(registry_validation_enabled) (0.48s)
    --- PASS: TestPublishRegistryValidation/publish_fails_when_second_package_fails_npm_validation (0.31s)
    --- PASS: TestPublishRegistryValidation/publish_fails_when_first_package_fails_validation (0.25s)
=== RUN   TestPublishEndpoint
=== RUN   TestPublishEndpoint/successful_publish_with_GitHub_auth
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/successful_publish_with_no_auth_(AuthMethodNone)
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/missing_authorization_header
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_authorization_header_format
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_token
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/permission_denied
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/registry_service_error
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/package_validation_success_-_MCPB_package
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_server_name_-_multiple_slashes_(two_slashes)
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_server_name_-_multiple_slashes_(three_slashes)
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_server_name_-_consecutive_slashes
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_server_name_-_URL-like_path
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_server_name_-_many_slashes
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint/invalid_server_name_-_with_packages_and_remotes
2025/10/24 22:50:53 No pending migrations
--- PASS: TestPublishEndpoint (0.92s)
    --- PASS: TestPublishEndpoint/successful_publish_with_GitHub_auth (0.12s)
    --- PASS: TestPublishEndpoint/successful_publish_with_no_auth_(AuthMethodNone) (0.07s)
    --- PASS: TestPublishEndpoint/missing_authorization_header (0.07s)
    --- PASS: TestPublishEndpoint/invalid_authorization_header_format (0.07s)
    --- PASS: TestPublishEndpoint/invalid_token (0.06s)
    --- PASS: TestPublishEndpoint/permission_denied (0.06s)
    --- PASS: TestPublishEndpoint/registry_service_error (0.06s)
    --- PASS: TestPublishEndpoint/package_validation_success_-_MCPB_package (0.08s)
    --- PASS: TestPublishEndpoint/invalid_server_name_-_multiple_slashes_(two_slashes) (0.05s)
    --- PASS: TestPublishEndpoint/invalid_server_name_-_multiple_slashes_(three_slashes) (0.05s)
    --- PASS: TestPublishEndpoint/invalid_server_name_-_consecutive_slashes (0.05s)
    --- PASS: TestPublishEndpoint/invalid_server_name_-_URL-like_path (0.08s)
    --- PASS: TestPublishEndpoint/invalid_server_name_-_many_slashes (0.06s)
    --- PASS: TestPublishEndpoint/invalid_server_name_-_with_packages_and_remotes (0.05s)
=== RUN   TestPublishEndpoint_MultipleSlashesEdgeCases
=== RUN   TestPublishEndpoint_MultipleSlashesEdgeCases/valid_-_single_slash
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_trailing_slash_after_valid_name
2025/10/24 22:50:53 No pending migrations
=== RUN   TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_leading_and_middle_slash
2025/10/24 22:50:54 No pending migrations
=== RUN   TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_file_system_style_path
2025/10/24 22:50:54 No pending migrations
=== RUN   TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_version-like_suffix
2025/10/24 22:50:54 No pending migrations
--- PASS: TestPublishEndpoint_MultipleSlashesEdgeCases (0.33s)
    --- PASS: TestPublishEndpoint_MultipleSlashesEdgeCases/valid_-_single_slash (0.06s)
    --- PASS: TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_trailing_slash_after_valid_name (0.07s)
    --- PASS: TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_leading_and_middle_slash (0.06s)
    --- PASS: TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_file_system_style_path (0.06s)
    --- PASS: TestPublishEndpoint_MultipleSlashesEdgeCases/invalid_-_version-like_suffix (0.07s)
=== RUN   TestListServersEndpoint
2025/10/24 22:50:54 No pending migrations
=== RUN   TestListServersEndpoint/list_all_servers
=== RUN   TestListServersEndpoint/list_with_limit
=== RUN   TestListServersEndpoint/search_servers
=== RUN   TestListServersEndpoint/filter_latest_only
=== RUN   TestListServersEndpoint/invalid_limit
--- PASS: TestListServersEndpoint (0.07s)
    --- PASS: TestListServersEndpoint/list_all_servers (0.00s)
    --- PASS: TestListServersEndpoint/list_with_limit (0.00s)
    --- PASS: TestListServersEndpoint/search_servers (0.00s)
    --- PASS: TestListServersEndpoint/filter_latest_only (0.00s)
    --- PASS: TestListServersEndpoint/invalid_limit (0.00s)
=== RUN   TestGetLatestServerVersionEndpoint
2025/10/24 22:50:54 No pending migrations
=== RUN   TestGetLatestServerVersionEndpoint/get_existing_server_latest_version
=== RUN   TestGetLatestServerVersionEndpoint/get_non-existent_server
--- PASS: TestGetLatestServerVersionEndpoint (0.06s)
    --- PASS: TestGetLatestServerVersionEndpoint/get_existing_server_latest_version (0.00s)
    --- PASS: TestGetLatestServerVersionEndpoint/get_non-existent_server (0.00s)
=== RUN   TestGetServerVersionEndpoint
2025/10/24 22:50:54 No pending migrations
=== RUN   TestGetServerVersionEndpoint/get_existing_version
=== RUN   TestGetServerVersionEndpoint/get_latest_version
=== RUN   TestGetServerVersionEndpoint/get_non-existent_version
=== RUN   TestGetServerVersionEndpoint/get_non-existent_server
=== RUN   TestGetServerVersionEndpoint/get_version_with_build_metadata_(URL_encoded)
--- PASS: TestGetServerVersionEndpoint (0.06s)
    --- PASS: TestGetServerVersionEndpoint/get_existing_version (0.00s)
    --- PASS: TestGetServerVersionEndpoint/get_latest_version (0.00s)
    --- PASS: TestGetServerVersionEndpoint/get_non-existent_version (0.00s)
    --- PASS: TestGetServerVersionEndpoint/get_non-existent_server (0.00s)
    --- PASS: TestGetServerVersionEndpoint/get_version_with_build_metadata_(URL_encoded) (0.00s)
=== RUN   TestGetAllVersionsEndpoint
2025/10/24 22:50:54 No pending migrations
=== RUN   TestGetAllVersionsEndpoint/get_all_versions_of_existing_server
=== RUN   TestGetAllVersionsEndpoint/get_versions_of_non-existent_server
--- PASS: TestGetAllVersionsEndpoint (0.09s)
    --- PASS: TestGetAllVersionsEndpoint/get_all_versions_of_existing_server (0.00s)
    --- PASS: TestGetAllVersionsEndpoint/get_versions_of_non-existent_server (0.00s)
=== RUN   TestServersEndpointEdgeCases
2025/10/24 22:50:54 No pending migrations
=== RUN   TestServersEndpointEdgeCases/URL_encoding_edge_cases
=== RUN   TestServersEndpointEdgeCases/URL_encoding_edge_cases/dots_and_dashes
=== RUN   TestServersEndpointEdgeCases/URL_encoding_edge_cases/long_server_name
=== RUN   TestServersEndpointEdgeCases/URL_encoding_edge_cases/underscores
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/limit_too_high
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/negative_limit
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/invalid_updated_since_format
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/future_updated_since
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/very_old_updated_since
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/empty_search_parameter
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/search_with_special_characters
=== RUN   TestServersEndpointEdgeCases/query_parameter_edge_cases/combined_valid_parameters
=== RUN   TestServersEndpointEdgeCases/response_structure_validation
--- PASS: TestServersEndpointEdgeCases (0.08s)
    --- PASS: TestServersEndpointEdgeCases/URL_encoding_edge_cases (0.00s)
        --- PASS: TestServersEndpointEdgeCases/URL_encoding_edge_cases/dots_and_dashes (0.00s)
        --- PASS: TestServersEndpointEdgeCases/URL_encoding_edge_cases/long_server_name (0.00s)
        --- PASS: TestServersEndpointEdgeCases/URL_encoding_edge_cases/underscores (0.00s)
    --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/limit_too_high (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/negative_limit (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/invalid_updated_since_format (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/future_updated_since (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/very_old_updated_since (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/empty_search_parameter (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/search_with_special_characters (0.00s)
        --- PASS: TestServersEndpointEdgeCases/query_parameter_edge_cases/combined_valid_parameters (0.00s)
    --- PASS: TestServersEndpointEdgeCases/response_structure_validation (0.00s)
=== RUN   TestPrometheusHandler
2025/10/24 22:50:54 No pending migrations
--- PASS: TestPrometheusHandler (0.07s)
=== RUN   TestVersionEndpoint
=== RUN   TestVersionEndpoint/returns_version_information
=== RUN   TestVersionEndpoint/returns_dev_version_information
--- PASS: TestVersionEndpoint (0.00s)
    --- PASS: TestVersionEndpoint/returns_version_information (0.00s)
    --- PASS: TestVersionEndpoint/returns_dev_version_information (0.00s)
PASS
coverage: 88.7% of statements
ok      github.com/modelcontextprotocol/registry/internal/api/handlers/v0       (cached)        coverage: 88.7% of statements
=== RUN   TestDNSAuthHandler_ExchangeToken
=== RUN   TestDNSAuthHandler_ExchangeToken/successful_authentication
=== RUN   TestDNSAuthHandler_ExchangeToken/multiple_keys
=== RUN   TestDNSAuthHandler_ExchangeToken/invalid_domain_format
=== RUN   TestDNSAuthHandler_ExchangeToken/timestamp_too_old
=== RUN   TestDNSAuthHandler_ExchangeToken/timestamp_too_far_in_the_future
=== RUN   TestDNSAuthHandler_ExchangeToken/DNS_lookup_failure
=== RUN   TestDNSAuthHandler_ExchangeToken/no_MCP_TXT_records
--- PASS: TestDNSAuthHandler_ExchangeToken (0.02s)
    --- PASS: TestDNSAuthHandler_ExchangeToken/successful_authentication (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken/multiple_keys (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken/invalid_domain_format (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken/timestamp_too_old (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken/timestamp_too_far_in_the_future (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken/DNS_lookup_failure (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken/no_MCP_TXT_records (0.00s)
=== RUN   TestDNSAuthHandler_Permissions
=== RUN   TestDNSAuthHandler_Permissions/simple_domain
=== RUN   TestDNSAuthHandler_Permissions/subdomain
=== RUN   TestDNSAuthHandler_Permissions/multi-level_subdomain
=== RUN   TestDNSAuthHandler_Permissions/single_part_domain
=== RUN   TestDNSAuthHandler_Permissions/hyphenated_domain
--- PASS: TestDNSAuthHandler_Permissions (0.01s)
    --- PASS: TestDNSAuthHandler_Permissions/simple_domain (0.00s)
    --- PASS: TestDNSAuthHandler_Permissions/subdomain (0.00s)
    --- PASS: TestDNSAuthHandler_Permissions/multi-level_subdomain (0.00s)
    --- PASS: TestDNSAuthHandler_Permissions/single_part_domain (0.00s)
    --- PASS: TestDNSAuthHandler_Permissions/hyphenated_domain (0.00s)
=== RUN   TestDNSAuthHandler_PermissionValidation
=== RUN   TestDNSAuthHandler_PermissionValidation/exact_domain_resource_with_publish_action
=== RUN   TestDNSAuthHandler_PermissionValidation/subdomain_resource_with_publish_action
=== RUN   TestDNSAuthHandler_PermissionValidation/deep_subdomain_resource_with_publish_action
=== RUN   TestDNSAuthHandler_PermissionValidation/different_domain_should_fail
=== RUN   TestDNSAuthHandler_PermissionValidation/partial_domain_match_should_fail
=== RUN   TestDNSAuthHandler_PermissionValidation/parent_domain_should_fail
=== RUN   TestDNSAuthHandler_PermissionValidation/edit_action_should_fail_(not_granted)
=== RUN   TestDNSAuthHandler_PermissionValidation/resource_without_package_separator_should_fail
--- PASS: TestDNSAuthHandler_PermissionValidation (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/exact_domain_resource_with_publish_action (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/subdomain_resource_with_publish_action (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/deep_subdomain_resource_with_publish_action (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/different_domain_should_fail (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/partial_domain_match_should_fail (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/parent_domain_should_fail (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/edit_action_should_fail_(not_granted) (0.00s)
    --- PASS: TestDNSAuthHandler_PermissionValidation/resource_without_package_separator_should_fail (0.00s)
=== RUN   TestDNSAuthHandler_ExchangeToken_ECDSAP384
=== RUN   TestDNSAuthHandler_ExchangeToken_ECDSAP384/successful_ECDSA_P-384_authentication
=== RUN   TestDNSAuthHandler_ExchangeToken_ECDSAP384/multiple_keys_with_ECDSA_P-384
=== RUN   TestDNSAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_signature_length
=== RUN   TestDNSAuthHandler_ExchangeToken_ECDSAP384/wrong_ECDSA_P-384_key_for_signature
=== RUN   TestDNSAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_format
=== RUN   TestDNSAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_compression_format
--- PASS: TestDNSAuthHandler_ExchangeToken_ECDSAP384 (0.04s)
    --- PASS: TestDNSAuthHandler_ExchangeToken_ECDSAP384/successful_ECDSA_P-384_authentication (0.01s)
    --- PASS: TestDNSAuthHandler_ExchangeToken_ECDSAP384/multiple_keys_with_ECDSA_P-384 (0.01s)
    --- PASS: TestDNSAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_signature_length (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken_ECDSAP384/wrong_ECDSA_P-384_key_for_signature (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_format (0.00s)
    --- PASS: TestDNSAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_compression_format (0.00s)
=== RUN   TestDNSAuthHandler_ECDSAP384_Permissions
=== RUN   TestDNSAuthHandler_ECDSAP384_Permissions/simple_domain_with_ECDSA_P-384
=== RUN   TestDNSAuthHandler_ECDSAP384_Permissions/subdomain_with_ECDSA_P-384
--- PASS: TestDNSAuthHandler_ECDSAP384_Permissions (0.02s)
    --- PASS: TestDNSAuthHandler_ECDSAP384_Permissions/simple_domain_with_ECDSA_P-384 (0.01s)
    --- PASS: TestDNSAuthHandler_ECDSAP384_Permissions/subdomain_with_ECDSA_P-384 (0.01s)
=== RUN   TestDNSAuthHandler_ECDSAP384_PermissionValidation
=== RUN   TestDNSAuthHandler_ECDSAP384_PermissionValidation/exact_domain_resource_with_publish_action
=== RUN   TestDNSAuthHandler_ECDSAP384_PermissionValidation/subdomain_resource_with_publish_action
=== RUN   TestDNSAuthHandler_ECDSAP384_PermissionValidation/deep_subdomain_resource_with_publish_action
=== RUN   TestDNSAuthHandler_ECDSAP384_PermissionValidation/different_domain_should_fail
=== RUN   TestDNSAuthHandler_ECDSAP384_PermissionValidation/edit_action_should_fail_(not_granted)
--- PASS: TestDNSAuthHandler_ECDSAP384_PermissionValidation (0.01s)
    --- PASS: TestDNSAuthHandler_ECDSAP384_PermissionValidation/exact_domain_resource_with_publish_action (0.00s)
    --- PASS: TestDNSAuthHandler_ECDSAP384_PermissionValidation/subdomain_resource_with_publish_action (0.00s)
    --- PASS: TestDNSAuthHandler_ECDSAP384_PermissionValidation/deep_subdomain_resource_with_publish_action (0.00s)
    --- PASS: TestDNSAuthHandler_ECDSAP384_PermissionValidation/different_domain_should_fail (0.00s)
    --- PASS: TestDNSAuthHandler_ECDSAP384_PermissionValidation/edit_action_should_fail_(not_granted) (0.00s)
=== RUN   TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence
=== RUN   TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_example.com
=== RUN   TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_api.example.com
=== RUN   TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_v1.api.example.com
--- PASS: TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence (0.04s)
    --- PASS: TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_example.com (0.01s)
    --- PASS: TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_api.example.com (0.01s)
    --- PASS: TestDNSAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_v1.api.example.com (0.01s)
=== RUN   TestDNSAuthHandler_Mixed_Algorithm_Support
=== RUN   TestDNSAuthHandler_Mixed_Algorithm_Support/multiple_algorithms_in_dns
=== RUN   TestDNSAuthHandler_Mixed_Algorithm_Support/wrong_signature_for_algorithm
--- PASS: TestDNSAuthHandler_Mixed_Algorithm_Support (0.02s)
    --- PASS: TestDNSAuthHandler_Mixed_Algorithm_Support/multiple_algorithms_in_dns (0.01s)
    --- PASS: TestDNSAuthHandler_Mixed_Algorithm_Support/wrong_signature_for_algorithm (0.01s)
=== RUN   TestGitHubHandler_ExchangeToken
=== RUN   TestGitHubHandler_ExchangeToken/successful_token_exchange_with_user_only
=== RUN   TestGitHubHandler_ExchangeToken/successful_token_exchange_with_organizations
=== RUN   TestGitHubHandler_ExchangeToken/invalid_token_returns_error
=== RUN   TestGitHubHandler_ExchangeToken/GitHub_API_error_on_user_fetch
=== RUN   TestGitHubHandler_ExchangeToken/GitHub_API_error_on_orgs_fetch
=== RUN   TestGitHubHandler_ExchangeToken/invalid_GitHub_username_returns_empty_permissions
=== RUN   TestGitHubHandler_ExchangeToken/invalid_org_name_is_filtered_out
=== RUN   TestGitHubHandler_ExchangeToken/malformed_JSON_response
--- PASS: TestGitHubHandler_ExchangeToken (0.02s)
    --- PASS: TestGitHubHandler_ExchangeToken/successful_token_exchange_with_user_only (0.00s)
    --- PASS: TestGitHubHandler_ExchangeToken/successful_token_exchange_with_organizations (0.00s)
    --- PASS: TestGitHubHandler_ExchangeToken/invalid_token_returns_error (0.00s)
    --- PASS: TestGitHubHandler_ExchangeToken/GitHub_API_error_on_user_fetch (0.00s)
    --- PASS: TestGitHubHandler_ExchangeToken/GitHub_API_error_on_orgs_fetch (0.00s)
    --- PASS: TestGitHubHandler_ExchangeToken/invalid_GitHub_username_returns_empty_permissions (0.00s)
    --- PASS: TestGitHubHandler_ExchangeToken/invalid_org_name_is_filtered_out (0.00s)
    --- PASS: TestGitHubHandler_ExchangeToken/malformed_JSON_response (0.00s)
=== RUN   TestJWTTokenValidation
=== RUN   TestJWTTokenValidation/generate_and_validate_token
=== RUN   TestJWTTokenValidation/token_expiration
=== RUN   TestJWTTokenValidation/invalid_signature
--- PASS: TestJWTTokenValidation (0.00s)
    --- PASS: TestJWTTokenValidation/generate_and_validate_token (0.00s)
    --- PASS: TestJWTTokenValidation/token_expiration (0.00s)
    --- PASS: TestJWTTokenValidation/invalid_signature (0.00s)
=== RUN   TestPermissionResourceMatching
=== RUN   TestPermissionResourceMatching/exact_match
=== RUN   TestPermissionResourceMatching/wildcard_match
=== RUN   TestPermissionResourceMatching/global_wildcard
=== RUN   TestPermissionResourceMatching/no_match_different_user
=== RUN   TestPermissionResourceMatching/no_match_different_action
--- PASS: TestPermissionResourceMatching (0.00s)
    --- PASS: TestPermissionResourceMatching/exact_match (0.00s)
    --- PASS: TestPermissionResourceMatching/wildcard_match (0.00s)
    --- PASS: TestPermissionResourceMatching/global_wildcard (0.00s)
    --- PASS: TestPermissionResourceMatching/no_match_different_user (0.00s)
    --- PASS: TestPermissionResourceMatching/no_match_different_action (0.00s)
=== RUN   TestValidGitHubNames
=== RUN   TestValidGitHubNames/valid_username_only
=== RUN   TestValidGitHubNames/valid_username_with_numbers
=== RUN   TestValidGitHubNames/valid_username_with_org
=== RUN   TestValidGitHubNames/invalid_username_with_spaces
=== RUN   TestValidGitHubNames/invalid_username_with_special_chars
=== RUN   TestValidGitHubNames/valid_username_with_invalid_org
--- PASS: TestValidGitHubNames (0.02s)
    --- PASS: TestValidGitHubNames/valid_username_only (0.00s)
    --- PASS: TestValidGitHubNames/valid_username_with_numbers (0.00s)
    --- PASS: TestValidGitHubNames/valid_username_with_org (0.00s)
    --- PASS: TestValidGitHubNames/invalid_username_with_spaces (0.00s)
    --- PASS: TestValidGitHubNames/invalid_username_with_special_chars (0.00s)
    --- PASS: TestValidGitHubNames/valid_username_with_invalid_org (0.00s)
=== RUN   TestGitHubHandler_Creation
--- PASS: TestGitHubHandler_Creation (0.00s)
=== RUN   TestConcurrentTokenExchange
--- PASS: TestConcurrentTokenExchange (0.01s)
=== RUN   TestGitHubOIDCHandler_ExchangeToken
=== RUN   TestGitHubOIDCHandler_ExchangeToken/successful_token_exchange
=== RUN   TestGitHubOIDCHandler_ExchangeToken/validation_failure
=== RUN   TestGitHubOIDCHandler_ExchangeToken/invalid_repository_owner_name
--- PASS: TestGitHubOIDCHandler_ExchangeToken (0.00s)
    --- PASS: TestGitHubOIDCHandler_ExchangeToken/successful_token_exchange (0.00s)
    --- PASS: TestGitHubOIDCHandler_ExchangeToken/validation_failure (0.00s)
    --- PASS: TestGitHubOIDCHandler_ExchangeToken/invalid_repository_owner_name (0.00s)
=== RUN   TestBuildPermissionsFromOIDC
=== RUN   TestBuildPermissionsFromOIDC/valid_repository_owner
=== RUN   TestBuildPermissionsFromOIDC/invalid_repository_owner_name
=== RUN   TestBuildPermissionsFromOIDC/user_repository
--- PASS: TestBuildPermissionsFromOIDC (0.00s)
    --- PASS: TestBuildPermissionsFromOIDC/valid_repository_owner (0.00s)
    --- PASS: TestBuildPermissionsFromOIDC/invalid_repository_owner_name (0.00s)
    --- PASS: TestBuildPermissionsFromOIDC/user_repository (0.00s)
=== RUN   TestHTTPAuthHandler_ExchangeToken
=== RUN   TestHTTPAuthHandler_ExchangeToken/successful_authentication
=== RUN   TestHTTPAuthHandler_ExchangeToken/invalid_domain_format
=== RUN   TestHTTPAuthHandler_ExchangeToken/invalid_timestamp_format
=== RUN   TestHTTPAuthHandler_ExchangeToken/timestamp_too_old
=== RUN   TestHTTPAuthHandler_ExchangeToken/timestamp_too_far_in_the_future
=== RUN   TestHTTPAuthHandler_ExchangeToken/invalid_signature_format
=== RUN   TestHTTPAuthHandler_ExchangeToken/signature_wrong_length
=== RUN   TestHTTPAuthHandler_ExchangeToken/HTTP_key_fetch_failure
=== RUN   TestHTTPAuthHandler_ExchangeToken/invalid_key_format
=== RUN   TestHTTPAuthHandler_ExchangeToken/invalid_base64_key
=== RUN   TestHTTPAuthHandler_ExchangeToken/wrong_key_size
=== RUN   TestHTTPAuthHandler_ExchangeToken/signature_verification_failure
--- PASS: TestHTTPAuthHandler_ExchangeToken (0.01s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/successful_authentication (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/invalid_domain_format (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/invalid_timestamp_format (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/timestamp_too_old (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/timestamp_too_far_in_the_future (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/invalid_signature_format (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/signature_wrong_length (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/HTTP_key_fetch_failure (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/invalid_key_format (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/invalid_base64_key (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/wrong_key_size (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken/signature_verification_failure (0.00s)
=== RUN   TestDefaultHTTPKeyFetcher_FetchKey
--- PASS: TestDefaultHTTPKeyFetcher_FetchKey (0.03s)
=== RUN   TestDefaultHTTPKeyFetcher
=== RUN   TestDefaultHTTPKeyFetcher/oversized_body
=== RUN   TestDefaultHTTPKeyFetcher/non-OK_status
=== RUN   TestDefaultHTTPKeyFetcher/connection_failure
=== RUN   TestDefaultHTTPKeyFetcher/response_body_failure
=== RUN   TestDefaultHTTPKeyFetcher/success
--- PASS: TestDefaultHTTPKeyFetcher (0.03s)
    --- PASS: TestDefaultHTTPKeyFetcher/oversized_body (0.01s)
    --- PASS: TestDefaultHTTPKeyFetcher/non-OK_status (0.01s)
    --- PASS: TestDefaultHTTPKeyFetcher/connection_failure (0.00s)
    --- PASS: TestDefaultHTTPKeyFetcher/response_body_failure (0.01s)
    --- PASS: TestDefaultHTTPKeyFetcher/success (0.01s)
=== RUN   TestHTTPAuthHandler_Permissions
=== RUN   TestHTTPAuthHandler_Permissions/simple_domain
=== RUN   TestHTTPAuthHandler_Permissions/subdomain
=== RUN   TestHTTPAuthHandler_Permissions/multi-level_subdomain
=== RUN   TestHTTPAuthHandler_Permissions/single_part_domain
=== RUN   TestHTTPAuthHandler_Permissions/hyphenated_domain
--- PASS: TestHTTPAuthHandler_Permissions (0.01s)
    --- PASS: TestHTTPAuthHandler_Permissions/simple_domain (0.00s)
    --- PASS: TestHTTPAuthHandler_Permissions/subdomain (0.00s)
    --- PASS: TestHTTPAuthHandler_Permissions/multi-level_subdomain (0.00s)
    --- PASS: TestHTTPAuthHandler_Permissions/single_part_domain (0.00s)
    --- PASS: TestHTTPAuthHandler_Permissions/hyphenated_domain (0.00s)
=== RUN   TestHTTPAuthHandler_PermissionValidation
=== RUN   TestHTTPAuthHandler_PermissionValidation/exact_domain_resource_with_publish_action
=== RUN   TestHTTPAuthHandler_PermissionValidation/subdomain_resource_should_fail_for_HTTP
=== RUN   TestHTTPAuthHandler_PermissionValidation/deep_subdomain_resource_should_fail_for_HTTP
=== RUN   TestHTTPAuthHandler_PermissionValidation/different_domain_should_fail
=== RUN   TestHTTPAuthHandler_PermissionValidation/partial_domain_match_should_fail
=== RUN   TestHTTPAuthHandler_PermissionValidation/parent_domain_should_fail
=== RUN   TestHTTPAuthHandler_PermissionValidation/edit_action_should_fail_(not_granted)
=== RUN   TestHTTPAuthHandler_PermissionValidation/resource_without_package_separator_should_fail
--- PASS: TestHTTPAuthHandler_PermissionValidation (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/exact_domain_resource_with_publish_action (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/subdomain_resource_should_fail_for_HTTP (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/deep_subdomain_resource_should_fail_for_HTTP (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/different_domain_should_fail (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/partial_domain_match_should_fail (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/parent_domain_should_fail (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/edit_action_should_fail_(not_granted) (0.00s)
    --- PASS: TestHTTPAuthHandler_PermissionValidation/resource_without_package_separator_should_fail (0.00s)
=== RUN   TestHTTPvsDNS_PermissionDifferences
=== RUN   TestHTTPvsDNS_PermissionDifferences/exact_domain_resource
=== RUN   TestHTTPvsDNS_PermissionDifferences/subdomain_resource
=== RUN   TestHTTPvsDNS_PermissionDifferences/deep_subdomain_resource
--- PASS: TestHTTPvsDNS_PermissionDifferences (0.01s)
    --- PASS: TestHTTPvsDNS_PermissionDifferences/exact_domain_resource (0.00s)
    --- PASS: TestHTTPvsDNS_PermissionDifferences/subdomain_resource (0.00s)
    --- PASS: TestHTTPvsDNS_PermissionDifferences/deep_subdomain_resource (0.00s)
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/successful_ECDSA_P-384_authentication
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_signature_format
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/ECDSA_P-384_signature_wrong_length
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/HTTP_ECDSA_P-384_key_fetch_failure
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_format
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_base64_ECDSA_P-384_key
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/wrong_ECDSA_P-384_key_size
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/ECDSA_P-384_signature_verification_failure
=== RUN   TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_compression_format
--- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384 (0.03s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/successful_ECDSA_P-384_authentication (0.01s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_signature_format (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/ECDSA_P-384_signature_wrong_length (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/HTTP_ECDSA_P-384_key_fetch_failure (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_format (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_base64_ECDSA_P-384_key (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/wrong_ECDSA_P-384_key_size (0.00s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/ECDSA_P-384_signature_verification_failure (0.01s)
    --- PASS: TestHTTPAuthHandler_ExchangeToken_ECDSAP384/invalid_ECDSA_P-384_key_compression_format (0.00s)
=== RUN   TestHTTPAuthHandler_ECDSAP384_Permissions
=== RUN   TestHTTPAuthHandler_ECDSAP384_Permissions/simple_domain_with_ECDSA_P-384
=== RUN   TestHTTPAuthHandler_ECDSAP384_Permissions/subdomain_with_ECDSA_P-384
=== RUN   TestHTTPAuthHandler_ECDSAP384_Permissions/hyphenated_domain_with_ECDSA_P-384
--- PASS: TestHTTPAuthHandler_ECDSAP384_Permissions (0.03s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_Permissions/simple_domain_with_ECDSA_P-384 (0.01s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_Permissions/subdomain_with_ECDSA_P-384 (0.01s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_Permissions/hyphenated_domain_with_ECDSA_P-384 (0.01s)
=== RUN   TestHTTPAuthHandler_ECDSAP384_PermissionValidation
=== RUN   TestHTTPAuthHandler_ECDSAP384_PermissionValidation/exact_domain_resource_with_publish_action
=== RUN   TestHTTPAuthHandler_ECDSAP384_PermissionValidation/subdomain_resource_should_fail_for_HTTP
=== RUN   TestHTTPAuthHandler_ECDSAP384_PermissionValidation/deep_subdomain_resource_should_fail_for_HTTP
=== RUN   TestHTTPAuthHandler_ECDSAP384_PermissionValidation/different_domain_should_fail
=== RUN   TestHTTPAuthHandler_ECDSAP384_PermissionValidation/edit_action_should_fail_(not_granted)
--- PASS: TestHTTPAuthHandler_ECDSAP384_PermissionValidation (0.01s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_PermissionValidation/exact_domain_resource_with_publish_action (0.00s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_PermissionValidation/subdomain_resource_should_fail_for_HTTP (0.00s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_PermissionValidation/deep_subdomain_resource_should_fail_for_HTTP (0.00s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_PermissionValidation/different_domain_should_fail (0.00s)
    --- PASS: TestHTTPAuthHandler_ECDSAP384_PermissionValidation/edit_action_should_fail_(not_granted) (0.00s)
=== RUN   TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence
=== RUN   TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_example.com
=== RUN   TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_api.example.com
=== RUN   TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_v1.api.example.com
--- PASS: TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence (0.03s)
    --- PASS: TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_example.com (0.01s)
    --- PASS: TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_api.example.com (0.01s)
    --- PASS: TestHTTPAuthHandler_Ed25519_vs_ECDSAP384_Equivalence/domain_v1.api.example.com (0.01s)
=== RUN   TestHTTPAuthHandler_Algorithm_Support
=== RUN   TestHTTPAuthHandler_Algorithm_Support/single_ed25519_key
=== RUN   TestHTTPAuthHandler_Algorithm_Support/single_ecdsa_p384_key
=== RUN   TestHTTPAuthHandler_Algorithm_Support/http_response_with_extra_content
=== RUN   TestHTTPAuthHandler_Algorithm_Support/wrong_signature_for_single_key
--- PASS: TestHTTPAuthHandler_Algorithm_Support (0.01s)
    --- PASS: TestHTTPAuthHandler_Algorithm_Support/single_ed25519_key (0.00s)
    --- PASS: TestHTTPAuthHandler_Algorithm_Support/single_ecdsa_p384_key (0.01s)
    --- PASS: TestHTTPAuthHandler_Algorithm_Support/http_response_with_extra_content (0.00s)
    --- PASS: TestHTTPAuthHandler_Algorithm_Support/wrong_signature_for_single_key (0.00s)
=== RUN   TestNoneHandler_GetAnonymousToken
--- PASS: TestNoneHandler_GetAnonymousToken (0.00s)
=== RUN   TestOIDCHandler_ExchangeToken
=== RUN   TestOIDCHandler_ExchangeToken/successful_token_exchange_with_publish_permissions
=== RUN   TestOIDCHandler_ExchangeToken/failed_validation_with_invalid_hosted_domain
--- PASS: TestOIDCHandler_ExchangeToken (0.17s)
    --- PASS: TestOIDCHandler_ExchangeToken/successful_token_exchange_with_publish_permissions (0.13s)
    --- PASS: TestOIDCHandler_ExchangeToken/failed_validation_with_invalid_hosted_domain (0.04s)
PASS
coverage: 62.1% of statements
ok      github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth  (cached)        coverage: 62.1% of statements
        github.com/modelcontextprotocol/registry/internal/api/router            coverage: 0.0% of statements
=== RUN   TestJWTManager_GenerateAndVerifyToken
=== RUN   TestJWTManager_GenerateAndVerifyToken/generate_and_verify_valid_token
=== RUN   TestJWTManager_GenerateAndVerifyToken/token_with_custom_claims
=== RUN   TestJWTManager_GenerateAndVerifyToken/expired_token_should_fail_validation
=== RUN   TestJWTManager_GenerateAndVerifyToken/invalid_token_signature_should_fail
=== RUN   TestJWTManager_GenerateAndVerifyToken/malformed_token_should_fail
=== RUN   TestJWTManager_GenerateAndVerifyToken/multiple_permissions
--- PASS: TestJWTManager_GenerateAndVerifyToken (0.01s)
    --- PASS: TestJWTManager_GenerateAndVerifyToken/generate_and_verify_valid_token (0.00s)
    --- PASS: TestJWTManager_GenerateAndVerifyToken/token_with_custom_claims (0.00s)
    --- PASS: TestJWTManager_GenerateAndVerifyToken/expired_token_should_fail_validation (0.00s)
    --- PASS: TestJWTManager_GenerateAndVerifyToken/invalid_token_signature_should_fail (0.00s)
    --- PASS: TestJWTManager_GenerateAndVerifyToken/malformed_token_should_fail (0.00s)
    --- PASS: TestJWTManager_GenerateAndVerifyToken/multiple_permissions (0.00s)
=== RUN   TestJWTManager_HasPermission
=== RUN   TestJWTManager_HasPermission/exact_match
=== RUN   TestJWTManager_HasPermission/wildcard_match
=== RUN   TestJWTManager_HasPermission/global_wildcard
=== RUN   TestJWTManager_HasPermission/wrong_action
=== RUN   TestJWTManager_HasPermission/no_match
=== RUN   TestJWTManager_HasPermission/multiple_permissions_with_match
=== RUN   TestJWTManager_HasPermission/empty_permissions
--- PASS: TestJWTManager_HasPermission (0.00s)
    --- PASS: TestJWTManager_HasPermission/exact_match (0.00s)
    --- PASS: TestJWTManager_HasPermission/wildcard_match (0.00s)
    --- PASS: TestJWTManager_HasPermission/global_wildcard (0.00s)
    --- PASS: TestJWTManager_HasPermission/wrong_action (0.00s)
    --- PASS: TestJWTManager_HasPermission/no_match (0.00s)
    --- PASS: TestJWTManager_HasPermission/multiple_permissions_with_match (0.00s)
    --- PASS: TestJWTManager_HasPermission/empty_permissions (0.00s)
=== RUN   TestNewJWTManager_InvalidKeySize
--- PASS: TestNewJWTManager_InvalidKeySize (0.00s)
=== RUN   TestJWTManager_BlockedNamespaces
=== RUN   TestJWTManager_BlockedNamespaces/blocked_namespace_should_deny_token
=== RUN   TestJWTManager_BlockedNamespaces/non-blocked_namespace_should_allow_token
=== RUN   TestJWTManager_BlockedNamespaces/multiple_permissions_with_one_blocked_should_deny_token
=== RUN   TestJWTManager_BlockedNamespaces/global_admin_permissions_should_bypass_denylist
--- PASS: TestJWTManager_BlockedNamespaces (0.00s)
    --- PASS: TestJWTManager_BlockedNamespaces/blocked_namespace_should_deny_token (0.00s)
    --- PASS: TestJWTManager_BlockedNamespaces/non-blocked_namespace_should_allow_token (0.00s)
    --- PASS: TestJWTManager_BlockedNamespaces/multiple_permissions_with_one_blocked_should_deny_token (0.00s)
    --- PASS: TestJWTManager_BlockedNamespaces/global_admin_permissions_should_bypass_denylist (0.00s)
PASS
coverage: 91.8% of statements
ok      github.com/modelcontextprotocol/registry/internal/auth  (cached)        coverage: 91.8% of statements
        github.com/modelcontextprotocol/registry/internal/config                coverage: 0.0% of statements
=== RUN   TestPostgreSQL_CreateServer
2025/10/24 10:41:29 No pending migrations
=== RUN   TestPostgreSQL_CreateServer/successful_server_creation
=== RUN   TestPostgreSQL_CreateServer/duplicate_server_version_should_fail
--- PASS: TestPostgreSQL_CreateServer (0.08s)
    --- PASS: TestPostgreSQL_CreateServer/successful_server_creation (0.00s)
    --- PASS: TestPostgreSQL_CreateServer/duplicate_server_version_should_fail (0.00s)
=== RUN   TestPostgreSQL_GetServerByName
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_GetServerByName/get_existing_server
=== RUN   TestPostgreSQL_GetServerByName/get_non-existent_server
--- PASS: TestPostgreSQL_GetServerByName (0.06s)
    --- PASS: TestPostgreSQL_GetServerByName/get_existing_server (0.00s)
    --- PASS: TestPostgreSQL_GetServerByName/get_non-existent_server (0.00s)
=== RUN   TestPostgreSQL_GetServerByNameAndVersion
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_GetServerByNameAndVersion/get_existing_server_version
=== RUN   TestPostgreSQL_GetServerByNameAndVersion/get_non-existent_version
=== RUN   TestPostgreSQL_GetServerByNameAndVersion/get_non-existent_server
--- PASS: TestPostgreSQL_GetServerByNameAndVersion (0.06s)
    --- PASS: TestPostgreSQL_GetServerByNameAndVersion/get_existing_server_version (0.00s)
    --- PASS: TestPostgreSQL_GetServerByNameAndVersion/get_non-existent_version (0.00s)
    --- PASS: TestPostgreSQL_GetServerByNameAndVersion/get_non-existent_server (0.00s)
=== RUN   TestPostgreSQL_ListServers
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_ListServers/list_all_servers
=== RUN   TestPostgreSQL_ListServers/filter_by_name
=== RUN   TestPostgreSQL_ListServers/filter_by_remote_URL
=== RUN   TestPostgreSQL_ListServers/filter_by_substring_name
=== RUN   TestPostgreSQL_ListServers/filter_by_version
=== RUN   TestPostgreSQL_ListServers/filter_by_isLatest
=== RUN   TestPostgreSQL_ListServers/filter_by_updatedSince
=== RUN   TestPostgreSQL_ListServers/test_pagination_with_limit
=== RUN   TestPostgreSQL_ListServers/test_cursor_pagination
--- PASS: TestPostgreSQL_ListServers (0.08s)
    --- PASS: TestPostgreSQL_ListServers/list_all_servers (0.00s)
    --- PASS: TestPostgreSQL_ListServers/filter_by_name (0.00s)
    --- PASS: TestPostgreSQL_ListServers/filter_by_remote_URL (0.00s)
    --- PASS: TestPostgreSQL_ListServers/filter_by_substring_name (0.00s)
    --- PASS: TestPostgreSQL_ListServers/filter_by_version (0.00s)
    --- PASS: TestPostgreSQL_ListServers/filter_by_isLatest (0.00s)
    --- PASS: TestPostgreSQL_ListServers/filter_by_updatedSince (0.00s)
    --- PASS: TestPostgreSQL_ListServers/test_pagination_with_limit (0.00s)
    --- PASS: TestPostgreSQL_ListServers/test_cursor_pagination (0.00s)
=== RUN   TestPostgreSQL_UpdateServer
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_UpdateServer/successful_server_update
=== RUN   TestPostgreSQL_UpdateServer/update_non-existent_server
--- PASS: TestPostgreSQL_UpdateServer (0.06s)
    --- PASS: TestPostgreSQL_UpdateServer/successful_server_update (0.00s)
    --- PASS: TestPostgreSQL_UpdateServer/update_non-existent_server (0.00s)
=== RUN   TestPostgreSQL_SetServerStatus
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_SetServerStatus/active_to_deprecated
=== RUN   TestPostgreSQL_SetServerStatus/invalid_status
=== RUN   TestPostgreSQL_SetServerStatus/non-existent_server
--- PASS: TestPostgreSQL_SetServerStatus (0.08s)
    --- PASS: TestPostgreSQL_SetServerStatus/active_to_deprecated (0.00s)
    --- PASS: TestPostgreSQL_SetServerStatus/invalid_status (0.00s)
    --- PASS: TestPostgreSQL_SetServerStatus/non-existent_server (0.00s)
=== RUN   TestPostgreSQL_TransactionHandling
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_TransactionHandling/successful_transaction
=== RUN   TestPostgreSQL_TransactionHandling/failed_transaction_rollback
--- PASS: TestPostgreSQL_TransactionHandling (0.10s)
    --- PASS: TestPostgreSQL_TransactionHandling/successful_transaction (0.01s)
    --- PASS: TestPostgreSQL_TransactionHandling/failed_transaction_rollback (0.00s)
=== RUN   TestPostgreSQL_ConcurrencyAndLocking
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_ConcurrencyAndLocking/advisory_locking_prevents_race_conditions
--- PASS: TestPostgreSQL_ConcurrencyAndLocking (0.28s)
    --- PASS: TestPostgreSQL_ConcurrencyAndLocking/advisory_locking_prevents_race_conditions (0.22s)
=== RUN   TestPostgreSQL_HelperMethods
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_HelperMethods/CountServerVersions
=== RUN   TestPostgreSQL_HelperMethods/CheckVersionExists
=== RUN   TestPostgreSQL_HelperMethods/GetCurrentLatestVersion
=== RUN   TestPostgreSQL_HelperMethods/GetAllVersionsByServerName
=== RUN   TestPostgreSQL_HelperMethods/UnmarkAsLatest
--- PASS: TestPostgreSQL_HelperMethods (0.08s)
    --- PASS: TestPostgreSQL_HelperMethods/CountServerVersions (0.00s)
    --- PASS: TestPostgreSQL_HelperMethods/CheckVersionExists (0.00s)
    --- PASS: TestPostgreSQL_HelperMethods/GetCurrentLatestVersion (0.00s)
    --- PASS: TestPostgreSQL_HelperMethods/GetAllVersionsByServerName (0.00s)
    --- PASS: TestPostgreSQL_HelperMethods/UnmarkAsLatest (0.00s)
=== RUN   TestPostgreSQL_EdgeCases
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_EdgeCases/input_validation
=== RUN   TestPostgreSQL_EdgeCases/database_constraints
=== RUN   TestPostgreSQL_EdgeCases/pagination_edge_cases
=== RUN   TestPostgreSQL_EdgeCases/complex_filtering
=== RUN   TestPostgreSQL_EdgeCases/status_transitions
--- PASS: TestPostgreSQL_EdgeCases (0.10s)
    --- PASS: TestPostgreSQL_EdgeCases/input_validation (0.00s)
    --- PASS: TestPostgreSQL_EdgeCases/database_constraints (0.00s)
    --- PASS: TestPostgreSQL_EdgeCases/pagination_edge_cases (0.00s)
    --- PASS: TestPostgreSQL_EdgeCases/complex_filtering (0.00s)
    --- PASS: TestPostgreSQL_EdgeCases/status_transitions (0.00s)
=== RUN   TestPostgreSQL_PerformanceScenarios
2025/10/24 10:41:30 No pending migrations
=== RUN   TestPostgreSQL_PerformanceScenarios/many_versions_management
=== RUN   TestPostgreSQL_PerformanceScenarios/large_result_pagination
--- PASS: TestPostgreSQL_PerformanceScenarios (0.22s)
    --- PASS: TestPostgreSQL_PerformanceScenarios/many_versions_management (0.08s)
    --- PASS: TestPostgreSQL_PerformanceScenarios/large_result_pagination (0.07s)
...
PASS
coverage: 64.1% of statements
ok      github.com/modelcontextprotocol/registry/internal/validators/registries (cached)        coverage: 64.1% of statements
        github.com/modelcontextprotocol/registry/cmd/publisher          coverage: 0.0% of statements
        github.com/modelcontextprotocol/registry/cmd/publisher/auth             coverage: 0.0% of statements
=== RUN   TestPublishCommand_DeprecatedSchema
=== RUN   TestPublishCommand_DeprecatedSchema/deprecated_2025-07-09_schema_should_show_warning
=== RUN   TestPublishCommand_DeprecatedSchema/current_2025-10-17_schema_should_pass_validation
=== RUN   TestPublishCommand_DeprecatedSchema/empty_schema_should_pass_validation
=== RUN   TestPublishCommand_DeprecatedSchema/custom_schema_without_2025-07-09_should_pass_validation
--- PASS: TestPublishCommand_DeprecatedSchema (0.00s)
    --- PASS: TestPublishCommand_DeprecatedSchema/deprecated_2025-07-09_schema_should_show_warning (0.00s)
    --- PASS: TestPublishCommand_DeprecatedSchema/current_2025-10-17_schema_should_pass_validation (0.00s)
    --- PASS: TestPublishCommand_DeprecatedSchema/empty_schema_should_pass_validation (0.00s)
    --- PASS: TestPublishCommand_DeprecatedSchema/custom_schema_without_2025-07-09_should_pass_validation (0.00s)
PASS
coverage: 5.8% of statements
ok      github.com/modelcontextprotocol/registry/cmd/publisher/commands 1.299s  coverage: 5.8% of statements
        github.com/modelcontextprotocol/registry/cmd/registry           coverage: 0.0% of statements
go tool cover -html=coverage.out -o coverage.html
Coverage report generated: coverage.html
Stopping PostgreSQL...
[+] Running 2/2
 ✔ Container postgres        Removed                                                                       0.1s 
 ✔ Network registry_default  Removed                                                                       0.2s 

Breaking Changes

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@docker compose down postgres >/dev/null 2>&1
@echo "✅ Tests complete"

test-unit-verbose: ## Run unit tests with verbose output
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tbh I'd be fine just removing this completely

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, let's do that 👍

@claude - can you take care of that and file a PR to remove this target

Copy link
Contributor

@claude claude bot Oct 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude encountered an error —— View job


I'll analyze this and get back to you.

Copy link
Member

@domdomegg domdomegg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@rdimitrov rdimitrov merged commit 237758b into main Oct 27, 2025
11 of 12 checks passed
@rdimitrov rdimitrov deleted the less-verbose-test-output branch October 27, 2025 16:25
rdimitrov added a commit that referenced this pull request Oct 28, 2025
<!-- Provide a brief summary of your changes -->

## Motivation and Context
<!-- Why is this change needed? What problem does it solve? -->
As per @domdomegg's comment -
#713 (comment)
## How Has This Been Tested?
<!-- Have you tested this in a real application? Which scenarios were
tested? -->

## Breaking Changes
<!-- Will users need to update their code or configurations? -->

## Types of changes
<!-- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update

## Checklist
<!-- Go over all the following points, and put an `x` in all the boxes
that apply. -->
- [ ] I have read the [MCP
Documentation](https://modelcontextprotocol.io)
- [ ] My code follows the repository's style guidelines
- [ ] New and existing tests pass locally
- [ ] I have added appropriate error handling
- [ ] I have added or updated documentation as needed

## Additional context
<!-- Add any other context, implementation notes, or design decisions
-->

Signed-off-by: Radoslav Dimitrov <radoslav@stacklok.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants