Help us improve
Share bugs, ideas, or general feedback.
Scaffold a new Azure Functions project with language and template selection
npx claudepluginhub azure/azure-functions-skills --plugin azure-functions-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/azure-functions-skills:azure-functions-createThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Language**: Always respond in the same language the user is using.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
Language: Always respond in the same language the user is using.
Guide the user through creating a new Azure Functions project.
Ensure func (Azure Functions Core Tools v4) is installed. If not, suggest running azure-functions-setup first.
Check whether the following Azure MCP tools are available in your current tool list:
functions_language_list — list supported languages and runtime versionsfunctions_project_get — scaffold project-level filesfunctions_template_get — list templates (language only) or get a specific template (language + template)These are provided by the Azure MCP Server (@azure/mcp) and return officially maintained templates across C#, Python, TypeScript, JavaScript, Java and PowerShell.
Also check for the best practices tool:
get_azure_bestpractices / get_azure_bestpractices_get with resource: azurefunctions
If available → proceed with Path A (MCP primary).
If not available → proceed with Path B (composition algorithm fallback).
Use the Azure MCP Server as the authoritative source of truth for Azure Functions templates. Do not write function code from scratch when these tools are available.
If get_azure_bestpractices is available, call it first:
Tool: get_azure_bestpractices
resource: azurefunctions
action: code-generation
Apply the returned guidelines (programming models, extension bundles version, authentication levels, project structure, etc.) to every file you generate in the steps below.
Ask the user (or detect from context):
csharp | python | typescript | javascript | java | powershell22, Python 3.11, Java 21Call functions_language_list. Returns supported languages with runtime versions, programming models, and prerequisites. Use this to confirm the user's language choice is supported and to suggest a default runtime version.
Call functions_template_get with only the language parameter (omit template). This returns the list of available templates for the chosen language with descriptions. Present the templates to the user and let them pick.
Do not invent or guess template identifiers such as HttpTrigger. Azure MCP template IDs are versioned, language-specific strings returned by the template list. For example, the TypeScript HTTP trigger template is currently returned as http-trigger-typescript-azd.
When the user asks for a common trigger name, map it to one of the template IDs returned by the MCP list before calling the template-get operation. Examples:
| User intent | Language | Prefer a returned template ID like |
|---|---|---|
| HTTP trigger | typescript | http-trigger-typescript-azd |
| Timer trigger | typescript | timer-trigger-typescript-azd |
| Blob trigger | typescript | blob-eventgrid-trigger-typescript-azd |
| Queue / Service Bus trigger | typescript | servicebus-trigger-typescript-azd |
If a template-get call fails with "template not found", immediately recover by calling functions_template_get again with only language, then select the closest returned template ID instead of retrying the failed alias.
Call functions_project_get:
Tool: functions_project_get
language: <chosen language, e.g. typescript>
Returns project-level files (host.json, local.settings.json, package.json / requirements.txt / pom.xml / .csproj, tsconfig.json, etc.). Write these into the target directory.
Call functions_template_get with both language and template:
Tool: functions_template_get
language: <chosen language, e.g. typescript>
template: <chosen returned template ID, e.g. http-trigger-typescript-azd>
runtime-version: <optional, e.g. 22>
output: <optional, "New" (default) or "Add" for existing projects>
Returns the full function source code plus any required app settings and additional package dependencies. Write the returned file(s) into the project and merge any extra settings into local.settings.json and any extra packages into the dependency manifest.
⚠️ Large template output: Some templates (especially
*-azdvariants that include infrastructure files) can produce very large output (100KB+). If the tool output is truncated or saved to a temporary file, read the file, parse the JSONfilesarray, and write each file individually. After writing files, runnpm install(or the equivalent package manager command) to generate lock files rather than relying on lock files from the template output.
For TypeScript and other compiled-language projects, build first:
npm run build # TypeScript / JavaScript
# dotnet build # C#
# mvn package # Java
Then perform an end-to-end local verification, not just a host start:
func start
After the host reports the function endpoints/listeners:
curl http://localhost:7071/api/<FunctionName>?name=World.azure-functions-common/references/local-emulators.md, identify the required local emulator or development service, and run a realistic message/blob/document/event through the trigger when the user wants E2E verification.Use this path only when the Azure MCP tools are not available. When falling back, show this notice to the user verbatim (translate to the user's language if needed):
ℹ️ Azure MCP tools were not found; using the manifest-based fallback path. Enabling the Azure MCP Server unlocks dynamic template discovery and composition. Run
azure-functions-setupto configure it.
Follow this manifest-based fallback algorithm:
1. FETCH MANIFEST
GET https://cdn.functions.azure.com/public/templates-manifest/manifest.json
If fetch fails → fall back to:
https://github.com/Azure/azure-functions-templates/blob/dev/Functions.Templates/Template-Manifest/manifest.json
If both fail → fall back to known-good Azure-Samples/functions-quickstart-* repos
If all fail → report error and ask user to retry later
2. FILTER TEMPLATES
Filter by: language, resource, iac
3. CHECK SINGLE-TEMPLATE MATCH
If one template covers ALL requirements → use it alone
4. SELECT TEMPLATES
- Trigger template (REQUIRED) — base project with IaC
- Binding templates (OPTIONAL) — extract patterns only
5. DOWNLOAD TEMPLATES
For each template:
- If folderPath == "." → ZIP download + unzip
- If folderPath != "." → fetch tree + raw github url file downloads
- Fallback: git clone --depth 1
6. COMPOSE
- Use trigger template as BASE
- EXTRACT binding patterns from binding templates
- MERGE IaC resources, RBAC roles and settings
- ADD user's custom business logic
7. TRIM unused demo code (keep AzureWebJobsStorage)
8. WRITE all files
9. DEPLOY: azd up --no-prompt
For minimal HTTP trigger snippets per language (last-resort fallback when the manifest is also unavailable), see references/language-snippets.md.
Build compiled projects first, then perform the same local E2E verification standard used in Path A:
func start
azure-functions-common/references/local-emulators.md and use an emulator/local service when practical.If host.json already exists, do not re-initialize. Instead:
functions_template_get with the same language as the existing project and specify the desired template name. Write the returned file.✅ Your project is scaffolded! Next: use azure-functions-deploy to deploy to Azure.
azure-functions-deploy because the project is ready to deploy to Azure.azure-functions-setup to verify local tooling and prerequisites.