zuplo 7.8.6 → 7.8.8

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 (63) hide show
  1. package/docs/ai-gateway/custom-policies.mdx +2 -1
  2. package/docs/ai-gateway/usage-limits.mdx +2 -2
  3. package/docs/api-management/overview.md +2 -2
  4. package/docs/articles/add-api-to-backstage.mdx +4 -3
  5. package/docs/articles/api-key-consumer-bucket-portal-ui.mdx +1 -1
  6. package/docs/articles/api-key-management.mdx +1 -1
  7. package/docs/articles/migrate-from-apigee.md +3 -3
  8. package/docs/articles/migrate-from-aws-api-gateway.md +3 -3
  9. package/docs/articles/migrate-from-azure-apim.md +3 -3
  10. package/docs/articles/migrate-from-kong.md +3 -3
  11. package/docs/articles/source-control-setup-github.mdx +2 -2
  12. package/docs/cli/create-zuplo-api.mdx +4 -4
  13. package/docs/cli/openapi-merge.mdx +1 -1
  14. package/docs/cli/openapi-merge.partial.mdx +1 -1
  15. package/docs/concepts/ai-gateway.mdx +1 -1
  16. package/docs/concepts/mcp.mdx +4 -4
  17. package/docs/dedicated/architecture.mdx +1 -1
  18. package/docs/errors/not-found.mdx +1 -1
  19. package/docs/getting-started/ai-gateway/portal.mdx +181 -0
  20. package/docs/getting-started/dev-portal/agent.mdx +148 -0
  21. package/docs/getting-started/dev-portal/index.mdx +26 -0
  22. package/docs/getting-started/dev-portal/local.mdx +213 -0
  23. package/docs/getting-started/dev-portal/portal.mdx +146 -0
  24. package/docs/{articles/step-3-add-api-key-auth.mdx → getting-started/gateway/add-api-key-auth/index.mdx} +30 -24
  25. package/docs/{articles/step-3-add-api-key-auth-local.mdx → getting-started/gateway/add-api-key-auth/local.mdx} +26 -21
  26. package/docs/{articles/step-2-add-rate-limiting.mdx → getting-started/gateway/add-rate-limiting/index.mdx} +20 -14
  27. package/docs/{articles/step-2-add-rate-limiting-local.mdx → getting-started/gateway/add-rate-limiting/local.mdx} +22 -15
  28. package/docs/getting-started/gateway/agent.mdx +198 -0
  29. package/docs/{articles/step-4-deploying-to-the-edge.mdx → getting-started/gateway/deploy-to-the-edge/index.mdx} +36 -27
  30. package/docs/{articles/step-4-deploying-to-the-edge-local.mdx → getting-started/gateway/deploy-to-the-edge/local.mdx} +46 -18
  31. package/docs/{articles/step-5-dynamic-rate-limiting.mdx → getting-started/gateway/dynamic-rate-limiting/index.mdx} +21 -12
  32. package/docs/{articles/step-5-dynamic-rate-limiting-local.mdx → getting-started/gateway/dynamic-rate-limiting/local.mdx} +21 -12
  33. package/docs/getting-started/gateway/index.mdx +24 -0
  34. package/docs/{articles/step-1-setup-basic-gateway.mdx → getting-started/gateway/setup-a-basic-gateway/index.mdx} +31 -22
  35. package/docs/{articles/step-1-setup-basic-gateway-local.mdx → getting-started/gateway/setup-a-basic-gateway/local.mdx} +22 -16
  36. package/docs/getting-started/index.mdx +25 -0
  37. package/docs/getting-started/mcp-gateway/agent.mdx +161 -0
  38. package/docs/getting-started/mcp-gateway/index.mdx +25 -0
  39. package/docs/{mcp-gateway/quickstart-local.mdx → getting-started/mcp-gateway/local.mdx} +35 -31
  40. package/docs/{mcp-gateway/quickstart.mdx → getting-started/mcp-gateway/portal.mdx} +64 -48
  41. package/docs/getting-started/mcp-server/agent.mdx +152 -0
  42. package/docs/getting-started/mcp-server/index.mdx +25 -0
  43. package/docs/{articles/mcp-quickstart-local.mdx → getting-started/mcp-server/local.mdx} +24 -13
  44. package/docs/{articles/mcp-quickstart.mdx → getting-started/mcp-server/portal.mdx} +35 -15
  45. package/docs/getting-started/migrate/agent.mdx +129 -0
  46. package/docs/getting-started/migrate/index.mdx +25 -0
  47. package/docs/getting-started/migrate/local.mdx +141 -0
  48. package/docs/getting-started/migrate/portal.mdx +129 -0
  49. package/docs/home.mdx +6 -0
  50. package/docs/mcp-gateway/connect-clients/chatgpt.mdx +2 -1
  51. package/docs/mcp-gateway/connect-clients/claude-code.mdx +2 -1
  52. package/docs/mcp-gateway/connect-clients/claude-desktop.mdx +2 -1
  53. package/docs/mcp-gateway/connect-clients/cursor.mdx +2 -1
  54. package/docs/mcp-gateway/connect-clients/vs-code.mdx +2 -1
  55. package/docs/mcp-gateway/how-it-works.mdx +2 -2
  56. package/docs/mcp-gateway/how-to/connect-upstream-api-key.mdx +4 -3
  57. package/docs/mcp-gateway/how-to/curate-tools.mdx +3 -2
  58. package/docs/mcp-gateway/overview.mdx +3 -3
  59. package/docs/policies/ai-gateway-smart-router-inbound/doc.md +14 -0
  60. package/docs/policies/akamai-ai-firewall-v2-inbound/doc.md +7 -0
  61. package/package.json +5 -5
  62. package/docs/ai-gateway/getting-started.mdx +0 -307
  63. package/docs/dev-portal/local-development.mdx +0 -72
