DEV Community

Monde kim
Monde kim

Posted on

From curl to agent-ready API package: FirstCall CLI walkthrough (real output)

When you hand an AI agent a raw curl command with an API key baked in, you're trusting it - and every tool it calls - to never log, retry, or forward that secret. That trust is hard to audit.

FirstCall is a local-first Rust workbench that turns verified API calls into redacted agent packages. Secret values are stripped before export. A 112-check validator runs before any agent can import the package. HTTP actually executes locally before a recipe is promoted - no "trust me it works."

Here is the full CLI lifecycle, run live against the v0.1.0 release binary.


CLI lifecycle demo

FirstCall CLI lifecycle


Step 1 - version

$ firstcall-cli version
firstcall-cli 0.1.0
Enter fullscreen mode Exit fullscreen mode

Step 2 - package a verified recipe

$ firstcall-cli package \
    --recipe-json fixtures/verified-agent-recipe.json \
    --out ./tmp/demo-pkg

Exported agent package to ./tmp/demo-pkg
Enter fullscreen mode Exit fullscreen mode

Step 3 - validate (112 checks)

$ firstcall-cli validate-package --dir ./tmp/demo-pkg

Package: ./tmp/demo-pkg
Status: valid
Checks passed: 112
Warnings: 0
Errors: 0
MCP compile smoke: not_requested
Enter fullscreen mode Exit fullscreen mode

112 checks cover manifest integrity, redaction invariants, slot/auth consistency, and import-readiness flags.

Step 4 - inspect before import

$ firstcall-cli inspect-package --dir ./tmp/demo-pkg

Validation status: valid
Import readiness: ready
Requires local re-verification: yes
Raw secrets imported: no
Validation checks passed: 112
Validation errors: 0
Enter fullscreen mode Exit fullscreen mode

Requires local re-verification: yes is set automatically on every import. A recipe cannot be re-exported without running local HTTP verification first.

Step 5 - import and list

$ firstcall-cli import-package --dir ./tmp/demo-pkg

Import status: imported
Imported recipe id: 1
Recipe: example_update_user
Method: POST
URL template: https://api.example.com/users/${user_id}?api_key=${FIRSTCALL_API_KEY}
Requires local re-verification: yes
Secrets imported: no
App storage modified: yes

$ firstcall-cli recipe-list

Recipes: 1
- ID: 1
  Recipe: example_update_user
  Method: POST
  Auth style: bearer
  Requires local re-verification: yes
Enter fullscreen mode Exit fullscreen mode

The URL template shows named slots (${user_id}, ${FIRSTCALL_API_KEY}) - actual values are never stored in the package.


Live HTTP verify - GitHub API (real request)

$ FIRSTCALL_BEARER_TOKEN=$GITHUB_TOKEN \
    firstcall-cli verify --recipe-json fixtures/github-user-recipe.json

Recipe: GitHub Authenticated User
Method: GET
URL template: https://api.github.com/user
HTTP status: 200
Outcome: success
Blocker: none
Updated verification time: 2026-05-15T01:46:16Z
Enter fullscreen mode Exit fullscreen mode

HTTP 200, real GitHub endpoint, token never written to output.


Desktop GUI workbench

The same trust chain runs in the desktop GUI: paste a curl command or OpenAPI spec, review the parsed candidate, fill runtime slots and auth, execute locally, review the attempt, promote to recipe.

FirstCall desktop GUI workbench


Install

Download a binary for your OS from GitHub Releases - includes both firstcall (GUI) and firstcall-cli.

Or build from source:

cargo build --locked
Enter fullscreen mode Exit fullscreen mode

CLI-only (no GUI dependencies):

cargo build --locked --bin firstcall-cli --no-default-features
Enter fullscreen mode Exit fullscreen mode

What it accepts

curl, OpenAPI (local JSON/YAML), Postman Collection, HAR, .http/.rest, Hurl, Bruno/OpenCollection. GraphQL-over-HTTP is detected from JSON bodies.

Remote OpenAPI $ref and multipart file uploads are not supported in v0.1.


Top comments (0)