Skip to main content

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​

ParameterTypeRequiredDescription
pathstringYesThe resource path — its address, e.g. docs/readme.md. May contain / for hierarchy.
contentstringYesThe content. For binary content, base64-encode it and set content_encoding to base64.
content_typestringNoMIME type of the content. Defaults to text/plain.
content_encodingstringNoHow content is encoded: utf8 (default) for text, or base64 for binary.
namestringNoA human-readable label. Defaults to the last /-separated segment of the path.
teamstringNoCreate in this team. Omit to target the represented user's space.

Response​

FieldTypeDescription
pathstringThe stored resource path.
idstringThe 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.

CodeCauseDelivered as
resource_path_takenA resource with this path already exists in the target space.tool error (isError)
invalid_resource_pathThe path is invalid (needs at least one alphanumeric character).tool error (isError)
invalid_content_typecontent_type is not a valid MIME type.tool error (isError)
invalid_content_encodingcontent_encoding is not utf8 or base64.tool error (isError)
invalid_base64content_encoding is base64 but the content isn't valid base64.tool error (isError)
content_too_largeThe content is larger than the per-call limit — use the dashboard for large uploads.tool error (isError)
resource_limit_reachedYour plan's resource count limit has been reached.tool error (isError)
storage_limit_reachedYour plan's storage limit has been reached.tool error (isError)
team_not_foundNo team with that name is bound to this credential.tool error (isError)
forbiddenYour credential isn't permitted to create resources.tool error (isError)
personal_cannot_address_teamYou used a team/ prefix (or team field) with a personal credential.tool error (isError)
no_personal_spaceThis credential has no personal space — address a team instead.tool error (isError)
invalid_argumentsThe arguments are missing or don't match the input schema.protocol error (invalid_params)
internal_errorAn unexpected error occurred.protocol error (internal_error)

Notes​

  • Use the raw path with a separate team; never prefix the path with me/ 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.