Aan de slagBegin gratis

Het bericht opbouwen en de LLM aanroepen

Nu je hulpfunctie get_context_from_mcp(user_query) is gemaakt en de resource-tekst en prompt-tekst teruggeeft, is het tijd om die informatie door te geven aan de LLM!

De currency-server, get_context_from_mcp(), get_tools_from_mcp(), call_mcp_tool() en de Claude-client zijn op de achtergrond ingesteld. Jij moet de functie afmaken die de prompt opbouwt, het model aanroept en óf een direct bericht óf een tool call afhandelt. Je hebt een dubbelzinnige en een eenduidige gebruikersinvoer gekregen om te zien of je MCP-prompts het verschil maken!

Deze oefening maakt deel uit van de cursus

Introductie tot Model Context Protocol (MCP)

Bekijk cursus

Oefeninstructies

  • Op regel 37 bouw je full_prompt door prompt_text, de string "\n\nSupported currencies:\n" en resource_text te concatenaten.
  • Op regel 47 stuur je de full_prompt (als de user message content) en de lijst anthropic_tools naar het model.
  • Op regels 52-55: als de stop_reason van de response "end_turn" is, retourneer str(text).
  • Op regels 58-60: als de stop_reason van de response "tool_use" is, geef dan de .name en .input van het tool-use-blok door aan call_mcp_tool().

Interactieve oefening met praktijkervaring

Probeer deze oefening door deze voorbeeldcode aan te vullen.

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def get_context_from_mcp(user_query: str) -> tuple[str, str]:
    params = StdioServerParameters(command=sys.executable, args=["currency_server.py"])
    async with stdio_client(params) as (reader, writer):
        async with ClientSession(reader, writer) as session:
            await session.initialize()
            resource_result = await session.read_resource("file://currencies.txt")
            resource_text = resource_result.contents[0].text
            prompt_result = await session.get_prompt("convert_currency_prompt",
                arguments={"currency_request": user_query})
            prompt_text = prompt_result.messages[0].content.text
            return resource_text, prompt_text

async def get_tools_from_mcp():
    params = StdioServerParameters(command=sys.executable, args=["currency_server.py"])
    async with stdio_client(params) as (reader, writer):
        async with ClientSession(reader, writer) as session:
            await session.initialize()
            response = await session.list_tools()
            return response.tools

async def call_mcp_tool(tool_name: str, arguments: dict) -> str:
    params = StdioServerParameters(command=sys.executable, args=["currency_server.py"])
    async with stdio_client(params) as (reader, writer):
        async with ClientSession(reader, writer) as session:
            await session.initialize()
            result = await session.call_tool(tool_name, arguments)
            return str(result.content[0].text)

async def call_llm_with_context(user_query: str):
    """Call the LLM with resource and prompt context from MCP."""
    resource_text, prompt_text = await get_context_from_mcp(user_query)

    # Combine the resource and prompt text
    full_prompt = ____ + "\n\nSupported currencies:\n" + ____

    client = AsyncAnthropic(api_key="")
    mcp_tools = await get_tools_from_mcp()
    anthropic_tools = [{"name": t.name, "description": t.description or "", "input_schema": t.inputSchema} for t in mcp_tools]

    # Send full_prompt (as a user message) and the tools list to the model
    response = await client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": ____}],
        tools=anthropic_tools,
    )

    # Return the text response
    if response.stop_reason == "____":
        text = next((block.text for block in response.content if block.type == "text"), "")
        print(f"\nAssistant: {text}")
        return str(____)

    # Call the tool requested in the LLM's tool use
    if response.stop_reason == "____":
        tool_use = next(block for block in response.content if block.type == "tool_use")
        result = await call_mcp_tool(____.name, ____)
        followup = await client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            messages=[
                {"role": "user", "content": full_prompt},
                {"role": "assistant", "content": response.content},
                {"role": "user", "content": [{"type": "tool_result", "tool_use_id": tool_use.id, "content": result}]},
            ],
            tools=anthropic_tools,
        )
        final_text = next((block.text for block in followup.content if block.type == "text"), None)
        if final_text:
            print(f"\nAssistant: {final_text}")
            return str(final_text)

print("=== Ambiguous request (prompt asks for clarification) ===")
asyncio.run(call_llm_with_context("Convert some euros to dollars"))
print("\n=== Unambiguous request (model calls tool) ===")
asyncio.run(call_llm_with_context("How much is 50 GBP in euros?"))
Code bewerken en uitvoeren