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.
Files changed (64) hide show
  1. package/.env.example +7 -0
  2. package/LAUNCHGUIDE.md +51 -0
  3. package/README-ru.md +49 -11
  4. package/README.md +68 -30
  5. package/dist/config.d.ts +4 -0
  6. package/dist/config.js +17 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/http.js +69 -1
  9. package/dist/http.js.map +1 -1
  10. package/dist/landing-page.d.ts +1 -0
  11. package/dist/landing-page.js +166 -0
  12. package/dist/landing-page.js.map +1 -0
  13. package/dist/oauth-page.d.ts +1 -0
  14. package/dist/oauth-page.js +242 -0
  15. package/dist/oauth-page.js.map +1 -0
  16. package/dist/oauth-store.d.ts +48 -0
  17. package/dist/oauth-store.js +131 -0
  18. package/dist/oauth-store.js.map +1 -0
  19. package/dist/oauth.d.ts +4 -0
  20. package/dist/oauth.js +382 -0
  21. package/dist/oauth.js.map +1 -0
  22. package/dist/request-context.d.ts +2 -0
  23. package/dist/request-context.js.map +1 -1
  24. package/dist/tool-policy.js +7 -0
  25. package/dist/tool-policy.js.map +1 -1
  26. package/docs/CLIENTS.md +651 -27
  27. package/docs/CONTRIBUTING.md +4 -2
  28. package/docs/OAUTH.md +54 -0
  29. package/docs/SECURITY.md +3 -1
  30. package/docs/ru/CLIENTS.md +651 -27
  31. package/docs/ru/CONTRIBUTING.md +4 -2
  32. package/docs/ru/OAUTH.md +54 -0
  33. package/docs/ru/SECURITY.md +3 -1
  34. package/examples/clients/goose-stdio.yaml +13 -0
  35. package/examples/clients/openclaw.json +13 -0
  36. package/gemini-extension.json +22 -0
  37. package/lhm.plugin.json +1408 -0
  38. package/llms-install.md +17 -0
  39. package/package.json +9 -4
  40. package/plugin/.claude-plugin/plugin.json +37 -0
  41. package/plugin/.cursor-plugin/plugin.json +34 -0
  42. package/plugin/LICENSE +21 -0
  43. package/plugin/README.md +48 -0
  44. package/plugin/assets/README.md +12 -0
  45. package/plugin/assets/consent.js +32 -0
  46. package/plugin/assets/fonts/OFL.txt +93 -0
  47. package/plugin/assets/fonts/manrope.woff2 +0 -0
  48. package/plugin/assets/icon-400.png +0 -0
  49. package/plugin/assets/icon.png +0 -0
  50. package/plugin/assets/icon.svg +15 -0
  51. package/plugin/assets/landing.css +442 -0
  52. package/plugin/assets/landing.js +85 -0
  53. package/plugin/assets/logo.svg +16 -0
  54. package/plugin/commands/client-summary.md +14 -0
  55. package/plugin/commands/draft-reply.md +13 -0
  56. package/plugin/commands/escalate-issue.md +15 -0
  57. package/plugin/commands/shift-handover.md +10 -0
  58. package/plugin/commands/triage-inbox.md +13 -0
  59. package/plugin/mcp.json +10 -0
  60. package/plugin/plugin.json +15 -0
  61. package/plugin/skills/teletype-support/SKILL.md +3 -1
  62. package/plugin/skills/teletype-support/references/installation.md +31 -0
  63. package/server.json +18 -4
  64. 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;AAgBrD,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"}
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"}
@@ -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 {
@@ -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;AAE3B,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,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,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"}
1
+ {"version":3,"file":"tool-policy.js","sourceRoot":"","sources":["../src/tool-policy.ts"],"names":[],"mappings":"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"}