| title | Tools Overview |
|---|---|
| description | Overview of tool types available in Agent Framework and provider support matrix. |
| zone_pivot_groups | programming-languages |
| author | eavanvalkenburg |
| ms.topic | reference |
| ms.author | edvan |
| ms.date | 02/09/2026 |
| ms.service | agent-framework |
Agent Framework supports many different types of tools that extend agent capabilities. Tools allow agents to interact with external systems, execute code, search data, and more.
| Tool Type | Description |
|---|---|
| Function Tools | Custom code that agents can call during conversations |
| Tool Approval | Human-in-the-loop approval for tool invocations |
| Code Interpreter | Execute code in a sandboxed environment |
| File Search | Search through uploaded files |
| Web Search | Search the web for information |
| Hosted MCP Tools | MCP tools hosted by Microsoft Foundry |
| Local MCP Tools | MCP tools running locally or on custom servers |
:::zone pivot="programming-language-csharp"
The OpenAI and Azure OpenAI providers each offer multiple client types with different tool capabilities. Azure OpenAI clients mirror their OpenAI equivalents.
| Tool Type | Chat Completion | Responses | Assistants | Foundry | Anthropic | Ollama | GitHub Copilot | Copilot Studio |
|---|---|---|---|---|---|---|---|---|
| Function Tools | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Tool Approval | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Code Interpreter | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| File Search | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Web Search | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Hosted MCP Tools | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Local MCP Tools | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
Note
The Chat Completion, Responses, and Assistants columns apply to both OpenAI and Azure OpenAI — the Azure variants mirror the same tool support as their OpenAI counterparts.
:::zone-end
:::zone pivot="programming-language-python"
The OpenAI and Azure OpenAI providers each offer multiple client types with different tool capabilities. Azure OpenAI clients mirror their OpenAI equivalents.
| Tool Type | Chat Completion | Responses | Assistants | Foundry | Anthropic | Claude Agent | Ollama | GitHub Copilot |
|---|---|---|---|---|---|---|---|---|
| Function Tools | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Tool Approval | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Code Interpreter | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| File Search | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Web Search | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Image Generation | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Hosted MCP Tools | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Local MCP Tools | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Note
The Chat Completion, Responses, and Assistants columns apply to both OpenAI and Azure OpenAI — the Azure variants mirror the same tool support as their OpenAI counterparts. Local MCP Tools work with any provider that supports function tools.
:::zone-end
You can use an agent as a function tool for another agent, enabling agent composition and more advanced workflows. The inner agent is converted to a function tool and provided to the outer agent, which can then call it as needed.
:::zone pivot="programming-language-csharp"
Call .AsAIFunction() on an AIAgent to convert it to a function tool that can be provided to another agent:
// Create the inner agent with its own tools
AIAgent weatherAgent = new AIProjectClient(
new Uri("<your-foundry-project-endpoint>"),
new DefaultAzureCredential())
.AsAIAgent(
model: "gpt-4o-mini",
instructions: "You answer questions about the weather.",
name: "WeatherAgent",
description: "An agent that answers questions about the weather.",
tools: [AIFunctionFactory.Create(GetWeather)]);
// Create the main agent and provide the inner agent as a function tool
AIAgent agent = new AIProjectClient(
new Uri("<your-foundry-project-endpoint>"),
new DefaultAzureCredential())
.AsAIAgent(
model: "gpt-4o-mini",
instructions: "You are a helpful assistant.",
tools: [weatherAgent.AsAIFunction()]);
// The main agent can now call the weather agent as a tool
Console.WriteLine(await agent.RunAsync("What is the weather like in Amsterdam?"));Warning
DefaultAzureCredential is convenient for development but requires careful consideration in production. In production, consider using a specific credential (e.g., ManagedIdentityCredential) to avoid latency issues, unintended credential probing, and potential security risks from fallback mechanisms.
:::zone-end
:::zone pivot="programming-language-python"
Call .as_tool() on an agent to convert it to a function tool that can be provided to another agent:
import os
from agent_framework.openai import OpenAIChatCompletionClient
from azure.identity import AzureCliCredential
# Create the inner agent with its own tools
weather_agent = OpenAIChatCompletionClient(
model=os.environ["AZURE_OPENAI_CHAT_COMPLETION_MODEL"],
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
credential=AzureCliCredential(),
).as_agent(
name="WeatherAgent",
description="An agent that answers questions about the weather.",
instructions="You answer questions about the weather.",
tools=get_weather
)
# Create the main agent and provide the inner agent as a function tool
main_agent = OpenAIChatCompletionClient(
model=os.environ["AZURE_OPENAI_CHAT_COMPLETION_MODEL"],
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
credential=AzureCliCredential(),
).as_agent(
instructions="You are a helpful assistant.",
tools=weather_agent.as_tool()
)
# The main agent can now call the weather agent as a tool
result = await main_agent.run("What is the weather like in Amsterdam?")
print(result.text)You can also customize the tool name, description, and argument name:
weather_tool = weather_agent.as_tool(
name="WeatherLookup",
description="Look up weather information for any location",
arg_name="query",
arg_description="The weather query or location"
):::zone-end
[!div class="nextstepaction"] Function Tools