
:::image type=“content” source=”../../media/tools/toolbox/toolbox-architecture.png” alt-text=“Diagram showing Toolboxes in Foundry architecture: Build and Consume pillars consumed by LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code, and Microsoft Copilot Studio, governed by default.” lightbox=”../../media/tools/toolbox/toolbox-architecture.png”:::
You create toolboxes in Foundry, but the consumption surface is open. Any MCP-compatible agent runtime or client can use a toolbox - including agents built with any framework, MCP-enabled IDEs, and custom code.
Because a toolbox is a managed resource, you can add, remove, or reconfigure tools without changing code in your agent. Your agent always connects to a single endpoint. Toolbox versioning gives you explicit control over when changes take effect - create and test a new version, then promote it to default when you’re ready. Every agent that points to the toolbox picks up the promoted version automatically, with no code changes and no redeployment.
In this article, you learn how to:
- Create a toolbox with one or more tools.
- Get the toolbox MCP endpoint.
- Verify that tools load correctly.
- Integrate a toolbox into your hosted agent.
- Manage toolbox versions and promote a version to default.
- Apply a guardrail (RAI policy) to a toolbox version.
Feature support
Prerequisites
- An active Microsoft Foundry project.
-
RBAC: Grant the Foundry User role on the Foundry project to each identity that applies to your scenario:
- Developer (always required) — the identity that creates, updates, and manages toolbox versions.
- Agent identity (required if using a hosted agent) — the agent’s managed identity that calls tools at runtime.
- End user (required only for OAuth flows) — any user whose identity is proxied through OAuth or UserEntraToken connections (for example, OAuth-based MCP or user Entra token (managed user identity passthrough) flows).
- Your Foundry project needs to be at one of the supported regions. Individual tool types within a toolbox are further limited by region and model – not all tool types are available in every region or with every model. See Region and model compatibility.
- Visual Studio Code (VS Code).
- Install the Microsoft Foundry Toolkit for Visual Studio Code extension from the Visual Studio Code Marketplace.
-
Python SDK:
pip install azure-ai-projects azure-identity -
.NET SDK:
dotnet add package Azure.AI.Projects --prereleaseanddotnet add package Azure.Identity -
JavaScript SDK:
npm install @azure/ai-projects @azure/identity -
Azure Developer CLI: Install the Azure Developer CLI (
azd, 1.25 or later) and the unified Foundry CLI extension bundle:
- A toolbox supports at most one tool without a
namefield per tool type (Web Search, Azure AI Search, Code Interpreter, File Search). To include more than one instance of the same tool type, set a uniquenameon each instance to differentiate them. Including two instances of the same type without anamereturns aninvalid_payloaderror. For details, see Multiple tool types. - Add a
descriptionto every tool in your toolbox to help the model select the right tool for each request. - Carefully review each tool’s documentation to learn more about individual tool setup, limitations, and warnings.
Step 1: Create a toolbox version
Create a toolbox version based on the tools you need.Step 2: Get the toolbox MCP endpoint
Two endpoint patterns exist depending on your role:
Replace the placeholders with your own values:
{project_endpoint}is your Foundry project endpoint, in the formhttps://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>. Copy it from the Overview page of your project in the Foundry portal, or from the Endpoint URL column in the Toolboxes view of the Microsoft Foundry Toolkit for Visual Studio Code.{toolbox_name}and{version}are the toolbox name and version you created in Step 1.
The first version of a new toolbox is automatically promoted to
default_version (v1). If you need to change the default later, see Promote a version to default.- Select Foundry Toolkit in the Activity Bar.
- Under My Resources, expand Your project name > Tools.
- On the Toolboxes tab, locate your toolbox.
- In the Endpoint URL column, copy the endpoint.

