klydo-mcp 0.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. klydo_mcp-0.1.3/.env.example +22 -0
  2. klydo_mcp-0.1.3/.env.production.example +69 -0
  3. klydo_mcp-0.1.3/.github/workflows/ci.yml +97 -0
  4. klydo_mcp-0.1.3/.github/workflows/publish.yaml +95 -0
  5. klydo_mcp-0.1.3/.gitignore +37 -0
  6. klydo_mcp-0.1.3/.pre-commit-config.yaml +65 -0
  7. klydo_mcp-0.1.3/.pypirc.example +29 -0
  8. klydo_mcp-0.1.3/.python-version +1 -0
  9. klydo_mcp-0.1.3/CHANGELOG.md +54 -0
  10. klydo_mcp-0.1.3/CONTRIBUTING.md +204 -0
  11. klydo_mcp-0.1.3/LICENSE +21 -0
  12. klydo_mcp-0.1.3/MANIFEST.in +25 -0
  13. klydo_mcp-0.1.3/Makefile +114 -0
  14. klydo_mcp-0.1.3/PKG-INFO +262 -0
  15. klydo_mcp-0.1.3/PUBLISHING.md +492 -0
  16. klydo_mcp-0.1.3/QUICK_START_GUIDE.md +215 -0
  17. klydo_mcp-0.1.3/README.md +230 -0
  18. klydo_mcp-0.1.3/SECURITY.md +137 -0
  19. klydo_mcp-0.1.3/main.py +6 -0
  20. klydo_mcp-0.1.3/notebooks/klydo_scraper_debug.ipynb +269 -0
  21. klydo_mcp-0.1.3/pyproject.toml +67 -0
  22. klydo_mcp-0.1.3/scripts/publish.sh +113 -0
  23. klydo_mcp-0.1.3/scripts/test_real_api.py +92 -0
  24. klydo_mcp-0.1.3/src/klydo/__init__.py +8 -0
  25. klydo_mcp-0.1.3/src/klydo/config.py +47 -0
  26. klydo_mcp-0.1.3/src/klydo/logging.py +141 -0
  27. klydo_mcp-0.1.3/src/klydo/models/__init__.py +19 -0
  28. klydo_mcp-0.1.3/src/klydo/models/product.py +107 -0
  29. klydo_mcp-0.1.3/src/klydo/scrapers/__init__.py +73 -0
  30. klydo_mcp-0.1.3/src/klydo/scrapers/base.py +107 -0
  31. klydo_mcp-0.1.3/src/klydo/scrapers/cache.py +198 -0
  32. klydo_mcp-0.1.3/src/klydo/scrapers/klydo_store.py +480 -0
  33. klydo_mcp-0.1.3/src/klydo/scrapers/myntra.py +759 -0
  34. klydo_mcp-0.1.3/src/klydo/server.py +219 -0
  35. klydo_mcp-0.1.3/tests/__init__.py +5 -0
  36. klydo_mcp-0.1.3/tests/conftest.py +158 -0
  37. klydo_mcp-0.1.3/tests/test_models.py +235 -0
  38. klydo_mcp-0.1.3/tests/test_scrapers.py +203 -0
  39. klydo_mcp-0.1.3/uv.lock +1763 -0
