Free Tool

MV2 to MV3 Manifest Converter

Paste your Manifest V2 manifest.json and get a Manifest V3 version. Auto-converts what it can, flags what needs manual attention, and provides detailed migration notes for each change.

MV2Input

MV3Output

{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0.0",
  "description": "A sample extension to convert from MV2 to MV3.",
  "permissions": [
    "tabs",
    "storage",
    "activeTab",
    "webRequest",
    "declarativeNetRequest"
  ],
  "host_permissions": [
    "https://api.example.com/*"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "icons/icon16.png",
      "48": "icons/icon48.png",
      "128": "icons/icon128.png"
    },
    "default_title": "My Extension"
  },
  "content_scripts": [
    {
      "matches": [
        "https://*.example.com/*"
      ],
      "js": [
        "content.js"
      ],
      "css": [
        "content.css"
      ]
    }
  ],
  "web_accessible_resources": [
    {
      "resources": [
        "images/*.png",
        "styles/*.css"
      ],
      "matches": [
        "<all_urls>"
      ]
    }
  ],
  "content_security_policy": {
    "extension_pages": "script-src 'self'; object-src 'self'"
  },
  "icons": {
    "16": "icons/icon16.png",
    "48": "icons/icon48.png",
    "128": "icons/icon128.png"
  }
}

7 Conversions Applied

manifest_versionAuto-converted

Updated from 2 to 3.

backgroundAuto-converted

Converted background.scripts to background.service_worker.

browser_actionAuto-converted

Renamed "browser_action" to "action". The unified "action" API replaces both browser_action and page_action in MV3.

permissionsNeeds manual work

Removed "webRequestBlocking" (not available in MV3). Added "declarativeNetRequest" as replacement. You must rewrite blocking webRequest rules as declarativeNetRequest rules.

host_permissionsAuto-converted

Moved 1 host pattern(s) from "permissions" to "host_permissions".

web_accessible_resourcesAuto-converted

Converted flat string array to MV3 object format with "resources" and "matches". Review the "matches" patterns — using <all_urls> may be overly broad.

content_security_policyAuto-converted

Converted CSP string to MV3 object format with "extension_pages" key.

Manual Steps Required

  1. Rewrite your webRequest blocking rules using the declarativeNetRequest API. Create a rules JSON file and reference it in the manifest.
  2. Review web_accessible_resources matches — replace <all_urls> with specific URL patterns your content scripts actually run on.

Key MV2 to MV3 Changes

Background Pages → Service Workers

No more persistent background pages. Service workers terminate when idle — handle state with chrome.storage.

browser_action → action

browser_action and page_action are merged into a single "action" API.

Host Permissions Split

URL patterns move from "permissions" to a separate "host_permissions" array.

webRequest → declarativeNetRequest

Blocking webRequest is gone. Use declarativeNetRequest for request modification rules.

No Remote Code

eval(), new Function(), and remotely hosted scripts are banned. Bundle everything locally.

web_accessible_resources

Changed from a flat array to an array of objects with "resources" and "matches" fields.

Need a full MV3 migration checklist?

View MV3 Migration Checklist