@salesforce/b2c-dx-mcp 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/content/guidance/b2c-cli/b2c-config/SKILL.md +18 -1
  2. package/content/guidance/b2c-cli/b2c-job/SKILL.md +2 -0
  3. package/content/guidance/b2c-cli/b2c-job/references/EXPORT.md +9 -3
  4. package/content/guidance/b2c-cli/b2c-job/references/IMPORT.md +12 -0
  5. package/content/guidance/b2c-cli/b2c-mrt/SKILL.md +5 -4
  6. package/content/guidance/b2c-cli/b2c-mrt/references/BUNDLE-COMMANDS.md +21 -3
  7. package/content/guidance/b2c-cli/b2c-mrt/references/ENVIRONMENT-COMMANDS.md +23 -0
  8. package/content/guidance/b2c-cli/b2c-webdav/SKILL.md +17 -0
  9. package/content/guidance/index.json +18 -18
  10. package/content/guidance/mcp/scapi/SKILL.md +46 -14
  11. package/dist/commands/mcp.d.ts +1 -0
  12. package/dist/commands/mcp.js +7 -0
  13. package/dist/guidance.js +0 -2
  14. package/dist/registry.js +1 -1
  15. package/dist/server-context.d.ts +2 -0
  16. package/dist/server-context.js +4 -0
  17. package/dist/server.d.ts +2 -4
  18. package/dist/server.js +16 -3
  19. package/dist/tools/scapi/execution-registry.d.ts +62 -0
  20. package/dist/tools/scapi/execution-registry.js +303 -0
  21. package/dist/tools/scapi/index.d.ts +2 -1
  22. package/dist/tools/scapi/index.js +2 -2
  23. package/dist/tools/scapi/scapi-code.d.ts +2 -1
  24. package/dist/tools/scapi/scapi-code.js +71 -34
  25. package/dist/utils/types.d.ts +10 -3
  26. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CLhGwQTn.d.mts +2 -1
  27. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-dBHMsxwf.d.cts +2 -1
  28. package/node_modules/@modelcontextprotocol/server/dist/mcp-D7GmuPnv.cjs +1 -1
  29. package/node_modules/@modelcontextprotocol/server/dist/mcp-DXXb3Vv3.mjs +1 -1
  30. package/node_modules/@modelcontextprotocol/server/dist/src-CX2iR2pK.mjs +2 -0
  31. package/node_modules/@modelcontextprotocol/server/dist/src-STyD_Vvf.cjs +2 -0
  32. package/node_modules/@salesforce/b2c-agent-plugins/CHANGELOG.md +22 -0
  33. package/node_modules/@salesforce/b2c-agent-plugins/README.md +4 -2
  34. package/node_modules/@salesforce/b2c-agent-plugins/b2c/.codex-plugin/plugin.json +1 -1
  35. package/node_modules/@salesforce/b2c-agent-plugins/b2c/plugin.json +1 -1
  36. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/.codex-plugin/plugin.json +1 -1
  37. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/plugin.json +1 -1
  38. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-config/SKILL.md +18 -1
  39. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/SKILL.md +2 -0
  40. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/EXPORT.md +9 -3
  41. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/IMPORT.md +12 -0
  42. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/SKILL.md +5 -4
  43. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/references/BUNDLE-COMMANDS.md +21 -3
  44. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/references/ENVIRONMENT-COMMANDS.md +23 -0
  45. package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-webdav/SKILL.md +17 -0
  46. package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/.codex-plugin/plugin.json +1 -1
  47. package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/plugin.json +1 -1
  48. package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/.codex-plugin/plugin.json +41 -0
  49. package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/README.md +35 -0
  50. package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/assets/logo.svg +31 -0
  51. package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/plugin.json +45 -0
  52. package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/skills/using-b2c-tooling-sdk/SKILL.md +226 -0
  53. package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/skills/using-b2c-tooling-sdk/references/api-catalog.md +154 -0
  54. package/node_modules/@salesforce/b2c-agent-plugins/package.json +1 -1
  55. package/node_modules/@salesforce/b2c-agent-plugins/plugins.json +3 -0
  56. package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/.codex-plugin/plugin.json +1 -1
  57. package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/plugin.json +1 -1
  58. package/oclif.manifest.json +8 -1
  59. package/package.json +3 -3
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
+ "name": "b2c-python-sdk",
4
+ "version": "0.1.0",
5
+ "description": "Consuming the salesforce-b2c-tooling-sdk Python SDK — authenticate to B2C Commerce, resolve dw.json config, and call OCAPI/SCAPI/WebDAV clients and operations from scripts or notebooks.",
6
+ "author": {
7
+ "name": "Salesforce"
8
+ },
9
+ "homepage": "https://salesforcecommercecloud.github.io/b2c-developer-tooling/",
10
+ "repository": "https://github.com/SalesforceCommerceCloud/b2c-developer-tooling",
11
+ "license": "Apache-2.0",
12
+ "keywords": [
13
+ "salesforce",
14
+ "b2c-commerce",
15
+ "commerce-cloud",
16
+ "python",
17
+ "sdk",
18
+ "scapi",
19
+ "ocapi"
20
+ ],
21
+ "extensions": {
22
+ "com.openai": {
23
+ "interface": {
24
+ "displayName": "B2C Python SDK",
25
+ "shortDescription": "Use the Salesforce B2C Commerce Python tooling SDK from your AI assistant.",
26
+ "longDescription": "Skills for consuming the salesforce-b2c-tooling-sdk Python SDK from scripts and Jupyter notebooks — install and import it, choose an authentication mechanism, resolve config from dw.json, and call the OCAPI/SCAPI/WebDAV clients and higher-level operations (code deploy, jobs, sites, catalogs, sandboxes, metrics, logs, SLAS shopper tokens).",
27
+ "developerName": "Salesforce",
28
+ "category": "Productivity",
29
+ "capabilities": [
30
+ "Read"
31
+ ],
32
+ "logo": "./assets/logo.svg",
33
+ "composerIcon": "./assets/logo.svg",
34
+ "brandColor": "#0D9DDA",
35
+ "websiteURL": "https://salesforcecommercecloud.github.io/b2c-developer-tooling/",
36
+ "defaultPrompt": [
37
+ "Write a Python script that deploys the cartridges in ./cartridges using the B2C tooling SDK",
38
+ "Use the Python SDK to authenticate from my dw.json and run a job",
39
+ "Show me how to mint a SLAS guest shopper token with the Python SDK",
40
+ "Read the latest error logs from my instance with the Python tooling SDK"
41
+ ]
42
+ }
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,226 @@
1
+ ---
2
+ name: using-b2c-tooling-sdk
3
+ description: Consuming the salesforce-b2c-tooling-sdk Python SDK from scripts or Jupyter notebooks — installation, choosing an authentication mechanism, and the available OCAPI/SCAPI/WebDAV clients and operations. Use when writing Python (or notebook) code that authenticates to a B2C Commerce instance, resolves config from dw.json, deploys code, runs jobs, reads sites/catalogs/logs/metrics, provisions sandboxes, or mints SLAS shopper tokens.
4
+ ---
5
+
6
+ # Using the B2C Tooling SDK (Python)
7
+
8
+ `salesforce-b2c-tooling-sdk` is the Python SDK for Salesforce B2C Commerce
9
+ tooling. **Import name is `b2c_tooling_sdk`; distribution name is
10
+ `salesforce-b2c-tooling-sdk`.** It is async-first with a complete synchronous
11
+ facade. Python 3.10+.
12
+
13
+ This skill covers **consuming** the SDK. For developing the SDK itself, see
14
+ `python/b2c-tooling-sdk/CLAUDE.md`. For the full symbol catalog, read
15
+ [references/api-catalog.md](references/api-catalog.md).
16
+
17
+ ## 1. Install
18
+
19
+ Not on PyPI yet — install from git during development:
20
+
21
+ ```bash
22
+ pip install "git+https://github.com/SalesforceCommerceCloud/b2c-developer-tooling.git@main#subdirectory=python/b2c-tooling-sdk"
23
+ # or pin a release tag: ...@<tag>#subdirectory=python/b2c-tooling-sdk
24
+ ```
25
+
26
+ For notebooks also install a kernel: `pip install ipykernel`. Once published this
27
+ becomes `pip install salesforce-b2c-tooling-sdk`.
28
+
29
+ ## 2. Async vs. sync — pick the import root
30
+
31
+ The two surfaces are identical **except one word**: sync drops `await`.
32
+
33
+ | Context | Import from | Style |
34
+ | --- | --- | --- |
35
+ | Scripts / notebooks / REPL | `b2c_tooling_sdk.sync` | blocking, no `await` |
36
+ | Inside an existing event loop (web server, async app) | `b2c_tooling_sdk` | `await` |
37
+
38
+ **Notebooks: use the sync facade** — it is the frictionless path (no
39
+ `asyncio.run`, no `await`). All sync calls run on one shared background loop, so
40
+ token caching still works.
41
+
42
+ ```python
43
+ # Notebook / script (sync)
44
+ from b2c_tooling_sdk.sync import resolve_config
45
+ from b2c_tooling_sdk.sync import list_code_versions
46
+
47
+ config = resolve_config() # blocks
48
+ instance = config.create_b2c_instance()
49
+ for v in list_code_versions(instance):
50
+ print(v.id, "active" if v.active else "")
51
+ ```
52
+
53
+ ```python
54
+ # Async
55
+ import asyncio
56
+ from b2c_tooling_sdk import resolve_config
57
+ from b2c_tooling_sdk.operations.code import list_code_versions
58
+
59
+ async def main() -> None:
60
+ config = await resolve_config()
61
+ instance = config.create_b2c_instance()
62
+ for v in await list_code_versions(instance):
63
+ print(v.id)
64
+
65
+ asyncio.run(main())
66
+ ```
67
+
68
+ > **Never call the sync facade from inside a running event loop** (including
69
+ > async notebook cells / `await`-ing cells) — it waits on a background loop and
70
+ > can deadlock. In async code, import from `b2c_tooling_sdk` and `await`.
71
+ >
72
+ > **Streaming APIs (`tail_logs`, cartridge watching) are async-only** — not in
73
+ > the sync facade. Use the async API for those.
74
+
75
+ The examples below use the **async** form. For sync, import the same names from
76
+ `b2c_tooling_sdk.sync` and drop `await`.
77
+
78
+ ## 3. Authenticate — choose by use case
79
+
80
+ Credentials usually come from a `dw.json` via `resolve_config()` (see §4). If you
81
+ already have a `dw.json`, **prefer `resolve_config` + `create_b2c_instance()`** —
82
+ it selects the auth mechanism for you. Reach for an explicit strategy only when
83
+ you have no config file or need a specific flow.
84
+
85
+ | Use case | Mechanism | How |
86
+ | --- | --- | --- |
87
+ | Server-to-server automation (CI, scripts) | OAuth **client-credentials** | `OAuthStrategy(OAuthConfig(client_id, client_secret, scopes))` |
88
+ | Server-to-server with a cert instead of a secret | **JWT Bearer** | `JwtOAuthStrategy(JwtOAuthConfig(client_id, cert_path, key_path, ...))` |
89
+ | Interactive user login (opens a browser) | **PKCE** (+ implicit fallback) | `create_user_auth_strategy(PkceOAuthConfig(client_id=..., account_manager_host=...))` |
90
+ | Reuse a session created by `b2c auth login` | shared session store | `resolve_config()` picks it up automatically; or `find_auth_session(client_id)` |
91
+ | WebDAV / OCAPI Basic auth | **Basic** | `BasicAuthStrategy(username, password)` |
92
+ | Static API key header | **API key** | `ApiKeyStrategy("my-key")` |
93
+ | Storefront **shopper** tokens (guest/registered) | **SLAS** | `b2c_tooling_sdk.slas.get_guest_token(...)` — see §6 |
94
+
95
+ ```python
96
+ from b2c_tooling_sdk.auth import OAuthStrategy, OAuthConfig
97
+
98
+ auth = OAuthStrategy(OAuthConfig(
99
+ client_id="...", client_secret="...", scopes=["sfcc.products"],
100
+ ))
101
+ ```
102
+
103
+ **CLI interoperability:** the SDK shares the *same* on-disk `auth-sessions.json`
104
+ and config files as the `@salesforce/b2c-cli`. Recommended interactive workflow:
105
+ run `b2c auth login <clientId>` once, then run non-interactive Python — it reuses
106
+ the session with no browser prompt. `find_auth_session`,
107
+ `is_auth_session_token_valid`, and `list_auth_sessions` inspect the store.
108
+
109
+ Don't know which methods a credential bundle supports? Use
110
+ `resolve_auth_strategy(AuthCredentials(...), allowed_methods=[...])` to pick the
111
+ best available, or `check_available_auth_methods(...)` to probe without side
112
+ effects.
113
+
114
+ ## 4. Resolve config from `dw.json`
115
+
116
+ `resolve_config()` merges the same sources the CLI reads (`dw.json` walking up
117
+ from cwd, `~/.mobify`, `package.json`, `settings.json`) into a resolved config
118
+ whose `.create_b2c_instance()` builds an authenticated `B2CInstance`.
119
+
120
+ ```python
121
+ from b2c_tooling_sdk import resolve_config, NormalizedConfig
122
+
123
+ config = await resolve_config() # from dw.json etc.
124
+ instance = config.create_b2c_instance()
125
+
126
+ # ...or pass explicit overrides instead of a file:
127
+ config = await resolve_config(NormalizedConfig(
128
+ hostname="example.demandware.net",
129
+ client_id="...", client_secret="...", scopes=["sfcc.products"],
130
+ ))
131
+ ```
132
+
133
+ Multi-environment `dw.json` (a `configs` array of named envs): select one with
134
+ `resolve_config(options=ResolveConfigOptions(instance="staging"))` (priority:
135
+ requested name → `active: true` → root). Manage entries with `add_instance` /
136
+ `remove_instance` / `set_active_instance` from `b2c_tooling_sdk.config`.
137
+
138
+ ## 5. Call the APIs — two layers
139
+
140
+ **Choose the layer by how you want errors handled:**
141
+
142
+ - **Operations** (`b2c_tooling_sdk.operations.*`, common ones re-exported at top
143
+ level) — task-oriented, **success-or-raise**. Straight-line code; failures
144
+ raise typed exceptions (`JobExecutionError`, sandbox polling errors, ...).
145
+ **Prefer this for most work.**
146
+ - **Clients** (`instance.ocapi`, `instance.webdav`, SCAPI `create_*_client`) —
147
+ low-level. Every call returns a `ClientResult(data, error, response)` and
148
+ **never raises on 4xx/5xx** (only a genuine network failure raises
149
+ `NetworkError`). Use when you want to inspect status codes yourself.
150
+
151
+ ```python
152
+ # Operation (raises on failure)
153
+ from b2c_tooling_sdk.operations.jobs import execute_job, wait_for_job
154
+ execution = await execute_job(instance, "MyJob")
155
+ finished = await wait_for_job(instance, "MyJob", execution.id) # raises JobExecutionError on failure
156
+
157
+ # Client (never raises on HTTP status)
158
+ result = await instance.ocapi.get("/sites")
159
+ if result.error is not None:
160
+ print("failed:", result.response.status_code, result.error)
161
+ else:
162
+ for site in result.data.get("data", []):
163
+ print(site["id"])
164
+ ```
165
+
166
+ **What's available** (full lists in [references/api-catalog.md](references/api-catalog.md)):
167
+
168
+ - **Code** — `find_and_deploy_cartridges`, `list_code_versions`,
169
+ `create_code_version`, `activate_code_version`. Deploy needs
170
+ `instance.config.code_version` set.
171
+ - **Jobs** — `execute_job`, `wait_for_job`, `site_archive_import`,
172
+ `site_archive_export_to_path` (+ `scapi_*` native variants).
173
+ - **Sites** — `get_cartridge_path`, `add_cartridge`.
174
+ - **Catalogs / BM users / BM roles** — dual-backend (SCAPI→OCAPI) façades:
175
+ `create_catalogs_backend`, `create_users_backend`, `create_roles_backend`.
176
+ - **ODS (sandboxes)** — `create_ods_client` + `wait_for_sandbox`.
177
+ - **Metrics** — `create_metrics_client` + `get_overall_metrics`,
178
+ `get_sales_metrics`, `get_scapi_metrics`, ...
179
+ - **Logs** — `list_log_files`, `get_recent_logs`; `tail_logs` (async-only).
180
+ - **Account Manager** — `create_user`, `grant_role`, `list_orgs`, ...
181
+ - **Raw HTTP** — `instance.ocapi` (OCAPI Data API), `instance.webdav`
182
+ (`put`/`get`/`delete`/`propfind`).
183
+
184
+ **SCAPI Admin clients** need system auth (client-credentials or JWT) **and** a
185
+ `short_code` + `tenant_id`. Get the coordinates from `instance.scapi_client_config`
186
+ (it's `None` when the instance can't do SCAPI):
187
+
188
+ ```python
189
+ from b2c_tooling_sdk.clients import create_metrics_client, MetricsClientConfig
190
+
191
+ scapi = instance.scapi_client_config
192
+ if scapi is not None:
193
+ metrics = create_metrics_client(
194
+ MetricsClientConfig(short_code=scapi.short_code, tenant_id=scapi.tenant_id),
195
+ scapi.auth,
196
+ )
197
+ ```
198
+
199
+ ## 6. SLAS shopper tokens (storefront)
200
+
201
+ For **shopper**-facing storefront tokens (not admin/tooling). Subpath import only
202
+ — not in the top-level barrel:
203
+
204
+ ```python
205
+ from b2c_tooling_sdk.slas import get_guest_token, SlasTokenConfig
206
+
207
+ token = await get_guest_token(SlasTokenConfig(
208
+ short_code="abcd1234", organization_id="f_ecom_zzte_053",
209
+ slas_client_id="...", site_id="RefArch",
210
+ redirect_uri="http://localhost:3000/callback",
211
+ # slas_client_secret="..." # omit for a public PKCE client
212
+ ))
213
+ print(token.access_token) # shopper JWT
214
+ ```
215
+
216
+ `get_registered_token(SlasRegisteredLoginConfig(...))` for logged-in customers.
217
+ Blocking twins are in `b2c_tooling_sdk.sync`. The tooling SDK has **no** dedicated
218
+ storefront client — after minting the token, call Shopper endpoints with plain
219
+ `httpx` using `token.access_token` as a bearer.
220
+
221
+ ## Runnable examples
222
+
223
+ `python/samples/` has runnable scripts (`code/*_async.py` + `*_sync.py`) and
224
+ notebooks (`notebook/*.ipynb`) for each scenario above (oauth_ocapi, oauth_scapi,
225
+ basic_webdav, cli_session, browser_login, slas_shopper, multi_env). Point users
226
+ there; copy `dw.example.json` → `dw.json` and fill in credentials.
@@ -0,0 +1,154 @@
1
+ # B2C Tooling SDK — symbol catalog
2
+
3
+ The full public surface of `b2c_tooling_sdk`, grouped by subsystem. Everything
4
+ listed under "top-level barrel" is importable directly from `b2c_tooling_sdk`
5
+ (async) and, unless noted, has a blocking twin in `b2c_tooling_sdk.sync` with an
6
+ identical signature minus `await`. Submodule-only APIs (SLAS, `operations.sites`,
7
+ log streaming) must be imported from their submodule and are called out below.
8
+
9
+ Async source is the truth; for sync, import the same name from
10
+ `b2c_tooling_sdk.sync` and drop `await`. See the SKILL for the async/sync rules
11
+ and the operations-vs-clients error contract.
12
+
13
+ ## Auth (`b2c_tooling_sdk.auth`)
14
+
15
+ Strategies: `OAuthStrategy`, `JwtOAuthStrategy`, `PkceOAuthStrategy`,
16
+ `ImplicitOAuthStrategy`, `BasicAuthStrategy`, `ApiKeyStrategy`.
17
+ Base/protocol: `AuthStrategy`, `AuthConfig`, `AuthCredentials`, `AuthMethod`,
18
+ `ALL_AUTH_METHODS`, `AccessTokenResponse`, `DecodedJWT`.
19
+ Helpers: `resolve_auth_strategy`, `check_available_auth_methods`, `decode_jwt`.
20
+
21
+ Session store (from `b2c_tooling_sdk.auth`, shared byte-for-byte with the CLI's
22
+ `auth-sessions.json`): `find_auth_session`, `is_auth_session_token_valid`,
23
+ `list_auth_sessions`. Interactive user-login helper: `create_user_auth_strategy`.
24
+
25
+ ## Config (`b2c_tooling_sdk.config`)
26
+
27
+ `resolve_config`, `create_config_resolver`, `ConfigResolver`,
28
+ `create_instance_from_config`, `find_dw_json`, `load_dw_json`.
29
+ Types/options: `NormalizedConfig`, `ResolvedB2CConfig`, `ResolveConfigOptions`,
30
+ `CreateB2CInstanceOptions`, `CreateOAuthOptions`, `ConfigSource`,
31
+ `ConfigSourceInfo`, `ConfigWarning`.
32
+ Multi-env `dw.json` management (from `b2c_tooling_sdk.config`): `add_instance`,
33
+ `remove_instance`, `set_active_instance`.
34
+
35
+ ## Instance (`b2c_tooling_sdk.instance`)
36
+
37
+ `B2CInstance`, `B2CInstanceOptions`, `InstanceConfig`, `ScapiClientConfig`.
38
+ `B2CInstance` exposes lazy typed clients: `.ocapi` (OCAPI Data API), `.webdav`,
39
+ and `.scapi_client_config` (`ScapiClientConfig | None` — `None` when the instance
40
+ can't do SCAPI; carries `short_code`, `tenant_id`, `auth`).
41
+
42
+ ## Clients (`b2c_tooling_sdk.clients`)
43
+
44
+ Low-level, **openapi-fetch semantics**: every call returns
45
+ `ClientResult(data, error, response)` and never raises on 4xx/5xx (only a real
46
+ network failure raises `NetworkError`).
47
+
48
+ Factories: `create_ocapi_client`, `create_metrics_client`, `create_ods_client`,
49
+ `create_custom_apis_client`, `create_preferences_client`, `create_cdn_zones_client`,
50
+ `create_granular_replications_client`, `create_slas_client`,
51
+ `create_account_manager_users_client`, `create_account_manager_roles_client`,
52
+ `create_account_manager_orgs_client`, `create_account_manager_api_clients_client`.
53
+ Client classes: `OcapiClient`, `WebDavClient`, `MetricsClient`, `OdsClient`,
54
+ `CustomApisClient`, `PreferencesClient`, `CdnZonesClient`,
55
+ `GranularReplicationsClient`, `SlasClient`, `AccountManager*Client`.
56
+ Configs: `MetricsClientConfig`, `OdsClientConfig`, `CustomApisClientConfig`,
57
+ `PreferencesClientConfig`, `CdnZonesClientConfig`,
58
+ `GranularReplicationsClientConfig`, `SlasClientConfig`,
59
+ `AccountManagerClientConfig`.
60
+ Middleware: `create_auth_middleware`, `create_extra_params_middleware`.
61
+ Errors/helpers: `OcapiDeprecatedError`, `get_api_error_message`,
62
+ `throw_ocapi_error`, `is_ocapi_deprecated_fault`, `ocapi_deprecated_message`.
63
+ Scope/tenant helpers: `to_organization_id`, `normalize_tenant_id`,
64
+ `build_tenant_scope`, `resolve_to_internal_role`, `resolve_from_internal_role`,
65
+ `fetch_role_mapping`, `is_valid_role_tenant_filter`.
66
+ Scope constants: `METRICS_DEFAULT_SCOPES`, `CUSTOM_APIS_DEFAULT_SCOPES`,
67
+ `PREFERENCES_READ_SCOPES`, `PREFERENCES_RW_SCOPES`, `CDN_ZONES_READ_SCOPES`,
68
+ `CDN_ZONES_RW_SCOPES`.
69
+ `WebDavClient`: `put`, `get`, `delete`, `propfind` (`PropfindEntry`).
70
+
71
+ ## Operations (task-oriented, **success-or-raise**)
72
+
73
+ ### Code (`operations.code`)
74
+ `find_and_deploy_cartridges`, `find_cartridges`, `upload_cartridges`,
75
+ `delete_cartridges`, `watch_cartridges` (`WatchOptions`/`WatchResult`),
76
+ `list_code_versions`, `get_active_code_version`, `create_code_version`,
77
+ `activate_code_version`, `reload_code_version`, `delete_code_version`.
78
+ Backend factory: `create_scripts_backend` (`ScriptsBackend`,
79
+ `Ocapi`/`ScapiScriptsBackend`). Types: `DeployOptions`, `DeployResult`,
80
+ `FindCartridgesOptions`, `CartridgeMapping`, `CodeVersion`, `CodeVersionInfo`,
81
+ `CodeVersionResult`, `CodeVersionActivationResult`.
82
+ Deploy requires `instance.config.code_version` set.
83
+
84
+ ### Jobs (`operations.jobs`)
85
+ `execute_job`, `wait_for_job`, `wait_for_job_execution`, `get_job_execution`,
86
+ `get_job_log`, `search_job_executions`, `find_running_job_execution`,
87
+ `get_job_error_message`. Site archive: `site_archive_import`,
88
+ `site_archive_export`, `site_archive_export_to_path`. Native SCAPI variants:
89
+ `scapi_execute_job`, `scapi_get_job_execution`, `scapi_get_job_log`,
90
+ `scapi_search_job_executions`, `scapi_delete_job_execution`.
91
+ Errors: `JobExecutionError`, `CanonicalJobExecutionError`. Types:
92
+ `JobExecution`, `JobExecutionStatus`, `JobStepExecution`, `ExecuteJobOptions`,
93
+ `WaitForJobOptions`, `SiteArchive{Import,Export}Options`/`Result`, plus the
94
+ `Export*Configuration` structures.
95
+
96
+ ### Sites (`operations.sites` — submodule import only)
97
+ `get_cartridge_path`, `set_cartridge_path`, `add_cartridge`, `remove_cartridge`,
98
+ `create_sites_backend`. Types: `SiteInfo`, `SitesBackend`, `CartridgePathResult`,
99
+ `CartridgePosition`, `AddCartridgeOptions`, `ListSitesOptions`, `BM_SITE_ID`.
100
+
101
+ ### Catalogs (`operations.catalogs`)
102
+ `create_catalogs_backend` (dual-backend SCAPI→OCAPI). Types: `CatalogInfo`,
103
+ `CatalogsBackend`, `ListCatalogsOptions`, `Ocapi`/`ScapiCatalogsBackend`.
104
+
105
+ ### BM users / BM roles (`operations.bm_users`, `operations.bm_roles`)
106
+ `create_users_backend`, `create_roles_backend` (dual-backend). Types:
107
+ `UserInfo`/`RoleInfo`, `CreateUserInput`/`CreateRoleInput`,
108
+ `UpdateUserChanges`, `ListUsersOptions`, `SearchUsersOptions`, backends and
109
+ their configs.
110
+
111
+ ### ODS / sandboxes (`operations.ods`)
112
+ `wait_for_sandbox`, `wait_for_clone`, `wait_for_clones`, `build_sandbox_settings`,
113
+ `resolve_sandbox_id`, `parse_friendly_sandbox_id`, `is_friendly_sandbox_id`,
114
+ `is_uuid`. Pair with `create_ods_client`. States: `SandboxState`, `CloneState`.
115
+ Errors: `SandboxNotFoundError`, `SandboxPollingError`,
116
+ `SandboxPollingTimeoutError`, `SandboxTerminalStateError`, `CloneFailedError`,
117
+ `ClonePollingError`/`TimeoutError`, `CloneBatch*Error`.
118
+
119
+ ### Metrics (`operations.metrics`)
120
+ `get_overall_metrics`, `get_sales_metrics`, `get_scapi_metrics`,
121
+ `get_scapi_hooks_metrics`, `get_ocapi_metrics`, `get_controller_metrics`,
122
+ `get_ecdn_metrics`, `get_mrt_metrics`, `get_third_party_metrics`,
123
+ `get_metrics_by_category`. Pair with `create_metrics_client`. Window helpers:
124
+ `resolve_metrics_window`, `parse_metrics_bound`, `parse_series_tags`,
125
+ `enrich_metrics_tags`. Constants: `METRIC_CATEGORIES`,
126
+ `METRICS_DEFAULT_WINDOW_MS`, `METRICS_RETENTION_MS`.
127
+
128
+ ### Logs (`operations.logs`)
129
+ `list_log_files`, `get_recent_logs`. **`tail_logs` is async-only** (streaming;
130
+ not in `b2c_tooling_sdk.sync`) — import from `operations.logs` and use the async
131
+ API. Filters/parsers: `filter_by_level`, `filter_by_search`, `filter_by_since`,
132
+ `parse_log_entry`, `aggregate_log_entries`, `create_path_normalizer`. Types:
133
+ `LogEntry`, `LogFile`, `TailLogsOptions`, `TailLogsCallbacks`, `TailLogsResult`.
134
+
135
+ ### Account Manager (`operations.users`, `operations.roles`, `operations.orgs`)
136
+ Users: `create_user`, `get_user`, `get_user_by_login`, `update_user`,
137
+ `delete_user`, `purge_user`, `reset_user`, `grant_role`, `revoke_role`,
138
+ `list_users`. Roles: `list_roles`, `get_role`. Orgs: `list_orgs`, `get_org`,
139
+ `get_org_by_name`.
140
+
141
+ ## SLAS shopper tokens (`b2c_tooling_sdk.slas` — submodule import only)
142
+
143
+ Not in the top-level barrel; blocking twins live in `b2c_tooling_sdk.sync`.
144
+ `get_guest_token`, `get_registered_token`, `generate_code_verifier`,
145
+ `generate_code_challenge`. Types: `SlasTokenConfig`, `SlasTokenResponse`,
146
+ `SlasRegisteredLoginConfig`.
147
+ The tooling SDK has no dedicated storefront client — after minting a token, call
148
+ Shopper endpoints with plain `httpx` using `token.access_token` as a bearer.
149
+
150
+ ## Version / defaults / logging (top-level)
151
+
152
+ `SDK_NAME`, `SDK_VERSION`, `SDK_USER_AGENT`; `DEFAULT_ACCOUNT_MANAGER_HOST`,
153
+ `DEFAULT_ODS_HOST`, `DEFAULT_PUBLIC_CLIENT_ID`, `get_default_public_client_id`;
154
+ `get_logger`, `configure_logger`.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/b2c-agent-plugins",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "description": "B2C Commerce agent skills plugins for development and operations. Private — distributed via GitHub release zips.",
5
5
  "private": true
6
6
  }
@@ -18,6 +18,9 @@
18
18
  },
19
19
  {
20
20
  "name": "figma-to-sfnext-pagedesigner"
21
+ },
22
+ {
23
+ "name": "b2c-python-sdk"
21
24
  }
22
25
  ]
23
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "storefront-next",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "description": "Storefront Next development skills for building React 19 storefronts on Salesforce B2C Commerce.",
5
5
  "author": {
6
6
  "name": "Salesforce"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "storefront-next",
4
- "version": "1.9.0",
4
+ "version": "1.10.0",
5
5
  "description": "Storefront Next development skills for building React 19 storefronts on Salesforce B2C Commerce.",
6
6
  "author": {
7
7
  "name": "Salesforce"
@@ -420,6 +420,13 @@
420
420
  ],
421
421
  "type": "option"
422
422
  },
423
+ "allow-non-ga-tools": {
424
+ "description": "Deprecated compatibility flag; has no effect",
425
+ "hidden": true,
426
+ "name": "allow-non-ga-tools",
427
+ "allowNo": false,
428
+ "type": "boolean"
429
+ },
423
430
  "toolsets": {
424
431
  "description": "Toolsets to enable (comma-separated; default: all). Options: all, CARTRIDGES, DIAGNOSTICS, MRT, PWAV3, SCAPI, STOREFRONTNEXT, CIP",
425
432
  "env": "SFCC_TOOLSETS",
@@ -455,5 +462,5 @@
455
462
  "enableJsonFlag": false
456
463
  }
457
464
  },
458
- "version": "3.0.0"
465
+ "version": "3.1.0"
459
466
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@salesforce/b2c-dx-mcp",
3
3
  "description": "MCP server for B2C Commerce developer experience tools",
4
- "version": "3.0.0",
4
+ "version": "3.1.0",
5
5
  "author": "Salesforce",
6
6
  "license": "Apache-2.0",
7
7
  "repository": "SalesforceCommerceCloud/b2c-developer-tooling",
@@ -80,8 +80,8 @@
80
80
  "ts-morph": "27.0.2",
81
81
  "yaml": "2.9.0",
82
82
  "zod": "4.5.4",
83
- "@salesforce/b2c-agent-plugins": "1.9.0",
84
- "@salesforce/b2c-tooling-sdk": "2.0.0"
83
+ "@salesforce/b2c-agent-plugins": "1.10.0",
84
+ "@salesforce/b2c-tooling-sdk": "2.1.0"
85
85
  },
86
86
  "bundledDependencies": [
87
87
  "@modelcontextprotocol/server",