Foundry에서 의도 기반 도구 상자 큐레이팅(미리 보기)

중요

이 문서에서 표시된 항목(미리 보기)은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure 미리 보기에 대한 사용 약관 참조하세요.

단일 에이전트는 API, MCP(모델 컨텍스트 프로토콜) 서버, 커넥터 및 흐름과 같은 여러 도구에 따라 달라질 수 있으며 각각 자체 인증 모델 및 소유 팀이 있습니다. 조직 전체에서 크기를 조정하면 팀은 동일한 도구를 독립적으로 다시 구현하고, 자격 증명이 중복되고, 거버넌스가 일관되지 않게 되며, 어떤 도구가 존재하거나 누가 사용하고 있는지에 대한 가시성이 거의 없습니다. 개발자는 모델이 지원되지 않기 때문이 아니라 도구 통합이 병목 상태가 되기 때문에 중단됩니다.

여러 에이전트가 각각 서로 다른 인증 모델 및 중복된 자격 증명을 사용하여 자신의 도구를 배선하는 모습을 보여 주는 다이어그램

엔터프라이즈에는 게이트웨이, 자격 증명 모음, 정책 및 관찰 가능성과 같은 인프라가 이미 있습니다. 누락된 것은 이 인프라를 재사용 가능하고 검색 가능하며 기본적으로 관리되는 것으로 패키지하는 개발자 환경입니다.

도구 상자는 해당 환경을 제공합니다. 큐레이팅된 도구 집합을 한 번 정의하고, Foundry에서 중앙에서 관리하고, 모든 에이전트가 사용할 수 있는 단일 MCP 호환 엔드포인트를 통해 노출합니다. 플랫폼은 런타임에 자격 증명 주입, 토큰 새로 고침 및 엔터프라이즈 정책 적용을 처리합니다.

도구 상자는 네 가지 핵심 요소를 통해 전체 도구 수명 주기를 다룹니다. 빌드사용 은 현재 사용할 수 있습니다.

기둥 상태 사용할 수 있는 기능
빌드 오늘 사용 가능 도구를 선택하고, 중앙에서 인증을 구성하고, 모든 팀이 사용할 수 있는 재사용 가능한 도구 상자를 게시합니다.
소비 오늘 사용 가능 모든 에이전트를 단일 MCP 호환 엔드포인트에 연결하여 도구 상자의 모든 도구를 동적으로 검색하고 호출합니다.

Foundry 아키텍처의 툴박스 구조를 보여주는 다이어그램: LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code 및 Microsoft Copilot Studio가 사용하는 Build 및 Consume 필러는 기본적으로 관리됩니다.

Foundry에서 툴박스를 생성하지만, 소비 표면은 열려 있습니다. MCP 호환 에이전트 런타임 또는 클라이언트는 모든 프레임워크, MCP 사용 IDE 및 사용자 지정 코드로 빌드된 에이전트를 포함하여 도구 상자를 사용할 수 있습니다.

도구 상자는 관리되는 리소스이므로 에이전트에서 코드를 변경하지 않고 도구를 추가, 제거 또는 다시 구성할 수 있습니다. 에이전트는 항상 단일 엔드포인트에 연결합니다. 도구 상자 버전 관리를 사용하면 변경 내용이 적용되는 시기를 명시적으로 제어할 수 있습니다. 새 버전을 만들고 테스트한 다음 준비가 되면 기본값으로 승격합니다. 도구 상자를 가리키는 모든 에이전트는 코드 변경 및 재배포 없이 승격된 버전을 자동으로 선택합니다.

이 문서에서는 다음 방법을 알아봅니다.

  • 하나 이상의 도구가 있는 도구 상자를 만듭니다.
  • 도구 상자 MCP 엔드포인트를 가져옵니다.
  • 도구가 올바르게 로드되는지 확인합니다.
  • 호스트된 에이전트에 도구 상자를 통합합니다.
  • 도구 상자 버전을 관리하고 버전을 기본값으로 승격합니다.

각 도구 유형에 대한 도구 구성 구문 및 인증 옵션은 도구 구성을 참조하세요.

기능 지원

기능 Python SDK REST API .NET SDK JavaScript SDK azd(배포) Foundry 도구 키트
도구 상자 업데이트, 나열, 가져오기 및 삭제 ✔️ ✔️ ✔️ ✔️ 해당 없음 ✔️
도구 상자 버전 만들기 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
도구 상자 버전 목록, 가져오기 및 삭제 ✔️ ✔️ ✔️ ✔️ 해당 없음 아니요. UI는 최신 버전만 표시합니다.
MCP 도구 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
웹 검색 도구 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Azure AI 검색 도구 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
코드 인터프리터 도구 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
파일 검색 도구 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
OpenAPI 도구 ✔️ ✔️ ✔️ ✔️ ✔️ 아니요
Agent-to-Agent (A2A) 도구 ✔️ ✔️ ✔️ ✔️ ✔️ 아니요

필수 구성 요소

  • 활성 Microsoft Foundry 프로젝트.
  • RBAC: Foundry 프로젝트의 Azure AI 사용자 역할을 시나리오에 적용되는 각 ID에 부여합니다.
    • 개발자 (항상 필요) - 도구 상자 버전을 만들고, 업데이트하고, 관리하는 ID입니다.
    • 에이전트 ID (호스트된 에이전트를 사용하는 경우 필요) - 런타임에 도구를 호출하는 에이전트의 관리 ID입니다.
    • 최종 사용자 (OAuth 흐름에만 필요) - ID가 OAuth 또는 UserEntraToken 연결을 통해 프록시되는 모든 사용자(예: OAuth 기반 MCP 또는 1P OBO 흐름).
  • Foundry 프로젝트는 지원되는 지역 중 하나에 있어야 합니다. 도구 상자 내의 개별 도구 형식은 지역 및 모델에 따라 더욱 제한됩니다. 모든 지역 또는 모든 모델에서 모든 도구 형식을 사용할 수 있는 것은 아닙니다. 지역 및 모델 호환성을 참조하세요.
  • Visual Studio Code(VS Code).
  • Visual Studio Code Marketplace에서 Microsoft Visual Studio Code(이전의 VS Code용 AI 도구 키트)용 Foundry 도구 키트를 설치합니다. Foundry 도구 키트의 도구 상자 지원은 현재 미리 보기로 제공됩니다.
  • Python SDK: pip install azure-ai-projects azure-identity
  • .NET SDK: dotnet add package Azure.AI.Projects --prereleasedotnet add package Azure.Identity
  • JavaScript SDK: npm install @azure/ai-projects @azure/identity
  • azd(배포): Azure 개발자 CLI를 설치하고 에이전트 확장을 추가하십시오: azd extension install azure.ai.agents

중요

  • 도구 상자는 도구 유형당 name 필드가 없는 최대 원 도구(웹 검색, Azure AI 검색, 코드 인터프리터, 파일 검색)을 지원합니다. 동일한 도구 형식의 인스턴스를 둘 이상 포함하려면 각 인스턴스에 고유한 name 인스턴스를 설정하여 구분합니다. name 태그 없이 동일한 형식의 두 인스턴스를 포함하면 invalid_payload 오류가 반환됩니다. 자세한 내용은 여러 도구 유형을 참조하세요.
  • 도구 상자의 description 모든 도구에 추가하면 모델이 각 요청에 적합한 도구를 선택할 수 있습니다.
  • 각 도구의 설명서를 주의 깊게 검토하여 개별 도구 설정, 제한 사항 및 경고에 대해 자세히 알아보세요.

1단계: 도구 상자 버전 만들기

필요한 도구에 따라 도구 상자 버전을 만듭니다.

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, WebSearchTool

# Create Foundry project client
endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(
    endpoint=endpoint,
    credential=DefaultAzureCredential(),
)

# Create toolbox version with web search and MCP tools
toolbox_version = project.beta.toolboxes.create_toolbox_version(
    toolbox_name="my-toolbox",
    description="Toolbox with web search and an MCP server",
    tools=[
        WebSearchTool(),
        MCPTool(
            server_label="myserver",
            server_url="https://your-mcp-server.example.com",
            require_approval="never",
            project_connection_id="my-key-auth-connection",
        ),
    ],
)
print(f"Created toolbox: {toolbox_version.name}, version: {toolbox_version.version}")
using Azure.Identity;
using Azure.AI.Projects;

// Create Foundry project client
var projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";
AIProjectClient projectClient = new(new Uri(projectEndpoint), new DefaultAzureCredential());
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();

ProjectsAgentTool webTool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateWebSearchTool());

ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
    serverLabel: "myserver",
    serverUri: new Uri("https://your-mcp-server.example.com"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval
    )
));

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [webTool, mcpTool],
    description: "Toolbox with web search and an MCP server"
);
Console.WriteLine($"Created toolbox: {toolboxVersion.Name}, version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "description": "Toolbox with web search and an MCP server",
  "tools": [
    {
      "type": "web_search",
      "description": "Search the web for current information"
    },
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "never",
      "project_connection_id": "my-key-auth-connection"
    }
  ]
}

참고

전달자 토큰을 가져올 때 토큰 범위를 https://ai.azure.com/.default 사용합니다.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";

// Create Foundry project client
const projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";

const project = new AIProjectClient(projectEndpoint, new DefaultAzureCredential());

const toolboxVersion = await project.beta.toolboxes.createVersion(
  "my-toolbox",
  [
    {
      type: "web_search",
      description: "Search the web for current information",
    },
    {
      type: "mcp",
      server_label: "myserver",
      server_url: "https://your-mcp-server.example.com",
      require_approval: "never",
      project_connection_id: "my-key-auth-connection",
    },
  ],
  {
    description: "Toolbox with web search and an MCP server",
  },
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);