@@ -1,15 +1,24 @@
1
1
  ---
2
- title: Step 5 - Dynamic Rate Limiting
3
- sidebar_label: "5 - Dynamic Rate Limiting"
2
+ category: API Management
3
+ showLastModified: false
4
+ suggestEdit: false
5
+ title: Dynamic rate limiting - Portal
6
+ description:
7
+ Move past a single fixed limit by setting rate limits per customer, so each
8
+ consumer of your API gets its own quota in the Zuplo Portal.
4
9
  ---
5
10
 
11
+ <WizardSteps build="gateway" method="portal" step="dynamic-rate-limiting" />
12
+
13
+ <MethodTabs build="gateway" method="portal" step="dynamic-rate-limiting" />
14
+
6
15
  Fortune favors the bold. In this bonus getting started guide - we'll show you
7
16
  how to add dynamic rate limiting to your API.
8
17
 
9
18
  To follow this tutorial you'll need to have completed
10
- [Step 1](./step-1-setup-basic-gateway.mdx) for a Zuplo project,
11
- [Step 2](./step-2-add-rate-limiting.mdx) to add rate limiting to that route, and
12
- [Step 3](./step-3-add-api-key-auth.mdx) to add API key authentication to that
19
+ [Step 1](../setup-a-basic-gateway/index.mdx) for a Zuplo project,
20
+ [Step 2](../add-rate-limiting/index.mdx) to add rate limiting to that route, and
21
+ [Step 3](../add-api-key-auth/index.mdx) to add API key authentication to that
13
22
  same route.
14
23
 
15
24
  :::info{title="What's Dynamic Rate Limiting?"}
@@ -28,7 +37,7 @@ Let's get started.
28
37
  1. Add Consumer Metadata
29
38
 
30
39
  Let's make our rate-limiting policy more dynamic, based on properties of the
31
- customer. [Create a new consumer](./step-3-add-api-key-auth.mdx) (Services ->
40
+ customer. [Create a new consumer](../add-api-key-auth/index.mdx) (Services ->
32
41
  API Key Service -> Configure -> Create Consumer), and in the Metadata field,
33
42
  set the following:
34
43
 
@@ -47,7 +56,7 @@ Let's get started.
47
56
  }
