vercel-blob-mcp 0.1.0

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 ADDED
@@ -0,0 +1,56 @@
1
+ # vercel-blob-mcp
2
+
3
+ MCP server for managing personal media files (images, audio, video, etc.) in [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage.
4
+
5
+ ## Tools
6
+
7
+ | Tool | Description |
8
+ |------|-------------|
9
+ | `blob_upload` | Upload a local file to Vercel Blob, returns public URL |
10
+ | `blob_list` | List files with optional prefix filter and pagination |
11
+ | `blob_head` | Get metadata of a blob (size, content type, upload time) |
12
+ | `blob_delete` | Delete one or more blobs by URL |
13
+ | `blob_copy` | Copy a blob to a new path |
14
+
15
+ ## Setup
16
+
17
+ ### 1. Get your Blob token
18
+
19
+ Go to your Vercel dashboard → Storage → your Blob store → `.env.local` tab, and copy the `BLOB_READ_WRITE_TOKEN`.
20
+
21
+ ### 2. Configure in Claude Code
22
+
23
+ Add to your `.mcp.json`:
24
+
25
+ ```json
26
+ {
27
+ "mcpServers": {
28
+ "vercel-blob": {
29
+ "command": "npx",
30
+ "args": ["-y", "vercel-blob-mcp"],
31
+ "env": {
32
+ "BLOB_READ_WRITE_TOKEN": "your_token_here"
33
+ }
34
+ }
35
+ }
36
+ }
37
+ ```
38
+
39
+ ## Development
40
+
41
+ ```bash
42
+ npm install
43
+ npm run dev # Run with tsx (no build needed)
44
+ npm run build # Compile TypeScript
45
+ ```
46
+
47
+ ## Publishing
48
+
49
+ Tag a release to trigger automatic npm publish via GitHub Actions:
50
+
51
+ ```bash
52
+ npm version patch # or minor / major
53
+ git push --follow-tags
54
+ ```
55
+
56
+ > **Note:** Add `NPM_TOKEN` to GitHub repo Settings → Secrets and variables → Actions before the first publish.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { put, list, head, del, copy } from "@vercel/blob";
6
+ import { readFile } from "fs/promises";
7
+ import { basename } from "path";
8
+ function getToken() {
9
+ const token = process.env.BLOB_READ_WRITE_TOKEN;
10
+ if (!token) {
11
+ throw new Error("BLOB_READ_WRITE_TOKEN environment variable is not set");
12
+ }
13
+ return token;
14
+ }
15
+ const server = new Server({
16
+ name: "vercel-blob-mcp",
17
+ version: "0.1.0",
18
+ }, {
19
+ capabilities: {
20
+ tools: {},
21
+ },
22
+ });
23
+ const tools = [
24
+ {
25
+ name: "blob_upload",
26
+ description: "Upload a local file to Vercel Blob storage and return the public URL",
27
+ inputSchema: {
28
+ type: "object",
29
+ properties: {
30
+ localPath: {
31
+ type: "string",
32
+ description: "Absolute path to the local file to upload",
33
+ },
34
+ pathname: {
35
+ type: "string",
36
+ description: "Optional storage path/filename in the blob store (e.g. 'images/photo.jpg'). Defaults to the original filename.",
37
+ },
38
+ },
39
+ required: ["localPath"],
40
+ },
41
+ },
42
+ {
43
+ name: "blob_list",
44
+ description: "List files in Vercel Blob storage with optional prefix filtering and pagination",
45
+ inputSchema: {
46
+ type: "object",
47
+ properties: {
48
+ prefix: {
49
+ type: "string",
50
+ description: "Optional path prefix to filter results (e.g. 'images/', 'videos/2024/')",
51
+ },
52
+ cursor: {
53
+ type: "string",
54
+ description: "Pagination cursor from a previous list call to get the next page",
55
+ },
56
+ limit: {
57
+ type: "number",
58
+ description: "Maximum number of results to return (default: 1000, max: 1000)",
59
+ },
60
+ },
61
+ required: [],
62
+ },
63
+ },
64
+ {
65
+ name: "blob_head",
66
+ description: "Get metadata of a specific blob by its URL (size, content type, upload time, etc.)",
67
+ inputSchema: {
68
+ type: "object",
69
+ properties: {
70
+ url: {
71
+ type: "string",
72
+ description: "The Vercel Blob URL of the file",
73
+ },
74
+ },
75
+ required: ["url"],
76
+ },
77
+ },
78
+ {
79
+ name: "blob_delete",
80
+ description: "Delete one or more blobs from Vercel Blob storage",
81
+ inputSchema: {
82
+ type: "object",
83
+ properties: {
84
+ urls: {
85
+ type: "array",
86
+ items: { type: "string" },
87
+ description: "Array of Vercel Blob URLs to delete",
88
+ },
89
+ },
90
+ required: ["urls"],
91
+ },
92
+ },
93
+ {
94
+ name: "blob_copy",
95
+ description: "Copy a blob to a new path in Vercel Blob storage",
96
+ inputSchema: {
97
+ type: "object",
98
+ properties: {
99
+ fromUrl: {
100
+ type: "string",
101
+ description: "Source Vercel Blob URL to copy from",
102
+ },
103
+ toPathname: {
104
+ type: "string",
105
+ description: "Destination path/filename in the blob store (e.g. 'images/copy.jpg')",
106
+ },
107
+ },
108
+ required: ["fromUrl", "toPathname"],
109
+ },
110
+ },
111
+ ];
112
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
113
+ return { tools };
114
+ });
115
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
116
+ const { name, arguments: args } = request.params;
117
+ try {
118
+ const token = getToken();
119
+ switch (name) {
120
+ case "blob_upload": {
121
+ if (!args || typeof args.localPath !== "string") {
122
+ throw new Error("localPath is required and must be a string");
123
+ }
124
+ const fileBuffer = await readFile(args.localPath);
125
+ const filename = typeof args.pathname === "string" && args.pathname
126
+ ? args.pathname
127
+ : basename(args.localPath);
128
+ const blob = await put(filename, fileBuffer, {
129
+ access: "public",
130
+ token,
131
+ });
132
+ return {
133
+ content: [
134
+ {
135
+ type: "text",
136
+ text: [
137
+ "File uploaded successfully!",
138
+ `URL: ${blob.url}`,
139
+ `Pathname: ${blob.pathname}`,
140
+ `Content Type: ${blob.contentType}`,
141
+ ].join("\n"),
142
+ },
143
+ ],
144
+ };
145
+ }
146
+ case "blob_list": {
147
+ const options = { token };
148
+ if (typeof args?.prefix === "string")
149
+ options.prefix = args.prefix;
150
+ if (typeof args?.cursor === "string")
151
+ options.cursor = args.cursor;
152
+ if (typeof args?.limit === "number")
153
+ options.limit = args.limit;
154
+ const result = await list(options);
155
+ const lines = [
156
+ `Found ${result.blobs.length} file(s)${result.hasMore ? " (more available)" : ""}:`,
157
+ "",
158
+ ...result.blobs.map((b) => `• ${b.pathname} (${b.size} bytes)\n URL: ${b.url}\n Uploaded: ${b.uploadedAt}`),
159
+ ];
160
+ if (result.hasMore && result.cursor) {
161
+ lines.push("", `Next cursor: ${result.cursor}`);
162
+ }
163
+ return {
164
+ content: [{ type: "text", text: lines.join("\n") }],
165
+ };
166
+ }
167
+ case "blob_head": {
168
+ if (!args || typeof args.url !== "string") {
169
+ throw new Error("url is required and must be a string");
170
+ }
171
+ const result = await head(args.url, { token });
172
+ return {
173
+ content: [
174
+ {
175
+ type: "text",
176
+ text: [
177
+ `Pathname: ${result.pathname}`,
178
+ `URL: ${result.url}`,
179
+ `Size: ${result.size} bytes`,
180
+ `Content Type: ${result.contentType}`,
181
+ `Uploaded At: ${result.uploadedAt}`,
182
+ ].join("\n"),
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ case "blob_delete": {
188
+ if (!args || !Array.isArray(args.urls) || args.urls.length === 0) {
189
+ throw new Error("urls is required and must be a non-empty array of strings");
190
+ }
191
+ await del(args.urls, { token });
192
+ return {
193
+ content: [
194
+ {
195
+ type: "text",
196
+ text: `Successfully deleted ${args.urls.length} file(s).`,
197
+ },
198
+ ],
199
+ };
200
+ }
201
+ case "blob_copy": {
202
+ if (!args || typeof args.fromUrl !== "string" || typeof args.toPathname !== "string") {
203
+ throw new Error("fromUrl and toPathname are required strings");
204
+ }
205
+ const result = await copy(args.fromUrl, args.toPathname, {
206
+ access: "public",
207
+ token,
208
+ });
209
+ return {
210
+ content: [
211
+ {
212
+ type: "text",
213
+ text: [
214
+ "File copied successfully!",
215
+ `New URL: ${result.url}`,
216
+ `New Pathname: ${result.pathname}`,
217
+ ].join("\n"),
218
+ },
219
+ ],
220
+ };
221
+ }
222
+ default:
223
+ throw new Error(`Unknown tool: ${name}`);
224
+ }
225
+ }
226
+ catch (error) {
227
+ const errorMessage = error instanceof Error ? error.message : String(error);
228
+ return {
229
+ content: [{ type: "text", text: `Error: ${errorMessage}` }],
230
+ isError: true,
231
+ };
232
+ }
233
+ });
234
+ async function main() {
235
+ const transport = new StdioServerTransport();
236
+ await server.connect(transport);
237
+ console.error("vercel-blob-mcp running on stdio");
238
+ }
239
+ main().catch((error) => {
240
+ console.error("Server error:", error);
241
+ process.exit(1);
242
+ });
243
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "vercel-blob-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for managing personal media files in Vercel Blob storage",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "vercel-blob-mcp": "dist/index.js"
8
+ },
9
+ "type": "module",
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "npm run build",
17
+ "start": "node dist/index.js",
18
+ "dev": "tsx src/index.ts"
19
+ },
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.27.1",
22
+ "@vercel/blob": "^2.3.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.0.0",
26
+ "tsx": "^4.0.0",
27
+ "typescript": "^5.0.0"
28
+ },
29
+ "keywords": [
30
+ "mcp",
31
+ "vercel",
32
+ "blob",
33
+ "storage",
34
+ "claude"
35
+ ],
36
+ "author": "strzhao",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/strzhao/vercel-blob-mcp.git"
41
+ },
42
+ "bugs": {
43
+ "url": "https://github.com/strzhao/vercel-blob-mcp/issues"
44
+ },
45
+ "homepage": "https://github.com/strzhao/vercel-blob-mcp#readme",
46
+ "publishConfig": {
47
+ "access": "public",
48
+ "registry": "https://registry.npmjs.org/"
49
+ }
50
+ }