zuplo 7.8.8 → 7.8.9

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 (28) hide show
  1. package/docs/ai-gateway/integrations/claude-code.mdx +82 -180
  2. package/docs/ai-gateway/integrations/claude-desktop.mdx +61 -99
  3. package/docs/ai-gateway/integrations/codex.mdx +63 -57
  4. package/docs/articles/custom-domains.mdx +3 -2
  5. package/docs/articles/source-control.mdx +4 -3
  6. package/docs/articles/testing.mdx +5 -5
  7. package/docs/articles/upstream-iam-auth.mdx +2 -2
  8. package/docs/concepts/how-zuplo-works.mdx +2 -1
  9. package/docs/dev-portal/migration.mdx +2 -2
  10. package/docs/getting-started/dev-portal/index.mdx +2 -2
  11. package/docs/getting-started/gateway/add-api-key-auth/index.mdx +3 -0
  12. package/docs/getting-started/gateway/add-api-key-auth/local.mdx +3 -0
  13. package/docs/getting-started/gateway/add-rate-limiting/index.mdx +3 -0
  14. package/docs/getting-started/gateway/add-rate-limiting/local.mdx +3 -0
  15. package/docs/getting-started/gateway/agent.mdx +2 -1
  16. package/docs/getting-started/gateway/deploy-to-the-edge/index.mdx +3 -0
  17. package/docs/getting-started/gateway/deploy-to-the-edge/local.mdx +3 -0
  18. package/docs/getting-started/gateway/dynamic-rate-limiting/index.mdx +3 -0
  19. package/docs/getting-started/gateway/dynamic-rate-limiting/local.mdx +3 -0
  20. package/docs/getting-started/gateway/setup-a-basic-gateway/index.mdx +4 -1
  21. package/docs/getting-started/gateway/setup-a-basic-gateway/local.mdx +4 -1
  22. package/docs/getting-started/mcp-gateway/local.mdx +31 -9
  23. package/docs/getting-started/mcp-gateway/portal.mdx +8 -7
  24. package/docs/getting-started/mcp-server/local.mdx +2 -2
  25. package/docs/getting-started/migrate/index.mdx +2 -2
  26. package/docs/mcp-gateway/connect-clients/claude-desktop.mdx +21 -19
  27. package/docs/mcp-gateway/connect-clients/overview.mdx +2 -1
  28. package/package.json +5 -5
@@ -2,92 +2,70 @@
2
2
  title: Claude Code
3
3
  sidebar_label: Claude Code
4
4
  description:
5
- Point Claude Code at an AI Gateway app so every Claude Code request is
6
- authenticated, metered, and routed by the gateway.
5
+ Route Claude Code requests through a Zuplo AI Gateway app, with a provider key
6
+ or your Claude subscription.
7
7
  ---
8
8
 
9
- You can configure [Claude Code](https://www.claude.com/product/claude-code) to
10
- send its model requests through the Zuplo AI Gateway, so the gateway
11
- authenticates, meters, and routes every Claude Code session.
9
+ Route [Claude Code](https://www.claude.com/product/claude-code) through the
10
+ Zuplo AI Gateway. The gateway authenticates, meters, and routes every session.
12
11
 
13
- The gateway can authenticate to Anthropic in two ways. Pick one before you
14
- configure Claude Code:
12
+ The gateway authenticates to Anthropic in one of two ways:
15
13
 
16
- | Approach | The gateway sends Anthropic | Claude Code sends the gateway |
17
- | --------------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------- |
18
- | [Configured provider key](#use-a-configured-provider-key) | The Anthropic API key saved on your provider | The app's API key as `ANTHROPIC_AUTH_TOKEN` |
19
- | [Your Claude subscription](#use-your-claude-subscription) | The credential from your `claude.ai` login, such as a Claude Max plan | The app's API key in a `zp-gateway-api-key` header, plus your login as-is |
14
+ | Approach | The gateway sends Anthropic | Claude Code sends the gateway |
15
+ | ---------------------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------- |
16
+ | [Provider key](#use-a-provider-key) | The Anthropic API key saved on your provider | The app's API key as `ANTHROPIC_AUTH_TOKEN` |
17
+ | [Claude subscription](#use-your-claude-subscription) | Your `claude.ai` login, such as a Claude Max plan | The app's API key in a `zp-gateway-api-key` header, plus your login |
20
18
 
21
- Both approaches share the same provider, team, and app setup, and the same model
22
- configuration.
23
-
24
- ## Claude Code Setup
19
+ ## Prerequisites
25
20
 
26
21
  <Stepper>
27
22
 
28
- 1. Create a [new provider](../managing-providers.mdx) in the AI Gateway for
29
- Anthropic
30
-
31
- 2. [Set up a new team](../managing-teams.mdx)
32
-
33
- 3. If you plan to use your Claude subscription, configure the team's
34
- [API Key Authentication policy](#configure-the-api-key-authentication-policy)
35
- for passthrough before you create the app
23
+ 1. Create an Anthropic [provider](../managing-providers.mdx) in the AI Gateway.
36
24
 
37
- 4. Create a [new app](../managing-apps.mdx) to use with Claude Code and assign
38
- it to the team you created
25
+ 2. [Create a team](../managing-teams.mdx). For the subscription approach,
26
+ [configure its API Key Authentication policy](#configure-the-api-key-authentication-policy)
27
+ now.
39
28
 
40
- 5. Copy the **API URL** and **API Key** shown at the top of the app page
29
+ 3. [Create an app](../managing-apps.mdx) for Claude Code and assign it to the
30
+ team.
41
31
 
42
- 6. Add the gateway URL, the app's API key, and model mappings to
43
- `.claude/settings.json`, following the section below for the approach you
44
- chose
32
+ 4. Copy the **API URL** and **API Key** from the app page.
45
33
 
46
34
  </Stepper>
47
35
 
48
- ### Before copying: replace the provider name
36
+ ## Configure Claude Code
49
37
 
50
- :::warning
38
+ :::warning{title="Replace the provider name"}
51
39
 
52
- The examples below assume your provider is named `anthropic`. Replace that
53
- prefix with the name of **your** provider before copying the configuration. For
54
- example, a provider named `my-anthropic` routes `my-anthropic/claude-sonnet-5`,
55
- while a Bedrock provider named `bedrock` routes
56
- `bedrock/anthropic.claude-sonnet-5`. The model part must be an id that provider
57
- understands.
40
+ The examples assume your provider is named `anthropic`. Replace that prefix with
41
+ the name of **your** provider before copying anything. A provider named
42
+ `my-anthropic` routes `my-anthropic/claude-sonnet-5`; a Bedrock provider named
43
+ `bedrock` routes `bedrock/anthropic.claude-sonnet-5`. The model part must be an
44
+ ID that provider serves. Check [your provider's page](../managing-providers.mdx)
45
+ in the Portal.
58
46
 
59
47
  :::
60
48
 
61
- The gateway routes every request using `providerName/model`. The provider prefix
62
- picks which of your providers handles the request — a gateway can contain
63
- several providers that serve Anthropic models.
64
-
65
- ### Where Claude Code reads its settings
66
-
67
- You can configure Claude Code either globally or per project by editing the
68
- settings file:
49
+ Claude Code reads `~/.claude/settings.json`, or `.claude/settings.json` in a
50
+ project. Add the block for your approach, then restart Claude Code.
69
51
 
70
- - **Global:** `~/.claude/settings.json`
71
- - **Project-specific:** `.claude/settings.json` in your project directory
72
-
73
- Each approach below shows the `env` and `modelOverrides` blocks to add to that
74
- file. Restart Claude Code after saving it, and all your Claude Code LLM requests
75
- route through the AI Gateway.
76
-
77
- :::note
78
-
79
- Claude Code appends `/v1/messages` to the base URL itself, so
80
- `ANTHROPIC_BASE_URL` is the app's URL _without_ the `/v1` suffix.
81
-
82
- :::
52
+ ### Rules
83
53
 
84
- ## Use a configured provider key
54
+ - `ANTHROPIC_BASE_URL` is the app's API URL _without_ `/v1`. Claude Code appends
55
+ `/v1/messages`.
56
+ - Set every `ANTHROPIC_*_MODEL` variable and every `modelOverrides` entry.
57
+ Claude Code's built-in model names have no prefix. The variables map the
58
+ `opus`, `sonnet`, `haiku`, and `fable` aliases;
59
+ [`modelOverrides`](https://code.claude.com/docs/en/model-config#override-model-ids-per-version)
60
+ maps exact IDs; the `/model` picker can select either.
61
+ - The app's
62
+ [Model Filtering](../../policies/ai-gateway-model-filtering-v2-inbound.mdx)
63
+ policy controls which models the app can use.
85
64
 
86
- With this approach the gateway calls Anthropic with the API key you saved on the
87
- [provider](../managing-providers.mdx). Claude Code presents only the app's API
88
- key, and Anthropic bills the account that owns the provider key.
65
+ ## Use a provider key
89
66
 
90
- Add the following configuration to the settings file:
67
+ The gateway calls Anthropic with the key saved on your provider. Anthropic bills
68
+ that key's account. Your Claude subscription is not used.
91
69
 
92
70
  ```json
93
71
  {
@@ -111,58 +89,37 @@ Add the following configuration to the settings file:
111
89
  }
112
90
  ```
113
91
 
114
- `ANTHROPIC_AUTH_TOKEN` replaces whatever login Claude Code would otherwise use,
115
- so this approach doesn't consume your Claude subscription.
92
+ `ANTHROPIC_AUTH_TOKEN` replaces your `claude.ai` login.
116
93
 
117
94
  ## Use your Claude subscription
118
95
 
119
- With this approach Claude Code stays signed in to `claude.ai` — for example with
120
- a Claude Max plan — and the gateway forwards that login credential to Anthropic
121
- as the request's provider credential. The app's API key travels in a separate
122
- `zp-gateway-api-key` header, so the gateway still authenticates the app, applies
123
- its policy chain, and meters its usage.
124
-
125
- Two pieces of configuration make this work: the app's **API Key Authentication**
126
- policy accepts the app key from the `zp-gateway-api-key` header and passes the
127
- `Authorization` header through, and Claude Code sends both headers.
96
+ Claude Code stays signed in to `claude.ai`. The gateway forwards that login to
97
+ Anthropic and reads the app's API key from a separate `zp-gateway-api-key`
98
+ header, so it still authenticates the app, runs its policies, and meters usage.
128
99
 
129
100
  ### Configure the API Key Authentication policy
130
101
 
131
- The [API Key Authentication](../../policies/ai-gateway-auth-v2-inbound.mdx)
132
- policy needs three options for passthrough:
133
-
134
- | Option | Value | Effect |
135
- | ----------------------- | -------------------- | -------------------------------------------------------- |
136
- | `credentialPassthrough` | On | Forward the caller's `Authorization` header to Anthropic |
137
- | `authHeader` | `zp-gateway-api-key` | Read the app's API key from this header instead |
138
- | `authScheme` | Empty value | The header holds the bare key, with no `Bearer` prefix |
139
-
140
- You can set these options on the team's
141
- [policy template](../policy-templates.mdx), so every app created in the team
142
- starts with passthrough enabled, or on a single app's **Policies** tab. The
143
- steps below use the team template; the app's policy editor works the same way.
102
+ On the team's [policy template](../policy-templates.mdx), or on one app's
103
+ **Policies** tab, edit **API Key Authentication**:
144
104
 
145
105
  <Stepper>
146
106
 
147
- 1. Open the team in the Zuplo Portal and select its **Policy Template** tab.
148
-
149
- 2. Click the edit (pencil) icon on the **API Key Authentication** entry.
150
-
151
- 3. Turn on **credentialPassthrough**.
107
+ 1. Turn on **credentialPassthrough**.
152
108
 
153
- 4. Set **authHeader** to `zp-gateway-api-key`.
109
+ 2. Set **authHeader** to `zp-gateway-api-key`.
154
110
 
155
- 5. Leave **authScheme** blank and click **Use an empty value for authScheme**.
156
- The field then reports "Empty value set. The default (Bearer) is not
157
- applied." Clearing the field alone isn't enough: a blank field omits the
158
- option, so the `Bearer` default still applies and every request fails with
159
- `401 Invalid Authorization Scheme`.
111
+ 3. Leave **authScheme** blank and click **Use an empty value for authScheme**.
112
+ The field reports "Empty value set. The default (Bearer) is not applied."
160
113
 
161
- 6. Click **Apply**, then **Save changes**.
114
+ 4. Click **Apply**, then **Save changes**.
162
115
 
163
116
  </Stepper>
164
117
 
165
- The **JSON** editor mode shows the equivalent options:
118
+ A blank **authScheme** field is not an empty value. It omits the option, the
119
+ `Bearer` default still applies, and every request fails with
120
+ `401 Invalid Authorization Scheme`.
121
+
122
+ In the **JSON** editor:
166
123
 
167
124
  ```json
168
125
  {
@@ -172,29 +129,20 @@ The **JSON** editor mode shows the equivalent options:
172
129
  }
173
130
  ```
174
131
 
175
- ### The provider still needs an API key
176
-
177
- The Portal requires an API key to save an Anthropic provider, and passthrough
178
- requests never send it: the request to Anthropic carries the caller's credential
179
- instead. Anything else that uses this provider's configured credential still
180
- needs a real key. That includes apps on this gateway that don't use passthrough
181
- and any
182
- [Fallback Model](../../policies/ai-gateway-fallback-model-v2-inbound.mdx)
183
- target, because fallback requests use the provider's configured credential
184
- rather than the caller's. If nothing on the gateway uses the configured
185
- credential, a placeholder value works.
132
+ ### Rules
186
133
 
187
- The app's playground in the Portal sends the app key as a bearer token in
188
- `Authorization`, so it can't call an app that uses passthrough. Test the app
189
- from Claude Code instead, as described below.
134
+ - The provider still needs an API key to save. Passthrough requests never use
135
+ it. Apps without passthrough and every
136
+ [Fallback Model](../../policies/ai-gateway-fallback-model-v2-inbound.mdx)
137
+ target do. If nothing uses it, a placeholder value works.
138
+ - The Portal playground sends the app key as `Authorization: Bearer`, so it
139
+ can't call a passthrough app. Test from Claude Code.
140
+ - Do not set `ANTHROPIC_AUTH_TOKEN` or `ANTHROPIC_API_KEY`, in the settings file
141
+ or in your shell. Either one replaces your login, and the gateway forwards it
142
+ to Anthropic instead.
190
143
 
191
144
  ### Configure Claude Code
192
145
 
193
- Add the following configuration to the settings file. Don't set
194
- `ANTHROPIC_AUTH_TOKEN` or `ANTHROPIC_API_KEY` here or in your shell: either one
195
- replaces your `claude.ai` login, and the gateway would then forward that value
196
- to Anthropic as the credential.
197
-
198
146
  ```json
199
147
  {
200
148
  "env": {
@@ -217,73 +165,27 @@ to Anthropic as the credential.
217
165
  }
218
166
  ```
219
167
 
220
- `ANTHROPIC_CUSTOM_HEADERS` adds the `zp-gateway-api-key` header to every request
221
- Claude Code makes, while Claude Code keeps sending its own `Authorization`
222
- header from your login. The gateway consumes those incoming headers, uses the
223
- login credential to authenticate the Anthropic request, and never sends your app
224
- key to Anthropic.
168
+ `ANTHROPIC_CUSTOM_HEADERS` adds the `zp-gateway-api-key` header. Claude Code
169
+ keeps sending its own `Authorization` header from your login. The gateway never
170
+ sends your app key to Anthropic.
225
171
 
226
- ### Verify the subscription setup
227
-
228
- Restart Claude Code, then confirm which credential it's using and send one
229
- request through the gateway:
172
+ ## Verify
230
173
 
231
174
  ```bash
232
175
  claude auth status --text
233
176
  claude -p "Reply with the single word OK"
234
177
  ```
235
178
 
236
- The first command should report that you're signed in with your `claude.ai`
237
- account rather than an API key or auth token. The second returns a short reply,
238
- and the request appears in the app's usage in the Zuplo Portal. In an
239
- interactive session, `/status` shows the same login information.
240
-
241
- If the request fails:
242
-
243
- - `401` with `Invalid Authorization Scheme` — `authScheme` still has its
244
- `Bearer` default. Set it to an explicit empty value in the policy.
245
- - `401` with `Header configured by options.authHeader is missing` — Claude Code
246
- didn't send `zp-gateway-api-key`. Check `ANTHROPIC_CUSTOM_HEADERS`.
247
- - `401` with `credentialPassthrough requires a non-empty Authorization header` —
248
- Claude Code isn't signed in. Run `claude` and use `/login`.
249
- - An authentication error from Anthropic — Anthropic rejected the forwarded
250
- login credential. Sign in to Claude Code again.
251
-
252
- ## Configure every Claude Code model variable
253
-
254
- The model ids in these examples reflect what was current when this page was
255
- written, and ids differ across providers — a Bedrock provider serves different
256
- ids than Anthropic directly, and availability can vary by region. Check
257
- [your provider's page](../managing-providers.mdx) in the portal for the models
258
- it currently serves, and use those ids.
259
-
260
- None of Claude Code's built-in model names carry a provider prefix, so each of
261
- the model variables above must be set to a prefixed reference:
262
-
263
- - `ANTHROPIC_MODEL` — the startup model. Set it to a prefixed reference so the
264
- gateway can route the first request.
265
- - `ANTHROPIC_SMALL_FAST_MODEL` — the model for background tasks.
266
- - `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`,
267
- `ANTHROPIC_DEFAULT_HAIKU_MODEL`, `ANTHROPIC_DEFAULT_FABLE_MODEL` — what the
268
- `opus`/`sonnet`/`haiku`/`fable` aliases resolve to, so `claude --model opus`
269
- and `/model sonnet` keep working. In these examples,
270
- `ANTHROPIC_DEFAULT_FABLE_MODEL` maps `fable` to `anthropic/claude-fable-5-1`.
271
-
272
- Claude Code's `/model` picker can select either an alias or an exact model ID.
273
- `ANTHROPIC_DEFAULT_*_MODEL` maps aliases to gateway model names;
274
- [`modelOverrides`](https://code.claude.com/docs/en/model-config#override-model-ids-per-version)
275
- maps exact IDs. The examples configure both so either selection works through
276
- the gateway.
277
-
278
- :::caution{title='HTTP 400: model must use "providerName/model"'}
279
-
280
- This error means the selected model lacks its provider prefix. At startup, check
281
- `ANTHROPIC_MODEL`. After choosing a picker entry, check its `modelOverrides`
282
- entry, or type `/model fable` to use the configured alias. Restart Claude Code
283
- after editing the settings file.
179
+ With the subscription approach, the first command reports a `claude.ai` login,
180
+ not an API key or auth token. The request appears in the app's usage in the
181
+ Zuplo Portal.
284
182
 
285
- :::
183
+ ## Troubleshooting
286
184
 
287
- The app's
288
- [Model Filtering](../../policies/ai-gateway-model-filtering-v2-inbound.mdx)
289
- policy controls which models the app may use.
185
+ | Error | Fix |
186
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
187
+ | `400` `model must use "providerName/model"` | The selected model has no provider prefix. Check `ANTHROPIC_MODEL`, or the picker entry's `modelOverrides` mapping. Restart after editing. |
188
+ | `401` `Invalid Authorization Scheme` | `authScheme` still has its `Bearer` default. Set an explicit empty value. |
189
+ | `401` `Header configured by options.authHeader is missing` | Claude Code didn't send `zp-gateway-api-key`. Check `ANTHROPIC_CUSTOM_HEADERS`. |
190
+ | `401` `credentialPassthrough requires a non-empty Authorization header` | Claude Code isn't signed in. Run `claude` and use `/login`. |
191
+ | An authentication error from Anthropic | Anthropic rejected the forwarded login. Sign in to Claude Code again. |
@@ -2,156 +2,118 @@
2
2
  title: Claude Desktop
3
3
  sidebar_label: Claude Desktop
4
4
  description:
5
- Point Claude Desktop at an AI Gateway app so every Chat, Cowork, and Code
6
- session is authenticated, metered, and routed by the gateway.
5
+ Route Claude Desktop's Chat, Cowork, and Code sessions through a Zuplo AI
6
+ Gateway app.
7
7
  ---
8
8
 
9
- [Claude Desktop](https://claude.com/download) can use the Zuplo AI Gateway as
10
- its inference provider, so the gateway authenticates, meters, and routes every
11
- Chat, Cowork, and Code session started from the desktop app.
9
+ Route [Claude Desktop](https://claude.com/download) through the Zuplo AI
10
+ Gateway. The gateway authenticates, meters, and routes every Chat, Cowork, and
11
+ Code session started from the app.
12
12
 
13
- This page covers routing Claude Desktop's model requests through the AI Gateway.
14
13
  To give Claude Desktop tools from a Zuplo MCP route instead, see
15
14
  [Connect Claude Desktop and Claude.ai](../../mcp-gateway/connect-clients/claude-desktop.mdx).
16
15
 
17
- ## Claude Desktop Setup
16
+ ## Prerequisites
18
17
 
19
18
  <Stepper>
20
19
 
21
- 1. Create a [new provider](../managing-providers.mdx) in the AI Gateway for
22
- Anthropic
20
+ 1. Create an Anthropic [provider](../managing-providers.mdx) in the AI Gateway.
23
21
 
24
- 2. [Set up a new team](../managing-teams.mdx)
22
+ 2. [Create a team](../managing-teams.mdx).
25
23
 
26
- 3. Create a [new app](../managing-apps.mdx) to use with Claude Desktop and
27
- assign it to the team you created
24
+ 3. [Create an app](../managing-apps.mdx) for Claude Desktop and assign it to the
25
+ team.
28
26
 
29
- 4. Copy the **API URL** and **API Key** shown at the top of the app page
30
-
31
- 5. Enter the API URL, API key, and model list in Claude Desktop's third-party
32
- inference settings
27
+ 4. Copy the **API URL** and **API Key** from the app page.
33
28
 
34
29
  </Stepper>
35
30
 
36
- ### Before copying: replace the provider name
37
-
38
- :::warning
39
-
40
- The examples below assume your provider is named `anthropic`. Replace that
41
- prefix with the name of **your** provider before copying the configuration. For
42
- example, a provider named `my-anthropic` routes `my-anthropic/claude-sonnet-5`,
43
- while a Bedrock provider named `bedrock` routes
44
- `bedrock/anthropic.claude-sonnet-5`. The model part must be an id that provider
45
- understands.
46
-
47
- :::
48
-
49
- The gateway routes every request using `providerName/model`. The provider prefix
50
- picks which of your providers handles the request — a gateway can contain
51
- several providers that serve Anthropic models.
52
-
53
- ### Configure third-party inference
54
-
55
- Configure Claude Desktop's inference provider in its in-app configuration
56
- window, available on macOS and Windows:
31
+ ## Configure Claude Desktop
57
32
 
58
33
  <Stepper>
59
34
 
60
- 1. From the menu bar (macOS) or the application menu (Windows), select **Help →
61
- Troubleshooting → Enable Developer Mode**.
35
+ 1. Select **Help → Troubleshooting → Enable Developer Mode** from the menu bar
36
+ (macOS) or the application menu (Windows).
62
37
 
63
38
  2. Open **Developer → Configure Third-Party Inference**.
64
39
 
65
- 3. In the **Connection** section, set **Inference provider** to **Gateway**.
40
+ 3. Under **Connection**, set **Inference provider** to **Gateway**.
66
41
 
67
- 4. In the **Gateway credentials** card, set **Gateway base URL** to the app's
68
- API URL, for example
42
+ 4. Under **Gateway credentials**, set **Gateway base URL** to the app's API URL,
43
+ for example
69
44
  `https://my-gateway-main-2e18f50.zuplo.app/config_fe0a04972d2848e0a94ae4b8bcd1497e`,
70
45
  and **Gateway API key** to the app's API key.
71
46
 
72
47
  5. Leave **Credential kind** set to **Static API key** and **Gateway auth
73
48
  scheme** set to **Bearer**.
74
49
 
75
- 6. In the **Models** section, add the models the app may use to the **Model
76
- list**. See [Add models to the Model list](#add-models-to-the-model-list).
50
+ 6. Under **Models**, add each model the app may use. See
51
+ [Add models](#add-models).
77
52
 
78
- 7. Click **Apply locally**. Claude Desktop writes the configuration and
79
- relaunches into it.
53
+ 7. Click **Apply locally**. Claude Desktop saves the configuration and
54
+ relaunches.
80
55
 
81
56
  </Stepper>
82
57
 
83
- :::note
58
+ ### Rules
84
59
 
85
- Claude Desktop appends `/v1/messages` to the base URL itself, so **Gateway base
86
- URL** is the app's URL _without_ the `/v1` suffix.
60
+ - **Gateway base URL** is the app's API URL _without_ `/v1`. Claude Desktop
61
+ appends `/v1/messages`.
62
+ - **Gateway auth scheme** stays **Bearer**. The gateway reads the API key from
63
+ the `Authorization: Bearer` header.
64
+ - **Credential kind** stays **Static API key**. AI Gateway apps authenticate
65
+ with API keys, not identity-provider tokens.
87
66
 
88
- :::
67
+ ## Add models
89
68
 
90
- :::caution{title="Keep the auth scheme set to Bearer"}
69
+ :::warning{title="Replace the provider name"}
91
70
 
92
- The gateway reads the API key from the `Authorization: Bearer` header, so keep
93
- **Gateway auth scheme** set to **Bearer**. Likewise, keep **Credential kind**
94
- set to **Static API key** — AI Gateway apps authenticate with their own API
95
- keys, not identity-provider tokens.
71
+ The examples assume your provider is named `anthropic`. Replace that prefix with
72
+ the name of **your** provider before entering any model. A provider named
73
+ `my-anthropic` routes `my-anthropic/claude-sonnet-5`; a Bedrock provider named
74
+ `bedrock` routes `bedrock/anthropic.claude-sonnet-5`. The model part must be an
75
+ ID that provider serves. Check [your provider's page](../managing-providers.mdx)
76
+ in the Portal.
96
77
 
97
78
  :::
98
79
 
99
- ### Add models to the Model list
100
-
101
- The **Model list** in the **Models** section overrides the model list Claude
102
- Desktop discovers on its own. Click **Add** once per model the app may use, and
103
- fill in each entry:
80
+ The **Model list** replaces the models Claude Desktop discovers on its own.
81
+ Click **Add** once per model:
104
82
 
105
83
  - **Model ID** — the full `providerName/model` reference, for example
106
- `anthropic/claude-sonnet-5`. A bare id such as `claude-sonnet-5` fails to
107
- route through the gateway.
108
- - **Display name** — the name shown in the model picker, for example
109
- `Claude Sonnet 5`. Leave it blank and Claude Desktop formats a name from the
110
- id.
111
- - **Offer 1M-context variant** — leave this off unless your provider's
112
- deployment accepts 1M-token context for the model.
84
+ `anthropic/claude-sonnet-5`. A bare ID fails with a `400`.
85
+ - **Display name** — the name in the model picker. Leave it blank and Claude
86
+ Desktop formats one from the ID.
87
+ - **Offer 1M-context variant** — off, unless your provider accepts 1M-token
88
+ context for the model.
113
89
  - **Tier alias** — the Claude tier (Opus, Sonnet, Haiku, or Fable) this model
114
- stands in for. Setting it pins what the bare alias (for example `opus`)
115
- resolves to, so tier names route to your prefixed model reference.
90
+ stands in for. The bare alias, for example `opus`, then resolves to it.
116
91
 
117
- The first entry is the default selection in the model picker. Include a
118
- Haiku-tier model — Claude Desktop runs background and sub-agent tasks on a
119
- small, fast model.
120
-
121
- The model ids in these examples reflect what was current when this page was
122
- written, and ids differ across providers — a Bedrock provider serves different
123
- ids than Anthropic directly, and availability can vary by region. Check
124
- [your provider's page](../managing-providers.mdx) in the portal for the models
125
- it currently serves, and use those ids.
92
+ The first entry is the picker default. Include a Haiku-tier model: Claude
93
+ Desktop runs background and sub-agent tasks on a small, fast model.
126
94
 
127
95
  The app's
128
96
  [Model Filtering](../../policies/ai-gateway-model-filtering-v2-inbound.mdx)
129
- policy controls which models the app may use.
130
-
131
- ### Verify the configuration
97
+ policy controls which models the app can use.
132
98
 
133
- After Claude Desktop relaunches, send a message in a Chat conversation and start
134
- a Cowork session. Both requests route through the gateway and count against the
135
- [app](../managing-apps.mdx) in the Zuplo Portal, as do Code sessions started
136
- from the desktop app. Terminal Claude Code sessions outside the desktop app use
137
- a separate configuration — see [Claude Code](./claude-code.mdx).
99
+ ## Verify
138
100
 
139
- :::caution{title='HTTP 400: model must use "providerName/model"'}
101
+ Send a message in Chat and start a Cowork session. Both appear in the app's
102
+ usage in the Zuplo Portal, as do Code sessions started from the desktop app.
103
+ Terminal Claude Code sessions use their own configuration. See
104
+ [Claude Code](./claude-code.mdx).
140
105
 
141
- If a request fails with `The request body model must use "providerName/model"`,
142
- the selected model reference is missing its provider prefix. Give every entry in
143
- the model list a full `providerName/model` reference.
106
+ ## Troubleshooting
144
107
 
145
- :::
108
+ | Error | Fix |
109
+ | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
110
+ | `400` `The request body model must use "providerName/model"` | A model list entry has no provider prefix. Give every entry a full `providerName/model` ID. |
146
111
 
147
- ### Deploy to a fleet
112
+ ## Deploy to a fleet
148
113
 
149
- To roll the configuration out to many devices, use the configuration window's
150
- **Export** menu instead of **Apply locally**. It generates a `.mobileconfig`
151
- profile for macOS MDM tools such as Jamf, a `.reg` policy file for Intune or
152
- Group Policy, and related deployment artifacts. Managed configuration takes
153
- precedence over local settings, so users can't point the app at a different
154
- endpoint. For the deployment workflow and the full configuration key reference,
155
- see Anthropic's
114
+ Use the configuration window's **Export** menu instead of **Apply locally**. It
115
+ produces a `.mobileconfig` profile for macOS MDM tools such as Jamf, a `.reg`
116
+ policy file for Intune or Group Policy, and related artifacts. Managed
117
+ configuration overrides local settings. See Anthropic's
156
118
  [Deploy Claude Desktop with an LLM gateway](https://claude.com/docs/third-party/claude-desktop/gateway)
157
119
  and [Deploy with MDM](https://claude.com/docs/third-party/claude-desktop/mdm).
@@ -1,98 +1,104 @@
1
1
  ---
2
2
  title: Codex
3
3
  sidebar_label: Codex
4
- description:
5
- Configure the Codex CLI to send its requests through an AI Gateway app, either
6
- by rerouting the built-in OpenAI provider or by adding a Zuplo provider.
4
+ description: Route Codex CLI requests through a Zuplo AI Gateway app.
7
5
  ---
8
6
 
9
- [Codex](https://developers.openai.com/codex) is a coding agent developed by
10
- OpenAI that you can run locally from your terminal and that can read, modify,
11
- and run code on your machine, in the chosen directory. It’s open-source, and
12
- built in Rust for speed and efficiency.
7
+ [Codex](https://developers.openai.com/codex) is OpenAI's coding agent for the
8
+ terminal. This guide routes its requests through the Zuplo AI Gateway.
13
9
 
14
10
  ## Prerequisites
15
11
 
16
- In order to use the AI Gateway with Codex you will need to complete these steps
17
- first:
18
-
19
12
  <Stepper>
20
13
 
21
- 1. Create a [new provider](../managing-providers.mdx) in the AI Gateway for the
22
- provider you want to use with Codex
14
+ 1. Create a [provider](../managing-providers.mdx) in the AI Gateway.
23
15
 
24
- 2. [Set up a new team](../managing-teams.mdx)
16
+ 2. [Create a team](../managing-teams.mdx).
25
17
 
26
- 3. Create a [new app](../managing-apps.mdx) to use specifically with Codex and
27
- assign it to the team you created
18
+ 3. [Create an app](../managing-apps.mdx) for Codex and assign it to the team.
28
19
 
29
- 4. Copy the **API URL** and **API Key** shown at the top of the app page
20
+ 4. Copy the **API URL** and **API Key** from the app page.
30
21
 
31
22
  </Stepper>
32
23
 
33
- ## Configure Codex CLI
34
-
35
- There are two approaches you can take to using Codex with Zuplo's AI Gateway.
36
-
37
- 1. **Route OpenAI through AI Gateway** - This would configure your OpenAI
38
- provider in Codex to route requests through the AI Gateway rather than
39
- directly to OpenAI
24
+ ## Configure Codex
40
25
 
41
- 2. **Create a Zuplo specific provider** - Use Zuplo as a provider that be
42
- selected in the Codex configuration and work with any OpenAI compatible
43
- models
26
+ :::warning{title="Replace the provider name"}
44
27
 
45
- Configuration steps for both options are below:
28
+ The examples assume your provider is named `openai`. Replace that prefix with
29
+ the name of **your** provider before copying anything. A provider named
30
+ `my-openai` routes `my-openai/gpt-5`. The model part must be an ID that provider
31
+ serves. Check [your provider's page](../managing-providers.mdx) in the Portal.
46
32
 
47
- ### Route OpenAI through AI Gateway
33
+ :::
48
34
 
49
- Open the [Codex configuration](https://developers.openai.com/codex/local-config)
50
- `~/.codex/config.toml` and modify the `model_providers.openai-chat-completions`
51
- entry so that the `base_url` points to your app's API URL with `/v1` appended,
52
- and set your `env_key` to the API Key of the app you created to use with Codex.
53
- The app page in the Zuplo Portal shows the API URL, which ends in the app's ID.
35
+ Codex reads configuration from `~/.codex/config.toml`. Create this file (and the
36
+ `~/.codex` directory if needed) if it does not exist. Add the following:
54
37
 
55
38
  ```toml
56
- [model_providers.openai-chat-completions]
57
- name = "OpenAI using Chat Completions"
39
+ model_provider = "zuplo"
40
+ model = "openai/gpt-5"
41
+
42
+ [model_providers.zuplo]
43
+ name = "Zuplo AI Gateway"
58
44
  base_url = "https://my-gateway-main-2e18f50.zuplo.app/config_fe0a04972d2848e0a94ae4b8bcd1497e/v1"
59
45
  env_key = "ZUPLO_AI_GATEWAY_API_KEY"
46
+ wire_api = "responses"
60
47
  ```
61
48
 
62
- Save the file and reload Codex. Your OpenAI requests will now be routed through
63
- the Zuplo AI Gateway.
49
+ - `base_url` is the app's API URL with `/v1` appended.
50
+ - `model` is `providerName/model`.
64
51
 
65
- ### Zuplo AI Gateway provider
52
+ Set the API key in your environment:
66
53
 
67
- To add a specific provider for the AI Gateway you can add an additional entry to
68
- the Codex `config.toml` file.
69
-
70
- ```toml
71
- [model_providers.zuplo]
72
- name = "Zuplo AI Gateway"
73
- base_url = "https://my-gateway-main-2e18f50.zuplo.app/config_fe0a04972d2848e0a94ae4b8bcd1497e/v1"
74
- env_key = "ZUPLO_AI_GATEWAY_API_KEY"
54
+ ```bash
55
+ export ZUPLO_AI_GATEWAY_API_KEY="<your-app-api-key>"
75
56
  ```
76
57
 
77
- Save the file and reload Codex. Your Zuplo AI Gateway provider will now be
78
- available and you can switch Codex over to use it at any time by running:
58
+ Restart Codex. All requests now go through the gateway.
59
+
60
+ ### Rules
61
+
62
+ - `model_provider = "zuplo"` is required. Without it, Codex uses its built-in
63
+ `openai` provider and bypasses the gateway.
64
+ - `wire_api` must be `responses`. Codex speaks only the Responses API; it
65
+ [removed](https://github.com/openai/codex/discussions/7782) support for
66
+ `/v1/chat/completions`, and `wire_api = "chat"` fails to load.
67
+ - Put this configuration in the user-level file. Codex ignores `model_provider`
68
+ and `model_providers` in a project-level `.codex/config.toml`.
69
+
70
+ ## Switch models
71
+
72
+ Set `model` in `config.toml`, or pass it on the command line:
79
73
 
80
74
  ```bash
81
- codex --config model_provider="zuplo"
75
+ codex --config model_provider="zuplo" --model "openai/gpt-5.6-sol"
82
76
  ```
83
77
 
84
- ### Choosing a model
78
+ Do not use the `/model` picker. It sends model names without the provider
79
+ prefix, and the gateway rejects them with a `400`.
80
+
81
+ Codex warns that it has no metadata for a prefixed model name. Requests still
82
+ succeed.
85
83
 
86
84
  The app's
87
85
  [Model Filtering](../../policies/ai-gateway-model-filtering-v2-inbound.mdx)
88
- policy controls which models the app may use. Codex names the model as
89
- `providerName/model`, where `providerName` is the provider name configured in
90
- your gateway:
86
+ policy controls which models the app can use.
87
+
88
+ ## Verify
91
89
 
92
90
  ```bash
93
- codex --config model_provider="zuplo" --model "openai/gpt-5"
91
+ codex exec "Reply with the single word OK"
94
92
  ```
95
93
 
96
- A request with no model, or a model without that prefix, gets a `400`. Adding
97
- [Model Filtering](../../policies/ai-gateway-model-filtering-v2-inbound.mdx) with
98
- an allow list also supplies a default, letting requests omit the model.
94
+ The session header shows `provider: zuplo`. The request appears in the app's
95
+ usage in the Zuplo Portal.
96
+
97
+ ## Troubleshooting
98
+
99
+ | Error | Fix |
100
+ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- |
101
+ | `400` `The request body model must use "providerName/model"` | Add the provider prefix to `model`. Do not use the `/model` picker. |
102
+ | `ERROR: Missing environment variable: ZUPLO_AI_GATEWAY_API_KEY` | Export the variable in the shell that runs Codex. |
103
+ | `401` `Authorization Failed` | The API key is wrong. Copy it from the app's **API Key** tab. |
104
+ | Errors mention `api.openai.com` or `not supported when using Codex with a ChatGPT account` | Codex is not using your provider. Set `model_provider = "zuplo"`. |
@@ -22,8 +22,9 @@ Zuplo supports two types of custom domains that can be configured separately:
22
22
  `cname.zuplodocs.com`. Learn more about the Developer Portal in the
23
23
  [Developer Portal documentation](/docs/dev-portal/overview).
24
24
 
25
- Both types of custom domains can be managed from the same Custom Domains section
26
- in your project settings and follow a similar configuration process.
25
+ Manage both types of custom domains in
26
+ [**Account Settings → Custom Domains**](https://portal.zuplo.com/+/account/settings/custom-domains).
27
+ They follow a similar configuration process.
27
28
 
28
29
  :::note
29
30
 
@@ -65,9 +65,10 @@ If your code lives elsewhere but you want to use a specific CI/CD system:
65
65
 
66
66
  ## How Branch-Based Deployments Work
67
67
 
68
- Every Git branch maps to a Zuplo environment. Push to `main` and deploy to your
69
- main environment. Push to `feature-auth` and get a `feature-auth` environment
70
- automatically.
68
+ With the GitHub integration, every Git branch maps to a Zuplo environment. Push
69
+ to `main` and deploy to your main environment. Push to `feature-auth` and get a
70
+ `feature-auth` environment automatically. For other providers, configure your
71
+ CI/CD pipeline to deploy each branch.
71
72
 
72
73
  This enables powerful workflows like PR preview environments where reviewers can
73
74
  test changes against a live API before merging.
@@ -140,11 +140,11 @@ and the same file supplies fixture values to `zuplo test`. See
140
140
 
141
141
  ## Test before merge
142
142
 
143
- Every branch pushed to your connected source control provider deploys as a
144
- preview environment: a full Zuplo deployment on the same edge network as
145
- production, at its own URL. Running your suite there is the highest-fidelity
146
- check available before a change merges, and it needs no shared staging
147
- environment.
143
+ With the GitHub integration, pushing a feature branch automatically creates a
144
+ preview environment at its own URL. For GitLab, Bitbucket, or Azure DevOps,
145
+ configure a [CI/CD pipeline](./custom-ci-cd.mdx) to deploy the branch. Running
146
+ your suite against a preview deployment lets you test changes before merging
147
+ without a shared staging environment.
148
148
 
149
149
  - [Testing preview environments](./testing-preview-environments.mdx) — getting
150
150
  the URL into your tests, per-environment services and secrets, and what to
@@ -19,8 +19,8 @@ identity provider you control. For the alternatives, see
19
19
 
20
20
  ## Federated identity or stored credentials
21
21
 
22
- Every provider offers two paths, and the choice matters more than which cloud
23
- you're on.
22
+ Zuplo offers federated identity and stored-credential policies. The available
23
+ options depend on your cloud provider, as shown in the policy table below.
24
24
 
25
25
  **Federated identity** is the stronger option. Zuplo presents a short-lived,
26
26
  audience-bound OIDC token that proves which gateway is calling, and your cloud
@@ -87,7 +87,8 @@ workflow is:
87
87
 
88
88
  1. **Develop** locally or in the Zuplo Portal
89
89
  2. **Push** to your Git repository (GitHub, GitLab, Bitbucket, or Azure DevOps)
90
- 3. **Deploy** automatically - Zuplo builds and deploys your gateway globally
90
+ 3. **Deploy** automatically with the GitHub integration, or configure a CI/CD
91
+ pipeline to deploy from GitLab, Bitbucket, or Azure DevOps
91
92
 
92
93
  Deployments complete in seconds. Each Git branch gets its own isolated
93
94
  environment with its own URL, making it easy to test changes before merging to
@@ -125,8 +125,8 @@ process, continue with the manual migration steps below.
125
125
 
126
126
  :::caution
127
127
 
128
- Currently, this migration must be done locally. It cannot be done in the
129
- Zuplo Portal.
128
+ Follow these manual migration steps locally. To migrate in the Zuplo Portal,
129
+ use the [built-in migration tool](#migrate-in-the-portal).
130
130
 
131
131
  :::
132
132
 
@@ -8,8 +8,8 @@ centered: false
8
8
  toc: false
9
9
  title: Getting Started with Developer Portal
10
10
  description:
11
- Publish docs and self-serve API keys with Zudoku with Zuplo, in the Portal,
12
- locally with the CLI, or with an AI agent.
11
+ Publish interactive API docs and let consumers manage their API keys through a
12
+ developer portal built in the Portal, locally, or with an AI agent.
13
13
  ---
14
14
 
15
15
  <WizardSteps build="dev-portal" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Add API key authentication - Portal
@@ -166,3 +167,5 @@ Let's get started.
166
167
  [our developer portal auth docs](/docs/dev-portal/zudoku/configuration/authentication).
167
168
 
168
169
  </Stepper>
170
+
171
+ <TutorialPager build="gateway" method="portal" step="add-api-key-auth" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Add API key authentication - Editor
@@ -154,3 +155,5 @@ Let's get started.
154
155
  :::
155
156
 
156
157
  </Stepper>
158
+
159
+ <TutorialPager build="gateway" method="local" step="add-api-key-auth" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Add rate limiting - Portal
@@ -81,3 +82,5 @@ limiter.
81
82
  echo API.
82
83
 
83
84
  </Stepper>
85
+
86
+ <TutorialPager build="gateway" method="portal" step="add-rate-limiting" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Add rate limiting - Editor
@@ -100,3 +101,5 @@ full power of the world's best rate limiter.
100
101
  your API.
101
102
 
102
103
  </Stepper>
104
+
105
+ <TutorialPager build="gateway" method="local" step="add-rate-limiting" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Getting Started with API Gateway - Agent
@@ -84,7 +85,7 @@ from inside your project directory.
84
85
  2. Add the rate-limiting inbound policy (rateLimitBy: ip, 2 requests / 1 minute) to every route.
85
86
  3. Add the api-key-inbound policy to every route, ordered before rate limiting.
86
87
  4. Make rate limiting dynamic: create modules/rate-limit.ts exporting rateLimit() that returns 1000 req/min for user.data.customerType === "premium", 5 for "free", 30 otherwise, and switch the policy to rateLimitBy: "function".
87
- 5. Run npm run dev and verify with curl that GET /todos returns 401 without a key. I will create the free and premium keys in the Portal afterward; leave key-based tests for me.
88
+ 5. Use the already-running dev server to verify with curl that GET /todos returns 401 without a key. I will create the free and premium keys in the Portal afterward; leave key-based tests for me.
88
89
 
89
90
  Explain each config change in one line and stop before pushing to git.
90
91
  ```
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Deploy to the edge - Portal
@@ -229,3 +230,5 @@ when running commits, pulls or try to open a pull request.
229
230
  - If the GitHub repository has been renamed or moved to a different
230
231
  organization, try disconnecting and reconnecting to it. You can do this by
231
232
  going to your Zuplo project's settings > Source Control section
233
+
234
+ <TutorialPager build="gateway" method="portal" step="deploy-to-the-edge" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Deploy to the edge - Editor
@@ -132,3 +133,5 @@ Zuplo project in the Portal. The local files alone cannot receive a deployment.
132
133
  :::
133
134
 
134
135
  </Stepper>
136
+
137
+ <TutorialPager build="gateway" method="local" step="deploy-to-the-edge" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Dynamic rate limiting - Portal
@@ -175,3 +176,5 @@ less than an hour.
175
176
  questions answered
176
177
  - Start generating revenue from your new API with our
177
178
  [Monetization tutorial](../../../articles/monetization/index.mdx)
179
+
180
+ <TutorialPager build="gateway" method="portal" step="dynamic-rate-limiting" />
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
6
  title: Dynamic rate limiting - Editor
@@ -187,3 +188,5 @@ less than an hour.
187
188
  questions answered
188
189
  - Start generating revenue from your new API with our
189
190
  [Monetization tutorial](../../../articles/monetization/index.mdx)
191
+
192
+ <TutorialPager build="gateway" method="local" step="dynamic-rate-limiting" />
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
- title: Setup a basic gateway - Portal
6
+ title: Set up a basic gateway - Portal
6
7
  description:
7
8
  Proxy an origin API through a managed Zuplo gateway, add your first route, and
8
9
  see traffic flowing end to end in the Zuplo Portal.
@@ -123,3 +124,5 @@ Note - Zuplo also supports building and running your API locally. To learn more
123
124
  response from Step 2.
124
125
 
125
126
  </Stepper>
127
+
128
+ <TutorialPager build="gateway" method="portal" step="setup-a-basic-gateway" />
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  category: API Management
3
+ disablePager: true
3
4
  showLastModified: false
4
5
  suggestEdit: false
5
- title: Setup a basic gateway - Editor
6
+ title: Set up a basic gateway - Editor
6
7
  description:
7
8
  Proxy an origin API through a managed Zuplo gateway, add your first route, and
8
9
  see traffic flowing end to end with the Zuplo CLI and your editor.
@@ -116,3 +117,5 @@ project template, which ships with a working todo API.
116
117
  gateway is now serving traffic locally.
117
118
 
118
119
  </Stepper>
120
+
121
+ <TutorialPager build="gateway" method="local" step="setup-a-basic-gateway" />
@@ -4,8 +4,8 @@ showLastModified: false
4
4
  suggestEdit: false
5
5
  title: Getting Started with MCP Gateway - Editor
6
6
  description:
7
- A step-by-step guide to building a mcp gateway with Zuplo using local
8
- development.
7
+ Build an MCP Gateway locally with the Zuplo CLI, connect an upstream MCP
8
+ server, and test its tools with a local MCP client.
9
9
  ---
10
10
 
11
11
  <WizardSteps build="mcp-gateway" method="local" />
@@ -222,11 +222,33 @@ older project and the build complains about the compatibility date, see
222
222
 
223
223
  6. **Connect Claude Desktop**
224
224
 
225
- Open Claude Desktop, go to **Settings → Connectors**, scroll to the bottom,
226
- and click **Add custom connector**. Paste
227
- `http://127.0.0.1:9000/mcp/linear-v1` and click **Add**.
225
+ Use a local stdio bridge so Claude Desktop can reach your local gateway.
226
+ Native remote connectors connect from Anthropic's servers and cannot reach
227
+ `127.0.0.1` on your computer.
228
228
 
229
- Claude Desktop opens the gateway's OAuth flow in a browser:
229
+ In Claude Desktop, open **Settings → Developer → Edit Config** and add this
230
+ entry to `claude_desktop_config.json`, preserving any existing servers:
231
+
232
+ ```json title="claude_desktop_config.json"
233
+ {
234
+ "mcpServers": {
235
+ "Zuplo MCP": {
236
+ "command": "npx",
237
+ "args": [
238
+ "-y",
239
+ "mcp-remote",
240
+ "http://127.0.0.1:9000/mcp/linear-v1",
241
+ "--allow-http"
242
+ ]
243
+ }
244
+ }
245
+ }
246
+ ```
247
+
248
+ Save the file and restart Claude Desktop. The bridge opens the gateway's
249
+ OAuth flow on first connection.
250
+
251
+ In the browser:
230
252
  1. The dev-login shortcut signs you in without any IdP prompt.
231
253
  2. The gateway's consent page lists Linear with a **Connect** button.
232
254
  3. Click **Connect**, complete Linear's OAuth flow, then click **Authorize**
@@ -234,9 +256,9 @@ older project and the build complains about the compatibility date, see
234
256
 
235
257
  :::tip{title="Checkpoint: Claude is connected"}
236
258
 
237
- Back in Claude Desktop, the new connector appears in **Settings →
238
- Connectors** marked as connected. Subsequent requests reuse the tokens the
239
- gateway just issued.
259
+ Back in Claude Desktop, the **Zuplo MCP** server appears under **Settings →
260
+ Developer**. Its tools are available in chat. Subsequent requests reuse the
261
+ tokens the gateway just issued.
240
262
 
241
263
  :::
242
264
 
@@ -4,7 +4,8 @@ showLastModified: false
4
4
  suggestEdit: false
5
5
  title: Getting Started with MCP Gateway - Portal
6
6
  description:
7
- A step-by-step guide to building a mcp gateway with Zuplo using Zuplo Portal.
7
+ Connect an MCP client to Linear through a Zuplo MCP Gateway in the Portal,
8
+ then sign in and call a Linear tool through the gateway.
8
9
  ---
9
10
 
10
11
  <WizardSteps build="mcp-gateway" method="portal" />
@@ -155,9 +156,9 @@ your machine.
155
156
 
156
157
  :::tip{title="Upstream doesn't use OAuth?"}
157
158
 
158
- Pick **None** to forward directly. The user's token is then either forwarded
159
- to the upstream or removed at the point of login, depending on the upstream's
160
- needs.
159
+ Pick **None** when the upstream doesn't require authentication. If gateway
160
+ OAuth is enabled, the gateway validates and removes its access token before
161
+ forwarding the request. It doesn't use that token to authenticate upstream.
161
162
 
162
163
  :::
163
164
 
@@ -240,8 +241,8 @@ your machine.
240
241
  Your route is live at `https://<your-gateway>/mcp/linear-v1`. Find the public
241
242
  URL via the **Gateway deployed** button in the toolbar.
242
243
 
243
- Open Claude Desktop, go to **Settings → Connectors**, scroll to the bottom,
244
- and click **Add custom connector**. Paste the route URL and click **Add**.
244
+ Open Claude Desktop, go to **Customize → Connectors**, click **+**, then
245
+ **Add custom connector**. Paste the route URL and click **Add**.
245
246
 
246
247
  Claude Desktop opens the gateway's OAuth flow in a browser:
247
248
  1. Sign in with your identity provider (Auth0 in this example).
@@ -251,7 +252,7 @@ your machine.
251
252
 
252
253
  :::tip{title="Checkpoint: Claude is connected"}
253
254
 
254
- Back in Claude Desktop, the new connector appears in **Settings →
255
+ Back in Claude Desktop, the new connector appears in **Customize →
255
256
  Connectors** marked as connected. Subsequent requests reuse the tokens the
256
257
  gateway just issued.
257
258
 
@@ -4,8 +4,8 @@ showLastModified: false
4
4
  suggestEdit: false
5
5
  title: Getting Started with MCP Server - Editor
6
6
  description:
7
- A step-by-step guide to building a mcp server with Zuplo using local
8
- development.
7
+ Expose a sample API as an MCP server with the Zuplo CLI and your editor, then
8
+ connect an MCP client and call a tool locally.
9
9
  ---
10
10
 
11
11
  <WizardSteps build="mcp-server" method="local" />
@@ -8,8 +8,8 @@ centered: false
8
8
  toc: false
9
9
  title: Getting Started with API Migration
10
10
  description:
11
- Import an OpenAPI document and put Zuplo in front of what you have with Zuplo,
12
- in the Portal, locally with the CLI, or with an AI agent.
11
+ Import an OpenAPI document, route requests through Zuplo, and compare them
12
+ with your existing backend in the Portal, locally, or with an AI agent.
13
13
  ---
14
14
 
15
15
  <WizardSteps build="migrate" />
@@ -26,9 +26,13 @@ Claude's connector settings, then complete the browser-based OAuth flow.
26
26
  ## Get the route URL
27
27
 
28
28
  Each MCP route in `config/routes.oas.json` is reachable at
29
- `https://{deploymentUrl}/{routePath}` once deployed (or
30
- `http://127.0.0.1:9000/{routePath}` when running locally with `zuplo dev`). The
31
- `{routePath}` is the path you set on the route — for example `/mcp/linear-v1`.
29
+ `https://{deploymentUrl}/{routePath}` once deployed. The `{routePath}` is the
30
+ path you set on the route — for example `/mcp/linear-v1`.
31
+
32
+ Native remote connectors connect from Anthropic's servers, so the gateway URL
33
+ must be reachable from those servers. For a gateway running locally with
34
+ `zuplo dev`, use the [manual configuration](#use-a-manual-config-file-advanced)
35
+ with `http://127.0.0.1:9000/{routePath}`.
32
36
 
33
37
  ## Add the connector in Claude
34
38
 
@@ -37,14 +41,12 @@ identical in each.
37
41
 
38
42
  <Stepper>
39
43
 
40
- 1. **Open connector settings.**
41
- - **Claude Desktop:** open **Settings** → **Connectors**.
42
- - **Claude.ai:** open **Settings** → **Connectors** in the web app.
44
+ 1. **Open connector settings.** In Claude Desktop or Claude.ai, open **Customize
45
+ → Connectors**.
43
46
 
44
47
  2. **Add a custom connector.**
45
48
 
46
- Scroll to the bottom of the Connectors list and click **Add custom
47
- connector**.
49
+ Click **+**, then **Add custom connector**.
48
50
 
49
51
  3. **Enter the gateway URL.**
50
52
 
@@ -76,7 +78,7 @@ identical in each.
76
78
  :::tip
77
79
 
78
80
  You can adjust which tools Claude is allowed to use per connector. Open the
79
- connector in Settings → Connectors and toggle individual tools on or off.
81
+ connector in Customize → Connectors and toggle individual tools on or off.
80
82
 
81
83
  :::
82
84
 
@@ -102,21 +104,22 @@ in addition to DCR.
102
104
  If you need to script the install or share the configuration with a team, Claude
103
105
  Desktop also reads `claude_desktop_config.json`. This approach uses
104
106
  [`mcp-remote`](https://www.npmjs.com/package/mcp-remote) as a stdio bridge to
105
- the remote gateway. Use it if your version of Claude Desktop doesn't yet support
106
- custom remote connectors natively, or if you want the connector to start
107
- automatically on every launch without going through the UI.
107
+ the gateway. Use it for a gateway running on your computer or when you need
108
+ file-based configuration. This approach requires Node.js and `npx`.
108
109
 
109
110
  1. In Claude Desktop, open **Settings** → **Developer** → **Edit Config**. This
110
111
  opens `claude_desktop_config.json` in your editor.
111
112
  2. Add or merge in the following entry, replacing `Zuplo MCP` with the name you
112
- want to show, and the URL with your route URL:
113
+ want to show, and the URL with your route URL. For local development, use
114
+ `http://127.0.0.1:9000/{routePath}` instead of the HTTPS URL and append
115
+ `"--allow-http"` to the `args` array:
113
116
 
114
117
  ```json title="claude_desktop_config.json"
115
118
  {
116
119
  "mcpServers": {
117
120
  "Zuplo MCP": {
118
121
  "command": "npx",
119
- "args": ["mcp-remote", "https://{deploymentUrl}/{routePath}"]
122
+ "args": ["-y", "mcp-remote", "https://{deploymentUrl}/{routePath}"]
120
123
  }
121
124
  }
122
125
  }
@@ -131,10 +134,9 @@ automatically on every launch without going through the UI.
131
134
 
132
135
  :::note
133
136
 
134
- The native custom-connector flow above is the recommended path because it
135
- supports all of Claude Desktop's MCP features out of the box and does not
136
- require Node.js. Use the `mcp-remote` bridge only when you specifically need the
137
- file-based configuration.
137
+ Use native custom connectors for a deployed gateway. They do not require
138
+ Node.js. Use the `mcp-remote` bridge for a local gateway or file-based
139
+ configuration.
138
140
 
139
141
  :::
140
142
 
@@ -148,7 +150,7 @@ file-based configuration.
148
150
  configured correctly and that browser cookies are enabled for the gateway
149
151
  origin.
150
152
  - **Tools do not appear after a successful authorization.** Open the connector
151
- in Settings → Connectors and check that each tool is enabled. Disabled tools
153
+ in Customize → Connectors and check that each tool is enabled. Disabled tools
152
154
  are hidden from the attachment menu.
153
155
 
154
156
  ## Related
@@ -119,7 +119,8 @@ tracks **what each client can consume**, not what the gateway forwards.
119
119
 
120
120
  ## Per-client guides
121
121
 
122
- - [Claude Desktop](./claude-desktop.mdx) — add via `claude_desktop_config.json`.
122
+ - [Claude Desktop and Claude.ai](./claude-desktop.mdx) — add a custom remote
123
+ connector. For a local gateway, use the Claude Desktop manual configuration.
123
124
  - [Claude Code](./claude-code.mdx) — add via the `claude mcp add` CLI command.
124
125
  - [ChatGPT](./chatgpt.mdx) — add via Settings → Connectors (Developer Mode
125
126
  required).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zuplo",
3
- "version": "7.8.8",
3
+ "version": "7.8.9",
4
4
  "type": "module",
5
5
  "description": "The official Zuplo CLI for local development and platform management",
6
6
  "homepage": "https://zuplo.com/docs/cli/overview",
@@ -32,9 +32,9 @@
32
32
  "zuplo": "zuplo.js"
33
33
  },
34
34
  "dependencies": {
35
- "@zuplo/cli": "7.8.8",
36
- "@zuplo/core": "7.8.8",
37
- "@zuplo/runtime": "7.8.8",
38
- "@zuplo/test": "7.8.8"
35
+ "@zuplo/cli": "7.8.9",
36
+ "@zuplo/core": "7.8.9",
37
+ "@zuplo/runtime": "7.8.9",
38
+ "@zuplo/test": "7.8.9"
39
39
  }
40
40
  }