Rename the CLI binary from ascapi to asc
cargo install smbcloud-ascapi-cli now installs asc. The clap command name, the no-subcommand hint, and the command examples in the READMEs, CLAUDE.md and doc comments say asc as well. The MCP Registry name io.github.smbcloudXYZ/ascapi, the MCP server's own name, crate names and internal identifiers stay as they are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seto Elkahfi committed
Oct 9, 2026 at 09:04 UTC
585ea13195425fb8096dd70d5b457fe9dfb9e90d
10 files changed
+24
-26
CLAUDE.md
+6
-6
@@ -7,8 +7,8 @@ Guidance for Claude Code (and other agents) working in this repository.
7
`smbcloud-ascapi` is a Rust workspace wrapping the App Store Connect API. It
8
ships two front ends over one shared core:
9
10
-- the `ascapi` CLI (`crates/cli`), and
11
-- an MCP stdio server (`crates/mcp`, reachable via `ascapi --mcp`).
10
+- the `asc` CLI (`crates/cli`), and
11
+- an MCP stdio server (`crates/mcp`, reachable via `asc --mcp`).
12
13
Both go through `smbcloud-ascapi-frontend` so they can't drift. See `README.md`
14
for the full crate table.
@@ -40,21 +40,21 @@ All are subcommands of `apps` (clap kebab-cases the command names):
40
```sh
41
# GET /v1/builds?filter[app]={id} — newest first. Check processingState
42
# (VALID / INVALID / PROCESSING / FAILED).
43
-ascapi apps builds <APP_ID> \
43
+asc apps builds <APP_ID> \
44
[--version <BUILD_NUMBER>] \ # filter[version], e.g. 42
45
[--pre-release-version <MARKETING>] \ # filter[preReleaseVersion.version], e.g. 1.1.0
46
[--processing-state <STATE>] # filter[processingState]
47
48
# GET /v1/builds/{id} — a single build by its ASC id.
49
-ascapi apps build <BUILD_ID>
49
+asc apps build <BUILD_ID>
50
51
# GET /v1/preReleaseVersions?filter[app]={id} — the marketing version strings
52
# TestFlight groups builds under.
53
-ascapi apps pre-release-versions <APP_ID> [--platform <ios|mac-os|tv-os|vision-os>]
53
+asc apps pre-release-versions <APP_ID> [--platform <ios|mac-os|tv-os|vision-os>]
54
55
# xcrun altool --upload-package, authenticated with the same key id, issuer
56
# and .p8 (--p8-file-path) as every other command. --dry-run prints the argv.
57
-ascapi apps upload <PATH.ipa|PATH.pkg> [--wait]
57
+asc apps upload <PATH.ipa|PATH.pkg> [--wait]
58
```
59
60
The underlying API lives in `crates/aso/src/build.rs`: `BuildsApi` (in the
README.md
+1
-1
@@ -13,7 +13,7 @@ from the other:
13
| `smbcloud-ascapi-signing` | Code signing: certificates and provisioning profiles, plus local RSA key pair and CSR generation |
14
| `smbcloud-ascapi-frontend` | Operations both surfaces share, so the CLI and the MCP server agree by construction, plus the CLI's `xcrun altool` upload |
15
| `smbcloud-ascapi-mcp` | The MCP contract and stdio server |
16
-| `smbcloud-ascapi-cli` | The `ascapi` binary: clap command tree, plus `--mcp` |
16
+| `smbcloud-ascapi-cli` | The `asc` binary: clap command tree, plus `--mcp` |
17
18
`aso`, `pricing` and `signing` know nothing about each other, and neither knows
19
anything about the front ends. Each adds its calls to
crates/cli/Cargo.toml
+1
-1
@@ -9,7 +9,7 @@ description = "CLI and MCP server for App Store Connect: issue Apple signing cer
9
readme = "README.md"
10
11
[[bin]]
12
-name = "ascapi"
12
+name = "asc"
13
path = "src/main.rs"
14
15
[dependencies]
crates/cli/README.md
+7
-7
@@ -1,6 +1,6 @@
1
# App Store Connect Signing
2
3
-`ascapi` issues and inspects Apple signing certificates from the terminal
3
+`asc` issues and inspects Apple signing certificates from the terminal
4
or as an MCP server, without a trip to the developer portal. It also
5
covers App Store Connect's App Metadata surface: apps, app infos, app
6
store versions, bundle IDs, screenshots, and their localizations.
@@ -39,12 +39,12 @@ Reports, then request a report date and frequency:
39
export ASC_VENDOR_NUMBER=12345678
40
41
# Yesterday's paid-app and in-app purchase sales.
42
-ascapi sales-reports download \
42
+asc sales-reports download \
43
--frequency DAILY \
44
--report-date 2026-09-11
45
46
# Save a monthly report rather than printing it to stdout.
47
-ascapi sales-reports download \
47
+asc sales-reports download \
48
--frequency MONTHLY \
49
--report-date 2026-08 \
50
--output sales-2026-08.json
@@ -57,8 +57,8 @@ use `--version` where that layout requires a report format version.
57
## Signing certificates
58
59
```bash
60
-ascapi certificates list --type distribution
61
-ascapi certificates create --type mac-installer-distribution --out-dir ~/certs
60
+asc certificates list --type distribution
61
+asc certificates create --type mac-installer-distribution --out-dir ~/certs
62
```
63
64
`create` generates an RSA 2048 key pair locally, sends Apple only a
@@ -79,7 +79,7 @@ never saved.
79
## MCP server
80
81
```bash
82
-ascapi --mcp
82
+asc --mcp
83
```
84
85
Speaks MCP over stdio and exposes 28 tools: every operation the command
@@ -101,7 +101,7 @@ Two deliberate absences:
101
- **No revocation tool.** Revoking a signing certificate invalidates every
102
provisioning profile embedding it, for every teammate and every CI job,
103
at once and irreversibly. That is the one delete no confirmation string a
104
- model types on your behalf makes safe, so `ascapi certificates revoke`
104
+ model types on your behalf makes safe, so `asc certificates revoke`
105
stays on the command line, where a human is the one typing. A test fails
106
the build if it ever appears in the tool list.
107
- **No key material in tool results.** `certificate_create` returns the
crates/cli/src/main.rs
+2
-4
@@ -32,7 +32,7 @@ use std::path::PathBuf;
32
/// Add/update App Store Connect app metadata (apps, app infos, app store
33
/// versions, and their localizations) from the terminal or a script.
34
#[derive(Parser)]
35
-#[command(name = "ascapi", version, about)]
35
+#[command(name = "asc", version, about)]
36
struct Cli {
37
/// App Store Connect API key ID (Users and Access → Integrations → App
38
/// Store Connect API). Not required with `--mcp`, which resolves
@@ -787,9 +787,7 @@ async fn main() -> Result<()> {
787
let client = Client::new(api_key);
788
789
let Some(command) = cli.command else {
790
- anyhow::bail!(
791
- "no subcommand given; run `ascapi --help`, or `ascapi --mcp` for the MCP server"
792
- )
790
+ anyhow::bail!("no subcommand given; run `asc --help`, or `asc --mcp` for the MCP server")
791
};
792
793
match command {
crates/frontend/Cargo.toml
+1
-1
@@ -5,7 +5,7 @@ edition.workspace = true
5
authors.workspace = true
6
license.workspace = true
7
repository.workspace = true
8
-description = "Shared operations behind the ascapi command line and MCP surfaces: credential resolution, result shaping, certificate issuance, and altool uploads."
8
+description = "Shared operations behind the asc command line and MCP surfaces: credential resolution, result shaping, certificate issuance, and altool uploads."
9
10
[lib]
11
path = "src/lib.rs"
crates/frontend/src/lib.rs
+1
-1
@@ -1,4 +1,4 @@
1
-//! Operations shared by the `ascapi` command line and its MCP server.
1
+//! Operations shared by the `asc` command line and its MCP server.
2
//!
3
//! Both surfaces need the same things: resolve credentials, call the App
4
//! Store Connect client, and shape the result into something worth showing
crates/frontend/src/upload.rs
+1
-1
@@ -38,7 +38,7 @@ pub struct UploadOutcome {
38
pub exit_code: Option<i32>,
39
/// The delivery UUID altool reports for a successful upload, if its
40
/// output carried one. It is also the build's App Store Connect id, so
41
- /// `ascapi apps build <delivery_id>` reads the build back.
41
+ /// `asc apps build <delivery_id>` reads the build back.
42
pub delivery_id: Option<String>,
43
/// altool's `--output-format json` body when it parsed (an array of
44
/// both documents with `--wait`), otherwise its stdout as a string.
crates/mcp/src/lib.rs
+2
-2
@@ -1,6 +1,6 @@
1
//! App Store Connect MCP contract.
2
//!
3
-//! Defines the canonical tool set exposed by `ascapi --mcp`. Each name is
3
+//! Defines the canonical tool set exposed by `asc --mcp`. Each name is
4
//! supplied by the embedder through [`crate::ascapi_mcp_tools`], so the
5
//! standalone binary and any host that re-exposes this contract share one
6
//! implementation and one public surface. Same arrangement `xcrs` uses in
@@ -20,7 +20,7 @@
20
//!
21
//! # What is deliberately absent
22
//!
23
-//! Certificate revocation. `ascapi certificates revoke` exists on the
23
+//! Certificate revocation. `asc certificates revoke` exists on the
24
//! command line and is intentionally not a tool: revoking a distribution
25
//! certificate invalidates every provisioning profile embedding it, for
26
//! every teammate and every CI job, at once and irreversibly. That is not
crates/mcp/src/server.rs
+2
-2
@@ -1,4 +1,4 @@
1
-//! The `ascapi --mcp` server.
1
+//! The `asc --mcp` server.
2
//!
3
//! Holds no state: every tool resolves its App Store Connect credentials
4
//! from the environment per call, so an unconfigured server still starts
@@ -76,7 +76,7 @@ impl ServerHandler for AscapiMcpServer {
76
makes its certificate permanently unusable. Revocation is deliberately not \
77
offered here, because revoking a distribution certificate invalidates every \
78
provisioning profile embedding it for the whole team at once; run \
79
- `ascapi certificates revoke` from a terminal instead. Requires ASC_API_KEY, \
79
+ `asc certificates revoke` from a terminal instead. Requires ASC_API_KEY, \
80
ASC_ISSUER_ID, and a readable .p8 key.",
81
)
82
}