Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
.NET'da kendi kendine barındırma MCP aracı desteği yakında sunulacaktır.
Go, tool/mcptool, tool/agenttool ve resmi MCP Go SDK'sını birleştirerek bir aracıyı MCP aracı olarak kullanıma sunar.
agenttool.New ile aracıyı sarın, mcptool.AddTool ile kaydedin ve bir MCP taşıması üzerinden sunun.
Bakımı yapılan Foundry örneği stdio kullanır. Bunun için bir Foundry proje uç noktası, model dağıtımı ve Azure kimlik bilgileri gerekir:
// Copyright (c) Microsoft. All rights reserved.
// This sample shows how to expose an Agent as an MCP tool.
package main
import (
"context"
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/examples/internal/demo"
"github.com/microsoft/agent-framework-go/provider/foundryprovider"
"github.com/microsoft/agent-framework-go/tool/agenttool"
"github.com/microsoft/agent-framework-go/tool/mcptool"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
// Run "npx @modelcontextprotocol/inspector go run ." to connect to this MCP server.
func main() {
token := demo.FoundryTokenCredential()
// Create Microsoft Foundry agent with the same configuration as the C# example.
agent := foundryprovider.NewAgent(
demo.FoundryProjectEndpoint,
token,
foundryprovider.ModelDeployment(demo.FoundryModel),
foundryprovider.AgentConfig{
Instructions: "You are good at telling jokes, and you always start each joke with 'Aye aye, captain!'.",
Config: agent.Config{
Name: "Joker",
Description: "An agent that tells jokes.",
},
},
)
// Create an MCP server with the agent exposed as a tool.
srv := mcp.NewServer(&mcp.Implementation{
Name: "agent-mcp-server",
Version: "1.0.0",
}, nil)
// Register the agent as an MCP tool.
mcptool.AddTool(srv, agenttool.New(agent, agenttool.Config{}))
// Run the MCP server with StdIO transport.
if err := srv.Run(context.Background(), &mcp.StdioTransport{}); err != nil {
demo.Panic(err)
}
}
İstemci ve sunucu desenleri için MCP aracı tümleştirmesine ve yürütme yönergeleri için tam MCP sunucu örneğine bakın.
agent-framework-hosting-mcpAgent Framework aracısını veya iş akışını, yerel Model Context Protocol SDK’sında bir araç olarak kullanıma sunmak için kullanın. Paket bir web çerçevesi seçmez veya MCP SDK sunucu yaşam döngüsünü sarmalamaz. MCP sunucusu, işleyici kaydı, aktarım, oturum anahtarı ilkesi, kimlik doğrulama, yetkilendirme ve dağıtım hâlâ uygulamanızın sorumluluğundadır.
pip install --pre agent-framework-hosting-mcp
Protokol sınırında dönüştür
mcp_to_run(...) doğrulanmış MCP aracı bağımsız değişkenlerini Aracı Çerçevesi iletilerine ve seçili sohbet seçeneklerine dönüştürür ve mcp_from_run(...) tamamlanmış bir yanıtı yerel MCP ContentBlock değerlerine dönüştürür. Bir uygulamanın araç sözleşmesi tamamen özel bir yerel şema ve işleyiciye ihtiyaç duyduğunda bu iki işlevi doğrudan kullanın:
"properties": {
TASK_ARGUMENT: {
"type": "string",
"description": "The request for the hosted agent.",
},
**CHAT_OPTION_ARGUMENTS,
},
"required": [TASK_ARGUMENT],
"additionalProperties": False,
},
)
]
)
async def call_tool(
_ctx: ServerRequestContext[dict[str, Any]], params: types.CallToolRequestParams
) -> types.CallToolResult:
"""Convert, run, and render without the agent-backed adapter."""
name = params.name
arguments = params.arguments or {}
if name != "run_agent_manually":
raise MCPError(types.INVALID_PARAMS, f"Unknown MCP tool: {name}")
run = mcp_to_run(
arguments,
argument_name=TASK_ARGUMENT,
chat_option_arguments=CHAT_OPTION_ARGUMENTS,
)
result = await agent.run(run["messages"], options=run["options"])
return types.CallToolResult(content=mcp_from_run(result))
server = Server("agent-framework-hosting-mcp-manual-sample", on_list_tools=list_tools, on_call_tool=call_tool)
credential = DefaultAzureCredential()
Yalnızca chat_option_arguments içinde listelenen argüman adları run["options"] içine kopyalanır; diğer MCP argümanları iletinin ham temsilinde bulunmaya devam eder, ancak model istemcisine iletilmez.
MCPServer ile barındırma
MCP SDK 2.x uygulamalarında, süslenmiş bir işlevden yerel bir MCP araç şeması türetmek için MCPServer kullanın. Tamamlanmış Agent Framework yanıtını dönüştürdükten sonra açıkça döndürün CallToolResult :
from contextlib import asynccontextmanager
from typing import Literal
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from agent_framework_hosting_mcp import mcp_from_run, mcp_to_run
from azure.identity.aio import DefaultAzureCredential
from mcp import types
from mcp.server.mcpserver import MCPServer
credential = DefaultAzureCredential()
agent = Agent(
client=FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=credential,
),
name="MCPHostedAgent",
description="Answer a request with the hosted Agent Framework agent.",
instructions="Answer the user's request clearly and concisely.",
)
@asynccontextmanager
async def lifespan(_server: MCPServer[None]) -> AsyncGenerator[None]:
"""Close the model credential when the MCP server stops."""
async with credential:
yield
server = MCPServer(
name="agent-framework-hosting-mcpserver-sample",
instructions="Expose an Agent Framework agent as an MCP tool.",
lifespan=lifespan,
)
@server.tool(
name="run_agent",
description="Run the hosted Agent Framework agent.",
structured_output=False,
)
async def run_agent(
task: str,
reasoning_effort: Literal["low", "medium", "high"] | None = None,
) -> types.CallToolResult:
"""Run the agent with MCPServer-validated arguments."""
Örnek durum bilgisi olmayan akışa uygun HTTP kullanır. Sunucuyu güvenilen bir yerel ortamın ötesine geçirmeden önce uygulamaya ait kimlik doğrulaması, yetkilendirme ve oturum kalıcılığı ekleyin.
Ajanı oluşturulmuş bir araç olarak barındırın
AgentMCPTool, bir ajandan yerel aracın adını, açıklamasını ve şemasını türetir; ayrıca listeleme, ayrıştırma, yürütme ve sonuçların dönüştürülmesini, bu ikisinin birbirinden sapmamasını sağlayacak şekilde uyumlu tutar:
) -> types.CallToolResult:
"""Run the app-owned tool with native MCP and Agent Framework values."""
return await agent_tool.call_tool(params.name, params.arguments)
server = Server("agent-framework-hosting-mcp-sample", on_list_tools=list_tools, on_call_tool=call_tool)
credential = DefaultAzureCredential()
agent = Agent(
client=FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=credential,
),
name="MCPHostedAgent",
description="Answer a request with the hosted Agent Framework agent.",
instructions="Answer the user's request clearly and concisely.",
)
agent_tool = AgentMCPTool(
agent,
name="run_agent",
argument_description="The request for the hosted agent.",
chat_option_parameters={
"reasoning_effort": {
"type": "string",
AgentMCPTool aksi belirtilmedikçe ajanın adını ve açıklamasını kullanır.
parameters ham MCP argümanlarında kullanılabilir olmaya devam eden uygulamaya ait JSON Şeması özelliklerini ekler ve chat_option_parameters ise değerleri açıkça Agent Framework sohbet seçeneklerine kopyalanan özellikleri ekler.
Her çağrı için bir oturumu kalıcı tutun
Aynı opak, uygulama tanımlı AgentState ile yapılan yinelenen çağrıların tek bir konuşmayı sürdürmesini sağlamak için mevcut bir session_id_parameter ve bir session_id iletin:
state = AgentState(agent)
agent_tool = AgentMCPTool(
state,
name="run_agent",
argument_description="The request for the hosted agent.",
parameters={
"session_id": {
"type": "string",
"minLength": 1,
"description": (
"Opaque, app-defined conversation key. Reuse the same value to continue and update one conversation."
),
}
},
required_parameters={"session_id"},
chat_option_parameters={
"reasoning_effort": {
"type": "string",
AgentMCPTool yalnızca oturum için get/run/set sırasını gerçekleştirir; uygulamanız aynı oturum için eşzamanlı çağrıları, örnekte oturum başına bir AgentState ile yapıldığı gibi, sıraya koymalı ve asyncio.Lock oturum tanımlayıcısının kimliğini doğrulamalı veya yetkilendirmelidir. Bu, previous_response_id tarzı bir dallanma değildir — bir konuşmayı çatallaması gereken bir uygulama, ayrı kaynak ve hedef tanımlayıcılarını kabul etmeli, kaynak oturumunu kopyalamalı ve sonucu hedef anahtarı altında saklamalıdır.
İş akışını araç olarak barındırma
WorkflowMCPTool bir iş akışının başlangıç yürütücüsü giriş türünden bir yerel MCP aracı türetir ve tamamlanan iş akışı çıkışlarını dönüştürür. Dataclass, Pydantic ve diğer nesne biçimindeki girdiler, üst düzey MCP argümanlarına dönüşür; ilkel girdiler ise yapılandırılabilir bir argüman adı altında kapsüllenir:
async def list_tools(
_ctx: ServerRequestContext[dict[str, Any]], params: types.PaginatedRequestParams | None
) -> types.ListToolsResult:
İş akışı örnekleri yürütme durumunu korur; bu nedenle bağımsız çağrılar gerektiren uygulamalar, yukarıda gösterildiği gibi, WorkflowState ile birlikte bir cache_target=False fabrikası sağlamalıdır. Denetim noktası geri yükleme, döngüde insan yanıtları ve devamlılık tanımlayıcıları uygulamaya ait kalır; bir iş akışı dış giriş isterse, bağdaştırıcı boş bir başarılı araç sonucu döndürmek yerine yükseltir.
MCPServer varyantı da dahil olmak üzere, çalıştırılabilir sunucuların tam kümesi için MCP barındırma örnekleri'ne bakın.
Önemli
MCP oturum tanımlayıcısını ve uygulama tanımlı session_id bağımsız değişkenleri güvenilmeyen giriş olarak değerlendirin. Oturum durumunu yüklemek veya kaydetmek için kullanmadan önce çağıranın kimliğini doğrulayıp yetkilendirilin ve ham değer yerine kimliği doğrulanmış kiracıdan, kullanıcıdan veya çalışma alanından dayanıklı bölümleme türetin.
Sonraki Adımlar
Daha derine gidin: