create_resource
Create a new resource. Give it a path (its address, which may contain /) and its content. With
a credential that represents a user, omitting team creates it in that user's space. Set team
to target a team the credential is bound to and allowed to manage. A userless organization
credential must set team. Fails if a resource with that path already exists in the target space.
To change an existing resource, use update_resource.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
path | string | Yes | The resource path — its address, e.g. docs/readme.md. May contain / for hierarchy. |
content | string | Yes | The content. For binary content, base64-encode it and set content_encoding to base64. |
content_type | string | No | MIME type of the content. Defaults to text/plain. |
content_encoding | string | No | How content is encoded: utf8 (default) for text, or base64 for binary. |
name | string | No | A human-readable label. Defaults to the last /-separated segment of the path. |
team | string | No | Create in this team. Omit to target the represented user's space. |
Response
| Field | Type | Description |
|---|---|---|
path | string | The stored resource path. |
id | string | The new resource's identifier. |
Successful creation confirms storage, not MCP readability. Initial exposure follows the owner's
mcp_default_enable_resources setting (default false); this tool neither returns enabled nor
explicitly enables the Resource. Reading also needs Resources capability and content visibility.
For intended MCP use, verify discovery/read with the returned discovery URI. Report an unverified
read separately from successful storage, and check exposure and Connection access in the dashboard
without guessing the cause or automatically expanding access. Storage-only requests can complete
without read access.
Example
{
"path": "docs/readme.md",
"content": "# Getting started\n...",
"content_type": "text/markdown"
}
Result:
{
"path": "docs/readme.md",
"id": "018f...c2a1"
}
Errors
Each failure carries a precise code in the response. A domain rejection — a not-found, a limit, or a permission denial — is returned as a tool result with isError: true, so the agent can read the code and self-correct; malformed arguments and server faults are JSON-RPC protocol errors.
| Code | Cause | Delivered as |
|---|---|---|
resource_path_taken | A resource with this path already exists in the target space. | tool error (isError) |
invalid_resource_path | The path is invalid (needs at least one alphanumeric character). | tool error (isError) |
invalid_content_type | content_type is not a valid MIME type. | tool error (isError) |
invalid_content_encoding | content_encoding is not utf8 or base64. | tool error (isError) |
invalid_base64 | content_encoding is base64 but the content isn't valid base64. | tool error (isError) |
content_too_large | The content is larger than the per-call limit — use the dashboard for large uploads. | tool error (isError) |
resource_limit_reached | Your plan's resource count limit has been reached. | tool error (isError) |
storage_limit_reached | Your plan's storage limit has been reached. | tool error (isError) |
team_not_found | No team with that name is bound to this credential. | tool error (isError) |
forbidden | Your credential isn't permitted to create resources. | tool error (isError) |
personal_cannot_address_team | You used a team/ prefix (or team field) with a personal credential. | tool error (isError) |
no_personal_space | This credential has no personal space — address a team instead. | tool error (isError) |
invalid_arguments | The arguments are missing or don't match the input schema. | protocol error (invalid_params) |
internal_error | An unexpected error occurred. | protocol error (internal_error) |
Notes
- Use the raw path with a separate
team; never prefix the path withme/or a Team name to select ownership. - Discover the team names you can use with
bootstrap. - Content sent over MCP is capped well below the dashboard's upload limit, because a tool call carries the content as a single JSON string. Upload large files in the dashboard instead.
- Creating a resource counts as one tool call against your plan's tool-invocation allowance.