@upstash/mcp-server 0.2.2-rc.1 โ 0.2.3-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +285 -116
- package/dist/index.js +758 -210
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/log.ts","../src/tools/utils.ts","../src/tools/redis/backup.ts","../src/config.ts","../src/middlewares.ts","../src/http.ts","../src/tools/redis/command.ts","../src/tools/redis/db.ts","../src/utils.ts","../src/tools/redis/index.ts","../src/tools/qstash/qstash.ts","../src/tools/qstash/utils.ts","../src/tools/qstash/workflow.ts","../src/tools/qstash/index.ts","../src/tools/index.ts","../src/settings.ts","../src/tool.ts","../src/test-connection.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { Command } from \"commander\";\n// eslint-disable-next-line unicorn/prefer-node-protocol\nimport { createServer, type IncomingMessage } from \"http\";\nimport { createServerInstance } from \"./server.js\";\nimport { config } from \"./config\";\nimport { testConnection } from \"./test-connection\";\nimport \"dotenv/config\";\n\n/**\n * Last version of the MCP server required \"run\" command to be used.\n * This is a backwards compatibility fix to allow the MCP server to be used with the old command.\n */\n\n// Handle legacy 'run' command format before parsing\nlet argv = process.argv.slice(2);\n\n// Check for legacy format and transform it to the new format\nif (argv.length >= 3 && argv[0] === \"run\") {\n argv = [\"--email\", argv[1], \"--api-key\", argv[2], ...argv.slice(3)];\n}\n\nconst program = new Command()\n .option(\"--transport <stdio|http>\", \"transport type\", \"stdio\")\n .option(\"--port <number>\", \"port for HTTP transport\", \"3000\")\n .option(\"--email <email>\", \"Upstash email\")\n .option(\"--api-key <key>\", \"Upstash API key\")\n .option(\"--debug\", \"Enable debug mode\")\n .allowUnknownOption(); // let other wrappers pass through extra flags\n\nprogram.parse(argv, { from: \"user\" });\n\nconst cliOptions = program.opts<{\n transport: string;\n port: string;\n email?: string;\n apiKey?: string;\n debug?: boolean;\n}>();\n\nexport const DEBUG = cliOptions.debug ?? false;\n\n// Validate transport option\nconst allowedTransports = [\"stdio\", \"http\"];\nif (!allowedTransports.includes(cliOptions.transport)) {\n console.error(\n `Invalid --transport value: '${cliOptions.transport}'. Must be one of: stdio, http.`\n );\n process.exit(1);\n}\n\n// Transport configuration\nconst TRANSPORT_TYPE = (cliOptions.transport || \"stdio\") as \"stdio\" | \"http\";\n\n// Disallow incompatible flags based on transport\nconst passedPortFlag = process.argv.includes(\"--port\");\n\nif (TRANSPORT_TYPE === \"stdio\" && passedPortFlag) {\n console.error(\"The --port flag is not allowed when using --transport stdio.\");\n process.exit(1);\n}\n\n// HTTP port configuration\nconst CLI_PORT = (() => {\n const parsed = Number.parseInt(cliOptions.port, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n})();\n\nasync function main() {\n // Get credentials from CLI options or environment\n const email = cliOptions.email || process.env.UPSTASH_EMAIL;\n const apiKey = cliOptions.apiKey || process.env.UPSTASH_API_KEY;\n\n if (!email || !apiKey) {\n console.error(\n \"Missing required credentials. Provide --email and --api-key or set UPSTASH_EMAIL and UPSTASH_API_KEY environment variables.\"\n );\n process.exit(1);\n }\n\n // Set config\n config.email = email;\n config.apiKey = apiKey;\n\n // Test connection\n await testConnection();\n\n const transportType = TRANSPORT_TYPE;\n\n if (transportType === \"http\") {\n // Get initial port from environment or use default\n const initialPort = CLI_PORT ?? 3000;\n // Keep track of which port we end up using\n let actualPort = initialPort;\n const httpServer = createServer(async (req: IncomingMessage, res: any) => {\n const pathname = new (globalThis as any).URL(req.url || \"\", `http://${req.headers.host}`)\n .pathname;\n\n // Set CORS headers for all responses\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET,POST,OPTIONS,DELETE\");\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, MCP-Session-Id, MCP-Protocol-Version, X-Upstash-API-Key, Upstash-API-Key, X-API-Key, Authorization\"\n );\n res.setHeader(\"Access-Control-Expose-Headers\", \"MCP-Session-Id\");\n\n // Handle preflight OPTIONS requests\n if (req.method === \"OPTIONS\") {\n res.writeHead(200);\n res.end();\n return;\n }\n\n try {\n // Create new server instance for each request\n const requestServer = createServerInstance();\n\n if (pathname === \"/mcp\") {\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await requestServer.connect(transport);\n await transport.handleRequest(req, res);\n } else if (pathname === \"/ping\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"ok\", message: \"pong\" }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", status: 404 }));\n }\n } catch (error) {\n console.error(\"Error handling request:\", error);\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n }\n });\n\n // Function to attempt server listen with port fallback\n const startServer = (port: number, maxAttempts = 10) => {\n httpServer.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\" && port < initialPort + maxAttempts) {\n console.warn(`Port ${port} is in use, trying port ${port + 1}...`);\n startServer(port + 1, maxAttempts);\n } else {\n console.error(`Failed to start server: ${err.message}`);\n process.exit(1);\n }\n });\n\n httpServer.listen(port, () => {\n actualPort = port;\n console.error(\n `Upstash MCP Server running on ${transportType.toUpperCase()} at http://localhost:${actualPort}/mcp`\n );\n });\n };\n\n // Start the server with initial port\n startServer(initialPort);\n } else {\n // Stdio transport - this is already stateless by nature\n const server = createServerInstance();\n const transport = new StdioServerTransport();\n\n // Log the RCP messages coming to the transport\n // const originalOnmessage = transport.onmessage;\n // transport.onmessage = (message) => {\n // console.error(\"message\", message);\n\n // originalOnmessage?.(message);\n // };\n\n await server.connect(transport);\n console.error(\"Upstash MCP Server running on stdio\");\n }\n}\n\n// eslint-disable-next-line unicorn/prefer-top-level-await\nmain().catch((error) => {\n console.error(\"Fatal error in main():\", error);\n process.exit(1);\n});\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { log } from \"./log\";\nimport { tools } from \"./tools\";\nimport { handlerResponseToCallResult } from \"./tool\";\nimport z from \"zod\";\nimport { DEBUG } from \".\";\n\n// Function to create a new server instance with all tools registered\nexport function createServerInstance() {\n const server = new McpServer(\n { name: \"upstash\", version: \"0.1.0\" },\n {\n capabilities: {\n tools: {},\n logging: {},\n },\n }\n );\n\n const toolsList = Object.entries(tools).map(([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n tool,\n }));\n\n // Register all tools from the toolsList\n for (const toolDef of toolsList) {\n const toolName = toolDef.name;\n const tool = toolDef.tool;\n\n server.registerTool(\n toolName,\n {\n description: tool.description,\n inputSchema: ((tool.inputSchema ?? z.object({})) as any).shape,\n },\n // @ts-expect-error - Just ignore the types here\n async (args) => {\n log(\"< received tool call:\", toolName, args);\n\n try {\n const result = await tool.handler(args);\n const response = handlerResponseToCallResult(result);\n log(\"> tool result:\", response.content.map((item) => item.text).join(\"\\n\"));\n return response;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log(\"> error in tool call:\", msg);\n return {\n content: [\n {\n type: \"text\",\n text: `${error instanceof Error ? error.name : \"Error\"}: ${msg}`,\n },\n ...(DEBUG\n ? [\n {\n type: \"text\",\n text: `\\nStack trace: ${error instanceof Error ? error.stack : \"No stack trace available\"}`,\n },\n ]\n : []),\n ],\n isError: true,\n };\n }\n }\n );\n }\n\n return server;\n}\n","export function log(...args: unknown[]) {\n const msg = `[DEBUG ${new Date().toISOString()}] ${args.map((arg) => (typeof arg === \"string\" ? arg : JSON.stringify(arg))).join(\" \")}\\n`;\n\n for (const [, logs] of logsStore.entries()) {\n logs.push(msg);\n }\n\n process.stderr.write(msg);\n}\n\nconst logsStore = new Map<string, string[]>();\n\nexport function startCollectLogs() {\n const id = Array.from({ length: 10 })\n .fill(0)\n .map(() => Math.random().toString(36).slice(2, 15))\n .join(\"\");\n\n logsStore.set(id, []);\n\n return id;\n}\n\nexport function popLogs(id: string) {\n const logs = logsStore.get(id);\n\n if (!logs) {\n return [];\n }\n\n logsStore.delete(id);\n\n return logs;\n}\n","import { z } from \"zod\";\nimport { tool } from \".\";\n\nexport const utilTools = {\n util_timestamps_to_date: tool({\n description: `Use this tool to convert a timestamp to a human-readable date`,\n inputSchema: z.object({\n timestamps: z.array(z.number()).describe(\"Array of timestamps to convert\"),\n }),\n handler: async ({ timestamps }) => {\n return timestamps.map((timestamp) => new Date(timestamp).toUTCString());\n },\n }),\n util_dates_to_timestamps: tool({\n description: `Use this tool to convert an array of ISO 8601 dates to an array of timestamps`,\n inputSchema: z.object({\n dates: z.array(z.string()).describe(\"Array of dates to convert\"),\n }),\n handler: async ({ dates }) => {\n return dates.map((date) => new Date(date).getTime()).join(\",\");\n },\n }),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"..\";\nimport { http } from \"../../http\";\nimport type { RedisBackup } from \"./types\";\n\nexport const redisBackupTools = {\n redis_database_manage_backup: tool({\n description: `Create, delete, or restore backups for a specific Upstash redis database. This tool handles all backup operations in one unified interface.`,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to manage backups for.\"),\n operation: z\n .union([z.literal(\"create\"), z.literal(\"delete\"), z.literal(\"restore\")])\n .describe(\"The backup operation to perform: create, delete, or restore.\"),\n backup_name: z\n .string()\n .optional()\n .describe(\"Name for the backup (required for create operation).\"),\n backup_id: z\n .string()\n .optional()\n .describe(\"ID of the backup (required for delete and restore operations).\"),\n }),\n handler: async ({ database_id, operation, backup_name, backup_id }) => {\n switch (operation) {\n case \"create\": {\n if (!backup_name) {\n throw new Error(\"backup_name is required for create operation\");\n }\n await http.post([\"v2/redis/create-backup\", database_id], {\n name: backup_name,\n });\n return `Backup \"${backup_name}\" created successfully for database ${database_id}.`;\n }\n\n case \"delete\": {\n if (!backup_id) {\n throw new Error(\"backup_id is required for delete operation\");\n }\n await http.delete([\"v2/redis/delete-backup\", database_id, backup_id]);\n return `Backup ${backup_id} deleted successfully from database ${database_id}.`;\n }\n\n case \"restore\": {\n if (!backup_id) {\n throw new Error(\"backup_id is required for restore operation\");\n }\n await http.post([\"v2/redis/restore-backup\", database_id], {\n backup_id,\n });\n return `Backup ${backup_id} restored successfully to database ${database_id}.`;\n }\n\n default: {\n throw new Error(`Invalid operation: ${operation}. Use create, delete, or restore.`);\n }\n }\n },\n }),\n\n redis_database_list_backups: tool({\n // TODO: Add explanation for fields\n // TODO: Is this in bytes?\n description: `List all backups of a specific Upstash redis database.`,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to list backups for.\"),\n }),\n handler: async ({ database_id }) => {\n const backups = await http.get<RedisBackup[]>([\"v2/redis/list-backup\", database_id]);\n\n return json(backups);\n },\n }),\n\n redis_database_set_daily_backup: tool({\n description: `Enable or disable daily backups for a specific Upstash redis database.`,\n inputSchema: z.object({\n database_id: z\n .string()\n .describe(\"The ID of the database to enable or disable daily backups for.\"),\n enable: z.boolean().describe(\"Whether to enable or disable daily backups.\"),\n }),\n handler: async ({ database_id, enable }) => {\n await http.patch([\n `v2/redis/${enable ? \"enable-dailybackup\" : \"disable-dailybackup\"}`,\n database_id,\n ]);\n\n return \"OK\";\n },\n }),\n};\n","export const config = {\n apiKey: \"\",\n email: \"\",\n};\n","import type { UpstashRequest } from \"./http\";\n\ntype Middleware = (req: UpstashRequest, next: () => Promise<unknown>) => Promise<unknown>;\n\nconst formatTimestamps = (obj: unknown): void => {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n for (const item of obj) {\n formatTimestamps(item);\n }\n return;\n }\n\n // Handle objects\n for (const [key, value] of Object.entries(obj)) {\n // Check if key matches our criteria: contains \"creationTime\" or has \"createdAt\" anywhere (case-insensitive)\n const shouldFormat =\n typeof value === \"number\" &&\n (key === \"creationTime\" ||\n key === \"creation_time\" ||\n key === \"time\" ||\n key.toLowerCase().includes(\"createdat\"));\n\n if (shouldFormat && typeof value === \"number\" && value > 0) {\n // Format timestamp to human readable format\n // Assume timestamps > 1_000_000_000_000 are in milliseconds, otherwise seconds\n const timestamp = value > 1_000_000_000_000 ? value : value * 1000;\n\n // Show milliseconds in the human readable format\n\n const formatted = new Date(timestamp).toLocaleString(\"en-US\", { timeZoneName: \"short\" });\n (obj as any)[key] = `${formatted} (${value})`;\n } else if (value && typeof value === \"object\") {\n // Recursively process nested objects\n formatTimestamps(value);\n }\n }\n};\n\nconst middlewares: Middleware[] = [\n // Middleware to format timestamp fields to human readable format\n async (req, next) => {\n const res = await next();\n formatTimestamps(res);\n return res;\n },\n];\n\nexport const applyMiddlewares = async (\n req: UpstashRequest,\n func: (req: UpstashRequest) => Promise<unknown>\n) => {\n let next = async () => func(req);\n for (const middleware of middlewares.reverse()) {\n const prevNext = next;\n next = async () => middleware(req, prevNext);\n }\n return next();\n};\n","import { config } from \"./config\";\nimport { log } from \"./log\";\nimport { applyMiddlewares } from \"./middlewares\";\nimport type { RequestInit } from \"node-fetch\";\nimport fetch from \"node-fetch\";\nimport { json } from \"./tools\";\n\nexport type UpstashRequest = {\n method: string;\n path?: string[] | string;\n /**\n * Request body will be serialized to json\n */\n body?: unknown;\n /**\n * Query parameters, object and undefined will be ignored\n */\n query?: Record<string, string | number | boolean | undefined | object>;\n /**\n * Custom headers\n */\n headers?: Record<string, string>;\n /**\n * Optional QStash token - if provided, will use Bearer auth instead of Basic auth\n */\n qstashToken?: string;\n};\n\nexport type HttpClientConfig = {\n baseUrl: string;\n /**\n * Optional QStash token for Bearer authentication\n */\n qstashToken?: string;\n};\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly qstashToken?: string;\n\n public constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.qstashToken = config.qstashToken;\n }\n\n public async get<TResponse>(\n path: string[] | string,\n query?: Record<string, string | number | boolean | undefined | object>\n ): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"GET\", path, query });\n }\n\n public async post<TResponse>(\n path: string[] | string,\n body?: unknown,\n headers?: Record<string, string>\n ): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"POST\", path, body, headers });\n }\n\n public async put<TResponse>(\n path: string[] | string,\n body?: unknown,\n headers?: Record<string, string>\n ): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"PUT\", path, body, headers });\n }\n\n public async patch<TResponse>(path: string[] | string, body?: unknown): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"PATCH\", path, body });\n }\n\n public async delete<TResponse>(path: string[] | string, body?: unknown): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"DELETE\", path, body });\n }\n\n private async requestWithMiddleware<TResponse>(req: UpstashRequest): Promise<TResponse> {\n const res = await applyMiddlewares(req, async (req) => {\n return this.request<TResponse>(req);\n });\n\n return res as TResponse;\n }\n\n private async request<TResponse>(req: UpstashRequest): Promise<TResponse> {\n if (!req.path) {\n req.path = [];\n } else if (typeof req.path === \"string\") {\n req.path = [req.path];\n }\n\n let url = [this.baseUrl, ...req.path].join(\"/\");\n\n // Add query parameters\n if (req.query) {\n const queryPairs: string[] = [];\n for (const [key, value] of Object.entries(req.query)) {\n if (value !== undefined && value !== null && typeof value !== \"object\") {\n queryPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n }\n }\n if (queryPairs.length > 0) {\n url += `?${queryPairs.join(\"&\")}`;\n }\n }\n\n // Determine authentication method\n const qstashToken = req.qstashToken || this.qstashToken;\n let authHeader: string;\n\n if (qstashToken) {\n authHeader = `Bearer ${qstashToken}`;\n } else {\n const token = [config.email, config.apiKey].join(\":\");\n authHeader = `Basic ${Buffer.from(token).toString(\"base64\")}`;\n }\n\n const init: RequestInit = {\n method: req.method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: authHeader,\n ...req.headers,\n },\n };\n\n if (req.method !== \"GET\" && req.body !== undefined) {\n init.body = JSON.stringify(req.body);\n }\n\n log(\"-> sending request\", {\n url,\n ...init,\n headers: {\n ...init.headers,\n Authorization: \"***\",\n },\n });\n\n // fetch is defined by isomorphic fetch\n const res = await fetch(url, init);\n if (!res.ok) {\n throw new Error(`Request failed (${res.status} ${res.statusText}): ${await res.text()}`);\n }\n\n // Handle empty responses\n const text = await res.text();\n if (!text) {\n return {} as TResponse;\n }\n\n const result = safeParseJson(text) as TResponse;\n\n if (result) {\n log(\"<- received response\", json(result));\n } else {\n log(\"<- received text response\", text);\n }\n\n return result || (text as TResponse);\n }\n}\n\nconst safeParseJson = <TResponse>(text: string) => {\n try {\n return JSON.parse(text) as TResponse;\n } catch {\n return;\n }\n};\n\nexport const http = new HttpClient({ baseUrl: \"https://api.upstash.com\" });\n\n/**\n * Creates a QStash-enabled HttpClient with the provided token\n */\nexport function createQStashClient({ url, token }: { url?: string; token: string }): HttpClient {\n return new HttpClient({\n baseUrl: url ?? \"https://qstash.upstash.io\",\n qstashToken: token,\n });\n}\n","import { z } from \"zod\";\nimport { json, tool } from \"..\";\nimport { log } from \"../../log\";\nimport { http } from \"../../http\";\nimport type { RedisDatabase } from \"./types\";\nimport fetch from \"node-fetch\";\n\ntype RedisCommandResult =\n | {\n result: unknown;\n }\n | {\n error: string;\n };\n\nexport const redisCommandTools = {\n redis_database_run_redis_commands: tool({\n description: `Run one or more Redis commands on a specific Upstash redis database. Either provide database_id OR both database_rest_url and database_rest_token.\nNOTE: For discovery, use SCAN over KEYS. Use TYPE to get the type of a key.\nNOTE: SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]\nNOTE: Multiple commands will be executed as a pipeline for better performance.`,\n inputSchema: z.object({\n database_id: z.string().optional().describe(\"The ID of the database to run commands on.\"),\n database_rest_url: z\n .string()\n .optional()\n .describe(\"The REST URL of the database. Example: https://***.upstash.io\"),\n database_rest_token: z.string().optional().describe(\"The REST token of the database.\"),\n commands: z\n .array(z.array(z.string()))\n .describe(\n \"The Redis commands to run. For single command: [['SET', 'foo', 'bar']], for multiple: [['SET', 'foo', 'bar'], ['GET', 'foo']]\"\n ),\n }),\n\n handler: async ({ database_id, database_rest_url, database_rest_token, commands }) => {\n if (database_id && (database_rest_url || database_rest_token)) {\n throw new Error(\n \"Either provide database_id OR both database_rest_url and database_rest_token\"\n );\n } else if (!database_id && (!database_rest_url || !database_rest_token)) {\n throw new Error(\n \"Either provide database_id OR both database_rest_url and database_rest_token\"\n );\n }\n\n let restUrl = database_rest_url;\n let restToken = database_rest_token;\n\n // If only database_id is provided, fetch the database details\n if (database_id && (!database_rest_url || !database_rest_token)) {\n log(\"Fetching database details for database_id:\", database_id);\n const db = await http.get<RedisDatabase>([\"v2/redis/database\", database_id]);\n restUrl = \"https://\" + db.endpoint;\n restToken = db.rest_token;\n }\n\n if (!restUrl || !restToken) {\n throw new Error(\"Could not determine REST URL and token for the database\");\n }\n const isSingleCommand = commands.length === 1;\n const url = isSingleCommand ? restUrl : restUrl + \"/pipeline\";\n const body = isSingleCommand ? JSON.stringify(commands[0]) : JSON.stringify(commands);\n\n const req = await fetch(url, {\n method: \"POST\",\n body,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${restToken}`,\n },\n });\n\n if (isSingleCommand) {\n const result = (await req.json()) as RedisCommandResult;\n\n log(\"command result:\", result);\n\n if (\"error\" in result) {\n throw new Error(\"Redis error: \" + result.error);\n }\n\n const isScanCommand = commands[0][0].toLocaleLowerCase().includes(\"scan\");\n const messages = [json(result)];\n\n if (isScanCommand)\n messages.push(`NOTE: Use the returned cursor to get the next set of keys.\nNOTE: The result might be too large to be returned. If applicable, stop after the second SCAN command and ask the user if they want to continue.`);\n\n return messages;\n } else {\n const result = (await req.json()) as RedisCommandResult[];\n\n log(\"commands result:\", result);\n\n if (result.some((r) => \"error\" in r)) {\n throw new Error(\"Some commands in the pipeline resulted in an error:\\n\" + json(result));\n }\n\n return json(result);\n }\n },\n }),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"..\";\nimport { http } from \"../../http\";\nimport type { RedisDatabase, RedisUsageResponse, UsageData } from \"./types\";\nimport { pruneFalsy } from \"../../utils\";\n\nconst readRegionSchema = z.union([\n z.literal(\"us-east-1\"),\n z.literal(\"us-west-1\"),\n z.literal(\"us-west-2\"),\n z.literal(\"eu-west-1\"),\n z.literal(\"eu-central-1\"),\n z.literal(\"ap-southeast-1\"),\n z.literal(\"ap-southeast-2\"),\n z.literal(\"sa-east-1\"),\n]);\n\nconst GENERIC_DATABASE_NOTES =\n \"\\nNOTE: Don't show the database ID from the response to the user unless explicitly asked or needed.\\n\";\n\nexport const redisDbOpsTools = {\n redis_database_create_new: tool({\n description: `Create a new Upstash redis database. \nNOTE: Ask user for the region and name of the database.${GENERIC_DATABASE_NOTES}`,\n inputSchema: z.object({\n name: z.string().describe(\"Name of the database.\"),\n primary_region: readRegionSchema.describe(`Primary Region of the Global Database.`),\n read_regions: z\n .array(readRegionSchema)\n .optional()\n .describe(`Array of read regions of the db`),\n }),\n handler: async ({ name, primary_region, read_regions }) => {\n const newDb = await http.post<RedisDatabase>(\"v2/redis/database\", {\n name,\n region: \"global\",\n primary_region,\n read_regions,\n });\n\n return [\n json(newDb),\n `Upstash console url: https://console.upstash.com/redis/${newDb.database_id}`,\n ];\n },\n }),\n\n redis_database_delete: tool({\n description: `Delete an Upstash redis database.`,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to delete.\"),\n }),\n handler: async ({ database_id }) => {\n await http.delete([\"v2/redis/database\", database_id]);\n\n return \"Database deleted successfully.\";\n },\n }),\n\n redis_database_list_databases: tool({\n description: `List all Upstash redis databases. Only their names and ids.${GENERIC_DATABASE_NOTES}`,\n handler: async () => {\n const dbs = await http.get<RedisDatabase[]>(\"v2/redis/databases\");\n\n const messages = [\n json(\n dbs.map((db) => {\n const result = {\n database_id: db.database_id,\n database_name: db.database_name,\n state: db.state === \"active\" ? undefined : db.state,\n };\n return pruneFalsy(result);\n })\n ),\n ];\n\n if (dbs.length > 2)\n messages.push(\n `NOTE: If the user did not specify a database name for the next command, ask them to choose a database from the list.`\n );\n messages.push(\n \"NOTE: If the user wants to see dbs in another team, mention that they need to create a new management api key for that team and initialize MCP server with the newly created key.\"\n );\n\n return messages;\n },\n }),\n\n redis_database_get_details: tool({\n description: `Get further details of a specific Upstash redis database. Includes all details of the database including usage statistics.\ndb_disk_threshold: Total disk usage limit.\ndb_memory_threshold: Maximum memory usage.\ndb_daily_bandwidth_limit: Maximum daily network bandwidth usage.\ndb_request_limit: Total number of commands allowed.\nAll sizes are in bytes\n${GENERIC_DATABASE_NOTES}\n `,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to get details for.\"),\n }),\n handler: async ({ database_id }) => {\n const db = await http.get<RedisDatabase>([\"v2/redis/database\", database_id]);\n\n return json(db);\n },\n }),\n\n redis_database_update_regions: tool({\n description: `Update the read regions of an Upstash redis database.`,\n inputSchema: z.object({\n id: z.string().describe(\"The ID of your database.\"),\n read_regions: z\n .array(readRegionSchema)\n .describe(\n \"Array of the new read regions of the database. This will replace the old regions array. Available regions: us-east-1, us-west-1, us-west-2, eu-west-1, eu-central-1, ap-southeast-1, ap-southeast-2, sa-east-1\"\n ),\n }),\n handler: async ({ id, read_regions }) => {\n const updatedDb = await http.post<RedisDatabase>([\"v2/redis/update-regions\", id], {\n read_regions,\n });\n\n return json(updatedDb);\n },\n }),\n\n redis_database_reset_password: tool({\n description: `Reset the password of an Upstash redis database.`,\n inputSchema: z.object({\n id: z.string().describe(\"The ID of your database.\"),\n }),\n handler: async ({ id }) => {\n const updatedDb = await http.post<RedisDatabase>([\"v2/redis/reset-password\", id], {});\n\n return json(updatedDb);\n },\n }),\n\n redis_database_get_statistics: tool({\n description: `Get comprehensive usage statistics of an Upstash redis database. Returns both:\n1. PRECISE 5-day usage: Exact command count and bandwidth usage over the last 5 days\n2. SAMPLED period stats: Sampled statistics over a specified period (1h, 3h, 12h, 1d, 3d, 7d) for performance monitoring\n\nFor sampled stats, includes: read_latency_mean, write_latency_mean, keyspace, throughput (cmds/sec), diskusage\nNOTE: If user doesn't specify stat_type, defaults to \"throughput\" for sampled stats.\nNOTE: Ask user first if they want to see stats for each database separately or just for one.`,\n inputSchema: z.object({\n id: z.string().describe(\"The ID of your database.\"),\n period: z\n .union([\n z.literal(\"1h\"),\n z.literal(\"3h\"),\n z.literal(\"12h\"),\n z.literal(\"1d\"),\n z.literal(\"3d\"),\n z.literal(\"7d\"),\n ])\n .describe(\"The period for sampled stats.\"),\n stat_type: z\n .union([\n z.literal(\"read_latency_mean\"),\n z.literal(\"write_latency_mean\"),\n z.literal(\"keyspace\").describe(\"Number of keys in db\"),\n z\n .literal(\"throughput\")\n .describe(\"commands per second (sampled), calculate area for estimated count\"),\n z.literal(\"diskusage\").describe(\"Current disk usage in bytes\"),\n ])\n .optional()\n .describe(\"The type of sampled stat to get (defaults to 'throughput')\"),\n }),\n handler: async ({ id, period, stat_type }) => {\n const statType = stat_type || \"throughput\";\n const stats = await http.get<RedisUsageResponse>([\n \"v2/redis/stats\",\n `${id}?period=${period}`,\n ]);\n\n // Get the sampled stat\n const stat = stats[statType];\n if (!Array.isArray(stat))\n throw new Error(\n `Invalid stat_type provided: ${statType}. Valid keys are: ${Object.keys(stats).join(\", \")}`\n );\n\n // Return both 5-day precise stats and sampled stats\n return [\n json({\n // 5-day precise usage stats\n usage_last_5_days: {\n days: stats.days,\n command_usage: stats.dailyrequests,\n bandwidth_usage: stats.bandwidths,\n },\n // Sampled stats for the specified period and type\n sampled_stats: {\n period,\n stat_type: statType,\n data: parseUsageData(stat),\n },\n }),\n `NOTE: Times are calculated according to UTC+0`,\n `NOTE: Use the timestamps_to_date tool to parse timestamps if needed`,\n `NOTE: Don't try to plot multiple stats in the same chart`,\n ];\n },\n }),\n};\n\nconst parseUsageData = (data: UsageData) => {\n if (!data) return \"NO DATA\";\n if (!Array.isArray(data)) return \"INVALID DATA\";\n if (data.length === 0 || data.length === 1) return \"NO DATA\";\n const filteredData = data.filter((d) => d.x && d.y);\n return {\n start: filteredData[0].x,\n // last one can be null, so use the second last\n // eslint-disable-next-line unicorn/prefer-at\n end: filteredData[filteredData.length - 1]?.x,\n data: data.map((d) => [new Date(d.x).getTime(), d.y]),\n };\n};\n","export function pruneFalsy(obj: Record<string, any>) {\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => value));\n}\n","import { utilTools } from \"../utils\";\nimport { redisBackupTools } from \"./backup\";\nimport { redisCommandTools } from \"./command\";\nimport { redisDbOpsTools } from \"./db\";\nimport type { CustomTool } from \"../../tool\";\n\nexport const redisTools: Record<string, CustomTool> = {\n ...redisDbOpsTools,\n ...redisBackupTools,\n ...redisCommandTools,\n ...utilTools,\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"..\";\nimport { http } from \"../../http\";\nimport { createQStashClientWithToken } from \"./utils\";\nimport type {\n QStashUser,\n QStashLogsResponse,\n QStashDLQResponse,\n QStashDLQMessage,\n QStashSchedule,\n QStashScheduleCreateResponse,\n} from \"./types\";\n\nexport const qstashCreds = {\n qstash_creds: z.undefined(),\n // qstash_creds: z\n // .object({\n // url: z.string(),\n // token: z.string(),\n // })\n // .optional()\n // .describe(\n // \"Optional qstash credentials. Use for local qstash connections and external qstash deployments\"\n // ),\n};\n\n// First, we need to get the QStash token\nexport const qstashTools = {\n qstash_get_user_token: tool({\n description: `Get the QSTASH_TOKEN and QSTASH_URL of the current user. This\n is not needed for the mcp tools since the token is automatically fetched from\n the Upstash API for them.`,\n handler: async () => {\n const user = await http.get<QStashUser>(\"qstash/user\");\n return [json(user)];\n },\n }),\n\n qstash_publish_message: tool({\n description: `Publish a message to a destination URL using QStash. This\n sends an HTTP request to the specified destination via QStash's message\n queue. This can also be used to trigger a upstash workflow run.`,\n inputSchema: z.object({\n destination: z\n .string()\n .describe(\"The destination URL to send the message to (e.g., 'https://example.com')\"),\n body: z.string().optional().describe(\"Request body (JSON string or plain text)\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"])\n .optional()\n .describe(\"HTTP method (optional, defaults to POST)\")\n .default(\"POST\"),\n delay: z\n .string()\n .optional()\n .describe(\"Delay before message delivery (e.g., '10s', '5m', '1h')\"),\n retries: z.number().optional().describe(\"Number of retries on failure, default is 3\"),\n callback: z\n .string()\n .optional()\n .describe(\"Callback URL that will be called when the message is successfully delivered\"),\n failureCallback: z\n .string()\n .optional()\n .describe(\"Callback URL that will be called when the message is failed to deliver\"),\n timeout: z.string().optional().describe(\"Request timeout (e.g., '30s', '1h')\"),\n queueName: z\n .string()\n .optional()\n .describe(\n \"Queue name to use, you have to first create the queue in upstash. Prefer the flow control key instead\"\n ),\n flow_control: z\n .object({\n key: z\n .string()\n .describe(\"Unique identifier for grouping messages under same flow control rules\"),\n parallelism: z\n .number()\n .optional()\n .describe(\"Max concurrent active calls (default: unlimited)\"),\n rate: z.number().optional().describe(\"Max calls per period (default: unlimited)\"),\n period: z\n .string()\n .optional()\n .describe(\"Time window for rate limit (e.g., '1s', '1m', '1h', default: '1s')\"),\n })\n .optional()\n .describe(\"Flow control for rate limiting and parallelism management\"),\n\n extraHeaders: z.record(z.string()).optional().describe(\"Extra headers to add to the request\"),\n ...qstashCreds,\n }),\n handler: async ({\n destination,\n body,\n method,\n extraHeaders,\n delay,\n retries,\n callback,\n failureCallback,\n timeout,\n queueName,\n flow_control,\n qstash_creds,\n }) => {\n const client = await createQStashClientWithToken(qstash_creds);\n\n const requestHeaders: Record<string, string> = {};\n\n if (method) {\n requestHeaders[\"Upstash-Method\"] = method;\n }\n if (delay) {\n requestHeaders[\"Upstash-Delay\"] = delay;\n }\n if (retries !== undefined) {\n requestHeaders[\"Upstash-Retries\"] = retries.toString();\n }\n if (callback) {\n requestHeaders[\"Upstash-Callback\"] = callback;\n }\n if (failureCallback) {\n requestHeaders[\"Upstash-Failure-Callback\"] = failureCallback;\n }\n if (timeout) {\n requestHeaders[\"Upstash-Timeout\"] = timeout;\n }\n if (queueName) {\n requestHeaders[\"Upstash-Queue-Name\"] = queueName;\n }\n\n // Add flow control headers\n if (flow_control) {\n requestHeaders[\"Upstash-Flow-Control-Key\"] = flow_control.key;\n const value = [\n flow_control.parallelism === undefined\n ? undefined\n : `parallelism=${flow_control.parallelism}`,\n flow_control.rate === undefined ? undefined : `rate=${flow_control.rate}`,\n flow_control.period === undefined ? undefined : `period=${flow_control.period}`,\n ]\n .filter(Boolean)\n .join(\",\");\n requestHeaders[\"Upstash-Flow-Control-Value\"] = value;\n }\n\n // Add custom headers\n if (extraHeaders) {\n for (const [key, value] of Object.entries(extraHeaders)) {\n requestHeaders[key] = value;\n }\n }\n\n const response = await client.post<{ messageId: string }>(\n `v2/publish/${destination}`,\n body || {},\n requestHeaders\n );\n\n return [\n \"Message published successfully\",\n `Message ID: ${response.messageId}`,\n json(response),\n ];\n },\n }),\n\n qstash_logs_list: tool({\n description: `List QStash logs with optional filtering. Returns a paginated list of message logs without their bodies.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n messageId: z.string().optional().describe(\"Filter logs by message ID\"),\n state: z\n .enum([\n \"CREATED\",\n \"ACTIVE\",\n \"RETRY\",\n \"ERROR\",\n \"IN_PROGRESS\",\n \"DELIVERED\",\n \"FAILED\",\n \"CANCEL_REQUESTED\",\n \"CANCELLED\",\n ])\n .optional()\n .describe(\"Filter logs by state\"),\n url: z.string().optional().describe(\"Filter logs by URL\"),\n topicName: z.string().optional().describe(\"Filter logs by topic name\"),\n scheduleId: z.string().optional().describe(\"Filter logs by schedule ID\"),\n queueName: z.string().optional().describe(\"Filter logs by queue name\"),\n fromDate: z\n .number()\n .optional()\n .describe(\"Filter logs from date (Unix timestamp in milliseconds)\"),\n toDate: z\n .number()\n .optional()\n .describe(\"Filter logs to date (Unix timestamp in milliseconds)\"),\n count: z.number().max(1000).optional().describe(\"Number of logs to return (max 1000)\"),\n ...qstashCreds,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params.qstash_creds);\n\n const response = await client.get<QStashLogsResponse>(\"v2/logs\", {\n trimBody: 0,\n groupBy: \"messageId\",\n ...params,\n });\n const firstMessageFields = Object.fromEntries(\n Object.entries(response.messages[0] ?? {}).filter(\n ([key, _value]) => !key.toLocaleLowerCase().includes(\"headers\")\n )\n );\n\n const cleanedEvents = response.messages.map((message) => ({\n messageId: message.messageId,\n events: message.events.map((event) => ({\n state: event.state,\n time: event.time,\n })),\n }));\n\n return [\n `Found ${response.messages.length} log entries`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json({ ...firstMessageFields, events: cleanedEvents }),\n ];\n },\n }),\n\n qstash_logs_get: tool({\n description: `Get details of a single QStash log item by message ID without trimming the body.`,\n inputSchema: z.object({\n messageId: z.string().describe(\"The message ID to get details for\"),\n ...qstashCreds,\n }),\n handler: async ({ messageId, qstash_creds }) => {\n const client = await createQStashClientWithToken(qstash_creds);\n const response = await client.get<QStashLogsResponse>(\"v2/logs\", { messageId });\n\n if (response.messages.length === 0) {\n return \"No log entry found for the specified message ID\";\n }\n\n const logEntry = response.messages[0];\n return [`Log details for message ID: ${messageId}`, json(logEntry)];\n },\n }),\n\n qstash_dlq_list: tool({\n description: `List messages in the QStash Dead Letter Queue (DLQ) with optional filtering.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n messageId: z.string().optional().describe(\"Filter DLQ messages by message ID\"),\n url: z.string().optional().describe(\"Filter DLQ messages by URL\"),\n topicName: z.string().optional().describe(\"Filter DLQ messages by topic name\"),\n scheduleId: z.string().optional().describe(\"Filter DLQ messages by schedule ID\"),\n queueName: z.string().optional().describe(\"Filter DLQ messages by queue name\"),\n fromDate: z.number().optional().describe(\"Filter from date (Unix timestamp in milliseconds)\"),\n toDate: z.number().optional().describe(\"Filter to date (Unix timestamp in milliseconds)\"),\n responseStatus: z.number().optional().describe(\"Filter by HTTP response status code\"),\n callerIp: z.string().optional().describe(\"Filter by IP address of the publisher\"),\n count: z.number().max(100).optional().describe(\"Number of messages to return (max 100)\"),\n ...qstashCreds,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params.qstash_creds);\n\n const response = await client.get<QStashDLQResponse>(\"v2/dlq\", {\n trimBody: 0,\n ...params,\n });\n\n return [\n `Found ${response.messages.length} DLQ messages`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json(response.messages),\n ];\n },\n }),\n\n qstash_dlq_get: tool({\n description: `Get details of a single DLQ message by DLQ ID.`,\n inputSchema: z.object({\n dlqId: z.string().describe(\"The DLQ ID of the message to retrieve\"),\n ...qstashCreds,\n }),\n handler: async ({ dlqId, qstash_creds }) => {\n const client = await createQStashClientWithToken(qstash_creds);\n const message = await client.get<QStashDLQMessage>(`v2/dlq/${dlqId}`);\n\n return [`DLQ message details for ID: ${dlqId}`, json(message)];\n },\n }),\n\n qstash_schedules_list: tool({\n description: `List all QStash schedules.`,\n handler: async ({ qstash_creds }) => {\n const client = await createQStashClientWithToken(qstash_creds);\n const schedules = await client.get<QStashSchedule[]>(\"v2/schedules\");\n\n return [`Found ${schedules.length} schedules`, json(schedules)];\n },\n }),\n\n qstash_schedules_manage: tool({\n description: `Create, update, or manage QStash schedules. This tool handles create, update (by providing scheduleId), pause, resume, and delete operations in one unified interface.`,\n inputSchema: z.object({\n operation: z\n .enum([\"create\", \"update\", \"pause\", \"resume\", \"delete\"])\n .describe(\"The operation to perform\"),\n scheduleId: z\n .string()\n .optional()\n .describe(\"Schedule ID (required for update, pause, resume, delete operations)\"),\n destination: z\n .string()\n .optional()\n .describe(\"Destination URL or topic name (required for create/update)\"),\n cron: z.string().optional().describe(\"Cron expression (required for create/update)\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"])\n .optional()\n .describe(\"HTTP method (optional, defaults to POST)\"),\n headers: z.record(z.string()).optional().describe(\"Request headers as key-value pairs\"),\n body: z.string().optional().describe(\"Request body\"),\n delay: z\n .string()\n .optional()\n .describe(\"Delay before message delivery (e.g., '10s', '5m', '1h')\"),\n retries: z.number().optional().describe(\"Number of retries on failure\"),\n callback: z.string().optional().describe(\"Callback URL for successful delivery\"),\n failureCallback: z.string().optional().describe(\"Callback URL for failed delivery\"),\n timeout: z.string().optional().describe(\"Request timeout (e.g., '30s')\"),\n queueName: z.string().optional().describe(\"Queue name to use\"),\n ...qstashCreds,\n }),\n handler: async ({\n operation,\n scheduleId,\n destination,\n cron,\n method = \"POST\",\n headers,\n body,\n delay,\n retries,\n callback,\n failureCallback,\n timeout,\n queueName,\n qstash_creds,\n }) => {\n const client = await createQStashClientWithToken(qstash_creds);\n\n switch (operation) {\n case \"create\":\n case \"update\": {\n if (!destination || !cron) {\n throw new Error(\"destination and cron are required for create/update operations\");\n }\n\n const requestHeaders: Record<string, string> = {\n \"Upstash-Cron\": cron,\n };\n\n if (method !== \"POST\") {\n requestHeaders[\"Upstash-Method\"] = method;\n }\n if (delay) {\n requestHeaders[\"Upstash-Delay\"] = delay;\n }\n if (retries !== undefined) {\n requestHeaders[\"Upstash-Retries\"] = retries.toString();\n }\n if (callback) {\n requestHeaders[\"Upstash-Callback\"] = callback;\n }\n if (failureCallback) {\n requestHeaders[\"Upstash-Failure-Callback\"] = failureCallback;\n }\n if (timeout) {\n requestHeaders[\"Upstash-Timeout\"] = timeout;\n }\n if (queueName) {\n requestHeaders[\"Upstash-Queue-Name\"] = queueName;\n }\n if (scheduleId && operation === \"update\") {\n requestHeaders[\"Upstash-Schedule-Id\"] = scheduleId;\n }\n\n // Add custom headers\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n requestHeaders[key] = value;\n }\n }\n\n const response = await client.post<QStashScheduleCreateResponse>(\n `v2/schedules/${destination}`,\n body || {},\n requestHeaders\n );\n\n return [\n operation === \"create\"\n ? \"Schedule created successfully\"\n : \"Schedule updated successfully\",\n `Schedule ID: ${response.scheduleId}`,\n json(response),\n ];\n }\n\n case \"pause\": {\n if (!scheduleId) {\n throw new Error(\"scheduleId is required for pause operation\");\n }\n\n await client.post(`v2/schedules/${scheduleId}/pause`);\n return `Schedule ${scheduleId} paused successfully`;\n }\n\n case \"resume\": {\n if (!scheduleId) {\n throw new Error(\"scheduleId is required for resume operation\");\n }\n\n await client.post(`v2/schedules/${scheduleId}/resume`);\n return `Schedule ${scheduleId} resumed successfully`;\n }\n\n case \"delete\": {\n if (!scheduleId) {\n throw new Error(\"scheduleId is required for delete operation\");\n }\n\n await client.delete(`v2/schedules/${scheduleId}`);\n return `Schedule ${scheduleId} deleted successfully`;\n }\n\n default: {\n throw new Error(`Unknown operation: ${operation}`);\n }\n }\n },\n }),\n};\n","import { http, createQStashClient, type HttpClient } from \"../../http\";\nimport type { QStashUser } from \"./types\";\n\nlet cachedToken: string | null = null;\nlet tokenExpiry: number = 0;\n\n/**\n * Gets the QStash token from the Upstash API\n * Caches the token for 1 hour to avoid unnecessary API calls\n */\nexport async function getQStashToken(): Promise<string> {\n const now = Date.now();\n\n // Return cached token if it's still valid (cached for 1 hour)\n if (cachedToken && now < tokenExpiry) {\n return cachedToken;\n }\n\n try {\n const user = await http.get<QStashUser>(\"qstash/user\");\n cachedToken = user.token;\n tokenExpiry = now + 60 * 60 * 1000; // Cache for 1 hour\n return user.token;\n } catch (error) {\n throw new Error(\n `Failed to get QStash token: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Creates a QStash client with automatically fetched token\n */\nexport async function createQStashClientWithToken(\n creds: {\n url?: string;\n token?: string;\n } = {}\n): Promise<HttpClient> {\n if (!creds?.token) {\n creds.token = await getQStashToken();\n }\n return createQStashClient({\n url: creds?.url,\n token: creds?.token,\n });\n}\n\n/**\n * Clears the cached token (useful for testing or when token becomes invalid)\n */\nexport function clearTokenCache(): void {\n cachedToken = null;\n tokenExpiry = 0;\n}\n","import { z } from \"zod\";\nimport { json, tool } from \"..\";\nimport { createQStashClientWithToken } from \"./utils\";\nimport type { WorkflowLogsResponse, WorkflowDLQResponse, WorkflowDLQMessage } from \"./types\";\nimport { qstashCreds } from \"./qstash\";\n\nexport const workflowTools = {\n workflow_logs_list: tool({\n description: `List Upstash Workflow logs with optional filtering. Returns grouped workflow runs with their execution details.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n workflowRunId: z.string().optional().describe(\"Filter by specific workflow run ID\"),\n count: z.number().optional().describe(\"Number of workflow runs to return\"),\n state: z\n .enum([\"RUN_STARTED\", \"RUN_SUCCESS\", \"RUN_FAILED\", \"RUN_CANCELED\"])\n .optional()\n .describe(\"Filter by workflow state\"),\n workflowUrl: z.string().optional().describe(\"Filter by workflow URL (exact match)\"),\n workflowCreatedAt: z\n .number()\n .optional()\n .describe(\"Filter by workflow creation timestamp (Unix timestamp)\"),\n ...qstashCreds,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params.qstash_creds);\n\n const response = await client.get<WorkflowLogsResponse>(\"v2/workflows/events\", {\n trimBody: 0,\n groupBy: \"workflowRunId\",\n ...params,\n });\n\n const cleaned = response.runs.map((run) =>\n Object.fromEntries(Object.entries(run).filter(([key, _value]) => key !== \"steps\"))\n );\n\n return [\n `Found ${response.runs.length} workflow runs`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json({\n ...response,\n runs: cleaned,\n }),\n ];\n },\n }),\n\n workflow_logs_get: tool({\n description: `Get details of a single workflow run by workflow run ID. There\n could be multiple workflow runs with the same workflow run ID, so you can\n use the workflowCreatedAt to get the details of the specific workflow run.`,\n inputSchema: z.object({\n workflowRunId: z.string().describe(\"The workflow run ID to get details for\"),\n workflowCreatedAt: z\n .number()\n .optional()\n .describe(\"The workflow creation timestamp (Unix timestamp)\"),\n ...qstashCreds,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params.qstash_creds);\n const response = await client.get<WorkflowLogsResponse>(\"v2/workflows/logs\", {\n ...params,\n });\n\n if (response.runs.length === 0) {\n return \"No workflow run found\";\n }\n\n const workflowRun = response.runs[0];\n return [\n `Workflow run details for ID: ${params.workflowRunId} created at: ${params.workflowCreatedAt}`,\n json(workflowRun),\n ];\n },\n }),\n\n workflow_dlq_list: tool({\n description: `List failed workflow runs in the Dead Letter Queue (DLQ) with optional filtering.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n workflowRunId: z.string().optional().describe(\"Filter by workflow run ID\"),\n workflowUrl: z.string().optional().describe(\"Filter by workflow URL\"),\n fromDate: z.number().optional().describe(\"Filter from date (Unix timestamp in milliseconds)\"),\n toDate: z.number().optional().describe(\"Filter to date (Unix timestamp in milliseconds)\"),\n responseStatus: z.number().optional().describe(\"Filter by HTTP response status code\"),\n callerIP: z.string().optional().describe(\"Filter by IP address of the caller\"),\n failureCallbackState: z.string().optional().describe(\"Filter by failure callback state\"),\n count: z.number().optional().describe(\"Number of DLQ messages to return\"),\n ...qstashCreds,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params.qstash_creds);\n\n const response = await client.get<WorkflowDLQResponse>(\"v2/workflows/dlq\", {\n ...params,\n trimBody: 0,\n });\n\n const cleaned = response.messages.map((message) =>\n Object.fromEntries(Object.entries(message).filter(([key]) => !key.includes(\"header\")))\n );\n\n return [\n `Found ${response.messages.length} failed workflow runs in DLQ`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json({\n ...response,\n messages: cleaned,\n }),\n ];\n },\n }),\n\n workflow_dlq_get: tool({\n description: `Get details of a single failed workflow run from the DLQ by DLQ ID.`,\n inputSchema: z.object({\n dlqId: z.string().describe(\"The DLQ ID of the failed workflow run to retrieve\"),\n ...qstashCreds,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params.qstash_creds);\n const message = await client.get<WorkflowDLQMessage>(`v2/workflows/dlq/${params.dlqId}`);\n\n return [`Failed workflow run details for DLQ ID: ${params.dlqId}`, json(message)];\n },\n }),\n\n workflow_dlq_manage: tool({\n description: `Delete, restart, and resume failed workflow runs in the DLQ using only the DLQ ID.`,\n inputSchema: z.object({\n dlqId: z.string().describe(\"The DLQ ID of the failed workflow run\"),\n action: z\n .enum([\"delete\", \"restart\", \"resume\"])\n .describe(\n \"The action to perform: delete (remove from DLQ), restart (from beginning), or resume (from the failed step)\"\n ),\n ...qstashCreds,\n }),\n handler: async ({ dlqId, action, qstash_creds }) => {\n const client = await createQStashClientWithToken(qstash_creds);\n\n switch (action) {\n case \"delete\": {\n await client.delete(`v2/workflows/dlq/delete/${dlqId}`);\n return `Failed workflow run with DLQ ID ${dlqId} deleted successfully`;\n }\n\n case \"restart\": {\n const restartResponse = await client.post(`v2/workflows/dlq/restart/${dlqId}`);\n return [\n `Workflow run restarted successfully from DLQ ID: ${dlqId}`,\n json(restartResponse),\n ];\n }\n\n case \"resume\": {\n const resumeResponse = await client.post(`v2/workflows/dlq/resume/${dlqId}`);\n return [`Workflow run resumed successfully from DLQ ID: ${dlqId}`, json(resumeResponse)];\n }\n\n default: {\n throw new Error(\n `Invalid action: ${action}. Supported actions are: delete, restart, resume`\n );\n }\n }\n },\n }),\n};\n","import type { CustomTool } from \"../../tool\";\nimport { qstashTools } from \"./qstash\";\nimport { workflowTools } from \"./workflow\";\n\nexport const qstashAllTools: Record<string, CustomTool> = {\n ...qstashTools,\n ...workflowTools,\n};\n","import type { ZodSchema } from \"zod\";\nimport type { CustomTool } from \"../tool\";\nimport { redisTools } from \"./redis\";\nimport { qstashAllTools } from \"./qstash\";\n\nexport const json = (json: unknown) =>\n typeof json === \"string\" ? json : JSON.stringify(json, null, 2);\n\nexport const tools: Record<string, CustomTool> = {\n ...redisTools,\n ...qstashAllTools,\n} as unknown as Record<string, CustomTool>;\n\n// Only used for type inference\nexport function tool<TSchema extends ZodSchema>(tool: CustomTool<TSchema>): CustomTool {\n return tool as unknown as CustomTool;\n}\n","export const MAX_MESSAGE_LENGTH = 30_000;\n","import type { CallToolResultSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ZodSchema } from \"zod\";\nimport type { z } from \"zod\";\nimport { MAX_MESSAGE_LENGTH } from \"./settings\";\n\ntype HandlerResponse = string | string[] | z.infer<typeof CallToolResultSchema>;\n\nexport type CustomTool<TSchema extends ZodSchema = ZodSchema> = {\n description: string;\n\n /**\n * Zod schema for the input of the tool.\n */\n inputSchema?: TSchema;\n\n /**\n * The handler function for the tool.\n * @param input Parsed input according to the input schema.\n * @returns\n * If result is a string, it will be displayed as a single text block.\n * If result is an array of strings, each string will be displayed as a separate text block.\n * You can also return a CallToolResult object to display more complex content.\n */\n handler: (input: z.infer<TSchema>) => Promise<HandlerResponse>;\n};\n\nexport function handlerResponseToCallResult(\n response: HandlerResponse\n): z.infer<typeof CallToolResultSchema> {\n if (typeof response === \"string\" || Array.isArray(response)) {\n const array = Array.isArray(response) ? response : [response];\n\n // Truncate messages that are too long\n const truncatedArray = array.map((item) =>\n item.length > MAX_MESSAGE_LENGTH\n ? `${item.slice(0, MAX_MESSAGE_LENGTH)}... (MESSAGE TRUNCATED, MENTION THIS TO USER)`\n : item\n );\n\n return {\n content: truncatedArray.map((text) => ({ type: \"text\" as const, text })),\n };\n } else return response;\n}\n","import { http } from \"./http\";\nimport { log } from \"./log\";\nimport type { RedisDatabase } from \"./tools/redis/types\";\n\nexport async function testConnection() {\n log(\"๐งช Testing connection to Upstash API\");\n\n let dbs: RedisDatabase[] | undefined;\n try {\n dbs = await http.get<RedisDatabase[]>(\"v2/redis/databases\");\n } catch (error) {\n log(\n \"โ Connection to Upstash API failed. Please check your api key and email. Error: \",\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n\n if (!Array.isArray(dbs))\n throw new Error(\"Invalid response from Upstash API. Check your API key and email.\");\n\n log(\"โ
Connection to Upstash API is successful\");\n}\n"],"mappings":"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","names":["z","config","req","z","z","fetch","z","z","z","z","z","z","z","json","tool","z","tool","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/config.ts","../src/log.ts","../src/tools/utils.ts","../src/tools/helpers.ts","../src/tools/redis/backup.ts","../src/middlewares.ts","../src/version.ts","../src/telemetry.ts","../src/http.ts","../src/tools/redis/command.ts","../src/tools/redis/db.ts","../src/utils.ts","../src/tools/redis/index.ts","../src/tools/qstash/qstash.ts","../src/tools/qstash/utils.ts","../src/tools/qstash/common.ts","../src/tools/qstash/workflow.ts","../src/tools/qstash/index.ts","../src/tools/box/manage.ts","../src/tools/box/common.ts","../src/tools/box/utils.ts","../src/tools/box/exec.ts","../src/tools/box/agent-run.ts","../src/tools/box/logs.ts","../src/tools/box/runs.ts","../src/tools/box/preview.ts","../src/tools/box/snapshots.ts","../src/tools/box/index.ts","../src/tools/index.ts","../src/settings.ts","../src/tool.ts","../src/test-connection.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { Command } from \"commander\";\n// eslint-disable-next-line unicorn/prefer-node-protocol\nimport { createServer, type IncomingMessage } from \"http\";\nimport { createServerInstance } from \"./server.js\";\nimport { config } from \"./config\";\nimport { testConnection } from \"./test-connection\";\nimport { initDebugLog } from \"./log\";\nimport \"dotenv/config\";\n\n/**\n * Last version of the MCP server required \"run\" command to be used.\n * This is a backwards compatibility fix to allow the MCP server to be used with the old command.\n */\n\n// Handle legacy 'run' command format before parsing\nlet argv = process.argv.slice(2);\n\n// Check for legacy format and transform it to the new format\nif (argv.length >= 3 && argv[0] === \"run\") {\n argv = [\"--email\", argv[1], \"--api-key\", argv[2], ...argv.slice(3)];\n}\n\nconst program = new Command()\n .option(\"--transport <stdio|http>\", \"transport type\", \"stdio\")\n .option(\"--port <number>\", \"port for HTTP transport\", \"3000\")\n .option(\"--email <email>\", \"Upstash email\")\n .option(\"--api-key <key>\", \"Upstash API key\")\n .option(\"--box-api-key <key>\", \"Upstash Box API key (optional)\")\n .option(\"--debug\", \"Enable debug mode\")\n .option(\"--disable-telemetry\", \"Disable telemetry headers sent to Upstash APIs\")\n .allowUnknownOption(); // let other wrappers pass through extra flags\n\nprogram.parse(argv, { from: \"user\" });\n\nconst cliOptions = program.opts<{\n transport: string;\n port: string;\n email?: string;\n apiKey?: string;\n boxApiKey?: string;\n debug?: boolean;\n disableTelemetry?: boolean;\n}>();\n\nexport const DEBUG = cliOptions.debug ?? false;\n\nif (DEBUG) {\n initDebugLog(new URL(\"../\", import.meta.url).pathname);\n}\n\n// Validate transport option\nconst allowedTransports = [\"stdio\", \"http\"];\nif (!allowedTransports.includes(cliOptions.transport)) {\n console.error(\n `Invalid --transport value: '${cliOptions.transport}'. Must be one of: stdio, http.`\n );\n process.exit(1);\n}\n\n// Transport configuration\nconst TRANSPORT_TYPE = (cliOptions.transport || \"stdio\") as \"stdio\" | \"http\";\n\n// Disallow incompatible flags based on transport\nconst passedPortFlag = process.argv.includes(\"--port\");\n\nif (TRANSPORT_TYPE === \"stdio\" && passedPortFlag) {\n console.error(\"The --port flag is not allowed when using --transport stdio.\");\n process.exit(1);\n}\n\n// HTTP port configuration\nconst CLI_PORT = (() => {\n const parsed = Number.parseInt(cliOptions.port, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n})();\n\nasync function main() {\n // Get credentials from CLI options or environment\n const email = cliOptions.email || process.env.UPSTASH_EMAIL;\n const apiKey = cliOptions.apiKey || process.env.UPSTASH_API_KEY;\n\n if (!email || !apiKey) {\n console.error(\n \"Missing required credentials. Provide --email and --api-key or set UPSTASH_EMAIL and UPSTASH_API_KEY environment variables.\"\n );\n process.exit(1);\n }\n\n // Set config\n config.email = email;\n config.apiKey = apiKey;\n config.boxApiKey = cliOptions.boxApiKey || process.env.UPSTASH_BOX_API_KEY || \"\";\n config.disableTelemetry = cliOptions.disableTelemetry ?? false;\n\n // Test connection\n await testConnection();\n\n const transportType = TRANSPORT_TYPE;\n\n if (transportType === \"http\") {\n // Get initial port from environment or use default\n const initialPort = CLI_PORT ?? 3000;\n // Keep track of which port we end up using\n let actualPort = initialPort;\n const httpServer = createServer(async (req: IncomingMessage, res: any) => {\n const pathname = new (globalThis as any).URL(req.url || \"\", `http://${req.headers.host}`)\n .pathname;\n\n // Set CORS headers for all responses\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET,POST,OPTIONS,DELETE\");\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, MCP-Session-Id, MCP-Protocol-Version, X-Upstash-API-Key, Upstash-API-Key, X-API-Key, Authorization\"\n );\n res.setHeader(\"Access-Control-Expose-Headers\", \"MCP-Session-Id\");\n\n // Handle preflight OPTIONS requests\n if (req.method === \"OPTIONS\") {\n res.writeHead(200);\n res.end();\n return;\n }\n\n try {\n // Create new server instance for each request\n const requestServer = createServerInstance();\n\n if (pathname === \"/mcp\") {\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await requestServer.connect(transport);\n await transport.handleRequest(req, res);\n } else if (pathname === \"/ping\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"ok\", message: \"pong\" }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", status: 404 }));\n }\n } catch (error) {\n console.error(\"Error handling request:\", error);\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n }\n });\n\n // Function to attempt server listen with port fallback\n const startServer = (port: number, maxAttempts = 10) => {\n httpServer.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\" && port < initialPort + maxAttempts) {\n console.warn(`Port ${port} is in use, trying port ${port + 1}...`);\n startServer(port + 1, maxAttempts);\n } else {\n console.error(`Failed to start server: ${err.message}`);\n process.exit(1);\n }\n });\n\n httpServer.listen(port, () => {\n actualPort = port;\n console.error(\n `Upstash MCP Server running on ${transportType.toUpperCase()} at http://localhost:${actualPort}/mcp`\n );\n });\n };\n\n // Start the server with initial port\n startServer(initialPort);\n } else {\n // Stdio transport - this is already stateless by nature\n const server = createServerInstance();\n const transport = new StdioServerTransport();\n\n // Log the RCP messages coming to the transport\n // const originalOnmessage = transport.onmessage;\n // transport.onmessage = (message) => {\n // console.error(\"message\", message);\n\n // originalOnmessage?.(message);\n // };\n\n await server.connect(transport);\n console.error(\"Upstash MCP Server running on stdio\");\n }\n}\n\n// eslint-disable-next-line unicorn/prefer-top-level-await\nmain().catch((error) => {\n console.error(\"Fatal error in main():\", error);\n process.exit(1);\n});\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { config } from \"./config\";\nimport { log } from \"./log\";\nimport { tools } from \"./tools\";\nimport { handlerResponseToCallResult } from \"./tool\";\nimport z from \"zod\";\nimport { DEBUG } from \".\";\n\n// Function to create a new server instance with all tools registered\nexport function createServerInstance() {\n const server = new McpServer(\n { name: \"upstash\", version: \"0.1.0\" },\n {\n capabilities: {\n tools: {},\n logging: {},\n },\n }\n );\n\n const filteredTools = config.readonly\n ? Object.fromEntries(Object.entries(tools).filter(([_, tool]) => tool.readonly))\n : tools;\n\n const toolsList = Object.entries(filteredTools).map(([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n tool,\n }));\n\n // Register all tools from the toolsList\n for (const toolDef of toolsList) {\n const toolName = toolDef.name;\n const tool = toolDef.tool;\n\n server.registerTool(\n toolName,\n {\n description: tool.description,\n inputSchema: ((tool.inputSchema ?? z.object({})) as any).shape,\n },\n // @ts-expect-error - Just ignore the types here\n async (args) => {\n log(\"< received tool call:\", toolName, args);\n\n try {\n const result = await tool.handler(args);\n const response = handlerResponseToCallResult(result);\n log(\"> tool result:\", response.content.map((item) => item.text).join(\"\\n\"));\n return response;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log(\"> error in tool call:\", msg);\n return {\n content: [\n {\n type: \"text\",\n text: `${error instanceof Error ? error.name : \"Error\"}: ${msg}`,\n },\n ...(DEBUG\n ? [\n {\n type: \"text\",\n text: `\\nStack trace: ${error instanceof Error ? error.stack : \"No stack trace available\"}`,\n },\n ]\n : []),\n ],\n isError: true,\n };\n }\n }\n );\n }\n\n return server;\n}\n","export const config = {\n apiKey: \"\",\n email: \"\",\n boxApiKey: \"\",\n disableTelemetry: false,\n readonly: false,\n};\n","// eslint-disable-next-line unicorn/prefer-node-protocol\nimport { appendFileSync } from \"fs\";\n// eslint-disable-next-line unicorn/prefer-node-protocol\nimport path from \"path\";\n\nlet debugLogPath: string | null = null;\n\nexport function initDebugLog(projectRoot: string) {\n debugLogPath = path.resolve(projectRoot, \"upstash-debug.log\");\n}\n\nexport function log(...args: unknown[]) {\n const msg = `[DEBUG ${new Date().toISOString()}] ${args.map((arg) => (typeof arg === \"string\" ? arg : JSON.stringify(arg))).join(\" \")}\\n`;\n\n for (const [, logs] of logsStore.entries()) {\n logs.push(msg);\n }\n\n process.stderr.write(msg);\n\n if (debugLogPath) {\n try {\n appendFileSync(debugLogPath, msg);\n } catch {\n // ignore file write errors\n }\n }\n}\n\nconst logsStore = new Map<string, string[]>();\n\nexport function startCollectLogs() {\n const id = Array.from({ length: 10 })\n .fill(0)\n .map(() => Math.random().toString(36).slice(2, 15))\n .join(\"\");\n\n logsStore.set(id, []);\n\n return id;\n}\n\nexport function popLogs(id: string) {\n const logs = logsStore.get(id);\n\n if (!logs) {\n return [];\n }\n\n logsStore.delete(id);\n\n return logs;\n}\n","import { z } from \"zod\";\nimport { tool } from \"./helpers\";\n\nexport const utilTools = {\n util_timestamps_to_date: tool({\n readonly: true,\n description: `Use this tool to convert a timestamp to a human-readable date`,\n inputSchema: z.object({\n timestamps: z.array(z.number()).describe(\"Array of timestamps to convert\"),\n }),\n handler: async ({ timestamps }) => {\n return timestamps.map((timestamp) => new Date(timestamp).toUTCString());\n },\n }),\n util_dates_to_timestamps: tool({\n readonly: true,\n description: `Use this tool to convert an array of ISO 8601 dates to an array of timestamps`,\n inputSchema: z.object({\n dates: z.array(z.string()).describe(\"Array of dates to convert\"),\n }),\n handler: async ({ dates }) => {\n return dates.map((date) => new Date(date).getTime()).join(\",\");\n },\n }),\n};\n","import type { ZodSchema } from \"zod\";\nimport type { CustomTool } from \"../tool\";\n\nexport const json = (value: unknown) =>\n typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n\nexport function tool<TSchema extends ZodSchema>(t: CustomTool<TSchema>): CustomTool {\n return t as unknown as CustomTool;\n}\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { http } from \"../../http\";\nimport type { RedisBackup } from \"./types\";\n\nexport const redisBackupTools = {\n redis_database_manage_backup: tool({\n description: `Create, delete, or restore backups for a specific Upstash redis database. This tool handles all backup operations in one unified interface.`,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to manage backups for.\"),\n operation: z\n .union([z.literal(\"create\"), z.literal(\"delete\"), z.literal(\"restore\")])\n .describe(\"The backup operation to perform: create, delete, or restore.\"),\n backup_name: z\n .string()\n .optional()\n .describe(\"Name for the backup (required for create operation).\"),\n backup_id: z\n .string()\n .optional()\n .describe(\"ID of the backup (required for delete and restore operations).\"),\n }),\n handler: async ({ database_id, operation, backup_name, backup_id }) => {\n switch (operation) {\n case \"create\": {\n if (!backup_name) {\n throw new Error(\"backup_name is required for create operation\");\n }\n await http.post([\"v2/redis/create-backup\", database_id], {\n name: backup_name,\n });\n return `Backup \"${backup_name}\" created successfully for database ${database_id}.`;\n }\n\n case \"delete\": {\n if (!backup_id) {\n throw new Error(\"backup_id is required for delete operation\");\n }\n await http.delete([\"v2/redis/delete-backup\", database_id, backup_id]);\n return `Backup ${backup_id} deleted successfully from database ${database_id}.`;\n }\n\n case \"restore\": {\n if (!backup_id) {\n throw new Error(\"backup_id is required for restore operation\");\n }\n await http.post([\"v2/redis/restore-backup\", database_id], {\n backup_id,\n });\n return `Backup ${backup_id} restored successfully to database ${database_id}.`;\n }\n\n default: {\n throw new Error(`Invalid operation: ${operation}. Use create, delete, or restore.`);\n }\n }\n },\n }),\n\n redis_database_list_backups: tool({\n readonly: true,\n // TODO: Add explanation for fields\n // TODO: Is this in bytes?\n description: `List all backups of a specific Upstash redis database.`,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to list backups for.\"),\n }),\n handler: async ({ database_id }) => {\n const backups = await http.get<RedisBackup[]>([\"v2/redis/list-backup\", database_id]);\n\n return json(backups);\n },\n }),\n\n redis_database_set_daily_backup: tool({\n description: `Enable or disable daily backups for a specific Upstash redis database.`,\n inputSchema: z.object({\n database_id: z\n .string()\n .describe(\"The ID of the database to enable or disable daily backups for.\"),\n enable: z.boolean().describe(\"Whether to enable or disable daily backups.\"),\n }),\n handler: async ({ database_id, enable }) => {\n await http.patch([\n `v2/redis/${enable ? \"enable-dailybackup\" : \"disable-dailybackup\"}`,\n database_id,\n ]);\n\n return \"OK\";\n },\n }),\n};\n","import type { UpstashRequest } from \"./http\";\n\ntype Middleware = (req: UpstashRequest, next: () => Promise<unknown>) => Promise<unknown>;\n\nconst formatTimestamps = (obj: unknown): void => {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n for (const item of obj) {\n formatTimestamps(item);\n }\n return;\n }\n\n // Handle objects\n for (const [key, value] of Object.entries(obj)) {\n // Check if key matches our criteria: contains \"creationTime\" or has \"createdAt\" anywhere (case-insensitive)\n const shouldFormat =\n typeof value === \"number\" &&\n (key === \"creationTime\" ||\n key === \"creation_time\" ||\n key === \"time\" ||\n key.toLowerCase().includes(\"createdat\"));\n\n if (shouldFormat && typeof value === \"number\" && value > 0) {\n // Format timestamp to human readable format\n // Assume timestamps > 1_000_000_000_000 are in milliseconds, otherwise seconds\n const timestamp = value > 1_000_000_000_000 ? value : value * 1000;\n\n // Show milliseconds in the human readable format\n\n const formatted = new Date(timestamp).toLocaleString(\"en-US\", { timeZoneName: \"short\" });\n (obj as any)[key] = `${formatted} (${value})`;\n } else if (value && typeof value === \"object\") {\n // Recursively process nested objects\n formatTimestamps(value);\n }\n }\n};\n\nconst middlewares: Middleware[] = [\n // Middleware to format timestamp fields to human readable format\n async (req, next) => {\n const res = await next();\n formatTimestamps(res);\n return res;\n },\n];\n\nexport const applyMiddlewares = async (\n req: UpstashRequest,\n func: (req: UpstashRequest) => Promise<unknown>\n) => {\n let next = async () => func(req);\n for (const middleware of middlewares.reverse()) {\n const prevNext = next;\n next = async () => middleware(req, prevNext);\n }\n return next();\n};\n","export const VERSION='0.2.3-rc.2'\n","import { VERSION } from \"./version.js\";\n\nfunction getRuntime(): string {\n if ((globalThis as any).Bun !== undefined) {\n return `bun@${(globalThis as any).Bun.version}`;\n }\n if ((globalThis as any).Deno !== undefined) {\n const denoVersion = (globalThis as any).Deno?.version?.deno;\n return denoVersion ? `deno@${denoVersion}` : \"deno\";\n }\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return `node@${process.versions.node}`;\n }\n return \"unknown\";\n}\n\nfunction getPlatform(): string {\n if (typeof process !== \"undefined\" && process.platform) {\n return process.platform;\n }\n return \"unknown\";\n}\n\nexport const telemetry = {\n runtime: getRuntime(),\n platform: getPlatform(),\n sdk: `@upstash/mcp-server@${VERSION}`,\n};\n","import { config } from \"./config\";\nimport { log } from \"./log\";\nimport { applyMiddlewares } from \"./middlewares\";\nimport { json } from \"./tools/helpers\";\nimport { telemetry } from \"./telemetry\";\n\nexport type UpstashRequest = {\n method: string;\n path?: string[] | string;\n /**\n * Request body will be serialized to json\n */\n body?: unknown;\n /**\n * Query parameters, object and undefined will be ignored\n */\n query?: Record<string, string | number | boolean | undefined | object>;\n /**\n * Custom headers\n */\n headers?: Record<string, string>;\n /**\n * Optional QStash token - if provided, will use Bearer auth instead of Basic auth\n */\n qstashToken?: string;\n};\n\nexport type HttpClientConfig = {\n baseUrl: string;\n /**\n * Optional QStash token for Bearer authentication\n */\n qstashToken?: string;\n};\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly qstashToken?: string;\n\n public constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.qstashToken = config.qstashToken;\n }\n\n public async get<TResponse>(\n path: string[] | string,\n query?: Record<string, string | number | boolean | undefined | object>\n ): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"GET\", path, query });\n }\n\n public async post<TResponse>(\n path: string[] | string,\n body?: unknown,\n headers?: Record<string, string>\n ): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"POST\", path, body, headers });\n }\n\n public async put<TResponse>(\n path: string[] | string,\n body?: unknown,\n headers?: Record<string, string>\n ): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"PUT\", path, body, headers });\n }\n\n public async patch<TResponse>(path: string[] | string, body?: unknown): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"PATCH\", path, body });\n }\n\n public async delete<TResponse>(path: string[] | string, body?: unknown): Promise<TResponse> {\n return this.requestWithMiddleware<TResponse>({ method: \"DELETE\", path, body });\n }\n\n private async requestWithMiddleware<TResponse>(req: UpstashRequest): Promise<TResponse> {\n const res = await applyMiddlewares(req, async (req) => {\n return this.request<TResponse>(req);\n });\n\n return res as TResponse;\n }\n\n private async request<TResponse>(req: UpstashRequest): Promise<TResponse> {\n if (!req.path) {\n req.path = [];\n } else if (typeof req.path === \"string\") {\n req.path = [req.path];\n }\n\n let url = [this.baseUrl, ...req.path].join(\"/\");\n\n // Add query parameters\n if (req.query) {\n const queryPairs: string[] = [];\n for (const [key, value] of Object.entries(req.query)) {\n if (value !== undefined && value !== null && typeof value !== \"object\") {\n queryPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n }\n }\n if (queryPairs.length > 0) {\n url += `?${queryPairs.join(\"&\")}`;\n }\n }\n\n // Determine authentication method\n const qstashToken = req.qstashToken || this.qstashToken;\n let authHeader: string;\n\n if (qstashToken) {\n authHeader = `Bearer ${qstashToken}`;\n } else {\n const token = [config.email, config.apiKey].join(\":\");\n authHeader = `Basic ${Buffer.from(token).toString(\"base64\")}`;\n }\n\n const telemetryHeaders: Record<string, string> = config.disableTelemetry\n ? {}\n : {\n \"Upstash-Telemetry-Runtime\": telemetry.runtime,\n \"Upstash-Telemetry-Platform\": telemetry.platform,\n \"Upstash-Telemetry-Sdk\": telemetry.sdk,\n };\n\n const init: RequestInit = {\n method: req.method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: authHeader,\n ...telemetryHeaders,\n ...req.headers,\n } as Record<string, string>,\n };\n\n if (req.method !== \"GET\" && req.body !== undefined) {\n init.body = JSON.stringify(req.body);\n }\n\n log(\"-> sending request\", {\n url,\n ...init,\n headers: {\n ...init.headers,\n Authorization: \"***\",\n },\n });\n\n // fetch is defined by isomorphic fetch\n const res = await fetch(url, init);\n if (!res.ok) {\n throw new Error(`Request failed (${res.status} ${res.statusText}): ${await res.text()}`);\n }\n\n // Handle empty responses\n const text = await res.text();\n if (!text) {\n return {} as TResponse;\n }\n\n const result = safeParseJson(text) as TResponse;\n\n if (result) {\n log(\"<- received response\", json(result));\n } else {\n log(\"<- received text response\", text);\n }\n\n return result || (text as TResponse);\n }\n}\n\nconst safeParseJson = <TResponse>(text: string) => {\n try {\n return JSON.parse(text) as TResponse;\n } catch {\n return;\n }\n};\n\nexport const http = new HttpClient({ baseUrl: \"https://api.upstash.com\" });\n\n/**\n * Creates a QStash-enabled HttpClient with the provided token\n */\nexport function createQStashClient({ url, token }: { url?: string; token: string }): HttpClient {\n return new HttpClient({\n baseUrl: url ?? \"https://qstash.upstash.io\",\n qstashToken: token,\n });\n}\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { log } from \"../../log\";\nimport { http } from \"../../http\";\nimport { config } from \"../../config\";\nimport type { RedisDatabase } from \"./types\";\n\ntype RedisCommandResult =\n | {\n result: unknown;\n }\n | {\n error: string;\n };\n\nexport const redisCommandTools = {\n redis_database_run_redis_commands: tool({\n readonly: true,\n description: `Run one or more Redis commands on a specific Upstash redis database. Either provide database_id OR both database_rest_url and database_rest_token.\nNOTE: For discovery, use SCAN over KEYS. Use TYPE to get the type of a key.\nNOTE: SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]\nNOTE: Multiple commands will be executed as a pipeline for better performance.`,\n inputSchema: z.object({\n database_id: z.string().optional().describe(\"The ID of the database to run commands on.\"),\n database_rest_url: z\n .string()\n .optional()\n .describe(\"The REST URL of the database. Example: https://***.upstash.io\"),\n database_rest_token: z.string().optional().describe(\"The REST token of the database.\"),\n commands: z\n .array(z.array(z.string()))\n .describe(\n \"The Redis commands to run. For single command: [['SET', 'foo', 'bar']], for multiple: [['SET', 'foo', 'bar'], ['GET', 'foo']]\"\n ),\n }),\n\n handler: async ({ database_id, database_rest_url, database_rest_token, commands }) => {\n if (database_id && (database_rest_url || database_rest_token)) {\n throw new Error(\n \"Either provide database_id OR both database_rest_url and database_rest_token\"\n );\n } else if (!database_id && (!database_rest_url || !database_rest_token)) {\n throw new Error(\n \"Either provide database_id OR both database_rest_url and database_rest_token\"\n );\n }\n\n let restUrl = database_rest_url;\n let restToken = database_rest_token;\n\n // If only database_id is provided, fetch the database details\n if (database_id && (!database_rest_url || !database_rest_token)) {\n log(\"Fetching database details for database_id:\", database_id);\n const db = await http.get<RedisDatabase>([\"v2/redis/database\", database_id]);\n restUrl = \"https://\" + db.endpoint;\n restToken = config.readonly ? db.read_only_rest_token : db.rest_token;\n }\n\n if (!restUrl || !restToken) {\n throw new Error(\"Could not determine REST URL and token for the database\");\n }\n const isSingleCommand = commands.length === 1;\n const url = isSingleCommand ? restUrl : restUrl + \"/pipeline\";\n const body = isSingleCommand ? JSON.stringify(commands[0]) : JSON.stringify(commands);\n\n const req = await fetch(url, {\n method: \"POST\",\n body,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${restToken}`,\n },\n });\n\n if (isSingleCommand) {\n const result = (await req.json()) as RedisCommandResult;\n\n log(\"command result:\", result);\n\n if (\"error\" in result) {\n throw new Error(\"Redis error: \" + result.error);\n }\n\n const isScanCommand = commands[0][0].toLocaleLowerCase().includes(\"scan\");\n const messages = [json(result)];\n\n if (isScanCommand)\n messages.push(`NOTE: Use the returned cursor to get the next set of keys.\nNOTE: The result might be too large to be returned. If applicable, stop after the second SCAN command and ask the user if they want to continue.`);\n\n return messages;\n } else {\n const result = (await req.json()) as RedisCommandResult[];\n\n log(\"commands result:\", result);\n\n if (result.some((r) => \"error\" in r)) {\n throw new Error(\"Some commands in the pipeline resulted in an error:\\n\" + json(result));\n }\n\n return json(result);\n }\n },\n }),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { http } from \"../../http\";\nimport type { RedisDatabase, RedisUsageResponse, UsageData } from \"./types\";\nimport { pruneFalsy } from \"../../utils\";\n\nconst readRegionSchema = z.union([\n z.literal(\"us-east-1\"),\n z.literal(\"us-west-1\"),\n z.literal(\"us-west-2\"),\n z.literal(\"eu-west-1\"),\n z.literal(\"eu-central-1\"),\n z.literal(\"ap-southeast-1\"),\n z.literal(\"ap-southeast-2\"),\n z.literal(\"sa-east-1\"),\n]);\n\nconst GENERIC_DATABASE_NOTES =\n \"\\nNOTE: Don't show the database ID from the response to the user unless explicitly asked or needed.\\n\";\n\nexport const redisDbOpsTools = {\n redis_database_create_new: tool({\n description: `Create a new Upstash redis database. \nNOTE: Ask user for the region and name of the database.${GENERIC_DATABASE_NOTES}`,\n inputSchema: z.object({\n name: z.string().describe(\"Name of the database.\"),\n primary_region: readRegionSchema.describe(`Primary Region of the Global Database.`),\n read_regions: z\n .array(readRegionSchema)\n .optional()\n .describe(`Array of read regions of the db`),\n }),\n handler: async ({ name, primary_region, read_regions }) => {\n const newDb = await http.post<RedisDatabase>(\"v2/redis/database\", {\n name,\n region: \"global\",\n primary_region,\n read_regions,\n });\n\n return [\n json(newDb),\n `Upstash console url: https://console.upstash.com/redis/${newDb.database_id}`,\n ];\n },\n }),\n\n redis_database_delete: tool({\n description: `Delete an Upstash redis database.`,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to delete.\"),\n }),\n handler: async ({ database_id }) => {\n await http.delete([\"v2/redis/database\", database_id]);\n\n return \"Database deleted successfully.\";\n },\n }),\n\n redis_database_list_databases: tool({\n readonly: true,\n description: `List all Upstash redis databases. Only their names and ids.${GENERIC_DATABASE_NOTES}`,\n handler: async () => {\n const dbs = await http.get<RedisDatabase[]>(\"v2/redis/databases\");\n\n const messages = [\n json(\n dbs.map((db) => {\n const result = {\n database_id: db.database_id,\n database_name: db.database_name,\n state: db.state === \"active\" ? undefined : db.state,\n };\n return pruneFalsy(result);\n })\n ),\n ];\n\n if (dbs.length > 2)\n messages.push(\n `NOTE: If the user did not specify a database name for the next command, ask them to choose a database from the list.`\n );\n messages.push(\n \"NOTE: If the user wants to see dbs in another team, mention that they need to create a new management api key for that team and initialize MCP server with the newly created key.\"\n );\n\n return messages;\n },\n }),\n\n redis_database_get_details: tool({\n readonly: true,\n description: `Get further details of a specific Upstash redis database. Includes all details of the database including usage statistics.\ndb_disk_threshold: Total disk usage limit.\ndb_memory_threshold: Maximum memory usage.\ndb_daily_bandwidth_limit: Maximum daily network bandwidth usage.\ndb_request_limit: Total number of commands allowed.\nAll sizes are in bytes\n${GENERIC_DATABASE_NOTES}\n `,\n inputSchema: z.object({\n database_id: z.string().describe(\"The ID of the database to get details for.\"),\n }),\n handler: async ({ database_id }) => {\n const db = await http.get<RedisDatabase>([\"v2/redis/database\", database_id]);\n\n return json(db);\n },\n }),\n\n redis_database_update_regions: tool({\n description: `Update the read regions of an Upstash redis database.`,\n inputSchema: z.object({\n id: z.string().describe(\"The ID of your database.\"),\n read_regions: z\n .array(readRegionSchema)\n .describe(\n \"Array of the new read regions of the database. This will replace the old regions array. Available regions: us-east-1, us-west-1, us-west-2, eu-west-1, eu-central-1, ap-southeast-1, ap-southeast-2, sa-east-1\"\n ),\n }),\n handler: async ({ id, read_regions }) => {\n const updatedDb = await http.post<RedisDatabase>([\"v2/redis/update-regions\", id], {\n read_regions,\n });\n\n return json(updatedDb);\n },\n }),\n\n redis_database_reset_password: tool({\n description: `Reset the password of an Upstash redis database.`,\n inputSchema: z.object({\n id: z.string().describe(\"The ID of your database.\"),\n }),\n handler: async ({ id }) => {\n const updatedDb = await http.post<RedisDatabase>([\"v2/redis/reset-password\", id], {});\n\n return json(updatedDb);\n },\n }),\n\n redis_database_get_statistics: tool({\n readonly: true,\n description: `Get comprehensive usage statistics of an Upstash redis database. Returns both:\n1. PRECISE 5-day usage: Exact command count and bandwidth usage over the last 5 days\n2. SAMPLED period stats: Sampled statistics over a specified period (1h, 3h, 12h, 1d, 3d, 7d) for performance monitoring\n\nFor sampled stats, includes: read_latency_mean, write_latency_mean, keyspace, throughput (cmds/sec), diskusage\nNOTE: If user doesn't specify stat_type, defaults to \"throughput\" for sampled stats.\nNOTE: Ask user first if they want to see stats for each database separately or just for one.`,\n inputSchema: z.object({\n id: z.string().describe(\"The ID of your database.\"),\n period: z\n .union([\n z.literal(\"1h\"),\n z.literal(\"3h\"),\n z.literal(\"12h\"),\n z.literal(\"1d\"),\n z.literal(\"3d\"),\n z.literal(\"7d\"),\n ])\n .describe(\"The period for sampled stats.\"),\n stat_type: z\n .union([\n z.literal(\"read_latency_mean\"),\n z.literal(\"write_latency_mean\"),\n z.literal(\"keyspace\").describe(\"Number of keys in db\"),\n z\n .literal(\"throughput\")\n .describe(\"commands per second (sampled), calculate area for estimated count\"),\n z.literal(\"diskusage\").describe(\"Current disk usage in bytes\"),\n ])\n .optional()\n .describe(\"The type of sampled stat to get (defaults to 'throughput')\"),\n }),\n handler: async ({ id, period, stat_type }) => {\n const statType = stat_type || \"throughput\";\n const stats = await http.get<RedisUsageResponse>([\n \"v2/redis/stats\",\n `${id}?period=${period}`,\n ]);\n\n // Get the sampled stat\n const stat = stats[statType];\n if (!Array.isArray(stat))\n throw new Error(\n `Invalid stat_type provided: ${statType}. Valid keys are: ${Object.keys(stats).join(\", \")}`\n );\n\n // Return both 5-day precise stats and sampled stats\n return [\n json({\n // 5-day precise usage stats\n usage_last_5_days: {\n days: stats.days,\n command_usage: stats.dailyrequests,\n bandwidth_usage: stats.bandwidths,\n },\n // Sampled stats for the specified period and type\n sampled_stats: {\n period,\n stat_type: statType,\n data: parseUsageData(stat),\n },\n }),\n `NOTE: Times are calculated according to UTC+0`,\n `NOTE: Use the timestamps_to_date tool to parse timestamps if needed`,\n `NOTE: Don't try to plot multiple stats in the same chart`,\n ];\n },\n }),\n};\n\nconst parseUsageData = (data: UsageData) => {\n if (!data) return \"NO DATA\";\n if (!Array.isArray(data)) return \"INVALID DATA\";\n if (data.length === 0 || data.length === 1) return \"NO DATA\";\n const filteredData = data.filter((d) => d.x && d.y);\n if (filteredData.length === 0) return \"NO DATA\";\n return {\n start: filteredData[0].x,\n // last one can be null, so use the second last\n // eslint-disable-next-line unicorn/prefer-at\n end: filteredData[filteredData.length - 1]?.x,\n data: data.map((d) => [new Date(d.x).getTime(), d.y]),\n };\n};\n","export function pruneFalsy(obj: Record<string, any>) {\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => value));\n}\n","import { utilTools } from \"../utils\";\nimport { redisBackupTools } from \"./backup\";\nimport { redisCommandTools } from \"./command\";\nimport { redisDbOpsTools } from \"./db\";\nimport type { CustomTool } from \"../../tool\";\n\nexport const redisTools: Record<string, CustomTool> = {\n ...redisDbOpsTools,\n ...redisBackupTools,\n ...redisCommandTools,\n ...utilTools,\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { http } from \"../../http\";\nimport { createQStashClientWithToken } from \"./utils\";\nimport { qstashCommon } from \"./common\";\nimport type {\n QStashUser,\n QStashLogsResponse,\n QStashDLQResponse,\n QStashDLQMessage,\n QStashSchedule,\n QStashScheduleCreateResponse,\n} from \"./types\";\n\n// First, we need to get the QStash token\nexport const qstashTools = {\n qstash_get_user_token: tool({\n description: `Get the QSTASH_TOKEN and QSTASH_URL of the current user. This\n is not needed for the mcp tools since the token is automatically fetched from\n the Upstash API for them.`,\n handler: async () => {\n const user = await http.get<QStashUser>(\"v2/qstash/user\");\n return [json(user)];\n },\n }),\n\n qstash_publish_message: tool({\n description: `Publish a message to a destination URL using QStash. This\n sends an HTTP request to the specified destination via QStash's message\n queue. This can also be used to trigger a upstash workflow run.`,\n inputSchema: z.object({\n destination: z\n .string()\n .describe(\"The destination URL to send the message to (e.g., 'https://example.com')\"),\n body: z.string().optional().describe(\"Request body (JSON string or plain text)\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"])\n .optional()\n .describe(\"HTTP method (optional, defaults to POST)\")\n .default(\"POST\"),\n delay: z\n .string()\n .optional()\n .describe(\"Delay before message delivery (e.g., '10s', '5m', '1h')\"),\n retries: z.number().optional().describe(\"Number of retries on failure, default is 3\"),\n callback: z\n .string()\n .optional()\n .describe(\"Callback URL that will be called when the message is successfully delivered\"),\n failureCallback: z\n .string()\n .optional()\n .describe(\"Callback URL that will be called when the message is failed to deliver\"),\n timeout: z.string().optional().describe(\"Request timeout (e.g., '30s', '1h')\"),\n queueName: z\n .string()\n .optional()\n .describe(\n \"Queue name to use, you have to first create the queue in upstash. Prefer the flow control key instead\"\n ),\n flow_control: z\n .object({\n key: z\n .string()\n .describe(\"Unique identifier for grouping messages under same flow control rules\"),\n parallelism: z\n .number()\n .optional()\n .describe(\"Max concurrent active calls (default: unlimited)\"),\n rate: z.number().optional().describe(\"Max calls per period (default: unlimited)\"),\n period: z\n .string()\n .optional()\n .describe(\"Time window for rate limit (e.g., '1s', '1m', '1h', default: '1s')\"),\n })\n .optional()\n .describe(\"Flow control for rate limiting and parallelism management\"),\n\n extraHeaders: z.record(z.string()).optional().describe(\"Extra headers to add to the request\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const {\n destination,\n body,\n method,\n extraHeaders,\n delay,\n retries,\n callback,\n failureCallback,\n timeout,\n queueName,\n flow_control,\n } = params;\n const client = await createQStashClientWithToken(params);\n\n const requestHeaders: Record<string, string> = {};\n\n if (method) {\n requestHeaders[\"Upstash-Method\"] = method;\n }\n if (delay) {\n requestHeaders[\"Upstash-Delay\"] = delay;\n }\n if (retries !== undefined) {\n requestHeaders[\"Upstash-Retries\"] = retries.toString();\n }\n if (callback) {\n requestHeaders[\"Upstash-Callback\"] = callback;\n }\n if (failureCallback) {\n requestHeaders[\"Upstash-Failure-Callback\"] = failureCallback;\n }\n if (timeout) {\n requestHeaders[\"Upstash-Timeout\"] = timeout;\n }\n if (queueName) {\n requestHeaders[\"Upstash-Queue-Name\"] = queueName;\n }\n\n // Add flow control headers\n if (flow_control) {\n requestHeaders[\"Upstash-Flow-Control-Key\"] = flow_control.key;\n const value = [\n flow_control.parallelism === undefined\n ? undefined\n : `parallelism=${flow_control.parallelism}`,\n flow_control.rate === undefined ? undefined : `rate=${flow_control.rate}`,\n flow_control.period === undefined ? undefined : `period=${flow_control.period}`,\n ]\n .filter(Boolean)\n .join(\",\");\n requestHeaders[\"Upstash-Flow-Control-Value\"] = value;\n }\n\n // Add custom headers\n if (extraHeaders) {\n for (const [key, value] of Object.entries(extraHeaders)) {\n requestHeaders[key] = value;\n }\n }\n\n const response = await client.post<{ messageId: string }>(\n `v2/publish/${destination}`,\n body || {},\n requestHeaders\n );\n\n return [\n \"Message published successfully\",\n `Message ID: ${response.messageId}`,\n json(response),\n ];\n },\n }),\n\n qstash_logs_list: tool({\n description: `List QStash logs with optional filtering. Returns a paginated list of message logs without their bodies.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n messageId: z.string().optional().describe(\"Filter logs by message ID\"),\n state: z\n .enum([\n \"CREATED\",\n \"ACTIVE\",\n \"RETRY\",\n \"ERROR\",\n \"IN_PROGRESS\",\n \"DELIVERED\",\n \"FAILED\",\n \"CANCEL_REQUESTED\",\n \"CANCELLED\",\n ])\n .optional()\n .describe(\"Filter logs by state\"),\n url: z.string().optional().describe(\"Filter logs by URL\"),\n topicName: z.string().optional().describe(\"Filter logs by topic name\"),\n scheduleId: z.string().optional().describe(\"Filter logs by schedule ID\"),\n queueName: z.string().optional().describe(\"Filter logs by queue name\"),\n fromDate: z\n .number()\n .optional()\n .describe(\"Filter logs from date (Unix timestamp in milliseconds)\"),\n toDate: z\n .number()\n .optional()\n .describe(\"Filter logs to date (Unix timestamp in milliseconds)\"),\n count: z.number().max(1000).optional().describe(\"Number of logs to return (max 1000)\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const {\n region: _region,\n local_mode_port: _local_mode_port,\n qstash_creds: _qstash_creds,\n ...query\n } = params;\n const client = await createQStashClientWithToken(params);\n\n const response = await client.get<QStashLogsResponse>(\"v2/logs\", {\n trimBody: 0,\n groupBy: \"messageId\",\n ...query,\n });\n const firstMessageFields = Object.fromEntries(\n Object.entries(response.messages[0] ?? {}).filter(\n ([key, _value]) => !key.toLocaleLowerCase().includes(\"headers\")\n )\n );\n\n const cleanedEvents = response.messages.map((message) => ({\n messageId: message.messageId,\n events: message.events.map((event) => ({\n state: event.state,\n time: event.time,\n })),\n }));\n\n return [\n `Found ${response.messages.length} log entries`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json({ ...firstMessageFields, events: cleanedEvents }),\n ];\n },\n }),\n\n qstash_logs_get: tool({\n description: `Get details of a single QStash log item by message ID without trimming the body.`,\n inputSchema: z.object({\n messageId: z.string().describe(\"The message ID to get details for\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const { messageId } = params;\n const client = await createQStashClientWithToken(params);\n const response = await client.get<QStashLogsResponse>(\"v2/logs\", { messageId });\n\n if (response.messages.length === 0) {\n return \"No log entry found for the specified message ID\";\n }\n\n const logEntry = response.messages[0];\n return [`Log details for message ID: ${messageId}`, json(logEntry)];\n },\n }),\n\n qstash_dlq_list: tool({\n description: `List messages in the QStash Dead Letter Queue (DLQ) with optional filtering.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n messageId: z.string().optional().describe(\"Filter DLQ messages by message ID\"),\n url: z.string().optional().describe(\"Filter DLQ messages by URL\"),\n topicName: z.string().optional().describe(\"Filter DLQ messages by topic name\"),\n scheduleId: z.string().optional().describe(\"Filter DLQ messages by schedule ID\"),\n queueName: z.string().optional().describe(\"Filter DLQ messages by queue name\"),\n fromDate: z.number().optional().describe(\"Filter from date (Unix timestamp in milliseconds)\"),\n toDate: z.number().optional().describe(\"Filter to date (Unix timestamp in milliseconds)\"),\n responseStatus: z.number().optional().describe(\"Filter by HTTP response status code\"),\n callerIp: z.string().optional().describe(\"Filter by IP address of the publisher\"),\n count: z.number().max(100).optional().describe(\"Number of messages to return (max 100)\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const {\n region: _region,\n local_mode_port: _local_mode_port,\n qstash_creds: _qstash_creds,\n ...query\n } = params;\n const client = await createQStashClientWithToken(params);\n\n const response = await client.get<QStashDLQResponse>(\"v2/dlq\", {\n trimBody: 0,\n ...query,\n });\n\n return [\n `Found ${response.messages.length} DLQ messages`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json(response.messages),\n ];\n },\n }),\n\n qstash_dlq_get: tool({\n description: `Get details of a single DLQ message by DLQ ID.`,\n inputSchema: z.object({\n dlqId: z.string().describe(\"The DLQ ID of the message to retrieve\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const { dlqId } = params;\n const client = await createQStashClientWithToken(params);\n const message = await client.get<QStashDLQMessage>(`v2/dlq/${dlqId}`);\n\n return [`DLQ message details for ID: ${dlqId}`, json(message)];\n },\n }),\n\n qstash_schedules_list: tool({\n description: `List all QStash schedules.`,\n inputSchema: z.object({\n ...qstashCommon,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params);\n const schedules = await client.get<QStashSchedule[]>(\"v2/schedules\");\n\n return [`Found ${schedules.length} schedules`, json(schedules)];\n },\n }),\n\n qstash_schedules_manage: tool({\n description: `Create, update, or manage QStash schedules. This tool handles create, update (by providing scheduleId), pause, resume, and delete operations in one unified interface.`,\n inputSchema: z.object({\n operation: z\n .enum([\"create\", \"update\", \"pause\", \"resume\", \"delete\"])\n .describe(\"The operation to perform\"),\n scheduleId: z\n .string()\n .optional()\n .describe(\"Schedule ID (required for update, pause, resume, delete operations)\"),\n destination: z\n .string()\n .optional()\n .describe(\"Destination URL or topic name (required for create/update)\"),\n cron: z.string().optional().describe(\"Cron expression (required for create/update)\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"])\n .optional()\n .describe(\"HTTP method (optional, defaults to POST)\"),\n headers: z.record(z.string()).optional().describe(\"Request headers as key-value pairs\"),\n body: z.string().optional().describe(\"Request body\"),\n delay: z\n .string()\n .optional()\n .describe(\"Delay before message delivery (e.g., '10s', '5m', '1h')\"),\n retries: z.number().optional().describe(\"Number of retries on failure\"),\n callback: z.string().optional().describe(\"Callback URL for successful delivery\"),\n failureCallback: z.string().optional().describe(\"Callback URL for failed delivery\"),\n timeout: z.string().optional().describe(\"Request timeout (e.g., '30s')\"),\n queueName: z.string().optional().describe(\"Queue name to use\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const {\n operation,\n scheduleId,\n destination,\n cron,\n method = \"POST\",\n headers,\n body,\n delay,\n retries,\n callback,\n failureCallback,\n timeout,\n queueName,\n } = params;\n const client = await createQStashClientWithToken(params);\n\n switch (operation) {\n case \"create\":\n case \"update\": {\n if (!destination || !cron) {\n throw new Error(\"destination and cron are required for create/update operations\");\n }\n\n const requestHeaders: Record<string, string> = {\n \"Upstash-Cron\": cron,\n };\n\n if (method !== \"POST\") {\n requestHeaders[\"Upstash-Method\"] = method;\n }\n if (delay) {\n requestHeaders[\"Upstash-Delay\"] = delay;\n }\n if (retries !== undefined) {\n requestHeaders[\"Upstash-Retries\"] = retries.toString();\n }\n if (callback) {\n requestHeaders[\"Upstash-Callback\"] = callback;\n }\n if (failureCallback) {\n requestHeaders[\"Upstash-Failure-Callback\"] = failureCallback;\n }\n if (timeout) {\n requestHeaders[\"Upstash-Timeout\"] = timeout;\n }\n if (queueName) {\n requestHeaders[\"Upstash-Queue-Name\"] = queueName;\n }\n if (scheduleId && operation === \"update\") {\n requestHeaders[\"Upstash-Schedule-Id\"] = scheduleId;\n }\n\n // Add custom headers\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n requestHeaders[key] = value;\n }\n }\n\n const response = await client.post<QStashScheduleCreateResponse>(\n `v2/schedules/${destination}`,\n body || {},\n requestHeaders\n );\n\n return [\n operation === \"create\"\n ? \"Schedule created successfully\"\n : \"Schedule updated successfully\",\n `Schedule ID: ${response.scheduleId}`,\n json(response),\n ];\n }\n\n case \"pause\": {\n if (!scheduleId) {\n throw new Error(\"scheduleId is required for pause operation\");\n }\n\n await client.post(`v2/schedules/${scheduleId}/pause`);\n return `Schedule ${scheduleId} paused successfully`;\n }\n\n case \"resume\": {\n if (!scheduleId) {\n throw new Error(\"scheduleId is required for resume operation\");\n }\n\n await client.post(`v2/schedules/${scheduleId}/resume`);\n return `Schedule ${scheduleId} resumed successfully`;\n }\n\n case \"delete\": {\n if (!scheduleId) {\n throw new Error(\"scheduleId is required for delete operation\");\n }\n\n await client.delete(`v2/schedules/${scheduleId}`);\n return `Schedule ${scheduleId} deleted successfully`;\n }\n\n default: {\n throw new Error(`Unknown operation: ${operation}`);\n }\n }\n },\n }),\n};\n","import { config } from \"../../config\";\nimport { http, createQStashClient, type HttpClient } from \"../../http\";\nimport type { QStashUser } from \"./types\";\n\nconst LOCAL_QSTASH_TOKEN =\n \"eyJVc2VySUQiOiJkZWZhdWx0VXNlciIsIlBhc3N3b3JkIjoiZGVmYXVsdFBhc3N3b3JkIn0=\";\n\nconst REGION_URLS: Record<string, string> = {\n eu: \"https://qstash-eu-central-1.upstash.io\",\n us: \"https://qstash-us-east-1.upstash.io\",\n};\n\nconst REGION_API_NAMES: Record<string, string> = {\n eu: \"eu-central-1\",\n us: \"us-east-1\",\n};\n\nlet cachedUsers: QStashUser[] | null = null;\nlet cacheExpiry: number = 0;\n\nexport async function getQStashCredentials(region: string): Promise<{ token: string }> {\n const now = Date.now();\n\n if (!cachedUsers || now >= cacheExpiry) {\n try {\n cachedUsers = await http.get<QStashUser[]>(\"v2/qstash/users\");\n cacheExpiry = now + 60 * 1000;\n } catch (error) {\n throw new Error(\n `Failed to get QStash credentials: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n const apiRegion = REGION_API_NAMES[region] ?? REGION_API_NAMES[\"eu\"];\n const match = cachedUsers.find((u) => u.region === apiRegion);\n if (!match) {\n throw new Error(`No QStash user found for region '${region}' (${apiRegion})`);\n }\n\n return { token: match.token };\n}\n\nexport async function createQStashClientWithToken(options: {\n qstash_creds?: { url: string; token: string };\n region: string;\n local_mode_port: number;\n}): Promise<HttpClient> {\n if (config.readonly) {\n throw new Error(\n \"QStash is not available in readonly mode yet. This feature will be implemented in the near future.\"\n );\n }\n\n const { qstash_creds, region, local_mode_port } = options;\n\n if (qstash_creds) {\n return createQStashClient({ url: qstash_creds.url, token: qstash_creds.token });\n }\n\n if (region === \"local\") {\n return createQStashClient({\n url: `http://localhost:${local_mode_port}`,\n token: LOCAL_QSTASH_TOKEN,\n });\n }\n\n const effectiveRegion = region && REGION_URLS[region] ? region : \"eu\";\n const fetched = await getQStashCredentials(effectiveRegion);\n return createQStashClient({ url: REGION_URLS[effectiveRegion], token: fetched.token });\n}\n\nexport function clearTokenCache(): void {\n cachedUsers = null;\n cacheExpiry = 0;\n}\n","import { z } from \"zod\";\n\nexport const qstashCommon = {\n region: z\n .enum([\"eu\", \"us\", \"local\"])\n .default(\"eu\")\n .describe(\"QStash region to use. To use local mode, pick `local`\"),\n local_mode_port: z\n .number()\n .default(8080)\n .describe(\n \"Only provide when using local mode and if default does not work, the port is usually in the .env file\"\n ),\n qstash_creds: z\n .object({\n url: z.string(),\n token: z.string(),\n })\n .optional()\n .describe(\"Custom qstash credentials, overrides `region`\"),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { createQStashClientWithToken } from \"./utils\";\nimport type { WorkflowLogsResponse, WorkflowDLQResponse, WorkflowDLQMessage } from \"./types\";\nimport { qstashCommon } from \"./common\";\n\nexport const workflowTools = {\n workflow_logs_list: tool({\n description: `List Upstash Workflow logs with optional filtering. Returns grouped workflow runs with their execution details.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n workflowRunId: z.string().optional().describe(\"Filter by specific workflow run ID\"),\n count: z.number().optional().describe(\"Number of workflow runs to return\"),\n state: z\n .enum([\"RUN_STARTED\", \"RUN_SUCCESS\", \"RUN_FAILED\", \"RUN_CANCELED\"])\n .optional()\n .describe(\"Filter by workflow state\"),\n workflowUrl: z.string().optional().describe(\"Filter by workflow URL (exact match)\"),\n workflowCreatedAt: z\n .number()\n .optional()\n .describe(\"Filter by workflow creation timestamp (Unix timestamp)\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const {\n region: _region,\n local_mode_port: _local_mode_port,\n qstash_creds: _qstash_creds,\n ...query\n } = params;\n const client = await createQStashClientWithToken(params);\n\n const response = await client.get<WorkflowLogsResponse>(\"v2/workflows/events\", {\n trimBody: 0,\n groupBy: \"workflowRunId\",\n ...query,\n });\n\n const cleaned = response.runs.map((run) =>\n Object.fromEntries(Object.entries(run).filter(([key, _value]) => key !== \"steps\"))\n );\n\n return [\n `Found ${response.runs.length} workflow runs`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json({\n ...response,\n runs: cleaned,\n }),\n ];\n },\n }),\n\n workflow_logs_get: tool({\n description: `Get details of a single workflow run by workflow run ID. There\n could be multiple workflow runs with the same workflow run ID, so you can\n use the workflowCreatedAt to get the details of the specific workflow run.`,\n inputSchema: z.object({\n workflowRunId: z.string().describe(\"The workflow run ID to get details for\"),\n workflowCreatedAt: z\n .number()\n .optional()\n .describe(\"The workflow creation timestamp (Unix timestamp)\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const {\n region: _region,\n local_mode_port: _local_mode_port,\n qstash_creds: _qstash_creds,\n ...query\n } = params;\n const client = await createQStashClientWithToken(params);\n const response = await client.get<WorkflowLogsResponse>(\"v2/workflows/logs\", query);\n\n if (response.runs.length === 0) {\n return \"No workflow run found\";\n }\n\n const workflowRun = response.runs[0];\n return [\n `Workflow run details for ID: ${params.workflowRunId} created at: ${params.workflowCreatedAt}`,\n json(workflowRun),\n ];\n },\n }),\n\n workflow_dlq_list: tool({\n description: `List failed workflow runs in the Dead Letter Queue (DLQ) with optional filtering.`,\n inputSchema: z.object({\n cursor: z.string().optional().describe(\"Cursor for pagination\"),\n workflowRunId: z.string().optional().describe(\"Filter by workflow run ID\"),\n workflowUrl: z.string().optional().describe(\"Filter by workflow URL\"),\n fromDate: z.number().optional().describe(\"Filter from date (Unix timestamp in milliseconds)\"),\n toDate: z.number().optional().describe(\"Filter to date (Unix timestamp in milliseconds)\"),\n responseStatus: z.number().optional().describe(\"Filter by HTTP response status code\"),\n callerIP: z.string().optional().describe(\"Filter by IP address of the caller\"),\n failureCallbackState: z.string().optional().describe(\"Filter by failure callback state\"),\n count: z.number().optional().describe(\"Number of DLQ messages to return\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const {\n region: _region,\n local_mode_port: _local_mode_port,\n qstash_creds: _qstash_creds,\n ...query\n } = params;\n const client = await createQStashClientWithToken(params);\n\n const response = await client.get<WorkflowDLQResponse>(\"v2/workflows/dlq\", {\n ...query,\n trimBody: 0,\n });\n\n const cleaned = response.messages.map((message) =>\n Object.fromEntries(Object.entries(message).filter(([key]) => !key.includes(\"header\")))\n );\n\n return [\n `Found ${response.messages.length} failed workflow runs in DLQ`,\n response.cursor ? `Pagination cursor: ${response.cursor}` : \"No more entries\",\n json({\n ...response,\n messages: cleaned,\n }),\n ];\n },\n }),\n\n workflow_dlq_get: tool({\n description: `Get details of a single failed workflow run from the DLQ by DLQ ID.`,\n inputSchema: z.object({\n dlqId: z.string().describe(\"The DLQ ID of the failed workflow run to retrieve\"),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const client = await createQStashClientWithToken(params);\n const message = await client.get<WorkflowDLQMessage>(`v2/workflows/dlq/${params.dlqId}`);\n\n return [`Failed workflow run details for DLQ ID: ${params.dlqId}`, json(message)];\n },\n }),\n\n workflow_dlq_manage: tool({\n description: `Delete, restart, and resume failed workflow runs in the DLQ using only the DLQ ID.`,\n inputSchema: z.object({\n dlqId: z.string().describe(\"The DLQ ID of the failed workflow run\"),\n action: z\n .enum([\"delete\", \"restart\", \"resume\"])\n .describe(\n \"The action to perform: delete (remove from DLQ), restart (from beginning), or resume (from the failed step)\"\n ),\n ...qstashCommon,\n }),\n handler: async (params) => {\n const { dlqId, action } = params;\n const client = await createQStashClientWithToken(params);\n\n switch (action) {\n case \"delete\": {\n await client.delete(`v2/workflows/dlq/delete/${dlqId}`);\n return `Failed workflow run with DLQ ID ${dlqId} deleted successfully`;\n }\n\n case \"restart\": {\n const restartResponse = await client.post(`v2/workflows/dlq/restart/${dlqId}`);\n return [\n `Workflow run restarted successfully from DLQ ID: ${dlqId}`,\n json(restartResponse),\n ];\n }\n\n case \"resume\": {\n const resumeResponse = await client.post(`v2/workflows/dlq/resume/${dlqId}`);\n return [`Workflow run resumed successfully from DLQ ID: ${dlqId}`, json(resumeResponse)];\n }\n\n default: {\n throw new Error(\n `Invalid action: ${action}. Supported actions are: delete, restart, resume`\n );\n }\n }\n },\n }),\n};\n","import type { CustomTool } from \"../../tool\";\nimport { qstashTools } from \"./qstash\";\nimport { workflowTools } from \"./workflow\";\n\nexport const qstashAllTools: Record<string, CustomTool> = {\n ...qstashTools,\n ...workflowTools,\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { buildBoxCommon } from \"./common\";\nimport { getBoxClient } from \"./utils\";\ntype BoxRef = { id: string; status: string };\n\nexport const boxManageTool = {\n box_manage: tool({\n description: `Manage Upstash Box containers. Supports creating, listing, getting, deleting, pausing, resuming, and forking boxes. Boxes are secure cloud containers with built-in AI agent capabilities.`,\n get inputSchema() {\n return z.object({\n action: z\n .enum([\"create\", \"list\", \"get\", \"delete\", \"pause\", \"resume\", \"fork\"])\n .describe(\"The action to perform\"),\n box_id: z\n .string()\n .optional()\n .describe(\"Box ID (required for get, delete, pause, resume, fork)\"),\n // Create-specific fields\n name: z.string().optional().describe(\"Display name for the box\"),\n model: z\n .string()\n .optional()\n .describe(\n \"LLM model to use (e.g. 'claude/sonnet_4_6', 'openai/o4-mini'). Required for create\"\n ),\n agent: z\n .enum([\"claude-code\", \"codex\", \"opencode\"])\n .optional()\n .default(\"claude-code\")\n .describe(\"Agent type (default: claude-code)\"),\n runtime: z\n .string()\n .optional()\n .default(\"node\")\n .describe(\"Runtime environment (e.g. 'node', 'python')\"),\n agent_api_key: z\n .string()\n .optional()\n .describe(\"API key for the AI agent provider. Empty uses managed key\"),\n env_vars: z\n .record(z.string())\n .optional()\n .describe(\"Environment variables to set in the box\"),\n clone_repo: z.string().optional().describe(\"Git repository URL to clone into the box\"),\n clone_token: z.string().optional().describe(\"Token for cloning private repositories\"),\n ephemeral: z.boolean().optional().describe(\"If true, box auto-deletes after TTL expires\"),\n ttl: z\n .number()\n .optional()\n .describe(\"Time-to-live in seconds for ephemeral boxes (max 259200 = 3 days)\"),\n // List-specific fields\n status: z\n .enum([\"active\", \"deleted\"])\n .optional()\n .describe(\"Filter for list action: 'active' (default) or 'deleted'\"),\n ...buildBoxCommon(),\n });\n },\n handler: async (params) => {\n const { action, box_id } = params;\n const client = getBoxClient(params);\n\n switch (action) {\n case \"create\": {\n if (!params.model) {\n throw new Error(\"model is required for create action\");\n }\n const body: Record<string, unknown> = {\n model: params.model,\n };\n if (params.name) body.name = params.name;\n if (params.agent) body.agent = params.agent;\n if (params.runtime) body.runtime = params.runtime;\n if (params.agent_api_key) body.agent_api_key = params.agent_api_key;\n if (params.env_vars) body.env_vars = params.env_vars;\n if (params.clone_repo) body.clone_repo = params.clone_repo;\n if (params.clone_token) body.clone_token = params.clone_token;\n if (params.ephemeral !== undefined) body.ephemeral = params.ephemeral;\n if (params.ttl !== undefined) body.ttl = params.ttl;\n\n const box = await client.post<BoxRef>(\"v2/box\", body);\n return [\n `Box created successfully (status: ${box.status})`,\n `Box ID: ${box.id}`,\n json(box),\n ];\n }\n\n case \"list\": {\n const query: Record<string, string | undefined> = {};\n if (params.status === \"deleted\") query.status = \"deleted\";\n const boxes = await client.get<unknown[]>(\"v2/box\", query);\n return [`Found ${boxes.length} boxes`, json(boxes)];\n }\n\n case \"get\": {\n if (!box_id) throw new Error(\"box_id is required for get action\");\n const box = await client.get<BoxRef>(`v2/box/${box_id}`);\n return [`Box ${box_id} (status: ${box.status})`, json(box)];\n }\n\n case \"delete\": {\n if (!box_id) throw new Error(\"box_id is required for delete action\");\n await client.delete(`v2/box/${box_id}`);\n return `Box ${box_id} deleted successfully`;\n }\n\n case \"pause\": {\n if (!box_id) throw new Error(\"box_id is required for pause action\");\n await client.post(`v2/box/${box_id}/pause`);\n return `Box ${box_id} paused successfully`;\n }\n\n case \"resume\": {\n if (!box_id) throw new Error(\"box_id is required for resume action\");\n await client.post(`v2/box/${box_id}/resume`);\n return `Box ${box_id} resumed successfully`;\n }\n\n case \"fork\": {\n if (!box_id) throw new Error(\"box_id is required for fork action\");\n const forked = await client.post<BoxRef>(`v2/box/${box_id}/fork`);\n return [`Box forked successfully`, `New Box ID: ${forked.id}`, json(forked)];\n }\n\n default: {\n throw new Error(`Unknown action: ${action}`);\n }\n }\n },\n }),\n};\n","import { z } from \"zod\";\nimport { config } from \"../../config\";\n\nconst BOX_BASE_URL = \"https://us-east-1.box.upstash.com\";\n\nexport function buildBoxCommon() {\n const hasConfigKey = Boolean(config.boxApiKey);\n return {\n box_api_key: hasConfigKey\n ? z\n .string()\n .optional()\n .describe(\n \"NOTE: The api key is already pre-configured at server startup; only pass this to override the configured key.\"\n )\n : z\n .string()\n .describe(\n \"Box API key (starts with 'box_'). Check the project's .env file for BOX_API_KEY, or ask the user for it.\"\n ),\n };\n}\n\nexport { BOX_BASE_URL };\n","import { config } from \"../../config\";\nimport { HttpClient } from \"../../http\";\nimport { BOX_BASE_URL } from \"./common\";\n\nexport function getBoxClient(params: { box_api_key?: string }): HttpClient {\n const apiKey = params.box_api_key || config.boxApiKey;\n if (!apiKey) {\n throw new Error(\n \"No Box API key available. Pass box_api_key as a tool argument, or configure the server with --box-api-key / UPSTASH_BOX_API_KEY env var.\"\n );\n }\n return new HttpClient({\n baseUrl: BOX_BASE_URL,\n qstashToken: apiKey,\n });\n}\n","import { z } from \"zod\";\nimport { tool } from \"../helpers\";\nimport { buildBoxCommon } from \"./common\";\nimport { getBoxClient } from \"./utils\";\ntype ExecResponse = { exit_code: number; output?: string; error?: string };\n\nexport const boxExecTool = {\n box_exec: tool({\n description: `Execute a shell command inside an Upstash Box container. Use this for file operations, git commands, package installs, or any shell operation inside the box.`,\n get inputSchema() {\n return z.object({\n box_id: z.string().describe(\"The box ID to execute the command in\"),\n command: z\n .array(z.string())\n .describe(\"Command and arguments as an array (e.g. ['bash', '-c', 'ls -la'])\"),\n folder: z.string().optional().describe(\"Working directory inside the box\"),\n async: z\n .boolean()\n .optional()\n .describe(\"If true, return immediately without waiting for completion\"),\n ...buildBoxCommon(),\n });\n },\n handler: async (params) => {\n const { box_id, command, folder, async: isAsync } = params;\n const client = getBoxClient(params);\n\n const body: Record<string, unknown> = { command };\n if (folder) body.folder = folder;\n if (isAsync) body.async = isAsync;\n\n const response = await client.post<ExecResponse>(`v2/box/${box_id}/exec`, body);\n\n if (response.exit_code !== 0) {\n return [\n `Command failed with exit code ${response.exit_code}`,\n response.output ? `stdout: ${response.output}` : \"\",\n response.error ? `stderr: ${response.error}` : \"\",\n ].filter(Boolean);\n }\n\n return [\n `Command executed successfully (exit code: ${response.exit_code})`,\n response.output || \"(no output)\",\n ];\n },\n }),\n};\n","import { z } from \"zod\";\nimport { tool } from \"../helpers\";\nimport { buildBoxCommon } from \"./common\";\nimport { getBoxClient } from \"./utils\";\ntype RunResponse = {\n run_id?: string;\n output?: string;\n metadata?: { input_tokens?: number; output_tokens?: number; cost_usd?: number };\n};\n\nexport const boxAgentRunTool = {\n box_agent_run: tool({\n description: `Run an AI agent prompt inside an Upstash Box. The agent has access to shell, filesystem, and git inside the box. It reasons, executes commands, and iterates until the task is complete. This is a synchronous call that may take a while depending on the complexity of the prompt.`,\n get inputSchema() {\n return z.object({\n box_id: z.string().describe(\"The box ID to run the agent in\"),\n prompt: z.string().describe(\"The natural-language prompt for the agent to execute\"),\n model: z.string().optional().describe(\"Override the box's default LLM model for this run\"),\n folder: z.string().optional().describe(\"Working directory inside the box for the agent\"),\n ...buildBoxCommon(),\n });\n },\n handler: async (params) => {\n const { box_id, prompt, model, folder } = params;\n const client = getBoxClient(params);\n\n const body: Record<string, unknown> = { prompt };\n if (model) body.model = model;\n if (folder) body.folder = folder;\n\n const response = await client.post<RunResponse>(`v2/box/${box_id}/run`, body);\n\n const result: string[] = [`Agent run completed`];\n\n if (response.run_id) {\n result.push(`Run ID: ${response.run_id}`);\n }\n\n result.push(response.output || \"(no output)\");\n\n if (response.metadata) {\n result.push(\n `Tokens: ${response.metadata.input_tokens ?? 0} in / ${response.metadata.output_tokens ?? 0} out` +\n (response.metadata.cost_usd ? ` ($${response.metadata.cost_usd.toFixed(4)})` : \"\")\n );\n }\n\n return result;\n },\n }),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { buildBoxCommon } from \"./common\";\nimport { getBoxClient } from \"./utils\";\n\nexport const boxLogsTool = {\n box_logs: tool({\n description: `Get logs from an Upstash Box container. Useful for debugging what happened inside the box. Returns timestamped log entries from the system, user, and agent sources.`,\n get inputSchema() {\n return z.object({\n box_id: z.string().describe(\"The box ID to get logs for\"),\n offset: z\n .number()\n .optional()\n .default(0)\n .describe(\"Starting position for log entries (default: 0)\"),\n limit: z\n .number()\n .max(1000)\n .optional()\n .default(100)\n .describe(\"Maximum number of log entries to return (max 1000, default: 100)\"),\n ...buildBoxCommon(),\n });\n },\n handler: async (params) => {\n const { box_id, offset, limit } = params;\n const client = getBoxClient(params);\n\n const response = await client.get<{ logs: unknown[] }>(`v2/box/${box_id}/logs`, {\n offset,\n limit,\n });\n\n const logs = response.logs ?? [];\n if (logs.length === 0) {\n return \"No logs found for this box\";\n }\n\n return [`Found ${logs.length} log entries`, json(logs)];\n },\n }),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { buildBoxCommon } from \"./common\";\nimport { getBoxClient } from \"./utils\";\ntype RunRef = { status: string };\n\nexport const boxRunsTool = {\n box_runs: tool({\n description: `List, get details, or cancel runs (execution history) for an Upstash Box. Useful for debugging past agent runs and shell executions, checking their status, output, token usage, and costs.`,\n get inputSchema() {\n return z.object({\n action: z.enum([\"list\", \"get\", \"cancel\"]).describe(\"The action to perform\"),\n box_id: z.string().describe(\"The box ID\"),\n run_id: z.string().optional().describe(\"Run ID (required for get and cancel actions)\"),\n ...buildBoxCommon(),\n });\n },\n handler: async (params) => {\n const { action, box_id, run_id } = params;\n const client = getBoxClient(params);\n\n switch (action) {\n case \"list\": {\n const response = await client.get<{ runs: unknown[] }>(`v2/box/${box_id}/runs`);\n const runs = response.runs ?? [];\n return [`Found ${runs.length} runs`, json(runs)];\n }\n\n case \"get\": {\n if (!run_id) throw new Error(\"run_id is required for get action\");\n const run = await client.get<RunRef>(`v2/box/${box_id}/runs/${run_id}`);\n return [`Run ${run_id} (status: ${run.status})`, json(run)];\n }\n\n case \"cancel\": {\n if (!run_id) throw new Error(\"run_id is required for cancel action\");\n await client.post(`v2/box/${box_id}/runs/${run_id}/cancel`);\n return `Run ${run_id} cancelled successfully`;\n }\n\n default: {\n throw new Error(`Unknown action: ${action}`);\n }\n }\n },\n }),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { buildBoxCommon } from \"./common\";\nimport { getBoxClient } from \"./utils\";\ntype CreatePreviewResponse = {\n url: string;\n port: number;\n username?: string;\n password?: string;\n token?: string;\n};\n\nexport const boxPreviewTool = {\n box_preview: tool({\n description: `Manage preview URLs for web applications running inside an Upstash Box. Create public URLs to access services running on specific ports, list existing previews, or delete them.`,\n get inputSchema() {\n return z.object({\n action: z.enum([\"create\", \"list\", \"delete\"]).describe(\"The action to perform\"),\n box_id: z.string().describe(\"The box ID\"),\n port: z\n .number()\n .min(1)\n .max(65_535)\n .optional()\n .describe(\"Port number (required for create and delete)\"),\n basic_auth: z\n .boolean()\n .optional()\n .describe(\"Enable basic auth on the preview URL (create only)\"),\n bearer_token: z\n .boolean()\n .optional()\n .describe(\"Enable bearer token auth on the preview URL (create only)\"),\n ...buildBoxCommon(),\n });\n },\n handler: async (params) => {\n const { action, box_id, port, basic_auth, bearer_token } = params;\n const client = getBoxClient(params);\n\n switch (action) {\n case \"create\": {\n if (!port) throw new Error(\"port is required for create action\");\n const body: Record<string, unknown> = { port };\n if (basic_auth) body.basic_auth = basic_auth;\n if (bearer_token) body.bearer_token = bearer_token;\n\n const response = await client.post<CreatePreviewResponse>(\n `v2/box/${box_id}/preview`,\n body\n );\n\n const result: string[] = [\n `Preview URL created: ${response.url}`,\n `Port: ${response.port}`,\n ];\n if (response.username) result.push(`Username: ${response.username}`);\n if (response.password) result.push(`Password: ${response.password}`);\n if (response.token) result.push(`Token: ${response.token}`);\n return result;\n }\n\n case \"list\": {\n const response = await client.get<{ previews: unknown[] }>(`v2/box/${box_id}/preview`);\n const previews = response.previews ?? [];\n return [`Found ${previews.length} preview URLs`, json(previews)];\n }\n\n case \"delete\": {\n if (!port) throw new Error(\"port is required for delete action\");\n await client.delete(`v2/box/${box_id}/preview/${port}`);\n return `Preview for port ${port} deleted successfully`;\n }\n\n default: {\n throw new Error(`Unknown action: ${action}`);\n }\n }\n },\n }),\n};\n","import { z } from \"zod\";\nimport { json, tool } from \"../helpers\";\nimport { buildBoxCommon } from \"./common\";\nimport { getBoxClient } from \"./utils\";\ntype BoxRef = { id: string; status: string };\ntype SnapshotRef = { id: string; status: string };\n\nexport const boxSnapshotsTool = {\n box_snapshots: tool({\n description: `Manage Upstash Box snapshots. Create full filesystem snapshots of a box, list snapshots, delete them, or restore a box from a snapshot.`,\n get inputSchema() {\n return z.object({\n action: z\n .enum([\"create\", \"list\", \"list_all\", \"delete\", \"restore\"])\n .describe(\n \"The action to perform. 'list' lists snapshots for a specific box, 'list_all' lists all your snapshots\"\n ),\n box_id: z.string().optional().describe(\"Box ID (required for create, list, delete)\"),\n snapshot_id: z\n .string()\n .optional()\n .describe(\"Snapshot ID (required for delete and restore)\"),\n // Create-specific\n name: z.string().optional().describe(\"Name for the snapshot (auto-generated if empty)\"),\n // Restore-specific\n model: z\n .string()\n .optional()\n .describe(\"LLM model for the restored box (required for restore)\"),\n runtime: z\n .string()\n .optional()\n .describe(\"Override the snapshot's runtime for the restored box\"),\n env_vars: z\n .record(z.string())\n .optional()\n .describe(\"Environment variables for the restored box\"),\n ephemeral: z.boolean().optional().describe(\"Create the restored box as ephemeral\"),\n ttl: z\n .number()\n .optional()\n .describe(\"TTL in seconds for the restored ephemeral box (max 259200)\"),\n ...buildBoxCommon(),\n });\n },\n handler: async (params) => {\n const { action, box_id, snapshot_id } = params;\n const client = getBoxClient(params);\n\n switch (action) {\n case \"create\": {\n if (!box_id) throw new Error(\"box_id is required for create action\");\n const body: Record<string, unknown> = {};\n if (params.name) body.name = params.name;\n\n const snapshot = await client.post<SnapshotRef>(`v2/box/${box_id}/snapshots`, body);\n return [\n `Snapshot created (status: ${snapshot.status})`,\n `Snapshot ID: ${snapshot.id}`,\n json(snapshot),\n ];\n }\n\n case \"list\": {\n if (!box_id) throw new Error(\"box_id is required for list action\");\n const response = await client.get<{ snapshots: SnapshotRef[] }>(\n `v2/box/${box_id}/snapshots`\n );\n const snapshots = response.snapshots ?? [];\n return [`Found ${snapshots.length} snapshots for box ${box_id}`, json(snapshots)];\n }\n\n case \"list_all\": {\n const response = await client.get<{ snapshots: SnapshotRef[] }>(\"v2/box/snapshots\");\n const snapshots = response.snapshots ?? [];\n return [`Found ${snapshots.length} snapshots total`, json(snapshots)];\n }\n\n case \"delete\": {\n if (!box_id) throw new Error(\"box_id is required for delete action\");\n if (!snapshot_id) throw new Error(\"snapshot_id is required for delete action\");\n await client.delete(`v2/box/${box_id}/snapshots/${snapshot_id}`);\n return `Snapshot ${snapshot_id} deleted successfully`;\n }\n\n case \"restore\": {\n if (!snapshot_id) throw new Error(\"snapshot_id is required for restore action\");\n if (!params.model) throw new Error(\"model is required for restore action\");\n\n const body: Record<string, unknown> = {\n snapshot_id: snapshot_id,\n model: params.model,\n };\n if (params.runtime) body.runtime = params.runtime;\n if (params.env_vars) body.env_vars = params.env_vars;\n if (params.ephemeral !== undefined) body.ephemeral = params.ephemeral;\n if (params.ttl !== undefined) body.ttl = params.ttl;\n\n const box = await client.post<BoxRef>(\"v2/box/from-snapshot\", body);\n return [\n `Box restored from snapshot (status: ${box.status})`,\n `New Box ID: ${box.id}`,\n json(box),\n ];\n }\n\n default: {\n throw new Error(`Unknown action: ${action}`);\n }\n }\n },\n }),\n};\n","import type { CustomTool } from \"../../tool\";\nimport { boxManageTool } from \"./manage\";\nimport { boxExecTool } from \"./exec\";\nimport { boxAgentRunTool } from \"./agent-run\";\nimport { boxLogsTool } from \"./logs\";\nimport { boxRunsTool } from \"./runs\";\nimport { boxPreviewTool } from \"./preview\";\nimport { boxSnapshotsTool } from \"./snapshots\";\n\nexport const boxTools: Record<string, CustomTool> = {\n ...boxManageTool,\n ...boxExecTool,\n ...boxAgentRunTool,\n ...boxLogsTool,\n ...boxRunsTool,\n ...boxPreviewTool,\n ...boxSnapshotsTool,\n};\n","import type { CustomTool } from \"../tool\";\nimport { redisTools } from \"./redis\";\nimport { qstashAllTools } from \"./qstash\";\nimport { boxTools } from \"./box\";\n\nexport { json, tool } from \"./helpers\";\n\nexport const tools: Record<string, CustomTool> = {\n ...redisTools,\n ...qstashAllTools,\n ...boxTools,\n} as unknown as Record<string, CustomTool>;\n","export const MAX_MESSAGE_LENGTH = 30_000;\n","import type { CallToolResultSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ZodSchema } from \"zod\";\nimport type { z } from \"zod\";\nimport { MAX_MESSAGE_LENGTH } from \"./settings\";\n\ntype HandlerResponse = string | string[] | z.infer<typeof CallToolResultSchema>;\n\nexport type CustomTool<TSchema extends ZodSchema = ZodSchema> = {\n description: string;\n\n /**\n * Zod schema for the input of the tool.\n */\n inputSchema?: TSchema;\n\n /**\n * Whether this tool is safe to use with a readonly API key.\n * Tools not marked as readonly will be hidden when a readonly key is detected.\n */\n readonly?: boolean;\n\n /**\n * The handler function for the tool.\n * @param input Parsed input according to the input schema.\n * @returns\n * If result is a string, it will be displayed as a single text block.\n * If result is an array of strings, each string will be displayed as a separate text block.\n * You can also return a CallToolResult object to display more complex content.\n */\n handler: (input: z.infer<TSchema>) => Promise<HandlerResponse>;\n};\n\nexport function handlerResponseToCallResult(\n response: HandlerResponse\n): z.infer<typeof CallToolResultSchema> {\n if (typeof response === \"string\" || Array.isArray(response)) {\n const array = Array.isArray(response) ? response : [response];\n\n // Truncate messages that are too long\n const truncatedArray = array.map((item) =>\n item.length > MAX_MESSAGE_LENGTH\n ? `${item.slice(0, MAX_MESSAGE_LENGTH)}... (MESSAGE TRUNCATED, MENTION THIS TO USER)`\n : item\n );\n\n return {\n content: truncatedArray.map((text) => ({ type: \"text\" as const, text })),\n };\n } else return response;\n}\n","import { config } from \"./config\";\nimport { http } from \"./http\";\nimport { log } from \"./log\";\nimport type { RedisDatabase } from \"./tools/redis/types\";\n\nconst READONLY_ERROR = \"Readonly API key\";\n\nexport async function testConnection() {\n log(\"๐งช Testing connection to Upstash API\");\n\n let dbs: RedisDatabase[] | undefined;\n try {\n dbs = await http.get<RedisDatabase[]>(\"v2/redis/databases\");\n } catch (error) {\n log(\n \"โ Connection to Upstash API failed. Please check your api key and email. Error: \",\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n\n if (!Array.isArray(dbs))\n throw new Error(\"Invalid response from Upstash API. Check your API key and email.\");\n\n // Detect readonly API key by attempting a write operation with a fake ID\n try {\n await http.delete(\"v2/redis/database/readonly-check-nonexistent\");\n } catch (error) {\n if (error instanceof Error && error.message.includes(READONLY_ERROR)) {\n config.readonly = true;\n log(\"๐ Readonly API key detected. Write operations will be disabled.\");\n }\n // \"database not found\" error is expected for non-readonly keys โ ignore it\n }\n\n log(\"โ
Connection to Upstash API is successful\");\n}\n"],"mappings":"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","names":["z","config","path","req","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","tool","z"]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{
|
|
1
|
+
{"version":"0.2.3-rc.2","name":"@upstash/mcp-server","description":"MCP server for Upstash","license":"MIT","type":"module","bin":{"mcp-server":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/upstash/mcp-server.git"},"bugs":{"url":"https://github.com/upstash/mcp-server/issues"},"scripts":{"build":"tsup && bun -e \"require('fs').chmodSync('dist/index.js', '755')\"","watch":"bun run build && tsup --watch","logs":"tail -n 20 -f ~/.claude/debug/latest","fmt":"prettier --write .","test":"bun test","lint":"eslint \"**/*.{js,ts,tsx}\" --quiet --fix && tsc --noEmit"},"files":["dist"],"devDependencies":{"@types/bun":"^1.3.9","@typescript-eslint/eslint-plugin":"8.4.0","@typescript-eslint/parser":"8.4.0","eslint":"9.10.0","eslint-plugin-unicorn":"55.0.0","husky":"^9.1.7","lint-staged":"^16.3.2","prettier":"^3.6.2","tsup":"^8.5.0"},"lint-staged":{"*.{js,ts,tsx}":["prettier --write","eslint --quiet --fix"],"*.{json,md,yaml,yml}":["prettier --write"]},"dependencies":{"@modelcontextprotocol/sdk":"^1.17.5","@types/node":"^15.14.9","chalk":"^5.6.0","commander":"^14.0.0","dotenv":"^16.6.1","zod":"^3.25.76","zod-to-json-schema":"^3.24.6"}}
|