zuplo 6.69.9 → 6.69.11
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/apps.mdx +5 -5
- package/docs/ai-gateway/custom-providers.mdx +6 -5
- package/docs/ai-gateway/getting-started.mdx +2 -1
- package/docs/ai-gateway/guardrails.mdx +2 -2
- package/docs/ai-gateway/managing-apps.mdx +10 -8
- package/docs/ai-gateway/managing-providers.mdx +9 -7
- package/docs/ai-gateway/managing-teams.mdx +4 -4
- package/docs/ai-gateway/usage-limits.mdx +8 -5
- package/docs/articles/accounts/audit-logs.mdx +3 -5
- package/docs/articles/accounts/billing.mdx +9 -5
- package/docs/articles/accounts/default-api-key.mdx +4 -5
- package/docs/articles/accounts/delete-account.mdx +11 -11
- package/docs/articles/accounts/enterprise-sso.mdx +5 -3
- package/docs/articles/accounts/managing-account-members.mdx +3 -3
- package/docs/articles/accounts/zuplo-api-keys.mdx +8 -6
- package/docs/articles/api-key-administration.mdx +8 -5
- package/docs/articles/api-key-end-users.mdx +4 -3
- package/docs/articles/api-key-self-serve-integration.mdx +8 -4
- package/docs/articles/branch-based-deployments.mdx +7 -4
- package/docs/articles/custom-ci-cd-azure.mdx +3 -2
- package/docs/articles/custom-ci-cd-bitbucket.mdx +3 -2
- package/docs/articles/custom-ci-cd-circleci.mdx +4 -2
- package/docs/articles/custom-ci-cd-github.mdx +5 -3
- package/docs/articles/custom-ci-cd-gitlab.mdx +3 -2
- package/docs/articles/custom-ci-cd.mdx +6 -8
- package/docs/articles/custom-domains.mdx +8 -6
- package/docs/articles/environments.mdx +5 -2
- package/docs/articles/mcp-quickstart.mdx +2 -2
- package/docs/articles/migrate-from-kong.md +2 -2
- package/docs/articles/monetization/api-access.mdx +3 -2
- package/docs/articles/monetization/billing-models.md +137 -31
- package/docs/articles/monetization/developer-portal.md +7 -3
- package/docs/articles/monetization/features.mdx +0 -28
- package/docs/articles/monetization/meters.mdx +14 -7
- package/docs/articles/monetization/plans.mdx +1 -3
- package/docs/articles/monetization/pricing-models.mdx +21 -7
- package/docs/articles/monetization/private-plans.md +0 -1
- package/docs/articles/monetization/quickstart.md +4 -2
- package/docs/articles/monetization/rate-cards.mdx +40 -7
- package/docs/articles/monetization/stripe-integration.md +16 -12
- package/docs/articles/monetization/subscription-lifecycle.md +4 -4
- package/docs/articles/monorepo-deployment.mdx +2 -3
- package/docs/articles/source-control-setup-github.mdx +6 -4
- package/docs/articles/step-1-setup-basic-gateway.mdx +3 -3
- package/docs/articles/step-3-add-api-key-auth-local.mdx +4 -3
- package/docs/articles/step-3-add-api-key-auth.mdx +3 -2
- package/docs/articles/step-4-deploying-to-the-edge.mdx +6 -4
- package/docs/articles/testing.mdx +4 -3
- package/docs/articles/troubleshooting.md +7 -4
- package/docs/cli/authentication.mdx +4 -2
- package/docs/cli/bucket-list.mdx +71 -0
- package/docs/cli/deploy.mdx +2 -1
- package/docs/cli/deploy.partial.mdx +2 -1
- package/docs/cli/logout.mdx +25 -0
- package/docs/concepts/api-keys.md +9 -8
- package/docs/concepts/authentication.mdx +3 -2
- package/docs/concepts/source-control-and-deployment.mdx +3 -1
- package/docs/dev-portal/documenting-mcp-servers.mdx +223 -0
- package/docs/dev-portal/zudoku/openapi-extensions/x-mcp-server.md +1 -1
- package/docs/guides/canary-routing-for-employees.mdx +3 -1
- package/docs/guides/user-based-backend-routing.mdx +3 -2
- package/docs/policies/api-key-inbound/schema.json +5 -0
- package/docs/programmable-api/environment.mdx +6 -5
- package/docs/programmable-api/zuplo-context.mdx +3 -3
- package/package.json +4 -4
|
@@ -42,7 +42,9 @@ in Stripe at the moment a charge is needed (as invoice line items).
|
|
|
42
42
|
|
|
43
43
|
### Via the Zuplo Portal
|
|
44
44
|
|
|
45
|
-
1.
|
|
45
|
+
1. Open your project's
|
|
46
|
+
[**Services**](https://portal.zuplo.com/+/account/project/services) page,
|
|
47
|
+
select the Monetization Service, then go to **Payment Provider**
|
|
46
48
|
2. Click **Configure** on the Stripe card
|
|
47
49
|
3. Enter a **Name** and paste your **Stripe API Key**
|
|
48
50
|
4. Click **Save**
|
|
@@ -111,8 +113,10 @@ Intents, Refunds, or Stripe Billing Meters — leave all of those at **None**.
|
|
|
111
113
|
or `Zuplo Monetization (production)`.
|
|
112
114
|
3. For each of the eight permissions above, set the level shown in the table.
|
|
113
115
|
4. Click **Create key**, copy the value (`rk_test_...` or `rk_live_...`), and
|
|
114
|
-
paste it into
|
|
115
|
-
|
|
116
|
+
paste it into the Monetization Service's **Payment Provider** screen (open
|
|
117
|
+
your project's
|
|
118
|
+
[**Services**](https://portal.zuplo.com/+/account/project/services) page,
|
|
119
|
+
then the Monetization Service) in your Zuplo project.
|
|
116
120
|
|
|
117
121
|
:::caution
|
|
118
122
|
|
|
@@ -208,22 +212,22 @@ When a customer cancels through the Developer Portal, the timing of the
|
|
|
208
212
|
cancellation depends on whether the current phase has billable items:
|
|
209
213
|
|
|
210
214
|
- **Paid phases** — the portal sends `timing: "next_billing_cycle"`. The
|
|
211
|
-
subscription is scheduled to cancel at the end of the current billing
|
|
212
|
-
|
|
213
|
-
|
|
215
|
+
subscription is scheduled to cancel at the end of the current billing period,
|
|
216
|
+
the customer retains access until then, and the API key stops working at
|
|
217
|
+
period end.
|
|
214
218
|
- **Free phases** — the portal sends `timing: "immediate"`. With nothing to
|
|
215
219
|
invoice at period end, there's no billing period to wait out, so the
|
|
216
220
|
subscription cancels and access is revoked right away. Two situations fall
|
|
217
221
|
into this branch:
|
|
218
|
-
- The customer is on a **free trial phase** (the first phase of a plan
|
|
219
|
-
|
|
220
|
-
- The customer is on a **free plan** — a plan whose only phase has no
|
|
221
|
-
|
|
222
|
+
- The customer is on a **free trial phase** (the first phase of a plan with a
|
|
223
|
+
later paid phase) and cancels before the trial converts.
|
|
224
|
+
- The customer is on a **free plan** — a plan whose only phase has no billable
|
|
225
|
+
rate cards (every rate card's `price` is `null`).
|
|
222
226
|
|
|
223
227
|
For programmatic cancellation, see
|
|
224
228
|
[Cancellation](./subscription-lifecycle.md#cancellation) in the Subscription
|
|
225
|
-
Lifecycle guide — the API endpoint accepts a `timing` parameter to control
|
|
226
|
-
|
|
229
|
+
Lifecycle guide — the API endpoint accepts a `timing` parameter to control this
|
|
230
|
+
same behavior explicitly.
|
|
227
231
|
|
|
228
232
|
## Proration
|
|
229
233
|
|
|
@@ -104,9 +104,9 @@ API is needed.
|
|
|
104
104
|
"rateCards": [
|
|
105
105
|
{
|
|
106
106
|
"type": "flat_fee",
|
|
107
|
-
"key": "
|
|
107
|
+
"key": "api_requests",
|
|
108
108
|
"name": "API Calls",
|
|
109
|
-
"featureKey": "
|
|
109
|
+
"featureKey": "api_requests",
|
|
110
110
|
"billingCadence": null,
|
|
111
111
|
"price": null,
|
|
112
112
|
"entitlementTemplate": {
|
|
@@ -124,9 +124,9 @@ API is needed.
|
|
|
124
124
|
"rateCards": [
|
|
125
125
|
{
|
|
126
126
|
"type": "usage_based",
|
|
127
|
-
"key": "
|
|
127
|
+
"key": "api_requests",
|
|
128
128
|
"name": "API Calls",
|
|
129
|
-
"featureKey": "
|
|
129
|
+
"featureKey": "api_requests",
|
|
130
130
|
"billingCadence": "P1M",
|
|
131
131
|
"price": {
|
|
132
132
|
"type": "tiered",
|
|
@@ -220,8 +220,7 @@ jobs:
|
|
|
220
220
|
|
|
221
221
|
Store your Zuplo API key as a GitHub Actions secret:
|
|
222
222
|
|
|
223
|
-
1.
|
|
224
|
-
account **Settings** > **API Keys**
|
|
223
|
+
1. In the Zuplo Portal, navigate to your account **Settings** > **API Keys**
|
|
225
224
|
2. Copy the API key
|
|
226
225
|
3. In your GitHub repository, go to **Settings** > **Secrets and variables** >
|
|
227
226
|
**Actions**
|
|
@@ -322,7 +321,7 @@ the deployed environment. Timeouts can indicate:
|
|
|
322
321
|
`routes.oas.json` or `policies.json` exist in the `modules/` directory
|
|
323
322
|
- **Missing environment variables** — If your policies or handlers reference
|
|
324
323
|
environment variables with `$env(VAR_NAME)`, make sure those variables are
|
|
325
|
-
configured in the Zuplo
|
|
324
|
+
configured in the Zuplo Portal under your project's
|
|
326
325
|
[environment variables](./environment-variables.mdx)
|
|
327
326
|
|
|
328
327
|
### Build succeeds but deploy fails
|
|
@@ -18,10 +18,12 @@ new Zuplo project.
|
|
|
18
18
|
|
|
19
19
|
1. Connect to GitHub
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
the
|
|
24
|
-
|
|
21
|
+
Open your
|
|
22
|
+
[project settings](https://portal.zuplo.com/+/account/project/settings/general)
|
|
23
|
+
in the Zuplo Portal, then select **Source Control**. If your project isn't
|
|
24
|
+
already connected to GitHub click the **Connect to GitHub** button and follow
|
|
25
|
+
the auth flow. You'll need to grant permissions for any GitHub organizations
|
|
26
|
+
you want to work with.
|
|
25
27
|
|
|
26
28
|

|
|
27
29
|
|
|
@@ -18,9 +18,9 @@ Note - Zuplo also supports building and running your API locally. To learn more
|
|
|
18
18
|
|
|
19
19
|
1. **Sign-in**
|
|
20
20
|
|
|
21
|
-
Sign in to
|
|
22
|
-
|
|
23
|
-
we'll set up git later). Then...
|
|
21
|
+
Sign in to the Zuplo Portal and create a free account. Then
|
|
22
|
+
[create a new empty project](https://portal.zuplo.com/+/account/projects/new)
|
|
23
|
+
(don't import an existing project, we'll set up git later). Then...
|
|
24
24
|
|
|
25
25
|
1. Add your first **Route**
|
|
26
26
|
|
|
@@ -102,9 +102,10 @@ Let's get started.
|
|
|
102
102
|
|
|
103
103
|
1. Set up an API Key
|
|
104
104
|
|
|
105
|
-
In order to call your API, you need to configure an API consumer.
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
In order to call your API, you need to configure an API consumer. In the
|
|
106
|
+
Zuplo Portal, open the
|
|
107
|
+
[**Services**](https://portal.zuplo.com/+/account/project/services) tab for
|
|
108
|
+
your project, then click **Configure** on the "API Key Service".
|
|
108
109
|
|
|
109
110
|
:::warning
|
|
110
111
|
|
|
@@ -69,8 +69,9 @@ Let's get started.
|
|
|
69
69
|
|
|
70
70
|
2. Set up an API Key
|
|
71
71
|
|
|
72
|
-
In order to call your API, you need to configure an API consumer.
|
|
73
|
-
**Services
|
|
72
|
+
In order to call your API, you need to configure an API consumer. Open the
|
|
73
|
+
[**Services**](https://portal.zuplo.com/+/account/project/services) tab in
|
|
74
|
+
your project, then click **Configure** on the "API Key Service".
|
|
74
75
|
|
|
75
76
|

|
|
76
77
|
|
|
@@ -30,10 +30,12 @@ Let's get started:
|
|
|
30
30
|
|
|
31
31
|
1. Authorize to GitHub
|
|
32
32
|
|
|
33
|
-
Next,
|
|
34
|
-
|
|
35
|
-
the
|
|
36
|
-
|
|
33
|
+
Next, open your
|
|
34
|
+
[project settings](https://portal.zuplo.com/+/account/project/settings/general)
|
|
35
|
+
in the Zuplo Portal, then select **Source Control**. If your project isn't
|
|
36
|
+
already connected to GitHub click the **Connect to GitHub** button and follow
|
|
37
|
+
the auth flow. You'll need to grant permissions for any GitHub organizations
|
|
38
|
+
you want to work with.
|
|
37
39
|
|
|
38
40
|

|
|
39
41
|
|
|
@@ -78,9 +78,10 @@ The `.env.zuplo` file can contain sensitive information. Add it to your
|
|
|
78
78
|
:::
|
|
79
79
|
|
|
80
80
|
Once linked, services like the API Key Authentication policy work locally using
|
|
81
|
-
the same API key bucket as the linked environment.
|
|
82
|
-
|
|
83
|
-
Key Service
|
|
81
|
+
the same API key bucket as the linked environment. In the Zuplo Portal, open the
|
|
82
|
+
[**Services**](https://portal.zuplo.com/+/account/project/services) tab in your
|
|
83
|
+
project and select **API Key Service** to create API key consumers, then call
|
|
84
|
+
your local gateway with the generated key:
|
|
84
85
|
|
|
85
86
|
```bash
|
|
86
87
|
curl http://localhost:9000/your-route \
|
|
@@ -79,7 +79,9 @@ arrays.
|
|
|
79
79
|
The gateway returns this error when the project has a critical configuration
|
|
80
80
|
issue that prevents it from starting.
|
|
81
81
|
|
|
82
|
-
**Fix:** Check the deployment logs in the Zuplo Portal
|
|
82
|
+
**Fix:** Check the deployment logs in the Zuplo Portal — open the
|
|
83
|
+
[**Environments**](https://portal.zuplo.com/+/account/project/environments) tab
|
|
84
|
+
in your project and select the failing environment to see the specific error
|
|
83
85
|
message. Common causes include invalid `zuplo.runtime.ts` configuration or
|
|
84
86
|
broken runtime extensions.
|
|
85
87
|
|
|
@@ -174,9 +176,10 @@ const response = await fetch("https://api.example.com/data", {
|
|
|
174
176
|
|
|
175
177
|
### Portal live logs
|
|
176
178
|
|
|
177
|
-
The Zuplo Portal provides real-time log viewing for deployed environments.
|
|
178
|
-
|
|
179
|
-
|
|
179
|
+
The Zuplo Portal provides real-time log viewing for deployed environments. Open
|
|
180
|
+
the [**Environments**](https://portal.zuplo.com/+/account/project/environments)
|
|
181
|
+
tab in your project, select the deployed environment, and open the logs tab to
|
|
182
|
+
see live request logs and any messages logged with `context.log`.
|
|
180
183
|
|
|
181
184
|
### Using context.log
|
|
182
185
|
|
|
@@ -37,8 +37,10 @@ following these steps:
|
|
|
37
37
|
|
|
38
38
|
1. Navigate to [portal.zuplo.com](https://portal.zuplo.com) and log in.
|
|
39
39
|
2. Select the account that you want to work on.
|
|
40
|
-
3.
|
|
41
|
-
|
|
40
|
+
3. Navigate to
|
|
41
|
+
[**Settings → API Keys**](https://portal.zuplo.com/+/account/settings/api-keys)
|
|
42
|
+
in your account. Select an existing API Key or create a new one to use with
|
|
43
|
+
the CLI.
|
|
42
44
|
|
|
43
45
|
Most commands take an `--api-key` argument. For example, to list your available
|
|
44
46
|
Zuplo API Gateways, run:
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Zuplo CLI: Bucket List"
|
|
3
|
+
sidebar_label: bucket list
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<CliCommand
|
|
7
|
+
command="bucket list"
|
|
8
|
+
description="Lists the buckets in your account"
|
|
9
|
+
options={[
|
|
10
|
+
{
|
|
11
|
+
"name": "account",
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "The account name",
|
|
14
|
+
"required": false,
|
|
15
|
+
"deprecated": false,
|
|
16
|
+
"hidden": false
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "project",
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Filter buckets by project name",
|
|
22
|
+
"required": false,
|
|
23
|
+
"deprecated": false,
|
|
24
|
+
"hidden": false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "output",
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "Output format",
|
|
30
|
+
"default": "default",
|
|
31
|
+
"required": false,
|
|
32
|
+
"deprecated": false,
|
|
33
|
+
"hidden": false,
|
|
34
|
+
"alias": [
|
|
35
|
+
"o"
|
|
36
|
+
],
|
|
37
|
+
"choices": [
|
|
38
|
+
"default",
|
|
39
|
+
"json"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
]}
|
|
43
|
+
examples={[
|
|
44
|
+
[
|
|
45
|
+
"$0 bucket list",
|
|
46
|
+
"List all buckets in your account"
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
"$0 bucket list --output json",
|
|
50
|
+
"List all buckets as JSON"
|
|
51
|
+
],
|
|
52
|
+
[
|
|
53
|
+
"$0 bucket list --account my-account",
|
|
54
|
+
"Explicitly specify the account"
|
|
55
|
+
],
|
|
56
|
+
[
|
|
57
|
+
"$0 bucket list --project my-project",
|
|
58
|
+
"Filter buckets by project name"
|
|
59
|
+
]
|
|
60
|
+
]}
|
|
61
|
+
usage="$0 bucket list [options]"
|
|
62
|
+
>
|
|
63
|
+
|
|
64
|
+
</CliCommand>
|
|
65
|
+
|
|
66
|
+
## Global options
|
|
67
|
+
|
|
68
|
+
The following global options are available for all commands:
|
|
69
|
+
|
|
70
|
+
- [`--help`](./global-options.mdx#help)
|
|
71
|
+
- [`--api-key`](./global-options.mdx#api-key)
|
package/docs/cli/deploy.mdx
CHANGED
|
@@ -140,7 +140,8 @@ POLL_INTERVAL=5000 MAX_POLL_RETRIES=300 zuplo deploy
|
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
Note, that even if the CLI times out, the deployment will continue. You can
|
|
143
|
-
check the status of the deployment in
|
|
143
|
+
check the status of the deployment in your
|
|
144
|
+
[project](https://portal.zuplo.com/+/account/project/) in the Zuplo Portal.
|
|
144
145
|
|
|
145
146
|
</CliCommand>
|
|
146
147
|
|
|
@@ -43,4 +43,5 @@ POLL_INTERVAL=5000 MAX_POLL_RETRIES=300 zuplo deploy
|
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
Note, that even if the CLI times out, the deployment will continue. You can
|
|
46
|
-
check the status of the deployment in
|
|
46
|
+
check the status of the deployment in your
|
|
47
|
+
[project](https://portal.zuplo.com/+/account/project/) in the Zuplo Portal.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Zuplo CLI: Logout"
|
|
3
|
+
sidebar_label: logout
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<CliCommand
|
|
7
|
+
command="logout"
|
|
8
|
+
description="Logs the current user out if logged in"
|
|
9
|
+
examples={[
|
|
10
|
+
[
|
|
11
|
+
"$0 logout",
|
|
12
|
+
"Remove locally stored Zuplo credentials"
|
|
13
|
+
]
|
|
14
|
+
]}
|
|
15
|
+
usage="$0 logout"
|
|
16
|
+
>
|
|
17
|
+
|
|
18
|
+
</CliCommand>
|
|
19
|
+
|
|
20
|
+
## Global options
|
|
21
|
+
|
|
22
|
+
The following global options are available for all commands:
|
|
23
|
+
|
|
24
|
+
- [`--help`](./global-options.mdx#help)
|
|
25
|
+
- [`--api-key`](./global-options.mdx#api-key)
|
|
@@ -23,7 +23,8 @@ The API key system has three core objects:
|
|
|
23
23
|
See [API Key Management](../articles/api-key-management.mdx) for a full
|
|
24
24
|
overview, and
|
|
25
25
|
[Manage Keys in the Portal](../articles/api-key-administration.mdx) for managing
|
|
26
|
-
consumers
|
|
26
|
+
consumers under [Services](https://portal.zuplo.com/+/account/project/services)
|
|
27
|
+
in your project.
|
|
27
28
|
|
|
28
29
|
## How validation works
|
|
29
30
|
|
|
@@ -76,8 +77,8 @@ when the consumer's key is used. Common uses:
|
|
|
76
77
|
backend
|
|
77
78
|
- **Organization**: `{"orgId": 456}` for multi-tenant routing
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
[portal](
|
|
80
|
+
Set metadata when creating a consumer via the
|
|
81
|
+
[portal](https://portal.zuplo.com/+/account/project/services),
|
|
81
82
|
[Developer API](../articles/api-key-api.mdx), or
|
|
82
83
|
[developer portal self-serve](#self-serve-key-management).
|
|
83
84
|
|
|
@@ -173,11 +174,11 @@ self-serve API key management. Your API consumers can sign in to the portal and
|
|
|
173
174
|
create, view, and delete their own keys without contacting your team.
|
|
174
175
|
|
|
175
176
|
To enable self-serve access, assign a **manager** to a consumer. Managers are
|
|
176
|
-
identified by email and identity provider subject.
|
|
177
|
-
|
|
178
|
-
when a user signs
|
|
179
|
-
[Auth0](../dev-portal/dev-portal-create-consumer-on-auth.mdx) or
|
|
180
|
-
identity provider.
|
|
177
|
+
identified by email and identity provider subject. You can assign a manager in
|
|
178
|
+
the [portal](https://portal.zuplo.com/+/account/project/services), via the
|
|
179
|
+
[Developer API](../articles/api-key-api.mdx), or automatically when a user signs
|
|
180
|
+
in using [Auth0](../dev-portal/dev-portal-create-consumer-on-auth.mdx) or
|
|
181
|
+
another identity provider.
|
|
181
182
|
|
|
182
183
|
## Buckets and environments
|
|
183
184
|
|
|
@@ -48,8 +48,9 @@ reference.
|
|
|
48
48
|
|
|
49
49
|
Zuplo's built-in [API key management](../articles/api-key-management.mdx)
|
|
50
50
|
provides a complete system for issuing, managing, and validating API keys.
|
|
51
|
-
|
|
52
|
-
portal
|
|
51
|
+
Create consumers (API key holders) under
|
|
52
|
+
[**Services**](https://portal.zuplo.com/+/account/project/services) in your
|
|
53
|
+
project, via the API, or via developer portal self-serve.
|
|
53
54
|
|
|
54
55
|
Best for: B2B APIs, developer platforms, and any API where you manage consumer
|
|
55
56
|
access.
|
|
@@ -210,7 +210,9 @@ The typical workflow from development to production looks like this:
|
|
|
210
210
|
<DiagramEdge from="merge" to="production" />
|
|
211
211
|
</Diagram>
|
|
212
212
|
|
|
213
|
-
1. **Develop** locally with `zuplo dev` or in
|
|
213
|
+
1. **Develop** locally with `zuplo dev` or in your
|
|
214
|
+
[project's working copy](https://portal.zuplo.com/+/account/project/) in the
|
|
215
|
+
Zuplo Portal.
|
|
214
216
|
2. **Push** your changes to a feature branch. If using GitHub, a Preview
|
|
215
217
|
environment deploys automatically. If using another provider, your CI/CD
|
|
216
218
|
pipeline runs `zuplo deploy`.
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Documenting MCP Servers
|
|
3
|
+
sidebar_label: Documenting MCP Servers
|
|
4
|
+
navigation_icon: bot
|
|
5
|
+
description:
|
|
6
|
+
Use the x-mcp-server OpenAPI extension to render an MCP setup card in the Dev
|
|
7
|
+
Portal for external or proxied MCP servers.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
The Dev Portal renders a dedicated
|
|
11
|
+
[Model Context Protocol (MCP)](https://modelcontextprotocol.io/) setup UI for
|
|
12
|
+
any OpenAPI operation that includes the `x-mcp-server` extension. The card
|
|
13
|
+
replaces the standard request/response view with the MCP endpoint URL, a copy
|
|
14
|
+
button, and tabbed installation instructions for Claude, ChatGPT, Cursor, VS
|
|
15
|
+
Code, and a generic config.
|
|
16
|
+
|
|
17
|
+
:::tip{title="Building an MCP server on Zuplo?"}
|
|
18
|
+
|
|
19
|
+
If your MCP server uses Zuplo's
|
|
20
|
+
[MCP Server Handler](/docs/handlers/mcp-server.mdx), the `x-mcp-server`
|
|
21
|
+
extension is added to your OpenAPI spec automatically. Skip this guide — there
|
|
22
|
+
is nothing to configure. See the
|
|
23
|
+
[MCP Server overview](/docs/mcp-server/introduction.mdx) for the build path.
|
|
24
|
+
|
|
25
|
+
:::
|
|
26
|
+
|
|
27
|
+
## When to use this guide
|
|
28
|
+
|
|
29
|
+
Use this guide when you want to surface an MCP server in your Dev Portal that
|
|
30
|
+
you are **not** building with Zuplo's MCP Server Handler. Common scenarios:
|
|
31
|
+
|
|
32
|
+
- You proxy a third-party MCP server through a Zuplo route (for example, with a
|
|
33
|
+
[URL forward](/docs/handlers/url-forward.mdx) or
|
|
34
|
+
[custom handler](/docs/handlers/custom-handler.mdx)) and want to publish setup
|
|
35
|
+
instructions for it.
|
|
36
|
+
- You hand-author an OpenAPI spec for an MCP server hosted outside Zuplo.
|
|
37
|
+
- You catalog multiple MCP servers — some yours, some external — in a single Dev
|
|
38
|
+
Portal.
|
|
39
|
+
|
|
40
|
+
In every case, this guide covers only the **documentation** side: how the Dev
|
|
41
|
+
Portal renders the MCP card. Authentication, rate limiting, and any other
|
|
42
|
+
gateway behavior is configured on the underlying route as usual.
|
|
43
|
+
|
|
44
|
+
## Adding the extension
|
|
45
|
+
|
|
46
|
+
Add `x-mcp-server` to the operation that represents the MCP endpoint. MCP
|
|
47
|
+
servers typically use `POST`, but the extension works on any HTTP method.
|
|
48
|
+
|
|
49
|
+
```json title="openapi.json"
|
|
50
|
+
{
|
|
51
|
+
"paths": {
|
|
52
|
+
"/mcp": {
|
|
53
|
+
"post": {
|
|
54
|
+
"summary": "Acme Docs MCP",
|
|
55
|
+
"description": "MCP endpoint for searching Acme's documentation.",
|
|
56
|
+
"operationId": "acmeDocsMcp",
|
|
57
|
+
"x-mcp-server": {
|
|
58
|
+
"name": "acme-docs",
|
|
59
|
+
"version": "1.0.0",
|
|
60
|
+
"tools": [
|
|
61
|
+
{
|
|
62
|
+
"name": "search_docs",
|
|
63
|
+
"description": "Search the documentation"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "get_page",
|
|
67
|
+
"description": "Retrieve a specific documentation page"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"responses": {
|
|
72
|
+
"200": {
|
|
73
|
+
"description": "MCP response"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
For a quick setup with no metadata, use the shorthand `"x-mcp-server": true`.
|
|
83
|
+
The operation `summary` is then used as the server name.
|
|
84
|
+
|
|
85
|
+
## Extension properties
|
|
86
|
+
|
|
87
|
+
| Property | Type | Required | Description |
|
|
88
|
+
| --------- | -------- | -------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
89
|
+
| `name` | `string` | No | Display name used in the generated client config snippets. Falls back to the operation `summary`, then `mcp-server`. |
|
|
90
|
+
| `version` | `string` | No | Version metadata. Included for completeness; not currently rendered in the UI. |
|
|
91
|
+
| `tools` | `array` | No | Tool metadata. Used by Zuplo enrichment; not currently rendered in the UI. |
|
|
92
|
+
|
|
93
|
+
Each entry in `tools` accepts:
|
|
94
|
+
|
|
95
|
+
| Property | Type | Required | Description |
|
|
96
|
+
| ------------- | -------- | -------- | ------------------------------- |
|
|
97
|
+
| `name` | `string` | Yes | Tool name |
|
|
98
|
+
| `description` | `string` | No | Human-readable tool description |
|
|
99
|
+
|
|
100
|
+
## MCP URL resolution
|
|
101
|
+
|
|
102
|
+
The displayed MCP URL is constructed from the **server URL** of the API plus the
|
|
103
|
+
**path** of the operation. The server URL comes from the OpenAPI `servers` array
|
|
104
|
+
(or the operation-level `servers` override, when present).
|
|
105
|
+
|
|
106
|
+
For example:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"servers": [{ "url": "https://api.example.com" }],
|
|
111
|
+
"paths": {
|
|
112
|
+
"/mcp/docs": {
|
|
113
|
+
"post": {
|
|
114
|
+
"x-mcp-server": { "name": "docs-mcp" },
|
|
115
|
+
"responses": { "200": { "description": "OK" } }
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The displayed MCP URL is `https://api.example.com/mcp/docs`. Make sure the
|
|
123
|
+
server URL points to wherever the MCP server actually accepts requests — for
|
|
124
|
+
proxied servers, that is typically your Zuplo gateway URL.
|
|
125
|
+
|
|
126
|
+
## Complete example
|
|
127
|
+
|
|
128
|
+
This minimal but complete OpenAPI spec produces an MCP endpoint page in the Dev
|
|
129
|
+
Portal:
|
|
130
|
+
|
|
131
|
+
```json title="mcp-api.json"
|
|
132
|
+
{
|
|
133
|
+
"openapi": "3.0.3",
|
|
134
|
+
"info": {
|
|
135
|
+
"title": "Acme Docs MCP",
|
|
136
|
+
"version": "1.0.0"
|
|
137
|
+
},
|
|
138
|
+
"servers": [
|
|
139
|
+
{
|
|
140
|
+
"url": "https://api.example.com",
|
|
141
|
+
"description": "Production"
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
"paths": {
|
|
145
|
+
"/mcp": {
|
|
146
|
+
"post": {
|
|
147
|
+
"tags": ["MCP"],
|
|
148
|
+
"summary": "Acme Docs MCP",
|
|
149
|
+
"description": "MCP endpoint for searching Acme's documentation.",
|
|
150
|
+
"operationId": "acmeDocsMcp",
|
|
151
|
+
"x-mcp-server": {
|
|
152
|
+
"name": "acme-docs",
|
|
153
|
+
"version": "1.0.0",
|
|
154
|
+
"tools": [
|
|
155
|
+
{
|
|
156
|
+
"name": "search_docs",
|
|
157
|
+
"description": "Search the documentation"
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"responses": {
|
|
162
|
+
"200": {
|
|
163
|
+
"description": "MCP response"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Reference the spec from your Dev Portal config (see
|
|
173
|
+
[API Reference](./zudoku/configuration/api-reference.md) for the full `apis`
|
|
174
|
+
configuration):
|
|
175
|
+
|
|
176
|
+
```tsx title="zudoku.config.tsx"
|
|
177
|
+
import type { ZudokuConfig } from "zudoku";
|
|
178
|
+
|
|
179
|
+
const config: ZudokuConfig = {
|
|
180
|
+
apis: [
|
|
181
|
+
{
|
|
182
|
+
type: "file",
|
|
183
|
+
input: "./mcp-api.json",
|
|
184
|
+
path: "mcp",
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
navigation: [
|
|
188
|
+
{
|
|
189
|
+
type: "link",
|
|
190
|
+
label: "MCP Server",
|
|
191
|
+
to: "/mcp",
|
|
192
|
+
icon: "bot",
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
export default config;
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Generated UI
|
|
201
|
+
|
|
202
|
+
When the Dev Portal detects `x-mcp-server` on an operation, the page renders:
|
|
203
|
+
|
|
204
|
+
- **MCP Endpoint card** — the full URL with a copy button.
|
|
205
|
+
- **AI Tool Configuration** tabs with setup instructions for:
|
|
206
|
+
- **Claude** — add via the Connectors UI or the `claude mcp add` CLI command.
|
|
207
|
+
- **ChatGPT** — app setup via Settings → Apps → Advanced Settings.
|
|
208
|
+
- **Cursor** — `mcp.json` configuration (global or project-level).
|
|
209
|
+
- **VS Code** — `.vscode/mcp.json` with native HTTP transport for GitHub
|
|
210
|
+
Copilot.
|
|
211
|
+
- **Generic** — standard `mcp.json` format compatible with most MCP clients.
|
|
212
|
+
|
|
213
|
+
The standard method badge, request body, parameters, and sidecar panels are
|
|
214
|
+
hidden for MCP endpoints because they use a different interaction model.
|
|
215
|
+
|
|
216
|
+
## Related
|
|
217
|
+
|
|
218
|
+
- [`x-mcp-server` extension reference](./zudoku/openapi-extensions/x-mcp-server.md)
|
|
219
|
+
— the underlying OpenAPI extension.
|
|
220
|
+
- [MCP Server Handler](/docs/handlers/mcp-server.mdx) — build an MCP server on
|
|
221
|
+
Zuplo (and skip this guide entirely).
|
|
222
|
+
- [MCP Server overview](/docs/mcp-server/introduction.mdx) — concepts,
|
|
223
|
+
capabilities, and the Zuplo-native build path.
|
|
@@ -101,4 +101,4 @@ The standard method badge, request body, parameters, and sidecar panels are hidd
|
|
|
101
101
|
endpoints.
|
|
102
102
|
|
|
103
103
|
For a full walkthrough including Dev Portal configuration, see the
|
|
104
|
-
[Documenting MCP Servers guide](/dev-portal/
|
|
104
|
+
[Documenting MCP Servers guide](/docs/dev-portal/documenting-mcp-servers).
|
|
@@ -203,7 +203,9 @@ export const percentageCanaryRoutingPolicy: InboundPolicyHandler = async (
|
|
|
203
203
|
|
|
204
204
|
### Environment Variables
|
|
205
205
|
|
|
206
|
-
Configure
|
|
206
|
+
Configure environment variables under the
|
|
207
|
+
[**Environments**](https://portal.zuplo.com/+/account/project/environments) tab
|
|
208
|
+
of your project in the Zuplo Portal:
|
|
207
209
|
|
|
208
210
|
```bash
|
|
209
211
|
# List of employee emails or user IDs
|