hashicorp/packer · error

unsupported remote protocol MAJOR version %d. The current MA

Error message

unsupported remote protocol MAJOR version %d. The current MAJOR protocol version is %d. This version of Packer can only communicate with plugins using that version

What it means

CheckProtocolVersion() rejects a plugin whose advertised protocol MAJOR version differs from the one this Packer binary supports. The gRPC plugin protocol MAJOR version defines wire compatibility, so a mismatch means Packer and the plugin cannot communicate at all.

Source

Thrown at packer/plugin-getter/plugins.go:535

	localVersion := localAPIVersion
	if binOpts.APIVersionMajor != pluginsdk.APIVersionMajor ||
		binOpts.APIVersionMinor != pluginsdk.APIVersionMinor {
		var err error

		localVersion, err = NewAPIVersion(fmt.Sprintf("x%s.%s", binOpts.APIVersionMajor, binOpts.APIVersionMinor))
		if err != nil {
			return fmt.Errorf("Failed to parse API Version from constraints: %s", err)
		}
	}

	remoteVersion, err := NewAPIVersion(remoteProt)
	if err != nil {
		return err
	}

	if localVersion.Major != remoteVersion.Major {
		return fmt.Errorf("unsupported remote protocol MAJOR version %d. The current MAJOR protocol version is %d."+
			" This version of Packer can only communicate with plugins using that version", remoteVersion.Major, localVersion.Major)
	}

	if remoteVersion.Minor > localVersion.Minor {
		return fmt.Errorf("unsupported remote protocol MINOR version %d. The supported MINOR protocol versions are version %d and below. "+
			"Please upgrade Packer or use an older version of the plugin if possible", remoteVersion.Minor, localVersion.Minor)
	}

	return nil
}

func (gp *GetOptions) Version() string {
	return "v" + gp.version.String()
}

func (gp *GetOptions) VersionString() string {
	return gp.version.String()
}

View on GitHub (pinned to eb36e3c3e4)

Solutions

  1. Upgrade Packer to a version whose protocol MAJOR matches the plugin (or vice versa).
  2. Pick a different plugin version whose protocol MAJOR matches (usually the newest release compatible with your Packer).
  3. Rebuild the plugin against the current packer-plugin-sdk so it reports the current MAJOR protocol version.

Example fix

// before: pins a protocol-4-era release
myplug = { version = "= 0.0.10", source = "github.com/foo/myplug" }
// after
myplug = { version = ">= 1.0.0", source = "github.com/foo/myplug" }
Defensive patterns

Strategy: validation

Validate before calling

local, _ := NewAPIVersion(fmt.Sprintf("x%s.%s", pluginsdk.APIVersionMajor, pluginsdk.APIVersionMinor))
remote, err := NewAPIVersion(entry.ProtVersion)
if err == nil && local.Major != remote.Major {
	return fmt.Errorf("plugin protocol x%d.x incompatible with packer x%d.x", remote.Major, local.Major)
}

Try / catch

if err := binOpts.CheckProtocolVersion(entry.ProtVersion); err != nil {
	if strings.Contains(err.Error(), "MAJOR version") {
		return fmt.Errorf("try a different plugin release or upgrade packer: %w", err)
	}
}

Prevention

When it happens

Trigger: Installing or validating a plugin whose entry.ProtVersion parses to a Major != the local pluginsdk.APIVersionMajor — e.g. an old plugin built against protocol x4.x, or a future plugin built against x6.0, installed by current Packer (x5.x).

Common situations: Pinning a very old plugin release for legacy templates; testing a plugin built from a protocol-breaking SDK branch; downloading a plugin whose checksums file includes assets from multiple protocol generations.

Related errors


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