Skip to main content
Glama

BYOB MCP Server

by ndisidore
DEMO.md7.32 kB
# BYOB MCP Server - Demo Guide ## What We Built A working prototype of a "Bring Your Own Binary" MCP server that demonstrates: 1. ✅ **Dynamic Tool Registry** - Tools stored in D1, queried at runtime 2. ✅ **Containerized Execution** - Each tool runs in isolated Cloudflare Container 3. ✅ **MCP Protocol** - AI agents can discover and invoke tools dynamically 4. ✅ **HTTP Registration API** - Register new tools without redeploying 5. ✅ **Stateless Architecture** - Containers scale to zero, spin up on-demand ## Architecture Demo Flow ``` User registers tool → Stored in D1 ↓ AI agent connects → MCP lists all tools from D1 ↓ AI invokes tool → Worker fetches container ↓ Container processes → HTTP POST /execute ↓ Result returned to AI → Via MCP protocol ``` ## Pre-Built Demo Tools ### 1. Echo Message (`echo_message`) Simple echo service for testing the pipeline. **Schema:** ```json { "message": "string (required)" } ``` **Example Usage:** ```json { "tool": "echo_message", "args": {"message": "Hello BYOB!"} } ``` ### 2. Query JSON (`query_json`) JSON processor using jq filter syntax. **Schema:** ```json { "filter": "string (required) - jq filter expression", "data": "object (required) - JSON data to process" } ``` **Example Usage:** ```json { "tool": "query_json", "args": { "filter": ".items[] | select(.price > 10)", "data": { "items": [ {"name": "apple", "price": 5}, {"name": "banana", "price": 15} ] } } } ``` ## Live Demo Script ### Setup ```bash # Terminal 1: Start dev server npm run dev # Terminal 2: Run tests (wait for server to start) bash test-api.sh ``` ### Demo Step 1: Show Health Check ```bash curl http://localhost:8787/ | jq ``` **Expected Output:** ```json { "name": "BYOB MCP Server", "endpoints": { "mcp": "/mcp", "registerTool": "POST /api/register-tool", "listTools": "GET /api/tools" }, "availableContainers": ["echo", "jq"] } ``` ### Demo Step 2: List Pre-Registered Tools ```bash curl http://localhost:8787/api/tools | jq ``` Shows `echo_message` and `query_json` tools with their schemas. ### Demo Step 3: Register a New Tool ```bash curl -X POST http://localhost:8787/api/register-tool \ -H "Content-Type: application/json" \ -d '{ "name": "summarize_data", "description": "Extracts and counts items from arrays", "containerClass": "jq", "schema": { "type": "object", "properties": { "filter": {"type": "string"}, "data": {"type": "object"} }, "required": ["filter", "data"] } }' ``` **Expected Output:** ```json { "success": true, "message": "Tool registered successfully", "toolName": "summarize_data" } ``` ### Demo Step 4: Verify Tool Registration ```bash curl http://localhost:8787/api/tools | jq '.tools | length' ``` Should show 3 tools now. ### Demo Step 5: Test MCP Protocol ```bash curl -X POST http://localhost:8787/mcp \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {} }' | jq '.result.tools[] | {name, description}' ``` Shows all tools available to AI agents. ## Connecting AI Agents ### Claude Desktop Configuration Edit your Claude Desktop config: **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json` **Windows:** `%APPDATA%\Claude\claude_desktop_config.json` ```json { "mcpServers": { "byob-server": { "url": "http://localhost:8787/mcp" } } } ``` Restart Claude Desktop and ask: ``` "What tools do you have available?" "Can you echo the message 'Hello from BYOB!'?" "Use jq to extract all names from this JSON: [...]" ``` ## Production Deployment ### 1. Push to Remote Database ```bash # Run migrations on production D1 npx wrangler d1 execute byob-tools-registry --remote \ --file=./migrations/0001_initial_schema.sql npx wrangler d1 execute byob-tools-registry --remote \ --file=./migrations/0002_seed_example_tools.sql ``` ### 2. Deploy Worker & Containers ```bash npm run deploy ``` **Note:** First deployment builds Docker images - this takes ~2-5 minutes! ### 3. Verify Deployment ```bash # Get your worker URL from the deploy output, then: curl https://byob-mcp-server.YOUR_ACCOUNT.workers.dev/api/tools | jq ``` ### 4. Update Claude Desktop Config ```json { "mcpServers": { "byob-server": { "url": "https://byob-mcp-server.YOUR_ACCOUNT.workers.dev/mcp" } } } ``` ## Key Achievements ### ✅ Serverless Scale-to-Zero Containers only run when tools are invoked. No idle costs. ### ✅ Dynamic Discovery AI agents see tools registered at runtime without redeployment. ### ✅ Standard Interface All containers expose `POST /execute` - easy to add new tools. ### ✅ Security Isolation Each container runs in isolated sandbox with resource limits. ### ✅ Production-Ready Foundation Built on Cloudflare's production infrastructure: - Workers for orchestration - D1 for metadata - Durable Objects for container lifecycle - Built-in DDoS protection & CDN ## Technical Metrics - **Cold Start:** ~100-300ms (Worker + Container spin-up) - **Warm Invocation:** ~10-50ms (Worker only) - **Instance Types:** 6 available (lite to standard-4) - **Current Setup:** lite (1/16 vCPU, 256MB, 2GB disk) - **Max Concurrent:** Configurable per account ## Limitations Demonstrated ### Static Container Classes To add a truly new container type (e.g., `ffmpeg`), you must: 1. Create the container Dockerfile 2. Add to `wrangler.jsonc` 3. Update `src/containers.ts` 4. Redeploy This is the key limitation preventing true "upload any Docker image" BYOB. ### Workarounds Demonstrated - Tools can share container classes - Multiple tools can use the same container with different configs - Simplified the R2 image storage (not implemented in MVP) ## Next Steps for Full BYOB To achieve true runtime BYOB, you would need: 1. **R2 Image Storage** - Upload container images to R2 2. **Dynamic Container Registration** - API to register container classes 3. **Worker Rebuild Pipeline** - Auto-rebuild/redeploy when new container added 4. **Container Registry** - Manage image versions and rollback ## Hackathon Presentation Points ### What We Built "A serverless MCP server that dynamically exposes containerized tools to AI agents" ### Key Innovation "AI agents can discover and invoke any tool registered in the system, without the MCP server needing to be redeployed" ### Production Potential "Built entirely on Cloudflare's production infrastructure - this could scale to thousands of tools and millions of invocations with zero infrastructure management" ### Demo Script (30 seconds) 1. Show tool registration via curl 2. Query the MCP endpoint to show dynamic tool list 3. Have Claude Desktop invoke one of the tools live ### Technical Depth - Durable Objects for container lifecycle - D1 for tool metadata - Worker-to-Container communication via HTTP fetch - Ephemeral containers for security ## Resources - Full code: This repository - Architecture docs: `HACKATHON.md` - Cloudflare Containers: https://developers.cloudflare.com/containers/ - MCP Protocol: https://modelcontextprotocol.io/ - mcp-lite: https://github.com/fiberplane/mcp-lite

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ndisidore/cf-byob-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server