Aracıları MCP araçları olarak self-host edin

Note

.NET'da kendi kendine barındırma MCP aracı desteği yakında sunulacaktır.

Note

Go için kendi kendine barındırma MCP aracı desteği şu anda kullanılamıyor.

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; uygulamanız hala , işleyici kaydı, aktarım, oturum anahtarı ilkesi, kimlik doğrulaması, yetkilendirme ve dağıtıma sahip Serverolur.

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:

@server.list_tools()
async def list_tools() -> list[types.Tool]:
    """Return the app-owned native MCP tool definition."""
    return [
        types.Tool(
            name="run_agent_manually",
            description=agent.description or "",
            inputSchema={
                "type": "object",
                "properties": {
                    TASK_ARGUMENT: {
                        "type": "string",
                        "description": "The request for the hosted agent.",
                    },
                    **CHAT_OPTION_ARGUMENTS,
                },
                "required": [TASK_ARGUMENT],
                "additionalProperties": False,
            },
        )
    ]


@server.call_tool()
async def call_tool(name: str, arguments: dict[str, object] | None) -> list[types.ContentBlock]:
    """Convert, run, and render without the agent-backed adapter."""
    if name != "run_agent_manually":
        raise ValueError(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 mcp_from_run(result)

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.

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:

agent_tool = AgentMCPTool(
    agent,
    name="run_agent",
    argument_description="The request for the hosted agent.",
    chat_option_parameters={
        "reasoning_effort": {
            "type": "string",
            "enum": ["low", "medium", "high"],
            "description": "Optional reasoning effort for models that support it.",
        }
    },
)


@server.list_tools()
async def list_tools() -> list[types.Tool]:
    """Describe the app-owned MCP tool schema."""
    return await agent_tool.list_tools()


@server.call_tool()
async def call_tool(name: str, arguments: dict[str, object] | None) -> list[types.ContentBlock]:
    """Run the app-owned tool with native MCP and Agent Framework values."""
    return await agent_tool.call_tool(name, arguments)

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ı session_id ile yapılan yinelenen çağrıların tek bir konuşmayı sürdürmesini sağlamak için mevcut bir AgentState ve bir session_id_parameter iletin:

session_locks: dict[str, asyncio.Lock] = {}


@server.list_tools()
async def list_tools() -> list[types.Tool]:
    """Return the agent-derived MCP tool definition."""
    return await agent_tool.list_tools()


@server.call_tool()
async def call_tool(name: str, arguments: dict[str, object] | None) -> list[types.ContentBlock]:
    """Serialize calls per app-owned session before using ``AgentState``."""
    session_id = arguments.get("session_id") if arguments else None
    if not isinstance(session_id, str) or not session_id:
        raise ValueError("MCP tool argument 'session_id' must be a non-empty string.")
    lock = session_locks.setdefault(session_id, asyncio.Lock())
    async with lock:
        return await agent_tool.call_tool(name, arguments)

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 asyncio.Lock ile yapıldığı gibi, sıraya koymalı ve AgentState 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:

server = Server("agent-framework-hosting-mcp-workflow-sample")
workflow_tool = WorkflowMCPTool(
    WorkflowState(create_workflow, cache_target=False),
    name="draft_content",
)

İş 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.

Şemasını süslü bir işlevden türeyen FastMCP değişkeni de dahil olmak üzere çalıştırılabilir sunucuların tamamı için bkz. MCP barındırma örnekleri.

Important

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: