@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.
- package/content/guidance/b2c-cli/b2c-config/SKILL.md +18 -1
- package/content/guidance/b2c-cli/b2c-job/SKILL.md +2 -0
- package/content/guidance/b2c-cli/b2c-job/references/EXPORT.md +9 -3
- package/content/guidance/b2c-cli/b2c-job/references/IMPORT.md +12 -0
- package/content/guidance/b2c-cli/b2c-mrt/SKILL.md +5 -4
- package/content/guidance/b2c-cli/b2c-mrt/references/BUNDLE-COMMANDS.md +21 -3
- package/content/guidance/b2c-cli/b2c-mrt/references/ENVIRONMENT-COMMANDS.md +23 -0
- package/content/guidance/b2c-cli/b2c-webdav/SKILL.md +17 -0
- package/content/guidance/index.json +18 -18
- package/content/guidance/mcp/scapi/SKILL.md +46 -14
- package/dist/commands/mcp.d.ts +1 -0
- package/dist/commands/mcp.js +7 -0
- package/dist/guidance.js +0 -2
- package/dist/registry.js +1 -1
- package/dist/server-context.d.ts +2 -0
- package/dist/server-context.js +4 -0
- package/dist/server.d.ts +2 -4
- package/dist/server.js +16 -3
- package/dist/tools/scapi/execution-registry.d.ts +62 -0
- package/dist/tools/scapi/execution-registry.js +303 -0
- package/dist/tools/scapi/index.d.ts +2 -1
- package/dist/tools/scapi/index.js +2 -2
- package/dist/tools/scapi/scapi-code.d.ts +2 -1
- package/dist/tools/scapi/scapi-code.js +71 -34
- package/dist/utils/types.d.ts +10 -3
- package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CLhGwQTn.d.mts +2 -1
- package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-dBHMsxwf.d.cts +2 -1
- package/node_modules/@modelcontextprotocol/server/dist/mcp-D7GmuPnv.cjs +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/mcp-DXXb3Vv3.mjs +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/src-CX2iR2pK.mjs +2 -0
- package/node_modules/@modelcontextprotocol/server/dist/src-STyD_Vvf.cjs +2 -0
- package/node_modules/@salesforce/b2c-agent-plugins/CHANGELOG.md +22 -0
- package/node_modules/@salesforce/b2c-agent-plugins/README.md +4 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-config/SKILL.md +18 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/SKILL.md +2 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/EXPORT.md +9 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/IMPORT.md +12 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/SKILL.md +5 -4
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/references/BUNDLE-COMMANDS.md +21 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/references/ENVIRONMENT-COMMANDS.md +23 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-webdav/SKILL.md +17 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/.codex-plugin/plugin.json +41 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/README.md +35 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/assets/logo.svg +31 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/plugin.json +45 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/skills/using-b2c-tooling-sdk/SKILL.md +226 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-python-sdk/skills/using-b2c-tooling-sdk/references/api-catalog.md +154 -0
- package/node_modules/@salesforce/b2c-agent-plugins/package.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/plugins.json +3 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/plugin.json +1 -1
- package/oclif.manifest.json +8 -1
- 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,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.
|
|
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"
|
package/oclif.manifest.json
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
84
|
-
"@salesforce/b2c-tooling-sdk": "2.
|
|
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",
|