A team I worked with had a customer-notification function that ran fine on every laptop except one. On that machine, func start threw a host error, and the publish command refused to deploy. The developer had installed Core Tools two years earlier and never touched it again. His teammates had upgraded along the way, so the same repo behaved differently on each computer.
Knowing how to update Azure Functions Core Tools matters more than most people expect.It is also a deadline issue: Microsoft ends support for the .NET in-process model on November 10, 2026, and your local tools are where you test that migration. This guide shows how to check your version, update with the same method you used to install, match the tools to your Azure runtime, and keep every machine and pipeline in sync.
Check Your Current Version First
Azure Functions Core Tools is the command-line tool that runs the Functions host on your computer so you can build, debug, and publish apps. Its command is func. If you are new to it, start with this overview of Azure Functions Core Tools. If func is not recognized at all, read you must have Azure Functions Core Tools installed first.
Run these checks before you change anything:
func --versionThis prints the installed Core Tools version. You want a 4.x number. Version 4 matches version 4 of the Functions runtime, which is the supported major version for new work.
npm ls -g azure-functions-core-toolsThis lists the globally installed npm copy, if one exists. An empty result means you did not install through npm. You might have used winget, Homebrew, APT, or an MSI installer.
Find Out How You Installed It
The update command depends on the install method. If you update with a different method than you installed with, you can end up with two copies. On Windows, find every copy:
where.exe funcwhere.exe lists every func on the PATH. Two paths mean two installs, and the first one wins. On macOS and Linux, use which -a func.
| Installed with | Update with |
|---|---|
| winget | winget upgrade Microsoft.Azure.FunctionsCoreTools |
| Chocolatey | choco upgrade azure-functions-core-tools |
| npm | npm install -g azure-functions-core-tools@4 --unsafe-perm true |
| Homebrew | brew upgrade azure-functions-core-tools@4 |
| APT | sudo apt-get update then install the package again |
| MSI installer | Download and run the newer installer |
Pro Tip: In my experience, writing the install method in the project README prevents most “which copy am I running?” problems. I add one line: “We use winget on Windows and Homebrew on macOS.”
How to Update Azure Functions Core Tools on Windows
Windows has the most options, so the order matters. Pick the method that matches your original install.
Update with winget
winget is the Windows Package Manager. If you installed with it, upgrade with it:
winget upgrade Microsoft.Azure.FunctionsCoreToolswinget upgrade checks the package source and installs the newest version of that package ID. If winget says no upgrade is available, you are current. If it says the package is not installed, you probably installed through another method. Close your terminal afterward and open a new one so the PATH refreshes.
Update with npm
Developers who work mostly in Visual Studio Code often use npm, the Node.js package manager. Run:
npm install -g azure-functions-core-tools@4 --unsafe-perm trueHere is what each part does:
- -g installs the package globally so
funcworks from any folder. - @4 pulls the latest 4.x release, which is the supported line.
- –unsafe-perm true lets npm run the post-install step that downloads the platform binary.
If the install fails with a permission or download error, clear the cache and retry:
npm cache clean --force
npm uninstall -g azure-functions-core-tools
npm install -g azure-functions-core-tools@4 --unsafe-perm trueThe first command empties npm’s cache. The second removes the broken copy. The third installs fresh. This is safe because it only touches the local tool, not your projects or Azure resources.
Update with Chocolatey or an MSI
Chocolatey users run choco upgrade azure-functions-core-tools in an elevated terminal. If you used the MSI installer, download the newer MSI and run it. When both an MSI and an npm copy exist, the MSI usually wins on the PATH, which hides your npm update. Remove one of them. This guide on how to uninstall Azure Functions Core Tools walks through a clean removal.
Visual Studio Code can also manage Core Tools through its Azure Functions extension. If that path fails, read Azure Function Core Tools not installing on VS Code and the guide to installing Core Tools for Visual Studio Code.
Pro Tip: I run
where.exe funcbefore and after every update. If the output shows the same path twice with different versions, I know a leftover install is shadowing the new one.
How to Update Azure Functions Core Tools on macOS and Linux
Unix systems are simpler, but you still need to use the matching package manager.
macOS with Homebrew
brew update
brew upgrade azure-functions-core-tools@4brew update refreshes Homebrew’s package list. brew upgrade installs the newest 4.x release of that formula. If you moved from an older major version, relink the new one so the func name points to it:
brew link --overwrite azure-functions-core-tools@4The --overwrite flag replaces old links. It only changes local symlinks.
Ubuntu and Debian with APT
sudo apt-get update
sudo apt-get install --only-upgrade azure-functions-core-tools-4Always run apt-get update first. A stale package index causes 404 errors and “package not found” failures, especially on build agents. The --only-upgrade flag upgrades the package if it is already installed and does not install it if it is missing, which makes the command safe to rerun.
npm Without Admin Rights
On shared machines, you may not have root access. Point npm at a folder you own:
mkdir -p "$HOME/.npm-global"
npm config set prefix "$HOME/.npm-global"
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
npm install -g azure-functions-core-tools@4 --unsafe-perm trueThe first two lines create and select a personal global folder. The third adds it to your PATH, and source reloads the shell. The last line installs without sudo. On zsh, use ~/.zshrc. Avoid sudo npm install -g, because root-owned files cause confusing errors later.
Windows Subsystem for Linux
Run which npm in WSL. If the path begins with /mnt/c/, WSL is using Windows npm and will not give you a working Linux func. Install Node.js inside WSL, or use APT there.
Pro Tip: On a WSL box, I once updated the “wrong” npm for a week and wondered why nothing changed. Now
which npm funcis the first thing I run.
Match Core Tools to Your Function App Runtime
Updating the tool is only half the job. The tool and your Azure function app must agree on a major version. Microsoft’s guidance is that your local Core Tools version must match the major runtime version used by the function app in Azure. A runtime is the Functions host that executes your code, and it is versioned separately from your language version.
Check the Runtime in Azure
az functionapp config appsettings list \
--name <function-app-name> \
--resource-group <resource-group-name> \
--query "[?name=='FUNCTIONS_EXTENSION_VERSION']" \
--output tableThis command reads the FUNCTIONS_EXTENSION_VERSION app setting for your function app. A value of ~4 means the app follows the 4.x runtime and picks up minor updates automatically. A pinned value such as 4.0.12345 freezes the app on one exact version, so check why it was pinned.
This is the same value discussed in the Functions extension version guide. You can also learn to check the Azure Function version and find the Functions runtime version.
If the Azure CLI itself is old, update it first. Here is how to update Azure CLI.
Move an Older App to Version 4
If your app still runs on 2.x or 3.x, Microsoft recommends moving to 4.x. Do it in order:
- Update Core Tools on your machine to 4.x.
- Update your project’s extension bundle and language runtime.
- Run the app locally and test every trigger.
- Test in a staging slot in Azure.
- Change the production setting.
az functionapp config appsettings set \
--name <function-app-name> \
--resource-group <resource-group-name> \
--settings FUNCTIONS_EXTENSION_VERSION=~4This sets the app to the 4.x runtime. Warning: changing the runtime restarts the app and can change behavior. Never run this on production first. Create a staging deployment slot, a live copy of the app with its own URL, then swap after testing.
See how Azure App Service deployment slots work, since Functions on supported plans use the same idea. If a bad update leaves the host down, these guides help: Azure Functions runtime is unreachable and