I built an MCP server that lets any AI agent read the PDFs and spreadsheets in your S3 bucket A developer built bucketlens, an open-source MCP server that lets any AI agent read PDFs, spreadsheets and CSVs stored in an S3 or R2 bucket without downloading files or using a shell. The server exposes seven tools (list_files, outline, search, search_all, read_pages, query, read_rows) and builds a per-file index in the bucket itself, so page reads become single range requests of roughly 150 KB. In testing, a new 492-page PDF was indexed 8.8 seconds after upload began and an edited workbook 4.4 seconds after it was saved. AI agents are good with code because code is plain text on a local disk. The agent looks at what's there, searches, and opens only the part that matters. A company's knowledge doesn't look like that. It's annual reports, spreadsheets and contracts in an S3 or R2 bucket. An agent with a shell downloads them and writes Python to parse them, again on every run. An agent without a shell Claude Desktop, a chat app, a support bot, any MCP-only client often can't use them at all. That's the first half of the video. I gave Claude Code Sonnet only its Read, Grep and Glob tools, put the World Bank's 82 MB World Development Indicators workbook in the folder, and asked for one number: Bhutan: access to electricity in 2005? ● Glob /WDIEXCEL.xlsx ✓ WDIEXCEL.xlsx ● Read WDIEXCEL.xlsx ✗ This tool cannot read binary files. The file ap… ANSWER: Unable to determine. I couldn't read the xlsx… 11.8 s · $0.010 So I built bucketlens , an open source MCP server that lets any agent read the PDFs, spreadsheets and CSVs in your own bucket. Same question, with no files on disk and no shell, only bucketlens: ● outline real/wdi/WDIEXCEL.xlsx ✓ real/wdi/WDIEXCEL.xlsx: 6 table s ● query SELECT "Country Name","Indicator Name","2… ✓ | Bhutan | Access to electricity % of populati… ANSWER: 59.8% of Bhutan's population had access to el… 13.9 s · $0.023 Lines are cut at the terminal width, as in the video. The value in the file is 59.8. Seven tools, built around how a person reads a long document: get the shape first, then go to the part that matters. | Tool | What it returns | |---|---| | list files prefix | names, sizes, dates; nothing is downloaded | | outline path, depth | PDF: page count, table of contents with page numbers, what reading it whole would cost in tokens. Spreadsheet: sheets, rows, columns and types | | search path, text | the pages of one PDF that contain the text, with snippets | | search all text, folder | every PDF in a folder at once, as hits or just file names and counts | | read pages path, pages | the text of specific pages, like "36-38" | | query path, sql | read-only SQL over a spreadsheet or CSV; each sheet is a table | | read rows path, sheet, first, last | rows by the spreadsheet's own row numbers | My first idea was to skip parsing and read slices of the original file with HTTP range requests. I measured it. Opening a PDF or reading the first rows of a workbook fetched 5 to 7% of the file, which is fine. Deep pages and deep rows fetched 50 to 75%, because of how PDF and XLSX are laid out inside. That's barely better than downloading. So bucketlens reads each file once, the first time it's touched, and stores the result in your bucket next to it: .bucketlens/index/