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.
Files changed (65) hide show
  1. package/docs/ai-gateway/apps.mdx +5 -5
  2. package/docs/ai-gateway/custom-providers.mdx +6 -5
  3. package/docs/ai-gateway/getting-started.mdx +2 -1
  4. package/docs/ai-gateway/guardrails.mdx +2 -2
  5. package/docs/ai-gateway/managing-apps.mdx +10 -8
  6. package/docs/ai-gateway/managing-providers.mdx +9 -7
  7. package/docs/ai-gateway/managing-teams.mdx +4 -4
  8. package/docs/ai-gateway/usage-limits.mdx +8 -5
  9. package/docs/articles/accounts/audit-logs.mdx +3 -5
  10. package/docs/articles/accounts/billing.mdx +9 -5
  11. package/docs/articles/accounts/default-api-key.mdx +4 -5
  12. package/docs/articles/accounts/delete-account.mdx +11 -11
  13. package/docs/articles/accounts/enterprise-sso.mdx +5 -3
  14. package/docs/articles/accounts/managing-account-members.mdx +3 -3
  15. package/docs/articles/accounts/zuplo-api-keys.mdx +8 -6
  16. package/docs/articles/api-key-administration.mdx +8 -5
  17. package/docs/articles/api-key-end-users.mdx +4 -3
  18. package/docs/articles/api-key-self-serve-integration.mdx +8 -4
  19. package/docs/articles/branch-based-deployments.mdx +7 -4
  20. package/docs/articles/custom-ci-cd-azure.mdx +3 -2
  21. package/docs/articles/custom-ci-cd-bitbucket.mdx +3 -2
  22. package/docs/articles/custom-ci-cd-circleci.mdx +4 -2
  23. package/docs/articles/custom-ci-cd-github.mdx +5 -3
  24. package/docs/articles/custom-ci-cd-gitlab.mdx +3 -2
  25. package/docs/articles/custom-ci-cd.mdx +6 -8
  26. package/docs/articles/custom-domains.mdx +8 -6
  27. package/docs/articles/environments.mdx +5 -2
  28. package/docs/articles/mcp-quickstart.mdx +2 -2
  29. package/docs/articles/migrate-from-kong.md +2 -2
  30. package/docs/articles/monetization/api-access.mdx +3 -2
  31. package/docs/articles/monetization/billing-models.md +137 -31
  32. package/docs/articles/monetization/developer-portal.md +7 -3
  33. package/docs/articles/monetization/features.mdx +0 -28
  34. package/docs/articles/monetization/meters.mdx +14 -7
  35. package/docs/articles/monetization/plans.mdx +1 -3
  36. package/docs/articles/monetization/pricing-models.mdx +21 -7
  37. package/docs/articles/monetization/private-plans.md +0 -1
  38. package/docs/articles/monetization/quickstart.md +4 -2
  39. package/docs/articles/monetization/rate-cards.mdx +40 -7
  40. package/docs/articles/monetization/stripe-integration.md +16 -12
  41. package/docs/articles/monetization/subscription-lifecycle.md +4 -4
  42. package/docs/articles/monorepo-deployment.mdx +2 -3
  43. package/docs/articles/source-control-setup-github.mdx +6 -4
  44. package/docs/articles/step-1-setup-basic-gateway.mdx +3 -3
  45. package/docs/articles/step-3-add-api-key-auth-local.mdx +4 -3
  46. package/docs/articles/step-3-add-api-key-auth.mdx +3 -2
  47. package/docs/articles/step-4-deploying-to-the-edge.mdx +6 -4
  48. package/docs/articles/testing.mdx +4 -3
  49. package/docs/articles/troubleshooting.md +7 -4
  50. package/docs/cli/authentication.mdx +4 -2
  51. package/docs/cli/bucket-list.mdx +71 -0
  52. package/docs/cli/deploy.mdx +2 -1
  53. package/docs/cli/deploy.partial.mdx +2 -1
  54. package/docs/cli/logout.mdx +25 -0
  55. package/docs/concepts/api-keys.md +9 -8
  56. package/docs/concepts/authentication.mdx +3 -2
  57. package/docs/concepts/source-control-and-deployment.mdx +3 -1
  58. package/docs/dev-portal/documenting-mcp-servers.mdx +223 -0
  59. package/docs/dev-portal/zudoku/openapi-extensions/x-mcp-server.md +1 -1
  60. package/docs/guides/canary-routing-for-employees.mdx +3 -1
  61. package/docs/guides/user-based-backend-routing.mdx +3 -2
  62. package/docs/policies/api-key-inbound/schema.json +5 -0
  63. package/docs/programmable-api/environment.mdx +6 -5
  64. package/docs/programmable-api/zuplo-context.mdx +3 -3
  65. 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. Navigate to **Services → Monetization Service → Payment Provider**
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 **Services Monetization Service Payment Provider** in your
115
- Zuplo project.
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
- period, the customer retains access until then, and the API key stops
213
- working at period end.
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
- with a later paid phase) and cancels before the trial converts.
220
- - The customer is on a **free plan** — a plan whose only phase has no
221
- billable rate cards (every rate card's `price` is `null`).
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
- this same behavior explicitly.
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": "api_calls",
107
+ "key": "api_requests",
108
108
  "name": "API Calls",
109
- "featureKey": "api_calls",
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": "api_calls",
127
+ "key": "api_requests",
128
128
  "name": "API Calls",
129
- "featureKey": "api_calls",
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. Go to [portal.zuplo.com](https://portal.zuplo.com) and navigate to your
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 portal under your project's
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
- Go to your project in the Zuplo portal, click **Settings**, then select
22
- **Source Control**. If your project isn't already connected to GitHub click
23
- the **Connect to GitHub** button and follow the auth flow. You'll need to
24
- grant permissions for any GitHub organizations you want to work with.
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
  ![Connect GitHub](../../public/media/step-4-deploying-to-the-edge/image-1.png)
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 [portal.zuplo.com](https://portal.zuplo.com) and create a free
22
- account. Create a new **empty** project (don't import an existing project,
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. Go to the
106
- [Zuplo Portal](https://portal.zuplo.com), then open the project you are
107
- working on, **Services**, then click **Configure** on the "API Key Service".
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. Go to
73
- **Services**, then click **Configure** on the "API Key Service".
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
  ![API Key Service](../../public/media/step-3-add-api-key-auth/image-2.png)
76
77
 
@@ -30,10 +30,12 @@ Let's get started:
30
30
 
31
31
  1. Authorize to GitHub
32
32
 
33
- Next, go to your project in the Zuplo portal, click **Settings**, then select
34
- **Source Control**. If your project isn't already connected to GitHub click
35
- the **Connect to GitHub** button and follow the auth flow. You'll need to
36
- grant permissions for any GitHub organizations you want to work with.
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
  ![Connect GitHub](../../public/media/step-4-deploying-to-the-edge/image-1.png)
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. You can create API key
82
- consumers in the [Zuplo Portal](https://portal.zuplo.com) under **Services > API
83
- Key Service**, then call your local gateway with the generated key:
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 for the specific error
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
- Navigate to your project in the portal and open the logs tab to see live request
179
- logs and any messages logged with `context.log`.
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. Click the **Settings** tab and navigate to the "API Keys" section. Select an
41
- existing API Key or create a new one to use with the CLI.
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)
@@ -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 the Zuplo portal.
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 the Zuplo portal.
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 in the portal.
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
- Metadata is set when creating a consumer via the
80
- [portal](../articles/api-key-administration.mdx),
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. This can be done in the
177
- portal, via the [Developer API](../articles/api-key-api.mdx), or automatically
178
- when a user signs in using
179
- [Auth0](../dev-portal/dev-portal-create-consumer-on-auth.mdx) or another
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
- Consumers (API key holders) can be created via the portal, API, or developer
52
- portal self-serve.
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 the portal working copy.
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/zudoku/guides/mcp-servers).
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 your environment variables in the Zuplo dashboard:
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