Upload files as a source
Not everything worth giving an agent has a URL. An internal spec is a Word document, a pricing model is a spreadsheet, an architecture decision is a slide deck someone made once and never published. You can upload those files directly as a source, and MCP Studio indexes the text in them the same way it indexes a documentation site.
| Audience | Anyone whose context lives in local files rather than on a website |
|---|---|
| Prerequisites | An MCP Studio account and a file in one of the supported formats |
Supported formats
| Kind | Extensions |
|---|---|
| Spreadsheets | .xlsx, .csv |
| Documents | .docx |
| Presentations | .pptx |
| PDFs | .pdf |
| Text | .txt, .md, .markdown |
| Web pages | .html, .htm |
| Images | .jpg, .jpeg, .png, .svg |
| Archives | .zip containing any of the above |
Google Docs, Sheets, and Slides are supported through their download formats.
In Google Drive choose File → Download and pick Microsoft Word, Excel,
PowerPoint, CSV, or PDF, then upload that. A .gdoc, .gsheet, or .gslides
file on your disk is only a link to Drive and contains none of the document, so
uploading one is rejected with an explanation rather than indexed as an empty
source.
Apple Pages, Numbers, and Keynote files need the same treatment: export as
.docx, .xlsx, .pptx, or PDF first.
The older Office formats .doc, .xls, and .ppt are different file formats
from .docx, .xlsx, and .pptx, not older versions of them, and are not
read. Open the file and save it in the modern format.
Upload a file
- In step 1 of the wizard, choose the Upload a file tab.
- Drag a file onto the box, or click it to open a file picker.
- Wait for the extraction to finish. MCP Studio reads the file while you watch rather than during indexing, so a file it cannot read fails here, next to the picker, instead of as a failed job on the dashboard several minutes later.
- The source appears in your list showing how many documents were extracted and how many characters of text they hold.
Each file becomes one source and counts against your plan's source allowance. The free tier includes two sources per server.
Upload several files at once
Zip them together and upload the archive. A zip counts as one source no matter how many files it holds, up to 200 files and 40 MB of uncompressed content.
If the archive contains a file type that is not on the supported list, the whole upload is refused and the message names the type. This is deliberate: an archive of seven files that quietly indexed four of them would leave you to discover the other three were missing from an answer that was silently incomplete. Remove the unsupported files and upload the archive again.
Folder-metadata files that macOS and Windows add to archives — .DS_Store,
Thumbs.db, and the __MACOSX directory — are ignored rather than reported, so
zipping a folder from Finder or Explorer works without cleanup.
Size limits
| Limit | Value |
|---|---|
| One upload | 4 MB |
| Files in one archive | 200 |
| Uncompressed size of one archive | 40 MB |
| Pages read from one PDF | 400 |
| Rows read per spreadsheet sheet | 5,000 |
| Images described per upload | 25 |
The 4 MB ceiling is a limit of the request that carries the file, not a policy choice. For anything larger, split it, or add the content as a website or repository source instead — those are fetched by our infrastructure and have no comparable limit.
What gets indexed, and how it is cited
Extraction splits a file into documents, and a document is what a citation points at. That split is what makes an answer checkable:
| Upload | Becomes |
|---|---|
| Excel workbook | One document per sheet |
| PowerPoint deck | One document per slide, with speaker notes |
| One document per page | |
| Word document, CSV, text, HTML, image | One document |
| Zip archive | The above, per file inside it |
So an answer cites "the Assumptions sheet of q3-forecast.xlsx" or "page 34 of
msa-2026.pdf" rather than the file name alone. Every citation links to a page
showing the extracted text, which you can open from View extracted text
beside the source on your dashboard.
Spreadsheet rows are indexed as self-describing records — Region: EMEA; ARR: 42000 — rather than as a table. A table row separated from its header row is
close to meaningless to a search engine, and repeating the column names is what
keeps a row from the middle of a large sheet findable.
Images
A .png or .jpg contains no text a database can search, so MCP Studio sends
it to a vision model, which transcribes any text visible in the image and then
describes what it shows. A screenshot of an error, a labelled diagram, or a
chart with axis labels therefore becomes searchable by the words in it.
These descriptions are written from the image, not taken from the file, and they are labelled as such everywhere they appear — in the wizard, on the extracted-text page, and in Action-tier citations. A confident transcription that is subtly wrong is worse than no text at all, so check one against the original before relying on it.
.svg files are handled differently and without a model: an SVG carries its
labels as real text nodes, so those are read straight out of the file. That is
both free and more accurate than describing a rendering of it.
What is stored
Only the extracted text. The file itself is read in the request that receives it and then discarded. There is no stored copy of your document, which is why the 4 MB limit exists and why there is nothing to download later.
Removing an uploaded source deletes the extracted text with it, along with the cached search results and the request-log passages that quoted it. An upload you add in the wizard but never deploy is deleted automatically within 24 hours.
Servers built on uploads start out private
Add an uploaded file and the wizard switches the server to private, so its endpoint requires an access token. Of every source type, a file off your own computer is the most likely to hold something you would not publish, so that is the safer default.
It is a default and not a lock. You can make the server public at the Review step or later from the dashboard, unlike a private GitHub repository, which locks the server private for as long as it is connected. The difference is who knows whether the content is confidential: GitHub can tell us a repository is private, but only you know what is in a spreadsheet you chose off your disk.
See Private MCP servers for how tokens work.
Files that cannot be read
Some files are in a supported format and still yield nothing. In each case the upload is refused with the reason rather than creating a source that answers nothing:
- A scanned PDF. A scan is a picture of a page, and MCP Studio does not run optical character recognition on PDFs. Upload a text-based PDF, or export the original document instead.
- A deck or document made of images. Same reason. Export it as a PDF only if the text is real text; otherwise there is nothing to extract.
- A password-protected file. We cannot open it. Remove the password and upload it again.
- A password-protected archive. Unzip it yourself and upload the files.
- A file saved in a non-UTF-8 encoding. Re-save it as UTF-8.
Some uploads succeed with notes attached — a sheet past 5,000 rows, a PDF past 400 pages, images past the description cap. Those notes appear once, next to the upload, and say exactly what was left out.
Refreshing an upload
There is no way to re-upload over an existing source, because the file is not kept and a new upload is a new file. To replace one, remove the source and upload the corrected file. Refresh on an uploaded source re-indexes the text already extracted from it, which is useful only after a change to how indexing works.
Related
- Adding sources — websites, repositories, and MCP servers
- Connect another MCP server
- Private MCP servers