@spacelr/mcp 0.0.8 → 0.0.9

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../libs/mcp-server/src/index.ts","../../../../libs/mcp-server/src/config.ts","../../../../libs/mcp-server/src/api-client.ts","../../../../libs/mcp-server/src/tools/auth.ts","../../../../libs/mcp-server/src/utils.ts","../../../../libs/mcp-server/src/tools/projects.ts","../../../../libs/mcp-server/src/tools/clients.ts","../../../../libs/mcp-server/src/tools/database.ts","../../../../libs/mcp-server/src/tools/hosting.ts","../../../../libs/mcp-server/src/zip.ts","../../../../libs/mcp-server/src/tools/storage.ts","../../../../libs/mcp-server/src/tools/functions.ts","../../../../libs/mcp-server/src/tools/emailTemplates.ts","../../../../libs/mcp-server/src/tools/cronJobs.ts","../../../../libs/mcp-server/src/tools/webhooks.ts","../../../../libs/mcp-server/src/tools/notifications.ts","../../../../libs/mcp-server/src/tools/auditLogs.ts","../../../../libs/mcp-server/src/tools/index.ts","../../../../libs/mcp-server/src/prompts/database.ts","../../../../libs/mcp-server/src/prompts/functions.ts","../../../../libs/mcp-server/src/prompts/index.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config';\nimport { ApiClient } from './api-client';\nimport { registerAllTools } from './tools';\nimport { registerAllPrompts } from './prompts';\n\nasync function main() {\n const config = await loadConfig();\n const api = new ApiClient(config);\n\n const server = new McpServer({\n name: 'spacelr',\n version: '0.1.0',\n });\n\n registerAllTools(server, api);\n registerAllPrompts(server);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n const shutdown = async () => {\n console.error('Shutting down MCP server...');\n await server.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n process.on('SIGPIPE', shutdown);\n\n console.error('Spacelr MCP server running on stdio');\n}\n\nmain().catch((error: unknown) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface Config {\n apiBaseUrl: string;\n authToken: string;\n clientId: string | undefined;\n projectId: string | undefined;\n}\n\ninterface StoredCredentials {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n apiUrl: string;\n}\n\ninterface TokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n}\n\ntype CredentialsScope = 'project' | 'global';\n\ninterface CredentialsLocation {\n path: string;\n scope: CredentialsScope;\n projectDir?: string;\n}\n\nconst REFRESH_TIMEOUT_MS = 10_000;\nconst SPACELR_CONFIG_FILENAME = 'spacelr.json';\n\nfunction getGlobalCredentialsFile(): string {\n const home =\n process.env['HOME'] ?? process.env['USERPROFILE'] ?? os.homedir();\n return path.join(home, '.spacelr', 'credentials.json');\n}\n\n/**\n * Walk up from cwd looking for `spacelr.json`. Mirrors the pattern used by\n * `@spacelr/cli`'s `findConfigPath`. Inlined here to avoid a cross-package\n * dependency — both packages publish independently.\n */\nfunction findSpacelrConfigPath(startDir?: string): string | null {\n let dir = startDir ?? process.cwd();\n while (true) {\n const candidate = path.join(dir, SPACELR_CONFIG_FILENAME);\n if (fs.existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\n/**\n * Resolve the primary credentials location. Walks up from cwd to find\n * `spacelr.json`; if found, credentials are project-scoped at\n * `<projectDir>/.spacelr/credentials.json`. Otherwise falls back to\n * `~/.spacelr/credentials.json` (global scope).\n */\nfunction resolveCredentialsFile(): CredentialsLocation {\n const configPath = findSpacelrConfigPath();\n if (configPath) {\n const projectDir = path.dirname(configPath);\n return {\n path: path.join(projectDir, '.spacelr', 'credentials.json'),\n scope: 'project',\n projectDir,\n };\n }\n return { path: getGlobalCredentialsFile(), scope: 'global' };\n}\n\n/**\n * Ensure the project's `.gitignore` excludes `.spacelr/` so credentials\n * never reach git. Called before every project-scoped credential write.\n *\n * shared-with: libs/cli/src/lib/auth.ts (intentional duplication — the two\n * packages publish independently and must not depend on each other)\n */\nfunction ensureGitignored(projectDir: string): { safe: boolean } {\n const gitignorePath = path.join(projectDir, '.gitignore');\n const entry = '.spacelr/';\n\n const matchesExisting = (line: string): boolean => {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return false;\n return (\n trimmed === '.spacelr' ||\n trimmed === '.spacelr/' ||\n trimmed === '.spacelr/*' ||\n trimmed === '.spacelr/**' ||\n trimmed === '.spacelr/credentials.json' ||\n // Leading-slash forms anchor the pattern to the repo root\n trimmed === '/.spacelr' ||\n trimmed === '/.spacelr/' ||\n trimmed === '/.spacelr/*' ||\n trimmed === '/.spacelr/**' ||\n trimmed === '/.spacelr/credentials.json'\n );\n };\n\n // Heuristic: any line starting with `!` that mentions `.spacelr` could\n // un-ignore credentials. We deliberately use a permissive prefix check\n // (instead of exact-string matching) because gitignore supports many\n // pattern variants — `!.spacelr*`, `!.spacelr/**/*.json`, `!/.spacelr/**`,\n // etc. — and an exhaustive list would inevitably miss something. False\n // positives here just refuse the write (safe default); false negatives\n // would silently leave credentials trackable.\n const hasNegation = (line: string): boolean => {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return false;\n return trimmed.startsWith('!') && trimmed.includes('.spacelr');\n };\n\n let content = '';\n let existed = false;\n try {\n content = fs.readFileSync(gitignorePath, 'utf-8');\n existed = true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') return { safe: true };\n }\n\n const lines = content.split(/\\r?\\n/);\n // Check for negation FIRST. A negation anywhere in the file un-ignores\n // credentials regardless of whether a positive match exists earlier:\n // git evaluates rules in order and the LAST matching rule wins, so\n // `.spacelr/` followed by `!.spacelr/credentials.json` still tracks\n // credentials. Returning early on a positive match would miss this.\n if (lines.some(hasNegation)) {\n const alreadyHasMatch = lines.some(matchesExisting);\n console.error(\n alreadyHasMatch\n ? '.gitignore already contains .spacelr/ but ALSO contains a ' +\n 'negation pattern that un-ignores credentials. Remove the ' +\n 'negation or store credentials globally.'\n : '.gitignore contains a negation pattern for .spacelr/ — ' +\n 'refusing to write credentials safety entry. Remove the ' +\n 'negation or store credentials globally.',\n );\n return { safe: false };\n }\n if (lines.some(matchesExisting)) return { safe: true };\n\n const needsLeadingNewline = existed && content.length > 0 && !content.endsWith('\\n');\n const newContent =\n (existed ? content : '') +\n (needsLeadingNewline ? '\\n' : '') +\n entry +\n '\\n';\n\n try {\n // Atomic write so a crash mid-write cannot truncate .gitignore and\n // silently drop the .spacelr/ entry.\n writeFileAtomic(gitignorePath, newContent, 0o644);\n console.error(`Added ${entry} to .gitignore (credentials must never be committed)`);\n return { safe: true };\n } catch {\n // Best-effort — do not fail the refresh if .gitignore is read-only\n return { safe: true };\n }\n}\n\nfunction readCredentialsFromDisk(filePath: string): StoredCredentials | null {\n try {\n // No existsSync guard — would race with concurrent unlink. The catch\n // below covers ENOENT, JSON parse errors, and read failures uniformly.\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n if (typeof parsed !== 'object' || parsed === null) return null;\n const obj = parsed as Record<string, unknown>;\n if (\n typeof obj['accessToken'] !== 'string' ||\n obj['accessToken'].length === 0 ||\n !Number.isFinite(obj['expiresAt']) ||\n typeof obj['apiUrl'] !== 'string' ||\n obj['apiUrl'].length === 0\n ) {\n return null;\n }\n // refreshToken is optional, but if present must be a string —\n // otherwise we'd serialize a non-string into the refresh request body.\n if ('refreshToken' in obj && typeof obj['refreshToken'] !== 'string') {\n return null;\n }\n return parsed as StoredCredentials;\n } catch {\n return null;\n }\n}\n\n/**\n * Read credentials from the resolved location with a legacy fallback:\n * if the project-scoped lookup finds nothing, also try the global file.\n */\nfunction readStoredCredentials(): StoredCredentials | null {\n return readStoredCredentialsWithLocation()?.credentials ?? null;\n}\n\n/**\n * Same as `readStoredCredentials` but also returns the location the\n * credentials were read from. Refresh uses this to write back to the\n * same file (preventing scope mismatch with legacy global credentials\n * being refreshed inside a project).\n */\nfunction readStoredCredentialsWithLocation(): {\n credentials: StoredCredentials;\n location: CredentialsLocation;\n} | null {\n const primary = resolveCredentialsFile();\n const fromPrimary = readCredentialsFromDisk(primary.path);\n if (fromPrimary) return { credentials: fromPrimary, location: primary };\n\n if (primary.scope === 'project') {\n const globalPath = getGlobalCredentialsFile();\n const fromGlobal = readCredentialsFromDisk(globalPath);\n if (fromGlobal) {\n return {\n credentials: fromGlobal,\n location: { path: globalPath, scope: 'global' },\n };\n }\n }\n return null;\n}\n\n/**\n * Atomic write: write to a temp file and rename. Rename is atomic on POSIX\n * and Windows so concurrent readers never see a partial file.\n *\n * shared-with: libs/cli/src/lib/auth.ts\n */\nfunction writeFileAtomic(filePath: string, data: string, mode: number): void {\n const tmpPath = `${filePath}.tmp.${process.pid}.${crypto.randomBytes(6).toString('hex')}`;\n try {\n fs.writeFileSync(tmpPath, data, { mode });\n fs.renameSync(tmpPath, filePath);\n } catch (err) {\n try {\n fs.unlinkSync(tmpPath);\n } catch {\n /* ignore */\n }\n throw err;\n }\n}\n\nfunction storeCredentials(\n credentials: StoredCredentials,\n // REQUIRED — never resolve from cwd inside this function. Letting it\n // default to resolveCredentialsFile() would silently reintroduce the\n // scope-mismatch bug this PR fixes (legacy global creds read inside a\n // project would write back to the project file).\n location: CredentialsLocation,\n): void {\n // Safety: ensure .spacelr/ is gitignored before writing to a project.\n // If a negation pattern is detected, refuse to write — the credential\n // file would otherwise land in a .gitignore-trackable location.\n if (location.scope === 'project' && location.projectDir) {\n const { safe } = ensureGitignored(location.projectDir);\n if (!safe) {\n throw new Error(\n 'Refusing to write project-local credentials: .gitignore contains ' +\n 'a negation pattern that would un-ignore .spacelr/.',\n );\n }\n }\n\n // mkdirSync with recursive:true is idempotent and does not throw if the\n // directory already exists, so no existsSync guard needed.\n const dir = path.dirname(location.path);\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n // mode: on mkdirSync only applies when the directory is created. If the\n // user pre-created .spacelr/ with wider permissions (e.g. 0o755), enforce\n // 0o700 here so other local users cannot enumerate credential filenames.\n // Best-effort — chmod can fail on Windows / non-owned dirs, in which case\n // we leave the existing mode rather than failing the credential write.\n try {\n fs.chmodSync(dir, 0o700);\n } catch {\n /* ignore */\n }\n\n writeFileAtomic(location.path, JSON.stringify(credentials, null, 2), 0o600);\n}\n\nfunction isTokenStillValid(credentials: StoredCredentials): boolean {\n return Date.now() < credentials.expiresAt - 60_000;\n}\n\nasync function refreshToken(\n credentials: StoredCredentials,\n sourceLocation: CredentialsLocation,\n): Promise<string | null> {\n // apiUrl is already validated by readCredentialsFromDisk; only need to\n // guard against missing refresh token here.\n if (!credentials.refreshToken) return null;\n\n // Validate scheme — a credentials file with apiUrl: \"file:///etc/passwd\"\n // (manually edited or written by a compromised process) would otherwise\n // produce an opaque fetch error. Only http(s) is accepted.\n try {\n const parsed = new URL(credentials.apiUrl);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n console.error(\n `Refusing to refresh against non-http(s) URL: ${parsed.protocol}`,\n );\n return null;\n }\n } catch {\n console.error('Refusing to refresh: stored apiUrl is not a valid URL');\n return null;\n }\n\n const apiUrl = credentials.apiUrl.replace(/\\/+$/, '');\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REFRESH_TIMEOUT_MS);\n\n try {\n console.error('Refreshing access token...');\n const response = await fetch(`${apiUrl}/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken: credentials.refreshToken }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n console.error(`Token refresh failed (HTTP ${response.status})`);\n // Concurrent-refresh fallback: another process may have already rotated\n // the token. Re-read the SAME file (sourceLocation) — not via cwd —\n // so we don't accidentally pick up a different scope's credentials.\n if (response.status === 401) {\n const fresh = readCredentialsFromDisk(sourceLocation.path);\n if (\n fresh &&\n (fresh.accessToken !== credentials.accessToken ||\n fresh.refreshToken !== credentials.refreshToken) &&\n isTokenStillValid(fresh)\n ) {\n console.error('Using credentials refreshed by concurrent process');\n return fresh.accessToken;\n }\n }\n return null;\n }\n\n const data = (await response.json()) as TokenResponse;\n if (typeof data.access_token !== 'string') {\n console.error('Token refresh returned unexpected response shape');\n return null;\n }\n // Validate expires_in: must be a positive finite number. A bogus value\n // (0, negative, NaN from a string, etc.) would either trigger an\n // immediate refresh loop or set expiresAt to NaN.\n const expiresInRaw = data.expires_in;\n const expiresIn =\n typeof expiresInRaw === 'number' &&\n Number.isFinite(expiresInRaw) &&\n expiresInRaw > 0\n ? expiresInRaw\n : 3600;\n const updated: StoredCredentials = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token ?? credentials.refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n apiUrl: credentials.apiUrl,\n };\n // Write back to the exact location the credentials came from to\n // prevent scope mismatch (e.g. global legacy creds read inside a project\n // must refresh back to global, not leak into the project file).\n storeCredentials(updated, sourceLocation);\n console.error('Token refreshed successfully');\n return data.access_token;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n console.error('Token refresh timed out');\n } else {\n console.error('Token refresh error');\n }\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function resolveAuthToken(forceRefresh = false): Promise<string | null> {\n // 1. Environment variable takes priority (CI/automation)\n const envToken = process.env['SPACELR_AUTH_TOKEN'];\n if (envToken) return envToken;\n\n // 2. Read from credentials file (project-local or global)\n const loaded = readStoredCredentialsWithLocation();\n if (!loaded) return null;\n\n return resolveAuthTokenFromLoaded(loaded, forceRefresh);\n}\n\nasync function resolveAuthTokenFromLoaded(\n loaded: { credentials: StoredCredentials; location: CredentialsLocation },\n forceRefresh: boolean,\n): Promise<string | null> {\n const { credentials, location } = loaded;\n // Check if token is still valid (60s buffer is encapsulated in\n // isTokenStillValid) — skip when forced.\n if (!forceRefresh && isTokenStillValid(credentials)) {\n return credentials.accessToken;\n }\n\n // Try to refresh expired (or force-refreshed) token — write back to\n // the same location we read from, not wherever cwd currently resolves to\n return refreshToken(credentials, location);\n}\n\nfunction warnIfInsecureUrl(url: string): void {\n // 0.0.0.0 is NOT a loopback — it binds all interfaces. A client request\n // to http://0.0.0.0/... exposes credentials to anything reachable on the\n // network, so we deliberately exclude it from the safe list.\n // IPv6 loopback is matched both as `[::1]` (URL-bracketed form, the\n // canonical form Node.js URL parsing produces) and bare `::1` for input\n // robustness.\n if (\n url.startsWith('http://') &&\n !url.includes('localhost') &&\n !/^http:\\/\\/(127\\.|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[01])\\.|(\\[::1\\])|::1)(\\/|:|$)/.test(url)\n ) {\n console.error(`Warning: API URL uses plain HTTP (${url}). Credentials will be transmitted unencrypted.`);\n }\n}\n\nfunction resolveApiUrl(credentials: StoredCredentials | null): string {\n const envUrl = process.env['SPACELR_API_URL'];\n if (envUrl) {\n try {\n const parsed = new URL(envUrl);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`Unsupported protocol: ${parsed.protocol}`);\n }\n } catch (err) {\n throw new Error(`Invalid SPACELR_API_URL: ${envUrl} — ${err instanceof Error ? err.message : String(err)}`);\n }\n const resolved = envUrl.replace(/\\/+$/, '');\n warnIfInsecureUrl(resolved);\n return resolved;\n }\n\n // Derive admin API URL from stored credentials apiUrl\n // CLI stores the public gateway URL (e.g. https://api.spacelr.com/api/v1)\n // In production, admin gateway runs on a separate host (api-console.spacelr.com)\n // In local dev, admin gateway runs on a separate port (localhost:3003)\n if (credentials?.apiUrl) {\n const base = credentials.apiUrl.replace(/\\/+$/, '');\n // Already an admin URL\n if (base.includes('/api/v1/admin')) return base;\n // Local dev: derive admin port from public gateway\n if (base.includes('localhost') || base.includes('127.0.0.1') || base.includes('[::1]')) {\n return 'http://localhost:3003/api/v1/admin';\n }\n // Production: cannot safely derive admin host from public host\n throw new Error(\n `SPACELR_API_URL is required for production. The CLI credentials point to ${base} (public gateway), ` +\n 'but the admin gateway runs on a separate host. ' +\n 'Set SPACELR_API_URL to the admin gateway URL (e.g. https://api-console.spacelr.com/api/v1/admin).',\n );\n }\n\n const defaultUrl = 'http://localhost:3003/api/v1/admin';\n console.error(`Warning: No API URL configured, using default: ${defaultUrl}`);\n return defaultUrl;\n}\n\n/**\n * Returns the admin API base URL, or `null` if it cannot be derived.\n *\n * Callers MUST null-check the return value — using a `null` result in a\n * URL string would silently produce broken requests like `null/api/v1/...`.\n * The error reason is logged to stderr before returning null.\n */\nexport function resolveApiBaseUrl(): string | null {\n try {\n const credentials = readStoredCredentials();\n return resolveApiUrl(credentials);\n } catch (err) {\n // Log so callers (and operators) can see *why* we couldn't derive the\n // admin URL — silent null leads to less helpful errors downstream.\n console.error(\n `Failed to resolve admin API URL: ${err instanceof Error ? err.message : String(err)}`,\n );\n return null;\n }\n}\n\nexport async function loadConfig(): Promise<Config> {\n // Single read of the credentials file — share between authToken refresh\n // and apiBaseUrl resolution so they cannot disagree under concurrent\n // refreshes from another process.\n const envToken = process.env['SPACELR_AUTH_TOKEN'];\n const loaded = readStoredCredentialsWithLocation();\n const authToken = envToken ?? (loaded ? await resolveAuthTokenFromLoaded(loaded, false) : null);\n\n if (!authToken) {\n throw new Error(\n 'No auth token found. Either set SPACELR_AUTH_TOKEN or run \"spacelr login\" first.',\n );\n }\n\n return {\n apiBaseUrl: resolveApiUrl(loaded?.credentials ?? null),\n authToken,\n clientId: process.env['SPACELR_CLIENT_ID'],\n projectId: process.env['SPACELR_PROJECT_ID'],\n };\n}\n","import { Config, resolveAuthToken, resolveApiBaseUrl } from './config';\n\ninterface RequestOptions {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n}\n\ntype HttpMethod = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n\nconst REQUEST_TIMEOUT_MS = 30_000;\nconst UPLOAD_TIMEOUT_MS = 120_000;\n\nexport class ApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n responseBody: string,\n ) {\n const truncated =\n responseBody.length > 500\n ? responseBody.slice(0, 500) + '...'\n : responseBody;\n super(`HTTP ${status} ${statusText}: ${truncated}`);\n this.name = 'ApiError';\n }\n}\n\nexport class ApiClient {\n private baseUrl: string;\n private readonly headers: Record<string, string>;\n private refreshPromise: Promise<string | null> | null = null;\n\n constructor(config: Config) {\n this.baseUrl = config.apiBaseUrl;\n this.headers = {\n Authorization: `Bearer ${config.authToken}`,\n };\n if (config.clientId) {\n this.headers['x-client-id'] = config.clientId;\n }\n if (config.projectId) {\n this.headers['x-project-id'] = config.projectId;\n }\n }\n\n async get(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('GET', path, opts);\n }\n\n async post(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('POST', path, opts);\n }\n\n async patch(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('PATCH', path, opts);\n }\n\n async put(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('PUT', path, opts);\n }\n\n async delete(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('DELETE', path, opts);\n }\n\n /**\n * Upload a file as multipart/form-data.\n * Includes the same 401-retry logic as regular requests.\n *\n * @param path - API path (e.g. `/projects/:id/functions/:id/deploy`)\n * @param buffer - Raw file content\n * @param filename - Name sent in the Content-Disposition header (e.g. \"bundle.zip\")\n */\n async uploadFile(\n path: string,\n buffer: Buffer,\n filename: string,\n ): Promise<unknown> {\n try {\n return await this.sendMultipart(path, buffer, filename);\n } catch (error) {\n if (error instanceof ApiError && error.status === 401) {\n const currentToken = this.headers['Authorization'];\n let newToken = await this.refreshAuthToken();\n const newBaseUrl = resolveApiBaseUrl();\n if (newBaseUrl && newBaseUrl !== this.baseUrl) {\n this.baseUrl = newBaseUrl;\n }\n if (newToken && `Bearer ${newToken}` === currentToken) {\n newToken = await resolveAuthToken(true);\n }\n if (newToken && `Bearer ${newToken}` !== currentToken) {\n this.headers['Authorization'] = `Bearer ${newToken}`;\n return this.sendMultipart(path, buffer, filename);\n }\n }\n throw error;\n }\n }\n\n private async sendMultipart(\n path: string,\n buffer: Buffer,\n filename: string,\n ): Promise<unknown> {\n const boundary = `----MCP${Date.now()}${Math.random().toString(36).slice(2)}`;\n\n const header = Buffer.from(\n `--${boundary}\\r\\n` +\n `Content-Disposition: form-data; name=\"file\"; filename=\"${filename}\"\\r\\n` +\n `Content-Type: application/zip\\r\\n\\r\\n`,\n );\n const footer = Buffer.from(`\\r\\n--${boundary}--\\r\\n`);\n const body = Buffer.concat([header, buffer, footer]);\n\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), UPLOAD_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...this.headers,\n 'Content-Type': `multipart/form-data; boundary=${boundary}`,\n 'Content-Length': String(body.length),\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new ApiError(response.status, response.statusText, text);\n }\n\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async refreshAuthToken(force = false): Promise<string | null> {\n if (!this.refreshPromise) {\n this.refreshPromise = resolveAuthToken(force).finally(() => {\n this.refreshPromise = null;\n });\n }\n return this.refreshPromise;\n }\n\n private async requestWithRetry(\n method: HttpMethod,\n path: string,\n opts?: RequestOptions,\n ): Promise<unknown> {\n try {\n return await this.request(method, path, opts);\n } catch (error) {\n if (error instanceof ApiError && error.status === 401) {\n const currentToken = this.headers['Authorization'];\n // First try: read credentials file (token may have changed via re-login)\n let newToken = await this.refreshAuthToken();\n const newBaseUrl = resolveApiBaseUrl();\n if (newBaseUrl && newBaseUrl !== this.baseUrl) {\n this.baseUrl = newBaseUrl;\n }\n // If file token is the same, force a refresh via the refresh-token endpoint\n if (newToken && `Bearer ${newToken}` === currentToken) {\n newToken = await resolveAuthToken(true);\n }\n if (newToken && `Bearer ${newToken}` !== currentToken) {\n this.headers['Authorization'] = `Bearer ${newToken}`;\n return this.request(method, path, opts);\n }\n }\n throw error;\n }\n }\n\n private async request(\n method: HttpMethod,\n path: string,\n opts?: RequestOptions,\n ): Promise<unknown> {\n let url = `${this.baseUrl}${path}`;\n\n if (opts?.params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(opts.params)) {\n if (value !== undefined) {\n searchParams.set(key, String(value));\n }\n }\n const qs = searchParams.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n try {\n const headers: Record<string, string> = { ...this.headers };\n if (opts?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new ApiError(response.status, response.statusText, text);\n }\n\n if (!text) {\n return undefined;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { redactTokens } from '../utils';\n\nexport function registerAuthTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'auth_login',\n {\n description: 'Authenticate with email and password. WARNING: The password will be visible in the conversation context. Token values are redacted in the response.',\n inputSchema: {\n email: z.string().email(),\n password: z.string().min(1),\n },\n },\n async ({ email, password }) => {\n try {\n const result = await api.post('/auth/login', {\n body: { email, password },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactTokens(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Login failed: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'auth_me',\n {\n description: 'Get the currently authenticated user profile',\n },\n async () => {\n try {\n const result = await api.get('/auth/me');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactTokens(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get profile: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'auth_update_profile',\n {\n description: 'Update the currently authenticated user profile',\n inputSchema: {\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n displayName: z.string().optional(),\n },\n },\n async ({ firstName, lastName, displayName }) => {\n try {\n const body: Record<string, string> = {};\n if (firstName !== undefined) body.firstName = firstName;\n if (lastName !== undefined) body.lastName = lastName;\n if (displayName !== undefined) body.displayName = displayName;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch('/auth/me', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactTokens(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Profile update failed: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","const TOKEN_KEYS = new Set([\n 'access_token', 'refresh_token', 'id_token',\n 'accessToken', 'refreshToken', 'idToken',\n]);\n\n/**\n * Recursively redact token fields from API responses.\n * Handles both snake_case and camelCase token field names.\n */\nexport function redactTokens(data: unknown): unknown {\n if (typeof data !== 'object' || data === null) return data;\n if (Array.isArray(data)) return data.map(redactTokens);\n const record = data as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n if (TOKEN_KEYS.has(key)) {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = redactTokens(value);\n }\n }\n return redacted;\n}\n\n/**\n * Recursively redact secret fields from API responses.\n * Replaces clientSecret and secret values with '[REDACTED]'.\n */\nexport function redactSecrets(data: unknown): unknown {\n if (typeof data !== 'object' || data === null) return data;\n if (Array.isArray(data)) return data.map(redactSecrets);\n const record = data as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n if (key === 'clientSecret' || key === 'secret') {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = redactSecrets(value);\n }\n }\n return redacted;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerProjectTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'projects_list',\n {\n description: 'List all projects, optionally filtered by role',\n inputSchema: {\n role: z.string().optional(),\n },\n },\n async ({ role }) => {\n try {\n const result = await api.get('/projects', {\n params: { role },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list projects: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_get',\n {\n description: 'Get a project by its ID',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_get_by_slug',\n {\n description: 'Get a project by its slug',\n inputSchema: {\n slug: z.string(),\n },\n },\n async ({ slug }) => {\n try {\n const result = await api.get(`/projects/slug/${encodeURIComponent(slug)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get project by slug: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_create',\n {\n description: 'Create a new project',\n inputSchema: {\n name: z.string(),\n slug: z.string(),\n description: z.string().optional(),\n logoUrl: z.string().url().optional(),\n websiteUrl: z.string().url().optional(),\n },\n },\n async ({ name, slug, description, logoUrl, websiteUrl }) => {\n try {\n const body: Record<string, string> = { name, slug };\n if (description !== undefined) body.description = description;\n if (logoUrl !== undefined) body.logoUrl = logoUrl;\n if (websiteUrl !== undefined) body.websiteUrl = websiteUrl;\n\n const result = await api.post('/projects', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_update',\n {\n description: 'Update an existing project',\n inputSchema: {\n projectId: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n logoUrl: z.string().url().optional(),\n websiteUrl: z.string().url().optional(),\n },\n },\n async ({ projectId, name, description, logoUrl, websiteUrl }) => {\n try {\n const body: Record<string, string> = {};\n if (name !== undefined) body.name = name;\n if (description !== undefined) body.description = description;\n if (logoUrl !== undefined) body.logoUrl = logoUrl;\n if (websiteUrl !== undefined) body.websiteUrl = websiteUrl;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_delete',\n {\n description: 'Delete a project by its ID',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Project deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_list',\n {\n description: 'List members of a project with optional pagination',\n inputSchema: {\n projectId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/members`, {\n params: { limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list members: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_add',\n {\n description: 'Add a member to a project by email with a specified role',\n inputSchema: {\n projectId: z.string(),\n email: z.string().email(),\n role: z.enum(['owner', 'admin', 'developer', 'member', 'viewer']),\n permissions: z.array(z.string()).optional(),\n },\n },\n async ({ projectId, email, role, permissions }) => {\n try {\n const body: Record<string, unknown> = { email, role };\n if (permissions !== undefined) body.permissions = permissions;\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/members`, {\n body,\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to add member: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_update',\n {\n description: 'Update a project member\\'s role, permissions, or console access',\n inputSchema: {\n projectId: z.string(),\n memberId: z.string(),\n role: z.enum(['owner', 'admin', 'developer', 'member', 'viewer']).optional(),\n permissions: z.array(z.string()).optional(),\n grantConsoleAccess: z.boolean().optional(),\n },\n },\n async ({ projectId, memberId, role, permissions, grantConsoleAccess }) => {\n try {\n const body: Record<string, unknown> = {};\n if (role !== undefined) body.role = role;\n if (permissions !== undefined) body.permissions = permissions;\n if (grantConsoleAccess !== undefined) body.grantConsoleAccess = grantConsoleAccess;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/members/${encodeURIComponent(memberId)}`, {\n body,\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update member: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_remove',\n {\n description: 'Remove a member from a project',\n inputSchema: {\n projectId: z.string(),\n memberId: z.string(),\n },\n },\n async ({ projectId, memberId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/members/${encodeURIComponent(memberId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Member removed', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to remove member: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_users_create',\n {\n description: 'Create a new user within a project. WARNING: The password will be visible in the conversation context.',\n inputSchema: {\n projectId: z.string(),\n username: z.string(),\n email: z.string().email(),\n password: z.string().min(1),\n role: z.enum(['owner', 'admin', 'developer', 'member', 'viewer']),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n displayName: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n grantConsoleAccess: z.boolean().optional(),\n },\n },\n async ({ projectId, username, email, password, role, firstName, lastName, displayName, permissions, grantConsoleAccess }) => {\n try {\n const body: Record<string, unknown> = { username, email, password, role };\n if (firstName !== undefined) body.firstName = firstName;\n if (lastName !== undefined) body.lastName = lastName;\n if (displayName !== undefined) body.displayName = displayName;\n if (permissions !== undefined) body.permissions = permissions;\n if (grantConsoleAccess !== undefined) body.grantConsoleAccess = grantConsoleAccess;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/users`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create user: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_role',\n {\n description: 'Get the current user\\'s role in a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/role`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get role: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { redactSecrets } from '../utils';\n\nexport function registerClientTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'clients_list',\n {\n description: 'List all OAuth clients for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/clients/project/${encodeURIComponent(projectId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list clients: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_get',\n {\n description: 'Get details of a specific OAuth client',\n inputSchema: {\n clientId: z.string(),\n },\n },\n async ({ clientId }) => {\n try {\n const result = await api.get(`/clients/${encodeURIComponent(clientId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_create',\n {\n description: 'Create a new OAuth client for a project',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n grantTypes: z.array(z.string()),\n redirectUris: z.array(z.string().url()).optional(),\n scopes: z.array(z.string()).optional(),\n isConfidential: z.boolean().optional(),\n corsOrigins: z.array(z.string()).optional(),\n accessTokenTtl: z.number().optional(),\n },\n },\n async ({ projectId, name, grantTypes, redirectUris, scopes, isConfidential, corsOrigins, accessTokenTtl }) => {\n try {\n const body: Record<string, unknown> = { projectId, name, grantTypes };\n if (redirectUris !== undefined) body.redirectUris = redirectUris;\n if (scopes !== undefined) body.scopes = scopes;\n if (isConfidential !== undefined) body.isConfidential = isConfidential;\n if (corsOrigins !== undefined) body.corsOrigins = corsOrigins;\n if (accessTokenTtl !== undefined) body.accessTokenTtl = accessTokenTtl;\n\n const result = await api.post('/clients', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_update',\n {\n description: 'Update an existing OAuth client',\n inputSchema: {\n clientId: z.string(),\n name: z.string().optional(),\n redirectUris: z.array(z.string().url()).optional(),\n scopes: z.array(z.string()).optional(),\n grantTypes: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n corsOrigins: z.array(z.string()).optional(),\n accessTokenTtl: z.number().optional(),\n },\n },\n async ({ clientId, name, redirectUris, scopes, grantTypes, isActive, corsOrigins, accessTokenTtl }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (redirectUris !== undefined) body.redirectUris = redirectUris;\n if (scopes !== undefined) body.scopes = scopes;\n if (grantTypes !== undefined) body.grantTypes = grantTypes;\n if (isActive !== undefined) body.isActive = isActive;\n if (corsOrigins !== undefined) body.corsOrigins = corsOrigins;\n if (accessTokenTtl !== undefined) body.accessTokenTtl = accessTokenTtl;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/clients/${encodeURIComponent(clientId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_delete',\n {\n description: 'Delete an OAuth client',\n inputSchema: {\n clientId: z.string(),\n },\n },\n async ({ clientId }) => {\n try {\n const result = await api.delete(`/clients/${encodeURIComponent(clientId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Client deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // Intentionally NOT redacted — the new secret can only be retrieved once.\n // Other clients_* tools use redactSecrets() to hide stored secrets.\n server.registerTool(\n 'clients_regenerate_secret',\n {\n description: 'Regenerate the secret for an OAuth client. WARNING: The new secret will be visible in the conversation context. This is the only time the secret can be retrieved.',\n inputSchema: {\n clientId: z.string(),\n },\n },\n async ({ clientId }) => {\n try {\n const result = await api.post(`/clients/${encodeURIComponent(clientId)}/regenerate-secret`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to regenerate client secret: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerDatabaseTools(server: McpServer, api: ApiClient): void {\n // --- Collections ---\n\n server.registerTool(\n 'database_collections_list',\n {\n description: 'List all collections in a project database',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/collections`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list collections: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_collections_create',\n {\n description: 'Create a new collection in a project database',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n description: z.string().optional(),\n },\n },\n async ({ projectId, name, description }) => {\n try {\n const body: Record<string, unknown> = { name };\n if (description !== undefined) body.description = description;\n\n const result = await api.post(`/databases/${encodeURIComponent(projectId)}/collections`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create collection: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_collections_delete',\n {\n description: 'Delete a collection from a project database',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n },\n },\n async ({ projectId, name }) => {\n try {\n const result = await api.delete(`/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(name)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Collection deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete collection: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Security Rules ---\n\n server.registerTool(\n 'database_rules_get',\n {\n description: 'Get the security rules for a project database',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/rules`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_rules_set',\n {\n description: 'Set security rules for a project database',\n inputSchema: {\n projectId: z.string(),\n rules: z.record(z.string(), z.unknown()),\n expectedVersion: z.number().optional(),\n },\n },\n async ({ projectId, rules, expectedVersion }) => {\n try {\n const body: Record<string, unknown> = { rules };\n if (expectedVersion !== undefined) body.expectedVersion = expectedVersion;\n\n const result = await api.put(`/databases/${encodeURIComponent(projectId)}/rules`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_rules_validate',\n {\n description: 'Validate security rules without applying them',\n inputSchema: {\n projectId: z.string(),\n rules: z.record(z.string(), z.unknown()),\n },\n },\n async ({ projectId, rules }) => {\n try {\n const result = await api.post(`/databases/${encodeURIComponent(projectId)}/rules/validate`, {\n body: { rules },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to validate rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Index Rules ---\n\n server.registerTool(\n 'database_index_rules_get',\n {\n description: 'Get the index rules for a project database',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/index-rules`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get index rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_index_rules_sync',\n {\n description: 'Sync index rules for a project database',\n inputSchema: {\n projectId: z.string(),\n indexRules: z.record(z.string(), z.unknown()),\n },\n },\n async ({ projectId, indexRules }) => {\n try {\n const result = await api.put(`/databases/${encodeURIComponent(projectId)}/index-rules`, {\n body: { indexRules },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to sync index rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Indexes ---\n\n server.registerTool(\n 'database_indexes_list',\n {\n description: 'List all indexes for a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n },\n },\n async ({ projectId, collectionName }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/indexes`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list indexes: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_indexes_create',\n {\n description: 'Create a new index on a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n fields: z.record(z.string(), z.union([z.literal(1), z.literal(-1), z.literal('text')])),\n unique: z.boolean().optional(),\n sparse: z.boolean().optional(),\n ttlSeconds: z.number().optional(),\n },\n },\n async ({ projectId, collectionName, fields, unique, sparse, ttlSeconds }) => {\n try {\n const body: Record<string, unknown> = { fields };\n if (unique !== undefined) body.unique = unique;\n if (sparse !== undefined) body.sparse = sparse;\n if (ttlSeconds !== undefined) body.ttlSeconds = ttlSeconds;\n\n const result = await api.post(`/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/indexes`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create index: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_indexes_delete',\n {\n description: 'Delete an index from a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n indexName: z.string(),\n },\n },\n async ({ projectId, collectionName, indexName }) => {\n try {\n const result = await api.delete(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/indexes/${encodeURIComponent(indexName)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Index deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete index: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Documents ---\n\n server.registerTool(\n 'database_documents_find',\n {\n description: 'Query documents in a collection with optional filter, sort, field projection, limit (max 100), and offset',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n filter: z.record(z.string(), z.unknown()).optional(),\n sort: z.record(z.string(), z.union([z.literal(1), z.literal(-1)])).optional(),\n fields: z.array(z.string()).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, collectionName, filter, sort, fields, limit, offset }) => {\n try {\n const params: Record<string, string | number | boolean | undefined> = {};\n if (filter !== undefined) params.filter = JSON.stringify(filter);\n if (sort !== undefined) params.sort = JSON.stringify(sort);\n if (fields !== undefined) params.fields = JSON.stringify(fields);\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n\n const result = await api.get(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents`,\n { params },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to find documents: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_documents_insert',\n {\n description: 'Insert one or more documents into a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n documents: z.array(z.record(z.string(), z.unknown())).min(1).max(500),\n },\n },\n async ({ projectId, collectionName, documents }) => {\n try {\n const result = await api.post(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents`,\n { body: { documents } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to insert documents: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_documents_update',\n {\n description: 'Update a specific document in a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n docId: z.string(),\n update: z.record(z.string(), z.unknown()),\n },\n },\n async ({ projectId, collectionName, docId, update }) => {\n try {\n const result = await api.patch(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents/${encodeURIComponent(docId)}`,\n { body: { update } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update document: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_documents_delete',\n {\n description: 'Delete a specific document from a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n docId: z.string(),\n },\n },\n async ({ projectId, collectionName, docId }) => {\n try {\n const result = await api.delete(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents/${encodeURIComponent(docId)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Document deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete document: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Stats ---\n\n server.registerTool(\n 'database_stats',\n {\n description: 'Get database statistics for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/stats`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get database stats: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { ZipBuilder } from '../zip';\n\nexport function registerHostingTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'hosting_deployments_list',\n {\n description: 'List deployments for a hosting project',\n inputSchema: {\n projectId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, limit, offset }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/deployments`, {\n params: { limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list deployments: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_get',\n {\n description: 'Get details of a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // Note: create and activate use /hosting/deployments (flat route) — intentional,\n // matches the admin gateway controller which scopes these by projectId in the body.\n server.registerTool(\n 'hosting_deployments_create',\n {\n description: 'Create a new deployment for a hosting project',\n inputSchema: {\n projectId: z.string(),\n description: z.string().optional(),\n framework: z.string().optional(),\n },\n },\n async ({ projectId, description, framework }) => {\n try {\n const body: Record<string, unknown> = { projectId };\n if (description !== undefined) body.description = description;\n if (framework !== undefined) body.framework = framework;\n\n const result = await api.post('/hosting/deployments', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_upload',\n {\n description:\n 'Upload files to an existing hosting deployment. Accepts a record of ' +\n 'filename → content, bundles them into a ZIP archive, and uploads it.\\n\\n' +\n 'Typical workflow:\\n' +\n ' 1. hosting_deployments_create → get deploymentId\\n' +\n ' 2. hosting_deployments_upload → upload site files\\n' +\n ' 3. hosting_deployments_activate → make the deployment live\\n\\n' +\n 'Example:\\n' +\n ' files: { \"index.html\": \"<!DOCTYPE html>...\", \"style.css\": \"body { ... }\", \"app.js\": \"...\" }',\n inputSchema: {\n projectId: z.string().describe('Project ID'),\n deploymentId: z.string().describe('Deployment ID (from hosting_deployments_create)'),\n files: z\n .record(z.string(), z.string())\n .describe(\n 'Map of filename → file content. Keys are file paths inside the archive ' +\n '(e.g. \"index.html\", \"assets/style.css\"). Values are the UTF-8 file contents.',\n ),\n },\n },\n async ({ projectId, deploymentId, files }) => {\n try {\n const fileEntries = Object.entries(files);\n if (fileEntries.length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'files must contain at least one entry' }],\n isError: true as const,\n };\n }\n\n // Build ZIP archive from provided files\n const zip = new ZipBuilder();\n for (const [name, content] of fileEntries) {\n zip.addFile(name, content);\n }\n const zipBuffer = zip.toBuffer();\n\n // Upload to the hosting deployment upload endpoint\n const result = await api.uploadFile(\n `/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}/upload`,\n zipBuffer,\n 'site.zip',\n );\n\n const response: Record<string, unknown> = {\n success: true,\n filesUploaded: fileEntries.map(([name]) => name),\n bundleSizeBytes: zipBuffer.length,\n };\n if (result && typeof result === 'object') {\n Object.assign(response, result);\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to upload deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_activate',\n {\n description: 'Activate a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.post(`/hosting/deployments/${encodeURIComponent(deploymentId)}/activate`, {\n body: { projectId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to activate deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_delete',\n {\n description: 'Delete a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.delete(`/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Deployment deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_status',\n {\n description: 'Get the status of a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}/status`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get deployment status: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_config_get',\n {\n description: 'Get hosting configuration for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/config`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get hosting config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_config_update',\n {\n description: 'Update hosting configuration for a project',\n inputSchema: {\n projectId: z.string(),\n spaMode: z.boolean().optional(),\n defaultFile: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, spaMode, defaultFile, headers, enabled }) => {\n try {\n const body: Record<string, unknown> = {};\n if (spaMode !== undefined) body.spaMode = spaMode;\n if (defaultFile !== undefined) body.defaultFile = defaultFile;\n if (headers !== undefined) body.headers = headers;\n if (enabled !== undefined) body.enabled = enabled;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one config field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/hosting/projects/${encodeURIComponent(projectId)}/config`, {\n body,\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update hosting config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_list',\n {\n description: 'List custom domains for a hosting project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/domains`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list domains: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_get',\n {\n description: 'Get details of a specific custom domain',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_add',\n {\n description: 'Add a custom domain to a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n projectSlug: z.string(),\n verificationMethod: z.enum(['cname', 'txt']).optional(),\n },\n },\n async ({ projectId, domain, projectSlug, verificationMethod }) => {\n try {\n const body: Record<string, unknown> = { domain, projectSlug };\n if (verificationMethod !== undefined) body.verificationMethod = verificationMethod;\n\n const result = await api.post(`/hosting/projects/${encodeURIComponent(projectId)}/domains`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to add domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_verify',\n {\n description: 'Verify a custom domain for a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.post(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}/verify`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to verify domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_remove',\n {\n description: 'Remove a custom domain from a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.delete(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Domain removed', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to remove domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_set_primary',\n {\n description: 'Set a custom domain as the primary domain for a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.patch(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}/primary`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set primary domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { deflateRawSync } from 'node:zlib';\n\n/**\n * Minimal in-memory ZIP archive builder using Node.js built-in zlib.\n *\n * Supports adding UTF-8 text files and generating a complete ZIP buffer.\n * Intended for MCP tool use where adding external ZIP libraries is undesirable.\n *\n * @example\n * ```ts\n * const zip = new ZipBuilder();\n * zip.addFile('index.js', 'console.log(\"hello\");');\n * zip.addFile('lib/utils.js', 'export const add = (a, b) => a + b;');\n * const buffer = zip.toBuffer();\n * ```\n */\nexport class ZipBuilder {\n private files: Array<{\n name: Buffer;\n content: Buffer;\n compressed: Buffer;\n crc32: number;\n }> = [];\n\n /**\n * Add a text file to the archive.\n *\n * @param name - File path inside the ZIP (e.g. \"index.js\" or \"src/utils.ts\")\n * @param content - UTF-8 text content of the file\n */\n addFile(name: string, content: string): void {\n const nameBuffer = Buffer.from(name, 'utf-8');\n const contentBuffer = Buffer.from(content, 'utf-8');\n const compressed = deflateRawSync(contentBuffer, { level: 9 });\n const crc32 = computeCrc32(contentBuffer);\n\n this.files.push({\n name: nameBuffer,\n content: contentBuffer,\n compressed,\n crc32,\n });\n }\n\n /** Generate the complete ZIP archive as a Buffer. */\n toBuffer(): Buffer {\n const localHeaders: Buffer[] = [];\n const centralHeaders: Buffer[] = [];\n let offset = 0;\n\n for (const file of this.files) {\n // Local file header (30 bytes fixed + name + compressed data)\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0); // Local file header signature\n local.writeUInt16LE(20, 4); // Version needed (2.0)\n local.writeUInt16LE(0, 6); // General purpose bit flag\n local.writeUInt16LE(8, 8); // Compression method: deflate\n local.writeUInt16LE(0, 10); // Mod time\n local.writeUInt16LE(0, 12); // Mod date\n local.writeUInt32LE(file.crc32, 14); // CRC-32\n local.writeUInt32LE(file.compressed.length, 18); // Compressed size\n local.writeUInt32LE(file.content.length, 22); // Uncompressed size\n local.writeUInt16LE(file.name.length, 26); // File name length\n local.writeUInt16LE(0, 28); // Extra field length\n\n localHeaders.push(local, file.name, file.compressed);\n\n // Central directory header (46 bytes fixed + name)\n const central = Buffer.alloc(46);\n central.writeUInt32LE(0x02014b50, 0); // Central directory signature\n central.writeUInt16LE(20, 4); // Version made by\n central.writeUInt16LE(20, 6); // Version needed\n central.writeUInt16LE(0, 8); // General purpose bit flag\n central.writeUInt16LE(8, 10); // Compression method: deflate\n central.writeUInt16LE(0, 12); // Mod time\n central.writeUInt16LE(0, 14); // Mod date\n central.writeUInt32LE(file.crc32, 16); // CRC-32\n central.writeUInt32LE(file.compressed.length, 20); // Compressed size\n central.writeUInt32LE(file.content.length, 24); // Uncompressed size\n central.writeUInt16LE(file.name.length, 28); // File name length\n central.writeUInt16LE(0, 30); // Extra field length\n central.writeUInt16LE(0, 32); // File comment length\n central.writeUInt16LE(0, 34); // Disk number start\n central.writeUInt16LE(0, 36); // Internal file attributes\n central.writeUInt32LE(0, 38); // External file attributes\n central.writeUInt32LE(offset, 42); // Relative offset of local header\n\n centralHeaders.push(central, file.name);\n\n offset += 30 + file.name.length + file.compressed.length;\n }\n\n const centralDirSize = centralHeaders.reduce((sum, b) => sum + b.length, 0);\n\n // End of central directory record (22 bytes)\n const eocd = Buffer.alloc(22);\n eocd.writeUInt32LE(0x06054b50, 0); // EOCD signature\n eocd.writeUInt16LE(0, 4); // Disk number\n eocd.writeUInt16LE(0, 6); // Disk with central dir\n eocd.writeUInt16LE(this.files.length, 8); // Entries on this disk\n eocd.writeUInt16LE(this.files.length, 10); // Total entries\n eocd.writeUInt32LE(centralDirSize, 12); // Size of central directory\n eocd.writeUInt32LE(offset, 16); // Offset of central directory\n eocd.writeUInt16LE(0, 20); // Comment length\n\n return Buffer.concat([...localHeaders, ...centralHeaders, eocd]);\n }\n}\n\n// ─── CRC-32 ────────────────────────────────────────────────────\n\nconst crcTable: Uint32Array = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[n] = c;\n }\n return table;\n})();\n\nfunction computeCrc32(data: Buffer): number {\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) {\n crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerStorageTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'storage_files_list',\n {\n description: 'List files in storage for a project and user',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, userId, limit, offset }) => {\n try {\n const result = await api.get('/storage/files', {\n params: { projectId, userId, limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list files: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_get',\n {\n description: 'Get details of a specific file in storage',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n },\n },\n async ({ projectId, userId, fileId }) => {\n try {\n const result = await api.get(`/storage/files/${encodeURIComponent(fileId)}`, {\n params: { projectId, userId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_delete',\n {\n description: 'Delete a specific file from storage',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n },\n },\n async ({ projectId, userId, fileId }) => {\n try {\n const result = await api.delete(`/storage/files/${encodeURIComponent(fileId)}`, {\n params: { projectId, userId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'File deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_visibility',\n {\n description: 'Update the visibility of a specific file',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n visibility: z.enum(['public', 'private']),\n },\n },\n async ({ projectId, userId, fileId, visibility }) => {\n try {\n const result = await api.patch(`/storage/files/${encodeURIComponent(fileId)}/visibility`, {\n params: { projectId, userId },\n body: { visibility },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update file visibility: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_share',\n {\n description: 'Share a file with other users',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n userIds: z.array(z.string()),\n permission: z.enum(['read', 'write']).optional(),\n },\n },\n async ({ projectId, userId, fileId, userIds, permission }) => {\n try {\n const result = await api.post(`/storage/files/${encodeURIComponent(fileId)}/share`, {\n params: { projectId, userId },\n body: { userIds, permission },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to share file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_unshare',\n {\n description: 'Remove file sharing for specific users',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n userIds: z.array(z.string()),\n },\n },\n async ({ projectId, userId, fileId, userIds }) => {\n try {\n const result = await api.post(`/storage/files/${encodeURIComponent(fileId)}/unshare`, {\n params: { projectId, userId },\n body: { userIds },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to unshare file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_quota_get',\n {\n description: 'Get storage quota information for a user in a project',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n },\n },\n async ({ projectId, userId }) => {\n try {\n const result = await api.get('/storage/quota', {\n params: { projectId, userId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get quota: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_quota_set',\n {\n description: 'Set storage quota for a user in a project',\n inputSchema: {\n projectId: z.string(),\n targetUserId: z.string(),\n quotaBytes: z.number().int().min(0),\n },\n },\n async ({ projectId, targetUserId, quotaBytes }) => {\n try {\n const result = await api.put('/storage/quota', {\n body: { projectId, targetUserId, quotaBytes },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set quota: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_project_stats',\n {\n description: 'Get storage statistics for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get('/storage/project-stats', {\n params: { projectId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get project stats: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { ZipBuilder } from '../zip';\n\nexport function registerFunctionTools(server: McpServer, api: ApiClient): void {\n // ─── CRUD ────────────────────────────────────────────────────\n\n server.registerTool(\n 'functions_list',\n {\n description: 'List all functions for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list functions: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_get',\n {\n description: 'Get details of a specific function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_create',\n {\n description: 'Create a new serverless function in a project',\n inputSchema: {\n projectId: z.string(),\n name: z.string().min(1).max(255),\n description: z.string().max(1000).optional(),\n entryPoint: z.string().max(255).optional(),\n cronExpression: z.string().optional(),\n cronTimezone: z.string().optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n memoryLimitMb: z.number().int().min(16).max(512).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, ...body }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions`,\n { body },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_update',\n {\n description: 'Update an existing function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n name: z.string().min(1).max(255).optional(),\n description: z.string().max(1000).optional(),\n entryPoint: z.string().max(255).optional(),\n cronExpression: z.string().optional(),\n cronTimezone: z.string().optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n memoryLimitMb: z.number().int().min(16).max(512).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, functionId, ...body }) => {\n try {\n const result = await api.patch(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n { body },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_delete',\n {\n description: 'Delete a function and its associated cron job',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.delete(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Code & Deployments ──────────────────────────────────────\n\n server.registerTool(\n 'functions_get_code',\n {\n description: 'Get the deployed source code of a function with syntax-highlighted file contents',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/code`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get function code: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_deploy',\n {\n description:\n 'Deploy code to a serverless function. Accepts one or more files as a ' +\n 'record of filename → content. The files are bundled into a ZIP archive ' +\n 'and uploaded. Use this after creating a function with functions_create.\\n\\n' +\n 'Example – single file:\\n' +\n ' files: { \"index.js\": \"export default async function handler(ctx) { ... }\" }\\n\\n' +\n 'Example – multiple files:\\n' +\n ' files: { \"index.js\": \"import {hello} from \\'./lib.js\\'; ...\", \"lib.js\": \"export const hello = () => ...\" }',\n inputSchema: {\n projectId: z.string().describe('Project ID'),\n functionId: z.string().describe('Function ID (from functions_create or functions_list)'),\n files: z\n .record(z.string(), z.string())\n .describe(\n 'Map of filename → file content. Keys are file paths inside the bundle ' +\n '(e.g. \"index.js\", \"src/helper.ts\"). Values are the UTF-8 source code.',\n ),\n entryPoint: z\n .string()\n .max(255)\n .optional()\n .describe('Entry point file inside the bundle (default: \"index.js\"). Must match a key in files.'),\n },\n },\n async ({ projectId, functionId, files, entryPoint }) => {\n try {\n const fileEntries = Object.entries(files);\n if (fileEntries.length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'files must contain at least one entry' }],\n isError: true as const,\n };\n }\n\n // Update entry point on the function if provided\n if (entryPoint) {\n await api.patch(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n { body: { entryPoint } },\n );\n }\n\n // Build ZIP archive from provided files\n const zip = new ZipBuilder();\n for (const [name, content] of fileEntries) {\n zip.addFile(name, content);\n }\n const zipBuffer = zip.toBuffer();\n\n // Upload to the deploy endpoint\n const result = await api.uploadFile(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/deploy`,\n zipBuffer,\n 'bundle.zip',\n );\n\n const response: Record<string, unknown> = {\n success: true,\n filesDeployed: fileEntries.map(([name]) => name),\n bundleSizeBytes: zipBuffer.length,\n };\n if (result && typeof result === 'object') {\n Object.assign(response, result);\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to deploy function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_deployments_list',\n {\n description: 'List all deployments (versions) of a function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/deployments`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list deployments: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Execution ───────────────────────────────────────────────\n\n server.registerTool(\n 'functions_trigger',\n {\n description: 'Manually trigger a function execution',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/trigger`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to trigger function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_executions_list',\n {\n description: 'List recent executions of a function with status, duration, and logs',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, functionId, limit, offset }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/executions`,\n { params: { limit, offset } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list executions: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Webhooks ────────────────────────────────────────────────\n\n server.registerTool(\n 'functions_enable_webhook',\n {\n description: 'Enable webhook trigger for a function. Returns a one-time webhook secret.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/webhook/enable`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to enable webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_regenerate_webhook_secret',\n {\n description: 'Regenerate the webhook secret for a function. Old secret stops working immediately.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/webhook/regenerate-secret`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to regenerate webhook secret: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_disable_webhook',\n {\n description: 'Disable webhook trigger for a function. The webhook secret is deleted.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/webhook/disable`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to disable webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Environment Variables ───────────────────────────────────\n\n server.registerTool(\n 'functions_get_env_vars',\n {\n description: 'Get environment variables for a function (decrypted). Use these to store API keys and secrets.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/env`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get env vars: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_set_env_vars',\n {\n description: 'Set environment variables for a function. Merges with existing vars. Values are encrypted at rest.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n variables: z.record(z.string(), z.string()),\n },\n },\n async ({ projectId, functionId, variables }) => {\n try {\n // Get existing vars first, merge, then update\n const existing = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/env`,\n ) as Record<string, string>;\n\n const merged = { ...existing, ...variables };\n\n await api.patch(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n { body: { environmentVariables: merged } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ success: true, keys: Object.keys(merged) }, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set env vars: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── KV Store ────────────────────────────────────────────────\n\n server.registerTool(\n 'functions_kv_list',\n {\n description: 'List KV store keys for a function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/kv`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list KV keys: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerEmailTemplateTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'email_templates_list',\n {\n description: 'List all email templates for a project (includes system defaults)',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/email-templates`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list email templates: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_get',\n {\n description: 'Get a single email template by ID',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.get(`/email-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_create',\n {\n description: 'Create a new project-specific email template. The type identifies the template purpose (e.g. \"verify-email\", \"welcome\", \"invoice\").',\n inputSchema: {\n projectId: z.string(),\n type: z.string(),\n name: z.string(),\n subject: z.string(),\n mjmlSource: z.string(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ projectId, type, name, subject, mjmlSource, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = { projectId, type, name, subject, mjmlSource };\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/email-templates`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_update',\n {\n description: 'Update an existing email template',\n inputSchema: {\n id: z.string(),\n name: z.string().optional(),\n subject: z.string().optional(),\n mjmlSource: z.string().optional(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ id, name, subject, mjmlSource, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (subject !== undefined) body.subject = subject;\n if (mjmlSource !== undefined) body.mjmlSource = mjmlSource;\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/email-templates/${encodeURIComponent(id)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_delete',\n {\n description: 'Delete an email template. System default templates cannot be deleted.',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.delete(`/email-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Email template deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_preview',\n {\n description: 'Preview a compiled email template. Renders MJML to HTML and applies Handlebars variables.',\n inputSchema: {\n mjmlSource: z.string(),\n variables: z.record(z.string(), z.unknown()).optional(),\n },\n },\n async ({ mjmlSource, variables }) => {\n try {\n const body: Record<string, unknown> = { mjmlSource };\n if (variables !== undefined) body.variables = variables;\n\n const result = await api.post('/email-templates/preview', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to preview email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerCronJobTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'cron_jobs_list',\n {\n description: 'List all cron jobs for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/cron-jobs`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list cron jobs: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_get',\n {\n description: 'Get a single cron job by ID',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ projectId, jobId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_create',\n {\n description: 'Create a new cron job. When type is \"webhook\", url is required. When type is \"function\", functionId is required. cronExpression uses 5-field cron format (e.g. \"0 0 * * *\").',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n cronExpression: z.string().regex(/^(\\S+\\s){4}\\S+$/),\n timezone: z.string().optional(),\n type: z.enum(['webhook', 'function']).optional(),\n functionId: z.string().optional(),\n url: z.string().url().optional(),\n secret: z.string().optional(),\n payload: z.record(z.string(), z.unknown()).optional(),\n retryAttempts: z.number().int().min(0).max(10).optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, name, cronExpression, timezone, type, functionId, url, secret, payload, retryAttempts, timeout, enabled }) => {\n try {\n const body: Record<string, unknown> = { name, cronExpression };\n if (timezone !== undefined) body.timezone = timezone;\n if (type !== undefined) body.type = type;\n if (functionId !== undefined) body.functionId = functionId;\n if (url !== undefined) body.url = url;\n if (secret !== undefined) body.secret = secret;\n if (payload !== undefined) body.payload = payload;\n if (retryAttempts !== undefined) body.retryAttempts = retryAttempts;\n if (timeout !== undefined) body.timeout = timeout;\n if (enabled !== undefined) body.enabled = enabled;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/cron-jobs`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_update',\n {\n description: 'Update an existing cron job',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n name: z.string().optional(),\n cronExpression: z.string().regex(/^(\\S+\\s){4}\\S+$/).optional(),\n timezone: z.string().optional(),\n type: z.enum(['webhook', 'function']).optional(),\n functionId: z.string().optional(),\n url: z.string().url().optional(),\n secret: z.string().optional(),\n payload: z.record(z.string(), z.unknown()).optional(),\n retryAttempts: z.number().int().min(0).max(10).optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, jobId, name, cronExpression, timezone, type, functionId, url, secret, payload, retryAttempts, timeout, enabled }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (cronExpression !== undefined) body.cronExpression = cronExpression;\n if (timezone !== undefined) body.timezone = timezone;\n if (type !== undefined) body.type = type;\n if (functionId !== undefined) body.functionId = functionId;\n if (url !== undefined) body.url = url;\n if (secret !== undefined) body.secret = secret;\n if (payload !== undefined) body.payload = payload;\n if (retryAttempts !== undefined) body.retryAttempts = retryAttempts;\n if (timeout !== undefined) body.timeout = timeout;\n if (enabled !== undefined) body.enabled = enabled;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_delete',\n {\n description: 'Delete a cron job',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ projectId, jobId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Cron job deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_trigger',\n {\n description: 'Manually trigger a cron job execution',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ projectId, jobId }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}/trigger`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to trigger cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_toggle',\n {\n description: 'Toggle a cron job enabled/disabled',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n enabled: z.boolean(),\n },\n },\n async ({ projectId, jobId, enabled }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}/toggle`, { body: { enabled } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to toggle cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_executions',\n {\n description: 'List execution history for a cron job',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, jobId, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}/executions`, { params: { limit, offset } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list cron job executions: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_list_all',\n {\n description: 'List all cron jobs across projects (admin overview)',\n inputSchema: {\n projectId: z.string().optional(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get('/cron/jobs', { params: { projectId } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list all cron jobs: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_status',\n {\n description: 'Get cron queue status',\n inputSchema: {},\n },\n async () => {\n try {\n const result = await api.get('/cron/status');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get cron status: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nconst WEBHOOK_EVENT_TYPES = [\n 'user.created',\n 'user.updated',\n 'user.deleted',\n 'user.login',\n 'user.email_verified',\n 'user.password_reset_requested',\n 'user.password_reset',\n 'user.2fa_verified',\n 'database.insert',\n 'database.update',\n 'database.delete',\n 'storage.upload',\n 'storage.delete',\n 'project.created',\n 'project.updated',\n] as const;\n\nexport function registerWebhookTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'webhooks_list',\n {\n description: 'List all webhooks for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/webhooks`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list webhooks: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_get',\n {\n description: 'Get a single webhook by ID',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n },\n },\n async ({ projectId, webhookId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_create',\n {\n description: 'Create a new webhook for a project. WARNING: The response includes a secret that will be visible in the conversation context. Events include: user.created, user.updated, user.deleted, user.login, user.email_verified, user.password_reset_requested, user.password_reset, user.2fa_verified, database.insert, database.update, database.delete, storage.upload, storage.delete, project.created, project.updated.',\n inputSchema: {\n projectId: z.string(),\n url: z.string().url(),\n events: z.array(z.enum(WEBHOOK_EVENT_TYPES)).min(1),\n description: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n active: z.boolean().optional(),\n },\n },\n async ({ projectId, url, events, description, headers, active }) => {\n try {\n const body: Record<string, unknown> = { url, events };\n if (description !== undefined) body.description = description;\n if (headers !== undefined) body.headers = headers;\n if (active !== undefined) body.active = active;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/webhooks`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_update',\n {\n description: 'Update an existing webhook',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n url: z.string().url().optional(),\n events: z.array(z.enum(WEBHOOK_EVENT_TYPES)).min(1).optional(),\n description: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n active: z.boolean().optional(),\n },\n },\n async ({ projectId, webhookId, url, events, description, headers, active }) => {\n try {\n const body: Record<string, unknown> = {};\n if (url !== undefined) body.url = url;\n if (events !== undefined) body.events = events;\n if (description !== undefined) body.description = description;\n if (headers !== undefined) body.headers = headers;\n if (active !== undefined) body.active = active;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_delete',\n {\n description: 'Delete a webhook',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n },\n },\n async ({ projectId, webhookId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Webhook deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_test',\n {\n description: 'Send a test ping to a webhook',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n },\n },\n async ({ projectId, webhookId }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}/test`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to test webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_deliveries',\n {\n description: 'List webhook delivery logs for a project',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, webhookId, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/webhook-deliveries`, { params: { webhookId, limit, offset } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list webhook deliveries: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_delivery_retry',\n {\n description: 'Retry a failed webhook delivery',\n inputSchema: {\n projectId: z.string(),\n deliveryId: z.string(),\n },\n },\n async ({ projectId, deliveryId }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/webhook-deliveries/${encodeURIComponent(deliveryId)}/retry`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to retry webhook delivery: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerNotificationTools(server: McpServer, api: ApiClient): void {\n // --- Templates ---\n\n server.registerTool(\n 'notification_templates_list',\n {\n description: 'List all notification templates for a project (includes system defaults)',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/notification-templates`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list notification templates: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_get',\n {\n description: 'Get a single notification template by ID',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.get(`/notification-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_create',\n {\n description: 'Create a new project-specific notification template. Variables use Handlebars syntax in titleTemplate and bodyTemplate.',\n inputSchema: {\n projectId: z.string(),\n type: z.string(),\n name: z.string(),\n titleTemplate: z.string(),\n bodyTemplate: z.string(),\n icon: z.string().optional(),\n defaultUrl: z.string().optional(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ projectId, type, name, titleTemplate, bodyTemplate, icon, defaultUrl, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = { projectId, type, name, titleTemplate, bodyTemplate };\n if (icon !== undefined) body.icon = icon;\n if (defaultUrl !== undefined) body.defaultUrl = defaultUrl;\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/notification-templates`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_update',\n {\n description: 'Update an existing notification template',\n inputSchema: {\n id: z.string(),\n name: z.string().optional(),\n titleTemplate: z.string().optional(),\n bodyTemplate: z.string().optional(),\n icon: z.string().optional(),\n defaultUrl: z.string().optional(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ id, name, titleTemplate, bodyTemplate, icon, defaultUrl, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (titleTemplate !== undefined) body.titleTemplate = titleTemplate;\n if (bodyTemplate !== undefined) body.bodyTemplate = bodyTemplate;\n if (icon !== undefined) body.icon = icon;\n if (defaultUrl !== undefined) body.defaultUrl = defaultUrl;\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/notification-templates/${encodeURIComponent(id)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_delete',\n {\n description: 'Delete a project notification template override (reverts to system default)',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.delete(`/notification-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Notification template deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_preview',\n {\n description: 'Preview a compiled notification template with Handlebars variables applied',\n inputSchema: {\n titleTemplate: z.string(),\n bodyTemplate: z.string(),\n variables: z.record(z.string(), z.string()),\n },\n },\n async ({ titleTemplate, bodyTemplate, variables }) => {\n try {\n const result = await api.post('/notification-templates/preview', { body: { titleTemplate, bodyTemplate, variables } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to preview notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Config ---\n\n server.registerTool(\n 'notification_config_get',\n {\n description: 'Get push notification provider configuration for a project (VAPID, FCM, APNS). WARNING: Response may include sensitive credentials that will be visible in the conversation context.',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/notification-config`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get notification config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_config_update',\n {\n description: 'Update push notification provider configuration. Supports VAPID, FCM, and APNS providers. WARNING: privateKey and serviceAccountJson values are sensitive credentials that will be visible in the conversation context.',\n inputSchema: {\n projectId: z.string(),\n vapid: z.object({\n publicKey: z.string().optional(),\n privateKey: z.string().optional(),\n subject: z.string().optional(),\n enabled: z.boolean().optional(),\n }).optional(),\n fcm: z.object({\n serviceAccountJson: z.string().optional(),\n enabled: z.boolean().optional(),\n }).optional(),\n apns: z.object({\n keyId: z.string().optional(),\n teamId: z.string().optional(),\n privateKey: z.string().optional(),\n bundleId: z.string().optional(),\n production: z.boolean().optional(),\n enabled: z.boolean().optional(),\n }).optional(),\n },\n },\n async ({ projectId, vapid, fcm, apns }) => {\n try {\n const body: Record<string, unknown> = {};\n if (vapid !== undefined) body.vapid = vapid;\n if (fcm !== undefined) body.fcm = fcm;\n if (apns !== undefined) body.apns = apns;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one provider config must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/notification-config`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update notification config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_config_delete',\n {\n description: 'Delete push notification provider configuration. Specify a provider to delete only that one, or omit to delete all.',\n inputSchema: {\n projectId: z.string(),\n provider: z.enum(['vapid', 'fcm', 'apns']).optional(),\n },\n },\n async ({ projectId, provider }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/notification-config`, { params: { provider } });\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Notification config deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete notification config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_config_generate_vapid',\n {\n description: 'Generate a new VAPID key pair for web push notifications. WARNING: The private key will be visible in the conversation context.',\n inputSchema: {},\n },\n async () => {\n try {\n const result = await api.post('/notification-config/generate-vapid-keys');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to generate VAPID keys: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Send ---\n\n server.registerTool(\n 'notifications_send',\n {\n description: 'Send a push notification to selected users',\n inputSchema: {\n projectId: z.string(),\n userIds: z.array(z.string()).min(1),\n title: z.string(),\n body: z.string(),\n icon: z.string().optional(),\n url: z.string().optional(),\n },\n },\n async ({ projectId, userIds, title, body: notifBody, icon, url }) => {\n try {\n const reqBody: Record<string, unknown> = { userIds, title, body: notifBody };\n if (icon !== undefined) reqBody.icon = icon;\n if (url !== undefined) reqBody.url = url;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/notifications/send`, { body: reqBody });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to send notification: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notifications_broadcast',\n {\n description: 'Broadcast a push notification to all subscribed users in a project',\n inputSchema: {\n projectId: z.string(),\n title: z.string(),\n body: z.string(),\n icon: z.string().optional(),\n url: z.string().optional(),\n },\n },\n async ({ projectId, title, body: notifBody, icon, url }) => {\n try {\n const reqBody: Record<string, unknown> = { title, body: notifBody };\n if (icon !== undefined) reqBody.icon = icon;\n if (url !== undefined) reqBody.url = url;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/notifications/broadcast`, { body: reqBody });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to broadcast notification: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerAuditLogTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'audit_logs_list',\n {\n description: 'List audit logs for a project. Filter by entity type, action, and date range.',\n inputSchema: {\n projectId: z.string(),\n entityType: z.enum(['user', 'client', 'project', 'auth', 'database', 'storage']).optional(),\n action: z.string().optional(),\n startDate: z.string().datetime().optional(),\n endDate: z.string().datetime().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, entityType, action, startDate, endDate, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/audit-logs`, {\n params: { entityType, action, startDate, endDate, limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list audit logs: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'audit_logs_get',\n {\n description: 'Get a single audit log entry by ID',\n inputSchema: {\n projectId: z.string(),\n logId: z.string(),\n },\n },\n async ({ projectId, logId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/audit-logs/${encodeURIComponent(logId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get audit log: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { ApiClient } from '../api-client';\nimport { registerAuthTools } from './auth';\nimport { registerProjectTools } from './projects';\nimport { registerClientTools } from './clients';\nimport { registerDatabaseTools } from './database';\nimport { registerHostingTools } from './hosting';\nimport { registerStorageTools } from './storage';\nimport { registerFunctionTools } from './functions';\nimport { registerEmailTemplateTools } from './emailTemplates';\nimport { registerCronJobTools } from './cronJobs';\nimport { registerWebhookTools } from './webhooks';\nimport { registerNotificationTools } from './notifications';\nimport { registerAuditLogTools } from './auditLogs';\n\nexport function registerAllTools(server: McpServer, api: ApiClient): void {\n registerAuthTools(server, api);\n registerProjectTools(server, api);\n registerClientTools(server, api);\n registerDatabaseTools(server, api);\n registerHostingTools(server, api);\n registerStorageTools(server, api);\n registerFunctionTools(server, api);\n registerEmailTemplateTools(server, api);\n registerCronJobTools(server, api);\n registerWebhookTools(server, api);\n registerNotificationTools(server, api);\n registerAuditLogTools(server, api);\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerDatabasePrompts(server: McpServer): void {\n server.registerPrompt(\n 'setup-collection',\n {\n title: 'Setup Database Collection',\n description:\n 'Guide for creating a new database collection with proper security rules. ' +\n 'Collections MUST have rules defined before data can be inserted.',\n argsSchema: {\n projectId: z.string().describe('Project ID'),\n collectionName: z.string().describe('Name of the collection to create'),\n access: z\n .enum(['public-read', 'authenticated', 'admin-only'])\n .optional()\n .describe('Access level (default: admin-only)'),\n },\n },\n async ({ projectId, collectionName, access }) => {\n const accessLevel = access || 'admin-only';\n\n const rules: Record<string, Record<string, string>> = {\n 'public-read': {\n '.create': 'true',\n '.read': 'true',\n '.update': 'false',\n '.delete': \"auth.role === 'owner' || auth.role === 'admin'\",\n },\n authenticated: {\n '.create': '!!auth.uid',\n '.read': '!!auth.uid',\n '.update': '!!auth.uid',\n '.delete': \"auth.role === 'owner' || auth.role === 'admin'\",\n },\n 'admin-only': {\n '.create': \"auth.role === 'owner' || auth.role === 'admin'\",\n '.read': \"auth.role === 'owner' || auth.role === 'admin'\",\n '.update': \"auth.role === 'owner' || auth.role === 'admin'\",\n '.delete': \"auth.role === 'owner' || auth.role === 'admin'\",\n },\n };\n\n const collectionRules = rules[accessLevel];\n const rulesJson = JSON.stringify(collectionRules, null, 2);\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Set up a new database collection \"${collectionName}\" in project ${projectId}.`,\n '',\n 'IMPORTANT WORKFLOW:',\n '1. First, get the current rules with database_rules_get',\n '2. Add the new collection rules to the existing rules object',\n '3. Set the updated rules with database_rules_set — this automatically creates the collection',\n '4. Do NOT try to insert documents before the rules are set — it will fail with \"Rule denied\"',\n '',\n `Suggested rules for \"${collectionName}\" (${accessLevel}):`,\n rulesJson,\n '',\n 'The $other catch-all rule should deny access to undefined collections:',\n ' \"$other\": { \".read\": \"false\", \".write\": \"false\" }',\n '',\n 'After rules are set, the collection is ready for use via:',\n '- database_documents_insert',\n '- database_documents_find',\n '- Serverless functions using spacelr.db.collection(\"' + collectionName + '\")',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n\n server.registerPrompt(\n 'database-workflow',\n {\n title: 'Database Workflow Guide',\n description:\n 'Explains how the Spacelr database system works: rules-first approach, ' +\n 'collection lifecycle, and security model.',\n argsSchema: {\n projectId: z.string().describe('Project ID'),\n },\n },\n async ({ projectId }) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Guide me through the Spacelr database system for project ${projectId}.`,\n '',\n 'CORE CONCEPTS:',\n '',\n '1. RULES-FIRST: Collections are defined through security rules.',\n ' - Use database_rules_get to see current rules',\n ' - Use database_rules_set to add/modify collection rules',\n ' - Setting rules automatically creates the collection definition',\n ' - Without rules, all operations are denied by the $other catch-all',\n '',\n '2. SECURITY RULES SYNTAX:',\n ' - \".create\": Expression that must evaluate to true for inserts',\n ' - \".read\": Expression for reads/queries',\n ' - \".update\": Expression for document updates',\n ' - \".delete\": Expression for document deletion',\n ' - \".validate\": Per-field validation expressions',\n ' - \".schema\": Field type declarations',\n ' Available context: auth.uid, auth.role, newData (for validation)',\n '',\n '3. WORKFLOW:',\n ' a) Define rules for the collection',\n ' b) Optionally create indexes (database_indexes_create)',\n ' c) Insert/query documents',\n '',\n '4. DATA ISOLATION:',\n ' - Each project has its own database (project_{projectId})',\n ' - Collections are scoped to the project automatically',\n ' - No cross-project data access is possible',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerFunctionPrompts(server: McpServer): void {\n server.registerPrompt(\n 'deploy-function',\n {\n title: 'Deploy a Serverless Function',\n description:\n 'Step-by-step guide for creating, deploying, and testing a serverless function. ' +\n 'Covers the full lifecycle from creation to execution.',\n argsSchema: {\n projectId: z.string().describe('Project ID'),\n name: z.string().describe('Function name'),\n useCase: z\n .string()\n .optional()\n .describe('What the function should do (e.g. \"fetch data from API and store in DB\")'),\n },\n },\n async ({ projectId, name, useCase }) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Deploy a serverless function \"${name}\" in project ${projectId}.`,\n useCase ? `Use case: ${useCase}` : '',\n '',\n 'DEPLOYMENT WORKFLOW:',\n '',\n '1. CREATE the function:',\n ' Use functions_create with name, entryPoint (default: index.js),',\n ' timeout (ms, default: 30000), memoryLimitMb (default: 128)',\n ' Optional: cronExpression for scheduled execution',\n '',\n '2. WRITE the code:',\n ' Create an index.js file with plain JavaScript (ES2022).',\n ' The runtime is an isolated V8 sandbox — NOT Node.js.',\n ' No require/import, no Node.js built-ins (fs, path, crypto, Buffer, process).',\n ' Top-level await is supported. Available APIs inside the sandbox:',\n '',\n ' - console.log/warn/error/info() — captured to execution logs',\n ' - await fetch(url, options) — HTTP client (10s timeout, 5MB limit)',\n ' Response: { status, headers, body } where body is a STRING',\n ' Use JSON.parse(response.body) for JSON APIs',\n ' - env.get(key) — read environment variables (API keys, secrets — set via Console UI or CLI)',\n ' - await kv.get/set/delete/list() — Redis KV store (256KB values, 1000 keys)',\n ' - await spacelr.db.collection(name).find/insertOne/insertMany()',\n ' - await spacelr.storage.list/getInfo/getDownloadUrl()',\n ' - await spacelr.email.send/sendRaw() — send template or raw emails',\n ' - await spacelr.notifications.send/sendMany() — push notifications',\n '',\n ' Trigger context globals (depending on trigger type):',\n ' - event: { type, data, timestamp } — for event-triggered executions',\n ' - payload: { ... } — for webhook-triggered executions (the POST body)',\n '',\n ' IMPORTANT: Top-level await is supported. No imports/require available.',\n '',\n '3. IF USING spacelr.db:',\n ' Database rules MUST be set BEFORE the function writes to a collection.',\n ' Use the setup-collection prompt or manually set rules via database_rules_set.',\n ' Without rules, inserts will fail with \"Rule denied\".',\n '',\n '4. DEPLOY the code:',\n ' Use the functions_deploy tool to upload code directly:',\n ' functions_deploy({ projectId, functionId, files: { \"index.js\": \"...\" } })',\n ' This bundles the files into a ZIP and uploads them automatically.',\n ' You can deploy multiple files: { \"index.js\": \"...\", \"lib.js\": \"...\" }',\n ' Optionally set entryPoint if your main file is not index.js.',\n '',\n '5. TRIGGER:',\n ' Functions support multiple trigger types:',\n '',\n ' a) Manual: Use functions_trigger to execute on demand.',\n ' b) Cron: Set cronExpression when creating/updating the function.',\n ' c) Webhook: Enable with functions_enable_webhook to get a secret,',\n ' then POST to /api/v1/functions/{projectId}/{functionId}/invoke',\n ' with the X-Webhook-Secret header. Use functions_regenerate_webhook_secret',\n ' to rotate the secret (old secret stops working immediately).',\n ' d) Event: Configure event triggers to run the function in response',\n ' to platform events (e.g. database changes, storage uploads).',\n '',\n ' Check results with functions_executions_list.',\n '',\n '6. VERIFY:',\n ' Check execution status, logs, and duration.',\n ' Use functions_get_code to review the deployed source.',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n\n server.registerPrompt(\n 'function-sandbox-reference',\n {\n title: 'Function Sandbox API Reference',\n description:\n 'Complete reference for all APIs available inside a serverless function sandbox.',\n argsSchema: {},\n },\n async () => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n 'Show me the complete API reference for the Spacelr function sandbox.',\n '',\n '═══ RUNTIME ENVIRONMENT ═══',\n 'Functions run in an isolated V8 sandbox (via isolated-vm), NOT in Node.js.',\n 'This means:',\n ' - No require() or import statements — all APIs are pre-injected globals',\n ' - No Node.js built-ins (fs, path, crypto, Buffer, process, etc.)',\n ' - No setTimeout, setInterval, or Promise.race',\n ' - No Function constructor, eval(), WebAssembly, or Proxy',\n ' - Top-level await IS supported (code runs in an async IIFE)',\n ' - Standard JS built-ins work: JSON, Math, Date, Array, Map, Set, RegExp, etc.',\n ' - Use the built-in fetch() for HTTP calls (not node-fetch or axios)',\n ' - Use env.get() for secrets (not process.env)',\n ' - Use kv.get/set() for persistence across executions (not file system)',\n '',\n 'Write plain JavaScript (ES2022). The code structure is simple:',\n ' // Top-level code runs immediately',\n ' const data = await fetch(\"https://api.example.com/data\");',\n ' const json = JSON.parse(data.body);',\n ' console.log(\"Fetched\", json.length, \"items\");',\n '',\n '═══ TRIGGER CONTEXT ═══',\n 'Depending on how the function was triggered, these globals may be available:',\n ' - event: { type, data, timestamp } — for event-triggered executions',\n ' - payload: { ... } — for webhook-triggered executions (the POST body)',\n 'For manual and cron triggers, neither is set.',\n '',\n '═══ CONSOLE ═══',\n 'console.log(...args) — log level',\n 'console.info(...args) — info level',\n 'console.warn(...args) — warn level',\n 'console.error(...args) — error level',\n 'All logs are captured and stored in the execution record.',\n 'Log buffer is capped at 1MB.',\n '',\n '═══ FETCH ═══',\n 'const response = await fetch(url, options?)',\n ' options: { method, headers, body }',\n ' returns: { status: number, headers: Record<string,string>, body: string }',\n ' NOTE: body is always a string — use JSON.parse(response.body) for JSON',\n ' Limits: 10s timeout, 5MB response, no private/internal URLs (SSRF blocked)',\n '',\n '═══ ENV (Environment Variables) ═══',\n 'env.get(key) → string | undefined',\n 'Read-only access to function environment variables.',\n 'Use env vars to store API keys, secrets, and configuration — never hardcode them in function code.',\n 'Set via Console UI (Function Detail → Environment Variables) or CLI (spacelr functions env set).',\n 'Values are encrypted at rest and only decrypted when the function executes.',\n '',\n '═══ KV STORE ═══',\n 'await kv.get(key) → string | null',\n 'await kv.set(key, value, ttlSeconds?) → void',\n 'await kv.delete(key) → boolean',\n 'await kv.list(prefix?) → string[]',\n 'Backed by Redis. Scoped per function.',\n 'Limits: 256KB per value, 1000 keys per function, 30-day default TTL.',\n '',\n '═══ DATABASE ═══',\n 'const docs = await spacelr.db.collection(name).find(filter?, options?)',\n ' filter: MongoDB-style query (e.g. { status: \"active\", age: { $gt: 18 } })',\n ' options: { sort: { createdAt: -1 }, limit: 10, offset: 0 }',\n ' returns: array of documents',\n '',\n 'await spacelr.db.collection(name).insertOne(doc)',\n ' doc: plain object (e.g. { name: \"Max\", email: \"max@example.com\" })',\n ' returns: the inserted document with _id',\n '',\n 'await spacelr.db.collection(name).insertMany(docs)',\n ' docs: array of objects',\n ' returns: array of inserted documents',\n '',\n 'Collection names: alphanumeric + underscore only, max 128 chars.',\n 'Scoped to the function\\'s project. Requires database rules to be set first.',\n '',\n 'Example — read and write:',\n ' const users = await spacelr.db.collection(\"users\").find({ status: \"active\" }, { limit: 5 });',\n ' console.log(\"Found\", users.length, \"active users\");',\n ' await spacelr.db.collection(\"logs\").insertOne({ action: \"check\", count: users.length, at: new Date().toISOString() });',\n '',\n '═══ STORAGE ═══',\n 'await spacelr.storage.list(options?) → FileInfo[]',\n 'await spacelr.storage.getInfo(fileId) → FileInfo',\n 'await spacelr.storage.getDownloadUrl(fileId) → string',\n 'Scoped to the function\\'s project.',\n '',\n '═══ EMAIL ═══',\n 'await spacelr.email.send({ to, template, variables })',\n ' Sends a template-based email using project templates (MJML + Handlebars).',\n ' template: template name (must exist in the project)',\n ' variables: Record<string, string> of template variables',\n ' Returns: { messageId }',\n 'await spacelr.email.sendRaw({ to, subject, html })',\n ' Sends a raw HTML email directly. Max 500KB HTML.',\n ' Returns: { messageId }',\n 'Rate limit: 100 emails/hour per project (configurable via FUNCTION_EMAIL_HOURLY_LIMIT).',\n '',\n '═══ NOTIFICATIONS ═══',\n 'await spacelr.notifications.send({ userId, title, body, data? })',\n ' Sends a push notification to a specific user in the project.',\n 'await spacelr.notifications.sendMany({ userIds, title, body, data? })',\n ' Sends to multiple users. Deduplicates userIds automatically.',\n 'Rate limit: 500 notifications/hour per project (configurable via FUNCTION_NOTIFICATION_HOURLY_LIMIT). Scoped to the function\\'s project.',\n '',\n '═══ RESOURCE LIMITS ═══',\n 'Execution timeout: 30s default, 120s max',\n 'Memory: 128MB default, 512MB max',\n 'Code bundle: 10MB max (zip)',\n 'Concurrent executions: 10 per project',\n 'CPU time: limited by watchdog (equals timeout)',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { registerDatabasePrompts } from './database';\nimport { registerFunctionPrompts } from './functions';\n\nexport function registerAllPrompts(server: McpServer): void {\n registerDatabasePrompts(server);\n registerFunctionPrompts(server);\n}\n"],"mappings":"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","names":["path","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
1
+ {"version":3,"sources":["../../../../libs/mcp-server/src/index.ts","../../../../libs/mcp-server/src/config.ts","../../../../libs/mcp-server/src/api-client.ts","../../../../libs/mcp-server/src/tools/auth.ts","../../../../libs/mcp-server/src/utils.ts","../../../../libs/mcp-server/src/tools/projects.ts","../../../../libs/mcp-server/src/tools/clients.ts","../../../../libs/mcp-server/src/tools/database.ts","../../../../libs/mcp-server/src/tools/hosting.ts","../../../../libs/mcp-server/src/zip.ts","../../../../libs/mcp-server/src/tools/storage.ts","../../../../libs/mcp-server/src/tools/functions.ts","../../../../libs/mcp-server/src/tools/emailTemplates.ts","../../../../libs/mcp-server/src/tools/cronJobs.ts","../../../../libs/mcp-server/src/tools/webhooks.ts","../../../../libs/mcp-server/src/tools/notifications.ts","../../../../libs/mcp-server/src/tools/auditLogs.ts","../../../../libs/mcp-server/src/tools/index.ts","../../../../libs/mcp-server/src/prompts/database.ts","../../../../libs/mcp-server/src/prompts/functions.ts","../../../../libs/mcp-server/src/prompts/index.ts","../../../../libs/mcp-server/src/resources/getting-started.ts","../../../../libs/mcp-server/src/resources/auth.ts","../../../../libs/mcp-server/src/resources/projects.ts","../../../../libs/mcp-server/src/resources/clients.ts","../../../../libs/mcp-server/src/resources/database.ts","../../../../libs/mcp-server/src/resources/hosting.ts","../../../../libs/mcp-server/src/resources/storage.ts","../../../../libs/mcp-server/src/resources/functions.ts","../../../../libs/mcp-server/src/resources/email-templates.ts","../../../../libs/mcp-server/src/resources/cron-jobs.ts","../../../../libs/mcp-server/src/resources/webhooks.ts","../../../../libs/mcp-server/src/resources/notifications.ts","../../../../libs/mcp-server/src/resources/audit-logs.ts","../../../../libs/mcp-server/src/resources/best-practices.ts","../../../../libs/mcp-server/src/resources/index.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config';\nimport { ApiClient } from './api-client';\nimport { registerAllTools } from './tools';\nimport { registerAllPrompts } from './prompts';\nimport { registerAllResources } from './resources';\n\nasync function main() {\n const config = await loadConfig();\n const api = new ApiClient(config);\n\n const server = new McpServer({\n name: 'spacelr',\n version: '0.1.0',\n });\n\n registerAllTools(server, api);\n registerAllPrompts(server);\n registerAllResources(server);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n const shutdown = async () => {\n console.error('Shutting down MCP server...');\n await server.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n process.on('SIGPIPE', shutdown);\n\n console.error('Spacelr MCP server running on stdio');\n}\n\nmain().catch((error: unknown) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface Config {\n apiBaseUrl: string;\n authToken: string;\n clientId: string | undefined;\n projectId: string | undefined;\n}\n\ninterface StoredCredentials {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n apiUrl: string;\n}\n\ninterface TokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n}\n\ntype CredentialsScope = 'project' | 'global';\n\ninterface CredentialsLocation {\n path: string;\n scope: CredentialsScope;\n projectDir?: string;\n}\n\nconst REFRESH_TIMEOUT_MS = 10_000;\nconst SPACELR_CONFIG_FILENAME = 'spacelr.json';\n\nfunction getGlobalCredentialsFile(): string {\n const home =\n process.env['HOME'] ?? process.env['USERPROFILE'] ?? os.homedir();\n return path.join(home, '.spacelr', 'credentials.json');\n}\n\n/**\n * Walk up from cwd looking for `spacelr.json`. Mirrors the pattern used by\n * `@spacelr/cli`'s `findConfigPath`. Inlined here to avoid a cross-package\n * dependency — both packages publish independently.\n */\nfunction findSpacelrConfigPath(startDir?: string): string | null {\n let dir = startDir ?? process.cwd();\n while (true) {\n const candidate = path.join(dir, SPACELR_CONFIG_FILENAME);\n if (fs.existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\n/**\n * Resolve the primary credentials location. Walks up from cwd to find\n * `spacelr.json`; if found, credentials are project-scoped at\n * `<projectDir>/.spacelr/credentials.json`. Otherwise falls back to\n * `~/.spacelr/credentials.json` (global scope).\n */\nfunction resolveCredentialsFile(): CredentialsLocation {\n const configPath = findSpacelrConfigPath();\n if (configPath) {\n const projectDir = path.dirname(configPath);\n return {\n path: path.join(projectDir, '.spacelr', 'credentials.json'),\n scope: 'project',\n projectDir,\n };\n }\n return { path: getGlobalCredentialsFile(), scope: 'global' };\n}\n\n/**\n * Ensure the project's `.gitignore` excludes `.spacelr/` so credentials\n * never reach git. Called before every project-scoped credential write.\n *\n * shared-with: libs/cli/src/lib/auth.ts (intentional duplication — the two\n * packages publish independently and must not depend on each other)\n */\nfunction ensureGitignored(projectDir: string): { safe: boolean } {\n const gitignorePath = path.join(projectDir, '.gitignore');\n const entry = '.spacelr/';\n\n const matchesExisting = (line: string): boolean => {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return false;\n return (\n trimmed === '.spacelr' ||\n trimmed === '.spacelr/' ||\n trimmed === '.spacelr/*' ||\n trimmed === '.spacelr/**' ||\n trimmed === '.spacelr/credentials.json' ||\n // Leading-slash forms anchor the pattern to the repo root\n trimmed === '/.spacelr' ||\n trimmed === '/.spacelr/' ||\n trimmed === '/.spacelr/*' ||\n trimmed === '/.spacelr/**' ||\n trimmed === '/.spacelr/credentials.json'\n );\n };\n\n // Heuristic: any line starting with `!` that mentions `.spacelr` could\n // un-ignore credentials. We deliberately use a permissive prefix check\n // (instead of exact-string matching) because gitignore supports many\n // pattern variants — `!.spacelr*`, `!.spacelr/**/*.json`, `!/.spacelr/**`,\n // etc. — and an exhaustive list would inevitably miss something. False\n // positives here just refuse the write (safe default); false negatives\n // would silently leave credentials trackable.\n const hasNegation = (line: string): boolean => {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return false;\n return trimmed.startsWith('!') && trimmed.includes('.spacelr');\n };\n\n let content = '';\n let existed = false;\n try {\n content = fs.readFileSync(gitignorePath, 'utf-8');\n existed = true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') return { safe: true };\n }\n\n const lines = content.split(/\\r?\\n/);\n // Check for negation FIRST. A negation anywhere in the file un-ignores\n // credentials regardless of whether a positive match exists earlier:\n // git evaluates rules in order and the LAST matching rule wins, so\n // `.spacelr/` followed by `!.spacelr/credentials.json` still tracks\n // credentials. Returning early on a positive match would miss this.\n if (lines.some(hasNegation)) {\n const alreadyHasMatch = lines.some(matchesExisting);\n console.error(\n alreadyHasMatch\n ? '.gitignore already contains .spacelr/ but ALSO contains a ' +\n 'negation pattern that un-ignores credentials. Remove the ' +\n 'negation or store credentials globally.'\n : '.gitignore contains a negation pattern for .spacelr/ — ' +\n 'refusing to write credentials safety entry. Remove the ' +\n 'negation or store credentials globally.',\n );\n return { safe: false };\n }\n if (lines.some(matchesExisting)) return { safe: true };\n\n const needsLeadingNewline = existed && content.length > 0 && !content.endsWith('\\n');\n const newContent =\n (existed ? content : '') +\n (needsLeadingNewline ? '\\n' : '') +\n entry +\n '\\n';\n\n try {\n // Atomic write so a crash mid-write cannot truncate .gitignore and\n // silently drop the .spacelr/ entry.\n writeFileAtomic(gitignorePath, newContent, 0o644);\n console.error(`Added ${entry} to .gitignore (credentials must never be committed)`);\n return { safe: true };\n } catch {\n // Best-effort — do not fail the refresh if .gitignore is read-only\n return { safe: true };\n }\n}\n\nfunction readCredentialsFromDisk(filePath: string): StoredCredentials | null {\n try {\n // No existsSync guard — would race with concurrent unlink. The catch\n // below covers ENOENT, JSON parse errors, and read failures uniformly.\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n if (typeof parsed !== 'object' || parsed === null) return null;\n const obj = parsed as Record<string, unknown>;\n if (\n typeof obj['accessToken'] !== 'string' ||\n obj['accessToken'].length === 0 ||\n !Number.isFinite(obj['expiresAt']) ||\n typeof obj['apiUrl'] !== 'string' ||\n obj['apiUrl'].length === 0\n ) {\n return null;\n }\n // refreshToken is optional, but if present must be a string —\n // otherwise we'd serialize a non-string into the refresh request body.\n if ('refreshToken' in obj && typeof obj['refreshToken'] !== 'string') {\n return null;\n }\n return parsed as StoredCredentials;\n } catch {\n return null;\n }\n}\n\n/**\n * Read credentials from the resolved location with a legacy fallback:\n * if the project-scoped lookup finds nothing, also try the global file.\n */\nfunction readStoredCredentials(): StoredCredentials | null {\n return readStoredCredentialsWithLocation()?.credentials ?? null;\n}\n\n/**\n * Same as `readStoredCredentials` but also returns the location the\n * credentials were read from. Refresh uses this to write back to the\n * same file (preventing scope mismatch with legacy global credentials\n * being refreshed inside a project).\n */\nfunction readStoredCredentialsWithLocation(): {\n credentials: StoredCredentials;\n location: CredentialsLocation;\n} | null {\n const primary = resolveCredentialsFile();\n const fromPrimary = readCredentialsFromDisk(primary.path);\n if (fromPrimary) return { credentials: fromPrimary, location: primary };\n\n if (primary.scope === 'project') {\n const globalPath = getGlobalCredentialsFile();\n const fromGlobal = readCredentialsFromDisk(globalPath);\n if (fromGlobal) {\n return {\n credentials: fromGlobal,\n location: { path: globalPath, scope: 'global' },\n };\n }\n }\n return null;\n}\n\n/**\n * Atomic write: write to a temp file and rename. Rename is atomic on POSIX\n * and Windows so concurrent readers never see a partial file.\n *\n * shared-with: libs/cli/src/lib/auth.ts\n */\nfunction writeFileAtomic(filePath: string, data: string, mode: number): void {\n const tmpPath = `${filePath}.tmp.${process.pid}.${crypto.randomBytes(6).toString('hex')}`;\n try {\n fs.writeFileSync(tmpPath, data, { mode });\n fs.renameSync(tmpPath, filePath);\n } catch (err) {\n try {\n fs.unlinkSync(tmpPath);\n } catch {\n /* ignore */\n }\n throw err;\n }\n}\n\nfunction storeCredentials(\n credentials: StoredCredentials,\n // REQUIRED — never resolve from cwd inside this function. Letting it\n // default to resolveCredentialsFile() would silently reintroduce the\n // scope-mismatch bug this PR fixes (legacy global creds read inside a\n // project would write back to the project file).\n location: CredentialsLocation,\n): void {\n // Safety: ensure .spacelr/ is gitignored before writing to a project.\n // If a negation pattern is detected, refuse to write — the credential\n // file would otherwise land in a .gitignore-trackable location.\n if (location.scope === 'project' && location.projectDir) {\n const { safe } = ensureGitignored(location.projectDir);\n if (!safe) {\n throw new Error(\n 'Refusing to write project-local credentials: .gitignore contains ' +\n 'a negation pattern that would un-ignore .spacelr/.',\n );\n }\n }\n\n // mkdirSync with recursive:true is idempotent and does not throw if the\n // directory already exists, so no existsSync guard needed.\n const dir = path.dirname(location.path);\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n // mode: on mkdirSync only applies when the directory is created. If the\n // user pre-created .spacelr/ with wider permissions (e.g. 0o755), enforce\n // 0o700 here so other local users cannot enumerate credential filenames.\n // Best-effort — chmod can fail on Windows / non-owned dirs, in which case\n // we leave the existing mode rather than failing the credential write.\n try {\n fs.chmodSync(dir, 0o700);\n } catch {\n /* ignore */\n }\n\n writeFileAtomic(location.path, JSON.stringify(credentials, null, 2), 0o600);\n}\n\nfunction isTokenStillValid(credentials: StoredCredentials): boolean {\n return Date.now() < credentials.expiresAt - 60_000;\n}\n\nasync function refreshToken(\n credentials: StoredCredentials,\n sourceLocation: CredentialsLocation,\n): Promise<string | null> {\n // apiUrl is already validated by readCredentialsFromDisk; only need to\n // guard against missing refresh token here.\n if (!credentials.refreshToken) return null;\n\n // Validate scheme — a credentials file with apiUrl: \"file:///etc/passwd\"\n // (manually edited or written by a compromised process) would otherwise\n // produce an opaque fetch error. Only http(s) is accepted.\n try {\n const parsed = new URL(credentials.apiUrl);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n console.error(\n `Refusing to refresh against non-http(s) URL: ${parsed.protocol}`,\n );\n return null;\n }\n } catch {\n console.error('Refusing to refresh: stored apiUrl is not a valid URL');\n return null;\n }\n\n const apiUrl = credentials.apiUrl.replace(/\\/+$/, '');\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REFRESH_TIMEOUT_MS);\n\n try {\n console.error('Refreshing access token...');\n const response = await fetch(`${apiUrl}/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken: credentials.refreshToken }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n console.error(`Token refresh failed (HTTP ${response.status})`);\n // Concurrent-refresh fallback: another process may have already rotated\n // the token. Re-read the SAME file (sourceLocation) — not via cwd —\n // so we don't accidentally pick up a different scope's credentials.\n if (response.status === 401) {\n const fresh = readCredentialsFromDisk(sourceLocation.path);\n if (\n fresh &&\n (fresh.accessToken !== credentials.accessToken ||\n fresh.refreshToken !== credentials.refreshToken) &&\n isTokenStillValid(fresh)\n ) {\n console.error('Using credentials refreshed by concurrent process');\n return fresh.accessToken;\n }\n }\n return null;\n }\n\n const data = (await response.json()) as TokenResponse;\n if (typeof data.access_token !== 'string') {\n console.error('Token refresh returned unexpected response shape');\n return null;\n }\n // Validate expires_in: must be a positive finite number. A bogus value\n // (0, negative, NaN from a string, etc.) would either trigger an\n // immediate refresh loop or set expiresAt to NaN.\n const expiresInRaw = data.expires_in;\n const expiresIn =\n typeof expiresInRaw === 'number' &&\n Number.isFinite(expiresInRaw) &&\n expiresInRaw > 0\n ? expiresInRaw\n : 3600;\n const updated: StoredCredentials = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token ?? credentials.refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n apiUrl: credentials.apiUrl,\n };\n // Write back to the exact location the credentials came from to\n // prevent scope mismatch (e.g. global legacy creds read inside a project\n // must refresh back to global, not leak into the project file).\n storeCredentials(updated, sourceLocation);\n console.error('Token refreshed successfully');\n return data.access_token;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n console.error('Token refresh timed out');\n } else {\n console.error('Token refresh error');\n }\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function resolveAuthToken(forceRefresh = false): Promise<string | null> {\n // 1. Environment variable takes priority (CI/automation)\n const envToken = process.env['SPACELR_AUTH_TOKEN'];\n if (envToken) return envToken;\n\n // 2. Read from credentials file (project-local or global)\n const loaded = readStoredCredentialsWithLocation();\n if (!loaded) return null;\n\n return resolveAuthTokenFromLoaded(loaded, forceRefresh);\n}\n\nasync function resolveAuthTokenFromLoaded(\n loaded: { credentials: StoredCredentials; location: CredentialsLocation },\n forceRefresh: boolean,\n): Promise<string | null> {\n const { credentials, location } = loaded;\n // Check if token is still valid (60s buffer is encapsulated in\n // isTokenStillValid) — skip when forced.\n if (!forceRefresh && isTokenStillValid(credentials)) {\n return credentials.accessToken;\n }\n\n // Try to refresh expired (or force-refreshed) token — write back to\n // the same location we read from, not wherever cwd currently resolves to\n return refreshToken(credentials, location);\n}\n\nfunction warnIfInsecureUrl(url: string): void {\n // 0.0.0.0 is NOT a loopback — it binds all interfaces. A client request\n // to http://0.0.0.0/... exposes credentials to anything reachable on the\n // network, so we deliberately exclude it from the safe list.\n // IPv6 loopback is matched both as `[::1]` (URL-bracketed form, the\n // canonical form Node.js URL parsing produces) and bare `::1` for input\n // robustness.\n if (\n url.startsWith('http://') &&\n !url.includes('localhost') &&\n !/^http:\\/\\/(127\\.|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[01])\\.|(\\[::1\\])|::1)(\\/|:|$)/.test(url)\n ) {\n console.error(`Warning: API URL uses plain HTTP (${url}). Credentials will be transmitted unencrypted.`);\n }\n}\n\nfunction resolveApiUrl(credentials: StoredCredentials | null): string {\n const envUrl = process.env['SPACELR_API_URL'];\n if (envUrl) {\n try {\n const parsed = new URL(envUrl);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`Unsupported protocol: ${parsed.protocol}`);\n }\n } catch (err) {\n throw new Error(`Invalid SPACELR_API_URL: ${envUrl} — ${err instanceof Error ? err.message : String(err)}`);\n }\n const resolved = envUrl.replace(/\\/+$/, '');\n warnIfInsecureUrl(resolved);\n return resolved;\n }\n\n // Derive admin API URL from stored credentials apiUrl\n // CLI stores the public gateway URL (e.g. https://api.spacelr.com/api/v1)\n // In production, admin gateway runs on a separate host (api-console.spacelr.com)\n // In local dev, admin gateway runs on a separate port (localhost:3003)\n if (credentials?.apiUrl) {\n const base = credentials.apiUrl.replace(/\\/+$/, '');\n // Already an admin URL\n if (base.includes('/api/v1/admin')) return base;\n // Local dev: derive admin port from public gateway\n if (base.includes('localhost') || base.includes('127.0.0.1') || base.includes('[::1]')) {\n return 'http://localhost:3003/api/v1/admin';\n }\n // Production: cannot safely derive admin host from public host\n throw new Error(\n `SPACELR_API_URL is required for production. The CLI credentials point to ${base} (public gateway), ` +\n 'but the admin gateway runs on a separate host. ' +\n 'Set SPACELR_API_URL to the admin gateway URL (e.g. https://api-console.spacelr.com/api/v1/admin).',\n );\n }\n\n const defaultUrl = 'http://localhost:3003/api/v1/admin';\n console.error(`Warning: No API URL configured, using default: ${defaultUrl}`);\n return defaultUrl;\n}\n\n/**\n * Returns the admin API base URL, or `null` if it cannot be derived.\n *\n * Callers MUST null-check the return value — using a `null` result in a\n * URL string would silently produce broken requests like `null/api/v1/...`.\n * The error reason is logged to stderr before returning null.\n */\nexport function resolveApiBaseUrl(): string | null {\n try {\n const credentials = readStoredCredentials();\n return resolveApiUrl(credentials);\n } catch (err) {\n // Log so callers (and operators) can see *why* we couldn't derive the\n // admin URL — silent null leads to less helpful errors downstream.\n console.error(\n `Failed to resolve admin API URL: ${err instanceof Error ? err.message : String(err)}`,\n );\n return null;\n }\n}\n\nexport async function loadConfig(): Promise<Config> {\n // Single read of the credentials file — share between authToken refresh\n // and apiBaseUrl resolution so they cannot disagree under concurrent\n // refreshes from another process.\n const envToken = process.env['SPACELR_AUTH_TOKEN'];\n const loaded = readStoredCredentialsWithLocation();\n const authToken = envToken ?? (loaded ? await resolveAuthTokenFromLoaded(loaded, false) : null);\n\n if (!authToken) {\n throw new Error(\n 'No auth token found. Either set SPACELR_AUTH_TOKEN or run \"spacelr login\" first.',\n );\n }\n\n return {\n apiBaseUrl: resolveApiUrl(loaded?.credentials ?? null),\n authToken,\n clientId: process.env['SPACELR_CLIENT_ID'],\n projectId: process.env['SPACELR_PROJECT_ID'],\n };\n}\n","import { Config, resolveAuthToken, resolveApiBaseUrl } from './config';\n\ninterface RequestOptions {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n}\n\ntype HttpMethod = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n\nconst REQUEST_TIMEOUT_MS = 30_000;\nconst UPLOAD_TIMEOUT_MS = 120_000;\n\nexport class ApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n responseBody: string,\n ) {\n const truncated =\n responseBody.length > 500\n ? responseBody.slice(0, 500) + '...'\n : responseBody;\n super(`HTTP ${status} ${statusText}: ${truncated}`);\n this.name = 'ApiError';\n }\n}\n\nexport class ApiClient {\n private baseUrl: string;\n private readonly headers: Record<string, string>;\n private refreshPromise: Promise<string | null> | null = null;\n\n constructor(config: Config) {\n this.baseUrl = config.apiBaseUrl;\n this.headers = {\n Authorization: `Bearer ${config.authToken}`,\n };\n if (config.clientId) {\n this.headers['x-client-id'] = config.clientId;\n }\n if (config.projectId) {\n this.headers['x-project-id'] = config.projectId;\n }\n }\n\n async get(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('GET', path, opts);\n }\n\n async post(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('POST', path, opts);\n }\n\n async patch(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('PATCH', path, opts);\n }\n\n async put(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('PUT', path, opts);\n }\n\n async delete(path: string, opts?: RequestOptions): Promise<unknown> {\n return this.requestWithRetry('DELETE', path, opts);\n }\n\n /**\n * Upload a file as multipart/form-data.\n * Includes the same 401-retry logic as regular requests.\n *\n * @param path - API path (e.g. `/projects/:id/functions/:id/deploy`)\n * @param buffer - Raw file content\n * @param filename - Name sent in the Content-Disposition header (e.g. \"bundle.zip\")\n */\n async uploadFile(\n path: string,\n buffer: Buffer,\n filename: string,\n ): Promise<unknown> {\n try {\n return await this.sendMultipart(path, buffer, filename);\n } catch (error) {\n if (error instanceof ApiError && error.status === 401) {\n const currentToken = this.headers['Authorization'];\n let newToken = await this.refreshAuthToken();\n const newBaseUrl = resolveApiBaseUrl();\n if (newBaseUrl && newBaseUrl !== this.baseUrl) {\n this.baseUrl = newBaseUrl;\n }\n if (newToken && `Bearer ${newToken}` === currentToken) {\n newToken = await resolveAuthToken(true);\n }\n if (newToken && `Bearer ${newToken}` !== currentToken) {\n this.headers['Authorization'] = `Bearer ${newToken}`;\n return this.sendMultipart(path, buffer, filename);\n }\n }\n throw error;\n }\n }\n\n private async sendMultipart(\n path: string,\n buffer: Buffer,\n filename: string,\n ): Promise<unknown> {\n const boundary = `----MCP${Date.now()}${Math.random().toString(36).slice(2)}`;\n\n const header = Buffer.from(\n `--${boundary}\\r\\n` +\n `Content-Disposition: form-data; name=\"file\"; filename=\"${filename}\"\\r\\n` +\n `Content-Type: application/zip\\r\\n\\r\\n`,\n );\n const footer = Buffer.from(`\\r\\n--${boundary}--\\r\\n`);\n const body = Buffer.concat([header, buffer, footer]);\n\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), UPLOAD_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...this.headers,\n 'Content-Type': `multipart/form-data; boundary=${boundary}`,\n 'Content-Length': String(body.length),\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new ApiError(response.status, response.statusText, text);\n }\n\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async refreshAuthToken(force = false): Promise<string | null> {\n if (!this.refreshPromise) {\n this.refreshPromise = resolveAuthToken(force).finally(() => {\n this.refreshPromise = null;\n });\n }\n return this.refreshPromise;\n }\n\n private async requestWithRetry(\n method: HttpMethod,\n path: string,\n opts?: RequestOptions,\n ): Promise<unknown> {\n try {\n return await this.request(method, path, opts);\n } catch (error) {\n if (error instanceof ApiError && error.status === 401) {\n const currentToken = this.headers['Authorization'];\n // First try: read credentials file (token may have changed via re-login)\n let newToken = await this.refreshAuthToken();\n const newBaseUrl = resolveApiBaseUrl();\n if (newBaseUrl && newBaseUrl !== this.baseUrl) {\n this.baseUrl = newBaseUrl;\n }\n // If file token is the same, force a refresh via the refresh-token endpoint\n if (newToken && `Bearer ${newToken}` === currentToken) {\n newToken = await resolveAuthToken(true);\n }\n if (newToken && `Bearer ${newToken}` !== currentToken) {\n this.headers['Authorization'] = `Bearer ${newToken}`;\n return this.request(method, path, opts);\n }\n }\n throw error;\n }\n }\n\n private async request(\n method: HttpMethod,\n path: string,\n opts?: RequestOptions,\n ): Promise<unknown> {\n let url = `${this.baseUrl}${path}`;\n\n if (opts?.params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(opts.params)) {\n if (value !== undefined) {\n searchParams.set(key, String(value));\n }\n }\n const qs = searchParams.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n try {\n const headers: Record<string, string> = { ...this.headers };\n if (opts?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new ApiError(response.status, response.statusText, text);\n }\n\n if (!text) {\n return undefined;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { redactTokens } from '../utils';\n\nexport function registerAuthTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'auth_login',\n {\n description: 'Authenticate with email and password. WARNING: The password will be visible in the conversation context. Token values are redacted in the response.',\n inputSchema: {\n email: z.string().email(),\n password: z.string().min(1),\n },\n },\n async ({ email, password }) => {\n try {\n const result = await api.post('/auth/login', {\n body: { email, password },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactTokens(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Login failed: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'auth_me',\n {\n description: 'Get the currently authenticated user profile',\n },\n async () => {\n try {\n const result = await api.get('/auth/me');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactTokens(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get profile: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'auth_update_profile',\n {\n description: 'Update the currently authenticated user profile',\n inputSchema: {\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n displayName: z.string().optional(),\n },\n },\n async ({ firstName, lastName, displayName }) => {\n try {\n const body: Record<string, string> = {};\n if (firstName !== undefined) body.firstName = firstName;\n if (lastName !== undefined) body.lastName = lastName;\n if (displayName !== undefined) body.displayName = displayName;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch('/auth/me', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactTokens(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Profile update failed: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","const TOKEN_KEYS = new Set([\n 'access_token', 'refresh_token', 'id_token',\n 'accessToken', 'refreshToken', 'idToken',\n]);\n\n/**\n * Recursively redact token fields from API responses.\n * Handles both snake_case and camelCase token field names.\n */\nexport function redactTokens(data: unknown): unknown {\n if (typeof data !== 'object' || data === null) return data;\n if (Array.isArray(data)) return data.map(redactTokens);\n const record = data as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n if (TOKEN_KEYS.has(key)) {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = redactTokens(value);\n }\n }\n return redacted;\n}\n\n/**\n * Recursively redact secret fields from API responses.\n * Replaces clientSecret and secret values with '[REDACTED]'.\n */\nexport function redactSecrets(data: unknown): unknown {\n if (typeof data !== 'object' || data === null) return data;\n if (Array.isArray(data)) return data.map(redactSecrets);\n const record = data as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n if (key === 'clientSecret' || key === 'secret') {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = redactSecrets(value);\n }\n }\n return redacted;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerProjectTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'projects_list',\n {\n description: 'List all projects, optionally filtered by role',\n inputSchema: {\n role: z.string().optional(),\n },\n },\n async ({ role }) => {\n try {\n const result = await api.get('/projects', {\n params: { role },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list projects: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_get',\n {\n description: 'Get a project by its ID',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_get_by_slug',\n {\n description: 'Get a project by its slug',\n inputSchema: {\n slug: z.string(),\n },\n },\n async ({ slug }) => {\n try {\n const result = await api.get(`/projects/slug/${encodeURIComponent(slug)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get project by slug: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_create',\n {\n description: 'Create a new project',\n inputSchema: {\n name: z.string(),\n slug: z.string(),\n description: z.string().optional(),\n logoUrl: z.string().url().optional(),\n websiteUrl: z.string().url().optional(),\n },\n },\n async ({ name, slug, description, logoUrl, websiteUrl }) => {\n try {\n const body: Record<string, string> = { name, slug };\n if (description !== undefined) body.description = description;\n if (logoUrl !== undefined) body.logoUrl = logoUrl;\n if (websiteUrl !== undefined) body.websiteUrl = websiteUrl;\n\n const result = await api.post('/projects', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_update',\n {\n description: 'Update an existing project',\n inputSchema: {\n projectId: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n logoUrl: z.string().url().optional(),\n websiteUrl: z.string().url().optional(),\n },\n },\n async ({ projectId, name, description, logoUrl, websiteUrl }) => {\n try {\n const body: Record<string, string> = {};\n if (name !== undefined) body.name = name;\n if (description !== undefined) body.description = description;\n if (logoUrl !== undefined) body.logoUrl = logoUrl;\n if (websiteUrl !== undefined) body.websiteUrl = websiteUrl;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_delete',\n {\n description: 'Delete a project by its ID',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Project deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete project: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_list',\n {\n description: 'List members of a project with optional pagination',\n inputSchema: {\n projectId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/members`, {\n params: { limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list members: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_add',\n {\n description: 'Add a member to a project by email with a specified role',\n inputSchema: {\n projectId: z.string(),\n email: z.string().email(),\n role: z.enum(['owner', 'admin', 'developer', 'member', 'viewer']),\n permissions: z.array(z.string()).optional(),\n },\n },\n async ({ projectId, email, role, permissions }) => {\n try {\n const body: Record<string, unknown> = { email, role };\n if (permissions !== undefined) body.permissions = permissions;\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/members`, {\n body,\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to add member: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_update',\n {\n description: 'Update a project member\\'s role, permissions, or console access',\n inputSchema: {\n projectId: z.string(),\n memberId: z.string(),\n role: z.enum(['owner', 'admin', 'developer', 'member', 'viewer']).optional(),\n permissions: z.array(z.string()).optional(),\n grantConsoleAccess: z.boolean().optional(),\n },\n },\n async ({ projectId, memberId, role, permissions, grantConsoleAccess }) => {\n try {\n const body: Record<string, unknown> = {};\n if (role !== undefined) body.role = role;\n if (permissions !== undefined) body.permissions = permissions;\n if (grantConsoleAccess !== undefined) body.grantConsoleAccess = grantConsoleAccess;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/members/${encodeURIComponent(memberId)}`, {\n body,\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update member: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_members_remove',\n {\n description: 'Remove a member from a project',\n inputSchema: {\n projectId: z.string(),\n memberId: z.string(),\n },\n },\n async ({ projectId, memberId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/members/${encodeURIComponent(memberId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Member removed', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to remove member: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_users_create',\n {\n description: 'Create a new user within a project. WARNING: The password will be visible in the conversation context.',\n inputSchema: {\n projectId: z.string(),\n username: z.string(),\n email: z.string().email(),\n password: z.string().min(1),\n role: z.enum(['owner', 'admin', 'developer', 'member', 'viewer']),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n displayName: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n grantConsoleAccess: z.boolean().optional(),\n },\n },\n async ({ projectId, username, email, password, role, firstName, lastName, displayName, permissions, grantConsoleAccess }) => {\n try {\n const body: Record<string, unknown> = { username, email, password, role };\n if (firstName !== undefined) body.firstName = firstName;\n if (lastName !== undefined) body.lastName = lastName;\n if (displayName !== undefined) body.displayName = displayName;\n if (permissions !== undefined) body.permissions = permissions;\n if (grantConsoleAccess !== undefined) body.grantConsoleAccess = grantConsoleAccess;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/users`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create user: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'projects_role',\n {\n description: 'Get the current user\\'s role in a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/role`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get role: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { redactSecrets } from '../utils';\n\nexport function registerClientTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'clients_list',\n {\n description: 'List all OAuth clients for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/clients/project/${encodeURIComponent(projectId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list clients: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_get',\n {\n description: 'Get details of a specific OAuth client',\n inputSchema: {\n clientId: z.string(),\n },\n },\n async ({ clientId }) => {\n try {\n const result = await api.get(`/clients/${encodeURIComponent(clientId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_create',\n {\n description: 'Create a new OAuth client for a project',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n grantTypes: z.array(z.string()),\n redirectUris: z.array(z.string().url()).optional(),\n scopes: z.array(z.string()).optional(),\n isConfidential: z.boolean().optional(),\n corsOrigins: z.array(z.string()).optional(),\n accessTokenTtl: z.number().optional(),\n },\n },\n async ({ projectId, name, grantTypes, redirectUris, scopes, isConfidential, corsOrigins, accessTokenTtl }) => {\n try {\n const body: Record<string, unknown> = { projectId, name, grantTypes };\n if (redirectUris !== undefined) body.redirectUris = redirectUris;\n if (scopes !== undefined) body.scopes = scopes;\n if (isConfidential !== undefined) body.isConfidential = isConfidential;\n if (corsOrigins !== undefined) body.corsOrigins = corsOrigins;\n if (accessTokenTtl !== undefined) body.accessTokenTtl = accessTokenTtl;\n\n const result = await api.post('/clients', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_update',\n {\n description: 'Update an existing OAuth client',\n inputSchema: {\n clientId: z.string(),\n name: z.string().optional(),\n redirectUris: z.array(z.string().url()).optional(),\n scopes: z.array(z.string()).optional(),\n grantTypes: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n corsOrigins: z.array(z.string()).optional(),\n accessTokenTtl: z.number().optional(),\n },\n },\n async ({ clientId, name, redirectUris, scopes, grantTypes, isActive, corsOrigins, accessTokenTtl }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (redirectUris !== undefined) body.redirectUris = redirectUris;\n if (scopes !== undefined) body.scopes = scopes;\n if (grantTypes !== undefined) body.grantTypes = grantTypes;\n if (isActive !== undefined) body.isActive = isActive;\n if (corsOrigins !== undefined) body.corsOrigins = corsOrigins;\n if (accessTokenTtl !== undefined) body.accessTokenTtl = accessTokenTtl;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/clients/${encodeURIComponent(clientId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(redactSecrets(result), null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'clients_delete',\n {\n description: 'Delete an OAuth client',\n inputSchema: {\n clientId: z.string(),\n },\n },\n async ({ clientId }) => {\n try {\n const result = await api.delete(`/clients/${encodeURIComponent(clientId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Client deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete client: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // Intentionally NOT redacted — the new secret can only be retrieved once.\n // Other clients_* tools use redactSecrets() to hide stored secrets.\n server.registerTool(\n 'clients_regenerate_secret',\n {\n description: 'Regenerate the secret for an OAuth client. WARNING: The new secret will be visible in the conversation context. This is the only time the secret can be retrieved.',\n inputSchema: {\n clientId: z.string(),\n },\n },\n async ({ clientId }) => {\n try {\n const result = await api.post(`/clients/${encodeURIComponent(clientId)}/regenerate-secret`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to regenerate client secret: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerDatabaseTools(server: McpServer, api: ApiClient): void {\n // --- Collections ---\n\n server.registerTool(\n 'database_collections_list',\n {\n description: 'List all collections in a project database',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/collections`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list collections: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_collections_create',\n {\n description: 'Create a new collection in a project database',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n description: z.string().optional(),\n },\n },\n async ({ projectId, name, description }) => {\n try {\n const body: Record<string, unknown> = { name };\n if (description !== undefined) body.description = description;\n\n const result = await api.post(`/databases/${encodeURIComponent(projectId)}/collections`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create collection: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_collections_delete',\n {\n description: 'Delete a collection from a project database',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n },\n },\n async ({ projectId, name }) => {\n try {\n const result = await api.delete(`/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(name)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Collection deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete collection: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Security Rules ---\n\n server.registerTool(\n 'database_rules_get',\n {\n description: 'Get the security rules for a project database',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/rules`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_rules_set',\n {\n description: 'Set security rules for a project database',\n inputSchema: {\n projectId: z.string(),\n rules: z.record(z.string(), z.unknown()),\n expectedVersion: z.number().optional(),\n },\n },\n async ({ projectId, rules, expectedVersion }) => {\n try {\n const body: Record<string, unknown> = { rules };\n if (expectedVersion !== undefined) body.expectedVersion = expectedVersion;\n\n const result = await api.put(`/databases/${encodeURIComponent(projectId)}/rules`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_rules_validate',\n {\n description: 'Validate security rules without applying them',\n inputSchema: {\n projectId: z.string(),\n rules: z.record(z.string(), z.unknown()),\n },\n },\n async ({ projectId, rules }) => {\n try {\n const result = await api.post(`/databases/${encodeURIComponent(projectId)}/rules/validate`, {\n body: { rules },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to validate rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Index Rules ---\n\n server.registerTool(\n 'database_index_rules_get',\n {\n description: 'Get the index rules for a project database',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/index-rules`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get index rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_index_rules_sync',\n {\n description: 'Sync index rules for a project database',\n inputSchema: {\n projectId: z.string(),\n indexRules: z.record(z.string(), z.unknown()),\n },\n },\n async ({ projectId, indexRules }) => {\n try {\n const result = await api.put(`/databases/${encodeURIComponent(projectId)}/index-rules`, {\n body: { indexRules },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to sync index rules: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Indexes ---\n\n server.registerTool(\n 'database_indexes_list',\n {\n description: 'List all indexes for a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n },\n },\n async ({ projectId, collectionName }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/indexes`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list indexes: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_indexes_create',\n {\n description: 'Create a new index on a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n fields: z.record(z.string(), z.union([z.literal(1), z.literal(-1), z.literal('text')])),\n unique: z.boolean().optional(),\n sparse: z.boolean().optional(),\n ttlSeconds: z.number().optional(),\n },\n },\n async ({ projectId, collectionName, fields, unique, sparse, ttlSeconds }) => {\n try {\n const body: Record<string, unknown> = { fields };\n if (unique !== undefined) body.unique = unique;\n if (sparse !== undefined) body.sparse = sparse;\n if (ttlSeconds !== undefined) body.ttlSeconds = ttlSeconds;\n\n const result = await api.post(`/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/indexes`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create index: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_indexes_delete',\n {\n description: 'Delete an index from a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n indexName: z.string(),\n },\n },\n async ({ projectId, collectionName, indexName }) => {\n try {\n const result = await api.delete(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/indexes/${encodeURIComponent(indexName)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Index deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete index: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Documents ---\n\n server.registerTool(\n 'database_documents_find',\n {\n description: 'Query documents in a collection with optional filter, sort, field projection, limit (max 100), and offset',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n filter: z.record(z.string(), z.unknown()).optional(),\n sort: z.record(z.string(), z.union([z.literal(1), z.literal(-1)])).optional(),\n fields: z.array(z.string()).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, collectionName, filter, sort, fields, limit, offset }) => {\n try {\n const params: Record<string, string | number | boolean | undefined> = {};\n if (filter !== undefined) params.filter = JSON.stringify(filter);\n if (sort !== undefined) params.sort = JSON.stringify(sort);\n if (fields !== undefined) params.fields = JSON.stringify(fields);\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n\n const result = await api.get(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents`,\n { params },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to find documents: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_documents_insert',\n {\n description: 'Insert one or more documents into a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n documents: z.array(z.record(z.string(), z.unknown())).min(1).max(500),\n },\n },\n async ({ projectId, collectionName, documents }) => {\n try {\n const result = await api.post(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents`,\n { body: { documents } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to insert documents: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_documents_update',\n {\n description: 'Update a specific document in a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n docId: z.string(),\n update: z.record(z.string(), z.unknown()),\n },\n },\n async ({ projectId, collectionName, docId, update }) => {\n try {\n const result = await api.patch(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents/${encodeURIComponent(docId)}`,\n { body: { update } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update document: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'database_documents_delete',\n {\n description: 'Delete a specific document from a collection',\n inputSchema: {\n projectId: z.string(),\n collectionName: z.string(),\n docId: z.string(),\n },\n },\n async ({ projectId, collectionName, docId }) => {\n try {\n const result = await api.delete(\n `/databases/${encodeURIComponent(projectId)}/collections/${encodeURIComponent(collectionName)}/documents/${encodeURIComponent(docId)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Document deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete document: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Stats ---\n\n server.registerTool(\n 'database_stats',\n {\n description: 'Get database statistics for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/databases/${encodeURIComponent(projectId)}/stats`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get database stats: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { ZipBuilder } from '../zip';\n\nexport function registerHostingTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'hosting_deployments_list',\n {\n description: 'List deployments for a hosting project',\n inputSchema: {\n projectId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, limit, offset }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/deployments`, {\n params: { limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list deployments: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_get',\n {\n description: 'Get details of a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // Note: create and activate use /hosting/deployments (flat route) — intentional,\n // matches the admin gateway controller which scopes these by projectId in the body.\n server.registerTool(\n 'hosting_deployments_create',\n {\n description: 'Create a new deployment for a hosting project',\n inputSchema: {\n projectId: z.string(),\n description: z.string().optional(),\n framework: z.string().optional(),\n },\n },\n async ({ projectId, description, framework }) => {\n try {\n const body: Record<string, unknown> = { projectId };\n if (description !== undefined) body.description = description;\n if (framework !== undefined) body.framework = framework;\n\n const result = await api.post('/hosting/deployments', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_upload',\n {\n description:\n 'Upload files to an existing hosting deployment. Accepts a record of ' +\n 'filename → content, bundles them into a ZIP archive, and uploads it.\\n\\n' +\n 'Typical workflow:\\n' +\n ' 1. hosting_deployments_create → get deploymentId\\n' +\n ' 2. hosting_deployments_upload → upload site files\\n' +\n ' 3. hosting_deployments_activate → make the deployment live\\n\\n' +\n 'Example:\\n' +\n ' files: { \"index.html\": \"<!DOCTYPE html>...\", \"style.css\": \"body { ... }\", \"app.js\": \"...\" }',\n inputSchema: {\n projectId: z.string().describe('Project ID'),\n deploymentId: z.string().describe('Deployment ID (from hosting_deployments_create)'),\n files: z\n .record(z.string(), z.string())\n .describe(\n 'Map of filename → file content. Keys are file paths inside the archive ' +\n '(e.g. \"index.html\", \"assets/style.css\"). Values are the UTF-8 file contents.',\n ),\n },\n },\n async ({ projectId, deploymentId, files }) => {\n try {\n const fileEntries = Object.entries(files);\n if (fileEntries.length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'files must contain at least one entry' }],\n isError: true as const,\n };\n }\n\n // Build ZIP archive from provided files\n const zip = new ZipBuilder();\n for (const [name, content] of fileEntries) {\n zip.addFile(name, content);\n }\n const zipBuffer = zip.toBuffer();\n\n // Upload to the hosting deployment upload endpoint\n const result = await api.uploadFile(\n `/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}/upload`,\n zipBuffer,\n 'site.zip',\n );\n\n const response: Record<string, unknown> = {\n success: true,\n filesUploaded: fileEntries.map(([name]) => name),\n bundleSizeBytes: zipBuffer.length,\n };\n if (result && typeof result === 'object') {\n Object.assign(response, result);\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to upload deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_activate',\n {\n description: 'Activate a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.post(`/hosting/deployments/${encodeURIComponent(deploymentId)}/activate`, {\n body: { projectId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to activate deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_delete',\n {\n description: 'Delete a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.delete(`/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Deployment deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete deployment: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_deployments_status',\n {\n description: 'Get the status of a specific deployment',\n inputSchema: {\n projectId: z.string(),\n deploymentId: z.string(),\n },\n },\n async ({ projectId, deploymentId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(deploymentId)}/status`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get deployment status: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_config_get',\n {\n description: 'Get hosting configuration for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/config`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get hosting config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_config_update',\n {\n description: 'Update hosting configuration for a project',\n inputSchema: {\n projectId: z.string(),\n spaMode: z.boolean().optional(),\n defaultFile: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, spaMode, defaultFile, headers, enabled }) => {\n try {\n const body: Record<string, unknown> = {};\n if (spaMode !== undefined) body.spaMode = spaMode;\n if (defaultFile !== undefined) body.defaultFile = defaultFile;\n if (headers !== undefined) body.headers = headers;\n if (enabled !== undefined) body.enabled = enabled;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one config field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/hosting/projects/${encodeURIComponent(projectId)}/config`, {\n body,\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update hosting config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_list',\n {\n description: 'List custom domains for a hosting project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/domains`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list domains: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_get',\n {\n description: 'Get details of a specific custom domain',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.get(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_add',\n {\n description: 'Add a custom domain to a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n projectSlug: z.string(),\n verificationMethod: z.enum(['cname', 'txt']).optional(),\n },\n },\n async ({ projectId, domain, projectSlug, verificationMethod }) => {\n try {\n const body: Record<string, unknown> = { domain, projectSlug };\n if (verificationMethod !== undefined) body.verificationMethod = verificationMethod;\n\n const result = await api.post(`/hosting/projects/${encodeURIComponent(projectId)}/domains`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to add domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_verify',\n {\n description: 'Verify a custom domain for a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.post(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}/verify`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to verify domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_remove',\n {\n description: 'Remove a custom domain from a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.delete(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'Domain removed', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to remove domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'hosting_domains_set_primary',\n {\n description: 'Set a custom domain as the primary domain for a hosting project',\n inputSchema: {\n projectId: z.string(),\n domain: z.string(),\n },\n },\n async ({ projectId, domain }) => {\n try {\n const result = await api.patch(`/hosting/projects/${encodeURIComponent(projectId)}/domains/${encodeURIComponent(domain)}/primary`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set primary domain: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { deflateRawSync } from 'node:zlib';\n\n/**\n * Minimal in-memory ZIP archive builder using Node.js built-in zlib.\n *\n * Supports adding UTF-8 text files and generating a complete ZIP buffer.\n * Intended for MCP tool use where adding external ZIP libraries is undesirable.\n *\n * @example\n * ```ts\n * const zip = new ZipBuilder();\n * zip.addFile('index.js', 'console.log(\"hello\");');\n * zip.addFile('lib/utils.js', 'export const add = (a, b) => a + b;');\n * const buffer = zip.toBuffer();\n * ```\n */\nexport class ZipBuilder {\n private files: Array<{\n name: Buffer;\n content: Buffer;\n compressed: Buffer;\n crc32: number;\n }> = [];\n\n /**\n * Add a text file to the archive.\n *\n * @param name - File path inside the ZIP (e.g. \"index.js\" or \"src/utils.ts\")\n * @param content - UTF-8 text content of the file\n */\n addFile(name: string, content: string): void {\n const nameBuffer = Buffer.from(name, 'utf-8');\n const contentBuffer = Buffer.from(content, 'utf-8');\n const compressed = deflateRawSync(contentBuffer, { level: 9 });\n const crc32 = computeCrc32(contentBuffer);\n\n this.files.push({\n name: nameBuffer,\n content: contentBuffer,\n compressed,\n crc32,\n });\n }\n\n /** Generate the complete ZIP archive as a Buffer. */\n toBuffer(): Buffer {\n const localHeaders: Buffer[] = [];\n const centralHeaders: Buffer[] = [];\n let offset = 0;\n\n for (const file of this.files) {\n // Local file header (30 bytes fixed + name + compressed data)\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0); // Local file header signature\n local.writeUInt16LE(20, 4); // Version needed (2.0)\n local.writeUInt16LE(0, 6); // General purpose bit flag\n local.writeUInt16LE(8, 8); // Compression method: deflate\n local.writeUInt16LE(0, 10); // Mod time\n local.writeUInt16LE(0, 12); // Mod date\n local.writeUInt32LE(file.crc32, 14); // CRC-32\n local.writeUInt32LE(file.compressed.length, 18); // Compressed size\n local.writeUInt32LE(file.content.length, 22); // Uncompressed size\n local.writeUInt16LE(file.name.length, 26); // File name length\n local.writeUInt16LE(0, 28); // Extra field length\n\n localHeaders.push(local, file.name, file.compressed);\n\n // Central directory header (46 bytes fixed + name)\n const central = Buffer.alloc(46);\n central.writeUInt32LE(0x02014b50, 0); // Central directory signature\n central.writeUInt16LE(20, 4); // Version made by\n central.writeUInt16LE(20, 6); // Version needed\n central.writeUInt16LE(0, 8); // General purpose bit flag\n central.writeUInt16LE(8, 10); // Compression method: deflate\n central.writeUInt16LE(0, 12); // Mod time\n central.writeUInt16LE(0, 14); // Mod date\n central.writeUInt32LE(file.crc32, 16); // CRC-32\n central.writeUInt32LE(file.compressed.length, 20); // Compressed size\n central.writeUInt32LE(file.content.length, 24); // Uncompressed size\n central.writeUInt16LE(file.name.length, 28); // File name length\n central.writeUInt16LE(0, 30); // Extra field length\n central.writeUInt16LE(0, 32); // File comment length\n central.writeUInt16LE(0, 34); // Disk number start\n central.writeUInt16LE(0, 36); // Internal file attributes\n central.writeUInt32LE(0, 38); // External file attributes\n central.writeUInt32LE(offset, 42); // Relative offset of local header\n\n centralHeaders.push(central, file.name);\n\n offset += 30 + file.name.length + file.compressed.length;\n }\n\n const centralDirSize = centralHeaders.reduce((sum, b) => sum + b.length, 0);\n\n // End of central directory record (22 bytes)\n const eocd = Buffer.alloc(22);\n eocd.writeUInt32LE(0x06054b50, 0); // EOCD signature\n eocd.writeUInt16LE(0, 4); // Disk number\n eocd.writeUInt16LE(0, 6); // Disk with central dir\n eocd.writeUInt16LE(this.files.length, 8); // Entries on this disk\n eocd.writeUInt16LE(this.files.length, 10); // Total entries\n eocd.writeUInt32LE(centralDirSize, 12); // Size of central directory\n eocd.writeUInt32LE(offset, 16); // Offset of central directory\n eocd.writeUInt16LE(0, 20); // Comment length\n\n return Buffer.concat([...localHeaders, ...centralHeaders, eocd]);\n }\n}\n\n// ─── CRC-32 ────────────────────────────────────────────────────\n\nconst crcTable: Uint32Array = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[n] = c;\n }\n return table;\n})();\n\nfunction computeCrc32(data: Buffer): number {\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) {\n crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerStorageTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'storage_files_list',\n {\n description: 'List files in storage for a project and user',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, userId, limit, offset }) => {\n try {\n const result = await api.get('/storage/files', {\n params: { projectId, userId, limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list files: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_get',\n {\n description: 'Get details of a specific file in storage',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n },\n },\n async ({ projectId, userId, fileId }) => {\n try {\n const result = await api.get(`/storage/files/${encodeURIComponent(fileId)}`, {\n params: { projectId, userId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_delete',\n {\n description: 'Delete a specific file from storage',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n },\n },\n async ({ projectId, userId, fileId }) => {\n try {\n const result = await api.delete(`/storage/files/${encodeURIComponent(fileId)}`, {\n params: { projectId, userId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result ?? 'File deleted', null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_visibility',\n {\n description: 'Update the visibility of a specific file',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n visibility: z.enum(['public', 'private']),\n },\n },\n async ({ projectId, userId, fileId, visibility }) => {\n try {\n const result = await api.patch(`/storage/files/${encodeURIComponent(fileId)}/visibility`, {\n params: { projectId, userId },\n body: { visibility },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update file visibility: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_share',\n {\n description: 'Share a file with other users',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n userIds: z.array(z.string()),\n permission: z.enum(['read', 'write']).optional(),\n },\n },\n async ({ projectId, userId, fileId, userIds, permission }) => {\n try {\n const result = await api.post(`/storage/files/${encodeURIComponent(fileId)}/share`, {\n params: { projectId, userId },\n body: { userIds, permission },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to share file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_files_unshare',\n {\n description: 'Remove file sharing for specific users',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n fileId: z.string(),\n userIds: z.array(z.string()),\n },\n },\n async ({ projectId, userId, fileId, userIds }) => {\n try {\n const result = await api.post(`/storage/files/${encodeURIComponent(fileId)}/unshare`, {\n params: { projectId, userId },\n body: { userIds },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to unshare file: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_quota_get',\n {\n description: 'Get storage quota information for a user in a project',\n inputSchema: {\n projectId: z.string(),\n userId: z.string(),\n },\n },\n async ({ projectId, userId }) => {\n try {\n const result = await api.get('/storage/quota', {\n params: { projectId, userId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get quota: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_quota_set',\n {\n description: 'Set storage quota for a user in a project',\n inputSchema: {\n projectId: z.string(),\n targetUserId: z.string(),\n quotaBytes: z.number().int().min(0),\n },\n },\n async ({ projectId, targetUserId, quotaBytes }) => {\n try {\n const result = await api.put('/storage/quota', {\n body: { projectId, targetUserId, quotaBytes },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set quota: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'storage_project_stats',\n {\n description: 'Get storage statistics for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get('/storage/project-stats', {\n params: { projectId },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get project stats: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\nimport { ZipBuilder } from '../zip';\n\nexport function registerFunctionTools(server: McpServer, api: ApiClient): void {\n // ─── CRUD ────────────────────────────────────────────────────\n\n server.registerTool(\n 'functions_list',\n {\n description: 'List all functions for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list functions: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_get',\n {\n description: 'Get details of a specific function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_create',\n {\n description: 'Create a new serverless function in a project',\n inputSchema: {\n projectId: z.string(),\n name: z.string().min(1).max(255),\n description: z.string().max(1000).optional(),\n entryPoint: z.string().max(255).optional(),\n cronExpression: z.string().optional(),\n cronTimezone: z.string().optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n memoryLimitMb: z.number().int().min(16).max(512).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, ...body }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions`,\n { body },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_update',\n {\n description: 'Update an existing function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n name: z.string().min(1).max(255).optional(),\n description: z.string().max(1000).optional(),\n entryPoint: z.string().max(255).optional(),\n cronExpression: z.string().optional(),\n cronTimezone: z.string().optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n memoryLimitMb: z.number().int().min(16).max(512).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, functionId, ...body }) => {\n try {\n const result = await api.patch(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n { body },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_delete',\n {\n description: 'Delete a function and its associated cron job',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.delete(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Code & Deployments ──────────────────────────────────────\n\n server.registerTool(\n 'functions_get_code',\n {\n description: 'Get the deployed source code of a function with syntax-highlighted file contents',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/code`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get function code: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_deploy',\n {\n description:\n 'Deploy code to a serverless function. Accepts one or more files as a ' +\n 'record of filename → content. The files are bundled into a ZIP archive ' +\n 'and uploaded. Use this after creating a function with functions_create.\\n\\n' +\n 'Example – single file:\\n' +\n ' files: { \"index.js\": \"export default async function handler(ctx) { ... }\" }\\n\\n' +\n 'Example – multiple files:\\n' +\n ' files: { \"index.js\": \"import {hello} from \\'./lib.js\\'; ...\", \"lib.js\": \"export const hello = () => ...\" }',\n inputSchema: {\n projectId: z.string().describe('Project ID'),\n functionId: z.string().describe('Function ID (from functions_create or functions_list)'),\n files: z\n .record(z.string(), z.string())\n .describe(\n 'Map of filename → file content. Keys are file paths inside the bundle ' +\n '(e.g. \"index.js\", \"src/helper.ts\"). Values are the UTF-8 source code.',\n ),\n entryPoint: z\n .string()\n .max(255)\n .optional()\n .describe('Entry point file inside the bundle (default: \"index.js\"). Must match a key in files.'),\n },\n },\n async ({ projectId, functionId, files, entryPoint }) => {\n try {\n const fileEntries = Object.entries(files);\n if (fileEntries.length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'files must contain at least one entry' }],\n isError: true as const,\n };\n }\n\n // Update entry point on the function if provided\n if (entryPoint) {\n await api.patch(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n { body: { entryPoint } },\n );\n }\n\n // Build ZIP archive from provided files\n const zip = new ZipBuilder();\n for (const [name, content] of fileEntries) {\n zip.addFile(name, content);\n }\n const zipBuffer = zip.toBuffer();\n\n // Upload to the deploy endpoint\n const result = await api.uploadFile(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/deploy`,\n zipBuffer,\n 'bundle.zip',\n );\n\n const response: Record<string, unknown> = {\n success: true,\n filesDeployed: fileEntries.map(([name]) => name),\n bundleSizeBytes: zipBuffer.length,\n };\n if (result && typeof result === 'object') {\n Object.assign(response, result);\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to deploy function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_deployments_list',\n {\n description: 'List all deployments (versions) of a function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/deployments`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list deployments: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Execution ───────────────────────────────────────────────\n\n server.registerTool(\n 'functions_trigger',\n {\n description: 'Manually trigger a function execution',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/trigger`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to trigger function: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_executions_list',\n {\n description: 'List recent executions of a function with status, duration, and logs',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, functionId, limit, offset }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/executions`,\n { params: { limit, offset } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list executions: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Webhooks ────────────────────────────────────────────────\n\n server.registerTool(\n 'functions_enable_webhook',\n {\n description: 'Enable webhook trigger for a function. Returns a one-time webhook secret.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/webhook/enable`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to enable webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_regenerate_webhook_secret',\n {\n description: 'Regenerate the webhook secret for a function. Old secret stops working immediately.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/webhook/regenerate-secret`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to regenerate webhook secret: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_disable_webhook',\n {\n description: 'Disable webhook trigger for a function. The webhook secret is deleted.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.post(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/webhook/disable`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to disable webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── Environment Variables ───────────────────────────────────\n\n server.registerTool(\n 'functions_get_env_vars',\n {\n description: 'Get environment variables for a function (decrypted). Use these to store API keys and secrets.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/env`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get env vars: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'functions_set_env_vars',\n {\n description: 'Set environment variables for a function. Merges with existing vars. Values are encrypted at rest.',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n variables: z.record(z.string(), z.string()),\n },\n },\n async ({ projectId, functionId, variables }) => {\n try {\n // Get existing vars first, merge, then update\n const existing = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/env`,\n ) as Record<string, string>;\n\n const merged = { ...existing, ...variables };\n\n await api.patch(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}`,\n { body: { environmentVariables: merged } },\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ success: true, keys: Object.keys(merged) }, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to set env vars: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // ─── KV Store ────────────────────────────────────────────────\n\n server.registerTool(\n 'functions_kv_list',\n {\n description: 'List KV store keys for a function',\n inputSchema: {\n projectId: z.string(),\n functionId: z.string(),\n },\n },\n async ({ projectId, functionId }) => {\n try {\n const result = await api.get(\n `/projects/${encodeURIComponent(projectId)}/functions/${encodeURIComponent(functionId)}/kv`,\n );\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list KV keys: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerEmailTemplateTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'email_templates_list',\n {\n description: 'List all email templates for a project (includes system defaults)',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/email-templates`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list email templates: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_get',\n {\n description: 'Get a single email template by ID',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.get(`/email-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_create',\n {\n description: 'Create a new project-specific email template. The type identifies the template purpose (e.g. \"verify-email\", \"welcome\", \"invoice\").',\n inputSchema: {\n projectId: z.string(),\n type: z.string(),\n name: z.string(),\n subject: z.string(),\n mjmlSource: z.string(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ projectId, type, name, subject, mjmlSource, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = { projectId, type, name, subject, mjmlSource };\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/email-templates`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_update',\n {\n description: 'Update an existing email template',\n inputSchema: {\n id: z.string(),\n name: z.string().optional(),\n subject: z.string().optional(),\n mjmlSource: z.string().optional(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ id, name, subject, mjmlSource, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (subject !== undefined) body.subject = subject;\n if (mjmlSource !== undefined) body.mjmlSource = mjmlSource;\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/email-templates/${encodeURIComponent(id)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_delete',\n {\n description: 'Delete an email template. System default templates cannot be deleted.',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.delete(`/email-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Email template deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'email_templates_preview',\n {\n description: 'Preview a compiled email template. Renders MJML to HTML and applies Handlebars variables.',\n inputSchema: {\n mjmlSource: z.string(),\n variables: z.record(z.string(), z.unknown()).optional(),\n },\n },\n async ({ mjmlSource, variables }) => {\n try {\n const body: Record<string, unknown> = { mjmlSource };\n if (variables !== undefined) body.variables = variables;\n\n const result = await api.post('/email-templates/preview', { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to preview email template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerCronJobTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'cron_jobs_list',\n {\n description: 'List all cron jobs for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/cron-jobs`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list cron jobs: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_get',\n {\n description: 'Get a single cron job by ID',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ projectId, jobId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_create',\n {\n description: 'Create a new cron job. When type is \"webhook\", url is required. When type is \"function\", functionId is required. cronExpression uses 5-field cron format (e.g. \"0 0 * * *\").',\n inputSchema: {\n projectId: z.string(),\n name: z.string(),\n cronExpression: z.string().regex(/^(\\S+\\s){4}\\S+$/),\n timezone: z.string().optional(),\n type: z.enum(['webhook', 'function']).optional(),\n functionId: z.string().optional(),\n url: z.string().url().optional(),\n secret: z.string().optional(),\n payload: z.record(z.string(), z.unknown()).optional(),\n retryAttempts: z.number().int().min(0).max(10).optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, name, cronExpression, timezone, type, functionId, url, secret, payload, retryAttempts, timeout, enabled }) => {\n try {\n const body: Record<string, unknown> = { name, cronExpression };\n if (timezone !== undefined) body.timezone = timezone;\n if (type !== undefined) body.type = type;\n if (functionId !== undefined) body.functionId = functionId;\n if (url !== undefined) body.url = url;\n if (secret !== undefined) body.secret = secret;\n if (payload !== undefined) body.payload = payload;\n if (retryAttempts !== undefined) body.retryAttempts = retryAttempts;\n if (timeout !== undefined) body.timeout = timeout;\n if (enabled !== undefined) body.enabled = enabled;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/cron-jobs`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_update',\n {\n description: 'Update an existing cron job',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n name: z.string().optional(),\n cronExpression: z.string().regex(/^(\\S+\\s){4}\\S+$/).optional(),\n timezone: z.string().optional(),\n type: z.enum(['webhook', 'function']).optional(),\n functionId: z.string().optional(),\n url: z.string().url().optional(),\n secret: z.string().optional(),\n payload: z.record(z.string(), z.unknown()).optional(),\n retryAttempts: z.number().int().min(0).max(10).optional(),\n timeout: z.number().int().min(1000).max(120000).optional(),\n enabled: z.boolean().optional(),\n },\n },\n async ({ projectId, jobId, name, cronExpression, timezone, type, functionId, url, secret, payload, retryAttempts, timeout, enabled }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (cronExpression !== undefined) body.cronExpression = cronExpression;\n if (timezone !== undefined) body.timezone = timezone;\n if (type !== undefined) body.type = type;\n if (functionId !== undefined) body.functionId = functionId;\n if (url !== undefined) body.url = url;\n if (secret !== undefined) body.secret = secret;\n if (payload !== undefined) body.payload = payload;\n if (retryAttempts !== undefined) body.retryAttempts = retryAttempts;\n if (timeout !== undefined) body.timeout = timeout;\n if (enabled !== undefined) body.enabled = enabled;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_delete',\n {\n description: 'Delete a cron job',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ projectId, jobId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Cron job deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_trigger',\n {\n description: 'Manually trigger a cron job execution',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ projectId, jobId }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}/trigger`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to trigger cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_toggle',\n {\n description: 'Toggle a cron job enabled/disabled',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n enabled: z.boolean(),\n },\n },\n async ({ projectId, jobId, enabled }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}/toggle`, { body: { enabled } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to toggle cron job: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_executions',\n {\n description: 'List execution history for a cron job',\n inputSchema: {\n projectId: z.string(),\n jobId: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, jobId, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/cron-jobs/${encodeURIComponent(jobId)}/executions`, { params: { limit, offset } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list cron job executions: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_list_all',\n {\n description: 'List all cron jobs across projects (admin overview)',\n inputSchema: {\n projectId: z.string().optional(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get('/cron/jobs', { params: { projectId } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list all cron jobs: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'cron_jobs_status',\n {\n description: 'Get cron queue status',\n inputSchema: {},\n },\n async () => {\n try {\n const result = await api.get('/cron/status');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get cron status: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nconst WEBHOOK_EVENT_TYPES = [\n 'user.created',\n 'user.updated',\n 'user.deleted',\n 'user.login',\n 'user.email_verified',\n 'user.password_reset_requested',\n 'user.password_reset',\n 'user.2fa_verified',\n 'database.insert',\n 'database.update',\n 'database.delete',\n 'storage.upload',\n 'storage.delete',\n 'project.created',\n 'project.updated',\n] as const;\n\nexport function registerWebhookTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'webhooks_list',\n {\n description: 'List all webhooks for a project',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/webhooks`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list webhooks: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_get',\n {\n description: 'Get a single webhook by ID',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n },\n },\n async ({ projectId, webhookId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_create',\n {\n description: 'Create a new webhook for a project. WARNING: The response includes a secret that will be visible in the conversation context. Events include: user.created, user.updated, user.deleted, user.login, user.email_verified, user.password_reset_requested, user.password_reset, user.2fa_verified, database.insert, database.update, database.delete, storage.upload, storage.delete, project.created, project.updated.',\n inputSchema: {\n projectId: z.string(),\n url: z.string().url(),\n events: z.array(z.enum(WEBHOOK_EVENT_TYPES)).min(1),\n description: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n active: z.boolean().optional(),\n },\n },\n async ({ projectId, url, events, description, headers, active }) => {\n try {\n const body: Record<string, unknown> = { url, events };\n if (description !== undefined) body.description = description;\n if (headers !== undefined) body.headers = headers;\n if (active !== undefined) body.active = active;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/webhooks`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_update',\n {\n description: 'Update an existing webhook',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n url: z.string().url().optional(),\n events: z.array(z.enum(WEBHOOK_EVENT_TYPES)).min(1).optional(),\n description: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n active: z.boolean().optional(),\n },\n },\n async ({ projectId, webhookId, url, events, description, headers, active }) => {\n try {\n const body: Record<string, unknown> = {};\n if (url !== undefined) body.url = url;\n if (events !== undefined) body.events = events;\n if (description !== undefined) body.description = description;\n if (headers !== undefined) body.headers = headers;\n if (active !== undefined) body.active = active;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_delete',\n {\n description: 'Delete a webhook',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n },\n },\n async ({ projectId, webhookId }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Webhook deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_test',\n {\n description: 'Send a test ping to a webhook',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string(),\n },\n },\n async ({ projectId, webhookId }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/webhooks/${encodeURIComponent(webhookId)}/test`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to test webhook: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_deliveries',\n {\n description: 'List webhook delivery logs for a project',\n inputSchema: {\n projectId: z.string(),\n webhookId: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, webhookId, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/webhook-deliveries`, { params: { webhookId, limit, offset } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list webhook deliveries: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'webhooks_delivery_retry',\n {\n description: 'Retry a failed webhook delivery',\n inputSchema: {\n projectId: z.string(),\n deliveryId: z.string(),\n },\n },\n async ({ projectId, deliveryId }) => {\n try {\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/webhook-deliveries/${encodeURIComponent(deliveryId)}/retry`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to retry webhook delivery: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerNotificationTools(server: McpServer, api: ApiClient): void {\n // --- Templates ---\n\n server.registerTool(\n 'notification_templates_list',\n {\n description: 'List all notification templates for a project (includes system defaults)',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/notification-templates`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list notification templates: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_get',\n {\n description: 'Get a single notification template by ID',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.get(`/notification-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_create',\n {\n description: 'Create a new project-specific notification template. Variables use Handlebars syntax in titleTemplate and bodyTemplate.',\n inputSchema: {\n projectId: z.string(),\n type: z.string(),\n name: z.string(),\n titleTemplate: z.string(),\n bodyTemplate: z.string(),\n icon: z.string().optional(),\n defaultUrl: z.string().optional(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ projectId, type, name, titleTemplate, bodyTemplate, icon, defaultUrl, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = { projectId, type, name, titleTemplate, bodyTemplate };\n if (icon !== undefined) body.icon = icon;\n if (defaultUrl !== undefined) body.defaultUrl = defaultUrl;\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/notification-templates`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to create notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_update',\n {\n description: 'Update an existing notification template',\n inputSchema: {\n id: z.string(),\n name: z.string().optional(),\n titleTemplate: z.string().optional(),\n bodyTemplate: z.string().optional(),\n icon: z.string().optional(),\n defaultUrl: z.string().optional(),\n variables: z.array(z.string()).optional(),\n isActive: z.boolean().optional(),\n },\n },\n async ({ id, name, titleTemplate, bodyTemplate, icon, defaultUrl, variables, isActive }) => {\n try {\n const body: Record<string, unknown> = {};\n if (name !== undefined) body.name = name;\n if (titleTemplate !== undefined) body.titleTemplate = titleTemplate;\n if (bodyTemplate !== undefined) body.bodyTemplate = bodyTemplate;\n if (icon !== undefined) body.icon = icon;\n if (defaultUrl !== undefined) body.defaultUrl = defaultUrl;\n if (variables !== undefined) body.variables = variables;\n if (isActive !== undefined) body.isActive = isActive;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one field must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/notification-templates/${encodeURIComponent(id)}`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_delete',\n {\n description: 'Delete a project notification template override (reverts to system default)',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.delete(`/notification-templates/${encodeURIComponent(id)}`);\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Notification template deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_templates_preview',\n {\n description: 'Preview a compiled notification template with Handlebars variables applied',\n inputSchema: {\n titleTemplate: z.string(),\n bodyTemplate: z.string(),\n variables: z.record(z.string(), z.string()),\n },\n },\n async ({ titleTemplate, bodyTemplate, variables }) => {\n try {\n const result = await api.post('/notification-templates/preview', { body: { titleTemplate, bodyTemplate, variables } });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to preview notification template: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Config ---\n\n server.registerTool(\n 'notification_config_get',\n {\n description: 'Get push notification provider configuration for a project (VAPID, FCM, APNS). WARNING: Response may include sensitive credentials that will be visible in the conversation context.',\n inputSchema: {\n projectId: z.string(),\n },\n },\n async ({ projectId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/notification-config`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get notification config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_config_update',\n {\n description: 'Update push notification provider configuration. Supports VAPID, FCM, and APNS providers. WARNING: privateKey and serviceAccountJson values are sensitive credentials that will be visible in the conversation context.',\n inputSchema: {\n projectId: z.string(),\n vapid: z.object({\n publicKey: z.string().optional(),\n privateKey: z.string().optional(),\n subject: z.string().optional(),\n enabled: z.boolean().optional(),\n }).optional(),\n fcm: z.object({\n serviceAccountJson: z.string().optional(),\n enabled: z.boolean().optional(),\n }).optional(),\n apns: z.object({\n keyId: z.string().optional(),\n teamId: z.string().optional(),\n privateKey: z.string().optional(),\n bundleId: z.string().optional(),\n production: z.boolean().optional(),\n enabled: z.boolean().optional(),\n }).optional(),\n },\n },\n async ({ projectId, vapid, fcm, apns }) => {\n try {\n const body: Record<string, unknown> = {};\n if (vapid !== undefined) body.vapid = vapid;\n if (fcm !== undefined) body.fcm = fcm;\n if (apns !== undefined) body.apns = apns;\n\n if (Object.keys(body).length === 0) {\n return {\n content: [{ type: 'text' as const, text: 'At least one provider config must be provided' }],\n isError: true as const,\n };\n }\n\n const result = await api.patch(`/projects/${encodeURIComponent(projectId)}/notification-config`, { body });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to update notification config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_config_delete',\n {\n description: 'Delete push notification provider configuration. Specify a provider to delete only that one, or omit to delete all.',\n inputSchema: {\n projectId: z.string(),\n provider: z.enum(['vapid', 'fcm', 'apns']).optional(),\n },\n },\n async ({ projectId, provider }) => {\n try {\n const result = await api.delete(`/projects/${encodeURIComponent(projectId)}/notification-config`, { params: { provider } });\n return {\n content: [{ type: 'text' as const, text: result ? JSON.stringify(result, null, 2) : 'Notification config deleted' }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to delete notification config: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notification_config_generate_vapid',\n {\n description: 'Generate a new VAPID key pair for web push notifications. WARNING: The private key will be visible in the conversation context.',\n inputSchema: {},\n },\n async () => {\n try {\n const result = await api.post('/notification-config/generate-vapid-keys');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to generate VAPID keys: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n // --- Send ---\n\n server.registerTool(\n 'notifications_send',\n {\n description: 'Send a push notification to selected users',\n inputSchema: {\n projectId: z.string(),\n userIds: z.array(z.string()).min(1),\n title: z.string(),\n body: z.string(),\n icon: z.string().optional(),\n url: z.string().optional(),\n },\n },\n async ({ projectId, userIds, title, body: notifBody, icon, url }) => {\n try {\n const reqBody: Record<string, unknown> = { userIds, title, body: notifBody };\n if (icon !== undefined) reqBody.icon = icon;\n if (url !== undefined) reqBody.url = url;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/notifications/send`, { body: reqBody });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to send notification: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'notifications_broadcast',\n {\n description: 'Broadcast a push notification to all subscribed users in a project',\n inputSchema: {\n projectId: z.string(),\n title: z.string(),\n body: z.string(),\n icon: z.string().optional(),\n url: z.string().optional(),\n },\n },\n async ({ projectId, title, body: notifBody, icon, url }) => {\n try {\n const reqBody: Record<string, unknown> = { title, body: notifBody };\n if (icon !== undefined) reqBody.icon = icon;\n if (url !== undefined) reqBody.url = url;\n\n const result = await api.post(`/projects/${encodeURIComponent(projectId)}/notifications/broadcast`, { body: reqBody });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to broadcast notification: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ApiClient } from '../api-client';\n\nexport function registerAuditLogTools(server: McpServer, api: ApiClient): void {\n server.registerTool(\n 'audit_logs_list',\n {\n description: 'List audit logs for a project. Filter by entity type, action, and date range.',\n inputSchema: {\n projectId: z.string(),\n entityType: z.enum(['user', 'client', 'project', 'auth', 'database', 'storage']).optional(),\n action: z.string().optional(),\n startDate: z.string().datetime().optional(),\n endDate: z.string().datetime().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n },\n },\n async ({ projectId, entityType, action, startDate, endDate, limit, offset }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/audit-logs`, {\n params: { entityType, action, startDate, endDate, limit, offset },\n });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to list audit logs: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n\n server.registerTool(\n 'audit_logs_get',\n {\n description: 'Get a single audit log entry by ID',\n inputSchema: {\n projectId: z.string(),\n logId: z.string(),\n },\n },\n async ({ projectId, logId }) => {\n try {\n const result = await api.get(`/projects/${encodeURIComponent(projectId)}/audit-logs/${encodeURIComponent(logId)}`);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text' as const, text: `Failed to get audit log: ${message}` }],\n isError: true as const,\n };\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { ApiClient } from '../api-client';\nimport { registerAuthTools } from './auth';\nimport { registerProjectTools } from './projects';\nimport { registerClientTools } from './clients';\nimport { registerDatabaseTools } from './database';\nimport { registerHostingTools } from './hosting';\nimport { registerStorageTools } from './storage';\nimport { registerFunctionTools } from './functions';\nimport { registerEmailTemplateTools } from './emailTemplates';\nimport { registerCronJobTools } from './cronJobs';\nimport { registerWebhookTools } from './webhooks';\nimport { registerNotificationTools } from './notifications';\nimport { registerAuditLogTools } from './auditLogs';\n\nexport function registerAllTools(server: McpServer, api: ApiClient): void {\n registerAuthTools(server, api);\n registerProjectTools(server, api);\n registerClientTools(server, api);\n registerDatabaseTools(server, api);\n registerHostingTools(server, api);\n registerStorageTools(server, api);\n registerFunctionTools(server, api);\n registerEmailTemplateTools(server, api);\n registerCronJobTools(server, api);\n registerWebhookTools(server, api);\n registerNotificationTools(server, api);\n registerAuditLogTools(server, api);\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerDatabasePrompts(server: McpServer): void {\n server.registerPrompt(\n 'setup-collection',\n {\n title: 'Setup Database Collection',\n description:\n 'Guide for creating a new database collection with proper security rules. ' +\n 'Collections MUST have rules defined before data can be inserted.',\n argsSchema: {\n projectId: z.string().describe('Project ID'),\n collectionName: z.string().describe('Name of the collection to create'),\n access: z\n .enum(['public-read', 'authenticated', 'admin-only'])\n .optional()\n .describe('Access level (default: admin-only)'),\n },\n },\n async ({ projectId, collectionName, access }) => {\n const accessLevel = access || 'admin-only';\n\n const rules: Record<string, Record<string, string>> = {\n 'public-read': {\n '.create': 'true',\n '.read': 'true',\n '.update': 'false',\n '.delete': \"auth.role === 'owner' || auth.role === 'admin'\",\n },\n authenticated: {\n '.create': '!!auth.uid',\n '.read': '!!auth.uid',\n '.update': '!!auth.uid',\n '.delete': \"auth.role === 'owner' || auth.role === 'admin'\",\n },\n 'admin-only': {\n '.create': \"auth.role === 'owner' || auth.role === 'admin'\",\n '.read': \"auth.role === 'owner' || auth.role === 'admin'\",\n '.update': \"auth.role === 'owner' || auth.role === 'admin'\",\n '.delete': \"auth.role === 'owner' || auth.role === 'admin'\",\n },\n };\n\n const collectionRules = rules[accessLevel];\n const rulesJson = JSON.stringify(collectionRules, null, 2);\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Set up a new database collection \"${collectionName}\" in project ${projectId}.`,\n '',\n 'IMPORTANT WORKFLOW:',\n '1. First, get the current rules with database_rules_get',\n '2. Add the new collection rules to the existing rules object',\n '3. Set the updated rules with database_rules_set — this automatically creates the collection',\n '4. Do NOT try to insert documents before the rules are set — it will fail with \"Rule denied\"',\n '',\n `Suggested rules for \"${collectionName}\" (${accessLevel}):`,\n rulesJson,\n '',\n 'The $other catch-all rule should deny access to undefined collections:',\n ' \"$other\": { \".read\": \"false\", \".write\": \"false\" }',\n '',\n 'After rules are set, the collection is ready for use via:',\n '- database_documents_insert',\n '- database_documents_find',\n '- Serverless functions using spacelr.db.collection(\"' + collectionName + '\")',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n\n server.registerPrompt(\n 'database-workflow',\n {\n title: 'Database Workflow Guide',\n description:\n 'Explains how the Spacelr database system works: rules-first approach, ' +\n 'collection lifecycle, and security model.',\n argsSchema: {\n projectId: z.string().describe('Project ID'),\n },\n },\n async ({ projectId }) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Guide me through the Spacelr database system for project ${projectId}.`,\n '',\n 'CORE CONCEPTS:',\n '',\n '1. RULES-FIRST: Collections are defined through security rules.',\n ' - Use database_rules_get to see current rules',\n ' - Use database_rules_set to add/modify collection rules',\n ' - Setting rules automatically creates the collection definition',\n ' - Without rules, all operations are denied by the $other catch-all',\n '',\n '2. SECURITY RULES SYNTAX:',\n ' - \".create\": Expression that must evaluate to true for inserts',\n ' - \".read\": Expression for reads/queries',\n ' - \".update\": Expression for document updates',\n ' - \".delete\": Expression for document deletion',\n ' - \".validate\": Per-field validation expressions',\n ' - \".schema\": Field type declarations',\n ' Available context: auth.uid, auth.role, newData (for validation)',\n '',\n '3. WORKFLOW:',\n ' a) Define rules for the collection',\n ' b) Optionally create indexes (database_indexes_create)',\n ' c) Insert/query documents',\n '',\n '4. DATA ISOLATION:',\n ' - Each project has its own database (project_{projectId})',\n ' - Collections are scoped to the project automatically',\n ' - No cross-project data access is possible',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerFunctionPrompts(server: McpServer): void {\n server.registerPrompt(\n 'deploy-function',\n {\n title: 'Deploy a Serverless Function',\n description:\n 'Step-by-step guide for creating, deploying, and testing a serverless function. ' +\n 'Covers the full lifecycle from creation to execution.',\n argsSchema: {\n projectId: z.string().describe('Project ID'),\n name: z.string().describe('Function name'),\n useCase: z\n .string()\n .optional()\n .describe('What the function should do (e.g. \"fetch data from API and store in DB\")'),\n },\n },\n async ({ projectId, name, useCase }) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Deploy a serverless function \"${name}\" in project ${projectId}.`,\n useCase ? `Use case: ${useCase}` : '',\n '',\n 'DEPLOYMENT WORKFLOW:',\n '',\n '1. CREATE the function:',\n ' Use functions_create with name, entryPoint (default: index.js),',\n ' timeout (ms, default: 30000), memoryLimitMb (default: 128)',\n ' Optional: cronExpression for scheduled execution',\n '',\n '2. WRITE the code:',\n ' Create an index.js file with plain JavaScript (ES2022).',\n ' The runtime is an isolated V8 sandbox — NOT Node.js.',\n ' No require/import, no Node.js built-ins (fs, path, crypto, Buffer, process).',\n ' Top-level await is supported. Available APIs inside the sandbox:',\n '',\n ' - console.log/warn/error/info() — captured to execution logs',\n ' - await fetch(url, options) — HTTP client (10s timeout, 5MB limit)',\n ' Response: { status, headers, body } where body is a STRING',\n ' Use JSON.parse(response.body) for JSON APIs',\n ' - env.get(key) — read environment variables (API keys, secrets — set via Console UI or CLI)',\n ' - await kv.get/set/delete/list() — Redis KV store (256KB values, 1000 keys)',\n ' - await spacelr.db.collection(name).find/insertOne/insertMany()',\n ' - await spacelr.storage.list/getInfo/getDownloadUrl()',\n ' - await spacelr.email.send/sendRaw() — send template or raw emails',\n ' - await spacelr.notifications.send/sendMany() — push notifications',\n '',\n ' Trigger context globals (depending on trigger type):',\n ' - event: { type, data, timestamp } — for event-triggered executions',\n ' - payload: { ... } — for webhook-triggered executions (the POST body)',\n '',\n ' IMPORTANT: Top-level await is supported. No imports/require available.',\n '',\n '3. IF USING spacelr.db:',\n ' Database rules MUST be set BEFORE the function writes to a collection.',\n ' Use the setup-collection prompt or manually set rules via database_rules_set.',\n ' Without rules, inserts will fail with \"Rule denied\".',\n '',\n '4. DEPLOY the code:',\n ' Use the functions_deploy tool to upload code directly:',\n ' functions_deploy({ projectId, functionId, files: { \"index.js\": \"...\" } })',\n ' This bundles the files into a ZIP and uploads them automatically.',\n ' You can deploy multiple files: { \"index.js\": \"...\", \"lib.js\": \"...\" }',\n ' Optionally set entryPoint if your main file is not index.js.',\n '',\n '5. TRIGGER:',\n ' Functions support multiple trigger types:',\n '',\n ' a) Manual: Use functions_trigger to execute on demand.',\n ' b) Cron: Set cronExpression when creating/updating the function.',\n ' c) Webhook: Enable with functions_enable_webhook to get a secret,',\n ' then POST to /api/v1/functions/{projectId}/{functionId}/invoke',\n ' with the X-Webhook-Secret header. Use functions_regenerate_webhook_secret',\n ' to rotate the secret (old secret stops working immediately).',\n ' d) Event: Configure event triggers to run the function in response',\n ' to platform events (e.g. database changes, storage uploads).',\n '',\n ' Check results with functions_executions_list.',\n '',\n '6. VERIFY:',\n ' Check execution status, logs, and duration.',\n ' Use functions_get_code to review the deployed source.',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n\n server.registerPrompt(\n 'function-sandbox-reference',\n {\n title: 'Function Sandbox API Reference',\n description:\n 'Complete reference for all APIs available inside a serverless function sandbox.',\n argsSchema: {},\n },\n async () => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n 'Show me the complete API reference for the Spacelr function sandbox.',\n '',\n '═══ RUNTIME ENVIRONMENT ═══',\n 'Functions run in an isolated V8 sandbox (via isolated-vm), NOT in Node.js.',\n 'This means:',\n ' - No require() or import statements — all APIs are pre-injected globals',\n ' - No Node.js built-ins (fs, path, crypto, Buffer, process, etc.)',\n ' - No setTimeout, setInterval, or Promise.race',\n ' - No Function constructor, eval(), WebAssembly, or Proxy',\n ' - Top-level await IS supported (code runs in an async IIFE)',\n ' - Standard JS built-ins work: JSON, Math, Date, Array, Map, Set, RegExp, etc.',\n ' - Use the built-in fetch() for HTTP calls (not node-fetch or axios)',\n ' - Use env.get() for secrets (not process.env)',\n ' - Use kv.get/set() for persistence across executions (not file system)',\n '',\n 'Write plain JavaScript (ES2022). The code structure is simple:',\n ' // Top-level code runs immediately',\n ' const data = await fetch(\"https://api.example.com/data\");',\n ' const json = JSON.parse(data.body);',\n ' console.log(\"Fetched\", json.length, \"items\");',\n '',\n '═══ TRIGGER CONTEXT ═══',\n 'Depending on how the function was triggered, these globals may be available:',\n ' - event: { type, data, timestamp } — for event-triggered executions',\n ' - payload: { ... } — for webhook-triggered executions (the POST body)',\n 'For manual and cron triggers, neither is set.',\n '',\n '═══ CONSOLE ═══',\n 'console.log(...args) — log level',\n 'console.info(...args) — info level',\n 'console.warn(...args) — warn level',\n 'console.error(...args) — error level',\n 'All logs are captured and stored in the execution record.',\n 'Log buffer is capped at 1MB.',\n '',\n '═══ FETCH ═══',\n 'const response = await fetch(url, options?)',\n ' options: { method, headers, body }',\n ' returns: { status: number, headers: Record<string,string>, body: string }',\n ' NOTE: body is always a string — use JSON.parse(response.body) for JSON',\n ' Limits: 10s timeout, 5MB response, no private/internal URLs (SSRF blocked)',\n '',\n '═══ ENV (Environment Variables) ═══',\n 'env.get(key) → string | undefined',\n 'Read-only access to function environment variables.',\n 'Use env vars to store API keys, secrets, and configuration — never hardcode them in function code.',\n 'Set via Console UI (Function Detail → Environment Variables) or CLI (spacelr functions env set).',\n 'Values are encrypted at rest and only decrypted when the function executes.',\n '',\n '═══ KV STORE ═══',\n 'await kv.get(key) → string | null',\n 'await kv.set(key, value, ttlSeconds?) → void',\n 'await kv.delete(key) → boolean',\n 'await kv.list(prefix?) → string[]',\n 'Backed by Redis. Scoped per function.',\n 'Limits: 256KB per value, 1000 keys per function, 30-day default TTL.',\n '',\n '═══ DATABASE ═══',\n 'const docs = await spacelr.db.collection(name).find(filter?, options?)',\n ' filter: MongoDB-style query (e.g. { status: \"active\", age: { $gt: 18 } })',\n ' options: { sort: { createdAt: -1 }, limit: 10, offset: 0 }',\n ' returns: array of documents',\n '',\n 'await spacelr.db.collection(name).insertOne(doc)',\n ' doc: plain object (e.g. { name: \"Max\", email: \"max@example.com\" })',\n ' returns: the inserted document with _id',\n '',\n 'await spacelr.db.collection(name).insertMany(docs)',\n ' docs: array of objects',\n ' returns: array of inserted documents',\n '',\n 'Collection names: alphanumeric + underscore only, max 128 chars.',\n 'Scoped to the function\\'s project. Requires database rules to be set first.',\n '',\n 'Example — read and write:',\n ' const users = await spacelr.db.collection(\"users\").find({ status: \"active\" }, { limit: 5 });',\n ' console.log(\"Found\", users.length, \"active users\");',\n ' await spacelr.db.collection(\"logs\").insertOne({ action: \"check\", count: users.length, at: new Date().toISOString() });',\n '',\n '═══ STORAGE ═══',\n 'await spacelr.storage.list(options?) → FileInfo[]',\n 'await spacelr.storage.getInfo(fileId) → FileInfo',\n 'await spacelr.storage.getDownloadUrl(fileId) → string',\n 'Scoped to the function\\'s project.',\n '',\n '═══ EMAIL ═══',\n 'await spacelr.email.send({ to, template, variables })',\n ' Sends a template-based email using project templates (MJML + Handlebars).',\n ' template: template name (must exist in the project)',\n ' variables: Record<string, string> of template variables',\n ' Returns: { messageId }',\n 'await spacelr.email.sendRaw({ to, subject, html })',\n ' Sends a raw HTML email directly. Max 500KB HTML.',\n ' Returns: { messageId }',\n 'Rate limit: 100 emails/hour per project (configurable via FUNCTION_EMAIL_HOURLY_LIMIT).',\n '',\n '═══ NOTIFICATIONS ═══',\n 'await spacelr.notifications.send({ userId, title, body, data? })',\n ' Sends a push notification to a specific user in the project.',\n 'await spacelr.notifications.sendMany({ userIds, title, body, data? })',\n ' Sends to multiple users. Deduplicates userIds automatically.',\n 'Rate limit: 500 notifications/hour per project (configurable via FUNCTION_NOTIFICATION_HOURLY_LIMIT). Scoped to the function\\'s project.',\n '',\n '═══ RESOURCE LIMITS ═══',\n 'Execution timeout: 30s default, 120s max',\n 'Memory: 128MB default, 512MB max',\n 'Code bundle: 10MB max (zip)',\n 'Concurrent executions: 10 per project',\n 'CPU time: limited by watchdog (equals timeout)',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { registerDatabasePrompts } from './database';\nimport { registerFunctionPrompts } from './functions';\n\nexport function registerAllPrompts(server: McpServer): void {\n registerDatabasePrompts(server);\n registerFunctionPrompts(server);\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Getting Started with Spacelr\n\n## Overview\n\nSpacelr is a **Backend-as-a-Service (BaaS)** platform that provides everything you need to build and run applications. The Spacelr MCP server gives you tools to manage:\n\n- **Projects** - Create and manage your application projects\n- **Database** - Document database with collections, documents, indexes, and security rules\n- **Storage** - File storage with upload, download, sharing, and quotas\n- **Serverless Functions** - Deploy and execute functions with a built-in KV store\n- **Hosting** - Static site hosting with deployments and custom domains\n- **Email Templates** - Manage and preview email templates\n- **Cron Jobs** - Schedule and manage recurring jobs\n- **Webhooks** - Configure webhook event delivery\n- **Notifications** - Send push notifications to users\n- **Audit Logs** - View audit logs for your projects\n- **OAuth Clients** - Manage OAuth client applications\n\n## Authentication\n\nThe first step is always to authenticate. Use the \\`auth_login\\` tool with your email and password:\n\n1. Call \\`auth_login\\` with your credentials. After a successful login, the token is stored automatically for subsequent requests.\n2. Use \\`auth_me\\` to verify your current session and see your user profile.\n\n## Project Context\n\nMost tools require a \\`projectId\\` to specify which project you are working with.\n\n- Use \\`projects_list\\` to see all projects you have access to.\n- Use \\`projects_create\\` to create a new project if needed.\n\nOnce you have a \\`projectId\\`, pass it to module-specific tools to manage resources within that project.\n\n## Available Documentation Resources\n\nFor detailed documentation on each module, read the following resources:\n\n| Resource | URI | Description |\n|----------|-----|-------------|\n| Authentication | \\`spacelr://docs/auth\\` | Login, profile management |\n| Projects | \\`spacelr://docs/projects\\` | Project and member management |\n| OAuth Clients | \\`spacelr://docs/clients\\` | OAuth client management |\n| Database | \\`spacelr://docs/database\\` | Collections, documents, indexes, security rules |\n| Storage | \\`spacelr://docs/storage\\` | File upload, download, sharing, quotas |\n| Functions | \\`spacelr://docs/functions\\` | Serverless functions, deployments, KV store |\n| Hosting | \\`spacelr://docs/hosting\\` | Static site hosting, deployments, custom domains |\n| Email Templates | \\`spacelr://docs/email-templates\\` | Email template management |\n| Cron Jobs | \\`spacelr://docs/cron-jobs\\` | Scheduled job management |\n| Webhooks | \\`spacelr://docs/webhooks\\` | Webhook event delivery |\n| Notifications | \\`spacelr://docs/notifications\\` | Push notifications |\n| Audit Logs | \\`spacelr://docs/audit-logs\\` | Audit log viewing |\n| Best Practices | \\`spacelr://docs/best-practices\\` | Setup guide, credentials, recommended workflows |\n\n## Quick Start Workflow\n\n1. **Authenticate** - Call \\`auth_login\\` with your email and password.\n2. **Find your project** - Call \\`projects_list\\` to see available projects.\n3. **Use module tools** - Pass the \\`projectId\\` to any module-specific tool (e.g., \\`database_collections_list\\`, \\`storage_files_list\\`, \\`functions_list\\`).\n`;\n\nexport function registerGettingStartedResources(server: McpServer): void {\n server.registerResource(\n 'docs-getting-started',\n 'spacelr://docs/getting-started',\n {\n title: 'Getting Started - Spacelr Docs',\n description: 'Overview of the Spacelr platform, authentication flow, and available modules',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 1.0,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Authentication Tools\n\n## Overview\n\nThe authentication tools provide login, session inspection, and profile management for the Spacelr platform. After a successful login, the access token is stored automatically by the API client and used for all subsequent requests.\n\n## Tools Reference\n\n### auth_login\n\nAuthenticate with email and password.\n\n> **WARNING:** The password will be visible in the conversation context. Token values are redacted in the response.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|--------------------------|\n| email | string | Yes | A valid email address |\n| password | string | Yes | Password (min 1 character) |\n\n**Returns:** The login response with token values redacted.\n\n---\n\n### auth_me\n\nGet the currently authenticated user profile.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n\nThis tool takes no parameters. It returns the profile of the user associated with the current access token.\n\n---\n\n### auth_update_profile\n\nUpdate the currently authenticated user profile. At least one field must be provided.\n\n| Parameter | Type | Required | Description |\n|-------------|--------|----------|------------------------------|\n| firstName | string | No | Updated first name |\n| lastName | string | No | Updated last name |\n| displayName | string | No | Updated display name |\n\n**Returns:** The updated user profile with token values redacted.\n\n## Common Workflows\n\n### Login Flow\n\n1. Call \\`auth_login\\` with the user's email and password.\n2. On success the access token is stored automatically — no need to pass it manually.\n3. All subsequent tool calls will use the stored token for authentication.\n\n### Checking the Current Session\n\n1. Call \\`auth_me\\` to retrieve the profile tied to the stored token.\n2. If the call fails with an authentication error the token has expired or was never set — call \\`auth_login\\` again.\n\n### Updating a Profile\n\n1. Ensure you are logged in (call \\`auth_me\\` to verify).\n2. Call \\`auth_update_profile\\` with one or more fields to change.\n3. The response contains the full updated profile.\n\n## Tips\n\n- The access token is stored automatically after a successful \\`auth_login\\` call; you do not need to manage it yourself.\n- Token values are redacted in all responses to prevent leaking secrets into the conversation context.\n- Passwords are **not** redacted — avoid including real credentials in shared conversations.\n- If a request returns an authentication error, re-authenticate with \\`auth_login\\`.\n`;\n\nexport function registerAuthResources(server: McpServer): void {\n server.registerResource(\n 'docs-auth',\n 'spacelr://docs/auth',\n {\n title: 'Authentication - Spacelr Docs',\n description: 'Documentation for authentication tools: login, profile, and session management',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.9,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Project Management - Spacelr Docs\n\n## Overview\n\nProjects are the top-level organizational unit in Spacelr. Every resource (database collections, files, functions, etc.) belongs to a project. Use the project tools to create, configure, and manage projects, their members, and roles.\n\n## Tools Reference\n\n### projects_list\n\nList all projects the authenticated user has access to.\n\n| Parameter | Type | Required | Description |\n|-----------|----------|----------|-----------------------------------|\n| role | string | No | Filter projects by the user's role |\n\n---\n\n### projects_get\n\nGet a single project by its ID.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|--------------------|\n| projectId | string | Yes | The project's ID |\n\n---\n\n### projects_get_by_slug\n\nGet a single project by its slug.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|---------------------|\n| slug | string | Yes | The project's slug |\n\n---\n\n### projects_create\n\nCreate a new project.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|------------------------------------|\n| name | string | Yes | Display name of the project |\n| slug | string | Yes | URL-friendly identifier (unique) |\n| description | string | No | Short description of the project |\n| logoUrl | string | No | URL to the project logo (valid URL) |\n| websiteUrl | string | No | URL to the project website (valid URL) |\n\n---\n\n### projects_update\n\nUpdate an existing project. At least one optional field must be provided.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|------------------------------------|\n| projectId | string | Yes | The project's ID |\n| name | string | No | New display name |\n| description| string | No | New description |\n| logoUrl | string | No | New logo URL (valid URL) |\n| websiteUrl | string | No | New website URL (valid URL) |\n\n---\n\n### projects_delete\n\nDelete a project by its ID. This action is irreversible.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|--------------------|\n| projectId | string | Yes | The project's ID |\n\n---\n\n### projects_members_list\n\nList members of a project with optional pagination.\n\n| Parameter | Type | Required | Description |\n|-----------|---------|----------|--------------------------------|\n| projectId | string | Yes | The project's ID |\n| limit | integer | No | Number of results (1-100) |\n| offset | integer | No | Number of results to skip (>= 0)|\n\n---\n\n### projects_members_add\n\nAdd a member to a project by email with a specified role.\n\n| Parameter | Type | Required | Description |\n|-------------|----------|----------|---------------------------------------------------------------------|\n| projectId | string | Yes | The project's ID |\n| email | string | Yes | Email address of the user to add (must be a valid email) |\n| role | string | Yes | One of: \\`owner\\`, \\`admin\\`, \\`developer\\`, \\`member\\`, \\`viewer\\` |\n| permissions | string[] | No | Array of permission strings to grant |\n\n---\n\n### projects_members_update\n\nUpdate a project member's role, permissions, or console access. At least one optional field must be provided.\n\n| Parameter | Type | Required | Description |\n|--------------------|----------|----------|---------------------------------------------------------------------|\n| projectId | string | Yes | The project's ID |\n| memberId | string | Yes | The member's ID |\n| role | string | No | One of: \\`owner\\`, \\`admin\\`, \\`developer\\`, \\`member\\`, \\`viewer\\` |\n| permissions | string[] | No | Updated array of permission strings |\n| grantConsoleAccess | boolean | No | Whether to grant admin console access |\n\n---\n\n### projects_members_remove\n\nRemove a member from a project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|--------------------|\n| projectId | string | Yes | The project's ID |\n| memberId | string | Yes | The member's ID |\n\n---\n\n### projects_users_create\n\nCreate a new user within a project. **WARNING:** The password will be visible in the conversation context.\n\n| Parameter | Type | Required | Description |\n|--------------------|----------|----------|---------------------------------------------------------------------|\n| projectId | string | Yes | The project's ID |\n| username | string | Yes | Username for the new user |\n| email | string | Yes | Email address (must be a valid email) |\n| password | string | Yes | Password (min 1 character) |\n| role | string | Yes | One of: \\`owner\\`, \\`admin\\`, \\`developer\\`, \\`member\\`, \\`viewer\\` |\n| firstName | string | No | User's first name |\n| lastName | string | No | User's last name |\n| displayName | string | No | User's display name |\n| permissions | string[] | No | Array of permission strings |\n| grantConsoleAccess | boolean | No | Whether to grant admin console access |\n\n---\n\n### projects_role\n\nGet the current authenticated user's role in a specific project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|--------------------|\n| projectId | string | Yes | The project's ID |\n\n---\n\n## Common Workflows\n\n### Creating a New Project\n\n1. Call \\`projects_create\\` with a \\`name\\` and a unique \\`slug\\`.\n2. The response contains the new \\`projectId\\` - use it for all subsequent operations.\n3. Optionally call \\`projects_update\\` to add a logo or website URL.\n\n### Managing Members\n\n1. Use \\`projects_members_list\\` to see who is already in the project.\n2. Add a new member with \\`projects_members_add\\`, specifying their email and role.\n3. Change a member's role or permissions with \\`projects_members_update\\`.\n4. Remove a member with \\`projects_members_remove\\`.\n\n### Checking Your Role\n\nCall \\`projects_role\\` with the \\`projectId\\` to see what role you hold. This is useful before attempting operations that require elevated privileges.\n\n### Creating Project Users\n\nUse \\`projects_users_create\\` to provision a user directly inside a project. This creates the user account and assigns them a role in one step.\n\n## Tips\n\n- **Slug uniqueness** - Project slugs must be unique across the tenant. Choose a descriptive, URL-safe value (e.g., \\`my-app\\`, \\`acme-dashboard\\`).\n- **Role hierarchy** - Roles from most to least privileged: \\`owner\\` > \\`admin\\` > \\`developer\\` > \\`member\\` > \\`viewer\\`.\n- **Lookup by slug** - If you know a project's slug but not its ID, use \\`projects_get_by_slug\\` to resolve it.\n- **Pagination** - When listing members of large projects, use \\`limit\\` and \\`offset\\` to page through results.\n- **At least one field** - Both \\`projects_update\\` and \\`projects_members_update\\` require at least one optional field to be provided; calling them with no changes will return an error.\n- **Console access** - The \\`grantConsoleAccess\\` flag on member and user tools controls whether the user can access the admin console.\n`;\n\nexport function registerProjectResources(server: McpServer): void {\n server.registerResource(\n 'docs-projects',\n 'spacelr://docs/projects',\n {\n title: 'Projects - Spacelr Docs',\n description: 'Documentation for project management tools: create, update, members, and roles',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.9,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# OAuth Clients\n\n## Overview\n\nOAuth clients represent applications that authenticate users through the Spacelr OAuth service. Each client belongs to a project and defines how an application can request tokens, which scopes it may use, and where users are redirected after login.\n\nClients can be **confidential** (server-side apps that can keep a secret) or **public** (SPAs and mobile apps). Confidential clients receive a client secret on creation that is only shown once; use \\`clients_regenerate_secret\\` if it is lost.\n\nSecrets returned by list, get, create, and update operations are automatically redacted. Only \\`clients_regenerate_secret\\` returns the plaintext secret.\n\n---\n\n## Tools Reference\n\n### clients_list\n\nList all OAuth clients for a project.\n\n| Parameter | Type | Required | Description |\n|-------------|----------|----------|------------------------------------|\n| projectId | string | Yes | The project to list clients for |\n\n---\n\n### clients_get\n\nGet details of a specific OAuth client.\n\n| Parameter | Type | Required | Description |\n|-------------|----------|----------|---------------------------|\n| clientId | string | Yes | The ID of the client |\n\n---\n\n### clients_create\n\nCreate a new OAuth client for a project.\n\n| Parameter | Type | Required | Description |\n|----------------|------------|----------|-----------------------------------------------------|\n| projectId | string | Yes | The project the client belongs to |\n| name | string | Yes | Human-readable name for the client |\n| grantTypes | string[] | Yes | OAuth grant types (e.g. authorization_code, client_credentials) |\n| redirectUris | string[] | No | Valid redirect URIs (must be valid URLs) |\n| scopes | string[] | No | Scopes the client is allowed to request |\n| isConfidential | boolean | No | Whether the client is confidential (has a secret) |\n| corsOrigins | string[] | No | Allowed CORS origins for browser-based flows |\n| accessTokenTtl | number | No | Access token time-to-live in seconds |\n\n---\n\n### clients_update\n\nUpdate an existing OAuth client. At least one optional field must be provided.\n\n| Parameter | Type | Required | Description |\n|----------------|------------|----------|-----------------------------------------------------|\n| clientId | string | Yes | The ID of the client to update |\n| name | string | No | Updated client name |\n| redirectUris | string[] | No | Updated redirect URIs (must be valid URLs) |\n| scopes | string[] | No | Updated scopes |\n| grantTypes | string[] | No | Updated grant types |\n| isActive | boolean | No | Enable or disable the client |\n| corsOrigins | string[] | No | Updated CORS origins |\n| accessTokenTtl | number | No | Updated access token TTL in seconds |\n\n---\n\n### clients_delete\n\nDelete an OAuth client.\n\n| Parameter | Type | Required | Description |\n|-------------|----------|----------|--------------------------------|\n| clientId | string | Yes | The ID of the client to delete |\n\n---\n\n### clients_regenerate_secret\n\nRegenerate the secret for an OAuth client. The new secret is returned in plaintext and can only be retrieved at this moment.\n\n| Parameter | Type | Required | Description |\n|-------------|----------|----------|-------------------------------------------|\n| clientId | string | Yes | The ID of the client to regenerate for |\n\n---\n\n## Common Workflows\n\n### Creating a client for your application\n\n1. Use \\`clients_create\\` with at least \\`projectId\\`, \\`name\\`, and \\`grantTypes\\`.\n - For a web app with login flow, use \\`grantTypes: [\"authorization_code\"]\\` and provide \\`redirectUris\\`.\n - For a backend service, use \\`grantTypes: [\"client_credentials\"]\\` and set \\`isConfidential: true\\`.\n2. Store the returned client ID (and secret, if confidential) securely.\n\n### Regenerating a lost or compromised secret\n\n1. Call \\`clients_regenerate_secret\\` with the \\`clientId\\`.\n2. Copy the new secret from the response immediately -- it will not be shown again.\n3. Update your application configuration with the new secret.\n\n### Disabling a client temporarily\n\nCall \\`clients_update\\` with \\`isActive: false\\`. Re-enable later with \\`isActive: true\\`.\n\n---\n\n## Tips\n\n- Secrets are only visible at creation time and when explicitly regenerated. All other responses redact them.\n- Always set \\`redirectUris\\` for authorization-code clients to prevent open-redirect attacks.\n- Use \\`corsOrigins\\` when the client is a browser-based SPA that calls the token endpoint directly.\n- Set a reasonable \\`accessTokenTtl\\` to balance security and user experience.\n`;\n\nexport function registerClientResources(server: McpServer): void {\n server.registerResource(\n 'docs-clients',\n 'spacelr://docs/clients',\n {\n title: 'OAuth Clients - Spacelr Docs',\n description: 'Documentation for OAuth client management tools: create, update, and credential rotation',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.7,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Database - Spacelr Documentation\n\n## Overview\n\nThe Spacelr Database is a **document database** with per-project data isolation, collection-based organization, flexible querying, and a powerful security rules engine. Each project gets its own dedicated database (\\`project_{projectId}\\`), and all operations are scoped to that project automatically.\n\nThe database module provides tools for:\n\n- **Collections** - Create, list, and delete collections\n- **Documents** - Insert, query, update, and delete documents within collections\n- **Security Rules** - Define access control and validation rules per collection\n- **Indexes** - Create and manage indexes for query performance\n- **Index Rules** - Declarative index definitions that can be synced\n- **Statistics** - View database usage statistics\n\n---\n\n## Key Concept: Rules-First Approach\n\n> **Collections are defined through security rules. You MUST set rules before inserting data.**\n\nThis is the single most important concept in the Spacelr database system. Without rules for a collection, **all operations are denied** by the \\`$other\\` catch-all rule. The correct workflow is always:\n\n1. Get the current rules (\\`database_rules_get\\`)\n2. Add your new collection rules to the existing rules object\n3. Set the updated rules (\\`database_rules_set\\`) - this automatically creates the collection\n4. Now you can insert and query documents\n\n**Do NOT** attempt to insert documents before setting rules - it will fail with a \"Rule denied\" error.\n\nThe \\`$other\\` catch-all rule should always be present to deny access to undefined collections:\n\n\\`\\`\\`json\n{\n \"$other\": {\n \".read\": \"false\",\n \".write\": \"false\"\n }\n}\n\\`\\`\\`\n\n---\n\n## Security Rules Syntax\n\nEach collection in the rules object supports the following rule types:\n\n| Rule | Purpose | Evaluated on |\n|------|---------|-------------|\n| \\`.create\\` | Controls document inserts | Insert operations |\n| \\`.read\\` | Controls document reads and queries | Read/find operations |\n| \\`.update\\` | Controls document updates | Update operations |\n| \\`.delete\\` | Controls document deletion | Delete operations |\n| \\`.validate\\` | Per-field validation expressions | Write operations |\n| \\`.schema\\` | Field type declarations | Write operations |\n\n### Available Context Variables\n\nRules are JavaScript-like expressions that have access to:\n\n| Variable | Description |\n|----------|-------------|\n| \\`auth.uid\\` | The authenticated user's ID (undefined if not authenticated) |\n| \\`auth.role\\` | The authenticated user's role in the project (e.g., \\`'owner'\\`, \\`'admin'\\`) |\n| \\`newData\\` | The document data being written (available in create/update/validate rules) |\n\n### Rule Examples\n\n**Public read, authenticated create, admin delete:**\n\\`\\`\\`json\n{\n \"posts\": {\n \".create\": \"!!auth.uid\",\n \".read\": \"true\",\n \".update\": \"!!auth.uid\",\n \".delete\": \"auth.role === 'owner' || auth.role === 'admin'\"\n }\n}\n\\`\\`\\`\n\n**Admin-only access:**\n\\`\\`\\`json\n{\n \"settings\": {\n \".create\": \"auth.role === 'owner' || auth.role === 'admin'\",\n \".read\": \"auth.role === 'owner' || auth.role === 'admin'\",\n \".update\": \"auth.role === 'owner' || auth.role === 'admin'\",\n \".delete\": \"auth.role === 'owner' || auth.role === 'admin'\"\n }\n}\n\\`\\`\\`\n\n**Authenticated users only:**\n\\`\\`\\`json\n{\n \"messages\": {\n \".create\": \"!!auth.uid\",\n \".read\": \"!!auth.uid\",\n \".update\": \"!!auth.uid\",\n \".delete\": \"auth.role === 'owner' || auth.role === 'admin'\"\n }\n}\n\\`\\`\\`\n\n---\n\n## Tools Reference\n\n### Collections\n\n#### \\`database_collections_list\\`\nList all collections in a project database.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n\n#### \\`database_collections_create\\`\nCreate a new collection in a project database.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`name\\` | string | Yes | Collection name |\n| \\`description\\` | string | No | Optional description |\n\n#### \\`database_collections_delete\\`\nDelete a collection from a project database.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`name\\` | string | Yes | Collection name to delete |\n\n---\n\n### Security Rules\n\n#### \\`database_rules_get\\`\nGet the current security rules for a project database.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n\n#### \\`database_rules_set\\`\nSet security rules for a project database. Setting rules for a collection automatically creates it.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`rules\\` | object | Yes | The complete rules object (Record<string, unknown>) |\n| \\`expectedVersion\\` | number | No | Optimistic concurrency version to prevent conflicting updates |\n\n#### \\`database_rules_validate\\`\nValidate security rules without applying them. Use this to check rules syntax before committing.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`rules\\` | object | Yes | The rules object to validate (Record<string, unknown>) |\n\n---\n\n### Index Rules\n\n#### \\`database_index_rules_get\\`\nGet the declarative index rules for a project database.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n\n#### \\`database_index_rules_sync\\`\nSync index rules for a project database. This applies declarative index definitions.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`indexRules\\` | object | Yes | The index rules object (Record<string, unknown>) |\n\n---\n\n### Indexes\n\n#### \\`database_indexes_list\\`\nList all indexes for a collection.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`collectionName\\` | string | Yes | The collection name |\n\n#### \\`database_indexes_create\\`\nCreate a new index on a collection.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`collectionName\\` | string | Yes | The collection name |\n| \\`fields\\` | object | Yes | Index field definitions. Keys are field names, values are \\`1\\` (ascending), \\`-1\\` (descending), or \\`\"text\"\\` (text index) |\n| \\`unique\\` | boolean | No | Whether the index enforces uniqueness |\n| \\`sparse\\` | boolean | No | Whether the index is sparse (skips documents missing the field) |\n| \\`ttlSeconds\\` | number | No | Time-to-live in seconds for automatic document expiration |\n\n#### \\`database_indexes_delete\\`\nDelete an index from a collection.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`collectionName\\` | string | Yes | The collection name |\n| \\`indexName\\` | string | Yes | The name of the index to delete |\n\n---\n\n### Documents\n\n#### \\`database_documents_find\\`\nQuery documents in a collection with optional filtering, sorting, projection, pagination.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`collectionName\\` | string | Yes | The collection name |\n| \\`filter\\` | object | No | MongoDB-style query filter (Record<string, unknown>) |\n| \\`sort\\` | object | No | Sort specification. Keys are field names, values are \\`1\\` (ascending) or \\`-1\\` (descending) |\n| \\`fields\\` | string[] | No | Array of field names to include in the result (projection) |\n| \\`limit\\` | number | No | Maximum number of documents to return (1-100) |\n| \\`offset\\` | number | No | Number of documents to skip (min 0) |\n\n#### \\`database_documents_insert\\`\nInsert one or more documents into a collection.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`collectionName\\` | string | Yes | The collection name |\n| \\`documents\\` | object[] | Yes | Array of documents to insert (1-500 documents) |\n\n#### \\`database_documents_update\\`\nUpdate a specific document in a collection by its ID.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`collectionName\\` | string | Yes | The collection name |\n| \\`docId\\` | string | Yes | The document ID to update |\n| \\`update\\` | object | Yes | The update operations to apply (Record<string, unknown>) |\n\n#### \\`database_documents_delete\\`\nDelete a specific document from a collection by its ID.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n| \\`collectionName\\` | string | Yes | The collection name |\n| \\`docId\\` | string | Yes | The document ID to delete |\n\n---\n\n### Statistics\n\n#### \\`database_stats\\`\nGet database statistics for a project (storage size, document counts, etc.).\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID |\n\n---\n\n## Common Workflows\n\n### Setting Up a New Collection\n\n\\`\\`\\`\n1. database_rules_get -> get current rules\n2. database_rules_set -> add new collection rules to existing rules\n3. database_indexes_create -> (optional) add indexes for query performance\n4. database_documents_insert -> start inserting data\n\\`\\`\\`\n\n### CRUD Operations\n\n\\`\\`\\`\nCreate: database_documents_insert (batch up to 500 documents)\nRead: database_documents_find (with filter, sort, fields, limit, offset)\nUpdate: database_documents_update (by document ID)\nDelete: database_documents_delete (by document ID)\n\\`\\`\\`\n\n### Managing Indexes\n\n\\`\\`\\`\n1. database_indexes_list -> see existing indexes\n2. database_indexes_create -> add new index (ascending, descending, or text)\n3. database_indexes_delete -> remove unused indexes\n\\`\\`\\`\n\nAlternatively, use **index rules** for declarative index management:\n\n\\`\\`\\`\n1. database_index_rules_get -> see current index rule definitions\n2. database_index_rules_sync -> apply updated index rules (adds/removes as needed)\n\\`\\`\\`\n\n### Validating Rules Before Applying\n\n\\`\\`\\`\n1. database_rules_validate -> check syntax without applying\n2. database_rules_set -> apply once validation passes\n\\`\\`\\`\n\nUse the \\`expectedVersion\\` parameter on \\`database_rules_set\\` for optimistic concurrency control when multiple users might be editing rules simultaneously.\n\n---\n\n## Data Isolation\n\nEach project has its own isolated database (\\`project_{projectId}\\`). This means:\n\n- Collections are scoped to the project automatically\n- No cross-project data access is possible\n- Deleting a project's database does not affect other projects\n- Security rules are defined per project\n\nAlways pass the correct \\`projectId\\` to every database tool call.\n\n---\n\n## Tips and Gotchas\n\n1. **Always set rules first.** The most common mistake is trying to insert documents into a collection that has no rules defined. Without rules, the \\`$other\\` catch-all denies all access.\n\n2. **Rules replace, not merge.** When calling \\`database_rules_set\\`, you must pass the **complete** rules object including all collections. Always \\`database_rules_get\\` first, modify the result, then \\`database_rules_set\\` with the full object.\n\n3. **The \\`$other\\` catch-all is essential.** Always include \\`\"$other\": { \".read\": \"false\", \".write\": \"false\" }\\` in your rules to deny access to undefined collections.\n\n4. **Document find has a max limit of 100.** Use \\`offset\\` for pagination when you need more results.\n\n5. **Batch inserts max out at 500 documents.** Split larger datasets into multiple \\`database_documents_insert\\` calls.\n\n6. **Use \\`database_rules_validate\\` before \\`database_rules_set\\`.** This catches syntax errors without affecting your live rules.\n\n7. **Index creation fields accept three values:** \\`1\\` (ascending), \\`-1\\` (descending), or \\`\"text\"\\` (full-text search).\n\n8. **TTL indexes** auto-delete documents after the specified \\`ttlSeconds\\`. Useful for session data, logs, or temporary records.\n\n9. **Sparse indexes** skip documents that do not contain the indexed field. Useful for optional fields where you only want to index documents that have the field.\n\n10. **Use \\`expectedVersion\\` for safe rule updates.** This prevents accidentally overwriting rule changes made by another user or process.\n\n11. **Serverless functions** can access the database using \\`spacelr.db.collection(\"collectionName\")\\` - the same security rules apply.\n`;\n\nexport function registerDatabaseResources(server: McpServer): void {\n server.registerResource(\n 'docs-database',\n 'spacelr://docs/database',\n {\n title: 'Database - Spacelr Docs',\n description: 'Documentation for database tools: collections, documents, indexes, and security rules',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.8,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Hosting Tools\n\n## Overview\n\nThe hosting tools provide static site hosting capabilities for Spacelr projects. You can create deployments, upload site files, manage custom domains, and configure hosting behaviour such as SPA mode and custom headers.\n\n## Tools Reference\n\n### Deployments\n\n#### hosting_deployments_list\n\nList deployments for a hosting project.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-----------------------------------|\n| projectId | string | Yes | Project ID |\n| limit | number | No | Max results (1-100) |\n| offset | number | No | Pagination offset (min 0) |\n\n---\n\n#### hosting_deployments_get\n\nGet details of a specific deployment.\n\n| Parameter | Type | Required | Description |\n|--------------|--------|----------|---------------|\n| projectId | string | Yes | Project ID |\n| deploymentId | string | Yes | Deployment ID |\n\n---\n\n#### hosting_deployments_create\n\nCreate a new deployment for a hosting project.\n\n| Parameter | Type | Required | Description |\n|-------------|--------|----------|------------------------------------------|\n| projectId | string | Yes | Project ID |\n| description | string | No | Human-readable deployment description |\n| framework | string | No | Framework identifier (e.g. \"react\") |\n\n**Returns:** The newly created deployment object including its \\`deploymentId\\`.\n\n---\n\n#### hosting_deployments_upload\n\nUpload files to an existing hosting deployment. Accepts a record of filename to content, bundles them into a ZIP archive, and uploads it.\n\n| Parameter | Type | Required | Description |\n|--------------|-------------------------|----------|-----------------------------------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| deploymentId | string | Yes | Deployment ID (from \\`hosting_deployments_create\\`) |\n| files | Record<string, string> | Yes | Map of file path to file content (e.g. \\`{ \"index.html\": \"<!DOCTYPE html>...\" }\\`) |\n\nKeys are file paths inside the archive (e.g. \\`\"index.html\"\\`, \\`\"assets/style.css\"\\`). Values are the UTF-8 file contents. At least one file entry is required.\n\n**Returns:** Upload summary including the list of uploaded filenames and bundle size in bytes.\n\n---\n\n#### hosting_deployments_activate\n\nActivate a specific deployment, making it the live version.\n\n| Parameter | Type | Required | Description |\n|--------------|--------|----------|---------------|\n| projectId | string | Yes | Project ID |\n| deploymentId | string | Yes | Deployment ID |\n\n---\n\n#### hosting_deployments_status\n\nGet the status of a specific deployment.\n\n| Parameter | Type | Required | Description |\n|--------------|--------|----------|---------------|\n| projectId | string | Yes | Project ID |\n| deploymentId | string | Yes | Deployment ID |\n\n---\n\n#### hosting_deployments_delete\n\nDelete a specific deployment.\n\n| Parameter | Type | Required | Description |\n|--------------|--------|----------|---------------|\n| projectId | string | Yes | Project ID |\n| deploymentId | string | Yes | Deployment ID |\n\n---\n\n### Configuration\n\n#### hosting_config_get\n\nGet hosting configuration for a project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n\n---\n\n#### hosting_config_update\n\nUpdate hosting configuration for a project. At least one config field must be provided.\n\n| Parameter | Type | Required | Description |\n|-------------|------------------------|----------|------------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| spaMode | boolean | No | Enable single-page application mode |\n| defaultFile | string | No | Default file to serve (e.g. \\`\"index.html\"\\`) |\n| headers | Record<string, string> | No | Custom response headers (key-value pairs) |\n| enabled | boolean | No | Enable or disable hosting for the project |\n\n---\n\n### Domains\n\n#### hosting_domains_list\n\nList custom domains for a hosting project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n\n---\n\n#### hosting_domains_get\n\nGet details of a specific custom domain.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|----------------------|\n| projectId | string | Yes | Project ID |\n| domain | string | Yes | Domain name |\n\n---\n\n#### hosting_domains_add\n\nAdd a custom domain to a hosting project.\n\n| Parameter | Type | Required | Description |\n|--------------------|--------|----------|--------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| domain | string | Yes | Domain name to add |\n| projectSlug | string | Yes | Project slug |\n| verificationMethod | string | No | Verification method: \\`\"cname\"\\` or \\`\"txt\"\\` |\n\n---\n\n#### hosting_domains_verify\n\nVerify a custom domain for a hosting project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|----------------------|\n| projectId | string | Yes | Project ID |\n| domain | string | Yes | Domain name to verify |\n\n---\n\n#### hosting_domains_remove\n\nRemove a custom domain from a hosting project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|----------------------|\n| projectId | string | Yes | Project ID |\n| domain | string | Yes | Domain name to remove |\n\n---\n\n#### hosting_domains_set_primary\n\nSet a custom domain as the primary domain for a hosting project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|--------------------------------|\n| projectId | string | Yes | Project ID |\n| domain | string | Yes | Domain name to set as primary |\n\n## Common Workflows\n\n### Deploying a Static Site\n\n1. Call \\`hosting_deployments_create\\` with the \\`projectId\\` (and optionally \\`description\\` and \\`framework\\`) to create a new deployment.\n2. Call \\`hosting_deployments_upload\\` with the returned \\`deploymentId\\`, \\`projectId\\`, and a \\`files\\` map containing your site files.\n3. Call \\`hosting_deployments_activate\\` with the \\`projectId\\` and \\`deploymentId\\` to make the deployment live.\n\n### Managing Custom Domains\n\n1. Call \\`hosting_domains_add\\` with the \\`projectId\\`, \\`domain\\`, and \\`projectSlug\\` to register a custom domain.\n2. Configure the DNS records as instructed in the response.\n3. Call \\`hosting_domains_verify\\` to confirm DNS propagation and complete verification.\n4. Optionally call \\`hosting_domains_set_primary\\` to make it the primary domain.\n\n### Configuring Hosting Behaviour\n\n1. Call \\`hosting_config_get\\` to inspect the current configuration.\n2. Call \\`hosting_config_update\\` with the fields you want to change (e.g. enable \\`spaMode\\` for a single-page application, set custom \\`headers\\`, or change the \\`defaultFile\\`).\n\n### Reviewing Deployment Status\n\n1. Call \\`hosting_deployments_list\\` to see all deployments for a project.\n2. Call \\`hosting_deployments_status\\` or \\`hosting_deployments_get\\` for detailed information on a specific deployment.\n\n## Tips\n\n- Always create a deployment before uploading files — the \\`deploymentId\\` is required for the upload step.\n- A deployment is not live until you explicitly call \\`hosting_deployments_activate\\`.\n- The \\`files\\` parameter in \\`hosting_deployments_upload\\` accepts nested paths as keys (e.g. \\`\"assets/style.css\"\\`) — no need to flatten your file structure.\n- Enable \\`spaMode\\` in the hosting config when deploying single-page applications so that all routes fall back to the default file.\n- Use \\`hosting_deployments_list\\` with \\`limit\\` and \\`offset\\` to paginate through large numbers of deployments.\n- Domain verification may take time for DNS propagation — if \\`hosting_domains_verify\\` fails, wait and retry.\n`;\n\nexport function registerHostingResources(server: McpServer): void {\n server.registerResource(\n 'docs-hosting',\n 'spacelr://docs/hosting',\n {\n title: 'Hosting - Spacelr Docs',\n description: 'Documentation for static site hosting tools: deployments, domains, and configuration',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.7,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Storage\n\n## Overview\n\nThe Storage module provides file storage management capabilities for Spacelr projects. Users can list files, retrieve file details, delete files, manage file visibility, and share files within a project. Each user has a storage quota that limits how much data they can store, and storage tools also expose quota and usage statistics. Files support visibility controls (public/private) and can be shared with other users with configurable permissions.\n\n## Tools Reference\n\n### storage_files_list\n\nList files in storage for a project and user.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userId | string | Yes | The user ID whose files to list |\n| limit | integer | No | Number of files to return (1-100) |\n| offset | integer | No | Number of files to skip (min 0) |\n\n### storage_files_get\n\nGet details of a specific file in storage.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userId | string | Yes | The user ID |\n| fileId | string | Yes | The file ID to retrieve |\n\n### storage_files_delete\n\nDelete a specific file from storage.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userId | string | Yes | The user ID |\n| fileId | string | Yes | The file ID to delete |\n\n### storage_files_visibility\n\nUpdate the visibility of a specific file.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userId | string | Yes | The user ID |\n| fileId | string | Yes | The file ID to update |\n| visibility | enum | Yes | \\`\"public\"\\` or \\`\"private\"\\` |\n\n### storage_files_share\n\nShare a file with other users.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userId | string | Yes | The owner user ID |\n| fileId | string | Yes | The file ID to share |\n| userIds | string[] | Yes | Array of user IDs to share with |\n| permission | enum | No | \\`\"read\"\\` or \\`\"write\"\\` (defaults to read) |\n\n### storage_files_unshare\n\nRemove file sharing for specific users.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userId | string | Yes | The owner user ID |\n| fileId | string | Yes | The file ID to unshare |\n| userIds | string[] | Yes | Array of user IDs to remove sharing for |\n\n### storage_quota_get\n\nGet storage quota information for a user in a project.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userId | string | Yes | The user ID |\n\n### storage_quota_set\n\nSet storage quota for a user in a project.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| targetUserId | string | Yes | The user ID to set the quota for |\n| quotaBytes | integer | Yes | Quota size in bytes (min 0) |\n\n### storage_project_stats\n\nGet storage statistics for a project.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| projectId | string | Yes | The project ID |\n\n## Common Workflows\n\n### Uploading and Managing Files\n\n1. **List existing files** - Call \\`storage_files_list\\` with the \\`projectId\\` and \\`userId\\` to see what is already stored.\n2. **Get file details** - Call \\`storage_files_get\\` with the \\`fileId\\` to inspect metadata such as size, type, and visibility.\n3. **Delete unwanted files** - Call \\`storage_files_delete\\` to remove a file and free up quota.\n\n### Sharing Files\n\n1. **Share a file** - Call \\`storage_files_share\\` with the target \\`userIds\\` and an optional \\`permission\\` level (\\`\"read\"\\` or \\`\"write\"\\`).\n2. **Revoke access** - Call \\`storage_files_unshare\\` with the \\`userIds\\` to remove their access.\n3. **Set visibility** - Call \\`storage_files_visibility\\` to make a file \\`\"public\"\\` (accessible via URL) or \\`\"private\"\\` (requires authentication).\n\n### Managing Quotas\n\n1. **Check user quota** - Call \\`storage_quota_get\\` to see how much storage a user has used and their limit.\n2. **Update quota** - Call \\`storage_quota_set\\` with \\`targetUserId\\` and \\`quotaBytes\\` to increase or decrease the allowed storage.\n3. **Review project stats** - Call \\`storage_project_stats\\` to get an overview of total storage usage across the entire project.\n\n## Tips\n\n- Use \\`limit\\` and \\`offset\\` in \\`storage_files_list\\` to paginate through large file collections.\n- Check \\`storage_quota_get\\` before uploading large files to verify sufficient remaining quota.\n- Set files to \\`\"public\"\\` visibility only when they need to be accessible without authentication (e.g., profile images, public assets).\n- When sharing files, prefer \\`\"read\"\\` permission unless the recipient needs to modify the file.\n- Use \\`storage_project_stats\\` to monitor overall project storage consumption and plan capacity.\n`;\n\nexport function registerStorageResources(server: McpServer): void {\n server.registerResource(\n 'docs-storage',\n 'spacelr://docs/storage',\n {\n title: 'Storage - Spacelr Docs',\n description: 'Documentation for file storage tools: listing, sharing, visibility, and quotas',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.8,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Serverless Functions\n\n## Overview\n\nServerless functions let you run custom JavaScript code in an isolated V8 sandbox. Functions can be triggered manually, on a cron schedule, via webhook, or in response to platform events. Each function gets its own KV store, environment variables, and access to platform APIs (database, storage, email, notifications).\n\nThe runtime is **NOT Node.js** -- it is an isolated V8 sandbox (via isolated-vm). There is no \\`require()\\`, no static ES module \\`import\\` declarations, and no Node.js built-ins (\\`fs\\`, \\`path\\`, \\`crypto\\`, \\`Buffer\\`, \\`process\\`, etc.). Top-level \\`await\\` is supported, and local bundled modules can be loaded dynamically with \\`await import('./lib.js')\\`. All platform APIs are pre-injected globals.\n\n## Tools Reference\n\n### CRUD Operations\n\n#### functions_list\n\nList all functions for a project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n\n---\n\n#### functions_get\n\nGet details of a specific function.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n#### functions_create\n\nCreate a new serverless function in a project.\n\n| Parameter | Type | Required | Description |\n|----------------|---------|----------|--------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| name | string | Yes | Function name (1-255 chars) |\n| description | string | No | Description (max 1000 chars) |\n| entryPoint | string | No | Entry point file (max 255 chars, default: index.js) |\n| cronExpression | string | No | Cron expression for scheduled execution |\n| cronTimezone | string | No | Timezone for cron (e.g. \"Europe/Berlin\") |\n| timeout | integer | No | Execution timeout in ms (1000-120000, default: 30000) |\n| memoryLimitMb | integer | No | Memory limit in MB (16-512, default: 128) |\n| enabled | boolean | No | Whether the function is enabled |\n\n---\n\n#### functions_update\n\nUpdate an existing function. All fields except projectId and functionId are optional.\n\n| Parameter | Type | Required | Description |\n|----------------|---------|----------|--------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n| name | string | No | Function name (1-255 chars) |\n| description | string | No | Description (max 1000 chars) |\n| entryPoint | string | No | Entry point file (max 255 chars) |\n| cronExpression | string | No | Cron expression for scheduled execution |\n| cronTimezone | string | No | Timezone for cron |\n| timeout | integer | No | Execution timeout in ms (1000-120000) |\n| memoryLimitMb | integer | No | Memory limit in MB (16-512) |\n| enabled | boolean | No | Whether the function is enabled |\n\n---\n\n#### functions_delete\n\nDelete a function and its associated cron job.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n### Code & Deployments\n\n#### functions_get_code\n\nGet the deployed source code of a function with syntax-highlighted file contents.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n#### functions_deploy\n\nDeploy code to a serverless function. Accepts one or more files as a record of filename to content. The files are bundled into a ZIP archive and uploaded.\n\n| Parameter | Type | Required | Description |\n|------------|-------------------------|----------|--------------------------------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID (from functions_create or functions_list) |\n| files | Record<string, string> | Yes | Map of filename to file content (e.g. \\`{ \"index.js\": \"...\" }\\`) |\n| entryPoint | string | No | Entry point file inside the bundle (default: \"index.js\", max 255 chars) |\n\n**Example -- single file:**\n\\`\\`\\`json\n{ \"files\": { \"index.js\": \"const data = await fetch('https://api.example.com'); console.log(data.body);\" } }\n\\`\\`\\`\n\n**Example -- multiple files:**\n\\`\\`\\`json\n{ \"files\": { \"index.js\": \"const { greet } = await import('./lib.js'); console.log(greet());\", \"lib.js\": \"export const greet = () => 'hello';\" } }\n\\`\\`\\`\n\n---\n\n#### functions_deployments_list\n\nList all deployments (versions) of a function.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n### Execution\n\n#### functions_trigger\n\nManually trigger a function execution.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n#### functions_executions_list\n\nList recent executions of a function with status, duration, and logs.\n\n| Parameter | Type | Required | Description |\n|------------|---------|----------|--------------------------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n| limit | integer | No | Max results to return (1-100) |\n| offset | integer | No | Number of results to skip (>= 0) |\n\n---\n\n### Webhooks\n\n#### functions_enable_webhook\n\nEnable webhook trigger for a function. Returns a one-time webhook secret.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n#### functions_regenerate_webhook_secret\n\nRegenerate the webhook secret for a function. The old secret stops working immediately.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n#### functions_disable_webhook\n\nDisable webhook trigger for a function. The webhook secret is deleted.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n### Environment Variables\n\n#### functions_get_env_vars\n\nGet environment variables for a function (decrypted). Use these to store API keys and secrets.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n#### functions_set_env_vars\n\nSet environment variables for a function. Merges with existing vars. Values are encrypted at rest.\n\n| Parameter | Type | Required | Description |\n|------------|------------------------|----------|--------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n| variables | Record<string, string> | Yes | Key-value pairs to set (merged with existing) |\n\n---\n\n### KV Store\n\n#### functions_kv_list\n\nList KV store keys for a function.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| functionId | string | Yes | Function ID |\n\n---\n\n## Sandbox API Quick Reference\n\nThese globals are available inside function code at runtime:\n\n| API | Usage |\n|-----|-------|\n| \\`console.log/warn/error/info()\\` | Captured to execution logs (1MB buffer) |\n| \\`await fetch(url, options?)\\` | HTTP client. Returns \\`{ status, headers, body }\\` where body is a string. 10s timeout, 5MB limit. |\n| \\`env.get(key)\\` | Read environment variables (read-only) |\n| \\`await kv.get(key)\\` | Get a KV value (string or null) |\n| \\`await kv.set(key, value, ttlSeconds?)\\` | Set a KV value (256KB max, 30-day default TTL) |\n| \\`await kv.delete(key)\\` | Delete a KV key |\n| \\`await kv.list(prefix?)\\` | List KV keys (1000 max per function) |\n| \\`await spacelr.db.collection(name).find(filter?, options?)\\` | Query documents |\n| \\`await spacelr.db.collection(name).insertOne(doc)\\` | Insert one document |\n| \\`await spacelr.db.collection(name).insertMany(docs)\\` | Insert multiple documents |\n| \\`await spacelr.storage.list/getInfo/getDownloadUrl()\\` | Access project storage |\n| \\`await spacelr.email.send({ to, template, variables })\\` | Send template email |\n| \\`await spacelr.email.sendRaw({ to, subject, html })\\` | Send raw HTML email |\n| \\`await spacelr.notifications.send({ userId, title, body, data? })\\` | Send push notification |\n| \\`await spacelr.notifications.sendMany({ userIds, title, body, data? })\\` | Send to multiple users |\n\n**Trigger context globals** (available depending on trigger type):\n- \\`event\\`: \\`{ type, data, timestamp }\\` -- for event-triggered executions\n- \\`payload\\`: \\`{ ... }\\` -- for webhook-triggered executions (the POST body)\n\n## Common Workflows\n\n### Creating and Deploying a Function\n\n1. **Create** the function with \\`functions_create\\` (provide name, optional timeout/memory settings).\n2. **Deploy** code with \\`functions_deploy\\` -- pass your source files as a \\`files\\` record.\n3. **Trigger** manually with \\`functions_trigger\\` to test.\n4. **Check results** with \\`functions_executions_list\\` to see status, duration, and logs.\n5. **Review code** with \\`functions_get_code\\` to verify what is deployed.\n\n### Scheduled Execution (Cron)\n\n1. Create or update the function with a \\`cronExpression\\` (e.g. \\`\"0 */6 * * *\"\\` for every 6 hours).\n2. Optionally set \\`cronTimezone\\` (e.g. \\`\"Europe/Berlin\"\\`).\n3. The function runs automatically on schedule when \\`enabled\\` is true.\n\n### Using the KV Store\n\nInside function code, use the \\`kv\\` global to persist data across executions:\n\\`\\`\\`js\nconst lastRun = await kv.get(\"lastRun\");\nconsole.log(\"Last run:\", lastRun);\nawait kv.set(\"lastRun\", new Date().toISOString());\n\\`\\`\\`\n\nManage KV entries externally with \\`functions_kv_list\\`.\n\n### Setting Up Webhooks\n\n1. **Enable** the webhook with \\`functions_enable_webhook\\` -- save the returned secret.\n2. **Call** the webhook endpoint: \\`POST /api/v1/functions/{projectId}/{functionId}/invoke\\` with header \\`X-Webhook-Secret: <secret>\\`.\n3. Inside the function, read the POST body from the \\`payload\\` global.\n4. **Rotate** the secret with \\`functions_regenerate_webhook_secret\\` (old secret stops immediately).\n5. **Disable** with \\`functions_disable_webhook\\` when no longer needed.\n\n### Environment Variables\n\n1. **Set** variables with \\`functions_set_env_vars\\` (merges with existing vars, encrypted at rest).\n2. **Read** inside function code with \\`env.get(\"MY_API_KEY\")\\`.\n3. **List** current variables with \\`functions_get_env_vars\\`.\n\n## Tips\n\n- The runtime is an isolated V8 sandbox, not Node.js. Do not use \\`require()\\`, \\`import\\`, or Node.js built-ins.\n- \\`fetch()\\` returns \\`{ status, headers, body }\\` where \\`body\\` is always a **string**. Use \\`JSON.parse(response.body)\\` for JSON APIs.\n- If using \\`spacelr.db\\`, database rules must be set on the collection **before** the function writes to it. Without rules, inserts will fail with \"Rule denied\".\n- Store secrets in environment variables (\\`functions_set_env_vars\\`), not hardcoded in function code.\n- KV store values are capped at 256KB and 1000 keys per function with a 30-day default TTL.\n- Resource limits: 120s max timeout, 512MB max memory, 10MB max code bundle, 10 concurrent executions per project.\n- Use \\`functions_deployments_list\\` to see deployment history and roll back if needed.\n`;\n\nexport function registerFunctionResources(server: McpServer): void {\n server.registerResource(\n 'docs-functions',\n 'spacelr://docs/functions',\n {\n title: 'Serverless Functions - Spacelr Docs',\n description: 'Documentation for serverless function tools: deployment, execution, environment variables, KV store, and webhooks',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.8,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Email Template Tools\n\n## Overview\n\nThe email template tools allow you to manage project-specific email templates in Spacelr. Templates use **MJML** for responsive email markup and **Handlebars** for variable interpolation. Each template has a \\`type\\` that identifies its purpose (e.g. \"verify-email\", \"welcome\", \"invoice\").\n\nThe system supports a layered resolution model: project-specific templates override system defaults. System default templates (those without a \\`projectId\\`) cannot be deleted.\n\n## Tools Reference\n\n### email_templates_list\n\nList all email templates for a project (includes system defaults).\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|------------------------------------|\n| projectId | string | Yes | The project ID to list templates for |\n\n**Returns:** An array of email template objects including both project-specific and system default templates.\n\n---\n\n### email_templates_get\n\nGet a single email template by ID.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|------------------------|\n| id | string | Yes | The email template ID |\n\n**Returns:** The full email template object.\n\n---\n\n### email_templates_create\n\nCreate a new project-specific email template. The type identifies the template purpose (e.g. \"verify-email\", \"welcome\", \"invoice\").\n\n| Parameter | Type | Required | Description |\n|------------|----------|----------|-----------------------------------------------------|\n| projectId | string | Yes | The project this template belongs to |\n| type | string | Yes | Template type identifier (e.g. \"verify-email\") |\n| name | string | Yes | Human-readable template name |\n| subject | string | Yes | Email subject line (supports Handlebars variables) |\n| mjmlSource | string | Yes | MJML markup for the email body |\n| variables | string[] | No | List of variable names used in the template |\n| isActive | boolean | No | Whether the template is active |\n\n**Returns:** The created email template object.\n\n---\n\n### email_templates_update\n\nUpdate an existing email template. At least one field must be provided.\n\n| Parameter | Type | Required | Description |\n|------------|----------|----------|-----------------------------------------------------|\n| id | string | Yes | The email template ID to update |\n| name | string | No | Updated human-readable template name |\n| subject | string | No | Updated email subject line |\n| mjmlSource | string | No | Updated MJML markup |\n| variables | string[] | No | Updated list of variable names |\n| isActive | boolean | No | Updated active state |\n\n**Returns:** The updated email template object.\n\n---\n\n### email_templates_delete\n\nDelete an email template. System default templates cannot be deleted.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|----------------------------------|\n| id | string | Yes | The email template ID to delete |\n\n**Returns:** Confirmation message or the deleted template object.\n\n---\n\n### email_templates_preview\n\nPreview a compiled email template. Renders MJML to HTML and applies Handlebars variables.\n\n| Parameter | Type | Required | Description |\n|-----------|----------------------------|----------|------------------------------------------------------|\n| mjmlSource | string | Yes | MJML markup to render |\n| variables | Record<string, unknown> | No | Key-value map of Handlebars variables to interpolate |\n\n**Returns:** The rendered HTML output of the template.\n\n## Common Workflows\n\n### Creating a Project-Specific Template\n\n1. Call \\`email_templates_list\\` with a \\`projectId\\` to see existing templates and system defaults.\n2. Call \\`email_templates_create\\` with the project ID, a type, name, subject, and MJML source.\n3. Use \\`email_templates_preview\\` to verify the rendered output before activating.\n\n### Previewing a Template\n\n1. Call \\`email_templates_preview\\` with your MJML source and an optional variables map.\n2. Inspect the returned HTML to verify layout and variable substitution.\n3. Iterate on the MJML source until the output looks correct.\n\n### Updating an Existing Template\n\n1. Call \\`email_templates_get\\` with the template ID to retrieve the current state.\n2. Call \\`email_templates_update\\` with the ID and only the fields you want to change.\n3. Use \\`email_templates_preview\\` to verify the changes render correctly.\n\n### Overriding a System Default\n\n1. Call \\`email_templates_list\\` with the project ID to find the system default you want to override.\n2. Note the \\`type\\` of the system default template.\n3. Call \\`email_templates_create\\` with the same \\`type\\` but your project ID and custom MJML source.\n4. The project-specific template will now take priority over the system default.\n\n## Tips\n\n- Use \\`email_templates_preview\\` to test MJML rendering without saving — this is the fastest way to iterate on template design.\n- The \\`variables\\` array on a template is informational — it documents which Handlebars variables the template expects but does not enforce them.\n- When previewing, pass sample data in the \\`variables\\` parameter to verify Handlebars interpolation works as expected.\n- System default templates (\\`projectId: null\\`) cannot be deleted. Create a project-specific template with the same type to override them.\n- MJML documentation is available at https://mjml.io/documentation/ for markup reference.\n`;\n\nexport function registerEmailTemplateResources(server: McpServer): void {\n server.registerResource(\n 'docs-email-templates',\n 'spacelr://docs/email-templates',\n {\n title: 'Email Templates - Spacelr Docs',\n description: 'Documentation for email template tools: create, update, preview, and manage templates',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.6,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Cron Job Tools\n\n## Overview\n\nThe cron job tools allow you to schedule, manage, and monitor recurring tasks within a Spacelr project. Jobs can invoke a webhook URL or trigger a serverless function on a cron schedule. Each job tracks its execution history so you can inspect past runs and diagnose failures.\n\n## Tools Reference\n\n### cron_jobs_list\n\nList all cron jobs for a project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n\n---\n\n### cron_jobs_get\n\nGet a single cron job by ID.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| jobId | string | Yes | Cron job ID |\n\n---\n\n### cron_jobs_create\n\nCreate a new cron job. When type is \\`webhook\\`, \\`url\\` is required. When type is \\`function\\`, \\`functionId\\` is required. \\`cronExpression\\` uses 5-field cron format.\n\n| Parameter | Type | Required | Description |\n|----------------|----------------------------|----------|-----------------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| name | string | Yes | Display name for the job |\n| cronExpression | string | Yes | 5-field cron expression (e.g. \\`0 0 * * *\\`) |\n| timezone | string | No | IANA timezone (e.g. \\`Europe/Berlin\\`) |\n| type | \\`\"webhook\"\\` \\\\| \\`\"function\"\\` | No | Job type — determines whether \\`url\\` or \\`functionId\\` is used |\n| functionId | string | No | Function to invoke (required when type is \\`function\\`) |\n| url | string (URL) | No | Webhook URL to call (required when type is \\`webhook\\`) |\n| secret | string | No | Secret for webhook signature verification |\n| payload | Record<string, unknown> | No | JSON payload sent with each execution |\n| retryAttempts | integer (0-10) | No | Number of retry attempts on failure |\n| timeout | integer (1000-120000) | No | Execution timeout in milliseconds |\n| enabled | boolean | No | Whether the job is active (defaults to true) |\n\n---\n\n### cron_jobs_update\n\nUpdate an existing cron job. At least one field (besides \\`projectId\\` and \\`jobId\\`) must be provided.\n\n| Parameter | Type | Required | Description |\n|----------------|----------------------------|----------|-----------------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| jobId | string | Yes | Cron job ID |\n| name | string | No | Updated display name |\n| cronExpression | string | No | Updated 5-field cron expression |\n| timezone | string | No | Updated IANA timezone |\n| type | \\`\"webhook\"\\` \\\\| \\`\"function\"\\` | No | Updated job type |\n| functionId | string | No | Updated function ID |\n| url | string (URL) | No | Updated webhook URL |\n| secret | string | No | Updated webhook secret |\n| payload | Record<string, unknown> | No | Updated JSON payload |\n| retryAttempts | integer (0-10) | No | Updated retry attempts |\n| timeout | integer (1000-120000) | No | Updated timeout in milliseconds |\n| enabled | boolean | No | Updated enabled state |\n\n---\n\n### cron_jobs_delete\n\nDelete a cron job.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| jobId | string | Yes | Cron job ID |\n\n---\n\n### cron_jobs_trigger\n\nManually trigger a cron job execution outside of its schedule.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| jobId | string | Yes | Cron job ID |\n\n---\n\n### cron_jobs_toggle\n\nToggle a cron job enabled or disabled.\n\n| Parameter | Type | Required | Description |\n|-----------|---------|----------|------------------------------------|\n| projectId | string | Yes | Project ID |\n| jobId | string | Yes | Cron job ID |\n| enabled | boolean | Yes | \\`true\\` to enable, \\`false\\` to disable |\n\n---\n\n### cron_jobs_executions\n\nList execution history for a cron job.\n\n| Parameter | Type | Required | Description |\n|-----------|-------------------|----------|--------------------------------|\n| projectId | string | Yes | Project ID |\n| jobId | string | Yes | Cron job ID |\n| limit | integer (1-100) | No | Max number of results |\n| offset | integer (>= 0) | No | Number of results to skip |\n\n---\n\n### cron_jobs_list_all\n\nList all cron jobs across projects (admin overview).\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|---------------------------------------|\n| projectId | string | No | Filter by project ID (omit for all) |\n\n---\n\n### cron_jobs_status\n\nGet the cron queue status (no parameters).\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n\nThis tool takes no parameters. It returns the current state of the cron processing queue.\n\n## Common Workflows\n\n### Creating a Webhook Cron Job\n\n1. Call \\`cron_jobs_create\\` with \\`projectId\\`, \\`name\\`, \\`cronExpression\\`, \\`type: \"webhook\"\\`, and \\`url\\`.\n2. Optionally set \\`secret\\` for signature verification and \\`payload\\` for a custom body.\n3. The job starts running on schedule immediately unless \\`enabled\\` is set to \\`false\\`.\n\n### Creating a Function Cron Job\n\n1. Call \\`cron_jobs_create\\` with \\`projectId\\`, \\`name\\`, \\`cronExpression\\`, \\`type: \"function\"\\`, and \\`functionId\\`.\n2. Optionally pass \\`payload\\` to provide input data to the function.\n3. Use \\`retryAttempts\\` and \\`timeout\\` to control failure handling.\n\n### Toggling a Job On/Off\n\n1. Call \\`cron_jobs_toggle\\` with the \\`projectId\\`, \\`jobId\\`, and \\`enabled: false\\` to pause or \\`enabled: true\\` to resume.\n\n### Checking Execution History\n\n1. Call \\`cron_jobs_executions\\` with \\`projectId\\` and \\`jobId\\`.\n2. Use \\`limit\\` and \\`offset\\` to paginate through results.\n3. Each execution record contains status, timestamps, and any error details.\n\n### Monitoring the Queue\n\n1. Call \\`cron_jobs_status\\` (no parameters) to inspect the queue health and processing state.\n2. Call \\`cron_jobs_list_all\\` to get an admin-level overview of all jobs across projects.\n\n## Tips\n\n- **Cron expression format:** Uses standard 5-field syntax — \\`minute hour day-of-month month day-of-week\\`. For example, \\`*/15 * * * *\\` runs every 15 minutes, \\`0 9 * * 1-5\\` runs at 09:00 on weekdays.\n- **Timezone:** Defaults to UTC if omitted. Use IANA timezone names such as \\`America/New_York\\` or \\`Europe/Berlin\\`.\n- **Retry and timeout:** \\`retryAttempts\\` (0-10) controls how many times a failed execution is retried. \\`timeout\\` (1000-120000 ms) sets the maximum execution duration before the run is aborted.\n- **Manual trigger:** Use \\`cron_jobs_trigger\\` to run a job immediately for testing — it does not affect the regular schedule.\n- **At least one field:** When calling \\`cron_jobs_update\\`, you must supply at least one field to change beyond \\`projectId\\` and \\`jobId\\`.\n`;\n\nexport function registerCronJobResources(server: McpServer): void {\n server.registerResource(\n 'docs-cron-jobs',\n 'spacelr://docs/cron-jobs',\n {\n title: 'Cron Jobs - Spacelr Docs',\n description: 'Documentation for cron job tools: scheduling, execution, and monitoring',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.6,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Webhook Tools\n\n## Overview\n\nThe webhook tools let you manage event subscriptions for a project. Webhooks send HTTP POST requests to a configured URL whenever specific events occur — such as user sign-ups, database writes, or file uploads. You can create, update, test, and monitor webhooks and their delivery history entirely through these tools.\n\n## Event Types\n\nThe following event types are available when creating or updating a webhook:\n\n| Category | Event |\n|-----------|------------------------------------|\n| User | \\`user.created\\` |\n| User | \\`user.updated\\` |\n| User | \\`user.deleted\\` |\n| User | \\`user.login\\` |\n| User | \\`user.email_verified\\` |\n| User | \\`user.password_reset_requested\\` |\n| User | \\`user.password_reset\\` |\n| User | \\`user.2fa_verified\\` |\n| Database | \\`database.insert\\` |\n| Database | \\`database.update\\` |\n| Database | \\`database.delete\\` |\n| Storage | \\`storage.upload\\` |\n| Storage | \\`storage.delete\\` |\n| Project | \\`project.created\\` |\n| Project | \\`project.updated\\` |\n\n## Tools Reference\n\n### webhooks_list\n\nList all webhooks for a project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n\n**Returns:** Array of webhook objects.\n\n---\n\n### webhooks_get\n\nGet a single webhook by ID.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| webhookId | string | Yes | Webhook ID |\n\n**Returns:** The webhook object.\n\n---\n\n### webhooks_create\n\nCreate a new webhook for a project.\n\n> **WARNING:** The response includes a secret that will be visible in the conversation context.\n\n| Parameter | Type | Required | Description |\n|-------------|-------------------------------|----------|---------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| url | string (URL) | Yes | Endpoint URL that will receive POST requests |\n| events | string[] (min 1) | Yes | Array of event types to subscribe to (see above) |\n| description | string | No | Human-readable description of the webhook |\n| headers | Record<string, string> | No | Custom HTTP headers sent with each delivery |\n| active | boolean | No | Whether the webhook is active |\n\n**Returns:** The created webhook object including its secret.\n\n---\n\n### webhooks_update\n\nUpdate an existing webhook. At least one optional field must be provided.\n\n| Parameter | Type | Required | Description |\n|-------------|-------------------------------|----------|---------------------------------------------------|\n| projectId | string | Yes | Project ID |\n| webhookId | string | Yes | Webhook ID |\n| url | string (URL) | No | Updated endpoint URL |\n| events | string[] (min 1) | No | Updated array of event types |\n| description | string | No | Updated description |\n| headers | Record<string, string> | No | Updated custom HTTP headers |\n| active | boolean | No | Enable or disable the webhook |\n\n**Returns:** The updated webhook object.\n\n---\n\n### webhooks_delete\n\nDelete a webhook.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| webhookId | string | Yes | Webhook ID |\n\n**Returns:** Confirmation that the webhook was deleted.\n\n---\n\n### webhooks_test\n\nSend a test ping to a webhook to verify the endpoint is reachable.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | Project ID |\n| webhookId | string | Yes | Webhook ID |\n\n**Returns:** The test delivery result.\n\n---\n\n### webhooks_deliveries\n\nList webhook delivery logs for a project. Optionally filter by a specific webhook.\n\n| Parameter | Type | Required | Description |\n|-----------|---------|----------|--------------------------------------|\n| projectId | string | Yes | Project ID |\n| webhookId | string | No | Filter deliveries to this webhook |\n| limit | integer | No | Number of results (1-100) |\n| offset | integer | No | Offset for pagination (min 0) |\n\n**Returns:** Array of delivery log entries.\n\n---\n\n### webhooks_delivery_retry\n\nRetry a failed webhook delivery.\n\n| Parameter | Type | Required | Description |\n|------------|--------|----------|----------------|\n| projectId | string | Yes | Project ID |\n| deliveryId | string | Yes | Delivery ID |\n\n**Returns:** The retry delivery result.\n\n## Common Workflows\n\n### Creating a Webhook\n\n1. Call \\`webhooks_create\\` with the \\`projectId\\`, target \\`url\\`, and at least one event type in \\`events\\`.\n2. Store the returned secret securely — it is used to verify delivery signatures on the receiving end.\n3. Use \\`webhooks_test\\` to send a test ping and confirm the endpoint responds correctly.\n\n### Testing a Webhook\n\n1. Call \\`webhooks_test\\` with the \\`projectId\\` and \\`webhookId\\`.\n2. Check the response for the HTTP status code returned by the endpoint.\n3. If the test fails, verify the URL is reachable and returns a 2xx status.\n\n### Checking Delivery History\n\n1. Call \\`webhooks_deliveries\\` with the \\`projectId\\` to list recent deliveries.\n2. Optionally pass \\`webhookId\\` to filter to a specific webhook.\n3. Use \\`limit\\` and \\`offset\\` for pagination through large delivery logs.\n\n### Retrying a Failed Delivery\n\n1. Identify the failed delivery ID from \\`webhooks_deliveries\\`.\n2. Call \\`webhooks_delivery_retry\\` with the \\`projectId\\` and \\`deliveryId\\`.\n3. Check the result to confirm the retry succeeded.\n\n### Disabling a Webhook\n\n1. Call \\`webhooks_update\\` with \\`active\\` set to \\`false\\` to pause deliveries without deleting the webhook.\n2. Set \\`active\\` back to \\`true\\` to re-enable it later.\n\n## Tips\n\n- Always call \\`webhooks_test\\` after creating or updating a webhook to verify the endpoint works.\n- Use \\`description\\` to document the purpose of each webhook for easier management.\n- Custom \\`headers\\` can be used to pass authentication tokens or API keys to the receiving endpoint.\n- The \\`events\\` array must contain at least one event type — an empty array is not allowed.\n- When updating a webhook, only the fields you provide will be changed; omitted fields remain unchanged.\n- Use \\`webhooks_deliveries\\` to monitor for failures and \\`webhooks_delivery_retry\\` to re-send missed events.\n- The webhook secret from \\`webhooks_create\\` is only shown once — treat it like a password.\n`;\n\nexport function registerWebhookResources(server: McpServer): void {\n server.registerResource(\n 'docs-webhooks',\n 'spacelr://docs/webhooks',\n {\n title: 'Webhooks - Spacelr Docs',\n description: 'Documentation for webhook tools: event subscriptions, deliveries, and testing',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.6,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Notification Tools\n\n## Overview\n\nThe notification tools manage web push notifications for Spacelr projects. The system supports three push providers — VAPID (Web Push), FCM (Firebase Cloud Messaging), and APNS (Apple Push Notification Service). Notification content is driven by Handlebars-based templates that can be customised per project, with system defaults as fallbacks.\n\n## Tools Reference\n\n### Templates\n\n#### notification_templates_list\n\nList all notification templates for a project (includes system defaults).\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | The project ID |\n\n---\n\n#### notification_templates_get\n\nGet a single notification template by ID.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| id | string | Yes | The template ID |\n\n---\n\n#### notification_templates_create\n\nCreate a new project-specific notification template. Variables use Handlebars syntax in \\`titleTemplate\\` and \\`bodyTemplate\\`.\n\n| Parameter | Type | Required | Description |\n|---------------|----------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| type | string | Yes | Template type identifier |\n| name | string | Yes | Human-readable template name |\n| titleTemplate | string | Yes | Handlebars template for the notification title |\n| bodyTemplate | string | Yes | Handlebars template for the notification body |\n| icon | string | No | URL of the notification icon |\n| defaultUrl | string | No | Default click-through URL |\n| variables | string[] | No | List of variable names used in the templates |\n| isActive | boolean | No | Whether the template is active |\n\n---\n\n#### notification_templates_update\n\nUpdate an existing notification template. At least one field must be provided.\n\n| Parameter | Type | Required | Description |\n|---------------|----------|----------|-------------|\n| id | string | Yes | The template ID |\n| name | string | No | Human-readable template name |\n| titleTemplate | string | No | Handlebars template for the notification title |\n| bodyTemplate | string | No | Handlebars template for the notification body |\n| icon | string | No | URL of the notification icon |\n| defaultUrl | string | No | Default click-through URL |\n| variables | string[] | No | List of variable names used in the templates |\n| isActive | boolean | No | Whether the template is active |\n\n---\n\n#### notification_templates_delete\n\nDelete a project notification template override (reverts to system default).\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| id | string | Yes | The template ID |\n\n---\n\n#### notification_templates_preview\n\nPreview a compiled notification template with Handlebars variables applied.\n\n| Parameter | Type | Required | Description |\n|---------------|-------------------------|----------|-------------|\n| titleTemplate | string | Yes | Handlebars template for the title |\n| bodyTemplate | string | Yes | Handlebars template for the body |\n| variables | Record<string, string> | Yes | Key-value map of variable values to substitute |\n\n---\n\n### Configuration\n\n#### notification_config_get\n\nGet push notification provider configuration for a project (VAPID, FCM, APNS).\n\n> **WARNING:** The response may include sensitive credentials that will be visible in the conversation context.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | The project ID |\n\n---\n\n#### notification_config_update\n\nUpdate push notification provider configuration. Supports VAPID, FCM, and APNS providers.\n\n> **WARNING:** \\`privateKey\\` and \\`serviceAccountJson\\` values are sensitive credentials that will be visible in the conversation context.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| vapid | object | No | VAPID (Web Push) configuration |\n| fcm | object | No | Firebase Cloud Messaging configuration |\n| apns | object | No | Apple Push Notification Service configuration |\n\n**vapid object:**\n\n| Field | Type | Required | Description |\n|------------|---------|----------|-------------|\n| publicKey | string | No | VAPID public key |\n| privateKey | string | No | VAPID private key |\n| subject | string | No | VAPID subject (usually a mailto: or URL) |\n| enabled | boolean | No | Whether VAPID is enabled |\n\n**fcm object:**\n\n| Field | Type | Required | Description |\n|--------------------|---------|----------|-------------|\n| serviceAccountJson | string | No | Firebase service account JSON |\n| enabled | boolean | No | Whether FCM is enabled |\n\n**apns object:**\n\n| Field | Type | Required | Description |\n|------------|---------|----------|-------------|\n| keyId | string | No | APNS key ID |\n| teamId | string | No | Apple Developer team ID |\n| privateKey | string | No | APNS private key |\n| bundleId | string | No | App bundle identifier |\n| production | boolean | No | Use production APNS environment |\n| enabled | boolean | No | Whether APNS is enabled |\n\n---\n\n#### notification_config_delete\n\nDelete push notification provider configuration. Specify a provider to delete only that one, or omit to delete all.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| provider | enum | No | Provider to delete: \\`vapid\\`, \\`fcm\\`, or \\`apns\\`. Omit to delete all. |\n\n---\n\n#### notification_config_generate_vapid\n\nGenerate a new VAPID key pair for web push notifications.\n\n> **WARNING:** The private key will be visible in the conversation context.\n\nThis tool takes no parameters.\n\n**Returns:** An object with \\`publicKey\\` and \\`privateKey\\` strings.\n\n---\n\n### Sending\n\n#### notifications_send\n\nSend a push notification to selected users.\n\n| Parameter | Type | Required | Description |\n|-----------|----------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| userIds | string[] | Yes | Array of user IDs to notify (min 1) |\n| title | string | Yes | Notification title |\n| body | string | Yes | Notification body text |\n| icon | string | No | URL of the notification icon |\n| url | string | No | Click-through URL |\n\n---\n\n#### notifications_broadcast\n\nBroadcast a push notification to all subscribed users in a project.\n\n| Parameter | Type | Required | Description |\n|-----------|--------|----------|-------------|\n| projectId | string | Yes | The project ID |\n| title | string | Yes | Notification title |\n| body | string | Yes | Notification body text |\n| icon | string | No | URL of the notification icon |\n| url | string | No | Click-through URL |\n\n## Common Workflows\n\n### Setting Up VAPID (Web Push)\n\n1. Call \\`notification_config_generate_vapid\\` to generate a new key pair.\n2. Call \\`notification_config_update\\` with the generated keys and a \\`subject\\` (e.g. \\`mailto:admin@example.com\\`) under the \\`vapid\\` object, setting \\`enabled: true\\`.\n3. Verify the configuration with \\`notification_config_get\\`.\n\n### Creating a Custom Template\n\n1. Call \\`notification_templates_list\\` to see existing templates and system defaults.\n2. Call \\`notification_templates_create\\` with a \\`type\\`, \\`name\\`, and Handlebars templates for title and body. For example: \\`titleTemplate: \"Hello {{userName}}\"\\`, \\`bodyTemplate: \"{{message}}\"\\`.\n3. Use \\`notification_templates_preview\\` to verify the template renders correctly with sample variables.\n\n### Sending Notifications to Specific Users\n\n1. Ensure push configuration is set up (see VAPID workflow above).\n2. Call \\`notifications_send\\` with the \\`projectId\\`, an array of \\`userIds\\`, and the notification \\`title\\` and \\`body\\`.\n3. Optionally include an \\`icon\\` URL and a click-through \\`url\\`.\n\n### Broadcasting to All Users\n\n1. Ensure push configuration is set up.\n2. Call \\`notifications_broadcast\\` with the \\`projectId\\`, \\`title\\`, and \\`body\\`.\n3. The notification will be delivered to all users with active push subscriptions in the project.\n\n## Tips\n\n- Always set up provider configuration (\\`notification_config_update\\`) before attempting to send notifications.\n- Use \\`notification_templates_preview\\` to test Handlebars templates before creating them — this avoids broken notifications reaching users.\n- Deleting a project template override with \\`notification_templates_delete\\` reverts to the system default; it does not remove the template entirely.\n- The \\`notification_config_generate_vapid\\` tool generates keys on the server — you do not need to generate them locally.\n- Be cautious with \\`notifications_broadcast\\` as it reaches all subscribed users in the project. Prefer \\`notifications_send\\` for targeted delivery.\n- Provider credentials (private keys, service account JSON) are sensitive. Avoid sharing conversations that contain these values.\n`;\n\nexport function registerNotificationResources(server: McpServer): void {\n server.registerResource(\n 'docs-notifications',\n 'spacelr://docs/notifications',\n {\n title: 'Notifications - Spacelr Docs',\n description: 'Documentation for push notification tools: configuration, templates, sending, and broadcasting',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.7,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Audit Logs\n\n## Overview\n\nAudit logs provide a detailed, immutable record of actions performed within a project. Every significant operation (user creation, client modification, database changes, etc.) is captured with metadata including the actor, timestamp, entity type, and action performed. Use the audit log tools to investigate activity, troubleshoot issues, and maintain compliance.\n\n## Tools Reference\n\n### audit_logs_list\n\nList audit logs for a project with optional filters.\n\n| Parameter | Type | Required | Description |\n|---------------|--------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID to query audit logs for |\n| \\`entityType\\` | enum | No | Filter by entity type. One of: \\`user\\`, \\`client\\`, \\`project\\`, \\`auth\\`, \\`database\\`, \\`storage\\` |\n| \\`action\\` | string | No | Filter by action name (e.g. \\`create\\`, \\`update\\`, \\`delete\\`) |\n| \\`startDate\\` | string | No | ISO 8601 datetime. Only return logs on or after this date |\n| \\`endDate\\` | string | No | ISO 8601 datetime. Only return logs on or before this date |\n| \\`limit\\` | number | No | Number of entries to return (1-100) |\n| \\`offset\\` | number | No | Number of entries to skip (min 0), for pagination |\n\n### audit_logs_get\n\nRetrieve a single audit log entry by its ID.\n\n| Parameter | Type | Required | Description |\n|--------------|--------|----------|-------------|\n| \\`projectId\\` | string | Yes | The project ID the log belongs to |\n| \\`logId\\` | string | Yes | The ID of the audit log entry |\n\n## Common Workflows\n\n### List recent activity for a project\n\nCall \\`audit_logs_list\\` with just the \\`projectId\\` to see the most recent log entries.\n\n### Filter by entity type\n\nPass \\`entityType\\` to narrow results, e.g. set \\`entityType\\` to \\`user\\` to see only user-related events.\n\n### Filter by date range\n\nProvide \\`startDate\\` and/or \\`endDate\\` as ISO 8601 strings to restrict the time window:\n- \\`startDate\\`: \\`\"2025-01-01T00:00:00Z\"\\`\n- \\`endDate\\`: \\`\"2025-01-31T23:59:59Z\"\\`\n\n### Paginate through results\n\nUse \\`limit\\` and \\`offset\\` together. For example, to fetch the second page of 25 results, set \\`limit\\` to 25 and \\`offset\\` to 25.\n\n### View details of a specific entry\n\nUse \\`audit_logs_get\\` with the \\`logId\\` obtained from a list result to retrieve the full entry with all metadata.\n\n## Tips\n\n- **Entity types**: \\`user\\`, \\`client\\`, \\`project\\`, \\`auth\\`, \\`database\\`, \\`storage\\` cover the main domains. Use them to focus queries on the area you care about.\n- **Date filtering**: Both \\`startDate\\` and \\`endDate\\` accept ISO 8601 datetime strings (e.g. \\`2025-06-15T08:00:00Z\\`). You can use one or both to define a range.\n- **Pagination**: The default result set may be limited. Always use \\`limit\\` and \\`offset\\` when you need to retrieve large numbers of entries.\n- **Action names**: Actions are free-form strings. Common values include \\`create\\`, \\`update\\`, \\`delete\\`, \\`login\\`, and \\`logout\\`, but the exact values depend on the operations your project performs.\n`;\n\nexport function registerAuditLogResources(server: McpServer): void {\n server.registerResource(\n 'docs-audit-logs',\n 'spacelr://docs/audit-logs',\n {\n title: 'Audit Logs - Spacelr Docs',\n description: 'Documentation for audit log tools: listing and viewing audit entries',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.5,\n },\n },\n async (uri: URL) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst DOCS = `# Best Practices & Setup Guide\n\nThis guide covers how to set up and use the Spacelr MCP server effectively. Follow these steps to ensure a smooth experience.\n\n## Initial Setup — Credentials\n\nThe MCP server needs valid credentials to interact with the Spacelr API. There are two ways to authenticate:\n\n### Option A: Use the Spacelr CLI (Recommended)\n\nInstall and log in via the CLI — this creates the credentials file automatically:\n\n\\`\\`\\`bash\nnpx @spacelr/cli login\n\\`\\`\\`\n\nThis opens a browser for OAuth authentication and stores credentials at:\n- **Global:** \\`~/.spacelr/credentials.json\\`\n- **Project-scoped:** \\`<projectDir>/.spacelr/credentials.json\\` (if \\`spacelr.json\\` exists)\n\n### Option B: Use the auth_login Tool\n\nIf the CLI is not available, use the \\`auth_login\\` MCP tool directly with email and password. The MCP server stores the returned token automatically.\n\n### Credential File Structure\n\n\\`\\`\\`json\n{\n \"accessToken\": \"eyJ...\",\n \"refreshToken\": \"refresh_...\",\n \"expiresAt\": 1712000000000,\n \"apiUrl\": \"https://api.spacelr.com/api/v1\"\n}\n\\`\\`\\`\n\n### Credential Lookup Order\n\n1. \\`SPACELR_AUTH_TOKEN\\` environment variable (highest priority)\n2. Project-scoped: \\`<projectDir>/.spacelr/credentials.json\\` (if \\`spacelr.json\\` found)\n3. Global fallback: \\`~/.spacelr/credentials.json\\`\n\n### Security\n\n- Credential files are created with restrictive permissions (\\`0o600\\` — owner read/write only)\n- The \\`.spacelr/\\` directory is automatically added to \\`.gitignore\\` to prevent accidental commits\n- Token refresh happens automatically when the token is within 60 seconds of expiration\n\n## Project Configuration — spacelr.json\n\nCreate a \\`spacelr.json\\` file in your project root to scope credentials and set defaults:\n\n\\`\\`\\`json\n{\n \"projectId\": \"your-project-id\",\n \"apiUrl\": \"https://api.spacelr.com/api/v1\",\n \"hosting\": {\n \"directory\": \"./dist\"\n }\n}\n\\`\\`\\`\n\nYou can also create this file using the CLI:\n\n\\`\\`\\`bash\nnpx @spacelr/cli init\n\\`\\`\\`\n\nThis will prompt you to select a project and configure hosting settings.\n\n**Benefits of having spacelr.json:**\n- Credentials are stored per-project in \\`.spacelr/credentials.json\\` (not globally)\n- The \\`projectId\\` is available as a default for tools that require it\n- Team members get consistent project configuration\n\n## Environment Variables\n\nFor CI/CD pipelines or automated environments, use environment variables instead of credential files:\n\n| Variable | Purpose |\n|----------|---------|\n| \\`SPACELR_AUTH_TOKEN\\` | Override authentication token directly |\n| \\`SPACELR_API_URL\\` | Override API endpoint URL |\n| \\`SPACELR_CLIENT_ID\\` | Override OAuth client ID |\n| \\`SPACELR_PROJECT_ID\\` | Override default project ID |\n\n\\`SPACELR_AUTH_TOKEN\\` takes highest priority and bypasses all file-based credential resolution.\n\n## Best Practices\n\n### Authentication\n- Always verify your session with \\`auth_me\\` before starting work\n- Use project-scoped credentials when working within a specific project\n- For CI/CD, prefer \\`SPACELR_AUTH_TOKEN\\` over stored credentials\n- Token refresh is automatic — no manual re-authentication needed under normal conditions\n\n### Database\n- **Rules-first approach:** Always define security rules for a collection before inserting data\n- Without rules, all operations are denied by the \\`$other\\` catch-all rule\n- Use \\`database_rules_set\\` to define collection rules — this automatically creates the collection\n- Read the database documentation at \\`spacelr://docs/database\\` for the full rules syntax\n\n### Storage\n- Use presigned URLs for large file uploads from client applications\n- Manage user quotas proactively to prevent storage overflows\n\n### Functions\n- Functions run in a V8 sandbox — no Node.js APIs, no require/import\n- Always deploy after updating function code\n- Use the KV store for persistent state between executions\n\n### Hosting\n- Upload all files before activating a deployment\n- Use SPA mode for single-page applications to handle client-side routing\n\n## Recommended Workflow for AI Assistants\n\nWhen first connecting to a Spacelr project, follow this sequence:\n\n1. **Check for spacelr.json** — Look in the current directory and parent directories. If it exists, note the \\`projectId\\`.\n\n2. **Verify session** — Call \\`auth_me\\` to check if credentials are valid.\n\n3. **Authenticate if needed** — If not authenticated, guide the user through \\`auth_login\\` or suggest running \\`npx @spacelr/cli login\\`.\n\n4. **Identify the project** — Use \\`projects_list\\` to find available projects, or use the \\`projectId\\` from \\`spacelr.json\\`.\n\n5. **Read relevant documentation** — Before performing tasks, read the appropriate docs resource:\n - \\`spacelr://docs/database\\` for database operations\n - \\`spacelr://docs/storage\\` for file management\n - \\`spacelr://docs/functions\\` for serverless functions\n - \\`spacelr://docs/hosting\\` for static site deployment\n - See \\`spacelr://docs/getting-started\\` for the full list\n\n6. **Execute the task** — Use the documented tools with correct parameters.\n\n## Available Documentation Resources\n\nFor the full list of documentation resources, read \\`spacelr://docs/getting-started\\`.\n`;\n\nexport function registerBestPracticeResources(server: McpServer): void {\n server.registerResource(\n 'docs-best-practices',\n 'spacelr://docs/best-practices',\n {\n title: 'Best Practices & Setup - Spacelr Docs',\n description:\n 'Setup guide and best practices: credential configuration, spacelr.json, environment variables, and recommended workflows for AI assistants',\n mimeType: 'text/markdown',\n annotations: {\n audience: ['assistant'],\n priority: 0.95,\n },\n },\n async (uri: URL) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/markdown',\n text: DOCS,\n },\n ],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { registerGettingStartedResources } from './getting-started';\nimport { registerAuthResources } from './auth';\nimport { registerProjectResources } from './projects';\nimport { registerClientResources } from './clients';\nimport { registerDatabaseResources } from './database';\nimport { registerHostingResources } from './hosting';\nimport { registerStorageResources } from './storage';\nimport { registerFunctionResources } from './functions';\nimport { registerEmailTemplateResources } from './email-templates';\nimport { registerCronJobResources } from './cron-jobs';\nimport { registerWebhookResources } from './webhooks';\nimport { registerNotificationResources } from './notifications';\nimport { registerAuditLogResources } from './audit-logs';\nimport { registerBestPracticeResources } from './best-practices';\n\nexport function registerAllResources(server: McpServer): void {\n registerGettingStartedResources(server);\n registerAuthResources(server);\n registerProjectResources(server);\n registerClientResources(server);\n registerDatabaseResources(server);\n registerHostingResources(server);\n registerStorageResources(server);\n registerFunctionResources(server);\n registerEmailTemplateResources(server);\n registerCronJobResources(server);\n registerWebhookResources(server);\n registerNotificationResources(server);\n registerAuditLogResources(server);\n registerBestPracticeResources(server);\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["path","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS","DOCS"]}