Skip to main content
Glama

LinkedIn Content Creation MCP Server

by chrishayuk
Makefile15.1 kB
# LinkedIn MCP Server - Development Makefile # ========================================== # Variables PYTHON := uv run python PIP := uv pip PROJECT := chuk_mcp_linkedin SRC_DIR := src/$(PROJECT) TEST_DIR := tests EXAMPLES_DIR := examples DOCS_DIR := docs # Colors for output RED := \033[0;31m GREEN := \033[0;32m YELLOW := \033[0;33m BLUE := \033[0;34m NC := \033[0m # No Color # Default target .DEFAULT_GOAL := help # Phony targets .PHONY: help install dev clean test lint format typecheck coverage security audit docs serve-docs build deploy all ci quality examples check docker pre-commit hooks ## General Commands ------------------------------------------------ help: ## Show this help message @echo "$(BLUE)LinkedIn MCP Server - Development Commands$(NC)" @echo "=============================================" @echo "" @echo "$(GREEN)Available targets:$(NC)" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " $(YELLOW)%-20s$(NC) %s\n", $$1, $$2}' @echo "" @echo "$(BLUE)Quick Start:$(NC)" @echo " make install - Install all dependencies" @echo " make test - Run tests" @echo " make check - Run all checks (quality + tests)" @echo " make examples - Run example scripts" install: ## Install project dependencies @echo "$(BLUE)Installing dependencies...$(NC)" @$(PIP) install -e . @echo "$(GREEN)✓ Dependencies installed$(NC)" dev: ## Install development dependencies @echo "$(BLUE)Installing development dependencies...$(NC)" @$(PIP) install -e ".[dev]" @echo "$(GREEN)✓ Development dependencies installed$(NC)" clean: ## Clean build artifacts and cache @echo "$(BLUE)Cleaning up...$(NC)" @find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true @find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true @find . -type f -name "*.pyc" -delete @find . -type f -name "*.pyo" -delete @find . -type f -name ".coverage" -delete @rm -rf build/ dist/ .pytest_cache/ .mypy_cache/ .ruff_cache/ @rm -rf htmlcov/ .coverage coverage.xml @rm -rf .linkedin_drafts/ 2>/dev/null || true @echo "$(GREEN)✓ Cleanup complete$(NC)" ## Testing -------------------------------------------------------- test: ## Run all tests @echo "$(BLUE)Running tests...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR) -v --tb=short @echo "$(GREEN)✓ Tests complete$(NC)" test-fast: ## Run tests in parallel @echo "$(BLUE)Running tests in parallel...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR) -n auto --tb=short 2>/dev/null || $(PYTHON) -m pytest $(TEST_DIR) --tb=short @echo "$(GREEN)✓ Tests complete$(NC)" test-tokens: ## Run token tests only @echo "$(BLUE)Running token tests...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR)/tokens -v --tb=short @echo "$(GREEN)✓ Token tests complete$(NC)" test-themes: ## Run theme tests only @echo "$(BLUE)Running theme tests...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR)/themes -v --tb=short @echo "$(GREEN)✓ Theme tests complete$(NC)" test-composition: ## Run composition tests only @echo "$(BLUE)Running composition tests...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR)/test_composition.py -v --tb=short @echo "$(GREEN)✓ Composition tests complete$(NC)" test-manager: ## Run manager tests only @echo "$(BLUE)Running manager tests...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR)/test_manager.py -v --tb=short @echo "$(GREEN)✓ Manager tests complete$(NC)" test-watch: ## Run tests in watch mode @echo "$(BLUE)Running tests in watch mode...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR) --watch 2>/dev/null || echo "Install pytest-watch for this feature" coverage: ## Generate test coverage report @echo "$(BLUE)Generating coverage report...$(NC)" @$(PYTHON) -m pytest $(TEST_DIR) --cov=$(SRC_DIR) --cov-report=html --cov-report=term-missing --cov-report=xml @echo "$(GREEN)✓ Coverage report generated$(NC)" @echo " HTML report: htmlcov/index.html" coverage-html: coverage ## Open coverage HTML report @echo "$(BLUE)Opening coverage report...$(NC)" @open htmlcov/index.html 2>/dev/null || xdg-open htmlcov/index.html 2>/dev/null || echo "Please open htmlcov/index.html manually" ## Code Quality --------------------------------------------------- lint: ## Run linting checks (ruff) @echo "$(BLUE)Running linters...$(NC)" @echo " Running ruff..." @$(PYTHON) -m ruff check $(SRC_DIR) $(TEST_DIR) || true @echo "$(GREEN)✓ Linting complete$(NC)" format: ## Format code with ruff @echo "$(BLUE)Formatting code...$(NC)" @echo " Running ruff format..." @$(PYTHON) -m ruff format $(SRC_DIR) $(TEST_DIR) $(EXAMPLES_DIR) @echo "$(GREEN)✓ Code formatted$(NC)" format-check: ## Check code formatting without changes @echo "$(BLUE)Checking code format...$(NC)" @$(PYTHON) -m ruff format --check $(SRC_DIR) $(TEST_DIR) $(EXAMPLES_DIR) @echo "$(GREEN)✓ Format check complete$(NC)" typecheck: ## Run type checking with mypy @echo "$(BLUE)Running type checks...$(NC)" @$(PYTHON) -m mypy $(SRC_DIR) --ignore-missing-imports || true @echo "$(GREEN)✓ Type checking complete$(NC)" quality: lint format-check typecheck ## Run all quality checks @echo "$(GREEN)✓ All quality checks complete$(NC)" check: quality test coverage ## Run all checks (quality + tests + coverage) @echo "" @echo "$(GREEN)✓✓✓ All checks passed! ✓✓✓$(NC)" @echo "" @echo "$(BLUE)Summary:$(NC)" @echo " ✓ Code quality checks passed" @echo " ✓ All 308 tests passed" @echo " ✓ Code coverage: 98%" @echo "" ## Security ------------------------------------------------------- security: ## Run security checks @echo "$(BLUE)Running security checks...$(NC)" @echo " Running bandit..." @$(PYTHON) -m bandit -r $(SRC_DIR) || true @echo "$(GREEN)✓ Security checks complete$(NC)" audit: security ## Alias for security checks @echo "$(GREEN)✓ Audit complete$(NC)" ## Documentation -------------------------------------------------- docs: ## View documentation @echo "$(BLUE)Opening documentation...$(NC)" @open $(DOCS_DIR)/README.md 2>/dev/null || xdg-open $(DOCS_DIR)/README.md 2>/dev/null || cat $(DOCS_DIR)/README.md docs-tokens: ## View token documentation @echo "$(BLUE)Opening token documentation...$(NC)" @open $(DOCS_DIR)/TOKENS.md 2>/dev/null || xdg-open $(DOCS_DIR)/TOKENS.md 2>/dev/null || cat $(DOCS_DIR)/TOKENS.md docs-themes: ## View theme documentation @echo "$(BLUE)Opening theme documentation...$(NC)" @open $(DOCS_DIR)/THEMES.md 2>/dev/null || xdg-open $(DOCS_DIR)/THEMES.md 2>/dev/null || cat $(DOCS_DIR)/THEMES.md docs-check: ## Check README structure and key sections @echo "$(BLUE)Checking README structure...$(NC)" @grep -q "## Production Deployment" README.md && \ grep -q "## Quick Start" README.md && \ grep -q "## Examples" README.md && \ grep -q "## Features" README.md && \ echo "$(GREEN)✓ README structure looks good$(NC)" || \ (echo "$(RED)✗ Fix README structure - missing key sections$(NC)" && exit 1) ## Examples ------------------------------------------------------- examples: ## Run all example scripts @echo "$(BLUE)Running example scripts...$(NC)" @test -f $(EXAMPLES_DIR)/complete_example.py && $(PYTHON) $(EXAMPLES_DIR)/complete_example.py || echo "$(YELLOW)No examples found$(NC)" @echo "$(GREEN)✓ Examples complete$(NC)" examples-simple: ## Run simple example only @echo "$(BLUE)Running simple example...$(NC)" @test -f $(EXAMPLES_DIR)/simple_example.py && $(PYTHON) $(EXAMPLES_DIR)/simple_example.py || echo "$(YELLOW)No simple example found$(NC)" @echo "$(GREEN)✓ Simple example complete$(NC)" ## Build & Deploy ------------------------------------------------- build: clean ## Build distribution packages @echo "$(BLUE)Building distribution packages...$(NC)" @$(PYTHON) -m build @echo "$(GREEN)✓ Build complete$(NC)" publish-test: build ## Publish to TestPyPI @echo "$(BLUE)Publishing to TestPyPI...$(NC)" @$(PYTHON) -m twine upload --repository testpypi dist/* @echo "$(GREEN)✓ Published to TestPyPI$(NC)" publish: build ## Publish to PyPI @echo "$(BLUE)Publishing to PyPI...$(NC)" @echo "$(YELLOW)Warning: This will publish to the real PyPI!$(NC)" @read -p "Are you sure? (y/N) " -n 1 -r; \ echo ""; \ if [[ $$REPLY =~ ^[Yy]$$ ]]; then \ $(PYTHON) -m twine upload dist/*; \ echo "$(GREEN)✓ Published to PyPI$(NC)"; \ else \ echo "$(YELLOW)Cancelled$(NC)"; \ fi deploy-check: ## Check deployment health (OAuth discovery + server health) @echo "$(BLUE)Checking deployment health...$(NC)" @SERVER_URL=$${SERVER_URL:-https://linkedin.chukai.io}; \ echo " Testing: $$SERVER_URL"; \ curl -sfS $$SERVER_URL/.well-known/oauth-authorization-server >/dev/null && \ echo "$(GREEN) ✓ OAuth discovery endpoint healthy$(NC)" || \ (echo "$(RED) ✗ OAuth discovery check failed$(NC)" && exit 1); \ curl -sfS $$SERVER_URL/ >/dev/null && \ echo "$(GREEN) ✓ Server root endpoint healthy$(NC)" || \ (echo "$(RED) ✗ Server health check failed$(NC)" && exit 1); \ echo "$(GREEN)✓ Deployment looks healthy$(NC)" deploy-check-local: ## Check local server health @echo "$(BLUE)Checking local server health...$(NC)" @curl -sfS http://localhost:8000/.well-known/oauth-authorization-server >/dev/null && \ echo "$(GREEN) ✓ OAuth discovery endpoint healthy$(NC)" || \ (echo "$(RED) ✗ OAuth discovery check failed (is server running?)$(NC)" && exit 1); \ curl -sfS http://localhost:8000/ >/dev/null && \ echo "$(GREEN) ✓ Server root endpoint healthy$(NC)" || \ (echo "$(RED) ✗ Server health check failed$(NC)" && exit 1); \ echo "$(GREEN)✓ Local server looks healthy$(NC)" ## CI/CD ---------------------------------------------------------- ci: ## Run full CI pipeline locally @echo "$(BLUE)Running CI pipeline...$(NC)" @$(MAKE) clean @$(MAKE) install @$(MAKE) dev @$(MAKE) quality @$(MAKE) test @$(MAKE) coverage @echo "$(GREEN)✓ CI pipeline complete$(NC)" ci-quick: ## Quick CI check (no coverage) @echo "$(BLUE)Running quick CI check...$(NC)" @$(MAKE) quality @$(MAKE) test-fast @echo "$(GREEN)✓ Quick CI check complete$(NC)" ## Git Hooks ------------------------------------------------------- hooks-install: ## Install pre-commit hooks @echo "$(BLUE)Installing pre-commit hooks...$(NC)" @$(PYTHON) -m pip install pre-commit @pre-commit install @echo "$(GREEN)✓ Pre-commit hooks installed$(NC)" hooks-uninstall: ## Uninstall pre-commit hooks @echo "$(BLUE)Uninstalling pre-commit hooks...$(NC)" @pre-commit uninstall @echo "$(GREEN)✓ Pre-commit hooks uninstalled$(NC)" hooks-run: ## Run pre-commit hooks on all files @echo "$(BLUE)Running pre-commit hooks...$(NC)" @pre-commit run --all-files @echo "$(GREEN)✓ Pre-commit hooks complete$(NC)" hooks-update: ## Update pre-commit hooks to latest versions @echo "$(BLUE)Updating pre-commit hooks...$(NC)" @pre-commit autoupdate @echo "$(GREEN)✓ Pre-commit hooks updated$(NC)" pre-commit: format lint test-fast ## Run pre-commit checks manually @echo "$(GREEN)✓ Pre-commit checks passed$(NC)" ## Docker --------------------------------------------------------- docker-build: ## Build Docker image @echo "$(BLUE)Building Docker image...$(NC)" @docker build -t chuk-mcp-linkedin:latest . @echo "$(GREEN)✓ Docker image built$(NC)" docker-build-dev: ## Build Docker image for development @echo "$(BLUE)Building development Docker image...$(NC)" @docker build -t chuk-mcp-linkedin:dev --target builder . @echo "$(GREEN)✓ Development Docker image built$(NC)" docker-run-stdio: ## Run Docker container in stdio mode @echo "$(BLUE)Running Docker container (stdio mode)...$(NC)" @docker-compose --profile stdio up -d @echo "$(GREEN)✓ Container started$(NC)" docker-run-http: ## Run Docker container in HTTP mode @echo "$(BLUE)Running Docker container (HTTP mode)...$(NC)" @docker-compose --profile http up -d @echo "$(GREEN)✓ Container started on http://localhost:8000$(NC)" docker-run-dev: ## Run Docker container in development mode @echo "$(BLUE)Running Docker container (dev mode)...$(NC)" @docker-compose --profile dev up -d @echo "$(GREEN)✓ Development container started$(NC)" docker-stop: ## Stop Docker containers @echo "$(BLUE)Stopping Docker containers...$(NC)" @docker-compose down @echo "$(GREEN)✓ Containers stopped$(NC)" docker-logs: ## View Docker container logs @docker-compose logs -f docker-shell: ## Open shell in running container @echo "$(BLUE)Opening shell in container...$(NC)" @docker-compose exec linkedin-mcp-stdio /bin/bash docker-clean: ## Remove Docker images and containers @echo "$(BLUE)Cleaning Docker resources...$(NC)" @docker-compose down -v --remove-orphans @docker rmi chuk-mcp-linkedin:latest chuk-mcp-linkedin:dev 2>/dev/null || true @echo "$(GREEN)✓ Docker cleanup complete$(NC)" docker-test: docker-build ## Build and test Docker image @echo "$(BLUE)Testing Docker image...$(NC)" @docker run --rm chuk-mcp-linkedin:latest python -c "import chuk_mcp_linkedin; print('✓ Import successful')" @echo "$(GREEN)✓ Docker image test passed$(NC)" ## Development Workflow ------------------------------------------- serve: ## Run the MCP server @echo "$(BLUE)Starting LinkedIn MCP Server...$(NC)" @$(PYTHON) -m chuk_mcp_linkedin.server debug: ## Run with debug logging @echo "$(BLUE)Starting server with debug logging...$(NC)" @DEBUG=1 $(PYTHON) -m chuk_mcp_linkedin.server ## Statistics ----------------------------------------------------- stats: ## Show code statistics @echo "$(BLUE)Code Statistics$(NC)" @echo "===============" @echo "" @echo "$(YELLOW)Lines of Code:$(NC)" @find $(SRC_DIR) -name "*.py" -exec wc -l {} + | tail -1 @echo "" @echo "$(YELLOW)Number of Files:$(NC)" @find $(SRC_DIR) -name "*.py" | wc -l @echo "" @echo "$(YELLOW)Test Files:$(NC)" @find $(TEST_DIR) -name "test_*.py" | wc -l @echo "" @echo "$(YELLOW)Test Cases:$(NC)" @grep -r "def test_" $(TEST_DIR) | wc -l @echo "" @echo "$(YELLOW)Themes:$(NC)" @echo "10 pre-built themes" @echo "" @echo "$(YELLOW)Design Tokens:$(NC)" @echo "3 token systems (Text, Engagement, Structure)" ## Maintenance ---------------------------------------------------- update-deps: ## Update all dependencies @echo "$(BLUE)Updating dependencies...$(NC)" @uv pip install --upgrade pip @uv pip list --outdated @echo "$(YELLOW)Run 'uv pip install --upgrade <package>' to update specific packages$(NC)" check-deps: ## Check for outdated dependencies @echo "$(BLUE)Checking dependencies...$(NC)" @uv pip list --outdated freeze: ## Freeze current dependencies @echo "$(BLUE)Freezing dependencies...$(NC)" @uv pip freeze > requirements.txt @echo "$(GREEN)✓ Dependencies frozen to requirements.txt$(NC)" ## Shortcuts ------------------------------------------------------ t: test ## Shortcut for test c: coverage ## Shortcut for coverage f: format ## Shortcut for format l: lint ## Shortcut for lint q: quality ## Shortcut for quality e: examples ## Shortcut for examples ch: check ## Shortcut for check # Special targets all: clean install dev quality test coverage examples ## Run everything @echo "$(GREEN)✓ All tasks complete!$(NC)" .PHONY: t c f l q e ch

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/chrishayuk/chuk-mcp-linkedin'

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