@2tl/hangar-mcp 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ Copyright (c) 2026 2tl. All rights reserved.
2
+
3
+ You may install and run this package to use the Hangar service.
4
+
5
+ Third-party software bundled in this package is listed, with its own license,
6
+ in THIRD_PARTY_NOTICES.
package/README.md ADDED
@@ -0,0 +1,203 @@
1
+ # Hangar MCP server (`@2tl/hangar-mcp`)
2
+
3
+ A local [Model Context Protocol](https://modelcontextprotocol.io) server that lets an AI coding tool
4
+ (Claude Code, Claude Desktop, Cursor, …) create a Hangar project, publish your built web app and
5
+ switch the **preview** site to it. Production stays a human decision in the Hangar console.
6
+
7
+ AI 코딩 도구가 Hangar 프로젝트를 만들고, 빌드한 웹앱을 올리고, **preview** 에 띄우게 해 주는
8
+ 로컬 MCP 서버입니다. production 전환은 사람이 콘솔에서 합니다.
9
+
10
+ - Runs on your machine over stdio (`npx -y @2tl/hangar-mcp@0.1.0`). Node 22 or newer.
11
+ - Talks only to the Hangar API (`https://app-api.2tl.io`). Sites are served at
12
+ `https://<slug>.apps.2tl.io`, previews at `https://<slug>-preview.apps.2tl.io`.
13
+ - Never builds, installs or runs your project's code. Your AI tool builds; this server uploads.
14
+
15
+ ## 1. Get a key (one time) / 키 발급
16
+
17
+ 1. In the Hangar console, open your workspace → **Keys** → issue an **automation key** (`hgw_…`).
18
+ Leave "allow production activation" off. The key is shown once — copy it.
19
+ 2. Copy the **workspace ID** (a UUID) from the same page.
20
+
21
+ 콘솔 → 워크스페이스 → 키에서 자동화 키(`hgw_…`)를 발급하고(“production 활성화 허용”은 끈 채로),
22
+ 워크스페이스 ID 와 함께 복사해 두세요. 키는 한 번만 보입니다.
23
+
24
+ Never put the key in a prompt, a chat message or a file inside your project: anything typed into a chat
25
+ can end up in logs and history, and anything in the project can end up in git or in a published build.
26
+
27
+ 키는 채팅·프롬프트·프로젝트 안 파일에 넣지 마세요.
28
+
29
+ ## 2. Register the server / 등록
30
+
31
+ Always pin the version: `@2tl/hangar-mcp@0.1.0`, never a bare `@2tl/hangar-mcp` or `@latest`.
32
+ **Update by bumping the version deliberately. / 업데이트는 버전을 올려서 직접 하세요.**
33
+
34
+ **Which folders it may open / 열 수 있는 폴더.** The server only reads (and, for `hangar.json`, writes)
35
+ inside the folder the AI tool was started in, or inside `HANGAR_ALLOWED_ROOTS` (absolute paths, separated
36
+ by `:` — `;` on Windows). Start the AI tool **inside the project folder** (`cd my-app && claude`), or set
37
+ `HANGAR_ALLOWED_ROOTS`. Claude Desktop and Cursor start servers from a folder you do not choose, so
38
+ set it there. Hidden folders (`.ssh`, `.git`, `.config`, …), system folders, the home, Desktop,
39
+ Documents and Downloads folders themselves, and any folder that contains home (`/Users`, `/home`, …) are
40
+ always refused.
41
+
42
+ 서버는 AI 도구를 실행한 폴더, 또는 `HANGAR_ALLOWED_ROOTS`(절대 경로, `:` 구분 — Windows 는 `;`) 안에서만
43
+ 읽고 씁니다. **AI 도구를 프로젝트 폴더 안에서 실행**하거나 `HANGAR_ALLOWED_ROOTS` 를 설정하세요 (Claude
44
+ Desktop·Cursor 는 필수). 숨김 폴더·시스템 폴더·홈/데스크탑/문서/다운로드 폴더 자체와 홈을 품은 상위 폴더(`/Users`, `/home` 등)는
45
+ 항상 거절됩니다.
46
+
47
+ ### Recommended: keep the key in the CLI's credential file / 권장: CLI 프로필
48
+
49
+ The AI tool's config then holds no key at all. `hangar login` stores it in `~/.hangar/credentials.json`
50
+ (file mode 0600), read from stdin — never from an argument or an environment variable:
51
+
52
+ ```bash
53
+ npm i -g @2tl/hangar@0.1.0
54
+ # copy the key in the console, then pipe it straight from the clipboard: no shell history, no file
55
+ # (Linux: xclip -selection clipboard -o | …, Windows PowerShell: Get-Clipboard | …)
56
+ pbpaste | hangar login --workspace-key --workspace <workspace-uuid> --profile ws --token-stdin
57
+ ```
58
+
59
+ Then register the server with `--profile ws` instead of the key variables (examples below).
60
+
61
+ ### Claude Code
62
+
63
+ User scope only — `--scope project` writes `.mcp.json` into the repository and **must not be used** with a
64
+ key. With a CLI profile:
65
+
66
+ ```bash
67
+ cd my-app
68
+ claude mcp add --scope user hangar -- npx -y @2tl/hangar-mcp@0.1.0 --profile ws
69
+ ```
70
+
71
+ Or with the key in the env (stored in plain text in `~/.claude.json`). `read -rs` keeps it out of your
72
+ shell history and off the screen:
73
+
74
+ ```bash
75
+ read -rs HANGAR_KEY # paste the hgw_ key, press Enter
76
+ claude mcp add --scope user hangar \
77
+ -e HANGAR_WORKSPACE_ID=<workspace-uuid> \
78
+ -e HANGAR_WORKSPACE_KEY="$HANGAR_KEY" \
79
+ -- npx -y @2tl/hangar-mcp@0.1.0
80
+ unset HANGAR_KEY
81
+ ```
82
+
83
+ `--scope project` 는 저장소에 `.mcp.json` 을 만드니 키와 함께 쓰지 마세요.
84
+
85
+ ### Claude Desktop
86
+
87
+ `claude_desktop_config.json` (Settings → Developer → Edit Config):
88
+
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "hangar": {
93
+ "command": "npx",
94
+ "args": ["-y", "@2tl/hangar-mcp@0.1.0", "--profile", "ws"],
95
+ "env": {
96
+ "HANGAR_ALLOWED_ROOTS": "/Users/you/projects"
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ Without a CLI profile, drop `"--profile", "ws"` and add `HANGAR_WORKSPACE_ID` and
104
+ `HANGAR_WORKSPACE_KEY` to `env` (the file then holds the key in plain text).
105
+
106
+ ### Cursor
107
+
108
+ Only the **global** `~/.cursor/mcp.json` — never a project's `.cursor/mcp.json`, which lives in the
109
+ repository. 프로젝트의 `.cursor/mcp.json` 에는 넣지 마세요.
110
+
111
+ ```json
112
+ {
113
+ "mcpServers": {
114
+ "hangar": {
115
+ "command": "npx",
116
+ "args": ["-y", "@2tl/hangar-mcp@0.1.0", "--profile", "ws"],
117
+ "env": {
118
+ "HANGAR_ALLOWED_ROOTS": "/Users/you/projects"
119
+ }
120
+ }
121
+ }
122
+ }
123
+ ```
124
+
125
+ Restart the AI tool, then ask it: *"Check my Hangar key with hangar_whoami."*
126
+
127
+ ### Configuration
128
+
129
+ | Variable | |
130
+ | --- | --- |
131
+ | `HANGAR_WORKSPACE_KEY` | The `hgw_` automation key, if you do not use `--profile`. The server reads it once at startup, removes it from its environment, keeps it in memory and never prints it or writes it anywhere. Your AI tool, however, stores its MCP configuration — key included — in its own config file in plain text. |
132
+ | `HANGAR_WORKSPACE_ID` | The workspace UUID. Required with the key. |
133
+ | `HANGAR_ALLOWED_ROOTS` | Folders the server may open (see above). Default: the folder the AI tool started it in. |
134
+ | `HANGAR_API_URL` | Leave unset (`https://app-api.2tl.io`). Any other API needs `HANGAR_ALLOW_CUSTOM_API_URL=1` (http on localhost/127.0.0.1: `HANGAR_ALLOW_INSECURE_LOCAL=1`) — the key is sent there, and `hangar_whoami` warns about it. |
135
+
136
+ `--profile <name>` uses a workspace profile saved by `hangar login --workspace-key` (package
137
+ `@2tl/hangar`). With neither the key nor `--profile`, the server uses the CLI's current profile if that
138
+ is a workspace key profile.
139
+
140
+ If the configuration is wrong the server still starts, and every tool answers with what to fix.
141
+ Diagnostics go to stderr; the key is masked (`hgw_****`) everywhere.
142
+
143
+ ## 3. What to ask / 이렇게 요청하세요
144
+
145
+ > "Make a small guestbook web app with a database, deploy it to Hangar preview as `my-guestbook`, and
146
+ > give me the preview link."
147
+ >
148
+ > "방명록 웹앱을 DB 포함으로 만들어서 Hangar preview 에 `my-guestbook` 으로 올리고 링크 알려줘."
149
+
150
+ The server gives the AI this workflow:
151
+
152
+ 1. `hangar_whoami` — the key works; how many projects it may still create.
153
+ 2. `hangar_create_project {slug, data: true}` — creates the project (and database), returns the preview
154
+ URL and the **preview** `apiUrl` + public `anonKey` for the app's env (e.g. `VITE_HANGAR_API_URL`,
155
+ `VITE_HANGAR_ANON_KEY` in `.env.local`).
156
+ 3. The AI builds the app (e.g. `npm run build`).
157
+ 4. `hangar_check_project {projectDir, init: true}` — creates `hangar.json` if missing; reports problems,
158
+ including database tables without row-level security.
159
+ 5. `hangar_publish {projectDir, slug, environment: "preview"}` — uploads the build as a release and reports
160
+ the source folder, file count, bytes and file list.
161
+ 6. `hangar_activate_preview {slug, releaseId}` — switches preview to it and waits until it is live.
162
+ The preview site is behind Basic auth: user `preview`, password in the console (project → Preview access).
163
+ 7. For production: rebuild with the **production** keys (`hangar_get_data_keys` environment `production`
164
+ — preview and production have separate databases and user accounts), `hangar_publish` with
165
+ environment `production` and `confirm: true` — the AI must ask you first — then
166
+ `hangar_production_handoff`, which gives **you** the console link, what was published and what to
167
+ click. You switch production in the console.
168
+
169
+ ## Tools
170
+
171
+ | Tool | What it does |
172
+ | --- | --- |
173
+ | `hangar_whoami` | Key name, workspace, expiry, projects created / limit, whether production activation is allowed. |
174
+ | `hangar_list_projects` | Projects the key reaches: slug, name, preview and production URLs. |
175
+ | `hangar_create_project` | Create (or reuse) a project; with `data`, enable the database in both environments and wait. Returns URLs and the preview public keys. |
176
+ | `hangar_get_data_keys` | Public `apiUrl` + `anonKey` for one environment. Never `service_role`. |
177
+ | `hangar_check_project` | Offline check of an app directory; `init: true` creates `hangar.json` when missing (only in a folder with `package.json` or `index.html`). |
178
+ | `hangar_publish` | Upload existing build output as a release in one environment. Does not activate; refuses when nothing is built; production needs `confirm: true`. Refuses credential files, `.env*`, keys, databases and files containing tokens or private keys. |
179
+ | `hangar_activate_preview` | Switch **preview** to a release and wait for the rollout (up to ~3 minutes). |
180
+ | `hangar_release_status` | Desired vs. serving release and the in-flight deployment, per environment. |
181
+ | `hangar_production_handoff` | Does not activate. Returns the console URL and instructions for the human. |
182
+ | `hangar_list_jobs` / `hangar_job_runs` | Scheduled jobs and their recent runs. Read-only. |
183
+
184
+ ## Intentionally not available / 일부러 없는 것
185
+
186
+ - **Activating production** — even if the key allows it. A human does that in the console.
187
+ - **`service_role` keys** — they bypass row-level security and must never reach an AI conversation or a
188
+ browser bundle. This server has no tool that reads them.
189
+ - **Secret values** (job secrets) — reading or setting them.
190
+ - **Deleting anything** — projects, releases, databases, keys; rotating or disabling the database.
191
+
192
+ An agent holding this key can never do more than a person holding the same key with the CLI.
193
+
194
+ ## Limits of the key
195
+
196
+ A key reaches only the projects it created and the ones granted to it when it was issued; everything
197
+ else in the workspace is invisible to it ("not found"). Each key can create a limited number of
198
+ projects (the count never goes down) and expires (at most 90 days). Keys are not extended: issue a
199
+ new one in the console.
200
+
201
+ Slugs are the site address, so they are unique across all of Hangar: lowercase `a-z`, `0-9` and `-`,
202
+ up to 63 characters, not ending in `-preview`, and not a reserved name such as `www`, `api`, `admin`,
203
+ `console`, `docs` or `status`.
@@ -0,0 +1,251 @@
1
+ THIRD-PARTY SOFTWARE NOTICES — @2tl/hangar-mcp
2
+
3
+ This package is distributed as a single bundled file. It includes the following
4
+ third-party packages, each under its own license, reproduced below.
5
+
6
+ ==============================================================================
7
+ @modelcontextprotocol/sdk@1.30.1 — MIT
8
+ git+https://github.com/modelcontextprotocol/typescript-sdk.git
9
+ ==============================================================================
10
+
11
+ MIT License
12
+
13
+ Copyright (c) 2024 Anthropic, PBC
14
+
15
+ Permission is hereby granted, free of charge, to any person obtaining a copy
16
+ of this software and associated documentation files (the "Software"), to deal
17
+ in the Software without restriction, including without limitation the rights
18
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19
+ copies of the Software, and to permit persons to whom the Software is
20
+ furnished to do so, subject to the following conditions:
21
+
22
+ The above copyright notice and this permission notice shall be included in all
23
+ copies or substantial portions of the Software.
24
+
25
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
+ SOFTWARE.
32
+
33
+ ==============================================================================
34
+ ajv@8.20.0 — MIT
35
+ ajv-validator/ajv
36
+ ==============================================================================
37
+
38
+ The MIT License (MIT)
39
+
40
+ Copyright (c) 2015-2021 Evgeny Poberezkin
41
+
42
+ Permission is hereby granted, free of charge, to any person obtaining a copy
43
+ of this software and associated documentation files (the "Software"), to deal
44
+ in the Software without restriction, including without limitation the rights
45
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
46
+ copies of the Software, and to permit persons to whom the Software is
47
+ furnished to do so, subject to the following conditions:
48
+
49
+ The above copyright notice and this permission notice shall be included in all
50
+ copies or substantial portions of the Software.
51
+
52
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
53
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
54
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
55
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
56
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
57
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
58
+ SOFTWARE.
59
+
60
+ ==============================================================================
61
+ ajv@8.18.0 — MIT
62
+ ajv-validator/ajv (a second copy, nested under ajv-formats and bundled alongside ajv@8.20.0)
63
+ ==============================================================================
64
+
65
+ The MIT License (MIT)
66
+
67
+ Copyright (c) 2015-2021 Evgeny Poberezkin
68
+
69
+ Permission is hereby granted, free of charge, to any person obtaining a copy
70
+ of this software and associated documentation files (the "Software"), to deal
71
+ in the Software without restriction, including without limitation the rights
72
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
73
+ copies of the Software, and to permit persons to whom the Software is
74
+ furnished to do so, subject to the following conditions:
75
+
76
+ The above copyright notice and this permission notice shall be included in all
77
+ copies or substantial portions of the Software.
78
+
79
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
80
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
81
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
82
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
83
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
84
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
85
+ SOFTWARE.
86
+
87
+ ==============================================================================
88
+ ajv-formats@3.0.1 — MIT
89
+ git+https://github.com/ajv-validator/ajv-formats.git
90
+ ==============================================================================
91
+
92
+ MIT License
93
+
94
+ Copyright (c) 2020 Evgeny Poberezkin
95
+
96
+ Permission is hereby granted, free of charge, to any person obtaining a copy
97
+ of this software and associated documentation files (the "Software"), to deal
98
+ in the Software without restriction, including without limitation the rights
99
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
100
+ copies of the Software, and to permit persons to whom the Software is
101
+ furnished to do so, subject to the following conditions:
102
+
103
+ The above copyright notice and this permission notice shall be included in all
104
+ copies or substantial portions of the Software.
105
+
106
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
107
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
108
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
109
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
110
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
111
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
112
+ SOFTWARE.
113
+
114
+ ==============================================================================
115
+ fast-deep-equal@3.1.3 — MIT
116
+ git+https://github.com/epoberezkin/fast-deep-equal.git
117
+ ==============================================================================
118
+
119
+ MIT License
120
+
121
+ Copyright (c) 2017 Evgeny Poberezkin
122
+
123
+ Permission is hereby granted, free of charge, to any person obtaining a copy
124
+ of this software and associated documentation files (the "Software"), to deal
125
+ in the Software without restriction, including without limitation the rights
126
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
127
+ copies of the Software, and to permit persons to whom the Software is
128
+ furnished to do so, subject to the following conditions:
129
+
130
+ The above copyright notice and this permission notice shall be included in all
131
+ copies or substantial portions of the Software.
132
+
133
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
134
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
135
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
136
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
137
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
138
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
139
+ SOFTWARE.
140
+
141
+ ==============================================================================
142
+ fast-uri@3.1.8 — BSD-3-Clause
143
+ git+https://github.com/fastify/fast-uri.git
144
+ ==============================================================================
145
+
146
+ Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae
147
+ Copyright (c) 2021-present The Fastify team <https://github.com/fastify/fastify#team>
148
+ All rights reserved.
149
+
150
+ Redistribution and use in source and binary forms, with or without
151
+ modification, are permitted provided that the following conditions are met:
152
+ * Redistributions of source code must retain the above copyright
153
+ notice, this list of conditions and the following disclaimer.
154
+ * Redistributions in binary form must reproduce the above copyright
155
+ notice, this list of conditions and the following disclaimer in the
156
+ documentation and/or other materials provided with the distribution.
157
+ * The names of any contributors may not be used to endorse or promote
158
+ products derived from this software without specific prior written
159
+ permission.
160
+
161
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
162
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
163
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
164
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
165
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
166
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
167
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
168
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
169
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
170
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
171
+
172
+ * * *
173
+
174
+ The complete list of contributors can be found at:
175
+ - https://github.com/garycourt/uri-js/graphs/contributors
176
+
177
+ ==============================================================================
178
+ json-schema-traverse@1.0.0 — MIT
179
+ git+https://github.com/epoberezkin/json-schema-traverse.git
180
+ ==============================================================================
181
+
182
+ MIT License
183
+
184
+ Copyright (c) 2017 Evgeny Poberezkin
185
+
186
+ Permission is hereby granted, free of charge, to any person obtaining a copy
187
+ of this software and associated documentation files (the "Software"), to deal
188
+ in the Software without restriction, including without limitation the rights
189
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
190
+ copies of the Software, and to permit persons to whom the Software is
191
+ furnished to do so, subject to the following conditions:
192
+
193
+ The above copyright notice and this permission notice shall be included in all
194
+ copies or substantial portions of the Software.
195
+
196
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
197
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
198
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
199
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
200
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
201
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
202
+ SOFTWARE.
203
+
204
+ ==============================================================================
205
+ zod@3.25.76 — MIT
206
+ git+https://github.com/colinhacks/zod.git
207
+ ==============================================================================
208
+
209
+ MIT License
210
+
211
+ Copyright (c) 2025 Colin McDonnell
212
+
213
+ Permission is hereby granted, free of charge, to any person obtaining a copy
214
+ of this software and associated documentation files (the "Software"), to deal
215
+ in the Software without restriction, including without limitation the rights
216
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
217
+ copies of the Software, and to permit persons to whom the Software is
218
+ furnished to do so, subject to the following conditions:
219
+
220
+ The above copyright notice and this permission notice shall be included in all
221
+ copies or substantial portions of the Software.
222
+
223
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
224
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
225
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
226
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
227
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
228
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
229
+ SOFTWARE.
230
+
231
+ ==============================================================================
232
+ zod-to-json-schema@3.25.2 — ISC
233
+ https://github.com/StefanTerdell/zod-to-json-schema
234
+ ==============================================================================
235
+
236
+ ISC License
237
+
238
+ Copyright (c) 2020, Stefan Terdell
239
+
240
+ Permission to use, copy, modify, and/or distribute this software for any
241
+ purpose with or without fee is hereby granted, provided that the above
242
+ copyright notice and this permission notice appear in all copies.
243
+
244
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
245
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
246
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
247
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
248
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
249
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
250
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
251
+