Visual Studio Code Foundry 도구 키트를 사용하여 도구 보기에서 도구 상자를 만들고 게시합니다.

  1. 작업 표시줄에서 Foundry 도구 키트 를 선택합니다.
  2. 내 리소스에서 프로젝트 이름>도구를 확장합니다.
  3. + 도구 상자 추가 아이콘을 선택합니다.
  4. 사용자 지정 도구 상자 빌드 탭에서 도구 상자 이름 및 설명을 입력하고 원하는 도구를 추가한 다음 게시를 선택합니다.

새 도구 상자를 게시하면 첫 번째 버전이 만들어집니다. 해당 버전은 자동으로 기본 버전이 됩니다.

Visual Studio Code의 Foundry Toolkit 스크린샷으로, 도구 상자 이름, 설명 및 도구에 대한 필드가 있는 사용자 지정 도구 상자 빌드 보기와 게시 작업을 보여줍니다.

azd를 사용하여 SDK를 호출하는 대신 파일에서 agent.yaml 도구 상자 리소스를 선언합니다. resources 섹션에서 도구를 정의하고 azd ai agent init을 사용하여 배포하십시오. agent.yaml 각 도구 유형에 대한 예제는 도구 구성을 참조하세요. 전체 배포 워크플로는 azd를 사용하여 배포를 참조하세요.

중요

-m (또는 --manifest) 플래그가 azd ai agent init. 에이전트 정의 및 원본 파일을 찾을 수 있는 위치를 명령에 알려줍니다.

-m 는 다음 중 하나를 가리킬 수 있습니다.

  • 특정 agent.yaml 파일 — init는 매니페스트와 동일한 디렉터리의 모든 파일을 복사합니다.
  • agent.yaml가 포함된 폴더 — init이 해당 폴더의 모든 파일을 복사합니다.

매니페스트 디렉터리(main.py, Dockerfile, requirements.txt, setup.py 등)의 모든 파일은 아래 src/<agent-name>/의 스캐폴드된 프로젝트에 복사됩니다.

# 1. Create a manifest directory with your agent.yaml + source files
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/

# 2. Initialize the azd project (note: -m is REQUIRED)
cd my-agent
$PROJECT_ID = "/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m https://github.com/microsoft/hosted-agents-vnext-private-preview/main/samples/python/toolbox/azd/agent.yaml --project-id $PROJECT_ID -e my-env
# Or equivalently: azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# ↑ If your agent.yaml declares {{ param }} secrets (e.g., github_pat), you will be prompted to enter
#   them interactively HERE — before init completes. This is the only safe time to supply credentials.
# NOTE: Do NOT use --no-prompt here — it skips the prompt and leaves {{ param }} credentials empty (see Troubleshooting: Credentials Empty with --no-prompt)

# 3. CRITICAL post-init fixes (see "Post-Init Checklist" below)
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env  # must match the deployment name in azure.yaml

# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env

# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env

# 6. Invoke the agent (MUST run from the scaffolded project directory)
azd ai agent invoke --new-session "tell me about the latest news in Microsoft Foundry" --timeout 120

Agent.yaml:

kind: hosted
name: toolbox-azd-test
description: LangGraph agent wired for toolbox MCP.
metadata:
  tags:
    - AI Agent Hosting
    - LangGraph

# template: contains the ContainerAgent definition (kind: hosted).
# These fields are used to generate src/<agent>/agent.yaml during init.
template:
  kind: hosted
  protocols:
    - protocol: responses
      version: 1.0.0
  environment_variables:
    # FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
    # automatically by the platform at runtime — do NOT declare them here.
    - name: AZURE_OPENAI_ENDPOINT
      value: ${AZURE_OPENAI_ENDPOINT}
    - name: AZURE_AI_MODEL_DEPLOYMENT_NAME
      value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
    - name: TOOLBOX_NAME
      value: ${TOOLBOX_NAME=agent-tools}

# parameters: secret values prompted at init time (or set via azd env).
# azd uppercases the param name to find the env var: github_pat → GITHUB_PAT.
parameters:
  github_pat:
    secret: true
    description: GitHub Personal Access Token (classic ghp_... or fine-grained github_pat_...)

# resources: connections and toolboxes scaffolded into azure.yaml by azd ai agent init.
resources:
  - kind: connection
    name: github-mcp-conn
    target: https://api.githubcopilot.com/mcp
    category: remoteTool
    credentials:
      type: CustomKeys
      keys:
        Authorization: "Bearer {{ github_pat }}"

  - kind: toolbox
    name: agent-tools
    tools:
      - type: web_search
      - type: mcp
        server_label: github
        server_url: https://api.githubcopilot.com/mcp
        project_connection_id: github-mcp-conn

2단계: 도구 상자 MCP 엔드포인트 가져오기

역할에 따라 두 개의 엔드포인트 패턴이 존재합니다.

역할 끝점 사용 시기
도구 상자 개발자 {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 기본값으로 승격하기 전에 특정 버전을 테스트하거나 유효성을 검사합니다.
툴박스 사용자 {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 도구 상자에 에이전트를 연결합니다. 항상 default_version를 제공합니다. 만든 첫 번째 버전은 자동으로 기본값으로 설정됩니다.

중요

도구 상자 MCP 엔드포인트에 대한 모든 요청에는 헤더 Foundry-Features: Toolboxes=V1Preview가 포함되어야 합니다. 이 헤더를 생략하는 호출은 실패합니다. 도구 상자 엔드포인트를 호출하는 모든 HTTP 클라이언트, MCP 전송 및 SDK 래퍼에 포함합니다.

참고

새 도구 상자의 첫 번째 버전은 자동으로 (v1)로 default_version 승격됩니다. 나중에 기본값을 변경해야 하는 경우 버전 수준을 기본값으로 승격을 참조하세요.

Visual Studio Code Foundry 도구 키트의 도구 상자 보기에서 도구 상자 소비자 엔드포인트를 복사합니다.

  1. 작업 표시줄에서 Foundry 도구 키트 를 선택합니다.
  2. 내 리소스에서 프로젝트 이름>도구를 확장합니다.
  3. 도구 상자 탭에서 도구 상자를 찾습니다.
  4. 엔드포인트 URL 열에서 엔드포인트를 복사합니다.

엔드포인트 URL 값은 도구 상자 소비자 엔드포인트입니다. 버전별 엔드포인트를 생성하려면 이전 표에 표시된 개발자 패턴을 사용합니다.

&It;c2>&It;c1>&It;c0>&It;sb0> Visual Studio Code에서 도구 상자의 보기와 도구 상자 엔드포인트 URL 및 스캐폴드 코드 템플릿이라는 작업을 보여 주는 Foundry 도구 키트의 스크린샷입니다.&It;/sb0>&It;/c0>&It;/c1>&It;/c2>

3단계: 도구 가용성 확인

전체 에이전트를 실행하기 전에 도구 상자가 엔드포인트에 대해 MCP 클라이언트 SDK를 사용하여 예상된 도구를 로드하는지 확인합니다. 버전별 엔드포인트를 사용하여 버전 유효성을 검사한 후 기본값으로 승격합니다.

MCP 클라이언트 SDK를 설치합니다.

pip install mcp

도구 상자 및 목록 도구에 연결

import asyncio
from azure.identity import DefaultAzureCredential
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession

url = "https://<account>.services.ai.azure.com/api/projects/<proj>/toolboxes/<name>/versions/<version>/mcp?api-version=v1"

token = DefaultAzureCredential().get_token("https://ai.azure.com/.default").token
headers = {
    "Authorization": f"Bearer {token}",
    "Foundry-Features": "Toolboxes=V1Preview",
}

async def verify_toolbox():
    async with streamablehttp_client(url, headers=headers) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()

            # List available tools
            tools_result = await session.list_tools()
            print(f"Tools found: {len(tools_result.tools)}")
            for tool in tools_result.tools:
                print(f"  - {tool.name}: {(tool.description or '')[:80]}")

            # Call a tool (replace with actual tool name and arguments)
            result = await session.call_tool("<tool_name>", arguments={})
            print(result)

asyncio.run(verify_toolbox())

참고

REST API 탭을 사용하여 .NET 도구 가용성을 확인하거나 Python MCP 클라이언트 SDK를 사용합니다.

버전별 엔드포인트(/versions/{version}/mcp)를 사용하여 버전을 승격하기 전에 버전 유효성을 검사합니다.

1. MCP 세션을 초기화합니다.

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}

2. 초기화된 알림을 보냅니다.

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","method":"notifications/initialized"}

3. 사용 가능한 도구 나열:

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}

4. 도구 호출:

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"<TOOL_NAME>","arguments":{}}}

MCP 클라이언트 SDK를 설치합니다.

npm install @modelcontextprotocol/sdk

도구 상자 및 목록 도구에 연결

import { DefaultAzureCredential } from "@azure/identity";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";

const url = "https://<account>.services.ai.azure.com/api/projects/<proj>/toolboxes/<name>/versions/<version>/mcp?api-version=v1";

const credential = new DefaultAzureCredential();
const token = await credential.getToken("https://ai.azure.com/.default");

