teletype-mcp-server 0.1.0 → 0.1.1
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/.env.example +7 -0
- package/LAUNCHGUIDE.md +51 -0
- package/README-ru.md +49 -11
- package/README.md +68 -30
- package/dist/config.d.ts +4 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/http.js +69 -1
- package/dist/http.js.map +1 -1
- package/dist/landing-page.d.ts +1 -0
- package/dist/landing-page.js +166 -0
- package/dist/landing-page.js.map +1 -0
- package/dist/oauth-page.d.ts +1 -0
- package/dist/oauth-page.js +242 -0
- package/dist/oauth-page.js.map +1 -0
- package/dist/oauth-store.d.ts +48 -0
- package/dist/oauth-store.js +131 -0
- package/dist/oauth-store.js.map +1 -0
- package/dist/oauth.d.ts +4 -0
- package/dist/oauth.js +382 -0
- package/dist/oauth.js.map +1 -0
- package/dist/request-context.d.ts +2 -0
- package/dist/request-context.js.map +1 -1
- package/dist/tool-policy.js +7 -0
- package/dist/tool-policy.js.map +1 -1
- package/docs/CLIENTS.md +651 -27
- package/docs/CONTRIBUTING.md +4 -2
- package/docs/OAUTH.md +54 -0
- package/docs/SECURITY.md +3 -1
- package/docs/ru/CLIENTS.md +651 -27
- package/docs/ru/CONTRIBUTING.md +4 -2
- package/docs/ru/OAUTH.md +54 -0
- package/docs/ru/SECURITY.md +3 -1
- package/examples/clients/goose-stdio.yaml +13 -0
- package/examples/clients/openclaw.json +13 -0
- package/gemini-extension.json +22 -0
- package/lhm.plugin.json +1408 -0
- package/llms-install.md +17 -0
- package/package.json +9 -4
- package/plugin/.claude-plugin/plugin.json +37 -0
- package/plugin/.cursor-plugin/plugin.json +34 -0
- package/plugin/LICENSE +21 -0
- package/plugin/README.md +48 -0
- package/plugin/assets/README.md +12 -0
- package/plugin/assets/consent.js +32 -0
- package/plugin/assets/fonts/OFL.txt +93 -0
- package/plugin/assets/fonts/manrope.woff2 +0 -0
- package/plugin/assets/icon-400.png +0 -0
- package/plugin/assets/icon.png +0 -0
- package/plugin/assets/icon.svg +15 -0
- package/plugin/assets/landing.css +442 -0
- package/plugin/assets/landing.js +85 -0
- package/plugin/assets/logo.svg +16 -0
- package/plugin/commands/client-summary.md +14 -0
- package/plugin/commands/draft-reply.md +13 -0
- package/plugin/commands/escalate-issue.md +15 -0
- package/plugin/commands/shift-handover.md +10 -0
- package/plugin/commands/triage-inbox.md +13 -0
- package/plugin/mcp.json +10 -0
- package/plugin/plugin.json +15 -0
- package/plugin/skills/teletype-support/SKILL.md +3 -1
- package/plugin/skills/teletype-support/references/installation.md +31 -0
- package/server.json +18 -4
- package/smithery.yaml +3 -2
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { createHash, createHmac, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import express from "express";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { mcpAuthRouter } from "@modelcontextprotocol/sdk/server/auth/router.js";
|
|
6
|
+
import { InvalidClientMetadataError, InvalidGrantError, InvalidScopeError, InvalidTargetError, InvalidTokenError, TooManyRequestsError, } from "@modelcontextprotocol/sdk/server/auth/errors.js";
|
|
7
|
+
import { requestContext } from "./request-context.js";
|
|
8
|
+
import { teletypeRequest } from "./teletype-api.js";
|
|
9
|
+
import { decodeProjectDetails } from "./api-contract.js";
|
|
10
|
+
import { RequestLimiter } from "./request-limiter.js";
|
|
11
|
+
import { OAuthStore } from "./oauth-store.js";
|
|
12
|
+
import { consentPage } from "./oauth-page.js";
|
|
13
|
+
const ACCESS_SECONDS = 3600;
|
|
14
|
+
const CLIENT_SECONDS = 30 * 24 * 3600;
|
|
15
|
+
const MAX_ENTRIES = 1000;
|
|
16
|
+
const MAX_ACCESS_TOKENS = 8000;
|
|
17
|
+
const SCOPES = ["read", "write", "offline_access"];
|
|
18
|
+
const now = () => Math.floor(Date.now() / 1000);
|
|
19
|
+
const hash = (value) => createHash("sha256").update(value).digest("hex");
|
|
20
|
+
const secret = () => randomBytes(32).toString("base64url");
|
|
21
|
+
const consentFields = z.object({
|
|
22
|
+
request_id: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
|
|
23
|
+
action: z.enum(["connect", "cancel"]),
|
|
24
|
+
api_token: z.string().max(2048).optional(),
|
|
25
|
+
allow_write: z.enum(["yes", ""]).optional(),
|
|
26
|
+
});
|
|
27
|
+
class ProjectOAuthProvider {
|
|
28
|
+
cfg;
|
|
29
|
+
store;
|
|
30
|
+
refreshKey;
|
|
31
|
+
resource;
|
|
32
|
+
issuer;
|
|
33
|
+
clientsStore;
|
|
34
|
+
constructor(cfg) {
|
|
35
|
+
this.cfg = cfg;
|
|
36
|
+
if (!cfg.oauth)
|
|
37
|
+
throw new Error("OAuth configuration is missing.");
|
|
38
|
+
this.issuer = new URL(cfg.publicBaseUrl);
|
|
39
|
+
this.resource = new URL("/mcp", this.issuer);
|
|
40
|
+
this.store = new OAuthStore(cfg.oauth.databasePath, cfg.oauth.encryptionKey, this.resource.href);
|
|
41
|
+
this.refreshKey = createHmac("sha256", Buffer.from(cfg.oauth.encryptionKey, "hex"))
|
|
42
|
+
.update("teletype-oauth-refresh-v1:" + this.resource.href)
|
|
43
|
+
.digest();
|
|
44
|
+
this.clientsStore = {
|
|
45
|
+
getClient: (id) => this.store.get("client", id),
|
|
46
|
+
registerClient: (metadata) => this.store.transaction(() => {
|
|
47
|
+
if (this.store.count("client") >= MAX_ENTRIES)
|
|
48
|
+
throw new TooManyRequestsError("OAuth client capacity reached.");
|
|
49
|
+
if (metadata.redirect_uris.length > 10 ||
|
|
50
|
+
metadata.redirect_uris.some((value) => !validRedirect(value))) {
|
|
51
|
+
throw new InvalidClientMetadataError("Redirects require HTTPS or loopback HTTP without fragments or credentials.");
|
|
52
|
+
}
|
|
53
|
+
if (JSON.stringify(metadata).length > 4096)
|
|
54
|
+
throw new InvalidClientMetadataError("Client metadata is too large.");
|
|
55
|
+
if (metadata.scope?.split(" ").some((scope) => !SCOPES.includes(scope)))
|
|
56
|
+
throw new InvalidClientMetadataError("Unsupported scope.");
|
|
57
|
+
const client = { ...metadata, client_id: randomUUID(), client_id_issued_at: now() };
|
|
58
|
+
this.store.put("client", client.client_id, client, now() + CLIENT_SECONDS);
|
|
59
|
+
return client;
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
close() {
|
|
64
|
+
this.store.close();
|
|
65
|
+
}
|
|
66
|
+
checkResource(resource) {
|
|
67
|
+
if (resource && resource.href !== this.resource.href)
|
|
68
|
+
throw new InvalidTargetError("The token is restricted to the Teletype MCP endpoint.");
|
|
69
|
+
}
|
|
70
|
+
authorize(client, params, res) {
|
|
71
|
+
this.checkResource(params.resource);
|
|
72
|
+
if ((params.state?.length ?? 0) > 2048 || params.redirectUri.length > 2048)
|
|
73
|
+
throw new InvalidGrantError("Authorization parameters are too large.");
|
|
74
|
+
const scopes = params.scopes?.length ? [...new Set(params.scopes)] : ["read"];
|
|
75
|
+
if (!scopes.includes("read") ||
|
|
76
|
+
scopes.some((scope) => !SCOPES.includes(scope)) ||
|
|
77
|
+
(this.cfg.readOnly && scopes.includes("write"))) {
|
|
78
|
+
throw new InvalidScopeError("Request read, optionally write and offline_access. A read-only deployment cannot grant write.");
|
|
79
|
+
}
|
|
80
|
+
if (!/^[A-Za-z0-9_-]{43}$/.test(params.codeChallenge))
|
|
81
|
+
throw new InvalidGrantError("A valid S256 PKCE challenge is required.");
|
|
82
|
+
const id = secret();
|
|
83
|
+
const cookie = secret();
|
|
84
|
+
this.store.transaction(() => {
|
|
85
|
+
if (this.store.count("consent") >= MAX_ENTRIES)
|
|
86
|
+
throw new TooManyRequestsError("OAuth consent capacity reached.");
|
|
87
|
+
this.store.put("consent", hash(id), {
|
|
88
|
+
clientId: client.client_id,
|
|
89
|
+
redirectUri: params.redirectUri,
|
|
90
|
+
challenge: params.codeChallenge,
|
|
91
|
+
state: params.state,
|
|
92
|
+
scopes,
|
|
93
|
+
cookieHash: hash(cookie),
|
|
94
|
+
expiresAt: now() + 600,
|
|
95
|
+
}, now() + 600);
|
|
96
|
+
});
|
|
97
|
+
res.cookie(cookieName(id), cookie, {
|
|
98
|
+
httpOnly: true,
|
|
99
|
+
secure: this.issuer.protocol === "https:",
|
|
100
|
+
sameSite: "strict",
|
|
101
|
+
path: "/oauth/consent",
|
|
102
|
+
maxAge: 600_000,
|
|
103
|
+
});
|
|
104
|
+
res.set({
|
|
105
|
+
"Cache-Control": "no-store",
|
|
106
|
+
"Referrer-Policy": "same-origin",
|
|
107
|
+
"X-Content-Type-Options": "nosniff",
|
|
108
|
+
"Content-Security-Policy": `default-src 'none'; script-src 'self'; style-src 'unsafe-inline'; img-src 'self'; font-src 'self'; form-action 'self' ${new URL(params.redirectUri).origin}; frame-ancestors 'none'; base-uri 'none'`,
|
|
109
|
+
});
|
|
110
|
+
const savedLocale = res.req.headers.cookie
|
|
111
|
+
?.split(";")
|
|
112
|
+
.map((part) => part.trim())
|
|
113
|
+
.find((part) => part.startsWith("teletype_oauth_locale="))
|
|
114
|
+
?.slice("teletype_oauth_locale=".length);
|
|
115
|
+
const locale = savedLocale === "ru" || savedLocale === "en"
|
|
116
|
+
? savedLocale
|
|
117
|
+
: res.req.acceptsLanguages("en", "ru") === "ru"
|
|
118
|
+
? "ru"
|
|
119
|
+
: "en";
|
|
120
|
+
res
|
|
121
|
+
.type("html")
|
|
122
|
+
.send(consentPage(client.client_name || "", new URL(params.redirectUri).origin, id, scopes, locale));
|
|
123
|
+
return Promise.resolve();
|
|
124
|
+
}
|
|
125
|
+
async completeConsent(req, res) {
|
|
126
|
+
if (req.headers.origin !== this.issuer.origin) {
|
|
127
|
+
res.status(403).json({ error: "consent_origin_invalid" });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const input = req.body;
|
|
131
|
+
const fields = consentFields.safeParse(input);
|
|
132
|
+
if (!fields.success) {
|
|
133
|
+
res.status(400).json({ error: "invalid_consent_request" });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const id = fields.data.request_id;
|
|
137
|
+
const cookie = (req.headers.cookie || "")
|
|
138
|
+
.split(";")
|
|
139
|
+
.map((part) => part.trim())
|
|
140
|
+
.find((part) => part.startsWith(cookieName(id) + "="))
|
|
141
|
+
?.slice(cookieName(id).length + 1);
|
|
142
|
+
const consent = this.store.transaction(() => {
|
|
143
|
+
const item = this.store.get("consent", hash(id));
|
|
144
|
+
if (!item || !cookie || hash(cookie) !== item.cookieHash)
|
|
145
|
+
return undefined;
|
|
146
|
+
this.store.remove("consent", hash(id));
|
|
147
|
+
return item;
|
|
148
|
+
});
|
|
149
|
+
if (!consent) {
|
|
150
|
+
res.status(400).json({
|
|
151
|
+
error: "consent_expired_or_invalid",
|
|
152
|
+
message: "Restart the connection from your MCP client.",
|
|
153
|
+
});
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
res.clearCookie(cookieName(id), { path: "/oauth/consent" });
|
|
157
|
+
res.set({ "Cache-Control": "no-store", "Referrer-Policy": "no-referrer" });
|
|
158
|
+
const redirect = new URL(consent.redirectUri);
|
|
159
|
+
if (consent.state !== undefined)
|
|
160
|
+
redirect.searchParams.set("state", consent.state);
|
|
161
|
+
if (fields.data.action !== "connect") {
|
|
162
|
+
redirect.searchParams.set("error", "access_denied");
|
|
163
|
+
res.redirect(303, redirect.href);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const apiToken = fields.data.api_token?.trim() ?? "";
|
|
167
|
+
if (!apiToken || apiToken.length > 2048) {
|
|
168
|
+
res.status(400).json({ error: "project_token_required" });
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
await requestContext.run({
|
|
173
|
+
authToken: apiToken,
|
|
174
|
+
allowLocalFiles: false,
|
|
175
|
+
allowedFileRoots: [],
|
|
176
|
+
apiBase: this.cfg.apiBase,
|
|
177
|
+
projectUrl: this.cfg.projectUrl,
|
|
178
|
+
requestTimeoutMs: this.cfg.requestTimeoutMs,
|
|
179
|
+
maxResponseBytes: this.cfg.maxResponseBytes,
|
|
180
|
+
maxUploadBytes: this.cfg.maxUploadBytes,
|
|
181
|
+
requestId: randomUUID(),
|
|
182
|
+
logLevel: this.cfg.logLevel,
|
|
183
|
+
}, () => teletypeRequest("/project/details", { decode: decodeProjectDetails }));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
res.status(401).json({
|
|
187
|
+
error: "project_token_not_verified",
|
|
188
|
+
message: "Check the project token and Public API access, then restart the connection.",
|
|
189
|
+
});
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (fields.data.allow_write !== "yes")
|
|
193
|
+
consent.scopes = consent.scopes.filter((scope) => scope !== "write");
|
|
194
|
+
const grantId = randomUUID();
|
|
195
|
+
const code = secret();
|
|
196
|
+
this.store.transaction(() => {
|
|
197
|
+
if (!this.store.get("client", consent.clientId))
|
|
198
|
+
throw new InvalidGrantError("OAuth client expired.");
|
|
199
|
+
if (this.store.count("grant") >= MAX_ENTRIES)
|
|
200
|
+
throw new TooManyRequestsError("OAuth connection capacity reached.");
|
|
201
|
+
const expiresAt = now() + 60;
|
|
202
|
+
this.store.put("grant", grantId, { clientId: consent.clientId, apiToken, scopes: consent.scopes, expiresAt }, expiresAt);
|
|
203
|
+
this.store.put("code", hash(code), { consent, grantId, expiresAt: now() + 60 }, now() + 60, grantId);
|
|
204
|
+
});
|
|
205
|
+
redirect.searchParams.set("code", code);
|
|
206
|
+
res.redirect(303, redirect.href);
|
|
207
|
+
}
|
|
208
|
+
code(client, code) {
|
|
209
|
+
const item = this.store.get("code", hash(code));
|
|
210
|
+
if (item?.consent.clientId !== client.client_id)
|
|
211
|
+
throw new InvalidGrantError("Authorization code is invalid or expired.");
|
|
212
|
+
return item;
|
|
213
|
+
}
|
|
214
|
+
challengeForAuthorizationCode(client, code) {
|
|
215
|
+
return Promise.resolve(this.code(client, code).consent.challenge);
|
|
216
|
+
}
|
|
217
|
+
exchangeAuthorizationCode(client, code, _verifier, redirectUri, resource) {
|
|
218
|
+
this.checkResource(resource);
|
|
219
|
+
return Promise.resolve(this.store.transaction(() => {
|
|
220
|
+
const item = this.code(client, code);
|
|
221
|
+
if (redirectUri !== undefined && redirectUri !== item.consent.redirectUri)
|
|
222
|
+
throw new InvalidGrantError("Redirect URI differs from the authorized redirect.");
|
|
223
|
+
this.store.remove("code", hash(code));
|
|
224
|
+
return this.issueTokens(item.grantId);
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
issueTokens(grantId) {
|
|
228
|
+
const grant = this.store.get("grant", grantId);
|
|
229
|
+
if (!grant)
|
|
230
|
+
throw new InvalidGrantError("OAuth connection is expired.");
|
|
231
|
+
if (this.store.count("access") >= MAX_ACCESS_TOKENS)
|
|
232
|
+
throw new TooManyRequestsError("OAuth refresh capacity reached.");
|
|
233
|
+
const access = secret();
|
|
234
|
+
const expiresIn = ACCESS_SECONDS;
|
|
235
|
+
// Zero expiry keeps approved renewable grants until they are revoked.
|
|
236
|
+
grant.expiresAt = grant.scopes.includes("offline_access") ? 0 : now() + expiresIn;
|
|
237
|
+
this.store.put("access", hash(access), { grantId, expiresAt: now() + expiresIn }, now() + expiresIn, grantId);
|
|
238
|
+
let refresh;
|
|
239
|
+
grant.currentRefresh = undefined;
|
|
240
|
+
if (grant.scopes.includes("offline_access")) {
|
|
241
|
+
const value = grantId + "." + secret();
|
|
242
|
+
refresh = value + "." + this.refreshSignature(value);
|
|
243
|
+
grant.currentRefresh = hash(refresh);
|
|
244
|
+
}
|
|
245
|
+
this.store.put("grant", grantId, grant, grant.expiresAt);
|
|
246
|
+
this.syncClientLifetime(grant.clientId, grant.expiresAt === 0);
|
|
247
|
+
return {
|
|
248
|
+
access_token: access,
|
|
249
|
+
token_type: "Bearer",
|
|
250
|
+
expires_in: expiresIn,
|
|
251
|
+
refresh_token: refresh,
|
|
252
|
+
scope: grant.scopes.join(" "),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
refreshSignature(value) {
|
|
256
|
+
return createHmac("sha256", this.refreshKey).update(value).digest("base64url");
|
|
257
|
+
}
|
|
258
|
+
refreshGrantId(token) {
|
|
259
|
+
const match = /^([a-f0-9-]{36}\.[A-Za-z0-9_-]{43})\.([A-Za-z0-9_-]{43})$/.exec(token);
|
|
260
|
+
if (!match?.[1] || !match[2])
|
|
261
|
+
return undefined;
|
|
262
|
+
if (!timingSafeEqual(Buffer.from(match[2]), Buffer.from(this.refreshSignature(match[1]))))
|
|
263
|
+
return undefined;
|
|
264
|
+
return match[1].slice(0, 36);
|
|
265
|
+
}
|
|
266
|
+
syncClientLifetime(clientId, persistent = false) {
|
|
267
|
+
const client = this.store.get("client", clientId);
|
|
268
|
+
if (!client)
|
|
269
|
+
throw new InvalidGrantError("OAuth client expired.");
|
|
270
|
+
this.store.put("client", clientId, client, persistent || this.store.hasPersistentGrant(clientId) ? 0 : now() + CLIENT_SECONDS);
|
|
271
|
+
}
|
|
272
|
+
revokeGrant(grantId) {
|
|
273
|
+
const grant = this.store.get("grant", grantId);
|
|
274
|
+
this.store.revokeGrant(grantId);
|
|
275
|
+
if (grant && this.store.get("client", grant.clientId))
|
|
276
|
+
this.syncClientLifetime(grant.clientId);
|
|
277
|
+
}
|
|
278
|
+
exchangeRefreshToken(client, refresh, scopes, resource) {
|
|
279
|
+
this.checkResource(resource);
|
|
280
|
+
const digest = hash(refresh);
|
|
281
|
+
const result = this.store.transaction(() => {
|
|
282
|
+
const grantId = this.refreshGrantId(refresh);
|
|
283
|
+
const grant = grantId && this.store.get("grant", grantId);
|
|
284
|
+
if (!grantId || !grant || grant.clientId !== client.client_id)
|
|
285
|
+
throw new InvalidGrantError("Refresh token is invalid or expired.");
|
|
286
|
+
if (grant.currentRefresh !== digest) {
|
|
287
|
+
this.revokeGrant(grantId);
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
if (scopes?.some((scope) => !grant.scopes.includes(scope)) ||
|
|
291
|
+
(scopes && !scopes.includes("read")))
|
|
292
|
+
throw new InvalidScopeError("Refresh cannot expand access or remove read.");
|
|
293
|
+
if (scopes)
|
|
294
|
+
grant.scopes = [...new Set(scopes)];
|
|
295
|
+
this.store.put("grant", grantId, grant, grant.expiresAt);
|
|
296
|
+
return this.issueTokens(grantId);
|
|
297
|
+
});
|
|
298
|
+
if (!result)
|
|
299
|
+
throw new InvalidGrantError("Refresh token was reused. Restart the connection.");
|
|
300
|
+
return Promise.resolve(result);
|
|
301
|
+
}
|
|
302
|
+
verifyAccessToken(token) {
|
|
303
|
+
const access = this.store.get("access", hash(token));
|
|
304
|
+
const grant = access && this.store.get("grant", access.grantId);
|
|
305
|
+
if (!access || !grant || !this.store.get("client", grant.clientId))
|
|
306
|
+
throw new InvalidTokenError("Access token is invalid or expired.");
|
|
307
|
+
return Promise.resolve({
|
|
308
|
+
token,
|
|
309
|
+
clientId: grant.clientId,
|
|
310
|
+
scopes: grant.scopes,
|
|
311
|
+
expiresAt: access.expiresAt,
|
|
312
|
+
resource: this.resource,
|
|
313
|
+
extra: { apiToken: grant.apiToken },
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
revokeToken(client, request) {
|
|
317
|
+
const digest = hash(request.token);
|
|
318
|
+
this.store.transaction(() => {
|
|
319
|
+
const grantId = this.store.get("access", digest)?.grantId ?? this.refreshGrantId(request.token);
|
|
320
|
+
if (grantId && this.store.get("grant", grantId)?.clientId === client.client_id)
|
|
321
|
+
this.revokeGrant(grantId);
|
|
322
|
+
});
|
|
323
|
+
return Promise.resolve();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function validRedirect(value) {
|
|
327
|
+
try {
|
|
328
|
+
const url = new URL(value);
|
|
329
|
+
return (!url.username &&
|
|
330
|
+
!url.password &&
|
|
331
|
+
!url.hash &&
|
|
332
|
+
(url.protocol === "https:" ||
|
|
333
|
+
(url.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname))));
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const cookieName = (id) => "teletype_oauth_" + hash(id).slice(0, 16);
|
|
340
|
+
export function mountProjectOAuth(app, cfg) {
|
|
341
|
+
if (!cfg.oauth)
|
|
342
|
+
return undefined;
|
|
343
|
+
const provider = new ProjectOAuthProvider(cfg);
|
|
344
|
+
app.use("/oauth/assets", express.static(fileURLToPath(new URL("../plugin/assets/", import.meta.url)), {
|
|
345
|
+
dotfiles: "deny",
|
|
346
|
+
index: false,
|
|
347
|
+
redirect: false,
|
|
348
|
+
maxAge: "1d",
|
|
349
|
+
setHeaders: (res) => {
|
|
350
|
+
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
351
|
+
},
|
|
352
|
+
}));
|
|
353
|
+
app.once("close", () => {
|
|
354
|
+
provider.close();
|
|
355
|
+
});
|
|
356
|
+
const limiter = new RequestLimiter(cfg.maxConcurrentRequests, cfg.maxConcurrentPerToken);
|
|
357
|
+
app.use(mcpAuthRouter({
|
|
358
|
+
provider,
|
|
359
|
+
issuerUrl: provider.issuer,
|
|
360
|
+
resourceServerUrl: provider.resource,
|
|
361
|
+
resourceName: "Teletype",
|
|
362
|
+
clientRegistrationOptions: { clientSecretExpirySeconds: 0 },
|
|
363
|
+
scopesSupported: cfg.readOnly ? ["read", "offline_access"] : SCOPES,
|
|
364
|
+
serviceDocumentationUrl: new URL("https://github.com/Teletype-App/teletype-mcp-server"),
|
|
365
|
+
}));
|
|
366
|
+
app.post("/oauth/consent", express.urlencoded({ extended: false, limit: "8kb" }), (req, res) => {
|
|
367
|
+
const release = limiter.acquire(hash(req.ip || "unknown"));
|
|
368
|
+
if (!release) {
|
|
369
|
+
res.set("Retry-After", "1").status(429).json({ error: "oauth_busy" });
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
void provider
|
|
373
|
+
.completeConsent(req, res)
|
|
374
|
+
.catch(() => {
|
|
375
|
+
if (!res.headersSent)
|
|
376
|
+
res.status(500).json({ error: "oauth_consent_failed" });
|
|
377
|
+
})
|
|
378
|
+
.finally(release);
|
|
379
|
+
});
|
|
380
|
+
return provider;
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import type { ToolPolicy } from "./tool-policy.js";
|
|
2
3
|
export interface RequestContext {
|
|
3
4
|
authToken: string;
|
|
4
5
|
allowLocalFiles: boolean;
|
|
@@ -11,6 +12,7 @@ export interface RequestContext {
|
|
|
11
12
|
requestId: string;
|
|
12
13
|
logLevel: "debug" | "info" | "warn" | "error";
|
|
13
14
|
signal?: AbortSignal;
|
|
15
|
+
toolPolicy?: ToolPolicy;
|
|
14
16
|
}
|
|
15
17
|
export declare function resolveLogContext(): Pick<RequestContext, "requestId" | "logLevel">;
|
|
16
18
|
export declare const requestContext: AsyncLocalStorage<RequestContext>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.js","sourceRoot":"","sources":["../src/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"request-context.js","sourceRoot":"","sources":["../src/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAkBrD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC1C,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAC9C,OAAO;QACL,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS;QAC1C,QAAQ,EACN,OAAO,EAAE,QAAQ;YACjB,CAAC,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,MAAM,IAAI,eAAe,KAAK,OAAO;gBACvF,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,MAAM,CAAC;KACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAEtE,MAAM,UAAU,oBAAoB;IAClC,OAAO,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACrF,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC,QAAQ,EAAE,EAAE,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,CACL,cAAc,CAAC,QAAQ,EAAE,EAAE,gBAAgB;QAC3C,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC;aAC5C,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CACL,cAAc,CAAC,QAAQ,EAAE,EAAE,OAAO;QAClC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,wCAAwC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAC/F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CACL,cAAc,CAAC,QAAQ,EAAE,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,cAAc,CAC5F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAKlC,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC1C,OAAO;QACL,SAAS,EAAE,OAAO,EAAE,gBAAgB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC;QAC1F,gBAAgB,EACd,OAAO,EAAE,gBAAgB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;QACpF,cAAc,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,UAAU,CAAC;KAChG,CAAC;AACJ,CAAC"}
|
package/dist/tool-policy.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TOOL_CATALOG, TOOLSET_NAMES, toolsetOf, } from "./tool-catalog.js";
|
|
2
|
+
import { requestContext } from "./request-context.js";
|
|
2
3
|
export const TOOLSETS = TOOLSET_NAMES;
|
|
3
4
|
// Derived from the catalog so writesData stays the single source of truth.
|
|
4
5
|
const WRITE_TOOL_NAMES = new Set(TOOL_CATALOG.filter((contract) => contract.writesData).map((contract) => contract.name));
|
|
@@ -19,6 +20,9 @@ export function parseToolsetList(value) {
|
|
|
19
20
|
return [...new Set(requested)];
|
|
20
21
|
}
|
|
21
22
|
export function loadToolPolicy(env = process.env) {
|
|
23
|
+
const scopedPolicy = requestContext.getStore()?.toolPolicy;
|
|
24
|
+
if (scopedPolicy)
|
|
25
|
+
return scopedPolicy;
|
|
22
26
|
return {
|
|
23
27
|
readOnly: env.TELETYPE_MCP_READ_ONLY === "true",
|
|
24
28
|
toolsets: parseToolsetList(env.TELETYPE_MCP_TOOLSETS),
|
|
@@ -27,6 +31,9 @@ export function loadToolPolicy(env = process.env) {
|
|
|
27
31
|
// Lenient variant for in-band reporting: bad env values surface as notes
|
|
28
32
|
// instead of failing the get_capabilities call.
|
|
29
33
|
export function inspectToolPolicy(env = process.env) {
|
|
34
|
+
const scopedPolicy = requestContext.getStore()?.toolPolicy;
|
|
35
|
+
if (scopedPolicy)
|
|
36
|
+
return { policy: scopedPolicy, notes: [] };
|
|
30
37
|
const notes = [];
|
|
31
38
|
let toolsets = null;
|
|
32
39
|
try {
|
package/dist/tool-policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-policy.js","sourceRoot":"","sources":["../src/tool-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,GAGV,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-policy.js","sourceRoot":"","sources":["../src/tool-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,GAGV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AAWtC,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CACxF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,SAAS,GAAG,KAAK;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAmB,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,0BAA0B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,SAA0B,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC;IAC3D,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,sBAAsB,KAAK,MAAM;QAC/C,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,gDAAgD;AAChD,MAAM,UAAU,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAIpE,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC;IAC3D,IAAI,YAAY;QAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO;QACL,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,sBAAsB,KAAK,MAAM,EAAE,QAAQ,EAAE;QACrE,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAkB,EAAE,IAAc;IAC7D,IAAI,MAAM,CAAC,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,IAAI,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|