hashicorp/packer · error

manifest.json for version %s declares no protocol_version

Error message

manifest.json for version %s declares no protocol_version

What it means

Remote-mirror getter error from resolveProtocolVersion: manifest.json parsed fine but contains no protocol_version field, so Packer can't determine whether the plugin is compatible. Happens with older manifests or hand-crafted mirror files.

Source

Thrown at packer/plugin-getter/remote/getter.go:206

}

// resolveProtocolVersion reads the plugin protocol version from a version's
// manifest.json and caches it for Validate.
func (g *Getter) resolveProtocolVersion(versionURL, pluginType, version string) error {
	if _, ok := g.protVersions[version]; ok {
		return nil
	}
	data, err := g.fetch(versionURL + "/" + pluginType + "_" + version + "_manifest.json")
	if err != nil {
		return fmt.Errorf(
			"%w\nThe checksum entries of this version carry no plugin protocol version in their names, so the mirrored version must include its manifest.json, as published on releases.hashicorp.com", err)
	}
	var meta plugingetter.ManifestMeta
	if err := json.Unmarshal(data, &meta); err != nil {
		return fmt.Errorf("malformed manifest.json for version %s: %w", version, err)
	}
	if meta.Metadata.ProtocolVersion == "" {
		return fmt.Errorf("manifest.json for version %s declares no protocol_version", version)
	}
	if g.protVersions == nil {
		g.protVersions = map[string]string{}
	}
	g.protVersions[version] = "x" + meta.Metadata.ProtocolVersion
	return nil
}

func (g *Getter) Get(what string, opts plugingetter.GetOptions) (io.ReadCloser, error) {
	log.Printf("[TRACE] Getting %s of %s plugin from %s", what, opts.PluginRequirement.Identifier, g.Name)

	switch what {
	case "releases":
		idx, _, err := g.loadIndex(opts)
		if err != nil {
			return nil, err
		}
		return idx.releasesStream()

View on GitHub (pinned to eb36e3c3e4)

Solutions

  1. Serve the official manifest.json from releases.hashicorp.com which includes protocol_version
  2. Use a plugin release new enough to publish protocol metadata
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packer/plugin-getter/remote/getter.go:206 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of hashicorp/packer@eb36e3c3e4 (2026-09-05). Data as JSON: /api/errors/acea4ea18dff49bd. Report an issue: GitHub.