botverse-mcp 1.0.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.
Files changed (4) hide show
  1. package/README.md +77 -0
  2. package/index.js +106 -0
  3. package/package.json +31 -0
  4. package/server.json +36 -0
package/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # @botverse/mcp
2
+
3
+ MCP server for [Botverse](https://botverse.cloud) — video transcoding and document conversion for AI agents.
4
+
5
+ ## What it does
6
+
7
+ - **Video transcoding** — MP4 (H.264), WebM (VP9), ProRes 422, GIF, MP3 extraction · $0.25/job
8
+ - **Document conversion** — Markdown ↔ DOCX ↔ PDF ↔ HTML ↔ XLSX · $0.05/file
9
+
10
+ Three tool calls. No AWS. No FFmpeg. No infrastructure.
11
+
12
+ ## Setup
13
+
14
+ 1. Sign up at [botverse.cloud](https://botverse.cloud) — $2.50 minimum, no monthly fees
15
+ 2. Get an API key or connector URL from your dashboard
16
+ 3. Add to your MCP client config
17
+
18
+ ## Usage
19
+
20
+ ### Claude Desktop / Cursor / Windsurf
21
+
22
+ ```json
23
+ {
24
+ "mcpServers": {
25
+ "botverse": {
26
+ "command": "npx",
27
+ "args": ["-y", "@botverse/mcp"],
28
+ "env": {
29
+ "BOTVERSE_API_KEY": "bv_live_..."
30
+ }
31
+ }
32
+ }
33
+ }
34
+ ```
35
+
36
+ Or with a connector URL (recommended for claude.ai):
37
+
38
+ ```json
39
+ {
40
+ "mcpServers": {
41
+ "botverse": {
42
+ "command": "npx",
43
+ "args": ["-y", "@botverse/mcp"],
44
+ "env": {
45
+ "BOTVERSE_CONNECTOR_URL": "https://botverse.cloud/mcp?token=bv_sess_..."
46
+ }
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ ## Tools
53
+
54
+ | Tool | Description |
55
+ |---|---|
56
+ | `transcode_from_url` | Transcode video from a public URL |
57
+ | `transcode_video` | Transcode an uploaded video file |
58
+ | `convert_content` | Convert document content inline |
59
+ | `convert_from_url` | Convert a document from a public URL |
60
+ | `get_job_status` | Poll a job until complete |
61
+ | `get_download_url` | Get the signed download URL |
62
+ | `get_wallet_balance` | Check wallet balance |
63
+
64
+ ## Pricing
65
+
66
+ - Video transcode (≤5 min): **$0.25/job**
67
+ - Video overage: **+$0.08/min**
68
+ - ProRes 422: **$0.50/job**
69
+ - Document conversion: **$0.05/file**
70
+
71
+ Credits never expire. [Full pricing →](https://botverse.cloud/pricing)
72
+
73
+ ## Links
74
+
75
+ - [Documentation](https://botverse.cloud/docs)
76
+ - [Dashboard](https://botverse.cloud/dashboard)
77
+ - [Support](mailto:support@botverse.cloud)
package/index.js ADDED
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @botverse/mcp — stdio bridge for the Botverse MCP server.
4
+ *
5
+ * Reads MCP JSON-RPC from stdin, forwards to botverse.cloud/mcp,
6
+ * writes responses to stdout. Compatible with Claude Desktop, Cursor,
7
+ * VS Code, Windsurf, Zed, and any MCP-compatible agent runtime.
8
+ *
9
+ * Auth (set one):
10
+ * BOTVERSE_API_KEY=bv_live_... — API key, sent as Authorization: Bearer
11
+ * BOTVERSE_CONNECTOR_URL=https://... — Full connector URL with ?token=bv_sess_...
12
+ */
13
+
14
+ const { createInterface } = require("readline");
15
+ const https = require("https");
16
+ const { URL } = require("url");
17
+
18
+ const CONNECTOR_URL = process.env.BOTVERSE_CONNECTOR_URL;
19
+ const API_KEY = process.env.BOTVERSE_API_KEY;
20
+ const BASE_URL = "https://botverse.cloud/mcp";
21
+
22
+ if (!CONNECTOR_URL && !API_KEY) {
23
+ process.stderr.write(
24
+ "[botverse-mcp] Error: set BOTVERSE_API_KEY or BOTVERSE_CONNECTOR_URL.\n" +
25
+ " Get credentials at https://botverse.cloud/dashboard/api-keys\n"
26
+ );
27
+ process.exit(1);
28
+ }
29
+
30
+ function getTargetUrl() {
31
+ return CONNECTOR_URL || BASE_URL;
32
+ }
33
+
34
+ function getHeaders(bodyLength) {
35
+ const headers = {
36
+ "Content-Type": "application/json",
37
+ "Content-Length": bodyLength,
38
+ "User-Agent": "@botverse/mcp/1.0.0",
39
+ };
40
+ if (!CONNECTOR_URL && API_KEY) {
41
+ headers["Authorization"] = `Bearer ${API_KEY}`;
42
+ }
43
+ return headers;
44
+ }
45
+
46
+ function post(body) {
47
+ return new Promise((resolve, reject) => {
48
+ const raw = JSON.stringify(body);
49
+ const target = new URL(getTargetUrl());
50
+ const options = {
51
+ hostname: target.hostname,
52
+ port: target.port || 443,
53
+ path: target.pathname + target.search,
54
+ method: "POST",
55
+ headers: getHeaders(Buffer.byteLength(raw)),
56
+ };
57
+
58
+ const req = https.request(options, (res) => {
59
+ let data = "";
60
+ res.on("data", (chunk) => { data += chunk; });
61
+ res.on("end", () => {
62
+ try {
63
+ resolve(JSON.parse(data));
64
+ } catch {
65
+ reject(new Error(`Non-JSON response (HTTP ${res.statusCode}): ${data.slice(0, 200)}`));
66
+ }
67
+ });
68
+ });
69
+
70
+ req.on("error", reject);
71
+ req.setTimeout(60000, () => { req.destroy(new Error("Request timed out")); });
72
+ req.write(raw);
73
+ req.end();
74
+ });
75
+ }
76
+
77
+ const rl = createInterface({ input: process.stdin, terminal: false });
78
+
79
+ rl.on("line", async (line) => {
80
+ const trimmed = line.trim();
81
+ if (!trimmed) return;
82
+
83
+ let message;
84
+ try {
85
+ message = JSON.parse(trimmed);
86
+ } catch {
87
+ return; // ignore malformed input
88
+ }
89
+
90
+ try {
91
+ const response = await post(message);
92
+ process.stdout.write(JSON.stringify(response) + "\n");
93
+ } catch (err) {
94
+ const errorResponse = {
95
+ jsonrpc: "2.0",
96
+ id: message.id ?? null,
97
+ error: {
98
+ code: -32603,
99
+ message: err instanceof Error ? err.message : "Internal error",
100
+ },
101
+ };
102
+ process.stdout.write(JSON.stringify(errorResponse) + "\n");
103
+ }
104
+ });
105
+
106
+ rl.on("close", () => { process.exit(0); });
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "botverse-mcp",
3
+ "version": "1.0.0",
4
+ "mcpName": "io.github.mkturner74/botverse",
5
+ "description": "MCP server for Botverse — video transcoding and document conversion for AI agents. $0.25/transcode · $0.05/convert · No AWS required.",
6
+ "main": "index.js",
7
+ "bin": {
8
+ "botverse-mcp": "index.js"
9
+ },
10
+ "scripts": {
11
+ "start": "node index.js"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/botverse/botverse-mcp.git"
16
+ },
17
+ "homepage": "https://botverse.cloud",
18
+ "bugs": {
19
+ "url": "https://github.com/botverse/botverse-mcp/issues"
20
+ },
21
+ "keywords": [
22
+ "mcp", "model-context-protocol", "ai", "agents", "video", "transcoding",
23
+ "document", "conversion", "botverse", "claude", "llm"
24
+ ],
25
+ "author": "Entertainment Technologists Inc. <support@botverse.cloud>",
26
+ "license": "MIT",
27
+ "engines": {
28
+ "node": ">=18"
29
+ },
30
+ "dependencies": {}
31
+ }
package/server.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.mkturner74/botverse",
4
+ "description": "Video transcoding (MP4, WebM, ProRes 422, GIF, MP3) and document conversion (Markdown, DOCX, PDF, HTML, XLSX) for AI agents. Prepaid wallet, per-job billing. No AWS, no FFmpeg, no infrastructure to manage.",
5
+ "repository": {
6
+ "url": "https://github.com/botverse/botverse-mcp",
7
+ "source": "github"
8
+ },
9
+ "version": "1.0.0",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "identifier": "botverse-mcp",
14
+ "version": "1.0.0",
15
+ "transport": {
16
+ "type": "stdio"
17
+ },
18
+ "environmentVariables": [
19
+ {
20
+ "name": "BOTVERSE_API_KEY",
21
+ "description": "Your Botverse API key (bv_live_...). Generate at https://botverse.cloud/dashboard/api-keys",
22
+ "isRequired": false,
23
+ "isSecret": true,
24
+ "format": "string"
25
+ },
26
+ {
27
+ "name": "BOTVERSE_CONNECTOR_URL",
28
+ "description": "Your Botverse connector URL (https://botverse.cloud/mcp?token=bv_sess_...). Alternative to API key — recommended for claude.ai and browser clients.",
29
+ "isRequired": false,
30
+ "isSecret": true,
31
+ "format": "string"
32
+ }
33
+ ]
34
+ }
35
+ ]
36
+ }