UNPKG

uploadthing-mcp

Version:
1 lines 11.1 kB
{"version":3,"sources":["../src/mcp.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { UTApi } from \"uploadthing/server\";\nimport * as fs from \"node:fs/promises\";\nimport { z } from \"zod\";\n\n/**\n * Creates an MCP server with UploadThing integration\n */\nexport function createMCPUploadThing({ token }: { token: string }) {\n if (!token) {\n throw new Error(\"UploadThing Token is required\");\n }\n\n // Create the MCP server\n const mcpServer = new McpServer({\n name: \"mcp-uploadthing\",\n version: \"0.0.2\",\n });\n\n // Create UploadThing API client\n const utapi = new UTApi({\n token,\n });\n\n // Add the upload file tool\n mcpServer.tool(\n \"upload-files\",\n \"Upload files to UploadThing. Given a list of file with their paths, names, and types, it will upload the files to UploadThing and return the URLs of the uploaded files.\",\n {\n files: z\n .array(\n z.object({\n filePath: z.string().describe(\"Path to file to upload\"),\n fileName: z.string().describe(\"Name of the file to upload\"),\n fileType: z\n .string()\n .describe(\n \"MIME type of the file (e.g., 'image/jpeg', 'application/pdf')\"\n ),\n })\n )\n .describe(\n \"Array of files to upload to UploadThing. This includes the file path, file name, and file type.\"\n ),\n },\n async (params) => {\n try {\n const filesPromises = params.files.map(async (file) => {\n const buffer = await fs.readFile(file.filePath);\n\n const fileObj = new File([buffer], file.fileName, {\n type: file.fileType,\n });\n\n return fileObj;\n });\n\n const files = await Promise.allSettled(filesPromises);\n\n const failedFiles = files\n .map((file, idx) => ({\n ...file,\n path: params.files[idx].filePath,\n }))\n .filter((file) => file.status === \"rejected\");\n\n if (failedFiles.length > 0) {\n throw new Error(\n `Failed to read files given the following paths: ${failedFiles\n .map((file) => `${file.path}: ${JSON.stringify(file.reason)}`)\n .join(\", \")}`\n );\n }\n\n const succesfulFiles = files\n .filter((file) => file.status === \"fulfilled\")\n .map((file) => file.value);\n\n if (succesfulFiles.length === 0) {\n throw new Error(\"No files could be read to be uploaded\");\n }\n\n try {\n // Upload the file using UploadThing API\n // Note: The uploadFiles method expects a FileEsque object or array\n const results = await utapi.uploadFiles(succesfulFiles);\n\n const failedUploads = results\n .map((result, idx) => ({\n error: result.error,\n file: succesfulFiles[idx],\n }))\n .filter((result) => result.error);\n\n const successfulUploads = results\n .map((result, idx) => ({\n data: result.data,\n file: succesfulFiles[idx],\n }))\n .filter((result) => result.data);\n\n if (failedUploads.length > 0) {\n throw new Error(\n `\n Successfully uploaded files: ${successfulUploads\n .map(\n (upload) =>\n `${upload.file.name}: ${JSON.stringify(upload.data)}`\n )\n .join(\", \")}\\n\\n\n\n Failed to upload files: ${failedUploads\n .map(\n (upload) =>\n `${upload.file.name}: ${JSON.stringify(upload.error)}`\n )\n .join(\", \")}\n `\n );\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `\n Successfully uploaded files: ${successfulUploads\n .map(\n (upload) =>\n `${upload.file.name}: ${JSON.stringify(upload.data)}`\n )\n .join(\", \")}\n `,\n },\n ],\n };\n } catch (uploadError) {\n console.error(\"UploadThing API error:\", uploadError);\n throw uploadError;\n }\n } catch (error) {\n console.error(\"File upload error:\", error);\n\n // Return error response\n return {\n content: [\n {\n type: \"text\",\n text: `Files upload failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n mcpServer.tool(\n \"upload-files-from-urls\",\n \"Upload files by URL to UploadThing. Given a list of URLs, it will upload the files by URL to UploadThing and return the URLs of the uploaded files.\",\n {\n filesByURL: z\n .array(z.string().url())\n .describe(\"Array of URLs of files to upload to UploadThing.\"),\n },\n async (params) => {\n try {\n const urls = params.filesByURL;\n const results = await utapi.uploadFilesFromUrl(urls);\n\n const failedUploads = results\n .map((result, idx) => ({\n error: result.error,\n url: urls[idx],\n }))\n .filter((result) => result.error);\n\n const successfulUploads = results\n .map((result, idx) => ({\n data: result.data,\n url: urls[idx],\n }))\n .filter((result) => result.data);\n\n if (failedUploads.length > 0) {\n throw new Error(\n `\n Successfully uploaded files by URL: ${successfulUploads\n .map(\n (upload) => `${upload.url}: ${JSON.stringify(upload.data)}`\n )\n .join(\", \")}\\n\\n\n\n Failed to upload files by URL: ${failedUploads\n .map(\n (upload) => `${upload.url}: ${JSON.stringify(upload.error)}`\n )\n .join(\", \")}\n `\n );\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `\n Successfully uploaded files by URL: ${successfulUploads\n .map(\n (upload) => `${upload.url}: ${JSON.stringify(upload.data)}`\n )\n .join(\", \")}\n `,\n },\n ],\n };\n } catch (error) {\n console.error(\"File upload error:\", error);\n return {\n content: [\n {\n type: \"text\",\n text: `Files by URL upload failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n return mcpServer;\n}\n"],"mappings":"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","names":[]}