A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
High-performance Google Drive CLI and Model Context Protocol (MCP) Server for LLM/AI agents. Natively execute Apps Scrip

ggsrun is an enterprise-grade CLI tool and MCP (Model Context Protocol) Server designed to relentlessly orchestrate Google Drive I/O operations and execute Google Apps Script (GAS) natively from a local terminal.
With the release of v5.2.0, ggsrun transcends its origins as a mere CLI tool. Built on Go 1.26.4+, the execution engine has been entirely rewritten from legacy serial processing into a channel-based, streaming concurrent architecture. It now serves as a high-performance, fault-tolerant I/O backend fully integrated with Omni-Drive (Shared Drives) support, advanced MIME resolution, secure redirect-following Auth logic, and a native MCP Server Mode allowing LLM agents to autonomously manage your cloud infrastructure.
Legacy pseudo-asynchronous processing has been eradicated. ggsrun now utilizes a channel-based worker pool built on golang.org/x/sync/errgroup to maximize network throughput on massive folder trees.
The v5 engine forces supportsAllDrives=true and includeItemsFromAllDrives=true across all Google Drive API permutations. Enterprise users can now execute bulk batch operations targeting deeply nested structures within organizational Shared Drives.
The extraction logic dynamically categorizes Google workspace entities. Requests targeting GAS code bypass the standard Drive API and are automatically routed to the Apps Script API, securely landing as structured .json locally.
The v5 execution phase is strictly non-blocking. HTTP 429 (Rate Limits) and 5xx (Server Errors) trigger a mathematical exponential backoff sequence per-worker, ensuring aggressive self-healing.
Running ggsrun mcp transforms the application into an autonomous JSON-RPC server via stdio. Large Language Model (LLM) agents can natively invoke internal capabilities without requiring any API keys locally.
This beginner-friendly, step-by-step guide will walk you through installing ggsrun, configuring your Google Cloud environment, deploying your script, and executing your Google Apps Script (GAS) or Web App directly from your local computer. No advanced programming experience required.
ggsrun is a lightweight application that runs through your terminal (Command Prompt or PowerShell on Windows, or Terminal on macOS/Linux). You do not need to install complex development environments; you can simply download a ready-to-use version.
ggsrun_windows_amd64.exe (or arm64 if you are using an ARM-based Windows device like a Surface Pro).ggsrun.exe.ggsrun-workspace).ggsrun_darwin_amd64ggsrun_darwin_arm64ggsrun_linux_amd64 (or matching CPU architecture)ggsrun.ggsrun-workspace).cd ~/Desktop/ggsrun-workspace
chmod +x ggsrun
To allow ggsrun to securely communicate with your Google account, you must create a private connection keyset inside the Google Cloud Console.
My-ggsrun-Project) and click Create. Ensure this newly created project is selected in the top dropdown menu before moving forward.Google requires you to set up an authorization screen that pops up when you link your account.
@gmail.com account, choose External and click Create.ggsrun Client⚠️ Warning: If you skip adding your email as a test user, Google will block you with an
Error 400: invalid_scopelater during the authorization process.
ggsrun Desktop Client. Click Create..json will download.ggsrun-workspace).client_secret.jsonNow, you must tell your Google Apps Script project to use the specific cloud credentials you just generated.
123456789012). Do not copy the Project ID text; you specifically need the numerical number.ggsrun and client_secret.json are placed:
cd %USERPROFILE%\Desktop\ggsrun-workspacecd ~/Desktop/ggsrun-workspaceggsrun auth./ggsrun authggsrun will automatically open your default web browser and present a standard Google login page.ggsrun will prompt you to enter your Google Apps Script Project Script ID and your Web Apps URL (optional).
ggsrun.cfg, allowing you to run execution commands later without passing the -i or -u options every time!ggsrun.cfg is automatically generated in your folder; this stores your login session and configurations securely.To let ggsrun securely trigger your scripts remotely (necessary for stateless exe2 and webapps modes), you must add a small gateway wrapper inside your Google Apps Script.
+ icon next to Libraries.ggsrunif Library ID into the box:
115-19njNHlbT-NI0hMPDnVO1sdrw2tJKCAJgOTIAPbi_jq3tOo4lVRov
ggsrunif, and click Add.Open your Code.gs file in the script editor and replace the default code with the following wrapper endpoints (for both exe2 and webapps modes):
const doPost = (e) => ggsrunif.WebApps(e, "pass1");
const ExecutionApi = (e) => ggsrunif.ExecutionApi(e);
(Note: Change "pass1" to a secure custom password if you plan to execute webapps anonymously).
exe1 & exe2)ggsrun API Engine.webapps)ggsrun Web Engine.ggsrun CLI to be authenticated via ggsrun auth with Drive scopes enabled.-p).https://script.google.com/macros/s/[WEB_APP_ID]/exec).Let's test everything to ensure your computer can run scripts inside your Google Account successfully.
ggsrun-workspace) and name it test_script.js.function main(message) {
return "Success! Received local message: " + message;
}
cd ~/Desktop/ggsrun-workspace or your Windows path).exe2 mode)Run the script using ggsrun exe2. Replace [YOUR_SCRIPT_ID] with the Script ID you copied during Step 5.3 (or omit the -i flag if you saved the Script ID in ggsrun.cfg during authentication):
ggsrun exe2 -i "[YOUR_SCRIPT_ID]" -f ExecutionApi -s test_script.js -v "Hello Google Apps Script!" -j
./ggsrun exe2 -i "[YOUR_SCRIPT_ID]" -f ExecutionApi -s test_script.js -v "Hello Google Apps Script!" -j
webapps mode)Run the script using ggsrun webapps. Replace [YOUR_WEB_APP_URL] with the Web App URL you copied during Step 5.4 (or omit the -u flag if you saved the Web App URL in ggsrun.cfg during authentication):
ggsrun webapps -u "[YOUR_WEB_APP_URL]" -p pass1 -s test_script.js -v "Hello Google Apps Script!" -j
./ggsrun webapps -u "[YOUR_WEB_APP_URL]" -p pass1 -s test_script.js -v "Hello Google Apps Script!" -j
In both cases, ggsrun will securely upload the script payload, run it in the Google Cloud environment, and output a clean JSON result directly to your terminal showing the return string:
"Success! Received local message: Hello Google Apps Script!". Your local workspace automation is completely operational!
Requires Go 1.26.4 or higher. Pull and compile the latest binary natively:
$ go install github.com/tanaikech/ggsrun@latest
Alternatively, you can download pre-built binaries directly from the Releases page.
The following compiled binaries are available:
ggsrun_darwin_amd64ggsrun_darwin_arm64ggsrun_linux_386ggsrun_linux_amd64ggsrun_linux_arm64ggsrun_linux_arm7ggsrun_linux_mipsggsrun_linux_mipsleggsrun_freebsd_amd64ggsrun_freebsd_arm64ggsrun_windows_386.exeggsrun_windows_amd64.exeggsrun_windows_arm64.execlient_secret.json.With your client_secret.json in the current directory, execute:
$ ggsrun auth
ggsrun spins up a secure local loopback listener. Your default browser will launch, request authorization, and securely hand the token back to the CLI. A persistent ggsrun.cfg file is generated.
To execute arbitrary GAS functions locally without permanent deployments (exe2 and webapps modes), you must establish a gateway endpoint on Google Apps Script using the ggsrunif library.
+ icon next to Libraries.115-19njNHlbT-NI0hMPDnVO1sdrw2tJKCAJgOTIAPbi_jq3tOo4lVRov.ggsrunif and select the latest version.Replace the default code in Code.gs with the following ultra-lightweight wrappers.
const doPost = (e) => ggsrunif.WebApps(e, "pass1");
const ExecutionApi = (e) => ggsrunif.ExecutionApi(e);
(Note: Change "pass1" to a secure custom password if you plan to execute webapps anonymously).
exe1 & exe2)-i flag.webapps)ggsrun CLI to be authenticated via ggsrun auth with Drive scopes enabled. If you need to trigger the webapp anonymously from a CI/CD pipeline without a token, set access to Anyone and rely on the -p password flag).-u flag.| Command | Action |
|---|---|
$ ggsrun auth | Initiates the secure OAuth2 loopback flow. Use --port to change the binding port. |
$ ggsrun status | Health diagnostic tool to verify the validity and expiration of your current Access Token. |
$ ggsrun mcp | Starts the stdio-bound MCP Server. Listens for tools like searchfiles, download, upload. |
Target IDs can belong to Standard Drives, Shared Drives, or Team Drives seamlessly. ggsrun natively handles the recursive mapping of folders and parallel byte-streaming.
| Command | Action |
|---|---|
$ ggsrun download -i "FILE_ID1, FILE_ID2" -w 5 | Downloads specific files utilizing 5 parallel channel workers. |
$ ggsrun download -i "FOLDER_ID" -w 10 | Recursively maps and downloads an entire folder tree concurrently. |
$ ggsrun download -i "SPREADSHEET_ID" -e xlsx | Directs the Drive API to transpile and export a native Google Sheet into an .xlsx binary. |
$ ggsrun download -i "DOCUMENT_ID" -e md | Directs the Drive API to transpile and export a Google Doc into a Markdown (.md) file. |
$ ggsrun download -i "DOCUMENT_ID" -e pdf | Directs the Drive API to transpile and export a Google Doc into a PDF (.pdf) file. |
$ ggsrun download -i "FOLDER_ID" -m "application/pdf" | Recursively downloads a folder, but filters specifically to retrieve only PDF files. |
$ ggsrun download -i "SCRIPT_ID" -z | Downloads an entire GAS project, bundles all .js/.html files, and saves it as a .zip archive. |
$ ggsrun download -i "SCRIPT_ID" -r | Downloads a GAS project natively as raw .json payload. |
$ ggsrun download -i "FOLDER_ID" -cm update | Recursively downloads a folder, updating only files that are newer on Drive. |
$ ggsrun download -i "FOLDER_ID" -d "./downloads" | Recursively downloads a folder, saving all files inside the ./downloads directory (created automatically). |
[!NOTE] When downloading a folder concurrently, specified export extensions via
-eare dynamically validated against each file's native format. For example, if you download a folder with-e xlsx, Sheets inside the folder will convert to.xlsxfiles while unsupported files (like Slides or Docs) will print a warning and skip, allowing the queue to continue without failure.
Pushes local hierarchical structures to Google Drive asynchronously. Resumable chunked uploads are inherently supported for massive binaries (default chunk size: 100MB).
| Command | Action |
|---|---|
$ ggsrun upload -f "a.txt, b.txt" -p "FOLDER_ID" | Uploads multiple individual files sequentially or concurrently. |
$ ggsrun upload -f "/path/to/folder" -p "FOLDER_ID" -w 5 | Uploads a local directory recursively, mimicking the exact file tree on Google Drive. |
$ ggsrun upload -f "script.js" --projectname "MyAPI" | Uploads a local file and provisions it as a brand new Standalone GAS Project. |
$ ggsrun upload -f "script.js" -pid "SHEET_ID" --projecttype "spreadsheet" | Uploads a script and provisions it as a Container-Bound Script directly attached to the specified Google Sheet. |
$ ggsrun upload -f "data.csv" -c "sheet" | Uploads a CSV file and automatically commands Google Drive to convert it into a native Google Spreadsheet. |
$ ggsrun upload -f "document.docx" -c "doc" | Uploads a Word document and converts it to a native Google Doc. |
$ ggsrun upload -f "slides.pptx" -c "slide" | Uploads a PowerPoint presentation and converts it to a native Google Slide. |
$ ggsrun upload -f "large_file.mp4" --chunksize 250 | Accelerates massive file transfers by increasing the Resumable Upload chunk size to 250MB. |
$ ggsrun upload -f "/path/to/folder" -p "FOLDER_ID" -cm rename | Uploads a directory, appending timestamps to any conflicting filenames on Drive. |
[!NOTE] Recursive folder uploads natively support batch conversion. When specifying
-c(or--convertto), every eligible file within the uploaded folder tree is evaluated and converted to the target Workspace format concurrently. Files that cannot be converted will log a conversion error warning and skip, leaving other files in the queue unaffected.
Both download and upload commands support the --conflict-mode (or -cm) flag to handle collisions when files already exist in the target destination.
If not specified, ggsrun will default to an interactive CLI prompt allowing you to dynamically select the resolution per collision.
| Conflict Mode | Behavior (Download) | Behavior (Upload) |
|---|---|---|
skip | Skips downloading the file if it already exists locally. | Skips uploading the file if it already exists on Google Drive. |
overwrite | Overwrites the local file. | Overwrites the remote file on Google Drive (triggers a PATCH request). |
rename | Appends a timestamp (_YYYYMMDD_HHMMSS) to the filename locally. | Appends a timestamp (_YYYYMMDD_HHMMSS) to the filename on Google Drive. |
update | Downloads only if the remote file is newer than the local file. | Uploads/updates only if the local file is newer than the remote file. |
[!NOTE] The legacy
--overwrite(-o) and--skip(-s) flags indownloadare deprecated. Please migrate to--conflict-mode. For massive concurrent uploads, metadata queries are pre-fetched in bulk to bypass Google Drive API rate limits. Naming collisions on directories/folders do not trigger prompts. They are silently reused, applying file-level conflict resolution strictly to the items within. When-j(--jsonparser) is active, TUI logs and progress bars are fully muted and interactive prompts are bypassed, defaulting toOverwriteIfNewerunless overriden by--cm/--conflict-mode.
Running $ ggsrun mcp transforms ggsrun into a native Model Context Protocol (MCP) Server, communicating with LLM clients (such as Claude Desktop, Cursor, or specialized AI agents) over standard I/O (stdin/stdout).
With the release of v5.1.1, the MCP capabilities are enhanced to fully expose modern conflict resolution and deliver deeply structured JSON results.
To configure ggsrun as an MCP server inside your Antigravity CLI environment, specify the server details in your global config file at ~/.gemini/config/mcp_config.json.
Add the following JSON configuration snippet, ensuring that the command value points to your exact local ggsrun executable path:
{
"mcpServers": {
"ggsrun-drive-agent": {
"command": "/path/to/ggsrun",
"args": ["mcp"]
}
}
}
The MCP server exposes the following high-level tools to your AI agent:
searchfiles: Search Google Drive files using standard Google Drive API v3 queries (e.g., name='target' and trashed=false). Supports optional regex filename filtering.download: Download files or folders by File ID. Includes a --conflict-mode option to handle name collisions, and supports custom local filename mapping.upload: Upload a local file or recursive folder to a Google Drive location. Includes a --conflict-mode option and --projectname for GAS scripts.exe1: Stateful execution of Google Apps Script projects. Now supports passing local script sources (scriptfile or stringscript), executing target entry functions, and automatically resolves scriptid from the local configuration file ggsrun.cfg as a fallback.filelist: Exact name or ID search for files, returning Google Drive File details and names.TransferResult)When executing transfer operations (uploads/downloads), ggsrun outputs a standardized JSON payload structure named TransferResult. This allows your AI agent to reliably parse the result, extract metadata, and identify multi-turn actions like conflict resolution.
Example TransferResult JSON structure:
{
"message": [
"Upload processed successfully."
],
"files": [
{
"name": "file_2.txt",
"fileId": "1a2b3c4d5e6f7g8h9i0j",
"mimeType": "text/plain",
"url": "https://drive.google.com/file/d/1a2b3c4d5e6f7g8h9i0j/view",
"size": 1024,
"localPath": "/local/path/file_2.txt",
"status": "uploaded"
}
],
"pendingConflicts": [
{
"name": "file_1.txt",
"mimeType": "text/plain",
"size": 2048,
"localPath": "/local/path/file_1.txt",
"status": "pending_conflict"
}
],
"actionRequired": "Conflicts detected. Please invoke upload again with a conflict-mode: 'skip', 'overwrite', 'rename', or 'update' for the pending files."
}
You can manually test the MCP server configuration and schemas directly on your command line by piping JSON-RPC payloads into the standard input of ggsrun mcp.
1. Test MCP Server Initialization
$ echo '{"jsonrpc": "2.0", "method": "initialize", "id": 1}' | ggsrun mcp
2. List All Available Tools and Schemas
$ echo '{"jsonrpc": "2.0", "method": "tools/list", "id": 2}' | ggsrun mcp
3. Test Drive Search (searchfiles tool)
$ echo '{"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "searchfiles", "arguments": {"query": "name = '\''test_script.gs'\'' and trashed = false"}}, "id": 3}' | ggsrun mcp
4. Test Stateful GAS Script Execution (exe1 tool)
This invokes the main function using the local configuration fallback for scriptid:
$ echo '{"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "exe1", "arguments": {"scriptfile": "./my_script.js", "function": "main"}}, "id": 4}' | ggsrun mcp
To help your AI agent interact effectively with the ggsrun MCP server, use the following standardized and optimized prompts.
Test how the AI coordinates partial execution and handles unexpected collisions when some files already exist in Google Drive while others do not.
file_1.txt already exists on your Google Drive, while file_2.txt is a brand-new local file."Please upload
file_1.txtandfile_2.txtto Google Drive using theuploadtool. Do not specify the conflict mode initially. If there are pending conflicts, ask me how to resolve them."
upload tool for both files without passing the --conflict-mode argument.ggsrun backend uploads file_2.txt successfully and populates it in the files array, but registers file_1.txt under pendingConflicts with "status": "pending_conflict".TransferResult and successfully reports: "I have uploaded file_2.txt (ID: ...). However, file_1.txt already exists. Would you like to skip, overwrite, rename, or update it?"upload tool specifically for file_1.txt with conflict-mode set to "overwrite".Test if the AI can retrieve full file metadata from TransferResult and report specific file properties precisely.
"Please download the file with ID
[YOUR_FILE_ID]from Google Drive. Tell me exactly where it was saved (localPath) and itssizefrom the result."
download tool passing the target file ID.ggsrun performs the parallel download and returns a standardized JSON structure containing the file array.files array in TransferResult and replies to you with clear, accurate metadata: "The file has been saved to [localPath] and its size is [size] bytes."You can use the following sample prompts to instruct an AI Agent (e.g. Claude Desktop, Cursor, or Gemini Agent) connected to your ggsrun MCP server:
"Please search my Google Drive for a file named 'backup_utility.js'. If you find it, download it to my local workspace and let me know the path where you saved it."
"Upload the local script file
./main.gsto my Google Apps Script project (Script ID is1IRpZ4Hu...) and execute themainfunction. Please return the output payload."
"Search for folders modified within the last 7 days that do not contain 'archive' in their name. Give me a list of their names and IDs."
"Upload the local file
./data/report_2026.csvto the Drive folder1a2b3c.... If a file with the same name already exists in that folder, ask me whether to overwrite, skip, or rename it, and then proceed with my choice."
exe1 (Stateful Project Execution)exe1 relies on the Apps Script API to permanently upload (sync) your local .js/.gs file to the remote GAS project, and then invokes a specific function via the Execution API.
When to use: You want to permanently update the code on the cloud and run it. Requires an OAuth Token.
Step-by-Step:
sample.gs:
function targetFunction(data) {
return "Processed data: " + data;
}
$ ggsrun exe1 -i [YOUR_SCRIPT_ID] -s sample.gs -f targetFunction -v "Hello World"
sequenceDiagram
autonumber
participant CLI as ggsrun (Local PC)
participant AAPI as Apps Script API
participant EAPI as Execution API
participant GAS as Remote GAS Project
CLI->>AAPI: PUT /v1/projects/{id}/content<br>(Push local .js files)
AAPI-->>CLI: 200 OK (Project Overwritten)
CLI->>EAPI: POST /v1/scripts/{id}:run<br>Target: targetFunction
EAPI->>GAS: trigger targetFunction()
Note right of GAS: Executes utilizing the<br>permanently saved code
GAS-->>EAPI: Return Value
EAPI-->>CLI: Pure JSON Result
exe2 (Stateless Dynamic Execution)exe2 is the pinnacle of dynamic execution. It does not modify or update your remote GAS project files. Instead, it reads your local script, heavily sanitizes it into a secure JSON-encoded string, and transmits it as a payload to the ExecutionApi wrapper.
When to use: Rapid local prototyping and executing complex data-extraction algorithms on the cloud without polluting the production GAS project's codebase. Requires an OAuth Token.
Step-by-Step:
compute.js. The local entry point must be main():
function main(multiplier) {
return multiplier * 10;
}
$ ggsrun exe2 -i [YOUR_SCRIPT_ID] -f ExecutionApi -s compute.js -v 5 -j
sequenceDiagram
autonumber
participant CLI as ggsrun (Local PC)
participant API as Execution API
participant GAS as GAS Project (ggsrunif)
participant V8 as V8 Engine
CLI->>CLI: Wrap local code in IIFE<br>Encode to JSON literal
CLI->>API: POST /v1/scripts/{id}:run<br>Target: ExecutionApi
API->>GAS: trigger ExecutionApi(payload)
GAS->>V8: eval(script string)
Note right of V8: Executes stateless logic<br>without saving files to Drive
V8-->>GAS: Return Object/Value
GAS-->>API: Response Wrapper
API-->>CLI: Pure JSON Result
webapps (Anonymous OR Secure Endpoint Execution)webapps functions similarly to exe2 (stateless dynamic evaluation) but bypasses the Google Execution API entirely. Instead, it routes the payload through a standard HTTP POST request to a deployed Google Web App URL.
When to use:
drive scope OAuth token.-p password flag).Step-by-Step:
report.js (entry point main()).$ ggsrun webapps -u "https://script.google.com/macros/s/[WEB_APP_ID]/exec" -p pass1 -s report.js -j
ggsrun auth has been executed locally, the CLI automatically detects the token, bypasses the -p requirement, and securely traverses Google's 302 redirects to execute the code. The -j JSON output will include tokenAuthUsed: true.)sequenceDiagram
autonumber
participant CLI as ggsrun (Local PC)
participant URL as Web App URL
participant GAS as GAS Project (doPost)
participant V8 as V8 Engine
CLI->>CLI: URL-encode payload & Verify Token
alt Has OAuth Token
CLI->>URL: HTTP POST (Bearer Token attached)
URL-->>CLI: 302 Redirect (Google Auth)
CLI->>URL: Follow Redirect (Bearer Token re-attached)
else Anonymous Mode
CLI->>URL: HTTP POST (No Token, requires "Anyone" access)
end
URL->>GAS: trigger doPost(e)
GAS->>V8: eval(script string)
V8-->>GAS: Return Object/Value
GAS-->>URL: ContentService (MimeType.JSON)
URL-->>CLI: Pure JSON Result
To quickly verify the functionality of all execution modes using a stateless beacon request, you can run the following test commands:
ggsrun e1 -ss "const main = (_) => ggsrunif.Beacon();" -j
ggsrun e2 -ss "const main = (_) => ggsrunif.Beacon();" -j
ggsrun w -ss "const main = (_) => ggsrunif.Beacon();" -j
By default, ggsrun requests all necessary scopes for Drive and GAS execution. If you need to inject custom scopes or trim existing ones:
ggsrun.cfg file generated in your working directory."scopes": [ ... ] JSON array.$ ggsrun auth again.
The CLI will automatically re-read your modified configuration, launch the browser, and provision a new token with your exact custom scopes.1. Web Apps Returns Status Code 200, but output is HTML
If you set your Web App to "Only myself" but the CLI returns a parsing error with HTML, it means your ggsrun lacks the proper OAuth token. Run ggsrun auth to generate a token with the drive scope, which the CLI will automatically use to authenticate the Web App request across the Google 302 Redirects.
2. "Requested entity was not found" or 404 Errors
If utilizing GAS execution (e1 / e2), verify the target project is currently deployed as an API Executable on the latest version. Un-deployed or draft states cannot be invoked externally.
3. Headless Server Authentication
If ggsrun auth detects a headless Linux environment (where it cannot spawn a local browser loopback), it elegantly degrades into manual mode. It prints the URL; copy it into an external browser, authorize, and paste the code block back into standard input.
Licence: MIT
Author: Tanaike
For architectural questions, advanced enterprise integrations, or bug disclosures, contact: tanaike@hotmail.com
googlemimetypes.go) to synchronize with the latest Google Drive API importFormats/exportFormats. Revamped the CLI options help display for --extension (download/revision) and --convertto (upload) to explicitly list all supported formats. Overhauled the concurrent upload/download engines to handle --convertto / --noconvert directly in parallel streams without falling back to the legacy single-threaded uploader, adding validation capability checks and graceful error warning feedback. Added --destination (-d) option to the download and revision commands to allow specifying the target local directory for saving downloaded files.--conflict-mode behavior for -j / --jsonparser CLI runs to match the automated MCP mode (defaulting to OverwriteIfNewer, overridable via --cm). Muted TUI output and progress bars (mpb) when running with the -j option to return clean JSON. Supported --cm as a shorthand alias for --conflict-mode in file transfers.ggsrun mcp -h (and --help) to display all exposed MCP tool names and their detailed description outputs directly. Implemented strict programmatic safety review prompts inside the exe1 MCP tool description, instructing LLMs to statically analyze Apps Script payloads for API mutations (write/update/delete) and obtain user Y/N confirmations before running, while allowing read-only scripts to run automatically. Re-designed the conflict resolution engine into a dual-mode system: automated and non-interactive for MCP server sessions (defaulting to OverwriteIfNewer, with options for Ignore and Rename), and preserving legacy interactive CLI prompts for raw executions. Refactored parallel transfer loops to capture and return detailed file-level error feedback instead of crashing.e1, e2, and w to integrate comprehensive execution command examples (including stateless beacon checks) dynamically within both the --help flag screens and optionless execution error overlays. Fixed a namespace bug where evaluated scripts executing ggsrunif.Beacon() inside the library threw a ggsrunif is not defined ReferenceError, by binding ggsrunif to the library's global execution context.main.go, /internal/app/, /internal/utl/). Expanded ggsrun auth to request Web Apps URL registration and dynamically persist it in ggsrun.cfg, allowing ggsrun w to run without the -u option. Integrated WSL 2 environment detection to prompt the user to choose between the Windows host browser, WSL/Ubuntu native browser, or manual URL copy-pasting. Upgraded ggsrun e1, ggsrun e2, and ggsrun w commands to dynamically print full CLI flag helps alongside custom usage examples. Improved the MCP server (ggsrun mcp) tools schema, adding rich parameter descriptions, Drive API query examples, new scriptfile/stringscript parameters to the exe1 schema, searchbyid parameter to the filelist schema, and making scriptid optional by resolving automatically from ggsrun.cfg (via GGSRUN_CFG_PATH or the local directory). Refined tools/call backend handling to safely strip null/empty values.handler_download.go, handler_upload.go, handler_transfer.go, handler_mcp.go, handler_execute.go). Strengthened the MCP server core (ggsrun mcp) by capturing stdout and stderr execution logs for comprehensive error recovery. Embedded full support for --conflict-mode inside the MCP JSON-RPC schemas and standardized file transfer outputs into TransferResult to support interactive multi-turn collision resolution in LLM conversations. Fully updated pre-built binaries for all major architectures.download and upload commands via the new --conflict-mode (-cm) flag. Users can now choose from skip, overwrite, rename (appends timestamp _YYYYMMDD_HHMMSS to avoid collisions), or update (syncs only if the source file is newer than the target). Includes interactive fallback CLI prompts if no mode is specified. Deprecated the legacy --overwrite (-o) and --skip (-s) options in favor of --conflict-mode. To avoid Drive API rate limits during massive concurrent uploads, metadata query is pre-fetched in bulk.pterm for exe1, exe2, and webapps commands. Added interactive loading spinners with anti-ghosting fixed-width padding (%-70s) and beautifully structured execution reports. Maintained strict backward compatibility by preserving pure JSON output streams via the -j flag for CI/CD pipeline automation.webapps command to natively support "Only myself" execution deployments by bridging OAuth tokens (drive scope) across Google's HTTP 302 Auth Redirects. Ported the IIFE/JSON-literal double-eval protections from exe2 to webapps.-f flag mapping for proper API gateway resolution in exe2. Added precision deployment documentation for stateful and stateless execution modes.errgroup), freeze-proof TUI (mpb/v8), SIMD JSON parsing (goccy/go-json), native MCP server (ggsrun mcp), Shared Drives full-support, auto MIME-mapping, isolated fault tolerance, and OAuth2 loopback automation.mcp command backend logic.ggsrun into a background daemon capability. Redefined Config and Credentials path priority.appsscript.json).GGSRUN_CFG_PATH environment variable support.TotalElapsedTime additions.arguments.callee with named recursive functions in foldertree, transitioned to the modern File.moveTo method for folder reorganization, and bound ggsrunif globally to the library context to permit evaluated script payloads to call namespace alias methods safely.mcp-language-server gives MCP enabled clients access semantic tools like get definition, references, rename, and diagnos
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots