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.
- package/docs/ai-gateway/integrations/claude-code.mdx +82 -180
- package/docs/ai-gateway/integrations/claude-desktop.mdx +61 -99
- package/docs/ai-gateway/integrations/codex.mdx +63 -57
- package/docs/articles/custom-domains.mdx +3 -2
- package/docs/articles/source-control.mdx +4 -3
- package/docs/articles/testing.mdx +5 -5
- package/docs/articles/upstream-iam-auth.mdx +2 -2
- package/docs/concepts/how-zuplo-works.mdx +2 -1
- package/docs/dev-portal/migration.mdx +2 -2
- package/docs/getting-started/dev-portal/index.mdx +2 -2
- package/docs/getting-started/gateway/add-api-key-auth/index.mdx +3 -0
- package/docs/getting-started/gateway/add-api-key-auth/local.mdx +3 -0
- package/docs/getting-started/gateway/add-rate-limiting/index.mdx +3 -0
- package/docs/getting-started/gateway/add-rate-limiting/local.mdx +3 -0
- package/docs/getting-started/gateway/agent.mdx +2 -1
- package/docs/getting-started/gateway/deploy-to-the-edge/index.mdx +3 -0
- package/docs/getting-started/gateway/deploy-to-the-edge/local.mdx +3 -0
- package/docs/getting-started/gateway/dynamic-rate-limiting/index.mdx +3 -0
- package/docs/getting-started/gateway/dynamic-rate-limiting/local.mdx +3 -0
- package/docs/getting-started/gateway/setup-a-basic-gateway/index.mdx +4 -1
- package/docs/getting-started/gateway/setup-a-basic-gateway/local.mdx +4 -1
- package/docs/getting-started/mcp-gateway/local.mdx +31 -9
- package/docs/getting-started/mcp-gateway/portal.mdx +8 -7
- package/docs/getting-started/mcp-server/local.mdx +2 -2
- package/docs/getting-started/migrate/index.mdx +2 -2
- package/docs/mcp-gateway/connect-clients/claude-desktop.mdx +21 -19
- package/docs/mcp-gateway/connect-clients/overview.mdx +2 -1
- package/package.json +5 -5
|
@@ -2,92 +2,70 @@
|
|
|
2
2
|
title: Claude Code
|
|
3
3
|
sidebar_label: Claude Code
|
|
4
4
|
description:
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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
|
|
14
|
-
configure Claude Code:
|
|
12
|
+
The gateway authenticates to Anthropic in one of two ways:
|
|
15
13
|
|
|
16
|
-
| Approach
|
|
17
|
-
|
|
|
18
|
-
| [
|
|
19
|
-
| [
|
|
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
|
-
|
|
22
|
-
configuration.
|
|
23
|
-
|
|
24
|
-
## Claude Code Setup
|
|
19
|
+
## Prerequisites
|
|
25
20
|
|
|
26
21
|
<Stepper>
|
|
27
22
|
|
|
28
|
-
1. Create
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
29
|
+
3. [Create an app](../managing-apps.mdx) for Claude Code and assign it to the
|
|
30
|
+
team.
|
|
41
31
|
|
|
42
|
-
|
|
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
|
-
|
|
36
|
+
## Configure Claude Code
|
|
49
37
|
|
|
50
|
-
:::warning
|
|
38
|
+
:::warning{title="Replace the provider name"}
|
|
51
39
|
|
|
52
|
-
The examples
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
132
|
-
|
|
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.
|
|
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
|
-
|
|
109
|
+
2. Set **authHeader** to `zp-gateway-api-key`.
|
|
154
110
|
|
|
155
|
-
|
|
156
|
-
The field
|
|
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
|
-
|
|
114
|
+
4. Click **Apply**, then **Save changes**.
|
|
162
115
|
|
|
163
116
|
</Stepper>
|
|
164
117
|
|
|
165
|
-
|
|
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
|
-
###
|
|
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
|
|
188
|
-
|
|
189
|
-
|
|
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
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
6
|
-
|
|
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)
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
##
|
|
16
|
+
## Prerequisites
|
|
18
17
|
|
|
19
18
|
<Stepper>
|
|
20
19
|
|
|
21
|
-
1. Create
|
|
22
|
-
Anthropic
|
|
20
|
+
1. Create an Anthropic [provider](../managing-providers.mdx) in the AI Gateway.
|
|
23
21
|
|
|
24
|
-
2. [
|
|
22
|
+
2. [Create a team](../managing-teams.mdx).
|
|
25
23
|
|
|
26
|
-
3. Create
|
|
27
|
-
|
|
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**
|
|
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
|
-
|
|
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.
|
|
61
|
-
|
|
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.
|
|
40
|
+
3. Under **Connection**, set **Inference provider** to **Gateway**.
|
|
66
41
|
|
|
67
|
-
4.
|
|
68
|
-
|
|
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.
|
|
76
|
-
|
|
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
|
|
79
|
-
relaunches
|
|
53
|
+
7. Click **Apply locally**. Claude Desktop saves the configuration and
|
|
54
|
+
relaunches.
|
|
80
55
|
|
|
81
56
|
</Stepper>
|
|
82
57
|
|
|
83
|
-
|
|
58
|
+
### Rules
|
|
84
59
|
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
:::
|
|
69
|
+
:::warning{title="Replace the provider name"}
|
|
91
70
|
|
|
92
|
-
The
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
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
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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.
|
|
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
|
|
118
|
-
|
|
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
|
|
130
|
-
|
|
131
|
-
### Verify the configuration
|
|
97
|
+
policy controls which models the app can use.
|
|
132
98
|
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
112
|
+
## Deploy to a fleet
|
|
148
113
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
|
10
|
-
|
|
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 [
|
|
22
|
-
provider you want to use with Codex
|
|
14
|
+
1. Create a [provider](../managing-providers.mdx) in the AI Gateway.
|
|
23
15
|
|
|
24
|
-
2. [
|
|
16
|
+
2. [Create a team](../managing-teams.mdx).
|
|
25
17
|
|
|
26
|
-
3. Create
|
|
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**
|
|
20
|
+
4. Copy the **API URL** and **API Key** from the app page.
|
|
30
21
|
|
|
31
22
|
</Stepper>
|
|
32
23
|
|
|
33
|
-
## Configure Codex
|
|
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
|
-
|
|
42
|
-
selected in the Codex configuration and work with any OpenAI compatible
|
|
43
|
-
models
|
|
26
|
+
:::warning{title="Replace the provider name"}
|
|
44
27
|
|
|
45
|
-
|
|
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
|
-
|
|
33
|
+
:::
|
|
48
34
|
|
|
49
|
-
|
|
50
|
-
`~/.codex
|
|
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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
63
|
-
|
|
49
|
+
- `base_url` is the app's API URL with `/v1` appended.
|
|
50
|
+
- `model` is `providerName/model`.
|
|
64
51
|
|
|
65
|
-
|
|
52
|
+
Set the API key in your environment:
|
|
66
53
|
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
policy controls which models the app can use.
|
|
87
|
+
|
|
88
|
+
## Verify
|
|
91
89
|
|
|
92
90
|
```bash
|
|
93
|
-
codex
|
|
91
|
+
codex exec "Reply with the single word OK"
|
|
94
92
|
```
|
|
95
93
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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
|
-
|
|
69
|
-
main environment. Push to `feature-auth` and get a
|
|
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
|
-
|
|
144
|
-
preview environment
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
|
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
|
-
|
|
129
|
-
|
|
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
|
|
12
|
-
|
|
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.
|
|
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:
|
|
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:
|
|
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
|
-
|
|
8
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
`
|
|
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
|
|
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
|
|
238
|
-
|
|
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
|
-
|
|
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**
|
|
159
|
-
|
|
160
|
-
|
|
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 **
|
|
244
|
-
|
|
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 **
|
|
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
|
-
|
|
8
|
-
|
|
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
|
|
12
|
-
in the Portal, locally
|
|
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
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
106
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
36
|
-
"@zuplo/core": "7.8.
|
|
37
|
-
"@zuplo/runtime": "7.8.
|
|
38
|
-
"@zuplo/test": "7.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
|
}
|