Highlights: security hardening of local web servers (authentication, minimum secret strength, cross-site requests refused), new option security, mcp server over HTTPS with token or OAuth authentication, JMESPath queries (--out.query), exit code by category of error, context-aware shell completion (also PowerShell), tables fitted to the terminal width. Ruby 3.2 or later is required.
New Features
ascli:- Local web servers refuse a weak secret at startup (
auth_tokenofmcp server,secret_tokenoffaspex5 postprocessing,passwordofnode emulatorand gateways): minimum strength set by parameter*_min_bits(default80,0disables), estimated with gemzxcvbnif installed. - New option
security: levelmediumorhighrestricts extended values@ruby:,@uri:,@env:and@file:(see manual). @secret:asks for the secret on a local web page in the browser when optionuiisgraphical.- Local web pages (authentication, secret request, OAuth consent) follow the light or dark theme of the system or browser.
- Option
uiis extended (still compatible:--ui=text|graphical): sub-optionmode(auto,terminal,browser) andcommand(array: browser command, URL appended). It replaces the environment variablesASPERA_BROWSERandBROWSER, which are no longer used. - New option
--out.query: JMESPath expression (or@ruby:lambda) to filter and reshape results, as--queryof the AWS and Azure CLIs. New gem dependency:jmespath. - The exit code indicates the category of error (e.g.
3authentication,4not found,5transfer,6network): seeascli -hor the manual. - Tables fit the terminal width: text columns are wrapped. Parameter
widthof--out.tablesets the maximum width. - Schema tables (value
helpof an option or argument,config ascp spec,config sync spec,config agents parameters, manual) indicate required fields. - Shell completion follows the context: options of plugin and command, values and types of options and arguments, keys of structures, aliases and abbreviations, local files for uploads, with descriptions in Zsh, Fish and PowerShell.
- New composite option
--tempwith sub-optionsfolder,cleanandexpiry: age ofascpfile lists left by interrupted commands, deleted when a command starts (a duration, e.g.30d, default5d,false: never,0: all). Options--temp-folderand--clean-tempare deprecated.
- Local web servers refuse a weak secret at startup (
config:- New command
completion powershelldisplays the completion script of PowerShell (see manual). ascp spec: Optional argument: name of agent, to display only the parameters it supports (asconfig ascp schema), oroverview, for one column per agent.
- New command
mcp:server: Authentication of transporthttpwith a static token (auth_token) or OAuth 2.0 (oauth), new optionpublic_url.server: HTTPS for transporthttpwith optionsurl,cert,keyandchain. Optionsbindandportare deprecated: useurl.server:@secret:asks the user on a web page (MCP URL mode elicitation): the secret is not sent to the AI model.
faspex5:postprocessing: New parameterssecret_token(?token=in URL) andallowed_ips(addresses or CIDR) restrict callers.postprocessing: Parameterlambdaof the URL query evaluates a Ruby script returning a lambda, called with the webhook values (was ignored).gateway(andaoc gateway): New parametersusernameandpassword(HTTP Basic, as Faspex 4).
orchestrator:- New command
workflows developmentdisplays the Workflow Authoring Guide, the Action Template Reference and the Plugin Manual (from GitHub), also used by AI assistants throughmcp server: whole document, one section, or table of contents up to a level (default per document, or optional argument). workflows exportwith optiondependenciessaves a package (.wkf) with sub-workflows and remote nodes.workflows importtakes an optional argument with optionsfolder_id,publishandlink_to_subworkflows.workflows listdisplaysfolder_id.- New commands
monitors list(monitors of a type: remote node monitors give the names of remote nodes),queues list,pools statusandjournal files(files recorded in a journal book).--query=helpdisplays the query parameters of each API call, from the OpenAPI description of Orchestrator (corrected from the source code of Orchestrator 4.1.6, OpenAPI 3.1). - New command
workflows check_importchecks a workflow file (.ymlor.wkf) locally before import, and reports problems with a severity, a code and a location (as the web UI import does).workflows importlogs these problems as warnings. - New command
plugins specdisplays the specifications of action plugins (from GitHub, optionplugin_specs): template attributes with their allowed values, inputs and outputs with the template settings they depend on. Used by AI assistants throughmcp server, and byworkflows check_importto check action templates and the inputs of steps (attributes and values, required inputs not mapped, inputs and outputs the plugin does not have). - New command
workflows find_constraintslists the conflicts and missing plugins found by Orchestrator for a file already on the server.workflows import_with_constraintsrefuses an import that Orchestrator would handle incorrectly (plugins not enabled, partial resolution of conflicts).
- New command
shares:- New commands
share list,share event create,admin directory,admin user|group search,admin group local users,admin authenticate, andadmin user|group all transfer_settings delete(reset to global settings). healthuses the/health_checkendpoint: status of each license and node.- Help of
admin share user_permissions|group_permissions create|modifyshows the request body.
- New commands
sync:target_rateinsync_infoaccepts suffixesk,mandg(e.g.100m).
Issues Fixed
ascli:- Tokens displayed by
bearer_token,bearer_token_node(aoc,faspex5,node),aoc admin node bearer_tokenandnode basic_tokenwere returned to the AI client bymcp server. They are now hidden. - Secrets are also hidden by value, wherever they appear in logs, results and
mcp serverresponses (e.g. in an error message, or as a key name): values of secret options (e.g.password) and of presets (e.g. read alone with@preset:<name>.password), of@secret:and@vault:, OAuth tokens, generated bearer and basic tokens, secrets of transfer specs. Inmcp serverresponses, a value shorter than 8 characters is also hidden as a word in a text. - With option
securitylevelmediumorhigh(default ofmcp server), a secret read by@secret:,@vault:or@preset:cannot be processed by another extended value (e.g.@list:,@json:, or in a text with@extend:), nor be a parameter name ofconfig preset set: the result could reveal it to the AI client. - Secret values of URL query parameters (e.g.
token,client_secret) are hidden in logs. - Logs: secrets in a Ruby
Structor object (password="...") were shown. Secrets of a dumped structure are now hidden by field name before it is rendered, whateverlog.format. - Local web servers (
faspex5 postprocessing,faspex5 gateway,aoc gateway,node emulator,mcp server,--auth=web):- Requests that a web page in the browser can send are refused:
Hostnot loopback on a loopback server (DNS rebinding),Originof another site. - A
urlwith an IPv6 address, or parameterchain, failed at startup. - WEBrick messages are logged at debug level.
- Requests that a web page in the browser can send are refused:
--auth=web:- Login could wait forever when the browser called back early, or when
redirect_urihas a path (HTTP 404). - A
redirect_urion loopback other than127.0.0.1(e.g.[::1]) was refused. - Ctrl-C ended with an internal error instead of stopping the command.
- The page after login, whose URL contains the authorization code, could be cached, framed, or sent as referrer.
- Login could wait forever when the browser called back early, or when
- Error messages of servers in Ruby (e.g. Orchestrator) included the backtrace of the exception: it is in the debug log only.
- Network errors and resources not found by name were reported as
Other(<exception class>). - Terminal output:
- Unicode (
--out.utf8): detection follows the precedence of locale variables (LC_ALL=Cdisables it), and supports Windows Terminal, VS Code, Git Bash, ConEmu and terminals settingTERM. - Colors (
--out.colors):NO_COLOR,CLICOLORandCLICOLOR_FORCEfollow conventions, and results written with--out.fileno longer contain ANSI codes. - Without Unicode, symbols are replaced with ASCII (e.g. hidden secret
🔑becomes***).
- Unicode (
- A boolean or decimal result (e.g.
config echo @json:true) failed with an internal error. --out.selectrefused a Ruby lambda (@ruby:).- Help and manual: a parameter with alternatives (
oneOf) had no type (which broke the PDF manual), and alternatives had no title. - Value
helpof an option or argument displays the schema asconfig sync spec: with fields of alternatives (oneOf), deprecations and examples, and for--ts=helpthe supported agents andascpoptions.config agents parametersdisplays allowed values and defaults. - Removed gem dependencies
blankslateandword_wrap: descriptions in schema tables are wrapped to the terminal width instead of cut at 120 characters. - Transfer spec parameter
target_rateis in bps as documented (without suffix or withkit was taken as kbps, an integer was rejected), andsyncignored it (andtarget_rate_kbpswith formatargs). - An asynchronous transfer with agent
direct(default ofmcp server) failed withfailed to open input file list: the file list was deleted at the end of the command. Temporary files ofascpare now deleted when the transfer ends. --clean-temp=noalso kept the oldascpfile lists left by interrupted commands, and two commands starting at the same time could fail when deleting the same old file list.
- Tokens displayed by
config:preset get: The value of a secret option (e.g.password) was displayed, and returned to the AI client bymcp server. It is now hidden, unless--out.secrets=yes(command line only, never inmcp server).preset: A secret made of digits only (e.g.password, set withconfig preset set, or not quoted in the YAML file) was a number, shown in results andmcp serverresponses: it is now aString, hidden.vault:system(macOS): the password andusernamewere not returned, and special characters were stored escaped.file:passworddid not migrate a vault of version 4.26.0 or earlier to PBKDF2. The file is loaded with YAML safe loading.vault(HashiCorp):listfailed after a secret was deleted.1password:urlis read from the website of the item.preset securefailed on a missing secret (system,1password), and@vault:on a label containing dots.
completion words: Extended values on the command line were evaluated at eachTab(e.g.@ruby:code executed,@stdin:waiting for input).completion: Bash: words containing=or:(e.g. a URL) broke completion of the next words, and eachTabchecked for a newer gem version on the network.documentation: Intoc, lines of code blocks (e.g. shell comments) were taken as headings, and they ended the extracted section.--selectdid not apply totoc(keys were symbols).transfer status: For agentdirect,bytes_transferred(sum ofTransferBytesof the sessions) andended_atwere not set.sync translate: Options-C,--ws-connect,-D,--scan-intervaland--remote-scan-intervalwere translated incorrectly.
mcp:- REST error messages were repeated once more at each tool call.
server: Option--out.querywas ignored.
faspex5:postprocessing,gateway(andaoc gateway): Invalid requests return HTTP 400, 403 or 404 instead of 500, without stack trace or path of the script.packages send(andaoc packages send): In asynchronous mode, the job id of the transfer was not returned: it is in fieldtransferof the result.
node:emulator: A symbolic link in thedocrootleading out of it was followed by transfers.emulator: APOSTwith an empty body returned HTTP 500 instead of 400.
orchestrator:workflows import_with_constraintsfailed with an internal error of Orchestrator (plugins not enabled), or silently imported copies (partial resolution of conflicts). The OpenAPI description offind_constraintsandimport_with_constraintswas wrong.workflows import,import_with_constraintsandpublishsent requests rejected by Orchestrator,importdid not report workflows not imported, andstartwithsynchronousfailed to display the work order.workstep statusdisplayed fields that are YAML dumps of Orchestrator objects (prerequisites,work_outputs...): they are removed, inputs and outputs are ininputsandoutputs.
shares:- The manual and the description of
admin user|group all share_permissions(read-only) did not tell that permissions are granted withadmin share user_permissions|group_permissions: AI assistants concluded that it was not possible. The argument ofshowis namedshare_id.
- The manual and the description of
Breaking Changes
ascli:- Secrets are hidden in results, whatever the output level or format (
--out.level=data,--format=json...), unless--out.secrets=yes: before,--out.level=data(default with--format=json,csv...) showed them. This includes tokens displayed bybearer_token,bearer_token_node,basic_tokenandconfig preset get <secret>. Add--out.secrets=yesto scripts that use them (e.g.$(ascli aoc bearer_token --out.secrets=yes)). - Ruby 3.2 or later is required (3.1 reached end of life in March 2025). Future minimum is 3.3. Policy: a Ruby version is supported until 18 months after its end of official support.
- The exit code on error indicates its category instead of always
1: scripts shall test for a non-zero code. With--format=nagios, a failed command exits with3(UNKNOWN). Valuehelpof a structured value exits with0. - Local web servers on an address that is not loopback require authentication:
auth_tokenformcp server,secret_tokenorallowed_ipsforfaspex5 postprocessing,usernameandpasswordfornode emulator,faspex5 gatewayandaoc gateway. - Local web servers: a JSON body requires header
Content-Type: application/json, else HTTP 415. @secret:asks in the browser by default on Windows and macOS (optionuiisgraphical): use--ui=textfor the terminal.
- Secrets are hidden in results, whatever the output level or format (
config:completion: Completion scripts saved in a folder shall be saved again (they call new commandconfig completion candidates).vault:createfails if the label exists (vault,1password),deletefails if the secret does not exist (file).1password:urlis stored as website of the item.ascp spec,sync spec,agents parameters, valuehelpof an option or argument: Columns arename,typeanddescription(norequired), anddescriptionis a list of lines (formatsjson,yaml), absent when empty.ascp spec: Columns per agent are displayed with argumentoverview. By default, the description lists the supported agents, if not all (e.g.(A, N)).agents show: Displays only the agent description: parameters are displayed byconfig agents parameters.
mcp:server: Optionsecurityishighby default and cannot be changed by the client, and@stdin:is refused: a preset reading a private key with@file:requires levelmediumorlow.server: Keys of transporthttpare refused withstdio(the default), andmax_line_byteswithhttp: they were ignored.
faspex5:postprocessing,gateway(andaoc gateway): Parameters are validated at startup: unknown keys are refused instead of ignored, and a missingscript_folderis reported.postprocessing: Only webhook values whose key starts withfaspex_are passed to the script as environment variables, and a structured value as JSON.
orchestrator:workflows importtakes a file created byworkflows export, andworkflows import_with_constraintstakes keysfilename,add_as_revision,subwf_constraints, ... (see help).monitorsis nowmonitors snapshot, with an optional type of monitors.workorders outputdisplays values of variables as plain values instead of single-element arrays, and an empty value asnull.
Server Versions
| Plugin | Product | Version |
|---|---|---|
aoc
| Aspera on Cloud | SaaS |
console
| IBM Aspera Console | 3.4.11 |
faspex5
| Faspex v5 | F5.0.17 |
httpgw
| HTTP Gateway | 2.3.4 |
node
| HSTS Node API | 4.4.8.2596 |
orchestrator
| Orchestrator | 4.1.6.2036-00000 |
shares
| IBM Aspera Shares | 1.11.5 |
Transfer Agent Versions
| Agent | Product | Version |
|---|---|---|
connect
| IBM Aspera Connect Client | 4.2.14 |
desktop
| IBM Aspera Desktop Client | 4.4.3 |
direct
| IBM Aspera Transfer SDK (ascp) | 1.1.9 |
httpgw
| IBM Aspera HTTP Gateway Agent | 1.3.0 |
node
| IBM Aspera Node API Agent | 4.4.3 |
transferd
| IBM Aspera transferd daemon | 1.1.9 |