@@ -0,0 +1,22 @@
1
+ # Klydo MCP Server Configuration
2
+ # Copy this file to .env and customize as needed
3
+
4
+ # Default scraper to use
5
+ KLYDO_DEFAULT_SCRAPER=klydo
6
+
7
+ # Request timeout in seconds
8
+ KLYDO_REQUEST_TIMEOUT=30
9
+
10
+ # Cache TTL in seconds (how long to cache scraped data)
11
+ KLYDO_CACHE_TTL=3600
12
+
13
+ # Rate limiting (requests per minute to be nice to servers)
14
+ KLYDO_REQUESTS_PER_MINUTE=30
15
+
16
+ # Klydo brand API auth (used by the klydo.in scraper)
17
+ # Leave blank to fall back to the baked-in public token, or override with your own.
18
+ # KLYDO_KLYDO_API_TOKEN=
19
+ # KLYDO_KLYDO_SESSION_ID=
20
+
21
+ # Debug mode (set to true for verbose logging)
22
+ KLYDO_DEBUG=false
@@ -0,0 +1,69 @@
1
+ # Klydo MCP Server - Production Configuration
2
+ # ============================================
3
+ # Copy this file to .env and configure for your production environment.
4
+ #
5
+ # SECURITY WARNING: Never commit .env files with real credentials to version control!
6
+
7
+ # =============================================================================
8
+ # SCRAPER SETTINGS
9
+ # =============================================================================
10
+
11
+ # Default scraper to use: "klydo" (Klydo Store) or "myntra"
12
+ KLYDO_DEFAULT_SCRAPER=klydo
13
+
14
+ # Request timeout in seconds
15
+ KLYDO_REQUEST_TIMEOUT=30
16
+
17
+ # Cache TTL in seconds (how long to cache scraped data)
18
+ # Recommended: 3600 (1 hour) for production to reduce API load
19
+ KLYDO_CACHE_TTL=3600
20
+
21
+ # Rate limiting (requests per minute to be nice to servers)
22
+ KLYDO_REQUESTS_PER_MINUTE=30
23
+
24
+ # =============================================================================
25
+ # KLYDO API AUTHENTICATION
26
+ # =============================================================================
27
+ #
28
+ # IMPORTANT: The Klydo store scraper requires an API token to function.
29
+ # This token must be obtained from the Klydo API team.
30
+ #
31
+ # For production deployments:
32
+ # 1. Request an API token from the Klydo team
33
+ # 2. Set it below (never commit the actual token!)
34
+ # 3. Consider using a secrets manager (AWS Secrets Manager, HashiCorp Vault, etc.)
35
+
36
+ # API token for klydo.in scraper (REQUIRED for Klydo scraper)
37
+ KLYDO_KLYDO_API_TOKEN=
38
+
39
+ # Optional: Custom session ID (auto-generated if not set)
40
+ # KLYDO_KLYDO_SESSION_ID=
41
+
42
+ # =============================================================================
43
+ # DEBUG & LOGGING
44
+ # =============================================================================
45
+
46
+ # Debug mode - set to false in production!
47
+ # When true: Enables verbose logging, full stack traces
48
+ # When false: Only INFO level logs, cleaner output
49
+ KLYDO_DEBUG=false
50
+
51
+ # =============================================================================
52
+ # DEPLOYMENT NOTES
53
+ # =============================================================================
54
+ #
55
+ # For containerized deployments (Docker/Kubernetes):
56
+ # - Pass environment variables directly rather than using .env files
57
+ # - Use secrets management for sensitive values like KLYDO_KLYDO_API_TOKEN
58
+ #
59
+ # Example Docker run:
60
+ # docker run -e KLYDO_KLYDO_API_TOKEN=your-token klydo-mcp-server
61
+ #
62
+ # Example Kubernetes secret:
63
+ # kubectl create secret generic klydo-secrets \
64
+ # --from-literal=KLYDO_KLYDO_API_TOKEN=your-token
65
+ #
66
+ # For Claude Desktop (local usage):
67
+ # - Copy this file to .env in the project root
68
+ # - Fill in your API token
69
+ # - The MCP server will automatically load the .env file
@@ -0,0 +1,97 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ name: Test Python ${{ matrix.python-version }}
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.11", "3.12", "3.13"]
17
+
18
+ steps:
19
+ - name: Checkout code
20
+ uses: actions/checkout@v4
21
+
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v4
24
+ with:
25
+ version: "latest"
26
+
27
+ - name: Set up Python ${{ matrix.python-version }}
28
+ run: uv python install ${{ matrix.python-version }}
29
+
30
+ - name: Install dependencies
31
+ run: uv sync
32
+
33
+ - name: Install test dependencies
34
+ run: uv pip install pytest pytest-asyncio
35
+
36
+ - name: Run tests
37
+ run: uv run pytest -v --tb=short
38
+
39
+ lint:
40
+ name: Lint
41
+ runs-on: ubuntu-latest
42
+
43
+ steps:
44
+ - name: Checkout code
45
+ uses: actions/checkout@v4
46
+
47
+ - name: Install uv
48
+ uses: astral-sh/setup-uv@v4
49
+ with:
50
+ version: "latest"
51
+
52
+ - name: Set up Python
53
+ run: uv python install 3.12
54
+
55
+ - name: Install dependencies
56
+ run: uv sync
57
+
58
+ - name: Install Ruff
59
+ run: uv pip install ruff
60
+
61
+ - name: Run Ruff linter
62
+ run: uv run ruff check src/
63
+
64
+ - name: Run Ruff formatter check
65
+ run: uv run ruff format --check src/
66
+
67
+ build:
68
+ name: Build Package
69
+ runs-on: ubuntu-latest
70
+ needs: [test, lint]
71
+
72
+ steps:
73
+ - name: Checkout code
74
+ uses: actions/checkout@v4
75
+
76
+ - name: Install uv
77
+ uses: astral-sh/setup-uv@v4
78
+ with:
79
+ version: "latest"
80
+
81
+ - name: Set up Python
82
+ run: uv python install 3.12
83
+
84
+ - name: Install dependencies
85
+ run: uv sync
86
+
87
+ - name: Install build
88
+ run: uv pip install build
89
+
90
+ - name: Build package
91
+ run: uv run python -m build
92
+
93
+ - name: Upload build artifacts
94
+ uses: actions/upload-artifact@v4
95
+ with:
96
+ name: dist
97
+ path: dist/
@@ -0,0 +1,95 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+ inputs:
8
+ target:
9
+ description: "Target PyPI (testpypi or pypi)"
10
+ required: true
11
+ default: "testpypi"
12
+ type: choice
13
+ options:
14
+ - testpypi
15
+ - pypi
16
+
17
+ jobs:
18
+ build:
19
+ name: Build Package
20
+ runs-on: ubuntu-latest
21
+
22
+ steps:
23
+ - name: Checkout code
24
+ uses: actions/checkout@v4
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@v4
28
+ with:
29
+ version: "latest"
30
+
31
+ - name: Set up Python
32
+ run: uv python install 3.12
33
+
34
+ - name: Install dependencies
35
+ run: uv sync
36
+
37
+ - name: Install build
38
+ run: uv pip install build
39
+
40
+ - name: Build package
41
+ run: uv run python -m build
42
+
43
+ - name: Upload build artifacts
44
+ uses: actions/upload-artifact@v4
45
+ with:
46
+ name: dist
47
+ path: dist/
48
+
49
+ publish-testpypi:
50
+ name: Publish to TestPyPI
51
+ runs-on: ubuntu-latest
52
+ needs: [build]
53
+ if: github.event_name == 'workflow_dispatch' && github.event.inputs.target == 'testpypi'
54
+
55
+ environment:
56
+ name: testpypi
57
+ url: https://test.pypi.org/p/klydo-mcp
58
+
59
+ permissions:
60
+ id-token: write
61
+
62
+ steps:
63
+ - name: Download build artifacts
64
+ uses: actions/download-artifact@v4
65
+ with:
66
+ name: dist
67
+ path: dist/
68
+
69
+ - name: Publish to TestPyPI
70
+ uses: pypa/gh-action-pypi-publish@release/v1
71
+ with:
72
+ repository-url: https://test.pypi.org/legacy/
73
+
74
+ publish-pypi:
75
+ name: Publish to PyPI
76
+ runs-on: ubuntu-latest
77
+ needs: [build]
78
+ if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.target == 'pypi')
79
+
80
+ environment:
81
+ name: pypi
82
+ url: https://pypi.org/p/klydo-mcp
83
+
84
+ permissions:
85
+ id-token: write
86
+
87
+ steps:
88
+ - name: Download build artifacts
89
+ uses: actions/download-artifact@v4
90
+ with:
91
+ name: dist
92
+ path: dist/
93
+
94
+ - name: Publish to PyPI
95
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,37 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+ *.egg
9
+
10
+ # Virtual environments
11
+ .venv
12
+ venv/
13
+ env/
14
+
15
+ # Environment variables
16
+ .env
17
+
18
+ # PyPI publishing
19
+ .pypirc
20
+ *.tar.gz
21
+ *.whl
22
+
23
+ # IDE
24
+ .vscode/
25
+ .idea/
26
+ *.swp
27
+ *.swo
28
+ *~
29
+
30
+ # OS
31
+ .DS_Store
32
+ Thumbs.db
33
+
34
+ # Test coverage
35
+ .coverage
36
+ htmlcov/
37
+ .pytest_cache/
@@ -0,0 +1,65 @@
1
+ # Pre-commit hooks for Klydo MCP Server
2
+ # Install with: pre-commit install
3
+ # Run manually: pre-commit run --all-files
4
+
5
+ repos:
6
+ # Ruff - Fast Python linter and formatter
7
+ - repo: https://github.com/astral-sh/ruff-pre-commit
8
+ rev: v0.8.0
9
+ hooks:
10
+ # Run the linter
11
+ - id: ruff
12
+ args: [--fix]
13
+ # Run the formatter
14
+ - id: ruff-format
15
+
16
+ # General file checks
17
+ - repo: https://github.com/pre-commit/pre-commit-hooks
18
+ rev: v5.0.0
19
+ hooks:
20
+ # Trim trailing whitespace
21
+ - id: trailing-whitespace
22
+ # Ensure files end with a newline
23
+ - id: end-of-file-fixer
24
+ # Check YAML syntax
25
+ - id: check-yaml
26
+ # Check TOML syntax
27
+ - id: check-toml
28
+ # Check JSON syntax
29
+ - id: check-json
30
+ # Check for merge conflict markers
31
+ - id: check-merge-conflict
32
+ # Check for debug statements
33
+ - id: debug-statements
34
+ # Prevent large files from being committed
35
+ - id: check-added-large-files
36
+ args: ['--maxkb=500']
37
+ # Check for private keys
38
+ - id: detect-private-key
39
+
40
+ # Security checks
41
+ - repo: https://github.com/Yelp/detect-secrets
42
+ rev: v1.5.0
43
+ hooks:
44
+ - id: detect-secrets
45
+ args: ['--baseline', '.secrets.baseline']
46
+ exclude: package.lock.json
47
+
48
+ # Type checking (optional - can be slow)
49
+ # - repo: https://github.com/pre-commit/mirrors-mypy
50
+ # rev: v1.13.0
51
+ # hooks:
52
+ # - id: mypy
53
+ # additional_dependencies: [pydantic, httpx]
54
+ # args: [--ignore-missing-imports]
55
+
56
+ # CI configuration
57
+ ci:
58
+ autofix_commit_msg: |
59
+ [pre-commit.ci] auto fixes from pre-commit hooks
60
+ autofix_prs: true
61
+ autoupdate_branch: 'main'
62
+ autoupdate_commit_msg: '[pre-commit.ci] pre-commit autoupdate'
63
+ autoupdate_schedule: weekly
64
+ skip: [detect-secrets]
65
+ submodules: false
@@ -0,0 +1,29 @@
1
+ # PyPI Configuration Template
2
+ # Copy this file to ~/.pypirc and update with your tokens
3
+ #
4
+ # SECURITY WARNING: Never commit your actual ~/.pypirc file to git!
5
+ # This is just a template showing the structure.
6
+
7
+ [distutils]
8
+ index-servers =
9
+ pypi
10
+ testpypi
11
+
12
+ [pypi]
13
+ username = __token__
14
+ password = pypi-YOUR_PYPI_API_TOKEN_HERE
15
+
16
+ [testpypi]
17
+ repository = https://test.pypi.org/legacy/
18
+ username = __token__
19
+ password = pypi-YOUR_TESTPYPI_API_TOKEN_HERE
20
+
21
+ # How to use:
22
+ # 1. Copy this file to ~/.pypirc
23
+ # 2. Replace YOUR_PYPI_API_TOKEN_HERE with your actual PyPI token
24
+ # 3. Replace YOUR_TESTPYPI_API_TOKEN_HERE with your TestPyPI token (optional)
25
+ # 4. Set proper permissions: chmod 600 ~/.pypirc
26
+ #
27
+ # Get tokens from:
28
+ # - PyPI: https://pypi.org/manage/account/token/
29
+ # - TestPyPI: https://test.pypi.org/manage/account/token/
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,54 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+ - Structured logging with Loguru for better debugging and monitoring
12
+ - Production-ready environment configuration (`.env.production.example`)
13
+ - Comprehensive test suite with pytest
14
+ - GitHub Actions CI/CD pipeline for testing and publishing
15
+ - CHANGELOG.md for tracking changes
16
+ - CONTRIBUTING.md with contribution guidelines
17
+ - SECURITY.md with security policy
18
+
19
+ ### Changed
20
+ - Removed hardcoded DEFAULT_AUTH_TOKEN for better security
21
+ - Updated project URLs to point to official GitHub repository
22
+ - Updated author information in pyproject.toml
23
+
24
+ ### Security
25
+ - API tokens must now be provided via environment variables only
26
+ - No hardcoded secrets in codebase
27
+
28
+ ## [0.1.0] - 2026-06-02
29
+
30
+ ### Added
31
+ - Initial release of Klydo MCP Server
32
+ - MCP server implementation using FastMCP
33
+ - Klydo.in catalog API integration
34
+ - Product search with filters (category, gender, price range)
35
+ - Product details retrieval with images and specifications
36
+ - Trending products discovery
37
+ - In-memory caching for API responses
38
+ - Pydantic models for type-safe data handling
39
+ - Configuration via environment variables
40
+ - Claude Desktop integration support
41
+
42
+ ### Features
43
+ - `search_products` - Search for fashion products with various filters
44
+ - `get_product_details` - Get complete product information
45
+ - `get_trending` - Get trending/popular products
46
+
47
+ ### Technical
48
+ - Python 3.11+ support
49
+ - Async HTTP client with httpx
50
+ - pydantic-settings for configuration management
51
+ - Installable via pip/uv from PyPI
52
+
53
+ [Unreleased]: https://github.com/myselfshravan/klydo-mcp/compare/v0.1.0...HEAD
54
+ [0.1.0]: https://github.com/myselfshravan/klydo-mcp/releases/tag/v0.1.0
@@ -0,0 +1,204 @@
1
+ # Contributing to Klydo MCP Server
2
+
3
+ First off, thank you for considering contributing to Klydo MCP Server! 🎉
4
+
5
+ This project is part of [Klydo](https://klydo.in), a Gen-Z quick tech fashion commerce startup based in Bangalore. We welcome contributions from the community to make this project even better.
6
+
7
+ ## Table of Contents
8
+
9
+ - [Code of Conduct](#code-of-conduct)
10
+ - [Getting Started](#getting-started)
11
+ - [Development Setup](#development-setup)
12
+ - [How to Contribute](#how-to-contribute)
13
+ - [Pull Request Process](#pull-request-process)
14
+ - [Coding Standards](#coding-standards)
15
+ - [Testing](#testing)
16
+
17
+ ## Code of Conduct
18
+
19
+ By participating in this project, you agree to maintain a respectful and inclusive environment. We expect all contributors to:
20
+
21
+ - Be respectful and considerate in all interactions
22
+ - Welcome newcomers and help them learn
23
+ - Focus on what is best for the community
24
+ - Show empathy towards other community members
25
+
26
+ ## Getting Started
27
+
28
+ 1. **Fork the repository** on GitHub
29
+ 2. **Clone your fork** locally:
30
+ ```bash
31
+ git clone https://github.com/YOUR-USERNAME/klydo-mcp.git
32
+ cd klydo-mcp
33
+ ```
34
+ 3. **Add the upstream remote**:
35
+ ```bash
36
+ git remote add upstream https://github.com/myselfshravan/klydo-mcp.git
37
+ ```
38
+
39
+ ## Development Setup
40
+
41
+ ### Prerequisites
42
+
43
+ - Python 3.11 or higher
44
+ - [uv](https://docs.astral.sh/uv/) (recommended) or pip
45
+
46
+ ### Setup with uv (Recommended)
47
+
48
+ ```bash
49
+ # Install dependencies
50
+ uv sync --dev
51
+
52
+ # Run the server locally
53
+ uv run klydo
54
+
55
+ # Run tests
56
+ uv run pytest
57
+ ```
58
+
59
+ ### Setup with pip
60
+
61
+ ```bash
62
+ # Create virtual environment
63
+ python -m venv .venv
64
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
65
+
66
+ # Install in development mode
67
+ pip install -e ".[dev]"
68
+
69
+ # Run tests
70
+ pytest
71
+ ```
72
+
73
+ ### Environment Configuration
74
+
75
+ 1. Copy the example environment file:
76
+ ```bash
77
+ cp .env.example .env
78
+ ```
79
+ 2. Edit `.env` and configure as needed (API tokens, etc.)
80
+
81
+ ## How to Contribute
82
+
83
+ ### Reporting Bugs
84
+
85
+ - Check if the bug has already been reported in [Issues](https://github.com/myselfshravan/klydo-mcp/issues)
86
+ - If not, create a new issue with:
87
+ - Clear, descriptive title
88
+ - Steps to reproduce
89
+ - Expected vs actual behavior
90
+ - Python version and OS
91
+ - Relevant logs/error messages
92
+
93
+ ### Suggesting Features
94
+
95
+ - Open an issue with the `enhancement` label
96
+ - Describe the feature and its use case
97
+ - Explain why it would benefit users
98
+
99
+ ### Contributing Code
100
+
101
+ 1. **Find an issue** to work on or create one first
102
+ 2. **Comment on the issue** to let others know you're working on it
103
+ 3. **Create a branch** from `main`:
104
+ ```bash
105
+ git checkout -b feature/your-feature-name
106
+ ```
107
+ 4. **Make your changes** following our coding standards
108
+ 5. **Write/update tests** for your changes
109
+ 6. **Run the test suite** to ensure everything passes
110
+ 7. **Commit your changes** with clear messages
111
+ 8. **Push to your fork** and create a Pull Request
112
+
113
+ ## Pull Request Process
114
+
115
+ 1. **Update documentation** if you've changed APIs or added features
116
+ 2. **Add tests** for new functionality
117
+ 3. **Ensure CI passes** - all tests and linting must pass
118
+ 4. **Request review** from maintainers
119
+ 5. **Address feedback** promptly and constructively
120
+
121
+ ### PR Title Format
122
+
123
+ Use clear, descriptive titles:
124
+ - `feat: Add new search filter for colors`
125
+ - `fix: Handle empty API response gracefully`
126
+ - `docs: Update installation instructions`
127
+ - `test: Add tests for scraper cache`
128
+ - `refactor: Simplify product parsing logic`
129
+
130
+ ## Coding Standards
131
+
132
+ ### Python Style
133
+
134
+ - Follow [PEP 8](https://pep8.org/) style guide
135
+ - Use type hints for all public functions
136
+ - Maximum line length: 100 characters
137
+ - Use descriptive variable and function names
138
+
139
+ ### Code Quality Tools
140
+
141
+ ```bash
142
+ # Format code with Ruff
143
+ uv run ruff format src/
144
+
145
+ # Lint code with Ruff
146
+ uv run ruff check src/
147
+
148
+ # Type checking (optional)
149
+ uv run mypy src/klydo
150
+ ```
151
+
152
+ ### Commit Messages
153
+
154
+ - Use the present tense ("Add feature" not "Added feature")
155
+ - Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
156
+ - Keep the first line under 72 characters
157
+ - Reference issues when relevant: "Fix #123"
158
+
159
+ ### Documentation
160
+
161
+ - Add docstrings to all public modules, classes, and functions
162
+ - Use Google-style docstrings
163
+ - Update README if adding new features
164
+ - Update CHANGELOG for notable changes
165
+
166
+ ## Testing
167
+
168
+ ### Running Tests
169
+
170
+ ```bash
171
+ # Run all tests
172
+ uv run pytest
173
+
174
+ # Run with verbose output
175
+ uv run pytest -v
176
+
177
+ # Run specific test file
178
+ uv run pytest tests/test_models.py
179
+
180
+ # Run with coverage
181
+ uv run pytest --cov=klydo
182
+ ```
183
+
184
+ ### Writing Tests
185
+
186
+ - Place tests in the `tests/` directory
187
+ - Name test files `test_*.py`
188
+ - Use descriptive test function names
189
+ - Use fixtures for common test data
190
+ - Mock external API calls
191
+
192
+ ### Test Categories
193
+
194
+ - **Unit tests**: Test individual functions/methods
195
+ - **Integration tests**: Test component interactions
196
+ - **Scraper tests**: Test with mocked HTTP responses
197
+
198
+ ## Need Help?
199
+
200
+ - Create an issue with your question
201
+ - Check existing issues and discussions
202
+ - Review the documentation
203
+
204
+ Thank you for contributing! 🚀
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Klydo MCP Server Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.