48
57
  ```
49
58
 
50
- ![Customer Metadata](../../public/media/step-3-add-rate-limiting/image-2.png)
59
+ ![Customer Metadata](../../../../public/media/step-3-add-rate-limiting/image-2.png)
51
60
 
52
61
  Now that there are users with different `customerType`, this information can
53
62
  be used to rate limit them differently.
@@ -58,7 +67,7 @@ Let's get started.
58
67
  clicking the `+` next to the **modules** folder and choose new empty module.
59
68
  Name the module `rate-limit.ts`.
60
69
 
61
- ![New module](../../public/media/step-3-add-rate-limiting/image-3.png)
70
+ ![New module](../../../../public/media/step-3-add-rate-limiting/image-3.png)
62
71
 
63
72
  :::info{title="What's a Module?"}
64
73
 
@@ -109,7 +118,7 @@ Let's get started.
109
118
  Now we'll reconfigure the rate-limiting policy to wire up our custom
110
119
  function. Find the policy in the **Route Designer** and click **Edit**.
111
120
 
112
- ![Edit Policy](../../public/media/step-3-add-rate-limiting/image-4.png)
121
+ ![Edit Policy](../../../../public/media/step-3-add-rate-limiting/image-4.png)
113
122
 
114
123
  Update the configuration to
115
124
 
@@ -138,7 +147,7 @@ Let's get started.
138
147
 
139
148
  Using the Test modal, you can try your dynamic rate limiting. You can grab
140
149
  the key for each consumer from **Services → API Keys → Consumers** where you
141
- created them. Like [Step 3](./step-3-add-api-key-auth.mdx), you can fill in
150
+ created them. Like [Step 3](../add-api-key-auth/index.mdx), you can fill in
142
151
  the keys into the `Authorization` header and start making calls until you hit
143
152
  your rate limit. Try out the other key and observe the difference in rate
144
153
  limits.
@@ -160,9 +169,9 @@ less than an hour.
160
169
  ### Next Steps
161
170
 
162
171
  - Continue exploring our docs to learn about customizing your
163
- [Developer Portal](../dev-portal/overview.mdx), or explore our various
172
+ [Developer Portal](../../../dev-portal/overview.mdx), or explore our various
164
173
  [Integrations](https://zuplo.com/integrations)
165
174
  - [Grab time](https://zuplo.com/meeting) with the Zuplo team to have your
166
175
  questions answered
167
176
  - Start generating revenue from your new API with our
168
- [Monetization tutorial](./monetization/index.mdx)
177
+ [Monetization tutorial](../../../articles/monetization/index.mdx)
@@ -1,16 +1,25 @@
1
1
  ---
2
- title: Step 5 - Dynamic Rate Limiting
3
- sidebar_label: "5 - Dynamic Rate Limiting"
2
+ category: API Management
3
+ showLastModified: false
4
+ suggestEdit: false
5
+ title: Dynamic rate limiting - Editor
6
+ description:
7
+ Move past a single fixed limit by setting rate limits per customer, so each
8
+ consumer of your API gets its own quota with the Zuplo CLI and your editor.
4
9
  ---
5
10
 
11
+ <WizardSteps build="gateway" method="local" step="dynamic-rate-limiting" />
12
+
13
+ <MethodTabs build="gateway" method="local" step="dynamic-rate-limiting" />
14
+
6
15
  Fortune favors the bold. In this bonus getting started guide we'll show you how
7
16
  to add dynamic rate limiting to your API, all from your local project.
8
17
 
9
18
  To follow this tutorial you'll need to have completed
10
- [Step 1](./step-1-setup-basic-gateway-local.mdx) for a Zuplo project,
11
- [Step 2](./step-2-add-rate-limiting-local.mdx) to add rate limiting to a route,
12
- and [Step 3](./step-3-add-api-key-auth-local.mdx) to add API key authentication
13
- to that same route.
19
+ [Step 1](../setup-a-basic-gateway/local.mdx) for a Zuplo project,
20
+ [Step 2](../add-rate-limiting/local.mdx) to add rate limiting to a route, and
21
+ [Step 3](../add-api-key-auth/local.mdx) to add API key authentication to that
22
+ same route.
14
23
 
15
24
  :::info{title="What's Dynamic Rate Limiting?"}
16
25
 
@@ -29,8 +38,8 @@ Let's get started.
29
38
 
30
39
  Let's make our rate-limiting policy more dynamic, based on properties of the
31
40
  customer. In the Zuplo Portal,
32
- [create a new consumer](./step-3-add-api-key-auth-local.mdx) (Services → API
33
- Key Service → Configure → Create Consumer), and in the Metadata field set the
41
+ [create a new consumer](../add-api-key-auth/local.mdx) (Services → API Key
42
+ Service → Configure → Create Consumer), and in the Metadata field set the
34
43
  following:
35
44
 
36
45
  ```json
