> ## Documentation Index
> Fetch the complete documentation index at: https://phidatainc-redirect-agent-platform-overview.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Agent Tools

> Equip agents with functions and toolkits for external actions.

**Agents use tools to take actions and interact with external systems**.

Tools are functions that an Agent can run to achieve tasks. For example: searching the web, running SQL, sending an email or calling APIs. You can use any python function as a tool or use a pre-built Agno **toolkit**.

The general syntax is:

```python theme={null}
from agno.agent import Agent

agent = Agent(
    # Add functions or Toolkits
    tools=[...],
)
```

Tools can be a callable factory and are resolved at run time.

## Using a Toolkit

Agno provides many pre-built **toolkits** that you can add to your Agents. For example, let's use the HackerNews toolkit to fetch tech news.

<Tip>
  You can find more toolkits in the [Toolkits](/tools/toolkits/overview) guide.
</Tip>

<Steps>
  <Step title="Create News Agent">
    Create a file `news_agent.py`

    ```python news_agent.py theme={null}
    from agno.agent import Agent
    from agno.tools.hackernews import HackerNewsTools

    agent = Agent(tools=[HackerNewsTools()], markdown=True)
    agent.print_response("What are the top stories on HackerNews?", stream=True)
    ```
  </Step>

  <Step title="Run the agent">
    Install dependencies

    ```shell theme={null}
    uv pip install openai agno
    ```

    Run the agent

    ```shell theme={null}
    python news_agent.py
    ```
  </Step>
</Steps>

## Writing your own Tools

For more control, write your own python functions and add them as tools to an Agent. For example, here's how to add a `get_top_hackernews_stories` tool to an Agent.

```python hn_agent.py theme={null}
import json
import httpx

from agno.agent import Agent

def get_top_hackernews_stories(num_stories: int = 10) -> str:
    """Use this function to get top stories from Hacker News.

    Args:
        num_stories (int): Number of stories to return. Defaults to 10.
    """

    # Fetch top story IDs
    response = httpx.get('https://hacker-news.firebaseio.com/v0/topstories.json')
    story_ids = response.json()

    # Fetch story details
    stories = []
    for story_id in story_ids[:num_stories]:
        story_response = httpx.get(f'https://hacker-news.firebaseio.com/v0/item/{story_id}.json')
        story = story_response.json()
        if "text" in story:
            story.pop("text", None)
        stories.append(story)
    return json.dumps(stories)

agent = Agent(tools=[get_top_hackernews_stories], markdown=True)
agent.print_response("Summarize the top 5 stories on hackernews?", stream=True)
```

Read more about:

* [Available toolkits](/tools/toolkits/overview)
* [Creating your own tools](/tools/creating-tools/overview)

## Developer Resources

* [Agent schema](/reference/agents/agent)
* [Knowledge schema](/reference/knowledge/knowledge)
* [Cookbook](https://github.com/agno-agi/agno/tree/main/cookbook/08_knowledge/)
