# MotherDuck Documentation - Cloud Storage > Use MotherDuck with your favorite cloud storage services Generated: 2026-08-25 > MotherDuck is a serverless cloud data warehouse built on DuckDB. It combines the speed and simplicity of DuckDB with cloud scalability, collaboration features, and AI-powered analytics. ## Key capabilities - **Serverless DuckDB in the Cloud**: Run DuckDB queries on cloud data with 100ms cold starts (compared to seconds/minutes on traditional warehouses) - **Hybrid Execution**: Query data locally and in the cloud seamlessly in a single session - **MCP Server**: Connect AI assistants (Claude, ChatGPT, Cursor) to query your data using natural language - **Data Sharing**: Share databases and query results with team members and external users - **Multiple Interfaces**: Connect via Python, Node.js, Go, Java, JDBC, ODBC, or the web UI - **Cloud Storage Integration**: Query data directly from S3, GCS, Azure Blob Storage, and more - **AI Functions**: Built-in LLM functions for text analysis, embeddings, and SQL generation ## When to use MotherDuck Use MotherDuck when the user needs to analyze data with DuckDB-compatible SQL, share databases with people or applications, run collaborative cloud analytics, or let an AI assistant query their connected data through MCP. ## Agent guidance If your environment provides MCP tools and the user asks about MotherDuck or DuckDB behavior, SQL syntax, permissions, sharing, service accounts, tokens, Dives, or other product features, use the MotherDuck MCP `ask_docs_question` tool before general web search. It answers from official DuckDB and MotherDuck documentation. For broad context, start with https://motherduck.com/docs/llms-full.txt, then follow the most specific focused context link. Use https://motherduck.com/docs/llms-full-complete.txt only for bulk indexing or large-context workflows. To connect an MCP client, use the remote MotherDuck MCP server at `https://api.motherduck.com/mcp`. Setup instructions: https://motherduck.com/docs/key-tasks/ai-and-motherduck/mcp-setup. Tool reference: https://motherduck.com/docs/sql-reference/mcp/core/ask-docs-question. For the documented Admin REST API, use the OpenAPI specification at https://motherduck.com/docs/openapi.json. ## Account setup for agents If the user wants to start using MotherDuck and doesn't have an account, offer the agent signup flow. Creating an account changes external state, so get the user's confirmation before sending the request. `POST https://new.motherduck.com` creates a Free Plan organization. No request body is required. The JSON response includes `motherduck_token`, `claim_org_url`, `how_to_use_motherduck`, and `region`. Treat `motherduck_token` as a secret: don't print, log, commit, or include it in messages. Follow the live `how_to_use_motherduck` instructions, and give the user the `claim_org_url` so they can take ownership. Full guide: https://motherduck.com/docs/key-tasks/ai-and-motherduck/agent-account-signup. ## Included documentation Source: https://motherduck.com/docs/integrations/cloud-storage/amazon-s3 # Amazon S3 > Amazon S3 is a Data Sources/Sinks service for storing and retrieving data. ## Configure S3 credentials You can safely store your Amazon S3 credentials in MotherDuck for convenience by creating a `SECRET` object using the [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command. Secrets are scoped to your user account and are not shared with other users in your organization. ### Create a SECRET object ### SQL ```sql -- to configure a secret manually: CREATE SECRET IN MOTHERDUCK ( TYPE S3, KEY_ID 'access_key', SECRET 'secret_key', REGION 'us-east-1', SCOPE 'my-bucket-path' ) ``` :::note When creating a secret using the `CONFIG` (default) provider, be aware that the credential might be temporary. If so, a `SESSION_TOKEN` field also needs to be set for the secret to work correctly. ::: ```sql -- to store a secret using your local AWS credentials (from `aws configure` or SSO): -- if you use AWS SSO, run `aws sso login --profile ` first CREATE SECRET aws_secret IN MOTHERDUCK ( TYPE S3, PROVIDER credential_chain, -- optional: add CHAIN and PROFILE for SSO credentials CHAIN 'sso', PROFILE '' ) ``` :::note[Secret validation] Starting with DuckDB v1.4.0, credentials are validated at secret creation time. If your credentials are not resolvable locally (for example, expired SSO tokens or missing `~/.aws/credentials`), the `CREATE SECRET` command will fail with a `Secret Validation Failure` error. The recommended fix is to use the correct `CHAIN` and `PROFILE` for your credential type (see the SSO example above). If you need to bypass local validation, you can add `VALIDATION 'none'`, but keep in mind that this skips the local check that confirms your credentials are valid before storing them in MotherDuck. ::: ```sql -- test the s3 credentials SELECT count(*) FROM 's3:///' -- browse objects in a bucket or prefix FROM md_list_files('s3:///') ``` ### Python ```python import duckdb con = duckdb.connect('md:') con.sql("CREATE SECRET IN MOTHERDUCK (TYPE S3, KEY_ID 'access_key', SECRET 'secret_key', REGION 'your_bucket_region')") # testing that our s3 credentials work con.sql("SELECT count(*) FROM 's3:///'").show() # 42 ``` ### UI Click on your profile to access the `Settings` panel and click on `Secrets` menu. ![menu_1](./img/settings_access.png) ![menu_2](./img/settings_panel.png) Then click on `Add secret` in the secrets section. ![menu_3](./img/settings_secrets_panel.png) You will then be prompted to enter your Amazon S3 credentials. ![menu_3](./img/settings_secrets_pop_up.png) You can update your secret by executing [CREATE OR REPLACE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command to overwrite your secret. ### Delete a SECRET object ### SQL You can use the same method above, using the [DROP SECRET](/sql-reference/motherduck-sql-reference/delete-secret.md) command. ```sql DROP SECRET ``` ### UI Click on your profile and access the `Settings` menu. Click on the bin icon to delete your current secrets. ![menu_4](./img/secrets_delete_4.png) ### Amazon S3 credentials as **temporary** secrets MotherDuck supports DuckDB syntax for providing S3 credentials. ```sql CREATE SECRET ( TYPE S3, KEY_ID 's3_access_key', SECRET 's3_secret_key', REGION 'us-east-1' ) ``` :::note Local/In-memory secrets are not persisted across sessions. ::: ### Use your local IAM role or SSO session If you authenticate to AWS with an IAM role, SSO, or instance profile instead of long-lived access keys, use a local DuckDB session with the `credential_chain` provider. DuckDB uses your local AWS setup to get credentials, and MotherDuck's cloud execution engine uses those credentials to read from S3. Grant your AWS identity permission to list the bucket, get its location, and read its objects. Buckets encrypted with AWS KMS also require `kms:Decrypt` permission on the key. MotherDuck doesn't need standing access. For an example policy, see the [AWS S3 secrets troubleshooting guide](/troubleshooting/aws-s3-secrets/). This pattern is a good fit for one-off or ad hoc loads when you already have a local AWS identity and don't want to store long-lived access keys in MotherDuck. The credentials usually expire with your AWS SSO or STS session. If your credentials are in a named AWS profile, start DuckDB with that profile after you sign in to AWS: ```bash AWS_PROFILE= duckdb ``` ```sql -- Connect to MotherDuck ATTACH 'md:' -- Use your local AWS identity (IAM role, SSO, or instance profile) CREATE SECRET my_s3 ( TYPE S3, PROVIDER credential_chain, REGION 'us-east-1' ) -- Read from S3 and write into a MotherDuck table CREATE TABLE my_db.main.events AS SELECT * FROM read_parquet('s3:////*.parquet') -- Verify the data loaded SELECT count(*) FROM my_db.main.events ``` The `my_s3` secret in this example lives only for the DuckDB session. Run the `CREATE SECRET` statement again after your AWS credentials expire or when you start a new DuckDB session. To check which secret a path uses, run `SELECT * FROM which_secret('s3:///', 's3')`. :::info MotherDuck's cloud execution engine makes the request to S3, not your local machine. If your bucket is only reachable from your local network (for example, restricted to a VPC without a public endpoint), the read fails. In that case, set [`MD_RUN = LOCAL`](/sql-reference/motherduck-sql-reference/md-run-parameter/) on the initial S3 read to force it to run in your local DuckDB session. Load the result into a local table, then insert it into MotherDuck: ```sql CREATE TEMP TABLE local_events AS SELECT * FROM read_parquet( 's3:////*.parquet', MD_RUN = LOCAL ) CREATE TABLE my_db.main.events AS SELECT * FROM local_events ``` ::: :::info Even temporary, in-memory secrets are available to MotherDuck's cloud execution engine when you connect your local DuckDB instance to MotherDuck. When you query S3, the query runs on MotherDuck's servers, not your local machine, and MotherDuck uses the best-matching secret to authenticate, whether it is stored locally or in MotherDuck. For more details, see [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret/#querying-with-secrets). ::: ## Troubleshooting For detailed troubleshooting steps, see the [AWS S3 secrets troubleshooting guide](/troubleshooting/aws-s3-secrets/). ## Browse buckets and files To inspect storage from SQL before querying specific files: ```sql FROM md_list_buckets_for_secret('__default_s3') FROM md_list_files('s3:///') FROM md_list_files('s3:////') ``` See [`MD_LIST_BUCKETS_FOR_SECRET()`](/sql-reference/motherduck-sql-reference/md-list-buckets-for-secret) and [`MD_LIST_FILES()`](/sql-reference/motherduck-sql-reference/md-list-files) for details. --- Source: https://motherduck.com/docs/integrations/cloud-storage/azure-blob-storage # Azure Blob Storage > Azure Blob is a Data Sources/Sinks service for storing and retrieving data. ## Configure Azure Blob Storage credentials You can safely store your Azure Blob Storage credentials in MotherDuck for convenience by creating a `SECRET` object using the [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command. :::note See [Azure docs](https://learn.microsoft.com/en-gb/azure/storage/common/storage-configure-connection-string#configure-a-connection-string-for-an-azure-storage-account) to find the correct connection string format. ::: ### Create a SECRET object ### SQL ```sql -- to configure a secret manually: CREATE SECRET IN MOTHERDUCK ( TYPE AZURE, CONNECTION_STRING '[your_connection_string]' ); ``` ```sql -- to store a secret configured through `az configure`: CREATE SECRET az_secret IN MOTHERDUCK ( TYPE AZURE, PROVIDER credential_chain, ACCOUNT_NAME 'some-account' ); ``` ```sql -- test the azure credentials SELECT count(*) FROM 'azure://[container]/[file]' SELECT * FROM 'azure://[container]/*.csv'; -- browse objects in a container FROM md_list_files('azure://[container]/', limit := 50); ``` ### Python ```python import duckdb con = duckdb.connect('md:') con.sql("CREATE SECRET IN MOTHERDUCK (TYPE AZURE, CONNECTION_STRING '[your_connection_string]')"); # testing that our Azure credentials work con.sql("SELECT count(*) FROM 'azure://[container]/[file]'").show() con.sql("SELECT * FROM 'azure://[container]/*.csv'").show() ``` ### UI Click on your profile to access the `Settings` panel and click on `Secrets` menu. ![menu_1](./img/settings_access.png) ![menu_2](./img/settings_panel.png) Then click on `Add secret` in the secrets section. ![menu_3](./img/settings_secrets_panel.png) You will then be prompted to enter your Amazon S3 credentials. ![menu_3](./img/secrets_add_azure.png) ### Delete a SECRET object ### SQL You can use the same method above, using the [DROP SECRET](/sql-reference/motherduck-sql-reference/delete-secret.md) command. ```sql DROP SECRET ; ``` ### UI Click on your profile and access the `Settings` menu. Click on the bin icon to delete the secret. ![menu_4](./img/secrets_delete_azure.png) ### Azure credentials as **temporary** secrets MotherDuck supports DuckDB syntax for providing Azure credentials. ```sql CREATE SECRET ( TYPE AZURE, CONNECTION_STRING '[your_connection_string]' ); ``` or if you use the `az configure` command to store your credentials in the `az` CLI. ```sql CREATE SECRET az_secret ( TYPE AZURE, PROVIDER credential_chain, ACCOUNT_NAME 'some-account' ); ``` :::note Local/In-memory secrets are not persisted across sessions. ::: :::info Even temporary, in-memory secrets are available to MotherDuck's cloud execution engine when you connect your local DuckDB instance to MotherDuck. When you query Azure Blob Storage, the query runs on MotherDuck's servers, not your local machine, and MotherDuck uses the best-matching secret to authenticate, whether it is stored locally or in MotherDuck. For more details, see [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret/#querying-with-secrets). ::: ## Browse files in Azure Blob Storage To inspect a container before querying individual files, use [`MD_LIST_FILES()`](/sql-reference/motherduck-sql-reference/md-list-files): ```sql FROM md_list_files('azure://[container]/'); FROM md_list_files('az://[container]/path/'); ``` --- Source: https://motherduck.com/docs/integrations/cloud-storage/cloudflare-r2 # Cloudflare R2 > Cloudflare R2 is a Data Sources/Sinks service for storing and retrieving data. ## Configure Cloudflare R2 credentials You can safely store your Cloudflare R2 credentials in MotherDuck for convenience by creating a `SECRET` object using the [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command. :::note See [Cloudflare docs](https://developers.cloudflare.com/r2/api/s3/tokens/) to create a Cloudflare access token. ::: ### Create a SECRET object ### SQL ```sql CREATE SECRET IN MOTHERDUCK ( TYPE R2, KEY_ID 'your_key_id', SECRET 'your_secret_key', ACCOUNT_ID 'your_account_id' ); ``` :::note The `ACCOUNT_ID` can be found when generating the API token on the endpoint URL `https://.r2.cloudflarestorage.com`. ::: :::note R2 buckets are regionless, so you do not need to specify a `REGION` parameter. If provided, it defaults to `auto`. ::: ```sql -- test the R2 credentials SELECT count(*) FROM 'r2://[bucket]/[file]' ``` ### Python ```python import duckdb con = duckdb.connect('md:') con.sql("CREATE SECRET IN MOTHERDUCK ( TYPE R2, KEY_ID 'your_key_id', SECRET 'your_secret_key', ACCOUNT_ID 'your_account_id' )"); # testing that our R2 credentials work con.sql("SELECT count(*) FROM 'r2://[bucket]/[file]'").show() ``` ### UI Click on your profile to access the `Settings` panel and click on `Secrets` menu. ![menu_1](./img/settings_access.png) ![menu_2](./img/settings_panel.png) Then click on `Add secret` in the secrets section. ![menu_3](./img/settings_secrets_panel.png) Select the Secret Type `R2` and fill in the required fields. ### Delete a SECRET object ### SQL You can use the same method above, using the [DROP SECRET](/sql-reference/motherduck-sql-reference/delete-secret.md) command. ```sql DROP SECRET ; ``` ### UI Click on your profile and access the `Settings` menu. Click on the bin icon to delete the secret. ![menu_4](./img/secrets_delete_azure.png) ### R2 credentials as **temporary** secrets MotherDuck supports DuckDB syntax for providing R2 credentials. ```sql CREATE SECRET ( TYPE R2, KEY_ID 'your_key_id', SECRET 'your_secret_key', ACCOUNT_ID 'your_account_id' ); ``` :::note Local/In-memory secrets are not persisted across sessions. ::: :::info Even temporary, in-memory secrets are available to MotherDuck's cloud execution engine when you connect your local DuckDB instance to MotherDuck. When you query R2, the query runs on MotherDuck's servers, not your local machine, and MotherDuck uses the best-matching secret to authenticate, whether it is stored locally or in MotherDuck. For more details, see [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret/#querying-with-secrets). ::: --- Source: https://motherduck.com/docs/integrations/cloud-storage/google-cloud-storage # Google Cloud Storage > With MotherDuck, you can access files in a private Google Cloud Storage (GCS) bucket. This leverages the GCS S3 compatible connection. ## Google Cloud Storage connection process 1. Create an [HMAC key](https://docs.cloud.google.com/storage/docs/authentication/hmackeys) for the service account: Cloud Storage → Settings → Interoperability → Create a key for a service account 2. Save the Access ID and Secret (shown once) 3. Create the DuckDB secret using the HMAC credentials as described below ## Configure Google Cloud Storage credentials You can safely store your Google Cloud Storage credentials in MotherDuck for convenience by creating a `SECRET` object using the [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command. ### Create a SECRET object You can safely store your Google Cloud Storage credentials in MotherDuck for convenience by creating a `SECRET` object using the [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command. ### SQL ```sql CREATE SECRET IN MOTHERDUCK ( TYPE GCS, KEY_ID 'HMAC_ACCESS_ID', SECRET 'HMAC_SECRET' ); -- test GCS credentials SELECT count(*) FROM 'gcs:///'; ``` ### Python ```python import duckdb con = duckdb.connect('md:') con.sql("CREATE SECRET IN MOTHERDUCK (TYPE GCS, KEY_ID 'access_key', SECRET 'secret_key')"); # test GCS con.sql("SELECT count(*) FROM 'gcs:///'").show() # 42 ``` ### UI Click on your profile to access the `Settings` panel and click on `Secrets` menu. ![menu_1](./img/settings_access.png) ![menu_2](./img/settings_panel.png) Then click on `Add secret` in the secrets section. ![menu_3](./img/settings_secrets_panel.png) You will then be prompted to enter your Amazon S3 credentials. ![menu_3](./img/settings_secrets_pop_up.png) You can update your secret by executing [CREATE OR REPLACE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command to overwrite your secret. ### Delete a SECRET object ### SQL You can use the same method above, using the [DROP SECRET](/sql-reference/motherduck-sql-reference/delete-secret.md) command. ```sql DROP SECRET ; ``` ### UI Click on your profile and access the `Settings` menu. Click on the bin icon to delete your current secrets. ![menu_4](./img/secrets_delete_4.png) ### Google Cloud Storage credentials as **temporary** secrets MotherDuck supports DuckDB syntax for providing GCS credentials. ```sql CREATE SECRET ( TYPE GCS, KEY_ID 's3_access_key', SECRET 's3_secret_key' ); ``` :::note Local/In-memory secrets are not persisted across sessions. ::: :::info Even temporary, in-memory secrets are available to MotherDuck's cloud execution engine when you connect your local DuckDB instance to MotherDuck. When you query GCS, the query runs on MotherDuck's servers, not your local machine, and MotherDuck uses the best-matching secret to authenticate, whether it is stored locally or in MotherDuck. For more details, see [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret/#querying-with-secrets). ::: ## Additional resources - [Using the S3 compatible connection in GCS](https://docs.cloud.google.com/storage/docs/aws-simple-migration) - [HMAC Keys in Google Cloud](https://docs.cloud.google.com/storage/docs/authentication/hmackeys) --- Source: https://motherduck.com/docs/integrations/cloud-storage/hetzner-object-storage # Hetzner Object Storage > Hetzner Object Storage is a S3-compatible object storage service. ## Configure Hetzner Object Storage credentials You can safely store your Hetzner Object Storage credentials in MotherDuck for convenience by creating a `SECRET` object using the [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret.md) command. :::note See [Hetzner docs](https://docs.hetzner.com/storage/object-storage/getting-started/generating-s3-keys/) to create S3 access keys. Save your secret key immediately as it cannot be viewed again after creation. ::: ### Create a SECRET object ### SQL ```sql CREATE SECRET IN MOTHERDUCK ( TYPE S3, KEY_ID 'your_access_key', # provided by Hetzner SECRET 'your_secret_key', # provided by Hetzner ENDPOINT 'fsn1.your-objectstorage.com', # provided by Hetzner SCOPE 'your_bucket_scope' # Example: s3://test-bucket ); ``` :::note The endpoint must include the location (e.g., fsn1, nbg1, or hel1). Available endpoints: - `fsn1.your-objectstorage.com` (Falkenstein) - `nbg1.your-objectstorage.com` (Nuremberg) - `hel1.your-objectstorage.com` (Helsinki) ::: ```sql -- test the Hetzner Object Storage credentials SELECT count(*) FROM 's3://[bucket]/[file]' ``` ### Python ```python import duckdb con = duckdb.connect('md:') con.sql("CREATE SECRET IN MOTHERDUCK ( TYPE S3, KEY_ID 'your_access_key', SECRET 'your_secret_key', ENDPOINT 'fsn1.your-objectstorage.com', SCOPE 'your_bucket_scope' )"); # testing that our Hetzner credentials work con.sql("SELECT count(*) FROM 's3://[bucket]/[file]'").show() ``` ### UI Click on your profile to access the `Settings` panel and click on `Secrets` menu. ![menu_1](./img/settings_access.png) ![menu_2](./img/settings_panel.png) Then click on `Add secret` in the secrets section. ![menu_3](./img/settings_secrets_panel.png) Select the Secret Type `S3` and fill in the required fields. Ensure you add the endpoint URL (e.g., `fsn1.your-objectstorage.com`) in the endpoint field. ### Delete a SECRET object ### SQL You can use the same method above, using the [DROP SECRET](/sql-reference/motherduck-sql-reference/delete-secret.md) command. ```sql DROP SECRET ; ``` ### UI Click on your profile and access the `Settings` menu. Click on the bin icon to delete the secret. ![menu_4](./img/secrets_delete_azure.png) ### Hetzner Object Storage credentials as temporary secrets MotherDuck supports DuckDB syntax for providing Hetzner Object Storage credentials. ```sql CREATE SECRET ( TYPE S3, KEY_ID 'your_access_key', SECRET 'your_secret_key', ENDPOINT 'fsn1.your-objectstorage.com', SCOPE 'your_bucket_scope' ); ``` :::note Local/In-memory secrets are not persisted across sessions. ::: :::info Even temporary, in-memory secrets are available to MotherDuck's cloud execution engine when you connect your local DuckDB instance to MotherDuck. When you query Hetzner Object Storage, the query runs on MotherDuck's servers, not your local machine, and MotherDuck uses the best-matching secret to authenticate, whether it is stored locally or in MotherDuck. For more details, see [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret/#querying-with-secrets). ::: ### Multiple locations configuration If you have buckets in different Hetzner locations, you should be creating scoped secrets: ```sql -- Secret for Falkenstein location CREATE SECRET hetzner_fsn1 IN MOTHERDUCK ( TYPE S3, KEY_ID 'access_key_1', SECRET 'secret_key_1', ENDPOINT 'fsn1.your-objectstorage.com', SCOPE 's3://my-bucket-fsn1' ); -- Secret for Nuremberg location CREATE SECRET hetzner_nbg1 IN MOTHERDUCK ( TYPE S3, KEY_ID 'access_key_2', SECRET 'secret_key_2', ENDPOINT 'nbg1.your-objectstorage.com', SCOPE 's3://my-bucket-nbg1' ); ``` :::tip By default, each key pair is automatically valid for every bucket within the same Hetzner project. Use bucket policies to restrict access if needed. ::: --- Source: https://motherduck.com/docs/integrations/cloud-storage/tigris # Tigris > With MotherDuck, you can access files in a private Tigris bucket. Tigris is a globally distributed S3-compatible object storage service that provides low latency anywhere in the world. ## Tigris requirements To get started using Tigris with MotherDuck, you need to: 1. Create a new bucket at [storage.new](https://storage.new) if you don't have one 2. Create an access keypair for that bucket at [storage.new/accesskey](https://storage.new/accesskey) 3. Configure MotherDuck to use Tigris 4. Query files in Tigris When creating a bucket, you can select from different storage tiers: - Standard (default) - Best for general use cases - Infrequent Access - Cheaper than Standard, but charges per gigabyte of retrieval - Instant Retrieval Archive - For long-term storage with urgent access needs - Archive - For long-term storage where retrieval time is not critical ## Configure Tigris credentials ### Create a SECRET object :::note If you are using multiple secrets, the `SCOPE` parameter will make sure MotherDuck knows which one to use. You can validate which secret to use with [`which_secret`](https://duckdb.org/docs/stable/configuration/secrets_manager). As an example, see below: ```sql FROM which_secret('s3://my-other-bucket/file.parquet', 's3'); ``` ::: ### SQL ```sql CREATE OR REPLACE PERSISTENT SECRET tigris ( TYPE s3, PROVIDER config, KEY_ID 'tid_access_key_id', SECRET 'tsec_secret_access_key', REGION 'auto', ENDPOINT 't3.storage.dev', URL_STYLE 'vhost', SCOPE 's3://my_bucket' ); -- test Tigris credentials SELECT count(*) FROM 's3:///'; ``` ### Python ```python import duckdb con = duckdb.connect('md:') con.sql(""" CREATE OR REPLACE PERSISTENT SECRET tigris ( TYPE s3, PROVIDER config, KEY_ID 'tid_access_key_id', SECRET 'tsec_secret_access_key', REGION 'auto', ENDPOINT 't3.storage.dev', URL_STYLE 'vhost', SCOPE 's3://my_bucket' ) """) # test Tigris con.sql("SELECT count(*) FROM 's3:///'").show() ``` ### UI Adding Tigris secrets through the UI is not supported. Please add them using SQL statements. ### Delete a SECRET object ### SQL ```sql DROP SECRET tigris; ``` ### Tigris credentials as **temporary** secrets You can also create temporary secrets that are not persisted across sessions: ```sql CREATE OR REPLACE SECRET ( TYPE s3, PROVIDER config, KEY_ID 'tid_access_key_id', SECRET 'tsec_secret_access_key', REGION 'auto', ENDPOINT 't3.storage.dev', URL_STYLE 'vhost' ); ``` :::note Local/In-memory secrets are not persisted across sessions. ::: :::info Even temporary, in-memory secrets are available to MotherDuck's cloud execution engine when you connect your local DuckDB instance to MotherDuck. When you query Tigris, the query runs on MotherDuck's servers, not your local machine, and MotherDuck uses the best-matching secret to authenticate, whether it is stored locally or in MotherDuck. For more details, see [CREATE SECRET](/sql-reference/motherduck-sql-reference/create-secret/#querying-with-secrets). ::: --- Source: https://motherduck.com/docs/integrations/cloud-storage/index # Cloud Storage > Use MotherDuck with your favorite cloud storage services MotherDuck integrates with popular cloud storage services to help you manage and store your data. ## Included pages - [Amazon S3](https://motherduck.com/docs/integrations/cloud-storage/amazon-s3): Amazon S3 is a Data Sources/Sinks service for storing and retrieving data. - [Azure Blob Storage](https://motherduck.com/docs/integrations/cloud-storage/azure-blob-storage): Azure Blob is a Data Sources/Sinks service for storing and retrieving data. - [Cloudflare R2](https://motherduck.com/docs/integrations/cloud-storage/cloudflare-r2): Cloudflare R2 is a Data Sources/Sinks service for storing and retrieving data. - [Google Cloud Storage](https://motherduck.com/docs/integrations/cloud-storage/google-cloud-storage): With MotherDuck, you can access files in a private Google Cloud Storage (GCS) bucket. This leverages the GCS S3 compatible connection. - [Hetzner Object Storage](https://motherduck.com/docs/integrations/cloud-storage/hetzner-object-storage): Hetzner Object Storage is a S3-compatible object storage service. - [Tigris](https://motherduck.com/docs/integrations/cloud-storage/tigris): With MotherDuck, you can access files in a private Tigris bucket. Tigris is a globally distributed S3-compatible object storage service that provides low latency anywhere in the world. --- ## Docs feedback MotherDuck accepts optional user-submitted feedback about this page at `GET https://motherduck.com/docs/api/feedback/agent`. For agents and automated tools, feedback submission should be user-confirmed before sending. URL-encode query parameter values and send a GET request: ```text GET https://motherduck.com/docs/api/feedback/agent?page_path=%2Fintegrations%2Fcloud-storage%2F&page_title=MotherDuck%20Documentation%20-%20Cloud%20Storage&text= ``` Optionally append `&source=` such as `claude.ai` or `chatgpt`. `page_path` and `text` are required; `page_title` and `source` are optional. Responses: `200 {"feedback_id": ""}`, `400` for malformed query parameters, and `429` when rate-limited.