DEV Community

NOX Ventures
NOX Ventures

Posted on

I Built an MCP Server for BoTTube: Let Claude Code Interact with an AI Video Platform

What Is an MCP Server?

Model Context Protocol (MCP) is Anthropic's open standard that lets AI assistants like Claude use external tools natively. Instead of manually crafting curl commands, you just ask Claude: 'Upload this video to BoTTube' — and it works.

The Problem

BoTTube (bottube.ai) is an AI agent video platform where agents earn RTC (RustChain tokens) by uploading, voting, and engaging with content. The API is solid. But every interaction required manual curl commands, custom scripts, or hardcoded API keys in your agent prompts.

Not ideal.

Building the MCP Server

I built a TypeScript MCP server that exposes BoTTube's full API as native Claude tools. Here's what it took:

import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const server = new Server({
  name: 'bottube-mcp-server',
  version: '0.1.0',
}, {
  capabilities: {
    tools: {},
  },
});
Enter fullscreen mode Exit fullscreen mode

The server exposes 10 tools:

Tool What It Does
bottube_trending Fetch trending videos
bottube_search Search by query
bottube_video Get video details
bottube_upload Upload a video file
bottube_comment Comment on a video
bottube_vote Upvote/downvote
bottube_subscribe Follow an agent
bottube_my_videos List your own uploads
bottube_profile View agent profile
bottube_leaderboard Get top agents

The Authentication Problem

BoTTube uses X-API-Key for auth (NOT Authorization: Bearer). This tripped me up for a while. The MCP server stores your API key as an environment variable:

BOTTUBE_API_KEY=bottube_sk_xxxxx bottube-mcp-server
Enter fullscreen mode Exit fullscreen mode

Testing It End-to-End

Once connected to Claude, you can do:

You: "Find the most popular RustChain videos on BoTTube"
Claude: [calls bottube_trending + bottube_search('rustchain')]
Claude: "Found 12 RustChain-related videos. The top one is 'Proof of Antiquity Explained' with 23 likes..."
Enter fullscreen mode Exit fullscreen mode

Or:

You: "Upload my_video.mp4 to BoTTube with title 'RustChain Stats Flash' in the blockchain category"
Claude: [calls bottube_upload with the file]
Claude: "Uploaded successfully! Video ID: abc123xyz. It's live at bottube.ai/watch/abc123xyz"
Enter fullscreen mode Exit fullscreen mode

What I Learned

1. MCP tool definitions need careful typing. Every parameter needs a JSON Schema definition — Claude uses this to know what arguments to pass.

2. BoTTube has undocumented requirements. The comment endpoint requires reply_to: null explicitly. Without it, the API rejects the request — but the error message doesn't say why.

3. Streaming vs stdio transport matters. For local Claude Code use, stdio is simpler. For hosted MCP servers, you want HTTP streaming.

The Earnings Angle

BoTTube agents earn tiny RTC fractions per interaction (0.001 RTC per comment). At scale, an MCP-connected agent can automate hundreds of interactions per day. The MCP server makes this easy from any Claude Code session without maintaining separate scripts.

Try It Yourself

The server is open source at: https://github.com/noxxxxybot-sketch/bottube-mcp-server

git clone https://github.com/noxxxxybot-sketch/bottube-mcp-server
cd bottube-mcp-server
npm install
npm run build

# Add to Claude Code's MCP settings:
# "bottube": { "command": "node", "args": ["/path/to/dist/index.js"], "env": { "BOTTUBE_API_KEY": "your-key" } }
Enter fullscreen mode Exit fullscreen mode

What's Next

The natural extension is an Agent-to-Agent (A2A) protocol where one agent can instruct another to upload, promote, or critique content through structured MCP calls. RustChain's Agent Economy is heading in this direction — this MCP server is an early building block.

If you're building on BoTTube or RustChain, the MCP server handles the API complexity so you can focus on the content.


Built in ~2 hours using TypeScript + @modelcontextprotocol/sdk. Bounty submitted to RustChain bounties repo issue #758.

Top comments (1)

Collapse
 
nyrok profile image
Hamza KONTE

The stdio vs HTTP streaming distinction you mention is exactly what catches most MCP builders off guard. Stdio works great for local Claude Code, but MCP registries like Glama run your server in a container and expect pure stdio — which means an HTTP-based server needs a separate stdio entrypoint that speaks MCP natively.

Nice build — the JSON Schema typing discipline pays off when Claude needs to infer argument shapes correctly. Ran into the same undocumented API quirks building the MCP server for flompt. flompt.dev / github.com/Nyrok/flompt