---
title: Uploading
description: store_upload_file vs. store_upload_content — a local path against stdio, and bytes directly against hosted MCP.
---

# Uploading

There are two upload tools, and which one is available depends on how
you're connecting.

## store_upload_file (stdio only)

Reads a file straight off local disk and uploads it:

```
store_upload_file({ path: "./screenshot.png", access: "public" })
```

This only makes sense over a **stdio** MCP connection — one running on
your own machine, where `path` names a file it can actually see.

## store_upload_content (hosted MCP)

The **hosted** MCP server, at `https://api.shebang.pro/mcp`, runs inside
shebang's own infrastructure — a `path` argument there would name a file
on shebang's servers, not yours, so there's no local filesystem to read
from at all. `store_upload_content` uploads by supplying the bytes
directly instead:

```
store_upload_content({
  slug: "screenshot",
  contentBase64: "<base64 bytes>",
  contentType: "image/png",
  access: "public",
})
```

Supply exactly one of `contentBase64` (base64-encoded bytes) or `text`
(plain-text content) — never both, and never a path to read from. The
hosted server registers `store_upload_content` in place of
`store_upload_file`; every other tool is identical between the two
servers. See [hosted MCP](/getting-started/hosted-mcp-oauth) for how to
connect to it in the first place.

`path` is optional on `store_upload_content` — it's only ever used as a
filename hint for the object's default title, never for filesystem
access.

## Next

[Content types and limits](/sherserve/content-types-and-limits).
