mcp-security-framework 0.1.0__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.
- mcp_security_framework-0.1.0/PKG-INFO +411 -0
- mcp_security_framework-0.1.0/README.md +349 -0
- mcp_security_framework-0.1.0/mcp_security_framework/__init__.py +96 -0
- mcp_security_framework-0.1.0/mcp_security_framework/cli/__init__.py +18 -0
- mcp_security_framework-0.1.0/mcp_security_framework/cli/cert_cli.py +511 -0
- mcp_security_framework-0.1.0/mcp_security_framework/cli/security_cli.py +791 -0
- mcp_security_framework-0.1.0/mcp_security_framework/constants.py +209 -0
- mcp_security_framework-0.1.0/mcp_security_framework/core/__init__.py +61 -0
- mcp_security_framework-0.1.0/mcp_security_framework/core/auth_manager.py +1011 -0
- mcp_security_framework-0.1.0/mcp_security_framework/core/cert_manager.py +1663 -0
- mcp_security_framework-0.1.0/mcp_security_framework/core/permission_manager.py +735 -0
- mcp_security_framework-0.1.0/mcp_security_framework/core/rate_limiter.py +602 -0
- mcp_security_framework-0.1.0/mcp_security_framework/core/security_manager.py +943 -0
- mcp_security_framework-0.1.0/mcp_security_framework/core/ssl_manager.py +735 -0
- mcp_security_framework-0.1.0/mcp_security_framework/examples/__init__.py +75 -0
- mcp_security_framework-0.1.0/mcp_security_framework/examples/django_example.py +615 -0
- mcp_security_framework-0.1.0/mcp_security_framework/examples/fastapi_example.py +472 -0
- mcp_security_framework-0.1.0/mcp_security_framework/examples/flask_example.py +506 -0
- mcp_security_framework-0.1.0/mcp_security_framework/examples/gateway_example.py +803 -0
- mcp_security_framework-0.1.0/mcp_security_framework/examples/microservice_example.py +690 -0
- mcp_security_framework-0.1.0/mcp_security_framework/examples/standalone_example.py +576 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/__init__.py +250 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/auth_middleware.py +292 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/fastapi_auth_middleware.py +447 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/fastapi_middleware.py +757 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/flask_auth_middleware.py +465 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/flask_middleware.py +591 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/mtls_middleware.py +439 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/rate_limit_middleware.py +403 -0
- mcp_security_framework-0.1.0/mcp_security_framework/middleware/security_middleware.py +507 -0
- mcp_security_framework-0.1.0/mcp_security_framework/schemas/__init__.py +109 -0
- mcp_security_framework-0.1.0/mcp_security_framework/schemas/config.py +694 -0
- mcp_security_framework-0.1.0/mcp_security_framework/schemas/models.py +709 -0
- mcp_security_framework-0.1.0/mcp_security_framework/schemas/responses.py +686 -0
- mcp_security_framework-0.1.0/mcp_security_framework/tests/__init__.py +0 -0
- mcp_security_framework-0.1.0/mcp_security_framework/utils/__init__.py +121 -0
- mcp_security_framework-0.1.0/mcp_security_framework/utils/cert_utils.py +525 -0
- mcp_security_framework-0.1.0/mcp_security_framework/utils/crypto_utils.py +475 -0
- mcp_security_framework-0.1.0/mcp_security_framework/utils/validation_utils.py +571 -0
- mcp_security_framework-0.1.0/mcp_security_framework.egg-info/PKG-INFO +411 -0
- mcp_security_framework-0.1.0/mcp_security_framework.egg-info/SOURCES.txt +79 -0
- mcp_security_framework-0.1.0/mcp_security_framework.egg-info/dependency_links.txt +1 -0
- mcp_security_framework-0.1.0/mcp_security_framework.egg-info/entry_points.txt +3 -0
- mcp_security_framework-0.1.0/mcp_security_framework.egg-info/requires.txt +39 -0
- mcp_security_framework-0.1.0/mcp_security_framework.egg-info/top_level.txt +8 -0
- mcp_security_framework-0.1.0/pyproject.toml +214 -0
- mcp_security_framework-0.1.0/setup.cfg +4 -0
- mcp_security_framework-0.1.0/tests/__init__.py +0 -0
- mcp_security_framework-0.1.0/tests/test_cli/__init__.py +0 -0
- mcp_security_framework-0.1.0/tests/test_cli/test_cert_cli.py +379 -0
- mcp_security_framework-0.1.0/tests/test_cli/test_security_cli.py +657 -0
- mcp_security_framework-0.1.0/tests/test_core/__init__.py +0 -0
- mcp_security_framework-0.1.0/tests/test_core/test_auth_manager.py +582 -0
- mcp_security_framework-0.1.0/tests/test_core/test_cert_manager.py +795 -0
- mcp_security_framework-0.1.0/tests/test_core/test_permission_manager.py +395 -0
- mcp_security_framework-0.1.0/tests/test_core/test_rate_limiter.py +626 -0
- mcp_security_framework-0.1.0/tests/test_core/test_security_manager.py +841 -0
- mcp_security_framework-0.1.0/tests/test_core/test_ssl_manager.py +532 -0
- mcp_security_framework-0.1.0/tests/test_examples/__init__.py +8 -0
- mcp_security_framework-0.1.0/tests/test_examples/test_fastapi_example.py +264 -0
- mcp_security_framework-0.1.0/tests/test_examples/test_flask_example.py +238 -0
- mcp_security_framework-0.1.0/tests/test_examples/test_standalone_example.py +292 -0
- mcp_security_framework-0.1.0/tests/test_integration/__init__.py +0 -0
- mcp_security_framework-0.1.0/tests/test_integration/test_auth_flow.py +502 -0
- mcp_security_framework-0.1.0/tests/test_integration/test_certificate_flow.py +527 -0
- mcp_security_framework-0.1.0/tests/test_integration/test_fastapi_integration.py +341 -0
- mcp_security_framework-0.1.0/tests/test_integration/test_flask_integration.py +398 -0
- mcp_security_framework-0.1.0/tests/test_integration/test_standalone_integration.py +493 -0
- mcp_security_framework-0.1.0/tests/test_middleware/__init__.py +0 -0
- mcp_security_framework-0.1.0/tests/test_middleware/test_fastapi_middleware.py +523 -0
- mcp_security_framework-0.1.0/tests/test_middleware/test_flask_middleware.py +582 -0
- mcp_security_framework-0.1.0/tests/test_middleware/test_security_middleware.py +493 -0
- mcp_security_framework-0.1.0/tests/test_schemas/__init__.py +0 -0
- mcp_security_framework-0.1.0/tests/test_schemas/test_config.py +811 -0
- mcp_security_framework-0.1.0/tests/test_schemas/test_models.py +879 -0
- mcp_security_framework-0.1.0/tests/test_schemas/test_responses.py +1054 -0
- mcp_security_framework-0.1.0/tests/test_schemas/test_serialization.py +493 -0
- mcp_security_framework-0.1.0/tests/test_utils/__init__.py +0 -0
- mcp_security_framework-0.1.0/tests/test_utils/test_cert_utils.py +510 -0
- mcp_security_framework-0.1.0/tests/test_utils/test_crypto_utils.py +603 -0
- mcp_security_framework-0.1.0/tests/test_utils/test_validation_utils.py +477 -0
@@ -0,0 +1,411 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: mcp-security-framework
|
3
|
+
Version: 0.1.0
|
4
|
+
Summary: Universal security framework for microservices with SSL/TLS, authentication, authorization, and rate limiting
|
5
|
+
Author-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
|
6
|
+
Maintainer-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
|
7
|
+
License: MIT
|
8
|
+
Project-URL: Homepage, https://github.com/maverikod/mcp-security-framework
|
9
|
+
Project-URL: Documentation, https://mcp-security-framework.readthedocs.io/
|
10
|
+
Project-URL: Repository, https://github.com/maverikod/mcp-security-framework
|
11
|
+
Project-URL: Bug Tracker, https://github.com/maverikod/mcp-security-framework/issues
|
12
|
+
Project-URL: Security Policy, https://github.com/maverikod/mcp-security-framework/security/policy
|
13
|
+
Keywords: security,authentication,authorization,ssl,tls,microservices,fastapi,flask
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
15
|
+
Classifier: Intended Audience :: Developers
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
17
|
+
Classifier: Operating System :: OS Independent
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
19
|
+
Classifier: Programming Language :: Python :: 3.8
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
24
|
+
Classifier: Topic :: Security
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
26
|
+
Classifier: Topic :: System :: Systems Administration :: Authentication/Directory
|
27
|
+
Requires-Python: >=3.8
|
28
|
+
Description-Content-Type: text/markdown
|
29
|
+
Requires-Dist: cryptography>=3.4.0
|
30
|
+
Requires-Dist: pydantic<3.0.0,>=1.8.0
|
31
|
+
Requires-Dist: PyJWT>=2.0.0
|
32
|
+
Requires-Dist: click>=8.0.0
|
33
|
+
Requires-Dist: typing-extensions>=4.0.0
|
34
|
+
Provides-Extra: fastapi
|
35
|
+
Requires-Dist: fastapi>=0.68.0; extra == "fastapi"
|
36
|
+
Requires-Dist: uvicorn[standard]>=0.15.0; extra == "fastapi"
|
37
|
+
Provides-Extra: flask
|
38
|
+
Requires-Dist: flask>=2.0.0; extra == "flask"
|
39
|
+
Requires-Dist: werkzeug>=2.0.0; extra == "flask"
|
40
|
+
Provides-Extra: django
|
41
|
+
Requires-Dist: django>=3.2.0; extra == "django"
|
42
|
+
Provides-Extra: dev
|
43
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
44
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
45
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
46
|
+
Requires-Dist: black>=22.0.0; extra == "dev"
|
47
|
+
Requires-Dist: isort>=5.10.0; extra == "dev"
|
48
|
+
Requires-Dist: flake8>=5.0.0; extra == "dev"
|
49
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
50
|
+
Requires-Dist: pre-commit>=2.20.0; extra == "dev"
|
51
|
+
Requires-Dist: tox>=4.0.0; extra == "dev"
|
52
|
+
Provides-Extra: docs
|
53
|
+
Requires-Dist: sphinx>=5.0.0; extra == "docs"
|
54
|
+
Requires-Dist: sphinx-rtd-theme>=1.0.0; extra == "docs"
|
55
|
+
Requires-Dist: myst-parser>=0.18.0; extra == "docs"
|
56
|
+
Provides-Extra: test
|
57
|
+
Requires-Dist: pytest>=7.0.0; extra == "test"
|
58
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "test"
|
59
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
|
60
|
+
Requires-Dist: pytest-mock>=3.8.0; extra == "test"
|
61
|
+
Requires-Dist: httpx>=0.24.0; extra == "test"
|
62
|
+
|
63
|
+
# MCP Security Framework
|
64
|
+
|
65
|
+
[](https://badge.fury.io/py/mcp-security-framework)
|
66
|
+
[](https://www.python.org/downloads/)
|
67
|
+
[](https://opensource.org/licenses/MIT)
|
68
|
+
[](https://github.com/psf/black)
|
69
|
+
[](https://pycqa.github.io/isort/)
|
70
|
+
|
71
|
+
Universal security framework for microservices with SSL/TLS, authentication, authorization, and rate limiting.
|
72
|
+
|
73
|
+
## Features
|
74
|
+
|
75
|
+
- 🔐 **Multi-method Authentication**: API keys, JWT tokens, X.509 certificates
|
76
|
+
- 🛡️ **SSL/TLS Management**: Server and client certificate handling
|
77
|
+
- 🔑 **Role-based Authorization**: Flexible permission system with role hierarchy
|
78
|
+
- ⚡ **Rate Limiting**: Configurable request rate limiting
|
79
|
+
- 🚀 **Framework Agnostic**: Works with FastAPI, Flask, Django, and standalone
|
80
|
+
- 🛠️ **CLI Tools**: Certificate management and security testing
|
81
|
+
- 📊 **Comprehensive Logging**: Security event logging and monitoring
|
82
|
+
|
83
|
+
## Quick Start
|
84
|
+
|
85
|
+
### Installation
|
86
|
+
|
87
|
+
```bash
|
88
|
+
# Basic installation
|
89
|
+
pip install mcp-security-framework
|
90
|
+
|
91
|
+
# With framework support
|
92
|
+
pip install mcp-security-framework[fastapi]
|
93
|
+
pip install mcp-security-framework[flask]
|
94
|
+
pip install mcp-security-framework[django]
|
95
|
+
|
96
|
+
# Development installation
|
97
|
+
pip install mcp-security-framework[dev]
|
98
|
+
```
|
99
|
+
|
100
|
+
### Basic Usage
|
101
|
+
|
102
|
+
```python
|
103
|
+
from mcp_security_framework import SecurityManager, SecurityConfig
|
104
|
+
from mcp_security_framework.schemas.config import AuthConfig, PermissionConfig
|
105
|
+
|
106
|
+
# Create configuration
|
107
|
+
config = SecurityConfig(
|
108
|
+
auth=AuthConfig(
|
109
|
+
enabled=True,
|
110
|
+
methods=["api_key"],
|
111
|
+
api_keys={"admin": "admin_key_123"}
|
112
|
+
),
|
113
|
+
permissions=PermissionConfig(roles_file="roles.json")
|
114
|
+
)
|
115
|
+
|
116
|
+
# Create security manager
|
117
|
+
security_manager = SecurityManager(config)
|
118
|
+
|
119
|
+
# Validate request
|
120
|
+
result = security_manager.validate_request({
|
121
|
+
"api_key": "admin_key_123",
|
122
|
+
"required_permissions": ["read", "write"]
|
123
|
+
})
|
124
|
+
|
125
|
+
if result.is_valid:
|
126
|
+
print("Access granted!")
|
127
|
+
else:
|
128
|
+
print(f"Access denied: {result.error_message}")
|
129
|
+
```
|
130
|
+
|
131
|
+
### FastAPI Integration
|
132
|
+
|
133
|
+
```python
|
134
|
+
from fastapi import FastAPI
|
135
|
+
from mcp_security_framework import create_fastapi_security_middleware, SecurityConfig
|
136
|
+
|
137
|
+
# Configuration
|
138
|
+
config = SecurityConfig(
|
139
|
+
auth=AuthConfig(
|
140
|
+
enabled=True,
|
141
|
+
methods=["api_key", "jwt"],
|
142
|
+
api_keys={"user": "user_key_456"}
|
143
|
+
),
|
144
|
+
permissions=PermissionConfig(roles_file="roles.json")
|
145
|
+
)
|
146
|
+
|
147
|
+
# Create FastAPI app
|
148
|
+
app = FastAPI()
|
149
|
+
|
150
|
+
# Add security middleware
|
151
|
+
security_middleware = create_fastapi_security_middleware(config)
|
152
|
+
app.add_middleware(security_middleware)
|
153
|
+
|
154
|
+
@app.get("/secure")
|
155
|
+
async def secure_endpoint():
|
156
|
+
return {"message": "Access granted"}
|
157
|
+
|
158
|
+
@app.get("/public")
|
159
|
+
async def public_endpoint():
|
160
|
+
return {"message": "Public access"}
|
161
|
+
```
|
162
|
+
|
163
|
+
### Flask Integration
|
164
|
+
|
165
|
+
```python
|
166
|
+
from flask import Flask
|
167
|
+
from mcp_security_framework import create_flask_security_middleware, SecurityConfig
|
168
|
+
|
169
|
+
# Configuration
|
170
|
+
config = SecurityConfig(
|
171
|
+
auth=AuthConfig(
|
172
|
+
enabled=True,
|
173
|
+
methods=["api_key"]
|
174
|
+
),
|
175
|
+
permissions=PermissionConfig(roles_file="roles.json")
|
176
|
+
)
|
177
|
+
|
178
|
+
# Create Flask app
|
179
|
+
app = Flask(__name__)
|
180
|
+
|
181
|
+
# Add security middleware
|
182
|
+
security_middleware = create_flask_security_middleware(config)
|
183
|
+
app.wsgi_app = security_middleware(app.wsgi_app)
|
184
|
+
|
185
|
+
@app.route("/secure")
|
186
|
+
def secure_endpoint():
|
187
|
+
return {"message": "Access granted"}
|
188
|
+
```
|
189
|
+
|
190
|
+
## CLI Tools
|
191
|
+
|
192
|
+
### Certificate Management
|
193
|
+
|
194
|
+
```bash
|
195
|
+
# Create root CA
|
196
|
+
mcp-cert create-ca --ca-name "My Root CA" --output-dir ./certs
|
197
|
+
|
198
|
+
# Create client certificate
|
199
|
+
mcp-cert create-client-cert --name "client1" --roles "user,admin" --permissions "read,write"
|
200
|
+
|
201
|
+
# Create server certificate
|
202
|
+
mcp-cert create-server-cert --name "api-server" --domains "api.example.com"
|
203
|
+
```
|
204
|
+
|
205
|
+
### Security Testing
|
206
|
+
|
207
|
+
```bash
|
208
|
+
# Validate configuration
|
209
|
+
mcp-security validate-config --config-file security_config.json
|
210
|
+
|
211
|
+
# Test authentication
|
212
|
+
mcp-security test-auth --config-file security_config.json --api-key "test_key"
|
213
|
+
```
|
214
|
+
|
215
|
+
## Configuration
|
216
|
+
|
217
|
+
### Basic Configuration File
|
218
|
+
|
219
|
+
```json
|
220
|
+
{
|
221
|
+
"ssl": {
|
222
|
+
"enabled": true,
|
223
|
+
"cert_file": "server.crt",
|
224
|
+
"key_file": "server.key",
|
225
|
+
"ca_cert_file": "ca.crt",
|
226
|
+
"verify_mode": "CERT_REQUIRED",
|
227
|
+
"min_version": "TLSv1.2"
|
228
|
+
},
|
229
|
+
"auth": {
|
230
|
+
"enabled": true,
|
231
|
+
"methods": ["api_key", "jwt", "certificate"],
|
232
|
+
"api_keys": {
|
233
|
+
"admin": "admin_key_123",
|
234
|
+
"user": "user_key_456"
|
235
|
+
},
|
236
|
+
"jwt_secret": "your_jwt_secret_key",
|
237
|
+
"jwt_expiry_hours": 24,
|
238
|
+
"public_paths": ["/docs", "/health"]
|
239
|
+
},
|
240
|
+
"certificates": {
|
241
|
+
"ca_dir": "./certs",
|
242
|
+
"roles_oid": "1.3.6.1.4.1.99999.1.1",
|
243
|
+
"permissions_oid": "1.3.6.1.4.1.99999.1.2",
|
244
|
+
"verify_certificates": true,
|
245
|
+
"check_revocation": true
|
246
|
+
},
|
247
|
+
"permissions": {
|
248
|
+
"roles_file": "roles.json",
|
249
|
+
"deny_by_default": true,
|
250
|
+
"case_sensitive": false,
|
251
|
+
"allow_wildcard": true
|
252
|
+
},
|
253
|
+
"rate_limit": {
|
254
|
+
"enabled": true,
|
255
|
+
"rate_limit": 100,
|
256
|
+
"time_window": 60,
|
257
|
+
"by_ip": true,
|
258
|
+
"by_user": true
|
259
|
+
}
|
260
|
+
}
|
261
|
+
```
|
262
|
+
|
263
|
+
### Roles and Permissions
|
264
|
+
|
265
|
+
```json
|
266
|
+
{
|
267
|
+
"roles": {
|
268
|
+
"admin": {
|
269
|
+
"name": "admin",
|
270
|
+
"description": "Administrator role",
|
271
|
+
"permissions": ["read", "write", "delete", "admin"],
|
272
|
+
"priority": 100
|
273
|
+
},
|
274
|
+
"user": {
|
275
|
+
"name": "user",
|
276
|
+
"description": "Regular user role",
|
277
|
+
"permissions": ["read", "write"],
|
278
|
+
"priority": 50
|
279
|
+
},
|
280
|
+
"guest": {
|
281
|
+
"name": "guest",
|
282
|
+
"description": "Guest role",
|
283
|
+
"permissions": ["read"],
|
284
|
+
"priority": 10
|
285
|
+
}
|
286
|
+
},
|
287
|
+
"role_hierarchy": {
|
288
|
+
"roles": {
|
289
|
+
"admin": ["user"],
|
290
|
+
"user": ["guest"]
|
291
|
+
}
|
292
|
+
},
|
293
|
+
"default_policy": {
|
294
|
+
"deny_by_default": true,
|
295
|
+
"require_role_match": true,
|
296
|
+
"case_sensitive": false,
|
297
|
+
"allow_wildcard": true
|
298
|
+
}
|
299
|
+
}
|
300
|
+
```
|
301
|
+
|
302
|
+
## Documentation
|
303
|
+
|
304
|
+
- [Installation Guide](docs/installation.md)
|
305
|
+
- [Configuration Reference](docs/configuration.md)
|
306
|
+
- [API Reference](docs/api_reference.md)
|
307
|
+
- [Examples](docs/examples/)
|
308
|
+
- [FastAPI Integration](docs/examples/fastapi_integration.md)
|
309
|
+
- [Flask Integration](docs/examples/flask_integration.md)
|
310
|
+
- [Standalone Usage](docs/examples/standalone_usage.md)
|
311
|
+
- [Security Guide](docs/security/)
|
312
|
+
- [SSL/TLS Setup](docs/security/ssl_tls.md)
|
313
|
+
- [Authentication Methods](docs/security/authentication.md)
|
314
|
+
- [Authorization and Roles](docs/security/authorization.md)
|
315
|
+
- [Certificate Management](docs/security/certificates.md)
|
316
|
+
- [Troubleshooting](docs/troubleshooting.md)
|
317
|
+
|
318
|
+
## Development
|
319
|
+
|
320
|
+
### Setup Development Environment
|
321
|
+
|
322
|
+
```bash
|
323
|
+
# Clone repository
|
324
|
+
git clone https://github.com/mcp-security/mcp-security-framework.git
|
325
|
+
cd mcp-security-framework
|
326
|
+
|
327
|
+
# Create virtual environment
|
328
|
+
python -m venv .venv
|
329
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
330
|
+
|
331
|
+
# Install development dependencies
|
332
|
+
pip install -e ".[dev]"
|
333
|
+
|
334
|
+
# Install pre-commit hooks
|
335
|
+
pre-commit install
|
336
|
+
```
|
337
|
+
|
338
|
+
### Running Tests
|
339
|
+
|
340
|
+
```bash
|
341
|
+
# Run all tests
|
342
|
+
pytest
|
343
|
+
|
344
|
+
# Run with coverage
|
345
|
+
pytest --cov=mcp_security_framework --cov-report=html
|
346
|
+
|
347
|
+
# Run specific test categories
|
348
|
+
pytest -m unit
|
349
|
+
pytest -m integration
|
350
|
+
pytest -m "not slow"
|
351
|
+
```
|
352
|
+
|
353
|
+
### Code Quality
|
354
|
+
|
355
|
+
```bash
|
356
|
+
# Format code
|
357
|
+
black src tests
|
358
|
+
isort src tests
|
359
|
+
|
360
|
+
# Lint code
|
361
|
+
flake8 src tests
|
362
|
+
mypy src
|
363
|
+
|
364
|
+
# Run all quality checks
|
365
|
+
tox
|
366
|
+
```
|
367
|
+
|
368
|
+
### Building Documentation
|
369
|
+
|
370
|
+
```bash
|
371
|
+
# Install documentation dependencies
|
372
|
+
pip install -e ".[docs]"
|
373
|
+
|
374
|
+
# Build documentation
|
375
|
+
sphinx-build -b html docs docs/_build/html
|
376
|
+
```
|
377
|
+
|
378
|
+
## Contributing
|
379
|
+
|
380
|
+
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
|
381
|
+
|
382
|
+
### Development Workflow
|
383
|
+
|
384
|
+
1. Fork the repository
|
385
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
386
|
+
3. Make your changes
|
387
|
+
4. Add tests for new functionality
|
388
|
+
5. Ensure all tests pass (`pytest`)
|
389
|
+
6. Format and lint your code (`black`, `isort`, `flake8`, `mypy`)
|
390
|
+
7. Commit your changes (`git commit -m 'Add amazing feature'`)
|
391
|
+
8. Push to the branch (`git push origin feature/amazing-feature`)
|
392
|
+
9. Open a Pull Request
|
393
|
+
|
394
|
+
## Security
|
395
|
+
|
396
|
+
If you discover a security vulnerability, please report it to us at security@mcp.example.com.
|
397
|
+
|
398
|
+
## License
|
399
|
+
|
400
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
401
|
+
|
402
|
+
## Support
|
403
|
+
|
404
|
+
- 📖 [Documentation](https://mcp-security-framework.readthedocs.io/)
|
405
|
+
- 🐛 [Issue Tracker](https://github.com/mcp-security/mcp-security-framework/issues)
|
406
|
+
- 💬 [Discussions](https://github.com/mcp-security/mcp-security-framework/discussions)
|
407
|
+
- 📧 [Email Support](mailto:support@mcp.example.com)
|
408
|
+
|
409
|
+
## Changelog
|
410
|
+
|
411
|
+
See [CHANGELOG.md](CHANGELOG.md) for a list of changes and version history.
|