# Give agents a read-only filesystem over your docs

> Agno's PageFileSystem toolkit lets an agent run ls, cat, rg and other read-only commands over published pages. It can't run a shell or write files, and every command is bounded.

- Published: 2026-09-08
- Author: Ashpreet Bedi
- Categories: Changelog
- Canonical: https://www.agno.com/articles/give-agents-a-read-only-filesystem-over-your-docs
- Markdown: https://www.agno.com/articles/give-agents-a-read-only-filesystem-over-your-docs.md

With Agno's `PageFileSystem` toolkit, an agent works through your published pages with `ls`, `tree`, `find`, `cat`, `head`, `tail`, `wc`, `rg` and `grep`, the way an engineer works through a repo.

<Video
  src="/videos/changelog-page-filesystem-terminal.mp4"
  controls
  preload="metadata"
  aria-label="A terminal recording of PageFileSystem running tree, rg and head over published llmstxt.org pages"
/>

A user asks your docs agent about `page_store`. Vector search returns a chunk that sounds close, and the agent answers from that chunk. An engineer would have grepped for the exact name and opened the page it lives on. With `PageFileSystem`, the agent can do the same.

```python
from agno.agent import Agent
from agno.knowledge.page import PageFileSystem

page_files = PageFileSystem(knowledge=knowledge)
agent = Agent(tools=[page_files.tools()])
```

![Three commands run through PageFileSystem against published Agno docs pages: ls /knowledge lists the section, rg finds page_store on two lines of the published pages guide, and head reads the top of the Public Surface page.](https://www.agno.com/images/v3-0-7-page-filesystem.png)

Vector search still finds the right page, and the agent then reads all of it.

### What can't the agent do?

`PageFileSystem` can't run a shell, expand shell expressions or write files. Reads use pinned page revisions, listings return scoped metadata, and grep is a bounded literal scan. Output stops at 30,000 characters with a continuation notice, and Agno caps regex time, command time and read volume.

The toolkit works in sync and async runs, and you can rename the tool with `tools(tool_name=...)`.

See the [cookbook](https://github.com/agno-agi/agno/blob/main/cookbook/05_agent_os/27_public_pages/page_filesystem.py), and learn more about [published pages](https://docs.agno.com/knowledge/published-pages) in the documentation.
