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 Context 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 labeled 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 labeled 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.
The image itself comes back
The description is how an image is found. It is not what you get.
When a .png, .jpg, or .webp you uploaded is among the passages returned for
a request, the original file is attached to the response as an image, so a
connected assistant can use it directly:
You: Draft the customer welcome email using our brand kit.
Assistant: (receives
brand-kit.pngalongside the passages describing it, and builds the email around the real mark and palette, with the logo itself placed in the email.)
Using your images in emails and pages
Email and web pages need images that are hosted at a web address, and a file
uploaded from your computer has none. MCP Studio hosts it for you: when you
upload a .png, .jpg, or .webp, the original is kept, and every response
that attaches the image also includes a link to it, served by MCP Studio, that
looks like this:
https://appatools.com/mcp-studio/uploads/<upload-id>/file/logo.png?sig=<signature>
Your assistant places that link in whatever it writes, so an email, HTML page, or document it drafts shows your actual image rather than a placeholder. You do not need to host the image anywhere or paste a URL yourself.
You: Write a launch email for our customers using our logo and brand guidelines.
Assistant: (searches your server, receives your logo and its link along with the guideline passages, and writes the email with
<img src="https://appatools.com/mcp-studio/uploads/.../file/logo.png?sig=...">in place.)
What to know about the link:
- It opens without signing in, because the people who read your email are not MCP Studio users.
- It works for public and private servers alike. It is only ever given out in an answer from your server, so only someone your server already answered can receive it.
- It keeps working while the source exists, so an email opened weeks later still shows the image. It stops working as soon as you remove the source or delete the server, so remove the source only if you are happy for the image to disappear from emails already sent.
- The image has to be part of the answer. It is attached when a search returns it. If your requests describe the email rather than the image ("write a welcome email"), add a retrieval rule so your logo is included every time.
Two things follow from that:
- Ask about what an image contains and you are answered from the description. Ask for something that needs the image and you get the file.
- A request returns at most two images. The attachment shares your assistant's context window with the passages that explain how to use it, so more images would mean less of the answer.
.svg and .gif are searchable by their text and are not attached. An SVG is
markup rather than a picture, and for a GIF the animation is usually the point.
See Retrieval rules if you want a specific image reached for on requests that never mention it by name, which is the usual case for a brand asset.
What is stored
The extracted text from every file, and the original of images only.
A document is read in the request that receives it and then discarded. There is no stored copy of your spreadsheet, deck, or PDF, which is why the 4 MB limit exists and why there is nothing to download later.
An image is the exception, because returning it is the whole point: a
description of a logo cannot be used as a logo. So .png, .jpg, and .webp
originals are kept, and nothing else is.
| Format | Kept |
|---|---|
.png, .jpg, .webp | Extracted description and the original file |
.svg, .gif | Extracted text only |
| PDF, Word, Excel, PowerPoint, text, markdown, archives | Extracted text only |
Removing an uploaded source deletes the extracted text with it, along with any retained image, 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. A retained image that nothing has requested for a year is deleted while its description stays, so the server keeps answering questions about it.
Retained images are subject to a 500 MB limit per account. The full schedule is in the Terms of Service.
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