Skip to content

Commit 632cbce

Browse files
authored
Refactor package types to use dedicated schema types per package type (NPM, PyPI, NuGet, OCI, MCPB) (#634)
1 parent 5055c79 commit 632cbce

File tree

18 files changed

+883
-146
lines changed

18 files changed

+883
-146
lines changed

cmd/publisher/commands/init.go

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -267,36 +267,63 @@ func createServerJSON(
267267
packageType, packageIdentifier, packageVersion string,
268268
envVars []model.KeyValueInput,
269269
) apiv0.ServerJSON {
270-
// Determine registry type and base URL
271-
var registryType, registryBaseURL string
270+
// Create package based on type
271+
var pkg model.Package
272+
272273
switch packageType {
273274
case model.RegistryTypeNPM:
274-
registryType = model.RegistryTypeNPM
275-
registryBaseURL = model.RegistryURLNPM
275+
pkg = model.Package{
276+
RegistryType: model.RegistryTypeNPM,
277+
Identifier: packageIdentifier,
278+
Version: packageVersion,
279+
EnvironmentVariables: envVars,
280+
Transport: model.Transport{
281+
Type: model.TransportTypeStdio,
282+
},
283+
}
276284
case model.RegistryTypePyPI:
277-
registryType = model.RegistryTypePyPI
278-
registryBaseURL = model.RegistryURLPyPI
285+
pkg = model.Package{
286+
RegistryType: model.RegistryTypePyPI,
287+
Identifier: packageIdentifier,
288+
Version: packageVersion,
289+
EnvironmentVariables: envVars,
290+
Transport: model.Transport{
291+
Type: model.TransportTypeStdio,
292+
},
293+
}
279294
case model.RegistryTypeOCI:
280-
registryType = model.RegistryTypeOCI
281-
registryBaseURL = model.RegistryURLDocker
295+
// OCI packages use canonical references: registry/namespace/image:tag
296+
// Format: docker.io/username/image:version
297+
canonicalRef := fmt.Sprintf("docker.io/%s:%s", packageIdentifier, packageVersion)
298+
pkg = model.Package{
299+
RegistryType: model.RegistryTypeOCI,
300+
Identifier: canonicalRef,
301+
// No Version field for OCI - it's embedded in the canonical reference
302+
EnvironmentVariables: envVars,
303+
Transport: model.Transport{
304+
Type: model.TransportTypeStdio,
305+
},
306+
}
282307
case "url":
283-
registryType = "url"
284-
registryBaseURL = ""
308+
pkg = model.Package{
309+
RegistryType: "url",
310+
Identifier: packageIdentifier,
311+
Version: packageVersion,
312+
EnvironmentVariables: envVars,
313+
Transport: model.Transport{
314+
Type: model.TransportTypeStdio,
315+
},
316+
}
285317
default:
286-
registryType = packageType
287-
registryBaseURL = ""
288-
}
289-
290-
// Create package
291-
pkg := model.Package{
292-
RegistryType: registryType,
293-
RegistryBaseURL: registryBaseURL,
294-
Identifier: packageIdentifier,
295-
Version: packageVersion,
296-
EnvironmentVariables: envVars,
297-
Transport: model.Transport{
298-
Type: model.TransportTypeStdio,
299-
},
318+
pkg = model.Package{
319+
RegistryType: packageType,
320+
Identifier: packageIdentifier,
321+
Version: packageVersion,
322+
EnvironmentVariables: envVars,
323+
Transport: model.Transport{
324+
Type: model.TransportTypeStdio,
325+
},
326+
}
300327
}
301328

302329
// Create server structure

data/seed.json

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
{
1313
"src": "https://airtable.com/images/favicon/favicon-32x32.png",
1414
"mimeType": "image/png",
15-
"sizes": ["32x32"]
15+
"sizes": [
16+
"32x32"
17+
]
1618
}
1719
],
1820
"packages": [
@@ -35,8 +37,7 @@
3537
},
3638
{
3739
"registryType": "oci",
38-
"identifier": "domdomegg/airtable-mcp-server",
39-
"version": "1.7.2",
40+
"identifier": "docker.io/domdomegg/airtable-mcp-server:1.7.2",
4041
"runtimeHint": "docker",
4142
"transport": {
4243
"type": "stdio"
@@ -53,7 +54,6 @@
5354
{
5455
"registryType": "mcpb",
5556
"identifier": "https://github.com/domdomegg/airtable-mcp-server/releases/download/v1.7.2/airtable-mcp-server.mcpb",
56-
"version": "1.7.2",
5757
"fileSha256": "8220de07a08ebe908f04da139ea03dbfe29758141347e945da60535fb7bcca20",
5858
"transport": {
5959
"type": "stdio"
@@ -90,8 +90,7 @@
9090
},
9191
{
9292
"registryType": "oci",
93-
"identifier": "domdomegg/airtable-mcp-server",
94-
"version": "1.7.3",
93+
"identifier": "docker.io/domdomegg/airtable-mcp-server:1.7.3",
9594
"runtimeHint": "docker",
9695
"transport": {
9796
"type": "stdio"
@@ -108,7 +107,6 @@
108107
{
109108
"registryType": "mcpb",
110109
"identifier": "https://github.com/domdomegg/airtable-mcp-server/releases/download/v1.7.3/airtable-mcp-server.mcpb",
111-
"version": "1.7.3",
112110
"fileSha256": "0f28a9129cfebd262dfb77854c872355d21401bb3e056575b3027081f5d570ca",
113111
"transport": {
114112
"type": "stdio"

docs/reference/api/openapi.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ components:
270270
required:
271271
- registryType
272272
- identifier
273-
- version
274273
- transport
275274
properties:
276275
registryType:

docs/reference/server-json/generic-server-json.md

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,7 @@ This will essentially instruct the MCP client to execute `dnx Knapcode.SampleMcp
191191
},
192192
{
193193
"registryType": "oci",
194-
"registryBaseUrl": "https://docker.io",
195-
"identifier": "mcp/filesystem",
196-
"version": "1.0.2",
194+
"identifier": "docker.io/mcp/filesystem:1.0.2",
197195
"transport": {
198196
"type": "stdio"
199197
},
@@ -405,9 +403,7 @@ The `dnx` tool ships with the .NET 10 SDK, starting with Preview 6.
405403
"packages": [
406404
{
407405
"registryType": "oci",
408-
"registryBaseUrl": "https://docker.io",
409-
"identifier": "example/database-manager-mcp",
410-
"version": "3.1.0",
406+
"identifier": "docker.io/example/database-manager-mcp:3.1.0",
411407
"transport": {
412408
"type": "stdio"
413409
},
@@ -602,9 +598,7 @@ The `dnx` tool ships with the .NET 10 SDK, starting with Preview 6.
602598
"packages": [
603599
{
604600
"registryType": "mcpb",
605-
"registryBaseUrl": "https://github.com",
606601
"identifier": "https://github.com/modelcontextprotocol/text-editor-mcpb/releases/download/v1.0.2/text-editor.mcpb",
607-
"version": "1.0.2",
608602
"fileSha256": "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
609603
"transport": {
610604
"type": "stdio"

docs/reference/server-json/server.schema.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@
288288
"required": [
289289
"registryType",
290290
"identifier",
291-
"version",
292291
"transport"
293292
],
294293
"type": "object"

internal/api/handlers/v0/publish_registry_validation_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ func TestPublishRegistryValidation(t *testing.T) {
9595
{
9696
RegistryType: model.RegistryTypeMCPB,
9797
Identifier: "https://github.com/microsoft/playwright-mcp/releases/download/v0.0.36/playwright-mcp-extension-v0.0.36.zip",
98-
Version: "0.0.36",
9998
FileSHA256: "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
10099
Transport: model.Transport{
101100
Type: model.TransportTypeStdio,
@@ -146,7 +145,6 @@ func TestPublishRegistryValidation(t *testing.T) {
146145
{
147146
RegistryType: model.RegistryTypeMCPB,
148147
Identifier: "https://github.com/microsoft/playwright-mcp/releases/download/v0.0.36/playwright-mcp-extension-v0.0.36.zip",
149-
Version: "1.0.0",
150148
FileSHA256: "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
151149
Transport: model.Transport{
152150
Type: model.TransportTypeStdio,
@@ -206,7 +204,6 @@ func TestPublishRegistryValidation(t *testing.T) {
206204
{
207205
RegistryType: model.RegistryTypeMCPB,
208206
Identifier: "https://github.com/microsoft/playwright-mcp/releases/download/v0.0.36/playwright-mcp-extension-v0.0.36.zip",
209-
Version: "1.0.0",
210207
FileSHA256: "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce",
211208
Transport: model.Transport{
212209
Type: model.TransportTypeStdio,

0 commit comments

Comments
 (0)