MCP Tools

Connect MCPTools to the filesystem MCP server over a stdio session and summarize a file.

mcp_tools.py
"""
Mcp Tools
=============================

Demonstrates mcp tools.
"""

import asyncio
import sys
from pathlib import Path

from agno.agent import Agent
from agno.tools.mcp import MCPTools
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

# ---------------------------------------------------------------------------
# Create Agent
# ---------------------------------------------------------------------------


async def main(prompt: str) -> None:
    # Initialize the MCP server
    server_params = StdioServerParameters(
        command="npx",
        args=[
            "-y",
            "@modelcontextprotocol/server-filesystem",
            str(Path(__file__).parent.parent),
        ],
    )
    # Create a client session to connect to the MCP server
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            # Initialize the MCP toolkit
            mcp_tools = MCPTools(session=session)
            await mcp_tools.initialize()

            # Create an agent with the MCP toolkit
            agent = Agent(tools=[mcp_tools])

            # Run the agent
            await agent.aprint_response(prompt, stream=True)


# ---------------------------------------------------------------------------
# Run Agent
# ---------------------------------------------------------------------------

if __name__ == "__main__":
    prompt = (
        sys.argv[1] if len(sys.argv) > 1 else "Read and summarize the file ./LICENSE"
    )
    asyncio.run(main(prompt))

Choose an allowed file

The server is allowed to access cookbook/, because its root is Path(__file__).parent.parent. The default ./LICENSE is in the repository root, outside that directory. Pass a file under cookbook/ explicitly:

python cookbook/91_tools/mcp_tools.py "Read and summarize the file cookbook/91_tools/mcp_tools.py"

The filesystem MCP server also exposes write operations; narrow the imported tool set if your application only needs reading. The nested context managers keep the client session alive through the run and close it afterward.

Run the Example

Set up your virtual environment

uv venv --python 3.12
source .venv/bin/activate

Install dependencies

uv pip install -U "agno[mcp]" openai

Prepare Node.js

The MCP server runs with npx. Install Node.js, then verify the commands:

node --version
npx --version

Export your OpenAI API key

export OPENAI_API_KEY="your_openai_api_key_here"

Clone Agno

Clone the pinned Agno source and run the remaining commands from its root:

git clone https://github.com/agno-agi/agno.git
cd agno
git checkout d703c34f3abf3c41275d3fb2da6e0518a8881f24

Run the example

Run the example from the repository root:

python cookbook/91_tools/mcp_tools.py

Full source: cookbook/91_tools/mcp_tools.py