Request Eagle CLI
request-eagle-cli is an optional standalone binary for AI agents. It manages
saved collections, requests and flows, runs them, and edits settings, without
the desktop app or a display.
Install
Download the executable for your platform from the releases page:
| Platform | Attachment |
|---|---|
| Apple Silicon macOS | request-eagle-cli-aarch64-apple-darwin |
| x86-64 Linux (glibc 2.35+) | request-eagle-cli-x86_64-unknown-linux-gnu |
| ARM64 Linux (glibc 2.39+) | request-eagle-cli-aarch64-unknown-linux-gnu |
install -m 755 request-eagle-cli-TARGET ~/.local/bin/request-eagle-cli
Or build it from a source checkout:
cargo install --path crates/request-eagle-cli --locked
Usage
The CLI describes its own commands:
request-eagle-cli --help
request-eagle-cli schema
request-eagle-cli call '{"command":"requests.list","query":"health"}'
request-eagle-cli call '{"command":"requests.run","path":"/absolute/path/Health.toml"}'
Each command writes one JSON object to stdout:
{"version":1,"ok":true,"result":{}}
{"version":1,"ok":false,"error":{"code":"operation_failed","message":"details"}}
Exit codes are 0 for success, 1 for a failure, and 2 for invalid input. HTTP
error statuses are completed responses and exit 0; check status and the
script results.
Things to know
- Quit the desktop app before editing its data and reopen it to load the changes. There is no live synchronization, except for agents in the app’s agent panel: the app reloads collections and flows after each of their turns.
requests.updatereplaces the complete request. Read it first and preserve the fields you do not intend to change.- When a collection or flow file can’t be read, such as one with a merge conflict, the commands that use them fail and list each such file with the reason. The app only shows how many files it left out, so fix them from here.
- Headers, query parameters and gRPC metadata are
[key, value]pairs. A row written as{"key": …, "value": …, "disabled": true, "description": …}is kept with the request but not sent. - WebSocket requests appear with a
websocketobject instead ofrequest. The CLI can read, move, rename and delete them, but only the app connects to them or edits them. call -reads JSON from stdin, which keeps secrets out of process arguments.- Saved scripts run only with
trust_scripts: true. Read them first, including the collection’s scripts fromcollections.get, which run before the request’s. - Response bodies and raw header values are Base64.
- An HTTP request’s
bodyhas atype:rawwith alanguage(json,xmlortext) and itstext,url_encodedwithfields,multipartwithparts, orbinarywith afile. A string alone is raw JSON. A multipart part with"file": truesends the file at itsvalue. Relative file paths start at the collection’s directory. - HTTP requests can set their own
timeout_ms,follow_redirectsandverify_certificates. Fields left out followsettings.request, and thetimeout_msofrequests.runreplaces both for that run. - Requests can set an
auth, such as{"type": "bearer", "token": "{{token}}"}. Without one, a request inherits its collection’s, whichcollections.getshows;{"type": "none"}sends none. Kinds areapi_key,bearer,basic,digest,oauth1,oauth2,jwtandaws_signature; gRPC requests cannot usedigest,oauth1oraws_signature. OAuth 2.0 sends its savedaccess_token; get a new one in the app. settings.requesttakesca_certificates, a PEM file of certificate authorities trusted in addition to the system’s.settings.client_certificates.addchecks a client certificate’s files and saves it for mutual TLS with one host; its passphrase goes to the OS credential store, so pass it through stdin.- Saved gRPC requests have
"protocol": "grpc", aurl, amethodsuch aspackage.Service/Methodand a JSONmessage. Withoutproto_filetheir services come from server reflection.requests.runsends the message once, also on client streams, and returns every message with the final status; non-OK gRPC statuses exit 0 like HTTP errors. Theirbefore_invoke,on_messageandafter_responsescripts also needtrust_scripts: true. requests.runkeeps the cookies that responses set in the app’s cookie jar,cookies.jsonin the data directory, and sends them with later runs to the same sites, as the app does.cookies.listshows them andcookies.deleteremoves a domain’s cookies, or one by name. Turn the jar off withsettings.requestand"cookie_jar": false. An HTTP request with"send_cookies": falsesends none of the jar’s cookies, while its responses still store theirs.- Flows have their own commands and are saved apart from collections.
flows.blocksdescribes every block type with its inputs, outputs and settings;flows.getalso lists the variables of each request a flow’s HTTP Request blocks send, which are their inputs.flows.updatereplaces the complete flow and checks its connections.flows.renamekeeps the flow’s path, andflows.deleteneedsconfirm: true.flows.runtakesinputfor its Start blocks and returns what its Output blocks received, each block’s last run and the Log blocks’ values. A flow whose requests have scripts runs only withtrust_scripts: true. A run that completes exits 0 withstatussucceeded,failedwhen a block failed, orstoppedat itstimeout_ms(5 minutes by default). See the flows guide. fql.evaluateevaluates FQL, the JSONata-based language of Evaluate blocks, against JSONinput, to try an expression before saving it.- Data lives in
~/.request-eagle, with collections incollectionsand flows inflows.--data-dirselects another location for all of it;--collections-dirandREQUEST_EAGLE_COLLECTIONS_DIRmove only the collections. collections.linkshows a folder outside the collections directory as a collection where it is, such as one in a project’s Git repository, andcollections.unlinkforgets it without touching its files. The folder must be empty or be a collection itself. Linked folders are listed in the data directory’slinked-collections.json, for this device only, andcollections.listmarks themlinked.entries.deletenever deletes a linked collection’s folder. A linked folder that is gone is left out until it is back or unlinked.