Step 3: Verify tool availability
Before running the full agent, confirm that the toolbox loads the expected tools by using an MCP client SDK against the endpoint. Use the version-specific endpoint to validate a version before promoting it to default. Check — initialize: HTTP 200. If you skip the initialize step, subsequent calls fail. Check —tools/list:
-
len(tools) > 0— empty means the toolbox version wasn’t provisioned correctly. -
Each tool has
name,description, andinputSchema. For tool naming conventions, see the MCP specification. -
inputSchemahas apropertiesfield (some MCP servers omit this field, which breaks OpenAI). -
Tool names are namespaced by tool type:
-
MCP tools include a
_meta.tool_configurationblock containing runtime settings such asrequire_approval. See Handle tool approval requirements. -
Note the exact parameter names for the call step (for example
queryvsqueries).
tools/call:
- No top-level
errorfield. If present, inspecterror.code. For standard MCP error codes, see the MCP specification:-32006→ OAuth consent required (extract URL fromerror.message).- Other codes → server-side failure.
result.content[]contains entries with"type": "text"- this is the tool output.- For AI Search, check
result.structuredContent.documents[]for chunk metadata (title,url,id,score). - For File Search, check
result.content[].resource._metafor chunk metadata (title,file_id,document_chunk_id,score). - For Web Search, check
result.content[].resource._meta.annotations[]for URL citations (type,url,title,start_index,end_index). - For Fabric IQ, check
result.structuredContent.documents[]for citation chunks. Each document includestitleandurlfields pointing back to the Fabric item (Ontology, data agent, or Power BI semantic model) used to ground the response. - Watch for
"ServerError"in text content - the tool executed but hit an internal error.
tools/call argument examples:
Step 4: Integrate the toolbox into your agent
Handle tool approval requirements
The toolbox returns a_meta.tool_configuration object into every tool entry returned by tools/list. When a tool has require_approval set to "always", the agent runtime must present the pending action to the user and wait for confirmation before invoking the tool. The MCP endpoint doesn’t block tools/call - enforcement is entirely the agent runtime’s responsibility.
Read require_approval from tools/list
Each tool entry in a tools/list response includes a _meta block returned by the toolbox:
Implement approval gating (LangGraph)
Querytools/list at startup to build an approval map, then inject a constraint into the system prompt for any tool that requires approval:
- Detection happens at startup. The approval check runs once when the agent initializes. There’s no per-call overhead.
- Graceful fallback. If no tools have
require_approval: "always", the system prompt is unchanged and the agent behaves as before. require_approvalis agent-enforced. The toolbox MCP proxy executestools/callregardless of this setting. Your agent runtime is responsible for gating the call.
Configure require_approval on a tool
Set require_approval when you create a toolbox version. The MCP tool examples in Step 1 show both "always" and "never" values. You can also set it through the SDK:
Step 5: Manage toolbox versions
You can delete toolbox versions only through the Python SDK, .NET SDK, JavaScript SDK, and REST API. The azd CLI supports list, get, and publish (default-version promotion) operations.
ToolboxVersionObject. The parent ToolboxObject has a default_version field that controls which version the MCP endpoint serves. Creating a new version doesn’t automatically promote it - you decide when to update default_version. This process lets you stage changes, test a new version independently, and promote it to production on your own schedule.
For the Azure Developer CLI, every mutating operation that targets the current default version —
azd ai toolbox connection add/remove and azd ai toolbox skill add/remove — creates a new toolbox version that carries forward all previously attached connections and skills with the requested change applied. None of these commands automatically change default_version; run azd ai toolbox publish <toolbox-name> <version> when you’re ready to make the new version active. To inspect a pending (non-default) version, use azd ai toolbox show <name> --version <n>.Create a new version
Each create call produces a new version. If the toolbox doesn’t exist yet, the process automatically creates it. When you create the first version of a new toolbox, the default version isv1 until you manually update to another version.
The response is a ToolboxVersionObject containing the new version identifier.
List versions
Get a specific version
Promote a version to default
The MCP endpoint always serves thedefault_version. To switch which version is active, update the toolbox:
Delete a version
Configure tools
Choose the tool type and authentication pattern that match your scenario. Select the tab for your preferred SDK or deployment method. Each tool’s azd tab below shows declarative toolbox YAML. To create a toolbox imperatively without an agent project, use the generic four-stepazd ai toolbox create --from-file workflow and apply the per-tool data shown in the following sections. To deploy a toolbox with a hosted agent, model it as an azure.ai.toolbox service in azure.yaml and wire the agent to it with uses: or toolboxes:.
Multiple tool types
A single toolbox can bundle different tool types. The following example combines Web Search, Azure AI Search, and an MCP server in one toolbox:Each tool type (
web_search, azure_ai_search, code_interpreter, file_search) can appear at most once without a name field. To include multiple instances of the same type, set a unique name on each instance - see the next example.Multi-tool restrictions
You can include at most one instance of each built-in tool type without aname field in a toolbox. If you include two instances of the same type without a name, the API returns:
Two instances of the same tool type
Use thename field to include multiple instances of the same tool type in one toolbox. Each named instance is treated as a separate tool and must have a unique name.
Model Context Protocol (MCP)
The first time a user calls a toolbox with an OAuth-based MCP in a project, the MCP endpoint returns a This error is expected. Open the consent URL in a browser, complete the OAuth authorization flow, and then retry the agent call. Subsequent calls succeed without re-prompting.
CONSENT_REQUIRED error (code -32006) with a consent URL:Web Search
- Web Search uses Grounding with Bing Search and Grounding with Bing Custom Search, which are First Party Consumption Services governed by these Grounding with Bing terms of use and the Microsoft Privacy Statement.
- The Microsoft Data Protection Addendum doesn’t apply to data sent to Grounding with Bing Search and Grounding with Bing Custom Search. When you use Grounding with Bing Search and Grounding with Bing Custom Search, data transfers occur outside compliance and geographic boundaries.
- Use of Grounding with Bing Search and Grounding with Bing Custom Search incurs costs. See pricing for details.
- See the management section for information about how Azure admins can manage access to use of web search.
web_search.custom_search_configuration object pointing to your Grounding with Bing Custom Search connection.
When Web Search returns results over MCP, the response is a
resource content item containing the synthesized answer with inline Markdown source links. URL citations are in content[].resource._meta.annotations[]. For example:Azure AI Search
Configure tool parameters
The search results include chunk metadata in
result.structuredContent.documents[]. Each document includes title, url, id, and score fields that you can use to generate citation details in your application.
Code Interpreter
Use this pattern to let the agent write and execute Python code. The pattern doesn’t require a project connection or extra configuration. To upload a file for Code Interpreter to use through a toolbox, upload the file at the resource-level Files endpoint (POST {account_endpoint}/openai/v1/files) with the x-aml-project-id header. Unlike the prompt agent flow, files uploaded through the project-scoped Files endpoint (/api/projects/{name}/openai/v1/files) receive an owner_id that the toolbox container can’t verify, so tools/call fails with an ownership-verification error.
-
Get the project GUID from Azure Resource Manager. Use
properties.amlWorkspace.internalId(dashed UUID format), notproperties.internalId(no dashes - the toolbox container rejects it): -
Upload the file at the account (resource) level with the
x-aml-project-idheader:
id is the value you supply as <FILE_ID> in the tool configuration. Files are mounted in the sandbox at /mnt/data/{file-id}-{original-filename}. See Code Interpreter for additional upload examples and language-specific samples.
When Code Interpreter is used through a toolbox in a hosted agent, user isolation isn’t supported. All users in the same project share the same container context.
Download output files from Code Interpreter
When Code Interpreter produces output files (for example, a generated CSV or chart), use the following steps to list and download them. Step 1: List files using the Container API Extract thecontainer_id from content[]._meta.container_id in the tools/call response, then call the Container Files API to list all files in the container:
File Search
Use this pattern to let the agent search over uploaded files stored in a vector store. You can configurevector_store_ids in two ways:
- Pinned at toolbox creation — provide
vector_store_idsin the tool configuration. The vector store is fixed for all calls and can’t be overridden at runtime. - Dynamic at runtime — omit
vector_store_idsfrom the tool configuration. Callers provide it in thetools/callarguments, enabling scenarios like multitenant document stores where each call targets a different vector store.
REST API, Python SDK, .NET SDK, JavaScript SDK, and azd CLI support dynamic
vector_store_ids. The Foundry portal UI currently requires vector_store_ids when adding a File Search tool.x-aml-project-id header (the same requirement as Code Interpreter - see the previous section for how to obtain the project GUID from properties.amlWorkspace.internalId):
- Upload your file:
POST {account_endpoint}/openai/v1/fileswithpurpose=assistantsand headerx-aml-project-id: {project-guid}. - Create a vector store:
POST {account_endpoint}/openai/v1/vector_storeswith the returned file ID and the samex-aml-project-idheader.
<VECTOR_STORE_ID>. See File Search for full examples in each language.
When you use File Search through a toolbox in a hosted agent, user isolation isn’t supported. All users in the same project share access to any vector stores referenced in the tool configuration or provided at runtime.
When File Search returns results over MCP, chunk metadata is embedded in the tool response content as The
【index†filename†file_id【 markers. For example:_meta block inside each resource item contains the title, file_id, document_chunk_id, and relevance score for the matched chunk. Use these metadata fields in your application to generate citation details or deep-link back to the source file.OpenAPI
Use this pattern to expose any REST API described by an OpenAPI spec. Choose theauth.type that matches your API’s security model.
When you use managed identity auth, you must assign the appropriate RBAC role to your Foundry project’s managed identity on the target service. For example, assign Reader or higher on the target Azure resource. Without this assignment, the agent receives a
401 Unauthorized response when calling the API. For full setup steps, see Authenticate by using managed identity.Agent-to-Agent (A2A)
Use this pattern to call another agent as a tool. Provide the base URL of the remote agent and, if it requires authentication, a project connection.Fabric IQ
Use this pattern to give the agent access to Microsoft Fabric data - ontologies, data agents, and Power BI semantic models - through Fabric IQ. Provide the project connection, MCP server URL, and server label for the target Fabric item. Forserver_url patterns by Fabric item type, see Find your Fabric IQ server details.
Annotation chunks are returned in result.structuredContent.documents[]. Each document includes title and url fields that you can use to generate citation details in your application.
Tool Search
Use this pattern to enable intent-based tool routing. When you includetoolbox_search_preview in a toolbox, the platform selects the most relevant tools for each request instead of exposing all tools to the model at once. No additional configuration is required.
toolbox_search_preview is a configuration directive that activates tool search. It doesn’t appear in tools/list responses and doesn’t count toward the unnamed-tool-per-type limit.tool_search and call_tool. The call_tool meta-tool acts as a proxy that agent frameworks use to invoke any discovered tool by name through a single declared entry point. This proxy avoids schema-validation errors that occur when a framework tries to call a tool that wasn’t present in the initial tools/list. If your framework supports direct tool calls without schema pre-validation, you can also call a discovered tool directly after finding it with tool_search.
In Foundry Toolkit for Visual Studio Code, select Tool search on the Build a Custom Toolbox tab when you create or edit a toolbox. For more information, see Enable tool search in a toolbox.
Work IQ
Use this pattern to give the agent access to the user’s Microsoft 365 work context - email, meetings, files, and chats - through Work IQ. Provide a project connection to your Work IQ endpoint.Browser Automation
Troubleshoot
Configure guardrails
Apply a named guardrail policy to a toolbox version to enforce responsible AI content filtering on tool inputs and outputs. The guardrail runs at the toolbox layer, independently of any model-level content filter. Reference a guardrail by its policy name, which you configure in the Foundry portal under Guardrails. Setpolicies.rai_config.rai_policy_name to the name of the policy when creating a toolbox version.
Attach skills to a toolbox
Attach skills to a toolbox version to make them available to agents through the toolbox MCP endpoint. Each skill reference specifies the skill name and an optional version. Omitversion to use the skill’s default_version; pin a version string to use an immutable snapshot.
A toolbox version can contain tools, skills, or both. The following examples create a toolbox version that contains a single skill reference. To add skills to a toolbox that already has tools, include the same tools you used in Step 1 along with the skills array.
Skills attached to a toolbox must exist in the same Foundry project. Cross-project references aren’t supported.
resources/list on the toolbox MCP endpoint and confirm your skill names appear in the response.
Reminder
Thereminder_preview tool lets a hosted agent schedule itself to run again at a future time. When the agent calls this tool, it specifies a delay in minutes. After that delay, Foundry re-invokes the same agent on the same conversation.

The reminder tool is available only for hosted agents. You can’t use the reminder tool with prompt agents.
Virtual network support
When your Foundry project uses network isolation (private link), not all toolbox tool types are supported. The following table shows the support status for each tool type and how traffic flows in a network-isolated environment.
For full network isolation setup instructions, including VNet injection for the agent client, DNS configuration, and private endpoint requirements, see Configure network isolation for Microsoft Foundry.
Region and model compatibility
Toolbox availability depends on two factors beyond the project region:- Region: Some tool types aren’t available in every region that supports the agent service. For example, a region that supports the toolbox endpoint might not support all built-in tool types.