zuplo 6.70.27 → 6.70.29

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.
@@ -0,0 +1,160 @@
1
+ ---
2
+ title: Switching Between Accounts
3
+ sidebar_label: Switching Accounts
4
+ ---
5
+
6
+ If you belong to more than one Zuplo account (for example, your own personal
7
+ account plus an account you were invited to join), you can switch between them
8
+ in the Zuplo Portal without signing out.
9
+
10
+ This guide covers accepting an invitation, finding the account switcher, and
11
+ troubleshooting common issues when you can't see an account you expect to have
12
+ access to.
13
+
14
+ :::caution{title="Sign in with the same identity"}
15
+
16
+ The invitation must be accepted using the same identity (email address and
17
+ sign-in method) it was sent to. Zuplo treats Google sign-in, GitHub sign-in, and
18
+ email-password as separate identities, even when they share an email address. If
19
+ you click an invitation while signed in with a different identity, the
20
+ invitation does not apply.
21
+
22
+ :::
23
+
24
+ ## Accept an account invitation
25
+
26
+ When an account admin invites you, Zuplo sends an invitation email to the
27
+ address they entered.
28
+
29
+ <Stepper>
30
+
31
+ 1. Open the invitation email and click the link to accept the invitation.
32
+ 1. If you are not already signed in to the Zuplo Portal, sign in with the **same
33
+ email address and method** the invitation was sent to. See
34
+ [I accepted the invitation but I don't see the account](#i-accepted-the-invitation-but-i-dont-see-the-account)
35
+ if you hit a mismatch.
36
+ 1. After signing in, the invited account appears in the **Switch Account**
37
+ submenu of your avatar dropdown.
38
+
39
+ </Stepper>
40
+
41
+ ## Switch accounts in the portal
42
+
43
+ Once you belong to multiple accounts, switch between them from the avatar menu.
44
+
45
+ <Stepper>
46
+
47
+ 1. Click your avatar in the **top-right corner** of the portal. The currently
48
+ active account name appears at the top of the dropdown.
49
+ 1. Hover over **Switch Account** to open the submenu, which lists every account
50
+ you belong to.
51
+ 1. Select the account you want to switch to.
52
+ 1. The portal reloads in the context of the selected account, showing that
53
+ account's projects, settings, and resources.
54
+
55
+ </Stepper>
56
+
57
+ After switching, all navigation within the portal (project lists, account
58
+ settings, billing, logs) reflects the selected account.
59
+
60
+ ## How multi-account membership works
61
+
62
+ When you first sign up for Zuplo, an account is automatically created for you.
63
+ An admin on another account can then invite you by opening their avatar menu,
64
+ selecting **Account Settings → Members**, clicking **Invite to account**, and
65
+ entering your email address and role. Once you accept, you become a member of
66
+ that account in addition to your own.
67
+
68
+ Each account is independent. Projects, billing, custom domains, and API keys all
69
+ belong to a specific account. When you switch accounts in the portal, you see
70
+ only the resources that belong to the account you switched into.
71
+
72
+ ## Roles in an invited account
73
+
74
+ Your role in the invited account determines what you can access. The account
75
+ admin assigns your role at invitation and can update it later. For the full
76
+ permission matrix, see [Role Permissions](./roles-and-permissions.mdx).
77
+
78
+ :::note
79
+
80
+ Role-Based Access Control (RBAC) with Developer and Member roles is an
81
+ enterprise feature. On non-enterprise accounts, all invited users are added as
82
+ **Admin** by default.
83
+
84
+ :::
85
+
86
+ ## Troubleshooting
87
+
88
+ ### I accepted the invitation but I don't see the account
89
+
90
+ This is almost always an **identity mismatch**. Zuplo supports signing in with
91
+ Google, GitHub, and email-password. Different sign-in methods are treated as
92
+ separate identities, even when the underlying email address is the same.
93
+
94
+ Work through this checklist:
95
+
96
+ - **Check the email address on the invitation.** Confirm it matches exactly the
97
+ email you use to sign in to Zuplo.
98
+ - **Check your sign-in method.** If the invitation was sent to `you@company.com`
99
+ and you usually sign in with Google OAuth using that same email, that
100
+ combination should work. But if you also created a separate email-password
101
+ account with the same address, Zuplo treats those as different identities.
102
+ Sign in with the method that matches how the invitation was sent.
103
+ - **Click the invitation link again.** Open the original invitation email and
104
+ click the accept link while signed in with the correct identity. If you were
105
+ signed in with a different identity the first time, the invitation may have
106
+ been applied to the wrong account.
107
+ - **Ask the account admin to verify.** The admin can check **Account Settings →
108
+ Members** to confirm the invitation status. If it shows as pending, it hasn't
109
+ been accepted yet. The admin can also remove and re-send the invitation to
110
+ ensure it goes to the right email.
111
+
112
+ ### I see the account but not its projects
113
+
114
+ If you switched into an account but the project list appears empty or you can't
115
+ open a specific project, check the following:
116
+
117
+ - **Your account-level role may not include project visibility.** Users with the
118
+ **Member** role at the account level cannot view projects unless an admin has
119
+ granted them a project-level role. Ask the account admin to assign you a role
120
+ on the specific project you need access to. See
121
+ [Managing Project Members](./managing-project-members.mdx) for details.
122
+ - **The project may require source control access.** Some projects are connected
123
+ to a GitHub, GitLab, Bitbucket, or Azure DevOps repository. You may need
124
+ access to the linked repository in addition to your Zuplo project role.
125
+
126
+ ### Why doesn't my invitation link work?
127
+
128
+ Invitation links can fail for a few reasons:
129
+
130
+ - **The link is expired or already used.** Ask the account admin to resend the
131
+ invitation from **Account Settings → Members**.
132
+ - **The link was opened while signed in as the wrong identity.** Sign out, open
133
+ the invitation in a fresh browser session, and sign in with the address the
134
+ invitation was sent to.
135
+
136
+ ### Why don't I see the account switcher in my avatar menu?
137
+
138
+ The **Switch Account** submenu only lists other accounts when you belong to more
139
+ than one. If hovering **Switch Account** shows only your current account, you
140
+ belong to a single account. Ask the relevant account admin to send (or resend)
141
+ an invitation to your address.
142
+
143
+ ### Do I get the invited account's plan features?
144
+
145
+ Yes. Plan-tier features (Free, Builder, Enterprise) are attached to the
146
+ **account**, not to individual users. While working inside a higher-tier
147
+ account, you have access to all features your role permits on that plan,
148
+ regardless of your personal account's plan.
149
+
150
+ When you switch back to your personal account, you have access only to the
151
+ features available on your personal account's plan.
152
+
153
+ ## Related topics
154
+
155
+ - [Managing Account Members](./managing-account-members.mdx): How to invite
156
+ users and manage their roles (admin perspective).
157
+ - [Managing Project Members](./managing-project-members.mdx): How to grant
158
+ project-level access to account members.
159
+ - [Role Permissions](./roles-and-permissions.mdx): Full permission matrix for
160
+ account and project roles.
@@ -17,6 +17,15 @@ authentication for your MCP Server.
17
17
 
18
18
  This guide will assume that you already have a working Auth0 account and tenant.
19
19
 
20
+ :::note
21
+
22
+ This guide is an example of how you can set up your Auth0 tenant for MCP OAuth
23
+ support. It is recommended that you consult the
24
+ [Auth0 documentation](https://auth0.com/ai/docs/mcp/guides/registering-your-mcp-client-application)
25
+ for more information.
26
+
27
+ :::
28
+
20
29
  ### Create an Auth0 API
21
30
 
22
31
  First, you will need to create an Auth0 API. This API will be used to represent
@@ -30,18 +39,6 @@ your MCP Server.
30
39
  `https://my-gateway.zuplo.dev/mcp`. **The trailing slash isn't required.**
31
40
  3. Leave the **Signing Algorithm** as `RS256` and click **Create**.
32
41
 
33
- ### Enable Dynamic Client Registration
34
-
35
- Next, you will need to enable Dynamic Client Registration for the API you just
36
- created.
37
-
38
- 1. In the Auth0 dashboard, navigate to the tenant settings in **Settings** on
39
- the left hand sidebar.
40
- 2. Navigate to the **Advanced** tab.
41
- 3. Scroll down to the **Settings** section and check the toggle for **OIDC
42
- Dynamic Application Registration**. Also ensure that the **Enable Application
43
- Connections** toggle is checked.
44
-
45
42
  ### Configure the Connection
46
43
 
47
44
  Next, you will need to configure an Auth0 Connection for your API.
@@ -80,12 +77,45 @@ Next, you will need to configure an Auth0 Connection for your API.
80
77
  --data '{ "is_domain_connection": true }'
81
78
  ```
82
79
 
83
- 5. Configure a Default Audience by clicking on Settings > General. Then in the
84
- API Authorization Settings, modify the Default Audience. See the Auth0 doc on
85
- [API Authorization Settings](https://auth0.com/docs/get-started/tenant-settings#api-authorization-settings)
86
- for more information on how to configure a default audience. The audience
87
- should be the identifier of the API you created in
88
- [Create an Auth0 API](#create-an-auth0-api).
80
+ 5. Enable Resource Parameter Compatibility Profile. See the
81
+ [Auth0 tenant settings docs](https://auth0.com/docs/get-started/tenant-settings)
82
+ for more information.
83
+
84
+ After completing these changes to your Auth0 tenant, you will need to enable
85
+ CIMD or DCR (or both) on your Auth0 tenant.
86
+
87
+ ### Enable CIMD for MCP OAuth
88
+
89
+ To use CIMD for MCP OAuth authentication, do the following:
90
+
91
+ 1. In the Auth0 dashboard, navigate to the tenant settings in **Settings** on
92
+ the left hand sidebar.
93
+ 2. Navigate to the **Advanced** tab.
94
+ 3. Scroll down to the **Settings** section and check the toggle for **Client ID
95
+ Metadata Document (CIMD) Registration**.
96
+ 4. Register the MCP clients via their public CIMD client data metadata URL by
97
+ clicking "Create Application" and then "Import from URL". Note that for all
98
+ the MCP clients you want to support, you will need to obtain the metadata URL
99
+ and register each application individually.
100
+
101
+ See the official
102
+ [Auth0 docs](https://auth0.com/ai/docs/mcp/guides/registering-your-mcp-client-application/manual-cimd-registration)
103
+ for more information.
104
+
105
+ ### Enabling DCR for MCP OAuth
106
+
107
+ To use DCR for MCP OAuth authentication, do the following:
108
+
109
+ 1. In the Auth0 dashboard, navigate to the tenant settings in **Settings** on
110
+ the left hand sidebar.
111
+ 2. Navigate to the **Advanced** tab.
112
+ 3. Scroll down to the **Settings** section and check the toggle for **Dynamic
113
+ Client Registration (DCR)**. Also ensure that the **Enable Application
114
+ Connections** toggle is checked.
115
+
116
+ See the official
117
+ [Auth0 docs](https://auth0.com/ai/docs/mcp/guides/registering-your-mcp-client-application/dynamic-client-registration)
118
+ for more information.
89
119
 
90
120
  ### Configure OAuth on Zuplo
91
121
 
@@ -184,3 +214,13 @@ open the OAuth settings. This will allow you to debug the flow step by step.
184
214
  You should be able to hit the **Continue** button in the Inspector UI at each
185
215
  step of the flow successfully. If you need more help debugging, see
186
216
  [Testing OAuth on Zuplo](../handlers/mcp-server.mdx#oauth-testing).
217
+
218
+ :::note
219
+
220
+ When testing CIMD authentication, you will need an MCP client with a CIMD
221
+ compatible client metadata URL. Currently, MCP Inspector does not have this, so
222
+ it is recommended that you test with another client like the Claude Code CLI
223
+ (Client Metadata URI as of May 2026 is
224
+ https://claude.ai/oauth/claude-code-client-metadata).
225
+
226
+ :::
@@ -61,136 +61,6 @@ curl \
61
61
  --header "Authorization: Bearer $ZAPI_KEY"
62
62
  ```
63
63
 
64
- ## Bucket monetization configuration
65
-
66
- Each bucket has an optional `MonetizationConfiguration` record that holds
67
- bucket-wide defaults. The configuration is read by the runtime and the Developer
68
- Portal.
69
-
70
- | Method | Path |
71
- | -------- | ---------------------------------------------------- |
72
- | `GET` | `/v3/metering/{bucketId}/monetization-configuration` |
73
- | `PUT` | `/v3/metering/{bucketId}/monetization-configuration` |
74
- | `DELETE` | `/v3/metering/{bucketId}/monetization-configuration` |
75
-
76
- The `PUT` endpoint upserts the record. At least one of the four fields below
77
- must be present. Pass any combination — fields that are omitted retain their
78
- previous value.
79
-
80
- | Field | Type | Description |
81
- | ------------------------------ | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
82
- | `multipleSubscriptionsEnabled` | `boolean` | Stored on the bucket. Reserved for future enforcement of multi-subscription rules; today the Developer Portal create-subscription path enforces a single active subscription per customer regardless of this flag. |
83
- | `planOrder` | `string[]` | Plan keys in display order. Drives the pricing page sort and is used by [plan changes](./subscription-lifecycle.md#plan-changes-upgrades-and-downgrades) to decide upgrade vs downgrade — moving to a plan with a higher (or equal) index is treated as an upgrade with `"immediate"` timing; a lower index is a downgrade with `"next_billing_cycle"` timing. |
84
- | `planSettings` | `object` | Per-plan overrides keyed by plan key. The supported sub-key today is `visiblePhases` — an array of phase keys that should appear on the pricing page. Omitted means no filtering; `[]` hides all phases for that plan. |
85
- | `maxPaymentOverdueDays` | `integer` (`>= 0`) | Bucket-level grace period for overdue payments. Used as the lowest-priority value in the resolution chain: customer metadata → plan metadata → this bucket value → built-in default of `3` days. See [Subscription and payment validation](./monetization-policy.md#subscription-and-payment-validation). |
86
-
87
- ```bash
88
- curl -X PUT "https://dev.zuplo.com/v3/metering/$BUCKET_ID/monetization-configuration" \
89
- --header "Authorization: Bearer $ZAPI_KEY" \
90
- --header "Content-Type: application/json" \
91
- --data '{
92
- "planOrder": ["free", "developer", "pro"],
93
- "planSettings": {
94
- "pro": { "visiblePhases": ["default"] }
95
- },
96
- "maxPaymentOverdueDays": 7
97
- }'
98
- ```
99
-
100
- `DELETE` removes the record entirely; `GET` on a bucket with no record returns
101
- the schema defaults (`multipleSubscriptionsEnabled: false`, `planOrder: []`,
102
- `planSettings: {}`, `maxPaymentOverdueDays: 3`).
103
-
104
- ## Stripe setup and billing readiness
105
-
106
- These endpoints script the Stripe integration that the
107
- [Monetization Service UI](./stripe-integration.md#connecting-your-stripe-account)
108
- runs interactively. They live on the Zuplo developer API, so the request shape
109
- is documented here.
110
-
111
- ### Connect a Stripe app
112
-
113
- ```http
114
- POST /v3/metering/{bucketId}/setup/stripe
115
- ```
116
-
117
- Installs a Stripe app on the bucket and creates the default billing profile
118
- linked to that app.
119
-
120
- | Field | Type | Description |
121
- | ------------- | --------- | ------------------------------------------------------------------------------------------------ |
122
- | `apiKey` | `string` | Stripe secret or restricted key. Required. |
123
- | `name` | `string` | Display name for the app. Required. |
124
- | `taxEnabled` | `boolean` | Initial value for `workflow.tax.enabled` on the billing profile. Optional; defaults to `false`. |
125
- | `taxEnforced` | `boolean` | Initial value for `workflow.tax.enforced` on the billing profile. Optional; defaults to `false`. |
126
- | `country` | `string` | ISO 3166-1 alpha-2 supplier country for the billing profile. Optional; defaults to `"US"`. |
127
-
128
- The request fails if the key prefix does not match the bucket environment:
129
-
130
- - Working-copy or preview buckets accept `sk_test_*` or `rk_test_*`.
131
- - Production buckets accept `sk_live_*` or `rk_live_*`.
132
-
133
- ```bash
134
- curl -X POST "https://dev.zuplo.com/v3/metering/$BUCKET_ID/setup/stripe" \
135
- --header "Authorization: Bearer $ZAPI_KEY" \
136
- --header "Content-Type: application/json" \
137
- --data '{
138
- "apiKey": "rk_test_...",
139
- "name": "Zuplo Monetization (test)",
140
- "taxEnabled": false,
141
- "country": "US"
142
- }'
143
- ```
144
-
145
- ### Read the connected Stripe app
146
-
147
- ```http
148
- GET /v3/metering/{bucketId}/setup/stripe
149
- ```
150
-
151
- Returns a summary of the connected Stripe app, the matched billing profile, and
152
- connection-test status. Use this to confirm the integration is wired up before
153
- continuing.
154
-
155
- ### Add a billing profile to a Stripe app
156
-
157
- ```http
158
- POST /v3/metering/{bucketId}/setup/stripe/{stripeAppId}/billing-profile
159
- ```
160
-
161
- Creates an additional billing profile against an already-installed Stripe app.
162
- This is rarely needed — the default profile is created during initial setup. Use
163
- this endpoint to create per-supplier-country profiles.
164
-
165
- ### Check billing readiness
166
-
167
- ```http
168
- GET /v3/metering/{bucketId}/billing-readiness
169
- ```
170
-
171
- Returns:
172
-
173
- ```json
174
- {
175
- "hasStripeApp": true,
176
- "stripeAppId": "app_01H...",
177
- "hasDefaultBillingProfile": true,
178
- "defaultBillingProfileId": "bp_01H..."
179
- }
180
- ```
181
-
182
- Use this in setup wizards to gate the UI on whether Stripe is connected.
183
-
184
- ### Update an app
185
-
186
- ```http
187
- PUT /v3/metering/{bucketId}/apps/{appId}
188
- ```
189
-
190
- Replaces an app's configuration (name, description, metadata, and — for Stripe
191
- apps — `secretAPIKey`). The same key-prefix validation as `POST /setup/stripe`
192
- applies: a Stripe key must match the bucket environment.
193
-
194
64
  ## API Reference
195
65
 
196
66
  For complete API operations, see the API Reference documentation: