Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d97db44
Add discriminated union to Package schema for canonical references
rdimitrov Oct 8, 2025
90a363c
Make transport required in Package struct to match schema
rdimitrov Oct 8, 2025
e7159e6
Update OCI validator to support canonical image references with diges…
rdimitrov Oct 8, 2025
3923da9
Regenerate server.schema.json with discriminated union for packages
rdimitrov Oct 8, 2025
00554ea
Update OCI validator tests to use canonical references
rdimitrov Oct 8, 2025
8209174
Add implementation summary for canonical package references
rdimitrov Oct 8, 2025
46d10ef
Clarify database data migration requirement
rdimitrov Oct 8, 2025
6534597
Add database migration for canonical package references
rdimitrov Oct 8, 2025
803b35c
Convert seed data to canonical package format
rdimitrov Oct 8, 2025
4636b97
Update implementation summary with completed phases
rdimitrov Oct 8, 2025
252714b
Update publisher CLI to generate canonical OCI references
rdimitrov Oct 8, 2025
89b8bad
Update OCI package examples to use canonical references
rdimitrov Oct 8, 2025
9004288
Mark implementation as complete in summary
rdimitrov Oct 8, 2025
7bf9672
Add validation to reject old OCI package format
rdimitrov Oct 8, 2025
5123d11
Add validation to reject extra fields in MCPB packages
rdimitrov Oct 8, 2025
26e31d9
Add validation to reject fileSha256 in non-MCPB packages
rdimitrov Oct 8, 2025
b6f12cb
Fix linting errors and unit tests
rdimitrov Oct 8, 2025
1c81e60
Update the migration to handle the MCPB changes too
rdimitrov Oct 8, 2025
b6a47f7
Update the migration to remove fileSha256 properties
rdimitrov Oct 8, 2025
7c0bbf2
Streamline schema changes from type per package to flavors
rdimitrov Oct 10, 2025
fe2cdf5
Make schema types looser
rdimitrov Oct 10, 2025
dd2a68a
Revert the openapi schema to main
rdimitrov Oct 10, 2025
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
75 changes: 51 additions & 24 deletions cmd/publisher/commands/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,36 +267,63 @@ func createServerJSON(
packageType, packageIdentifier, packageVersion string,
envVars []model.KeyValueInput,
) apiv0.ServerJSON {
// Determine registry type and base URL
var registryType, registryBaseURL string
// Create package based on type
var pkg model.Package

switch packageType {
case model.RegistryTypeNPM:
registryType = model.RegistryTypeNPM
registryBaseURL = model.RegistryURLNPM
pkg = model.Package{
Copy link
Member

Choose a reason for hiding this comment

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

[can be a follow up PR if you agree] I feel like we should use the "flavors" of Package types internally, and just map each of them to a "list of supported registry types" that can be expanded over time as support is added for more registry types. Instead of bespoke recreating each of the flavors on a per-type basis from Package in this switch statement.

RegistryType: model.RegistryTypeNPM,
Identifier: packageIdentifier,
Version: packageVersion,
EnvironmentVariables: envVars,
Transport: model.Transport{
Type: model.TransportTypeStdio,
},
}
case model.RegistryTypePyPI:
registryType = model.RegistryTypePyPI
registryBaseURL = model.RegistryURLPyPI
pkg = model.Package{
RegistryType: model.RegistryTypePyPI,
Identifier: packageIdentifier,
Version: packageVersion,
EnvironmentVariables: envVars,
Transport: model.Transport{
Type: model.TransportTypeStdio,
},
}
case model.RegistryTypeOCI:
registryType = model.RegistryTypeOCI
registryBaseURL = model.RegistryURLDocker
// OCI packages use canonical references: registry/namespace/image:tag
// Format: docker.io/username/image:version
canonicalRef := fmt.Sprintf("docker.io/%s:%s", packageIdentifier, packageVersion)
pkg = model.Package{
RegistryType: model.RegistryTypeOCI,
Identifier: canonicalRef,
// No Version field for OCI - it's embedded in the canonical reference
EnvironmentVariables: envVars,
Transport: model.Transport{
Type: model.TransportTypeStdio,
},
}
case "url":
registryType = "url"
registryBaseURL = ""
pkg = model.Package{
RegistryType: "url",
Identifier: packageIdentifier,
Version: packageVersion,
EnvironmentVariables: envVars,
Transport: model.Transport{
Type: model.TransportTypeStdio,
},
}
default:
registryType = packageType
registryBaseURL = ""
}

// Create package
pkg := model.Package{
RegistryType: registryType,
RegistryBaseURL: registryBaseURL,
Identifier: packageIdentifier,
Version: packageVersion,
EnvironmentVariables: envVars,
Transport: model.Transport{
Type: model.TransportTypeStdio,
},
pkg = model.Package{
RegistryType: packageType,
Identifier: packageIdentifier,
Version: packageVersion,
EnvironmentVariables: envVars,
Transport: model.Transport{
Type: model.TransportTypeStdio,
},
}
}

// Create server structure
Expand Down
12 changes: 5 additions & 7 deletions data/seed.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
{
"src": "https://airtable.com/images/favicon/favicon-32x32.png",
"mimeType": "image/png",
"sizes": ["32x32"]
"sizes": [
"32x32"
]
}
],
"packages": [
Expand All @@ -35,8 +37,7 @@
},
{
"registryType": "oci",
"identifier": "domdomegg/airtable-mcp-server",
"version": "1.7.2",
"identifier": "docker.io/domdomegg/airtable-mcp-server:1.7.2",
"runtimeHint": "docker",
"transport": {
"type": "stdio"
Expand All @@ -53,7 +54,6 @@
{
"registryType": "mcpb",
"identifier": "https://github.com/domdomegg/airtable-mcp-server/releases/download/v1.7.2/airtable-mcp-server.mcpb",
"version": "1.7.2",
"fileSha256": "8220de07a08ebe908f04da139ea03dbfe29758141347e945da60535fb7bcca20",
"transport": {
"type": "stdio"
Expand Down Expand Up @@ -90,8 +90,7 @@
},
{
"registryType": "oci",
"identifier": "domdomegg/airtable-mcp-server",
"version": "1.7.3",
"identifier": "docker.io/domdomegg/airtable-mcp-server:1.7.3",
"runtimeHint": "docker",
"transport": {
"type": "stdio"
Expand All @@ -108,7 +107,6 @@
{
"registryType": "mcpb",
"identifier": "https://github.com/domdomegg/airtable-mcp-server/releases/download/v1.7.3/airtable-mcp-server.mcpb",
"version": "1.7.3",
"fileSha256": "0f28a9129cfebd262dfb77854c872355d21401bb3e056575b3027081f5d570ca",
"transport": {
"type": "stdio"
Expand Down
1 change: 0 additions & 1 deletion docs/reference/api/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,6 @@ components:
required:
- registryType
- identifier
- version
- transport
properties:
registryType:
Expand Down
10 changes: 2 additions & 8 deletions docs/reference/server-json/generic-server-json.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,9 +191,7 @@ This will essentially instruct the MCP client to execute `dnx Knapcode.SampleMcp
},
{
"registryType": "oci",
"registryBaseUrl": "https://docker.io",
"identifier": "mcp/filesystem",
"version": "1.0.2",
"identifier": "docker.io/mcp/filesystem:1.0.2",
"transport": {
"type": "stdio"
},
Expand Down Expand Up @@ -405,9 +403,7 @@ The `dnx` tool ships with the .NET 10 SDK, starting with Preview 6.
"packages": [
{
"registryType": "oci",
"registryBaseUrl": "https://docker.io",
"identifier": "example/database-manager-mcp",
"version": "3.1.0",
"identifier": "docker.io/example/database-manager-mcp:3.1.0",
"transport": {
"type": "stdio"
},
Expand Down Expand Up @@ -602,9 +598,7 @@ The `dnx` tool ships with the .NET 10 SDK, starting with Preview 6.
"packages": [
{
"registryType": "mcpb",
"registryBaseUrl": "https://github.com",
"identifier": "https://github.com/modelcontextprotocol/text-editor-mcpb/releases/download/v1.0.2/text-editor.mcpb",
"version": "1.0.2",
"fileSha256": "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
"transport": {
"type": "stdio"
Expand Down
1 change: 0 additions & 1 deletion docs/reference/server-json/server.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,6 @@
"required": [
"registryType",
"identifier",
"version",
"transport"
],
"type": "object"
Expand Down
3 changes: 0 additions & 3 deletions internal/api/handlers/v0/publish_registry_validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ func TestPublishRegistryValidation(t *testing.T) {
{
RegistryType: model.RegistryTypeMCPB,
Identifier: "https://github.com/microsoft/playwright-mcp/releases/download/v0.0.36/playwright-mcp-extension-v0.0.36.zip",
Version: "0.0.36",
FileSHA256: "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
Transport: model.Transport{
Type: model.TransportTypeStdio,
Expand Down Expand Up @@ -146,7 +145,6 @@ func TestPublishRegistryValidation(t *testing.T) {
{
RegistryType: model.RegistryTypeMCPB,
Identifier: "https://github.com/microsoft/playwright-mcp/releases/download/v0.0.36/playwright-mcp-extension-v0.0.36.zip",
Version: "1.0.0",
FileSHA256: "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
Transport: model.Transport{
Type: model.TransportTypeStdio,
Expand Down Expand Up @@ -206,7 +204,6 @@ func TestPublishRegistryValidation(t *testing.T) {
{
RegistryType: model.RegistryTypeMCPB,
Identifier: "https://github.com/microsoft/playwright-mcp/releases/download/v0.0.36/playwright-mcp-extension-v0.0.36.zip",
Version: "1.0.0",
FileSHA256: "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
Transport: model.Transport{
Type: model.TransportTypeStdio,
Expand Down
Loading
Loading