#!/bin/bash # Build a standalone distributable package for DICOM MCP Server # Uses python-build-standalone to bundle Python 3.12 + dependencies set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' echo -e "${GREEN}=== Building Standalone DICOM MCP Package ===${NC}\n" # Detect architecture ARCH=$(uname -m) RELEASE="20260203" if [ "$ARCH" = "x86_64" ]; then PYTHON_BUILD="cpython-3.12.12+${RELEASE}-x86_64-apple-darwin-install_only_stripped.tar.gz" DIST_ARCH="x86_64" elif [ "$ARCH" = "arm64" ]; then PYTHON_BUILD="cpython-3.12.12+${RELEASE}-aarch64-apple-darwin-install_only_stripped.tar.gz" DIST_ARCH="arm64" else echo -e "${RED}Unsupported architecture: $ARCH${NC}" exit 1 fi TEMP_BUILD_DIR="build/temp" DIST_DIR="build/dicom_mcp_standalone_${DIST_ARCH}" PYTHON_URL="https://github.com/indygreg/python-build-standalone/releases/download/${RELEASE}/$PYTHON_BUILD" # Clean previous builds rm -rf "build" "dist" mkdir -p "$TEMP_BUILD_DIR" "$DIST_DIR" # Download standalone Python echo -e "${YELLOW}Downloading Python 3.12 standalone build for ${ARCH}...${NC}" curl -L "$PYTHON_URL" -o "$TEMP_BUILD_DIR/python.tar.gz" # Extract Python echo -e "${YELLOW}Extracting Python...${NC}" tar -xzf "$TEMP_BUILD_DIR/python.tar.gz" -C "$TEMP_BUILD_DIR" mv "$TEMP_BUILD_DIR/python" "$DIST_DIR/python" # Set up Python environment PYTHON_BIN="$DIST_DIR/python/bin/python3" # Install dependencies echo -e "${YELLOW}Installing dependencies...${NC}" "$PYTHON_BIN" -m pip install --upgrade pip "$PYTHON_BIN" -m pip install fastmcp==2.0.0 pydicom==3.0.1 numpy==2.4.2 Pillow==12.1.1 # Copy server code echo -e "${YELLOW}Copying server code...${NC}" cp -r dicom_mcp/ "$DIST_DIR/dicom_mcp/" cp dicom_mcp.py "$DIST_DIR/" # Create launcher script echo -e "${YELLOW}Creating launcher script...${NC}" cat > "$DIST_DIR/run_dicom_mcp.sh" << 'EOF' #!/bin/bash # DICOM MCP Server Launcher SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd "$SCRIPT_DIR" exec "$SCRIPT_DIR/python/bin/python3" -m dicom_mcp EOF chmod +x "$DIST_DIR/run_dicom_mcp.sh" # Create installation instructions cat > "$DIST_DIR/INSTALL.txt" << EOF DICOM MCP Server - Installation Instructions 1. Move this entire folder to your preferred location, e.g.: /Users/yourusername/Applications/dicom_mcp_standalone_${DIST_ARCH} 2. Edit your Claude Desktop configuration file: ~/Library/Application Support/Claude/claude_desktop_config.json 3. Add the following to the "mcpServers" section: "dicom_mcp": { "command": "/path/to/dicom_mcp_standalone_${DIST_ARCH}/run_dicom_mcp.sh" } (Replace /path/to/ with the actual location where you placed this folder) 4. Restart Claude Desktop 5. Verify the server is working by asking Claude: "List available MCP tools" You should see 12 DICOM tools available. No Python installation required - everything is bundled! EOF # Create a simple installer script for end users cat > "$DIST_DIR/install_to_claude.sh" << 'EOF' #!/bin/bash set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" CONFIG_FILE="$HOME/Library/Application Support/Claude/claude_desktop_config.json" echo -e "${GREEN}=== DICOM MCP Server - Claude Desktop Setup ===${NC}\n" # Create config directory if needed mkdir -p "$HOME/Library/Application Support/Claude" # Check if config exists if [ -f "$CONFIG_FILE" ]; then echo -e "${YELLOW}Existing configuration found.${NC}" echo -e "Please add the following to your mcpServers section:\n" echo '{ "dicom_mcp": { "command": "'"$SCRIPT_DIR/run_dicom_mcp.sh"'" } }' echo -e "\n${YELLOW}Configuration file location:${NC}" echo "$CONFIG_FILE" else echo -e "${YELLOW}Creating new configuration...${NC}" cat > "$CONFIG_FILE" << CONFIGEOF { "mcpServers": { "dicom_mcp": { "command": "$SCRIPT_DIR/run_dicom_mcp.sh" } } } CONFIGEOF echo -e "${GREEN}✓ Configuration created${NC}" fi echo -e "\n${GREEN}Next step: Restart Claude Desktop${NC}\n" EOF chmod +x "$DIST_DIR/install_to_claude.sh" # Create tarball for distribution echo -e "${YELLOW}Creating distribution package...${NC}" mkdir -p dist tar -czf "dist/dicom_mcp_standalone_${DIST_ARCH}.tar.gz" -C build "dicom_mcp_standalone_${DIST_ARCH}" # Clean up build directory rm -rf build echo -e "\n${GREEN}=== Build Complete ===${NC}\n" echo -e "Distribution package created at:" echo -e "${YELLOW}dist/dicom_mcp_standalone_${DIST_ARCH}.tar.gz${NC}\n" echo -e "Package size: $(du -h "dist/dicom_mcp_standalone_${DIST_ARCH}.tar.gz" | cut -f1)\n" echo -e "To distribute:" echo -e "1. Send the .tar.gz file to users" echo -e "2. Users extract it: ${YELLOW}tar -xzf dicom_mcp_standalone_${DIST_ARCH}.tar.gz${NC}" echo -e "3. Users run: ${YELLOW}cd dicom_mcp_standalone_${DIST_ARCH} && ./install_to_claude.sh${NC}\n"