@@ -132,8 +141,8 @@ Let's get started.
132
141
  :::tip
133
142
 
134
143
  Dynamic rate limiting reads from `request.user`, so the API key
135
- authentication policy from [Step 3](./step-3-add-api-key-auth-local.mdx) must
136
- run **before** the rate-limiting policy.
144
+ authentication policy from [Step 3](../add-api-key-auth/local.mdx) must run
145
+ **before** the rate-limiting policy.
137
146
 
138
147
  :::
139
148
 
@@ -172,9 +181,9 @@ less than an hour.
172
181
  ### Next Steps
173
182
 
174
183
  - Continue exploring our docs to learn about customizing your
175
- [Developer Portal](../dev-portal/overview.mdx), or explore our various
184
+ [Developer Portal](../../../dev-portal/overview.mdx), or explore our various
176
185
  [Integrations](https://zuplo.com/integrations)
177
186
  - [Grab time](https://zuplo.com/meeting) with the Zuplo team to have your
178
187
  questions answered
179
188
  - Start generating revenue from your new API with our
180
- [Monetization tutorial](./monetization/index.mdx)
189
+ [Monetization tutorial](../../../articles/monetization/index.mdx)
@@ -0,0 +1,24 @@
1
+ ---
2
+ category: API Management
3
+ fullWidth: true
4
+ disablePager: true
5
+ showLastModified: false
6
+ suggestEdit: false
7
+ centered: false
8
+ toc: false
9
+ title: Getting Started with API Gateway
10
+ description:
11
+ Put a managed gateway in front of any REST API with Zuplo, in the Portal,
12
+ locally with the CLI, or with an AI agent.
13
+ ---
14
+
15
+ <WizardSteps build="gateway" />
16
+
17
+ An API gateway sits between your clients and your backend. Use it to
18
+ authenticate requests and apply rate limits before traffic reaches your API.
19
+
20
+ This tutorial starts with a sample backend and takes you through routing,
21
+ policies, and deployment. Choose a workflow to begin. You need a GitHub account
22
+ when you reach the deployment step.
23
+
24
+ <MethodPicker build="gateway" />
@@ -1,33 +1,45 @@
1
1
  ---
2
- title: Step 1 - Setup a Basic Gateway
3
- sidebar_label: "1 - Setup Your Gateway"
2
+ category: API Management
3
+ showLastModified: false
4
+ suggestEdit: false
5
+ title: Setup a basic gateway - Portal
6
+ description:
7
+ Proxy an origin API through a managed Zuplo gateway, add your first route, and
8
+ see traffic flowing end to end in the Zuplo Portal.
4
9
  ---
5
10
 
6
- <QuickstartPicker
7
- mode="portal"
8
- alternateLink="/articles/step-1-setup-basic-gateway-local"
9
- />
11
+ <WizardSteps build="gateway" method="portal" step="setup-a-basic-gateway" />
12
+
13
+ <MethodTabs build="gateway" method="portal" step="setup-a-basic-gateway" />
10
14
 
11
15
  In this tutorial we'll set up a simple gateway. We'll use a simple origin API at
12
16
  [echo.zuplo.io](https://echo.zuplo.io).
13
17
 
14
18
  Note - Zuplo also supports building and running your API locally. To learn more
15
- [see the documentation](./local-development.mdx).
19
+ [see the documentation](../../../articles/local-development.mdx).
16
20
 
17
21
  <Stepper>
18
22
 
19
23
  1. **Sign-in**
20
24
 
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...
25
+ Sign in to the Zuplo Portal and create a free account. Open
26
+ [**Projects**](https://portal.zuplo.com/+/account/projects), click **New
27
+ Project**, select **API & MCP Gateway**, enter `example-project`, and click
28
+ **Create Project**. Choose a blank project rather than importing one; this
29
+ tutorial connects Git later.
30
+
31
+ <ModalScreenshot>
32
+
33
+ ![New Zuplo project dialog with API & MCP Gateway selected](/media/mcp-gateway-portal-quickstart/new-project.png)
34
+
35
+ </ModalScreenshot>
24
36
 
25
37
  1. Add your first **Route**
26
38
 
27
39
  Inside your new project, select the **Code** tab (1), choose the
28
40
  `routes.oas.json` file (2) and click **Add Route** (3)
29
41
 
30
- ![Add Route](../../public/media/step-1-setup-basic-gateway/add-route.png)
42
+ ![Add Route](../../../../public/media/step-1-setup-basic-gateway/add-route.png)
31
43
 
32
44
  Your API's first route will appear, with many options. First we'll configure
33
45
  the route to match specific incoming requests to the gateway:
@@ -38,11 +50,11 @@ Note - Zuplo also supports building and running your API locally. To learn more
38
50
  Then we'll specify how the route will invoke the backend origin API, using a
39
51
  forward handler:
40
52
  - **Request Handler**: We'll use the
41
- [URL Forward Handler](../handlers/url-forward.mdx) which proxies requests
42
- by "Forwarding to" the same path on specified URL. In this case, enter
43
- `https://echo.zuplo.io`
53
+ [URL Forward Handler](../../../handlers/url-forward.mdx) which proxies
54
+ requests by "Forwarding to" the same path on specified URL. In this case,
55
+ enter `https://echo.zuplo.io`
44
56
 
45
- ![Your First Route](../../public/media/step-1-setup-basic-gateway/image-14.png)
57
+ ![Your First Route](../../../../public/media/step-1-setup-basic-gateway/image-14.png)
46
58
 
47
59
  **Save your changes** - click **Save** at the bottom left, or press **CMD+S**
48
60
 
@@ -54,7 +66,7 @@ Note - Zuplo also supports building and running your API locally. To learn more
54
66
 
55
67
  <ModalScreenshot>
56
68
 
57
- ![Test your API](../../public/media/step-1-setup-basic-gateway/image-15.png)
69
+ ![Test your API](../../../../public/media/step-1-setup-basic-gateway/image-15.png)
58
70
 
59
71
  </ModalScreenshot>
60
72
 
@@ -89,12 +101,12 @@ Note - Zuplo also supports building and running your API locally. To learn more
89
101
  setting the value to `${env.BASE_URL}`. We will set the value for `BASE_URL`
90
102
  next.
91
103
 
92
- ![BASE_URL from Environment](../../public/media/step-1-setup-basic-gateway/image-8.png)
104
+ ![BASE_URL from Environment](../../../../public/media/step-1-setup-basic-gateway/image-8.png)
93
105
 
94
106
  Navigate to your project's **Settings** (1) via the navigation bar. Next,
95
107
  click **Environment Variables** (2) under Project Settings.
96
108
 
97
- ![Click Environment Variables](../../public/media/step-1-setup-basic-gateway/set-env-var.png)
109
+ ![Click Environment Variables](../../../../public/media/step-1-setup-basic-gateway/set-env-var.png)
98
110
 
99
111
  Add an Environment Variable (3) called `BASE_URL`. Leave the "Secret"
100
112
  checkbox unchecked. This is typically not a secret, so there's no need to
@@ -102,7 +114,7 @@ Note - Zuplo also supports building and running your API locally. To learn more
102
114
 
103
115
  <ModalScreenshot>
104
116
 
105
- ![BASE_URL Environment Variable](../../public/media/step-1-setup-basic-gateway/env-var.png)
117
+ ![BASE_URL Environment Variable](../../../../public/media/step-1-setup-basic-gateway/env-var.png)
106
118
 
107
119
  </ModalScreenshot>
108
120
 
@@ -111,6 +123,3 @@ Note - Zuplo also supports building and running your API locally. To learn more
111
123
  response from Step 2.
112
124
 
113
125
  </Stepper>
114
-
115
- **NEXT** Try
116
- [Step 2 - Add Rate Limiting to your API](./step-2-add-rate-limiting.mdx).
@@ -1,26 +1,33 @@
1
1
  ---
2
- title: Step 1 - Setup a Basic Gateway
3
- sidebar_label: "1 - Setup Your Gateway"
2
+ category: API Management
3
+ showLastModified: false
4
+ suggestEdit: false
5
+ title: Setup a basic gateway - Editor
6
+ description:
7
+ Proxy an origin API through a managed Zuplo gateway, add your first route, and
8
+ see traffic flowing end to end with the Zuplo CLI and your editor.
4
9
  ---
5
10
 
6
- <QuickstartPicker
7
- mode="local"
8
- alternateLink="/articles/step-1-setup-basic-gateway"
9
- />
11
+ <WizardSteps build="gateway" method="local" step="setup-a-basic-gateway" />
12
+
13
+ <MethodTabs build="gateway" method="local" step="setup-a-basic-gateway" />
10
14
 
11
15
  In this tutorial we'll set up a simple gateway using Zuplo's local development,
12
- powered by the [Zuplo CLI](../cli/overview.mdx). We'll use the default project
13
- template, which ships with a working todo API.
16
+ powered by the [Zuplo CLI](../../../cli/overview.mdx). We'll use the default
17
+ project template, which ships with a working todo API.
14
18
 
15
19
  ## Requirements
16
20
 
17
21
  - [Node.js](https://nodejs.org/en/download) 24.0.0 or higher
18
22
 
23
+ ## Create and test your gateway
24
+
19
25
  <Stepper>
20
26
 
21
27
  1. **Create your project**
22
28
 
23
- Create a new project with [create-zuplo-api](../cli/create-zuplo-api.mdx):
29
+ Create a new project with
30
+ [create-zuplo-api](../../../cli/create-zuplo-api.mdx):
24
31
 
25
32
  ```bash
26
33
  npx create-zuplo-api@latest
@@ -86,10 +93,12 @@ template, which ships with a working todo API.
86
93
  (`GET /todos`, `POST /todos`, `PUT /todos/{id}`, `DELETE /todos/{id}`)
87
94
  defined in `config/routes.oas.json`.
88
95
 
89
- Open the [local Route Designer](./local-development-routes-designer.mdx) at
90
- http://localhost:9100 — you can also click the link printed in the terminal —
91
- to see the routes. Select **Get all todos** to inspect how it's configured;
92
- you can change the path, method, request handler, and add policies from here.
96
+ Open the
97
+ [local Route Designer](../../../articles/local-development-routes-designer.mdx)
98
+ at http://localhost:9100 — you can also click the link printed in the
99
+ terminal — to see the routes. Select **Get all todos** to inspect how it's
100
+ configured; you can change the path, method, request handler, and add
101
+ policies from here.
93
102
 
94
103
  1. **Test the API**
95
104
 
@@ -107,6 +116,3 @@ template, which ships with a working todo API.
107
116
  gateway is now serving traffic locally.
108
117
 
109
118
  </Stepper>
110
-
111
- **NEXT** Try
112
- [Step 2 - Add Rate Limiting to your API](./step-2-add-rate-limiting-local.mdx).
@@ -0,0 +1,25 @@
1
+ ---
2
+ category: Getting Started
3
+ fullWidth: true
4
+ disablePager: true
5
+ showLastModified: false
6
+ suggestEdit: false
7
+ centered: false
8
+ toc: false
9
+ title: What do you want to build?
10
+ description:
11
+ Pick what to build with Zuplo, choose how you want to build it, and follow a
12
+ step-by-step tutorial.
13
+ ---
14
+
15
+ <WizardSteps />
16
+
17
+ Create your first working project with Zuplo. Choose what you want to build,
18
+ then select a workflow and follow a guided tutorial with a sample API or
19
+ service.
20
+
21
+ Start with the product that fits your task. Most tutorials offer the Zuplo
22
+ Portal, a local editor, or an AI coding agent. The AI Gateway tutorial takes you
23
+ directly to setup in the Portal.
24
+
25
+ <BuildPicker />
@@ -0,0 +1,161 @@
1
+ ---
2
+ category: MCP Gateway
3
+ showLastModified: false
4
+ suggestEdit: false
5
+ sidebar_label: Agent
6
+ title: Getting Started with MCP Gateway - Agent
7
+ description:
8
+ Build a local MCP Gateway with a coding agent, authorize Linear through OAuth,
9
+ and verify a real tool call before deploying.
10
+ ---
11
+
12
+ <WizardSteps build="mcp-gateway" method="agent" />
13
+
14
+ <MethodTabs build="mcp-gateway" method="agent" />
15
+
16
+ Have a coding agent build a local MCP Gateway in front of Linear. You'll
17
+ complete the browser authorization yourself and verify a real Linear tool call.
18
+
19
+ ## Prerequisites
20
+
21
+ - [Node.js](https://nodejs.org/en/download) 24 or later.
22
+ - A [Zuplo account](https://portal.zuplo.com).
23
+ - An installed coding agent and a Linear account with access to a workspace.
24
+ - An MCP client that can connect to a local HTTP server and complete OAuth.
25
+
26
+ This tutorial uses Zuplo's local `dev-login` shortcut. For a hosted gateway with
27
+ your identity provider, use the [Portal tutorial](./portal.mdx).
28
+
29
+ ## Build your MCP Gateway with an agent
30
+
31
+ <Stepper>
32
+
33
+ 1. **Create your project**
34
+
35
+ Run:
36
+
37
+ ```bash
38
+ npx create-zuplo-api@latest linear-mcp-gateway
39
+ cd linear-mcp-gateway
40
+ ```
41
+
42
+ When prompted, choose **Yes** to create a matching Portal project, complete
43
+ sign-in, and select your Zuplo account. Select the coding agent you use when
44
+ asked. The CLI creates and links the hosted project. See
45
+ [`create-zuplo-api`](../../cli/create-zuplo-api.mdx).
46
+
47
+ :::tip{title="Zuplo skills"}
48
+
49
+ The scaffold installs Zuplo skills in this project for Codex and Cursor and
50
+ configures the Claude Code plugin. If setup fails, follow
51
+ [Agent Skills](../../build-with-ai.mdx#agent-skills) from this directory
52
+ before starting your agent.
53
+
54
+ :::
55
+
56
+ 2. **Give the agent the gateway configuration task**
57
+
58
+ Open your agent in the project directory and use this prompt:
59
+
60
+ ```text
61
+ Read the project instructions and bundled Zuplo MCP Gateway docs. Build a
62
+ local gateway in front of Linear using the dev-login shortcut. Use
63
+ http://127.0.0.1:9000 consistently for local URLs.
64
+
65
+ In modules/zuplo.runtime.ts, export runtimeInit(runtime: RuntimeExtensions),
66
+ import RuntimeExtensions from @zuplo/runtime and McpGatewayPlugin from
67
+ @zuplo/runtime/mcp-gateway, and register new McpGatewayPlugin().
68
+
69
+ config/policies.json must be an object containing a policies array. Add:
70
+
71
+ 1. name "dev-oauth", policyType "mcp-oauth-inbound", handler module
72
+ "$import(@zuplo/runtime/mcp-gateway)", export "McpOAuthInboundPolicy".
73
+ options.oidc has issuer "http://127.0.0.1:9000" and jwksUrl
74
+ "http://127.0.0.1:9000/jwks". options.browserLogin.url is
75
+ "http://127.0.0.1:9000/__zuplo/oauth/dev-login".
76
+ The OIDC values are placeholders required for local dev-login; don't
77
+ create a JWKS route or claim that /jwks exists.
78
+
79
+ 2. name "mcp-token-exchange-linear", policyType "mcp-token-exchange-inbound",
80
+ handler module "$import(@zuplo/runtime/mcp-gateway)", export
81
+ "McpTokenExchangeInboundPolicy". Its options are:
82
+ {
83
+ "displayName": "Linear",
84
+ "protectedResourceMetadataUrl": "https://mcp.linear.app/.well-known/oauth-protected-resource",
85
+ "authMode": "user-oauth",
86
+ "scopes": [],
87
+ "clientRegistration": { "mode": "auto" }
88
+ }
89
+
90
+ In config/routes.oas.json, add /mcp/linear-v1 with method key "get,post",
91
+ operationId "linear-mcp-server", and x-zuplo-route.corsPolicy "none".
92
+ Use McpProxyHandler from $import(@zuplo/runtime/mcp-gateway), with options
93
+ { "rewritePattern": "https://mcp.linear.app/mcp" }.
94
+ Attach inbound policies in this order: dev-oauth, mcp-token-exchange-linear.
95
+
96
+ Run npm run dev and send an unauthenticated tools/list POST to the route.
97
+ Verify 401 and a WWW-Authenticate header identifying the protected-resource
98
+ metadata URL. This is only the first check; do not claim Linear works until
99
+ I complete browser OAuth and run a real tool. Do not deploy dev-login.
100
+ Show me the diff and the client URL.
101
+ ```
102
+
103
+ The [Editor tutorial](./local.mdx) shows these files as copyable examples.
104
+ See [How it works](../../mcp-gateway/how-it-works.mdx) for the gateway's
105
+ sign-in and upstream authorization flows.
106
+
107
+ 3. **Verify authentication is attached**
108
+
109
+ Review the diff, then run `npm run dev` if it isn't already running. In
110
+ another terminal, send:
111
+
112
+ ```bash
113
+ curl -i -X POST http://127.0.0.1:9000/mcp/linear-v1 \
114
+ -H "Content-Type: application/json" \
115
+ -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
116
+ ```
117
+
118
+ Expect `401 Unauthorized` and a `WWW-Authenticate` header pointing to
119
+ `/.well-known/oauth-protected-resource/mcp/linear-v1`. A `404` suggests a
120
+ route mismatch; for a `500`, inspect the gateway's terminal output.
121
+
122
+ 4. **Authorize Linear in your MCP client**
123
+
124
+ Add `http://127.0.0.1:9000/mcp/linear-v1` as an HTTP MCP server in your
125
+ client. See
126
+ [Connect MCP clients](../../mcp-gateway/connect-clients/overview.mdx) for
127
+ client-specific setup.
128
+
129
+ Keep `127.0.0.1` in the client URL to match the policy. During the browser
130
+ OAuth flow, dev-login signs you in locally. On the gateway's consent page,
131
+ click **Connect** for Linear, authorize your Linear account, then click
132
+ **Authorize** to complete the gateway connection.
133
+
134
+ Complete these actions yourself; the coding agent doesn't need your Linear
135
+ password or tokens.
136
+
137
+ 5. **Run a real tool**
138
+
139
+ Ask your client to `List my open Linear issues`. Approve the tool call. Check
140
+ that it returns your issues, or an empty result if you have none, without an
141
+ authentication error.
142
+
143
+ If connection fails, check that the local server is running and the client
144
+ uses `127.0.0.1` throughout. See
145
+ [Local development](../../mcp-gateway/code-config/local-development.mdx).
146
+
147
+ </Stepper>
148
+
149
+ ## Deploy with your identity provider
150
+
151
+ Dev-login works only on loopback origins. Before sharing the gateway, replace it
152
+ with your identity provider using
153
+ [Configure local and deployed environments](../../mcp-gateway/code-config/local-development.mdx#configure-local-and-deployed-environments),
154
+ then follow [Deploy to the edge](../gateway/deploy-to-the-edge/local.mdx).
155
+ Repeat the full browser authorization and tool call against the hosted URL.
156
+
157
+ ## Next steps
158
+
159
+ - [Front more upstream servers](../../mcp-gateway/code-config/multi-upstream.mdx).
160
+ - [Filter tools and other capabilities](../../mcp-gateway/capability-filtering.mdx).
161
+ - [Choose an identity provider](../../mcp-gateway/auth/overview.mdx).
@@ -0,0 +1,25 @@
1
+ ---
2
+ category: MCP Gateway
3
+ fullWidth: true
4
+ disablePager: true
5
+ showLastModified: false
6
+ suggestEdit: false
7
+ centered: false
8
+ toc: false
9
+ title: Getting Started with MCP Gateway
10
+ description:
11
+ Govern remote MCP servers with auth, tool curation and policies with Zuplo, in
12
+ the Portal, locally with the CLI, or with an AI agent.
13
+ ---
14
+
15
+ <WizardSteps build="mcp-gateway" />
16
+
17
+ An MCP Gateway controls access to an existing Model Context Protocol (MCP)
18
+ server. This tutorial connects Linear through Zuplo so an AI assistant can call
19
+ its tools after you sign in.
20
+
21
+ You need a Linear workspace and an MCP client, such as Claude Desktop. The
22
+ Portal guide uses Auth0 for sign-in; the local guides use development sign-in to
23
+ test on your machine. Choose the workflow that fits your setup.
24
+
25
+ <MethodPicker build="mcp-gateway" />