Access the Google Drive API with managed OAuth authentication. List, search, create, and manage files and folders.
CLI:
maton google-drive file list -Q "name contains 'budget'"
maton api "/google-drive/drive/v3/files?q=name+contains+'budget'"
Python:
python <<'EOF'
import urllib.request, os, json, urllib.parse
params = urllib.parse.urlencode({'q': "name contains 'budget'"})
req = urllib.request.Request(f'https://api.maton.ai/google-drive/drive/v3/files?{params}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/google-drive/{native-api-path}
Maton proxies requests to www.googleapis.com and automatically injects your OAuth token.
NPM:
npm install -g @maton-ai/cli
Homebrew:
brew install maton-ai/cli/maton
CLI:
maton login # Opens browser for API key
maton login --interactive # Skip browser, paste API key directly
maton whoami # Show current auth state
Manual:
MATON_API_KEY:export MATON_API_KEY="YOUR_API_KEY"
Manage your Google OAuth connections at https://api.maton.ai.
CLI:
maton connection list google-drive --status ACTIVE
maton api -X GET /connections -f app=google-drive -f status=ACTIVE
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=google-drive&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
CLI:
maton connection create google-drive
maton api /connections -f app=google-drive
Python:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-drive'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
CLI:
maton connection view {connection_id}
maton api /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "google-drive",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
CLI:
maton connection delete {connection_id}
maton api -X DELETE /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Google Drive connections, specify which one to use:
CLI:
maton google-drive file list --connection {connection_id}
maton api /google-drive/drive/v3/files --connection {connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-drive/drive/v3/files?pageSize=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always specify the connection to ensure requests go to the intended account.
GET /google-drive/drive/v3/files?pageSize=10
With query:
GET /google-drive/drive/v3/files?q=name%20contains%20'report'&pageSize=10
Only folders:
GET /google-drive/drive/v3/files?q=mimeType='application/vnd.google-apps.folder'
Files in specific folder:
GET /google-drive/drive/v3/files?q='FOLDER_ID'+in+parents
With fields:
GET /google-drive/drive/v3/files?fields=files(id,name,mimeType,createdTime,modifiedTime,size)
Example:
maton google-drive file list -Q "name contains 'budget'"
GET /google-drive/drive/v3/files/{fileId}?fields=id,name,mimeType,size,createdTime
Example:
maton google-drive file view FILE_ID --fields 'id,name,mimeType,size,createdTime'
GET /google-drive/drive/v3/files/{fileId}?alt=media
Example:
maton google-drive file download FILE_ID --output ./report.pdf
GET /google-drive/drive/v3/files/{fileId}/export?mimeType=application/pdf
Example:
maton google-drive file export FILE_ID --mime-type application/pdf --output ./doc.pdf
POST /google-drive/drive/v3/files
Content-Type: application/json
{
"name": "New Document",
"mimeType": "application/vnd.google-apps.document"
}
Example:
maton google-drive file create --name 'New Document' --mime-type application/vnd.google-apps.document
POST /google-drive/drive/v3/files
Content-Type: application/json
{
"name": "New Folder",
"mimeType": "application/vnd.google-apps.folder"
}
Example:
maton google-drive file create --name 'New Folder' --mime-type application/vnd.google-apps.folder
PATCH /google-drive/drive/v3/files/{fileId}
Content-Type: application/json
{
"name": "Renamed File"
}
Example:
maton google-drive file update FILE_ID --name 'Renamed File'
PATCH /google-drive/drive/v3/files/{fileId}?addParents=NEW_FOLDER_ID&removeParents=OLD_FOLDER_ID
Example:
maton google-drive file update FILE_ID --add-parents NEW_FOLDER_ID --remove-parents OLD_FOLDER_ID
DELETE /google-drive/drive/v3/files/{fileId}
Example:
maton google-drive file delete FILE_ID
POST /google-drive/drive/v3/files/{fileId}/copy
Content-Type: application/json
{
"name": "Copy of File"
}
Example:
maton google-drive file copy FILE_ID --name 'Copy of File'
Google Drive supports three upload types depending on file size and whether you need to include metadata:
uploadType=media) — small files (≤5 MB) with no metadata.uploadType=multipart) — small files (≤5 MB) sent together with metadata in a single request.uploadType=resumable) — large files (>5 MB), or any upload where network interruption is likely. Resumable uploads also work fine for small files at the cost of one extra HTTP round trip, so they're a safe default for most applications.maton google-drive file upload picks the upload type for you based on the file size and flags:
| Flags | File size | Upload type used |
|---|---|---|
| --- | --- | --- |
--no-metadata | any | uploadType=media |
| (default, with metadata) | < 5 MiB | uploadType=multipart |
| (default, with metadata) | ≥ 5 MiB | uploadType=resumable (chunked, auto-resumes on transient errors) |
If you call the API directly, you choose the uploadType query parameter yourself per the sections below.
For files up to 5MB when you don't need to set metadata.
POST /google-drive/upload/drive/v3/files?uploadType=media
Content-Type: text/plain
<file content>
CLI:
maton google-drive file upload ./hello.txt --no-metadata
Python:
import urllib.request, os
file_content = b'Hello, this is file content!'
url = 'https://api.maton.ai/google-drive/upload/drive/v3/files?uploadType=media'
req = urllib.request.Request(url, data=file_content, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'text/plain')
response = urllib.request.urlopen(req)
For files up to 5MB when you need to include metadata (name, description, etc.).
POST /google-drive/upload/drive/v3/files?uploadType=multipart
Content-Type: multipart/related; boundary=boundary
--boundary
Content-Type: application/json; charset=UTF-8
{"name": "myfile.txt", "description": "My file"}
--boundary
Content-Type: text/plain
<file content>
--boundary--
CLI:
maton google-drive file upload ./myfile.txt
Python:
import urllib.request, os, json
boundary = '----Boundary'
metadata = json.dumps({'name': 'myfile.txt', 'description': 'My file'})
file_content = 'File content here'
body = f'''--{boundary}\r
Content-Type: application/json; charset=UTF-8\r
\r
{metadata}\r
--{boundary}\r
Content-Type: text/plain\r
\r
{file_content}\r
--{boundary}--'''.encode()
url = 'https://api.maton.ai/google-drive/upload/drive/v3/files?uploadType=multipart'
req = urllib.request.Request(url, data=body, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', f'multipart/related; boundary={boundary}')
response = urllib.request.urlopen(req)
For large files (recommended for files > 5MB). This approach:
Step 1: Initiate Upload Session
POST /google-drive/upload/drive/v3/files?uploadType=resumable
Content-Type: application/json; charset=UTF-8
X-Upload-Content-Type: application/octet-stream
X-Upload-Content-Length: <file_size>
{"name": "large_file.bin"}
Response includes Location header with the upload URI.
Step 2: Upload Content
PUT <upload_uri>
Content-Length: <file_size>
Content-Type: application/octet-stream
<file content>
CLI:
maton google-drive file upload ./large_file.bin
Python:
import urllib.request, os, json
file_path = '/path/to/large_file.bin'
file_size = os.path.getsize(file_path)
# Step 1: Initiate resumable upload session
url = 'https://api.maton.ai/google-drive/upload/drive/v3/files?uploadType=resumable'
metadata = json.dumps({'name': 'large_file.bin'}).encode()
req = urllib.request.Request(url, data=metadata, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json; charset=UTF-8')
req.add_header('X-Upload-Content-Type', 'application/octet-stream')
req.add_header('X-Upload-Content-Length', str(file_size))
response = urllib.request.urlopen(req)
upload_uri = response.headers['Location']
# Step 2: Upload file in chunks (e.g., 5MB chunks)
chunk_size = 5 * 1024 * 1024
with open(file_path, 'rb') as f:
offset = 0
while offset < file_size:
chunk = f.read(chunk_size)
end = offset + len(chunk) - 1
req = urllib.request.Request(upload_uri, data=chunk, method='PUT')
req.add_header('Content-Length', str(len(chunk)))
req.add_header('Content-Range', f'bytes {offset}-{end}/{file_size}')
response = urllib.request.urlopen(req)
offset += len(chunk)
result = json.load(response)
print(f"Uploaded: {result['id']}")
Resuming Interrupted Uploads:
If an upload is interrupted, re-run maton google-drive file upload, which resumes from the last persisted offset automatically.
If calling the API directly, query the upload URI to get current status:
req = urllib.request.Request(upload_uri, method='PUT')
req.add_header('Content-Length', '0')
req.add_header('Content-Range', 'bytes */*')
response = urllib.request.urlopen(req)
# Check Range header in response to get current offset
To update an existing file's content:
PATCH /google-drive/upload/drive/v3/files/{fileId}?uploadType=media
Content-Type: text/plain
<new file content>
CLI:
maton google-drive file update YOUR_FILE_ID --file ./updated.txt
Python:
import urllib.request, os
file_id = 'YOUR_FILE_ID'
new_content = b'Updated file content!'
url = f'https://api.maton.ai/google-drive/upload/drive/v3/files/{file_id}?uploadType=media'
req = urllib.request.Request(url, data=new_content, method='PATCH')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'text/plain')
response = urllib.request.urlopen(req)
Include the folder ID in the metadata:
metadata = json.dumps({
'name': 'myfile.txt',
'parents': ['FOLDER_ID']
})
Example:
maton google-drive file upload ./myfile.txt --parent FOLDER_ID
POST /google-drive/drive/v3/files/{fileId}/permissions
Content-Type: application/json
{
"role": "reader",
"type": "user",
"emailAddress": "user@example.com"
}
Example:
maton google-drive permission create -f FILE_ID --type user --role reader --email-address user@example.com
Use in the q parameter:
name = 'exact name'name contains 'partial'mimeType = 'application/pdf''folderId' in parentstrashed = falsemodifiedTime > '2024-01-01T00:00:00'Combine with and:
name contains 'report' and mimeType = 'application/pdf'
application/vnd.google-apps.document - Google Docsapplication/vnd.google-apps.spreadsheet - Google Sheetsapplication/vnd.google-apps.presentation - Google Slidesapplication/vnd.google-apps.folder - Folderapplication/pdf - PDFGoogle Drive uses token-based pagination. The CLI automatically paginates with '--paginate'.
Example:
maton google-drive file list --paginate
# List files matching a query
maton google-drive file list -Q "name contains 'budget'"
# Filter with jq
maton google-drive file list --json --jq '.files[] | {name: .name, id: .id}'
# Extract specific fields
maton google-drive drive list --json --jq '.drives[].name'
const response = await fetch(
'https://api.maton.ai/google-drive/drive/v3/files?pageSize=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
import os
import requests
response = requests.get(
'https://api.maton.ai/google-drive/drive/v3/files',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'pageSize': 10}
)
fields parameter to limit response datapageToken from previous response's nextPageTokenuploadType=media for simple uploads (up to 5MB), uploadType=multipart for uploads with metadata (up to 5MB), uploadType=resumable for large files (recommended for > 5MB)/upload/drive/v3/files (note the /upload prefix)curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.| Status | Meaning |
|---|---|
| -------- | --------- |
| 400 | Missing Google Drive connection |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Google Drive API |
CLI:
maton whoami
maton connection list
Manual:
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
google-drive. For example:https://api.maton.ai/google-drive/drive/v3/fileshttps://api.maton.ai/drive/v3/files共 3 个版本