#!/bin/bash
# Build FedMCP as a Claude Desktop Extension (.mcpb)
# This creates a one-click installable package for Claude Desktop
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FEDMCP_DIR="$(dirname "$SCRIPT_DIR")"
BUILD_DIR="$FEDMCP_DIR/dist/mcpb"
OUTPUT_FILE="$FEDMCP_DIR/dist/fedmcp.mcpb"
echo "Building FedMCP Desktop Extension..."
echo "=================================="
# Clean and create build directory
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
# Copy manifest and icon
cp "$FEDMCP_DIR/mcpb/manifest.json" "$BUILD_DIR/"
cp "$FEDMCP_DIR/mcpb/icon.svg" "$BUILD_DIR/"
# Copy source code
mkdir -p "$BUILD_DIR/src"
cp -r "$FEDMCP_DIR/src/fedmcp" "$BUILD_DIR/src/"
# Copy pyproject.toml for dependency info
cp "$FEDMCP_DIR/pyproject.toml" "$BUILD_DIR/"
# Create requirements.txt from pyproject.toml
echo "Extracting dependencies..."
python3 << 'PYTHON_SCRIPT'
import tomllib
import os
fedmcp_dir = os.environ.get('FEDMCP_DIR', '.')
with open(f'{fedmcp_dir}/pyproject.toml', 'rb') as f:
config = tomllib.load(f)
deps = config.get('project', {}).get('dependencies', [])
build_dir = os.environ.get('BUILD_DIR', './dist/mcpb')
with open(f'{build_dir}/requirements.txt', 'w') as f:
for dep in deps:
f.write(dep + '\n')
print(f"Created requirements.txt with {len(deps)} dependencies")
PYTHON_SCRIPT
# Create the .mcpb file (zip archive)
echo "Creating .mcpb package..."
cd "$BUILD_DIR"
zip -r "$OUTPUT_FILE" . -x "*.pyc" -x "__pycache__/*" -x "*.egg-info/*"
# Get file size
SIZE=$(du -h "$OUTPUT_FILE" | cut -f1)
echo ""
echo "=================================="
echo "Build complete!"
echo " Output: $OUTPUT_FILE"
echo " Size: $SIZE"
echo ""
echo "To install in Claude Desktop:"
echo " 1. Open Claude Desktop"
echo " 2. Go to Settings > Extensions"
echo " 3. Click 'Install from file' and select fedmcp.mcpb"
echo ""
echo "Or distribute via URL for one-click install:"
echo " claude-desktop://install-extension?url=https://your-host/fedmcp.mcpb"