const transport = new StreamableHTTPClientTransport(
  new URL(url),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${token.token}`,
        "Foundry-Features": "Toolboxes=V1Preview",
      },
    },
  },
);

const client = new Client({ name: "test", version: "1.0" });
await client.connect(transport);

// List available tools
const toolsResult = await client.listTools();
console.log(`Tools found: ${toolsResult.tools.length}`);
for (const tool of toolsResult.tools) {
  console.log(`  - ${tool.name}: ${(tool.description || "").slice(0, 80)}`);
}

// Call a tool (replace with actual tool name and arguments)
const result = await client.callTool({ name: "<tool_name>", arguments: {} });
console.log(result);

await client.close();

스캐폴드된 호스트 에이전트 샘플과 함께 2단계의 엔드포인트를 사용하여 VS Code에서 도구 상자 로드의 유효성을 검사합니다.

  1. Foundry 도구 키트내 리소스>프로젝트 이름>도구에서 테스트할 도구 상자를 찾습니다.
  2. 스캐폴드 코드 템플릿을 선택합니다.
  3. 메시지가 표시되면 프로젝트 폴더를 선택합니다.
  4. 생성된 README.md 항목에 따라 종속성을 설치하고, 환경 변수를 구성하고, 샘플을 로컬로 실행합니다.
  5. 에이전트 검사기를 사용하거나 실행 python main.py 하여 도구 상자 도구 로드 및 응답을 확인합니다.

새 도구 상자 버전을 승격하기 전에 버전별 유효성 검사를 수행하려면 이 단계에서 Python 또는 REST API 탭을 사용합니다.

참고

REST API 탭을 사용하여 도구 가용성을 확인하거나 Python MCP 클라이언트 SDK를 사용합니다.

확인 — 초기화: HTTP 200. 초기화 단계를 건너뛰면 후속 호출이 실패합니다.

확인 — tools/list:

  • len(tools) > 0 - 비어 있으면 도구 상자 버전이 올바르게 프로비전되지 않았습니다.
  • 각 도구에는 name, descriptioninputSchema. 도구 명명 규칙은 MCP 사양을 참조하세요.
  • inputSchema에는 properties라는 필드가 있습니다. 일부 MCP 서버는 이 필드를 생략하여 OpenAI가 중단될 수 있습니다.
  • MCP 도구의 경우 이름 앞에 접두사(예: server_label ) myserver.some_tool가 수록됩니다. 다른 모든 도구 형식의 경우 이름은 필드 값 또는 기본 도구 이름입니다 name .
  • MCP 도구에는 다음과 같은 _meta.tool_configuration런타임 설정이 포함된 블록이 포함됩니다require_approval. 핸들 도구 승인 요구 사항을 참조하세요.
  • 호출 단계의 정확한 매개 변수 이름(예 query : 대 queries)을 확인합니다.

확인 - tools/call:

  • 최상위 error 필드가 없습니다. error.code이 있는 경우 검사합니다. 표준 MCP 오류 코드는 MCP 사양을 참조하세요.
    • -32006 → OAuth 동의가 필요합니다(URL 추출 error.message).
    • 기타 코드는 서버 측 실패를 나타냅니다.
  • result.content[] 포함된 항목은 "type": "text" - 이것이 도구 출력입니다.
  • AI Search의 경우 result.structuredContent.documents[]에서 청크 메타데이터(title, url, id, score)를 확인합니다.
  • 파일 검색을 위해 result.content[].resource._meta에서 청크 메타데이터(title, file_id, document_chunk_id, score)를 확인합니다.
  • 웹 검색의 경우 URL 인용(result.content[].resource._meta.annotations[], type, url, title, start_index, end_index)을 확인하세요.
  • "ServerError" 텍스트 콘텐츠를 감시합니다. 도구가 실행되었지만 내부 오류가 발생했습니다.

도구별 tools/call 인수 예제:

도구 유형 인수
AI 검색 {"query": "search text"}
파일 검색 {"queries": ["search text"]}
코드 인터프리터 {"code": "print(2 ** 100)"}
웹 검색 {"search_query": "weather in seattle"}
A2A {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
MCP {"query": "what is agent service"}

4단계: 도구 상자를 에이전트에 통합

LangGraph

.env 파일:

FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
TOOLBOX_NAME=agent-tools
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o

main.py (키 패턴):

from langchain_azure_ai.tools import AzureAIProjectToolbox

toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()

전체 구현에 대한 전체 샘플을 참조하세요.

중요

클래스 langchain_azure_ai.tools.AzureAIProjectToolbox 에는 .가 필요합니다.langchain-azure-ai[tools]>1.2.3

Microsoft 에이전트 프레임워크

에이전트 프레임워크 SDK의 MCPStreamableHTTPTool를 사용하여 도구 상자 MCP 엔드포인트에 직접 연결합니다.

.env 파일:

FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o

main.py (키 패턴):

# Auth: wrap token provider in an httpx.Auth subclass
credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://ai.azure.com/.default")
http_client = httpx.AsyncClient(
    auth=_ToolboxAuth(token_provider),
    headers={"Foundry-Features": "Toolboxes=V1Preview"},
    timeout=120.0,
)

# Toolbox MCP endpoint (platform-injected at runtime via FOUNDRY_AGENT_TOOLBOX_ENDPOINT)
TOOLBOX_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1"

# Connect MCPStreamableHTTPTool to the toolbox endpoint
mcp_tool = MCPStreamableHTTPTool(
    name="toolbox",
    url=TOOLBOX_ENDPOINT,
    http_client=http_client,
    load_prompts=False,
)

agent = chat_client.as_agent(
    name="my-toolbox-agent",
    instructions="You are a helpful assistant with access to Foundry toolbox tools.",
    tools=[mcp_tool],
)
ResponsesAgentServerHost().run()

전체 구현에 대한 전체 샘플을 참조하세요.

코필로트 SDK

GitHub Copilot SDK를 사용하여 Copilot 도구 호출을 Foundry 도구 상자 MCP 엔드포인트에 연결하는 도구 상자 기반 에이전트를 빌드합니다.

참고

Copilot SDK는 점이 포함된 도구 이름을 거부합니다. 브리지는 도구 이름에서 ._로 자동으로 교체합니다. 예를 들어 myserver.get_infomyserver_get_info로 변합니다.

.env 파일:

GITHUB_TOKEN=<your-github-token>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1

agent.py (키 패턴 - MCP 브리지):

# 1. Open an MCP session to the toolbox endpoint
bridge = McpBridge(endpoint=TOOLBOX_ENDPOINT, token=_get_toolbox_token())
await bridge.initialize()
mcp_tools = await bridge.list_tools()

# 2. Map MCP tool list to Copilot SDK tool definitions
#    Dots in tool names are replaced with underscores (Copilot SDK requirement)
copilot_tools = [
    {
        "name": t["name"].replace(".", "_"),
        "description": t.get("description", ""),
        "parameters": t.get("inputSchema", {}),
    }
    for t in mcp_tools
]

# 3. Wire tool calls back to the MCP session
async def tool_handler(name: str, arguments: dict) -> str:
    return await bridge.call_tool(name.replace("_", ".", 1), arguments)

# 4. Run the Copilot SDK agent
agent = Agent(
    tools=copilot_tools,
    tool_handler=tool_handler,
    token=os.environ["GITHUB_TOKEN"],
)

전체 구현에 대한 전체 샘플을 참조하세요.

Microsoft 에이전트 프레임워크

Agent Framework SDK의 ResponsesServer 을 활용하여 커스텀 ToolboxMcpClient 를 통해 MCP 엔드포인트를 거쳐 도구함 도구를 검색하고 호출할 수 있습니다.

환경 변수:

AZURE_OPENAI_ENDPOINT=https://<account>.services.ai.azure.com
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
TOOLBOX_MCP_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1

Program.cs (키 패턴):

using Azure.AI.AgentServer.Responses;
using Azure.AI.AgentServer.Responses.Models;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;

// Azure OpenAI endpoint and model deployment
var openAiEndpoint = "https://<account>.services.ai.azure.com";
var deployment = "gpt-4o";  // supports all toolbox tool types

// Toolbox MCP endpoint (platform-injected at runtime via TOOLBOX_MCP_ENDPOINT)
var toolboxEndpoint = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1";

// Azure OpenAI client
var credential = new DefaultAzureCredential();
var openAIClient = new AzureOpenAIClient(new Uri(openAiEndpoint), credential);
var chatClient = openAIClient.GetChatClient(deployment);

// Toolbox MCP client — discovers tools via tools/list, calls them via tools/call
var toolboxClient = new ToolboxMcpClient(toolboxEndpoint, credential);

ResponsesServer.Run<ToolboxHandler>(configure: builder =>
{
    builder.Services.AddSingleton(new AgentConfig(chatClient, toolboxClient));
});

ToolboxMcpClient 는 MCP 엔드포인트에 대한 직접 JSON-RPC 호출을 래핑합니다. ToolboxHandler 는 표준 도구 호출 루프를 사용하여 LLM 도구 호출을 MCP 클라이언트에 다시 연결합니다. 두 클래스의 전체 구현은 전체 샘플을 참조하세요.

참고

이 단계의 통합 샘플은 Python 및 .NET 경우에만 사용할 수 있습니다.

참고

이 단계의 통합 샘플은 Python 및 .NET 경우에만 사용할 수 있습니다.

Foundry 도구 키트를 사용하여 도구 상자에 이미 유선으로 연결된 호스트된 에이전트 샘플을 스캐폴드합니다.

  1. 작업 표시줄에서 Foundry 도구 키트 를 선택합니다.
  2. 내 리소스에서 프로젝트 이름>도구를 확장합니다.
  3. 도구 상자 탭에서 사용할 도구 상자를 찾은 다음, 스캐폴드 코드 템플릿을 선택합니다.
  4. 명령 팔레트에서 메시지가 표시되면 프로젝트 폴더를 선택합니다.
  5. 생성된 README.md 파일을 열고 스캐폴드에 대한 설정, 로컬 실행 및 배포 단계를 따릅니다.

생성된 프로젝트에는 호스트된 에이전트 진입점, 배포 파일 및 README.md 정확한 설정, 실행 및 배포 단계가 포함됩니다. 스캐폴딩된 에이전트가 Foundry-Features: Toolboxes=V1Preview 헤더를 자동으로 처리해 줍니다.

새 샘플을 생성하는 대신 기존 호스트 에이전트 프로젝트에 도구 상자를 통합하려면 이 섹션의 Python 또는 .NET 패턴과 함께 2단계에서 복사한 엔드포인트를 사용합니다.

azd를 사용하여 배포

Azure 개발자 CLI(azd)를 사용하여 도구 상자 리소스를 agent.yaml 파일에 직접 선언하고 단일 명령으로 에이전트를 배포합니다. 이 방법을 사용하면 SDK 또는 REST를 통해 도구 상자를 별도로 만들 필요가 없습니다. azd 는 도구 상자, 연결 및 모델 배포를 함께 프로비전합니다.

중요

-m (또는 --manifest) 플래그는 azd ai agent init에 필요합니다. 에이전트 정의 및 원본 파일을 찾을 수 있는 위치를 명령에 알려줍니다. -m 은 특정 agent.yaml 파일 또는 파일이 포함된 폴더를 가리킬 수 있습니다. 매니페스트 디렉터리(main.py, Dockerfile, requirements.txt등)의 모든 파일은 아래의 스캐폴드된 프로젝트에 src/<agent-name>/축자 복사됩니다.

폴더 구조:

my-agent/
├── agent.yaml          # Agent, toolbox, and connection declarations
├── main.py             # LangGraph agent
├── requirements.txt    # All dependencies (Azure SDK + PyPI packages)
├── Dockerfile          # Container build

agent.yaml(Web Search + GitHub MCP 예제):

name: my-toolbox-agent
description: LangGraph agent with Azure AI Foundry toolbox MCP.
metadata:
  tags:
    - AI Agent Hosting
    - LangGraph
template:
  name: my-toolbox-agent
  kind: hosted
  protocols:
    - protocol: responses
      version: 1.0.0
  environment_variables:
    # FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
    # automatically by the platform at runtime — do NOT declare them here.
    - name: AZURE_AI_MODEL_DEPLOYMENT_NAME
      value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
    - name: TOOLBOX_NAME
      value: ${TOOLBOX_NAME=agent-tools}
parameters:
  github_pat:
    secret: true
    description: GitHub Personal Access Token for MCP connection
resources:
  - kind: connection
    name: github-mcp-conn
    target: https://api.githubcopilot.com/mcp
    category: RemoteTool
    authType: CustomKeys
    credentials:
      keys:
        Authorization: "Bearer {{ github_pat }}"
  - kind: toolbox
    name: agent-tools
    description: Web search and GitHub MCP tools
    tools:
      - type: web_search
      - type: mcp
        server_label: github
        server_url: https://api.githubcopilot.com/mcp
        project_connection_id: github-mcp-conn

참고

도구 상자 리소스를 agent.yaml을(를) 사용하여 배포하는 경우, 플랫폼은 FOUNDRY_AGENT_TOOLBOX_ENDPOINT (기본 URL) 및 TOOLBOX_{toolbox_name}_MCP_ENDPOINT (전체 도구 상자 엔드포인트)를 환경 변수로 삽입합니다. 명명 agent-tools된 도구 상자의 경우 도구 상자별 변수가 됩니다 TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT. 귀하의 main.py 은 런타임에 도구상자별 변수를 읽거나 FOUNDRY_AGENT_TOOLBOX_ENDPOINTTOOLBOX_NAME 으로부터 URL을 구성합니다.

main.py 는 앞에서 보여 준 것과 동일한 LangGraph 패턴을 따릅니다. 를 사용하여 azdFOUNDRY_AGENT_TOOLBOX_ENDPOINTTOOLBOX_{toolbox_name}_MCP_ENDPOINT 자동으로 삽입됩니다. 코드에는 추가 엔드포인트 구성이 필요하지 않습니다.

배포:

# 1. Place agent.yaml and source files in a manifest directory
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/

# 2. Initialize the azd project (-m is required)
cd my-agent
PROJECT_ID="/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# If agent.yaml declares {{ param }} secrets (for example, github_pat), you are prompted
# to enter them interactively here. Do NOT use --no-prompt — it leaves credentials empty.

# 3. Set required environment variables
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env

# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env

# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env

# 6. Invoke the agent
azd ai agent invoke --new-session "Hello, what tools do you have?" --timeout 120

도구 승인 요구 사항 처리

도구 상자는 _meta.tool_configuration에 의해 반환된 모든 도구 항목에 대해 tools/list 객체를 반환합니다. 도구의 require_approval 속성이 "always"로 설정된 경우, 에이전트 런타임은 해당 도구를 실행하기 전에 사용자에게 보류 중인 작업을 안내하고 명시적인 승인을 기다려야 합니다. MCP 엔드포인트는 차단 tools/call. 적용은 전적으로 에이전트 런타임의 책임입니다.

require_approval에서 tools/list를 읽기

응답의 tools/list 각 도구 항목에는 도구 상자에서 반환되는 _meta 블록이 포함됩니다.

{
  "name": "myserver.my_tool",
  "description": "...",
  "inputSchema": { "type": "object" },
  "_meta": {
    "tool_configuration": {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "always"
    }
  }
}
require_approval 동작
"always" 에이전트는 모든 호출 전에 사용자에게 확인을 요청해야 합니다.
"never" 에이전트는 도구를 자유롭게 호출할 수 있습니다.

승인 게이팅 구현(LangGraph)

시작 시 쿼리 tools/list 하여 승인 맵을 빌드한 다음 승인이 필요한 도구에 대한 제약 조건을 시스템 프롬프트에 삽입합니다.

async def _fetch_require_approval_tools(
    endpoint: str,
    auth: httpx.Auth,
    extra_headers: dict,
) -> dict[str, str]:
    async with httpx.AsyncClient(auth=auth, headers=extra_headers, timeout=30.0) as hc:
        payload = {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}
        resp = await hc.post(endpoint, json=payload)
        resp.raise_for_status()
    return {
        t["name"]: t["_meta"]["tool_configuration"]["require_approval"]
        for t in resp.json().get("result", {}).get("tools", [])
        if t.get("_meta", {}).get("tool_configuration", {}).get("require_approval")
    }

MCP 클라이언트에서 도구를 로드한 후 승인이 필요한 도구를 검색하고 시스템 프롬프트를 조정합니다.

approval_map = await _fetch_require_approval_tools(
    TOOLBOX_ENDPOINT, toolbox_auth, extra_headers
)
always_approval = [name for name, val in approval_map.items() if val == "always"]

참고

  • 탐지는 시작 시 수행됩니다. 승인 검사는 에이전트가 초기화되면 한 번 실행됩니다. 호출당 오버헤드는 없습니다.
  • 우아한 대체 방법. 도구가 require_approval: "always"없으면 시스템 프롬프트가 변경되지 않고 에이전트가 이전과 같이 동작합니다.
  • require_approval 는 에이전트에 의해 강제됩니다. 이 설정에 관계없이 도구 상자 MCP 프록시가 tools/call 실행됩니다. 에이전트 런타임이 호출을 제어하는 역할을 담당합니다.

require_approval을(를) 도구에서 설정

도구 상자 버전을 만들 때 require_approval를 설정하십시오. 1단계의 MCP 도구 예제는 "always""never" 값을 모두 보여 줍니다. SDK를 통해 설정할 수도 있습니다.

from azure.ai.projects.models import MCPTool

# Set require_approval on an MCP tool
toolbox_version = project.beta.toolboxes.create_toolbox_version(
    toolbox_name="my-toolbox",
    tools=[
        MCPTool(
            server_label="myserver",
            server_url="https://your-mcp-server.example.com",
            require_approval="always",  # "always" | "never"
            project_connection_id="my-connection",
        )
    ],
)
{
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "always",
      "project_connection_id": "my-connection"
    }
  ]
}
ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
    serverLabel: "myserver",
    serverUri: new Uri("https://your-mcp-server.example.com"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval
    )
));
const tools = [
  {
    type: "mcp",
    server_label: "myserver",
    server_url: "https://your-mcp-server.example.com",
    require_approval: "always",
    project_connection_id: "my-connection",
  },
];

Python, .NET, JavaScript, REST API 또는 azd 탭을 사용하여 도구 상자 정의에서 require_approval 구성합니다. 이 문서의 Foundry 도구 키트 워크플로는 Visual Studio Code 도구 상자를 만들고 사용하는 데 중점을 둡니다.

resources:
  - kind: toolbox
    name: my-toolbox
    tools:
      - type: mcp
        server_label: myserver
        server_url: https://your-mcp-server.example.com
        require_approval: always
        project_connection_id: my-connection

5단계: 도구 상자 버전 관리

참고

Python SDK, .NET SDK, JavaScript SDK 및 REST API를 통해 도구 상자 버전(목록, 가져오기, 승격, 삭제)을 관리할 수 있습니다. azd CLI는 배포 중에 도구 상자 버전 만들기만 지원합니다.

도구 상자 버전은 도구 상자 도구 구성의 변경할 수 없는 스냅샷입니다. 엔드포인트 만들기를 호출할 때마다 새 ToolboxVersionObject엔드포인트가 생성됩니다. 부모 ToolboxObject 에는 default_version MCP 엔드포인트가 제공하는 버전을 제어하는 필드가 있습니다. 새 버전을 생성한다고 해서 자동으로 적용되는 것은 아닙니다. 업데이트 시기는 사용자가 직접 결정합니다 default_version. 이 프로세스를 통해 변경 내용을 스테이징하고, 새 버전을 독립적으로 테스트하고, 사용자 고유의 일정에 따라 프로덕션으로 승격할 수 있습니다.

객체 주요 필드 설명
ToolboxObject id, name, default_version 도구 상자 컨테이너입니다. default_version 는 현재 버전을 가리킵니다.
ToolboxVersionObject id, name, version, description, created_at, tools[]policies 특정 시점에 도구 상자 도구 목록의 변경할 수 없는 스냅샷입니다.

새 버전 만들기

각 만들기 호출은 새 버전을 생성합니다. 도구 상자가 아직 없으면 프로세스에서 자동으로 도구 상자를 만듭니다. 새 도구 상자의 첫 번째 버전을 만들 때 기본 버전은 다른 버전 v1으로 수동으로 업데이트할 때까지입니다.

# Create a new toolbox version
toolbox_version = project.beta.toolboxes.create_toolbox_version(
    toolbox_name="my-toolbox",
    description="Updated tools v2",
    tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Updated tools v2"
);
Console.WriteLine($"Created version: {toolboxVersion.Version}");

POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "description": "Updated tools v2",
  "tools": [...]
}
const toolboxVersion = await project.beta.toolboxes.createVersion(
  "my-toolbox",
  [/* tools array */],
  { description: "Updated tools v2" },
);
console.log(`Created version: ${toolboxVersion.version}`);

Python, .NET, JavaScript 또는 REST API 탭을 사용하여 새 도구 상자 버전을 만듭니다. 이 문서의 Foundry 도구 키트 워크플로는 도구 상자를 만들고 이를 사용하는 호스트된 에이전트를 스캐폴딩하는 데 중점을 둡니다.

이 작업은 azd에서 지원되지 않습니다. 도구 상자 버전을 만들려면 Python, .NET, REST API 또는 JavaScript 탭을 사용합니다.

응답은 ToolboxVersionObjectversion 식별자를 포함하는 것입니다.

버전 나열

# List all toolbox versions
versions = list(project.beta.toolboxes.list_toolbox_versions(toolbox_name="my-toolbox"))
for v in versions:
    print(f"{v.version} — created {v.created_at}")
List<ToolboxVersion> versions = await toolboxClient
    .GetToolboxVersionsAsync("my-toolbox")
    .ToListAsync();
Console.WriteLine($"Found {versions.Count} toolbox version(s).");
foreach (ToolboxVersion v in versions)
{
    Console.WriteLine($"  - {v.Name} ({v.Version})");
}
GET {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
const versions = project.beta.toolboxes.listVersions("my-toolbox");
for await (const v of versions) {
  console.log(`${v.version} — created ${v.createdAt}`);
}

Python, .NET, JavaScript 또는 REST API 탭을 사용하여 도구 상자 버전을 나열합니다.

이 작업은 azd에서 지원되지 않습니다. 도구 상자 버전을 나열하려면 Python, .NET, REST API 또는 JavaScript 탭을 사용합니다.

특정 버전 가져오기

# Get a specific toolbox version
version_obj = project.beta.toolboxes.get_toolbox_version(
    toolbox_name="my-toolbox",
    version="<version_id>",
)
ToolboxVersion versionObj = await toolboxClient.GetToolboxVersionAsync(
    "my-toolbox",
    "<version_id>"
);
Console.WriteLine($"Retrieved toolbox: {versionObj.Name} ({versionObj.Id})");
GET {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
const versionObj = await project.beta.toolboxes.getVersion(
  "my-toolbox",
  "<version_id>",
);
console.log(`Retrieved version: ${versionObj.version}`);

Python, .NET, JavaScript 또는 REST API 탭을 사용하여 특정 도구 상자 버전을 가져옵니다.

이 작업은 azd에서 지원되지 않습니다. 특정 도구 상자 버전을 얻으려면 Python, .NET, REST API 또는 JavaScript 탭을 사용합니다.

버전을 기본값으로 승격

MCP 엔드포인트는 항상 default_version를 제공합니다. 활성 상태인 버전을 전환하려면 도구 상자를 업데이트합니다.

# Promote a version to default
toolbox = project.beta.toolboxes.update(
    toolbox_name="my-toolbox",
    default_version="<version_id>",
)
print(f"Active version: {toolbox.default_version}")
ToolboxRecord record = await toolboxClient.UpdateToolboxAsync(
    "my-toolbox",
    "<version_id>"
);
Console.WriteLine($"Active version: {record.DefaultVersion}");
PATCH {project_endpoint}/toolboxes/my-toolbox?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "default_version": "<version_id>"
}

default_version 은 비워 둘 수 없습니다. 새 버전으로 대체합니다.

const toolbox = await project.beta.toolboxes.update(
  "my-toolbox",
  "<version_id>",
);
console.log(`Active version: ${toolbox.defaultVersion}`);

Python, .NET, JavaScript 또는 REST API 탭을 사용하여 도구 상자 버전을 기본값으로 승격합니다.

이 작업은 azd에서 지원되지 않습니다. 버전을 기본값으로 승격하려면 Python, .NET, REST API 또는 JavaScript 탭을 사용합니다.

버전 삭제

# Delete a toolbox version
project.beta.toolboxes.delete_toolbox_version(
    toolbox_name="my-toolbox",
    version="<version_id>",
)
await toolboxClient.DeleteToolboxVersionAsync(
    "my-toolbox",
    "<version_id>"
);
DELETE {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
await project.beta.toolboxes.deleteVersion(
  "my-toolbox",
  "<version_id>",
);

Python, .NET, JavaScript 또는 REST API 탭을 사용하여 도구 상자 버전을 삭제합니다.

이 작업은 azd에서 지원되지 않습니다. 도구 상자 버전을 삭제하려면 Python.NETREST API 또는 JavaScript 탭을 사용합니다.

도구 구성

시나리오와 일치하는 도구 유형 및 인증 패턴을 선택합니다. 선호하는 SDK 또는 배포 방법에 대한 탭을 선택합니다.

여러 도구 유형

단일 도구 상자는 다양한 도구 유형을 번들로 묶을 수 있습니다. 다음 예제에서는 웹 검색, Azure AI 검색 및 MCP 서버를 하나의 도구 상자에 결합합니다.

{
  "description": "Web search, knowledge base search, and custom MCP server",
  "tools": [
    {
      "type": "web_search",
      "description": "Search the web for current information"
    },
    {
      "type": "azure_ai_search",
      "name": "my_aisearch",
      "description": "Search internal product documentation",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<INDEX_NAME>",
            "project_connection_id": "<CONNECTION_NAME>"
          }
        ]
      }
    },
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "never",
      "project_connection_id": "my-key-auth-connection"
    }
  ]
}

참고

각 도구 형식(web_search, azure_ai_search, code_interpreter, file_search)은 name 필드 없이 최대 한 번만 나타날 수 있습니다. 동일한 형식의 여러 인스턴스를 포함하려면 각 인스턴스에 고유한 name 인스턴스를 설정합니다. 다음 예제를 참조하세요.

다중 도구 제한 사항

도구 상자에 필드 없이 각 기본 제공 도구 형식의 인스턴스를 name 하나 이상 포함할 수 있습니다. 동일한 형식의 두 인스턴스를 name 없이 포함하는 경우, API는 다음을 반환합니다.

400 invalid_payload: Multiple tools without identifiers found...

동일한 도구 형식의 두 인스턴스

필드를 name 사용하여 동일한 도구 형식의 여러 인스턴스를 하나의 도구 상자에 포함할 수 있습니다. 명명된 각 인스턴스는 별도의 도구로 처리되며 고유한 이름이 있어야 합니다.

{
  "description": "Two Azure AI Search indexes in a single toolbox",
  "tools": [
    {
      "type": "azure_ai_search",
      "name": "product-search",
      "description": "Search product catalog and specifications",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<PRODUCT_INDEX_NAME>",
            "project_connection_id": "<PRODUCT_CONNECTION_NAME>"
          }
        ]
      }
    },
    {
      "type": "azure_ai_search",
      "name": "support-search",
      "description": "Search support tickets and troubleshooting guides",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<SUPPORT_INDEX_NAME>",
            "project_connection_id": "<SUPPORT_CONNECTION_NAME>"
          }
        ]
      }
    }
  ]
}

다음 섹션에서는 각 도구 형식의 구성을 자세히 보여줍니다.

MCP(모델 컨텍스트 프로토콜)

키 기반 인증:

{
  "description": "my-mcp-toolbox",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "project_connection_id": "my-mcp-connection"
    }
  ]
}

인증 없음(공용 MCP 서버):

{
  "description": "Public MCP server",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com"
    }
  ]
}

OAuth 또는 ID 기반 인증:

OAuth(관리 커넥터, 사용자 지정 앱 등록), 에이전트 ID 또는 사용자 Entra 토큰 인증의 경우 먼저 Foundry 프로젝트에서 적절한 연결을 만든 다음 다음을 사용하여 참조 project_connection_id합니다.

{
  "description": "MCP server with OAuth/identity auth",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "project_connection_id": "<OAUTH_OR_IDENTITY_CONNECTION_NAME>"
    }
  ]
}

연결에 authType 따라 인증 흐름이 결정됩니다. MCP에 지원되는 연결 인증 유형에는 CustomKeys, OAuth2 (관리형 또는 사용자 지정) AgenticIdentityUserEntraToken. 각 인증 유형에 대한 연결 구성 예제는 azd 탭 을 참조하세요.

from azure.ai.projects.models import MCPTool

tools = [
    MCPTool(
        server_label="myserver",
        server_url="https://your-mcp-server.example.com",
        project_connection_id="my-mcp-connection",
    )
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
    serverLabel: "myserver",
    serverUri: new Uri("https://your-mcp-server.example.com")
));

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "my-mcp-toolbox"
);
const tools = [
  {
    type: "mcp",
    server_label: "myserver",
    server_url: "https://your-mcp-server.example.com",
    project_connection_id: "my-mcp-connection",
  },
];

인증 없음:

resources:
  - kind: toolbox
    name: mcp-tools
    description: Public MCP server tools
    tools:
      - type: mcp
        server_label: myserver
        server_url: https://your-mcp-server.example.com

키 기반 인증:

parameters:
  mcp_api_key:
    secret: true
    description: API key for the MCP server
resources:
  - kind: connection
    name: mcp-conn
    target: https://your-mcp-server.example.com
    category: RemoteTool
    authType: CustomKeys
    credentials:
      keys:
        Authorization: "Bearer {{ mcp_api_key }}"
  - kind: toolbox
    name: mcp-tools
    description: MCP server tools with key auth
    tools:
      - type: mcp
        server_label: myserver
        server_url: https://your-mcp-server.example.com
        project_connection_id: mcp-conn

OAuth - 관리되는 커넥터:

Foundry의 관리되는 OAuth 흐름을 지원하는 MCP 서버에 이 패턴을 사용합니다. 이 값은 connectorName Foundry 도구 카탈로그에서 사용할 수 있는 관리되는 커넥터와 일치해야 합니다.

resources:
  - kind: connection
    name: github-oauth-conn
    category: RemoteTool
    authType: OAuth2
    target: https://api.githubcopilot.com/mcp
    connectorName: foundrygithubmcp
  - kind: toolbox
    name: oauth-tools
    description: GitHub OAuth MCP toolbox
    tools:
      - type: mcp
        server_label: github
        project_connection_id: github-oauth-conn

OAuth - 사용자 지정 앱 등록:

MCP 서버에 대한 사용자 고유의 OAuth 앱 등록을 가져올 때 이 패턴을 사용합니다.

parameters:
  oauth_client_id:
    secret: true
    description: OAuth client ID
  oauth_client_secret:
    secret: true
    description: OAuth client secret
resources:
  - kind: connection
    name: mcp-oauth-custom-conn
    category: RemoteTool
    authType: OAuth2
    target: https://your-mcp-server.example.com
    authorizationUrl: https://auth.example.com/authorize
    tokenUrl: https://auth.example.com/token
    refreshUrl: https://auth.example.com/token
    scopes: []
    credentials:
      clientID: "{{ oauth_client_id }}"
      clientSecret: "{{ oauth_client_secret }}"
  - kind: toolbox
    name: oauth-custom-tools
    description: MCP toolbox with custom OAuth
    tools:
      - type: mcp
        server_label: myserver
        project_connection_id: mcp-oauth-custom-conn

에이전트 신원 (Entra ID):

Microsoft Entra ID 인증을 지원하는 MCP 서버에 이 패턴을 사용합니다. Foundry 에이전트 ID는 대상 리소스에 대해 인증합니다.

resources:
  - kind: connection
    name: language-mcp
    category: RemoteTool
    authType: AgenticIdentity
    audience: <entra-audience>
    target: https://<resource>.cognitiveservices.azure.com/language/mcp?api-version=2025-11-15-preview
  - kind: toolbox
    name: agent-identity-tools
    description: MCP toolbox with agent identity auth
    tools:
      - type: mcp
        server_label: language
        project_connection_id: language-mcp

참고

MCP 서버가 요청을 수락하기 전에 대상 리소스에 필요한 RBAC 역할을 에이전트 ID에 할당해야 합니다.

사용자 엔트라 토큰(1P OBO):

OBO(On-Behalf-Of) 흐름을 통해 사용자 ID가 필요한 MCP 서버에 이 패턴을 사용합니다. Foundry는 사용자의 Entra 토큰을 MCP 서버에 프록시합니다.

resources:
  - kind: connection
    name: workiq-mail-conn
    category: RemoteTool
    authType: UserEntraToken
    audience: <entra-app-id>
    target: https://agent365.svc.cloud.microsoft/agents/servers/mcp_MailTools
  - kind: toolbox
    name: workiq-tools
    description: MCP toolbox with user Entra token auth
    tools:
      - type: mcp
        server_label: workiq
        project_connection_id: workiq-mail-conn

참고

audience 연결에는 UserEntraToken 필드가 필요합니다. tools/list을(를) 사용하지 않으면 0개의 도구를 반환합니다.

중요

사용자가 프로젝트에서 OAuth 기반 MCP를 사용하여 도구 상자를 처음 호출할 때 MCP 엔드포인트는 동의 URL이 있는 CONSENT_REQUIRED 오류(코드 -32006)를 반환합니다.

{
  "error": {
    "code": -32006,
    "message": "User consent is required. Please visit: https://..."
  }
}

이 오류는 예상된 것입니다. 브라우저에서 동의 URL을 열고 OAuth 권한 부여 흐름을 완료한 다음 에이전트 호출을 다시 시도합니다. 후속 호출은 다시 프롬프트 없이 성공합니다.

중요

  • Web Search는 Grounding with Bing Search와 Grounding with Bing Custom Search를 사용하며, 이는 1차 소비 서비스로서 이러한 Bing 기반 Grounding 이용 약관Microsoft 개인정보 보호 성명의 적용을 받습니다.
  • Microsoft 데이터 보호 부록은 Bing 검색과 Bing Custom Search에서 Grounding으로 전송된 데이터에 적용되지 않습니다. Bing 검색 및 Bing 맞춤 검색에서 Grounding 기능을 사용할 때, 데이터 전송은 규정 준수 및 지리적 경계를 벗어나 발생합니다.
  • Bing Search 및 Grounding과 함께 Bing Custom Search에서 접지를 사용하면 비용이 발생합니다. 자세한 내용은 가격 책정 을 참조하세요.
  • Azure 관리자가 웹 검색 사용에 대한 액세스를 관리하는 방법에 대한 자세한 내용은 관리 섹션을 참조하세요.

이 패턴을 사용하여 웹 검색을 추가합니다. Bing을 사용한 Grounding을 사용하여 웹 검색에 프로젝트 연결이 필요하지 않습니다. Bing Custom Search 인스턴스가 포함된 Grounding을 사용하려면, Bing 사용자 지정 검색 연결이 포함된 Grounding을 가리키는 web_search.custom_search_configuration 객체를 추가하세요.

{
  "description": "Built-in web search",
  "tools": [
    {
      "type": "web_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>"
    }
  ]
}

Bing Custom Search 연결을 통한 그라운딩:

{
  "description": "Custom Bing Search instance",
  "tools": [
    {
      "type": "web_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "web_search": {
        "custom_search_configuration": {
          "project_connection_id": "<BING_CONNECTION_NAME>",
          "instance_name": "<BING_INSTANCE_NAME>"
        }
      }
    }
  ]
}
from azure.ai.projects.models import WebSearchTool

tools = [
    WebSearchTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateWebSearchTool()
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Built-in web search"
);
const tools = [
  {
    type: "web_search",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
  },
];
resources:
  - kind: toolbox
    name: websearch-tools
    description: Web search toolbox
    tools:
      - type: web_search

Bing Custom Search로 기반 마련:

parameters:
  bing_api_key:
    secret: true
    description: Bing API key
resources:
  - kind: connection
    name: bing-custom-conn
    category: GroundingWithCustomSearch
    authType: ApiKey
    target: ""
    credentials:
      key: "{{ bing_api_key }}"
    metadata:
      ResourceId: /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.Bing/accounts/<bing-account>
      type: bing_custom_search
  - kind: toolbox
    name: bing-custom-tools
    description: Bing Custom Search toolbox
    tools:
      - type: bing_custom_search
        custom_search_configuration:
          instance_name: your-bing-custom-instance
        project_connection_id: bing-custom-conn

참고

Web Search가 MCP를 통해 결과를 반환하는 경우 응답은 인라인 Markdown 원본 링크가 있는 합성된 답변을 포함하는 콘텐츠 항목입니다 resource . URL 인용은 content[].resource._meta.annotations[]에 있습니다. 예를 들어:

{
  "jsonrpc": "2.0",
  "id": "ws-call-1",
  "result": {
    "_meta": {
      "tool_configuration": {
        "type": "web_search",
        "name": "web-search-default"
      }
    },
    "content": [
      {
        "type": "resource",
        "resource": {
          "uri": "about:web-search-answer",
          "mimeType": "text/plain",
          "text": "Here are the latest updates on Azure OpenAI Service...\n\n- **GPT-image-1 Release (January 7, 2026)** Microsoft introduced GPT-image-1 ([serverless-solutions.com](https://...)).\n\n..."
        },
        "annotations": {
          "audience": ["assistant"]
        },
        "_meta": {
          "annotations": [
            {
              "type": "url_citation",
              "url": "https://www.serverless-solutions.com/blog/...",
              "title": "Microsoft Expands Azure AI Foundry with Powerful New OpenAI Models",
              "start_index": 741,
              "end_index": 879
            }
          ],
          "action": {
            "type": "search",
            "query": "Azure OpenAI service updates 2026",
            "queries": ["Azure OpenAI service updates 2026"]
          },
          "response_id": "resp_001fcebcc300..."
        }
      }
    ],
    "isError": false
  }
}
{
  "description": "Azure AI Search over my data",
  "tools": [
    {
      "type": "azure_ai_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<INDEX_NAME>",
            "project_connection_id": "<CONNECTION_NAME>"
          }
        ]
      }
    }
  ]
}
from azure.ai.projects.models import AzureAISearchTool

tools = [
    AzureAISearchTool(
        index_name="<INDEX_NAME>",
        project_connection_id="<CONNECTION_NAME>",
    )
]
ProjectsAgentTool tool = new AzureAISearchTool(
    new AzureAISearchToolOptions(
        indexes: [
            new AzureAISearchIndexResource(
                indexName: "<INDEX_NAME>",
                projectConnectionId: "<CONNECTION_NAME>"
            )
        ]
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Azure AI Search over my data"
);
const tools = [
  {
    type: "azure_ai_search",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    azure_ai_search: {
      indexes: [
        {
          index_name: "<INDEX_NAME>",
          project_connection_id: "<CONNECTION_NAME>",
        },
      ],
    },
  },
];
parameters:
  ai_search_key:
    secret: true
    description: Azure AI Search admin key
resources:
  - kind: connection
    name: aisearch-conn
    category: CognitiveSearch
    authType: ApiKey
    target: https://your-search-service.search.windows.net/
    credentials:
      key: "{{ ai_search_key }}"
  - kind: toolbox
    name: search-tools
    description: Azure AI Search toolbox
    tools:
      - type: azure_ai_search
        index_name: your-index-name
        project_connection_id: aisearch-conn

도구 매개 변수 구성

Azure AI 검색 도구 매개 변수 필수 노트
project_connection_id Azure AI 검색 프로젝트 연결의 리소스 ID입니다.
index_name Azure AI 검색 리소스의 인덱스 이름입니다.
top_k 아니요 기본값은 5입니다.
query_type 아니요 기본값은 vector_semantic_hybrid입니다. 지원되는 값: simple, vector, semanticvector_simple_hybrid, vector_semantic_hybrid.
filter 아니요 에이전트가 인덱스에 만드는 모든 쿼리에 적용됩니다.

검색 결과에는 result.structuredContent.documents[]에 청크 메타데이터가 포함되어 있습니다. 각 문서에는 애플리케이션에서 인용 세부 정보를 생성하는 데 사용할 수 있는 필드가 포함됩니다titleurlid.score

코드 인터프리터

이 패턴을 사용하여 에이전트가 Python 코드를 작성하고 실행할 수 있습니다. 이 패턴에는 프로젝트 연결 또는 추가 구성이 필요하지 않습니다.

Code Interpreter가 사용할 파일을 업로드하려면 POST {project_endpoint}/openai/v1/files와 함께 purpose=assistants 을 호출하세요. 반환된 파일 ID는 도구 구성에서와 같이 <FILE_ID> 제공하는 값입니다. 전체 업로드 예제 는 코드 인터프리터 를 참조하세요.

중요

호스트된 에이전트의 도구 상자를 통해 코드 인터프리터를 사용하는 경우 사용자 격리가 지원되지 않습니다. 동일한 프로젝트의 모든 사용자는 동일한 컨테이너 컨텍스트를 공유합니다.

{
  "description": "Code interpreter for data analysis",
  "tools": [
    {
      "type": "code_interpreter",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "container": {
            "type": "auto",
            "file_ids": ["<FILE_ID>"]
        }
    }
  ]
}
from azure.ai.projects.models import CodeInterpreterTool

tools = [
    CodeInterpreterTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateCodeInterpreterTool(
        new CodeInterpreterToolContainer()
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Code interpreter for data analysis"
);
const tools = [
  {
    type: "code_interpreter",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    container: {
      type: "auto",
      file_ids: ["<FILE_ID>"],
    },
  },
];
resources:
  - kind: toolbox
    name: codeinterp-tools
    description: Code interpreter toolbox
    tools:
      - type: code_interpreter

코드 인터프리터에서 출력 파일 다운로드

코드 인터프리터가 출력 파일(예: 생성된 CSV 또는 차트)을 생성하는 경우 다음 단계를 사용하여 나열하고 다운로드합니다.

1단계: 컨테이너 API를 사용하여 파일 나열

container_id 응답에서 content[]._meta.container_id을(를) tools/call에서 추출한 다음 컨테이너 파일 API를 호출하여 컨테이너의 모든 파일을 나열합니다.

GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}

응답은 이름과 ID가 있는 파일 목록을 반환합니다.

2단계: 파일 API를 사용하여 파일 다운로드

1단계에서 반환된 파일 이름을 사용하여 파일 API 다운로드 엔드포인트를 통해 파일을 다운로드합니다.

이 패턴을 사용하여 에이전트가 벡터 저장소에 저장된 업로드된 파일을 검색할 수 있습니다. Foundry 프로젝트에서 이미 만든 참조 벡터 저장소를 제공합니다 vector_store_ids .

파일 및 벡터 저장소를 만들려면 API를 {project_endpoint}/openai/v1 사용합니다.

  1. 파일을 POST {project_endpoint}/openai/v1/filespurpose=assistants를 사용하여 업로드합니다.
  2. 반환된 파일 ID를 사용하여 벡터 저장소 POST {project_endpoint}/openai/v1/vector_stores 를 만듭니다.

결과 벡터 저장소 ID는 다음과 같이 <VECTOR_STORE_ID> 제공하는 값입니다. 각 언어의 전체 예제는 파일 검색 을 참조하세요.

중요

호스트된 에이전트의 도구 상자를 통해 파일 검색을 사용하는 경우 사용자 격리가 지원되지 않습니다. 동일한 프로젝트의 모든 사용자는 동일한 벡터 저장소에 대한 액세스를 공유합니다.

{
  "description": "Search over uploaded documents",
  "tools": [
    {
      "type": "file_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "file_search": {
        "vector_store_ids": ["<VECTOR_STORE_ID>"]
      }
    }
  ]
}
from azure.ai.projects.models import FileSearchTool

tools = [
    FileSearchTool(
        vector_store_ids=["<VECTOR_STORE_ID>"]
    )
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateFileSearchTool(
        vectorStoreIds: ["<VECTOR_STORE_ID>"]
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Search over uploaded documents"
);
const tools = [
  {
    type: "file_search",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    file_search: {
      vector_store_ids: ["<VECTOR_STORE_ID>"],
    },
  },
];
resources:
  - kind: toolbox
    name: filesearch-tools
    description: File search toolbox
    tools:
      - type: file_search
        vector_store_ids:
          - ${FILE_SEARCH_VECTOR_STORE_ID}

배포하기 전에 벡터 저장소 ID를 설정합니다.

azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"

참고

파일 검색이 MCP를 통해 결과를 반환하면 청크 메타데이터가 도구 응답 콘텐츠에 표식으로 【index†filename†file_id】 포함됩니다. 예를 들어:

{
  "jsonrpc": "2.0",
  "id": "fs-call-1",
  "result": {
    "content": [
      {
        "type": "resource",
        "resource": {
          "uri": "file://assistant-tvfqncbtruyffxkfewenyy/",
          "_meta": {
            "title": "mcp-test-file.txt",
            "file_id": "assistant-TVfQnCBtRuyfFxkfeweNYY",
            "document_chunk_id": "f7327b7f-5ed0-43c6-9bee-e8e9552afcb5",
            "score": 0.03333333507180214
          },
          "text": "# 【0†mcp-test-file.txt†assistant-TVfQnCBtRuyfFxkfeweNYY】\nContent Snippet:\nAzure OpenAI Service is a cloud service..."
        }
      }
    ]
  }
}

_meta 각 리소스 항목 내의 블록에는 일치하는 청크에 대한 title, file_id, document_chunk_id, 그리고 관련성 score가 포함됩니다. 애플리케이션에서 이러한 메타데이터 필드를 사용하여 인용 세부 정보를 생성하거나 원본 파일에 대한 딥 링크를 다시 생성합니다.

OpenAPI

이 패턴을 사용하여 OpenAPI 사양에서 설명하는 REST API를 노출합니다. auth.type API의 보안 모델과 일치하는 항목을 선택합니다.

중요

관리 ID 인증을 사용하는 경우 대상 서비스의 Foundry 프로젝트의 관리 ID에 적절한 RBAC 역할을 할당해야 합니다. 예를 들어, 대상 Azure 리소스에 리더 이상의 사용자 권한을 할당합니다. 이 할당이 없으면 에이전트는 API를 401 Unauthorized 호출할 때 응답을 받습니다. 전체 설정 단계는 관리 ID를 사용하여 인증을 참조하세요.

익명 인증:

{
  "description": "REST API via OpenAPI spec",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "anonymous"
        }
      }
    }
  ]
}

Project 연결 인증:

API에 Foundry 프로젝트 연결에 저장된 키 또는 토큰이 필요한 경우 이 패턴을 사용합니다.

{
  "description": "REST API with connection-based auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "connection",
          "security_scheme": {
            "project_connection_id": "<CONNECTION_NAME>"
          }
        }
      }
    }
  ]
}

관리 ID 인증:

대상 API가 Microsoft Entra ID 통해 인증할 때 이 패턴을 사용합니다. Foundry 프로젝트의 관리 ID는 에이전트를 대신하여 API를 호출합니다. 이 패턴을 사용하기 전에 관리 ID에 대상 서비스에 필요한 RBAC 역할이 있는지 확인합니다.

{
  "description": "REST API with managed identity auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "managed_identity",
          "security_scheme": {
            "audience": "<TARGET_SERVICE_AUDIENCE>"
          }
        }
      }
    }
  ]
}
from azure.ai.projects.models import OpenAPITool

tools = [
    OpenAPITool(
        name="my-api",
        spec={"<paste OpenAPI spec object here>"},
        auth={"type": "anonymous"},
    )
]
BinaryData specBytes = BinaryData.FromString("<OpenAPI spec JSON>");
ProjectsAgentTool tool = new OpenAPITool(
    new OpenApiFunctionDefinition(
        name: "my-api",
        spec: specBytes,
        openApiAuthentication: new OpenApiAnonymousAuthDetails()
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "REST API via OpenAPI spec"
);
const tools = [
  {
    type: "openapi",
    openapi: {
      name: "my-api",
      spec: { /* paste OpenAPI spec object here */ },
      auth: {
        type: "anonymous",
      },
    },
  },
];

키 기반 인증:

parameters:
  api_key:
    secret: true
    description: API key for the target service
resources:
  - kind: connection
    name: api-conn
    category: CustomKeys
    authType: CustomKeys
    target: https://api.example.com
    credentials:
      keys:
        key: "{{ api_key }}"
  - kind: toolbox
    name: openapi-tools
    description: OpenAPI key-auth toolbox
    tools:
      - type: openapi
        openapi:
          name: my-api
          spec:
            openapi: "3.0.1"
            info:
              title: "My API"
              version: "1.0"
            servers:
              - url: https://api.example.com/v1
            paths:
              /search:
                get:
                  operationId: search
                  parameters:
                    - name: query
                      in: query
                      required: true
                      schema:
                        type: string
                  responses:
                    "200":
                      description: OK
          auth:
            type: connection_auth
            connection_id: api-conn

에이전트 투 에이전트 (A2A)

이 패턴을 사용하여 다른 에이전트를 도구로 호출합니다. 원격 에이전트의 기본 URL을 제공하고 인증이 필요한 경우 프로젝트 연결을 제공합니다.

{
  "description": "Delegate tasks to a specialist agent",
  "tools": [
    {
      "type": "a2a_preview",
      "name": "<AGENT_NAME>",
      "description": "<What this agent does>",
      "base_url": "<AGENT_BASE_URL>",
      "project_connection_id": "<CONNECTION_NAME>"
    }
  ]
}
from azure.ai.projects.models import A2APreviewTool

tools = [
    A2APreviewTool(
        name="<AGENT_NAME>",
        description="<What this agent does>",
        base_url="<AGENT_BASE_URL>",
        project_connection_id="<CONNECTION_NAME>",
    )
]
ProjectsAgentTool tool = new A2APreviewTool()
{
    ProjectConnectionId = "<CONNECTION_NAME>",
};

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Delegate tasks to a specialist agent"
);
const tools = [
  {
    type: "a2a_preview",
    name: "<AGENT_NAME>",
    description: "<What this agent does>",
    base_url: "<AGENT_BASE_URL>",
    project_connection_id: "<CONNECTION_NAME>",
  },
];
resources:
  - kind: connection
    name: a2a-conn
    category: RemoteA2A
    authType: None
    target: https://your-remote-agent.azurecontainerapps.io
  - kind: toolbox
    name: a2a-tools
    description: Agent-to-Agent toolbox
    tools:
      - type: a2a_preview
        project_connection_id: a2a-conn

문제 해결

증상 원인일 수 있습니다. 수정
tools/list 는 MCP 또는 A2A 도구에 대한 0개 도구를 반환합니다. 원격 MCP 서버 또는 A2A 에이전트에 대한 연결 자격 증명이 잘못되었거나 누락되었습니다. 도구 상자는 유효한 인증 없이 원격 엔드포인트에서 도구 매니페스트를 검색할 수 없습니다. project_connection_id Foundry 프로젝트에 존재하며 자격 증명이 올바른지 확인합니다. MCP 서버에 직접 연결하여 인증 설정을 테스트해 보세요. 관리 ID(PMI, 에이전트 ID 또는 MI)를 사용하는 경우 대상 리소스의 호출자에 대한 올바른 RBAC 역할 할당을 확인합니다.
tools/list OpenAPI 관련 도구를 0개 반환합니다. OpenAPI 사양이 잘못되었습니다. 도구 상자는 사양에서 도구 매니페스트를 생성하며, 사양이 잘못된 경우 실패합니다. OpenAPI 사양 콘텐츠의 유효성을 검사합니다. OpenAPI 3.0 또는 3.1을 준수하고 유효한 paths, operationId 값 및 매개 변수 스키마를 포함하는지 확인합니다. 관리 ID 인증을 사용하는 경우 대상 서비스에서 RBAC 역할 할당도 확인합니다.
tools/list 는 예상보다 적은 도구를 반환합니다. 필터에 allowed_tools 잘못되었거나 철자가 틀린 도구 이름이 포함되어 있습니다. 도구 이름은 대/소문자를 구분하며 도구 이름(공백 또는 특수 문자 없음) 에 대한 MCP 사양 을 따라야 합니다. allowed_tools을(를) 일시적으로 제거하고 전체 도구 목록을 가져오기 위해 tools/list을(를) 호출합니다. 정확한 응답 이름을 사용하여 allowed_tools의 값을 설정합니다.
tools/list 0개 도구(기타 도구 형식)를 반환합니다. 도구 상자가 완전히 프로비전되지 않았거나 지역에서 지원되지 않는 도구 유형입니다. 기본 제공 도구(웹 검색, AI Search, 코드 인터프리터, 파일 검색)의 경우 도구 매니페스트는 서버 쪽에서 생성되며 인증이 필요하지 않습니다. 비어 있는 상태로 반환되는 경우 도구 상자 버전이 아직 프로비전되지 않을 수 있습니다. 10초 동안 기다렸다가 다시 시도하세요.
400 Multiple tools without identifiers 하나의 도구 상자에 명명되지 않은 두 가지 도구 형식 이름 없는 형식을 하나만 유지하고, server_label을 모든 MCP 도구에 추가합니다.
CONSENT_REQUIRED (코드 -32006) OAuth 연결에 사용자 동의 필요 브라우저에서 동의 URL을 열고 OAuth 흐름을 완료한 다음 다시 시도합니다.
401 MCP 호출 중에 만료된 토큰 또는 잘못된 범위 범위를 https://ai.azure.com/.default 사용하고 토큰을 새로 고칩니다.
도구 이름이 일치하지 않음 MCP 도구 이름 앞에 접두사 server_label 형식을 사용합니다 {server_label}.{tool_name} (예: myserver.get_info).
500send_ping() 도구 상자 MCP 서버는 MCP ping 메서드를 구현하지 않습니다. send_ping()을(를) 호출하지 마세요. 프레임워크가 자동으로 호출하는 경우(예: Microsoft 에이전트 프레임워크의 MCPStreamableHTTPTool._ensure_connected()) ping 검사를 비활성화하거나 no-op을 사용하여 메서드를 재정의합니다.
500prompts/list Foundry MCP 서버는 prompts/list를 구현하지 않습니다. MCP 클라이언트 생성자에 load_prompts=False (또는 이에 해당하는 것)를 전달합니다.
500 스트리밍이 아닌 경우 tools/call 비 스트리밍 모드(stream=False)는 도구 상자 MCP 엔드포인트에 대해 지원되지 않습니다. 도구 상자 MCP 도구를 호출할 때 stream=True를 항상 사용합니다.
500tools/list 일시적인 서버 오류 몇 초 후에 다시 시도합니다.
런타임 시 환경 변수 덮어쓰기 플랫폼은 접두사로 FOUNDRY_ 지정된 모든 환경 변수를 예약하며 사용자 정의 값을 자동으로 덮어쓸 수 있습니다. 접두사를 방지하기 위해 사용자 지정 환경 변수의 FOUNDRY_TOOLBOX_MCP_ENDPOINT이름을 바꿉니다(예: 대신 사용FOUNDRY_TOOLBOX_ENDPOINT).

가상 네트워크 지원

Foundry 프로젝트에서 네트워크 격리(프라이빗 링크)를 사용하는 경우 모든 도구 상자 도구 형식이 지원되지는 않습니다. 다음 표에서는 각 도구 유형에 대한 지원 상태와 네트워크 격리 환경에서 트래픽이 흐르는 방식을 보여 줍니다.

도구 유형 VNet 지원 트래픽 흐름
Mcp ✅ 지원 VNet 서브넷을 통해
Azure AI 검색 ✅ 지원 프라이빗 엔드포인트를 통해
코드 인터프리터 ✅ 지원 Microsoft 백본 네트워크
웹 검색 ✅ 지원 퍼블릭 엔드포인트
OpenAPI ✅ 지원 대상 API 네트워크 구성에 따라 다름
파일 검색 ❌ 지원되지 않음 아직 사용할 수 없음
에이전트 투 에이전트 (A2A) ✅ 지원 프라이빗 엔드포인트를 통해

에이전트 클라이언트, DNS 구성 및 프라이빗 엔드포인트 요구 사항에 대한 VNet 주입을 비롯한 전체 네트워크 격리 설정 지침은 Microsoft Foundry에 대한 네트워크 격리 구성 참조하세요.

지역 및 모델 호환성

도구 상자 가용성은 프로젝트 지역 이외의 두 가지 요인에 따라 달라집니다.

  • 지역: 일부 도구 유형은 에이전트 서비스를 지원하는 모든 지역에서 사용할 수 없습니다. 예를 들어 도구 상자 엔드포인트를 지원하는 지역이 모든 기본 제공 도구 유형을 지원하지 않을 수 있습니다.

도구 상자를 배포하기 전에 대상 지역에서 사용하려는 도구 유형을 지원하는지 확인합니다. 전체 호환성 테이블은 지역 및 모델별 도구 지원을 참조하세요.