@rendobar/mcp 1.2.1 → 1.2.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 +5 -3
- package/dist/bin.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -20,16 +20,18 @@
|
|
|
20
20
|
<a href="https://www.npmjs.com/package/@rendobar/mcp">npm</a> ·
|
|
21
21
|
<a href="https://discord.gg/kAGqjBzx8N">Discord</a>
|
|
22
22
|
</p>
|
|
23
|
-
|
|
23
|
+
<p align="center">
|
|
24
|
+
<a href="https://glama.ai/mcp/servers/kwdj3f0u3z">
|
|
25
|
+
<img src="https://glama.ai/mcp/servers/kwdj3f0u3z/badge" alt="Rendobar MCP server on Glama" width="380">
|
|
26
|
+
</a>
|
|
27
|
+
</p>
|
|
24
28
|
<p align="center">
|
|
25
29
|
<a href="https://www.npmjs.com/package/@rendobar/mcp"><img src="https://img.shields.io/npm/v/@rendobar/mcp?style=flat-square&color=059669&label=npm" alt="npm version"></a>
|
|
26
30
|
<a href="https://www.npmjs.com/package/@rendobar/mcp"><img src="https://img.shields.io/npm/dm/@rendobar/mcp?style=flat-square&color=059669" alt="npm downloads"></a>
|
|
27
31
|
<img src="https://img.shields.io/npm/l/@rendobar/mcp?style=flat-square&color=059669" alt="MIT license">
|
|
28
32
|
<img src="https://img.shields.io/node/v/@rendobar/mcp?style=flat-square&color=059669" alt="Node version">
|
|
29
|
-
<a href="https://glama.ai/mcp/servers/kwdj3f0u3z"><img src="https://glama.ai/mcp/servers/kwdj3f0u3z/badge" alt="Glama quality" height="20"></a>
|
|
30
33
|
</p>
|
|
31
34
|
|
|
32
|
-
---
|
|
33
35
|
|
|
34
36
|
`@rendobar/mcp` is the official Model Context Protocol server for [Rendobar](https://rendobar.com). It lets AI agents in Claude Desktop, Cursor, Cline, Windsurf, Zed, VS Code, Claude Code, and Continue submit Rendobar jobs and upload local files in a single tool call.
|
|
35
37
|
|
package/dist/bin.js
CHANGED
|
@@ -35,7 +35,7 @@ Active job types:
|
|
|
35
35
|
${(e.length>0?e:oe).map(o=>` ${o.type} \u2014 ${o.summary}`).join(`
|
|
36
36
|
`)}`;return{name:"submit_job",title:"Submit Rendobar Job",description:Q+t+`
|
|
37
37
|
|
|
38
|
-
For local files, call upload_file first to get a downloadUrl, then use it as inputs.source.`,inputSchema:te,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(o,r)=>{let a=await c(r).jobs.create({type:o.type,inputs:o.inputs,params:o.params,idempotencyKey:o.idempotencyKey});return{jobId:a.id,status:a.status}}}}var re={name:"cancel_job",title:"Cancel Rendobar Job",description:"Cancel a job that has not started running. Only jobs in status 'waiting' or 'dispatched' can be cancelled. Use when the user changes their mind, or when you submitted the wrong job. Running, completed, failed, or already-cancelled jobs cannot be cancelled.",inputSchema:{jobId:i.string().describe("Job ID to cancel (e.g. 'job_abc123')")},annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},execute:async(e,n)=>{let t=await c(n).jobs.cancel(e.jobId);return{id:t.id,status:t.status}}},y=e=>e;async function O(e){let n=[];try{e!==null&&(n=await e.jobs.types())}catch{}return[y(q),y(X),y(ne(n)),y(re)]}import{z as h}from"zod";import{promises as ie}from"fs";import w from"path";import{promises as F}from"fs";import D from"path";async function L(e,n){let t=D.resolve(n.cwd,e),o=await F.realpath(t);if(n.roots!==void 0&&n.roots.length>0&&!(await Promise.all(n.roots.map(s=>F.realpath(s).catch(()=>null)))).some(s=>s!==null&&(o===s||o.startsWith(s+D.sep))))throw new Error(`Path is outside the allowed MCP roots: ${o}`);return o}async function se(e){if(e.cachedMaxFileSize!==null)return e.cachedMaxFileSize;let n=await c(e).billing.state();return e.cachedMaxFileSize=n.plan.limits.maxInputFileSize,e.cachedMaxFileSize}var ae={name:"upload_file",title:"Upload Local File to Rendobar",description:"Read a local file and upload it to Rendobar. Returns a downloadUrl to use as input in submit_job. If the file is already at a public HTTPS URL, skip this and pass the URL directly to submit_job.",inputSchema:{path:h.string().describe("Absolute or working-dir-relative path to the file"),filename:h.string().optional().describe("Filename hint sent to Rendobar (defaults to basename of path)")},outputSchema:{downloadUrl:h.string().url(),sizeBytes:h.number()},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(e,n,t)=>{let o=await L(e.path,{cwd:process.cwd()}),r=await ie.open(o,"r");try{let a=await r.stat();if(!a.isFile())throw new Error(`Path is not a regular file: ${w.basename(o)}`);let s=a.size,l=await se(n);if(s>l)throw new Error(`File size (${s} bytes) exceeds plan limit (${l} bytes). Upgrade your plan for larger uploads.`);n.logger.debug({msg:"upload_start",basename:w.basename(o),sizeBytes:s});let g=await r.readFile(),m=new Blob([g]),f=await c(n).uploads.
|
|
38
|
+
For local files, call upload_file first to get a downloadUrl, then use it as inputs.source.`,inputSchema:te,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(o,r)=>{let a=await c(r).jobs.create({type:o.type,inputs:o.inputs,params:o.params,idempotencyKey:o.idempotencyKey});return{jobId:a.id,status:a.status}}}}var re={name:"cancel_job",title:"Cancel Rendobar Job",description:"Cancel a job that has not started running. Only jobs in status 'waiting' or 'dispatched' can be cancelled. Use when the user changes their mind, or when you submitted the wrong job. Running, completed, failed, or already-cancelled jobs cannot be cancelled.",inputSchema:{jobId:i.string().describe("Job ID to cancel (e.g. 'job_abc123')")},annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},execute:async(e,n)=>{let t=await c(n).jobs.cancel(e.jobId);return{id:t.id,status:t.status}}},y=e=>e;async function O(e){let n=[];try{e!==null&&(n=await e.jobs.types())}catch{}return[y(q),y(X),y(ne(n)),y(re)]}import{z as h}from"zod";import{promises as ie}from"fs";import w from"path";import{promises as F}from"fs";import D from"path";async function L(e,n){let t=D.resolve(n.cwd,e),o=await F.realpath(t);if(n.roots!==void 0&&n.roots.length>0&&!(await Promise.all(n.roots.map(s=>F.realpath(s).catch(()=>null)))).some(s=>s!==null&&(o===s||o.startsWith(s+D.sep))))throw new Error(`Path is outside the allowed MCP roots: ${o}`);return o}async function se(e){if(e.cachedMaxFileSize!==null)return e.cachedMaxFileSize;let n=await c(e).billing.state();return e.cachedMaxFileSize=n.plan.limits.maxInputFileSize,e.cachedMaxFileSize}var ae={name:"upload_file",title:"Upload Local File to Rendobar",description:"Read a local file and upload it to Rendobar. Returns a downloadUrl to use as input in submit_job. If the file is already at a public HTTPS URL, skip this and pass the URL directly to submit_job.",inputSchema:{path:h.string().describe("Absolute or working-dir-relative path to the file"),filename:h.string().optional().describe("Filename hint sent to Rendobar (defaults to basename of path)")},outputSchema:{downloadUrl:h.string().url(),sizeBytes:h.number()},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(e,n,t)=>{let o=await L(e.path,{cwd:process.cwd()}),r=await ie.open(o,"r");try{let a=await r.stat();if(!a.isFile())throw new Error(`Path is not a regular file: ${w.basename(o)}`);let s=a.size,l=await se(n);if(s>l)throw new Error(`File size (${s} bytes) exceeds plan limit (${l} bytes). Upgrade your plan for larger uploads.`);n.logger.debug({msg:"upload_start",basename:w.basename(o),sizeBytes:s});let g=await r.readFile(),m=new Blob([g]),f=await c(n).uploads.create(m,{filename:e.filename??w.basename(o),signal:t.signal});return n.logger.info({msg:"upload_complete",basename:w.basename(o),sizeBytes:s}),{downloadUrl:f.url,sizeBytes:s}}finally{await r.close()}}},le=e=>e;function z(){return[le(ae)]}async function U(e,n){for(let t of k())b(e,n,t);for(let t of await O(n.sdk))b(e,n,t);for(let t of z())b(e,n,t)}var de="1.2.2";async function N(e){let n=_(e.config,e.logger),t=new ce({name:"rendobar",version:de},{capabilities:{tools:{},logging:{}},instructions:A});return await U(t,n),{server:t,cleanup:async()=>{}}}var S="1.2.2",me=`@rendobar/mcp v${S}
|
|
39
39
|
Local stdio Model Context Protocol server for Rendobar.
|
|
40
40
|
|
|
41
41
|
Usage:
|
package/dist/index.js
CHANGED
|
@@ -34,4 +34,4 @@ Active job types:
|
|
|
34
34
|
${(e.length>0?e:K).map(n=>` ${n.type} \u2014 ${n.summary}`).join(`
|
|
35
35
|
`)}`;return{name:"submit_job",title:"Submit Rendobar Job",description:B+t+`
|
|
36
36
|
|
|
37
|
-
For local files, call upload_file first to get a downloadUrl, then use it as inputs.source.`,inputSchema:N,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(n,i)=>{let s=await c(i).jobs.create({type:n.type,inputs:n.inputs,params:n.params,idempotencyKey:n.idempotencyKey});return{jobId:s.id,status:s.status}}}}var $={name:"cancel_job",title:"Cancel Rendobar Job",description:"Cancel a job that has not started running. Only jobs in status 'waiting' or 'dispatched' can be cancelled. Use when the user changes their mind, or when you submitted the wrong job. Running, completed, failed, or already-cancelled jobs cannot be cancelled.",inputSchema:{jobId:r.string().describe("Job ID to cancel (e.g. 'job_abc123')")},annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},execute:async(e,o)=>{let t=await c(o).jobs.cancel(e.jobId);return{id:t.id,status:t.status}}},m=e=>e;async function T(e){let o=[];try{e!==null&&(o=await e.jobs.types())}catch{}return[m(H),m(M),m(Z(o)),m($)]}import{z as f}from"zod";import{promises as V}from"fs";import g from"path";import{promises as j}from"fs";import v from"path";async function _(e,o){let t=v.resolve(o.cwd,e),n=await j.realpath(t);if(o.roots!==void 0&&o.roots.length>0&&!(await Promise.all(o.roots.map(a=>j.realpath(a).catch(()=>null)))).some(a=>a!==null&&(n===a||n.startsWith(a+v.sep))))throw new Error(`Path is outside the allowed MCP roots: ${n}`);return n}async function W(e){if(e.cachedMaxFileSize!==null)return e.cachedMaxFileSize;let o=await c(e).billing.state();return e.cachedMaxFileSize=o.plan.limits.maxInputFileSize,e.cachedMaxFileSize}var G={name:"upload_file",title:"Upload Local File to Rendobar",description:"Read a local file and upload it to Rendobar. Returns a downloadUrl to use as input in submit_job. If the file is already at a public HTTPS URL, skip this and pass the URL directly to submit_job.",inputSchema:{path:f.string().describe("Absolute or working-dir-relative path to the file"),filename:f.string().optional().describe("Filename hint sent to Rendobar (defaults to basename of path)")},outputSchema:{downloadUrl:f.string().url(),sizeBytes:f.number()},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(e,o,t)=>{let n=await _(e.path,{cwd:process.cwd()}),i=await V.open(n,"r");try{let s=await i.stat();if(!s.isFile())throw new Error(`Path is not a regular file: ${g.basename(n)}`);let a=s.size,l=await W(o);if(a>l)throw new Error(`File size (${a} bytes) exceeds plan limit (${l} bytes). Upgrade your plan for larger uploads.`);o.logger.debug({msg:"upload_start",basename:g.basename(n),sizeBytes:a});let I=await i.readFile(),k=new Blob([I]),F=await c(o).uploads.
|
|
37
|
+
For local files, call upload_file first to get a downloadUrl, then use it as inputs.source.`,inputSchema:N,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(n,i)=>{let s=await c(i).jobs.create({type:n.type,inputs:n.inputs,params:n.params,idempotencyKey:n.idempotencyKey});return{jobId:s.id,status:s.status}}}}var $={name:"cancel_job",title:"Cancel Rendobar Job",description:"Cancel a job that has not started running. Only jobs in status 'waiting' or 'dispatched' can be cancelled. Use when the user changes their mind, or when you submitted the wrong job. Running, completed, failed, or already-cancelled jobs cannot be cancelled.",inputSchema:{jobId:r.string().describe("Job ID to cancel (e.g. 'job_abc123')")},annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},execute:async(e,o)=>{let t=await c(o).jobs.cancel(e.jobId);return{id:t.id,status:t.status}}},m=e=>e;async function T(e){let o=[];try{e!==null&&(o=await e.jobs.types())}catch{}return[m(H),m(M),m(Z(o)),m($)]}import{z as f}from"zod";import{promises as V}from"fs";import g from"path";import{promises as j}from"fs";import v from"path";async function _(e,o){let t=v.resolve(o.cwd,e),n=await j.realpath(t);if(o.roots!==void 0&&o.roots.length>0&&!(await Promise.all(o.roots.map(a=>j.realpath(a).catch(()=>null)))).some(a=>a!==null&&(n===a||n.startsWith(a+v.sep))))throw new Error(`Path is outside the allowed MCP roots: ${n}`);return n}async function W(e){if(e.cachedMaxFileSize!==null)return e.cachedMaxFileSize;let o=await c(e).billing.state();return e.cachedMaxFileSize=o.plan.limits.maxInputFileSize,e.cachedMaxFileSize}var G={name:"upload_file",title:"Upload Local File to Rendobar",description:"Read a local file and upload it to Rendobar. Returns a downloadUrl to use as input in submit_job. If the file is already at a public HTTPS URL, skip this and pass the URL directly to submit_job.",inputSchema:{path:f.string().describe("Absolute or working-dir-relative path to the file"),filename:f.string().optional().describe("Filename hint sent to Rendobar (defaults to basename of path)")},outputSchema:{downloadUrl:f.string().url(),sizeBytes:f.number()},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},execute:async(e,o,t)=>{let n=await _(e.path,{cwd:process.cwd()}),i=await V.open(n,"r");try{let s=await i.stat();if(!s.isFile())throw new Error(`Path is not a regular file: ${g.basename(n)}`);let a=s.size,l=await W(o);if(a>l)throw new Error(`File size (${a} bytes) exceeds plan limit (${l} bytes). Upgrade your plan for larger uploads.`);o.logger.debug({msg:"upload_start",basename:g.basename(n),sizeBytes:a});let I=await i.readFile(),k=new Blob([I]),F=await c(o).uploads.create(k,{filename:e.filename??g.basename(n),signal:t.signal});return o.logger.info({msg:"upload_complete",basename:g.basename(n),sizeBytes:a}),{downloadUrl:F.url,sizeBytes:a}}finally{await i.close()}}},q=e=>e;function A(){return[q(G)]}async function C(e,o){for(let t of w())d(e,o,t);for(let t of await T(o.sdk))d(e,o,t);for(let t of A())d(e,o,t)}var Q="1.2.2";async function X(e){let o=b(e.config,e.logger),t=new Y({name:"rendobar",version:Q},{capabilities:{tools:{},logging:{}},instructions:y});return await C(t,o),{server:t,cleanup:async()=>{}}}export{X as createRendobarMcpServer};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rendobar/mcp",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Rendobar — serverless media processing for AI agents",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
59
|
-
"@rendobar/sdk": "^
|
|
59
|
+
"@rendobar/sdk": "^3.0.0",
|
|
60
60
|
"zod": "^3.25.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|