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
Updated from 2 to 3.
Converted background.scripts to background.service_worker.
Renamed "browser_action" to "action". The unified "action" API replaces both browser_action and page_action in MV3.
Removed "webRequestBlocking" (not available in MV3). Added "declarativeNetRequest" as replacement. You must rewrite blocking webRequest rules as declarativeNetRequest rules.
Moved 1 host pattern(s) from "permissions" to "host_permissions".
Converted flat string array to MV3 object format with "resources" and "matches". Review the "matches" patterns — using <all_urls> may be overly broad.
Converted CSP string to MV3 object format with "extension_pages" key.
Manual Steps Required
- Rewrite your webRequest blocking rules using the declarativeNetRequest API. Create a rules JSON file and reference it in the manifest.
- 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