mcpsentinel-gateway 0.3.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.
Files changed (89) hide show
  1. mcpsentinel_gateway-0.3.0/PKG-INFO +245 -0
  2. mcpsentinel_gateway-0.3.0/README.md +223 -0
  3. mcpsentinel_gateway-0.3.0/pyproject.toml +45 -0
  4. mcpsentinel_gateway-0.3.0/setup.cfg +4 -0
  5. mcpsentinel_gateway-0.3.0/src/mcpsentinel/__init__.py +7 -0
  6. mcpsentinel_gateway-0.3.0/src/mcpsentinel/api/__init__.py +5 -0
  7. mcpsentinel_gateway-0.3.0/src/mcpsentinel/api/app.py +748 -0
  8. mcpsentinel_gateway-0.3.0/src/mcpsentinel/catalog/__init__.py +5 -0
  9. mcpsentinel_gateway-0.3.0/src/mcpsentinel/catalog/registry.py +68 -0
  10. mcpsentinel_gateway-0.3.0/src/mcpsentinel/core/__init__.py +24 -0
  11. mcpsentinel_gateway-0.3.0/src/mcpsentinel/core/config.py +43 -0
  12. mcpsentinel_gateway-0.3.0/src/mcpsentinel/core/exceptions.py +286 -0
  13. mcpsentinel_gateway-0.3.0/src/mcpsentinel/guardrails/__init__.py +13 -0
  14. mcpsentinel_gateway-0.3.0/src/mcpsentinel/guardrails/destructive.py +95 -0
  15. mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/__init__.py +29 -0
  16. mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/audit.py +394 -0
  17. mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/auth.py +169 -0
  18. mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/scope.py +34 -0
  19. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/__init__.py +40 -0
  20. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/aws.py +504 -0
  21. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/__init__.py +85 -0
  22. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/client.py +277 -0
  23. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/exceptions.py +29 -0
  24. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/guardrails.py +54 -0
  25. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/models.py +225 -0
  26. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/tools.py +408 -0
  27. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/__init__.py +98 -0
  28. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/client.py +635 -0
  29. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/exceptions.py +21 -0
  30. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/guardrails.py +72 -0
  31. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/models.py +264 -0
  32. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/tools.py +445 -0
  33. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/__init__.py +89 -0
  34. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/client.py +361 -0
  35. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/exceptions.py +21 -0
  36. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/guardrails.py +68 -0
  37. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/models.py +274 -0
  38. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/tools.py +392 -0
  39. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/models.py +309 -0
  40. mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/session.py +196 -0
  41. mcpsentinel_gateway-0.3.0/src/mcpsentinel/py.typed +1 -0
  42. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/__init__.py +40 -0
  43. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/context.py +39 -0
  44. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/guardrails.py +13 -0
  45. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/loader.py +65 -0
  46. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/models.py +279 -0
  47. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/rbac.py +213 -0
  48. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/secrets/__init__.py +23 -0
  49. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/secrets/manager.py +33 -0
  50. mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/secrets/resolvers.py +88 -0
  51. mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/PKG-INFO +245 -0
  52. mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/SOURCES.txt +87 -0
  53. mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/dependency_links.txt +1 -0
  54. mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/requires.txt +15 -0
  55. mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/top_level.txt +1 -0
  56. mcpsentinel_gateway-0.3.0/tests/test_audit.py +285 -0
  57. mcpsentinel_gateway-0.3.0/tests/test_auth.py +160 -0
  58. mcpsentinel_gateway-0.3.0/tests/test_aws.py +108 -0
  59. mcpsentinel_gateway-0.3.0/tests/test_aws_destructive.py +306 -0
  60. mcpsentinel_gateway-0.3.0/tests/test_aws_integration.py +484 -0
  61. mcpsentinel_gateway-0.3.0/tests/test_aws_provider.py +452 -0
  62. mcpsentinel_gateway-0.3.0/tests/test_aws_session.py +404 -0
  63. mcpsentinel_gateway-0.3.0/tests/test_awx_client.py +444 -0
  64. mcpsentinel_gateway-0.3.0/tests/test_awx_guardrails.py +136 -0
  65. mcpsentinel_gateway-0.3.0/tests/test_awx_integration.py +847 -0
  66. mcpsentinel_gateway-0.3.0/tests/test_awx_tools.py +543 -0
  67. mcpsentinel_gateway-0.3.0/tests/test_azure_client.py +603 -0
  68. mcpsentinel_gateway-0.3.0/tests/test_azure_destructive.py +271 -0
  69. mcpsentinel_gateway-0.3.0/tests/test_azure_guardrails.py +95 -0
  70. mcpsentinel_gateway-0.3.0/tests/test_azure_integration.py +661 -0
  71. mcpsentinel_gateway-0.3.0/tests/test_azure_tools.py +439 -0
  72. mcpsentinel_gateway-0.3.0/tests/test_basic.py +8 -0
  73. mcpsentinel_gateway-0.3.0/tests/test_catalog_filtering.py +97 -0
  74. mcpsentinel_gateway-0.3.0/tests/test_context.py +78 -0
  75. mcpsentinel_gateway-0.3.0/tests/test_destructive_guardrails.py +161 -0
  76. mcpsentinel_gateway-0.3.0/tests/test_destructive_integration.py +646 -0
  77. mcpsentinel_gateway-0.3.0/tests/test_e2e_blackbox.py +163 -0
  78. mcpsentinel_gateway-0.3.0/tests/test_gitlab_client.py +506 -0
  79. mcpsentinel_gateway-0.3.0/tests/test_gitlab_destructive.py +262 -0
  80. mcpsentinel_gateway-0.3.0/tests/test_gitlab_guardrails.py +94 -0
  81. mcpsentinel_gateway-0.3.0/tests/test_gitlab_integration.py +599 -0
  82. mcpsentinel_gateway-0.3.0/tests/test_gitlab_tools.py +367 -0
  83. mcpsentinel_gateway-0.3.0/tests/test_integration.py +129 -0
  84. mcpsentinel_gateway-0.3.0/tests/test_rbac.py +127 -0
  85. mcpsentinel_gateway-0.3.0/tests/test_scope_interceptor.py +108 -0
  86. mcpsentinel_gateway-0.3.0/tests/test_secrets_resolution.py +178 -0
  87. mcpsentinel_gateway-0.3.0/tests/test_security_integration.py +353 -0
  88. mcpsentinel_gateway-0.3.0/tests/test_security_loader.py +130 -0
  89. mcpsentinel_gateway-0.3.0/tests/test_security_models.py +170 -0
@@ -0,0 +1,245 @@
1
+ Metadata-Version: 2.4
2
+ Name: mcpsentinel-gateway
3
+ Version: 0.3.0
4
+ Summary: Prover acesso seguro a ferramentas de infraestrutura (AWS, Gitlab, Azure) via protocolo MCP
5
+ License: MIT
6
+ Requires-Python: >=3.12
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: fastmcp>=0.4.0
9
+ Requires-Dist: fastapi>=0.110.0
10
+ Requires-Dist: uvicorn>=0.30.0
11
+ Requires-Dist: pydantic>=2.7.0
12
+ Requires-Dist: pydantic-settings>=2.0.0
13
+ Requires-Dist: boto3>=1.34.0
14
+ Requires-Dist: httpx>=0.27.0
15
+ Requires-Dist: pyyaml>=6.0.3
16
+ Provides-Extra: dev
17
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
18
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
19
+ Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
20
+ Requires-Dist: ruff>=0.4.0; extra == "dev"
21
+ Requires-Dist: mypy>=1.10.0; extra == "dev"
22
+
23
+ # McpSentinel — Secure Infrastructure Gateway for Model Context Protocol
24
+
25
+ [![Application Development Harness](https://img.shields.io/badge/Harness-Active-success)](./AGENTS.md)
26
+ [![Python Version](https://img.shields.io/badge/Python-3.12%2B-blue.svg)](./pyproject.toml)
27
+ [![Test Coverage](https://img.shields.io/badge/Coverage-97%25-brightgreen.svg)](./tests/)
28
+ [![Security](https://img.shields.io/badge/Security-Fail--Secure-red.svg)](./config/security.yaml)
29
+ [![Architecture](https://img.shields.io/badge/Architecture-Modular%20Gateway-purple.svg)](./docs/trd.md)
30
+
31
+ **McpSentinel** é um gateway corporativo de segurança e mediação para o **Model Context Protocol (MCP)**, projetado para conceder a agentes autônomos de Inteligência Artificial acesso controlado, governado e auditável a ferramentas operacionais de infraestrutura de nuvem (**Amazon Web Services**) e gestão de código (**GitLab** e **Azure Repos**).
32
+
33
+ O McpSentinel atua como uma barreira de proteção de borda (*security edge proxy*), centralizando a execução de ferramentas, interceptando requisições, aplicando controle de acesso baseado em papéis (RBAC) multi-tenant e gerando uma trilha de auditoria síncrona com bloqueio imediato (*fail-secure*).
34
+
35
+ ---
36
+
37
+ ## 🛡️ Princípios de Arquitetura e Segurança
38
+
39
+ O gateway foi concebido sob cinco pilares de segurança fundamentais:
40
+
41
+ ```mermaid
42
+ flowchart LR
43
+ A[Agente IA / Cliente MCP] -->|1. Bearer Token via SSE| B(McpSentinel Edge Gateway)
44
+ B -->|2. RBAC & Tenant Check| C{Permitido?}
45
+ C -- Não -->|Bloqueio Imediato & Log BLOCKED| A
46
+ C -- Sim -->|3. Log Síncrono PENDING| D[(Audit Trail / stdout)]
47
+ D -->|4. STS AssumeRole / PAT| E[Infraestrutura: AWS / Git]
48
+ E -->|5. Sanitização REDACTED| B
49
+ B -->|6. Log SUCCESS & Resposta Segura| A
50
+ ```
51
+
52
+ 1. **Zero Credential Leakage:** Nenhuma credencial privilegiada de nuvem (IAM Keys, credenciais STS) ou tokens de repositório (PATs) é exposta ou trafegada para o cliente de IA. Todas as operações são mediadas pelo gateway, que assume temporariamente IAM Roles via AWS STS e despacha comandos com menor privilégio estrito.
53
+ 2. **Gestão Declarativa via GitOps:** Identidades de agentes, perfis RBAC e tenants autorizados são integralmente modelados em arquivo declarativo versionado ([`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml)). Mudanças passam por revisão por pares e esteiras de CI/CD, sem dependência de banco de dados relacional ou painel web mutável.
54
+ 3. **RBAC Multi-Tenant e Filtragem Dinâmica de Catálogo:**
55
+ - **Descoberta (`tools/list`):** O catálogo MCP é dinamicamente filtrado; agentes visualizam estritamente as ferramentas autorizadas para seu respectivo perfil.
56
+ - **Invocação (`tools/call`):** Validação mandatória em tempo de execução garantindo que a ferramenta solicitada e o tenant/conta AWS de destino pertençam ao escopo do agente autenticado.
57
+ 4. **Trilha de Auditoria Síncrona Fail-Secure:** Cada invocação emite um evento estruturado em JSONLines na entrada (`PENDING`) e na saída (`SUCCESS`, `FAILED` ou `BLOCKED`). Sob a política *Fail-Secure*, qualquer falha no subsistema de persistência de log bloqueia incondicionalmente a chamada da ferramenta, garantindo que nenhuma ação seja executada sem rastro forense.
58
+ 5. **Higienização e Mascaramento Automático:** Todos os payloads de entrada, saída e registros de log passam por sanitização recursiva, substituindo senhas, tokens e parâmetros sensíveis pelo marcador `[REDACTED]`.
59
+
60
+ ---
61
+
62
+ ## 📋 Requisitos de Ambiente
63
+
64
+ - **Sistema Operacional:** Linux (x86_64 ou ARM64) ou macOS.
65
+ - **Runtime:** Python `>= 3.12`.
66
+ - **Gerenciador de Pacotes e Toolchain:** [`uv`](https://github.com/astral-sh/uv) (recomendado) ou `pip`/`venv`.
67
+ - **Credenciais de Provedor:** AWS Credentials configuradas no ambiente hospedeiro via variáveis de ambiente padrão (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`), arquivo de credenciais `~/.aws/credentials` ou perfil de instância/IAM Role (EC2/ECS/EKS).
68
+
69
+ ---
70
+
71
+ ## ⚡ Instalação Rápida
72
+
73
+ Clone o repositório e sincronize o ambiente virtual isolado com o `uv`:
74
+
75
+ ```bash
76
+ # Clone do repositório
77
+ git clone https://github.com/Defendi/McpSentinel.git
78
+ cd McpSentinel
79
+
80
+ # Criação do venv e instalação de todas as dependências (incluindo dev)
81
+ uv sync
82
+ ```
83
+
84
+ Caso utilize o `pip` padrão:
85
+
86
+ ```bash
87
+ python3.12 -m venv .venv
88
+ source .venv/bin/activate
89
+ pip install -e ".[dev]"
90
+ ```
91
+
92
+ ---
93
+
94
+ ## ⚙️ Configuração
95
+
96
+ O McpSentinel é configurado via variáveis de ambiente e arquivos declarativos versionados.
97
+
98
+ ### Variáveis de Ambiente Suportadas
99
+
100
+ As variáveis podem ser definidas no ambiente do sistema operacional ou em um arquivo `.env` na raiz do projeto:
101
+
102
+ | Variável | Padrão | Descrição |
103
+ |---|---|---|
104
+ | `SENTINEL_AUTH_TOKEN` | `sentinel-secret-token` | Bearer token legado de fallback para validação de requisições HTTP. |
105
+ | `SENTINEL_SECURITY_CONFIG` | `config/security.yaml` | Caminho do arquivo de configuração declarativa GitOps (RBAC e agentes). |
106
+ | `SENTINEL_AUDIT_LOG_PATH` | `logs/audit.log` | Caminho do arquivo local para persistência síncrona de eventos de auditoria JSONLines. |
107
+ | `SENTINEL_HOST` | `0.0.0.0` | Endereço IP de ligação do servidor ASGI. |
108
+ | `SENTINEL_PORT` | `8000` | Porta TCP de escuta do servidor HTTP/SSE. |
109
+ | `SENTINEL_ENVIRONMENT` | `development` | Ambiente operacional (`development`, `staging`, `production`). |
110
+ | `SENTINEL_LOG_LEVEL` | `INFO` | Nível de logging da aplicação (`DEBUG`, `INFO`, `WARNING`, `ERROR`). |
111
+
112
+ ### Configuração Declarativa GitOps (`config/security.yaml`)
113
+
114
+ O arquivo [`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml) define formalmente a tríade de segurança: **Tenants**, **Profiles** e **Agents**. Suporta interpolação de variáveis de ambiente com valores padrão `${VAR_NAME:-default}`.
115
+
116
+ ```yaml
117
+ version: "1.0"
118
+
119
+ # 1. Tenants corporativos (Contas de nuvem e escopos)
120
+ tenants:
121
+ aws_accounts:
122
+ - id: "dev-account"
123
+ account_id: "111122223333"
124
+ name: "Ambiente de Desenvolvimento"
125
+ allowed_regions:
126
+ - "us-east-1"
127
+ - "sa-east-1"
128
+
129
+ # 2. Perfis RBAC
130
+ profiles:
131
+ sre_operations:
132
+ description: "Perfil operacional SRE"
133
+ tools:
134
+ - "aws_get_caller_identity"
135
+ allowed_tenants:
136
+ aws_accounts:
137
+ - "dev-account"
138
+
139
+ # 3. Identidades dos agentes clientes
140
+ agents:
141
+ - agent_id: "agent-sre-01"
142
+ name: "Agente Operacional SRE Principal"
143
+ token: "${SENTINEL_TOKEN_SRE:-token-sre-01-secret}"
144
+ profile: "sre_operations"
145
+ ```
146
+
147
+ ---
148
+
149
+ ## 🚀 Inicialização do Servidor
150
+
151
+ ### Execução via Uvicorn (Recomendada em Produção/Desenvolvimento)
152
+
153
+ Inicie a aplicação ASGI Starlette com transporte Server-Sent Events (SSE):
154
+
155
+ ```bash
156
+ uv run uvicorn mcpsentinel.api.app:app --host 0.0.0.0 --port 8000 --reload
157
+ ```
158
+
159
+ O gateway inicializará e disponibilizará o endpoint MCP SSE em:
160
+ - **SSE Connection Endpoint:** `http://localhost:8000/sse`
161
+ - **Messages POST Endpoint:** `http://localhost:8000/messages/`
162
+
163
+ ---
164
+
165
+ ## 🔌 Conectando Clientes MCP
166
+
167
+ Todos os clientes devem enviar o cabeçalho de autenticação HTTP padrão:
168
+ ```http
169
+ Authorization: Bearer <TOKEN_DO_AGENTE>
170
+ ```
171
+
172
+ ### 1. Claude Desktop
173
+
174
+ Configure o arquivo de configuração do Claude Desktop (`claude_desktop_config.json`):
175
+
176
+ ```json
177
+ {
178
+ "mcpServers": {
179
+ "mcpsentinel": {
180
+ "url": "http://localhost:8000/sse",
181
+ "headers": {
182
+ "Authorization": "Bearer token-sre-01-secret"
183
+ }
184
+ }
185
+ }
186
+ }
187
+ ```
188
+
189
+ ### 2. Chamadas HTTP Diretas (curl / httpx)
190
+
191
+ Você pode validar a inicialização e escuta da conexão SSE com o utilitário `curl`:
192
+
193
+ ```bash
194
+ # Conectar ao stream de eventos SSE com Bearer Token
195
+ curl -N -H "Authorization: Bearer token-sre-01-secret" \
196
+ http://localhost:8000/sse
197
+ ```
198
+
199
+ Em caso de credencial ausente ou inválida, o gateway rejeita imediatamente com HTTP 401:
200
+
201
+ ```bash
202
+ curl -i http://localhost:8000/sse
203
+ # HTTP/1.1 401 Unauthorized
204
+ # {"error": "Unauthorized", "code": "AUTHENTICATION_ERROR", "detail": "Missing Authorization header"}
205
+ ```
206
+
207
+ ---
208
+
209
+ ## 🧪 Quality Gates e Testes Herméticos
210
+
211
+ O projeto possui uma suíte hermética de testes de unidade, integração e segurança, sem dependências de infraestrutura externa viva em runtime de teste.
212
+
213
+ ### Execução de Testes com Cobertura
214
+
215
+ ```bash
216
+ # Execução da suíte completa com relatório de cobertura detalhado
217
+ uv run pytest --cov=src/mcpsentinel --cov-report=term-missing
218
+ ```
219
+
220
+ Status atual da cobertura: **97%** em 134 testes automatizados.
221
+
222
+ ### Inspeção Estática de Código e Tipagem
223
+
224
+ ```bash
225
+ # Validação de formatação e linting estrito com Ruff
226
+ uv run ruff check
227
+
228
+ # Checagem estrita de tipos estáticos com Mypy
229
+ uv run mypy src
230
+ ```
231
+
232
+ ---
233
+
234
+ ## 📚 Rastreabilidade e Documentação do Harness
235
+
236
+ Este repositório adota a disciplina canônica do **Application Development Harness**. Consulte a documentação complementar em [`docs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/):
237
+
238
+ - **Manual de Operação e Governança:** [`docs/manual-de-operacao.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/manual-de-operacao.md) — Guia detalhado para o Administrador de Segurança (AT-01).
239
+ - **Technical Requirements Document (TRD):** [`docs/trd.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/trd.md) — Requisitos não-funcionais, stack e limites arquiteturais globais.
240
+ - **Registros de Decisões Arquiteturais (ADRs):**
241
+ - [`ADR 001: Transporte Remoto HTTP para Servidor MCP Centralizado`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/001-transporte-remoto-http-mcp.md)
242
+ - [`ADR 002: Modelo de Segurança Declarativo GitOps, RBAC e Guardrails Operacionais`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/002-seguranca-rbac-gitops-e-guardrails.md)
243
+ - [`ADR 003: Trilha de Auditoria Síncrona Estruturada em JSON sob Paradigma Fail-Secure`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/003-auditoria-sincrona-fail-secure.md)
244
+ - **Especificações de Funcionalidades:** [`docs/specs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/specs/)
245
+ - **Product Requirements Documents:** [`docs/prds/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/prds/)
@@ -0,0 +1,223 @@
1
+ # McpSentinel — Secure Infrastructure Gateway for Model Context Protocol
2
+
3
+ [![Application Development Harness](https://img.shields.io/badge/Harness-Active-success)](./AGENTS.md)
4
+ [![Python Version](https://img.shields.io/badge/Python-3.12%2B-blue.svg)](./pyproject.toml)
5
+ [![Test Coverage](https://img.shields.io/badge/Coverage-97%25-brightgreen.svg)](./tests/)
6
+ [![Security](https://img.shields.io/badge/Security-Fail--Secure-red.svg)](./config/security.yaml)
7
+ [![Architecture](https://img.shields.io/badge/Architecture-Modular%20Gateway-purple.svg)](./docs/trd.md)
8
+
9
+ **McpSentinel** é um gateway corporativo de segurança e mediação para o **Model Context Protocol (MCP)**, projetado para conceder a agentes autônomos de Inteligência Artificial acesso controlado, governado e auditável a ferramentas operacionais de infraestrutura de nuvem (**Amazon Web Services**) e gestão de código (**GitLab** e **Azure Repos**).
10
+
11
+ O McpSentinel atua como uma barreira de proteção de borda (*security edge proxy*), centralizando a execução de ferramentas, interceptando requisições, aplicando controle de acesso baseado em papéis (RBAC) multi-tenant e gerando uma trilha de auditoria síncrona com bloqueio imediato (*fail-secure*).
12
+
13
+ ---
14
+
15
+ ## 🛡️ Princípios de Arquitetura e Segurança
16
+
17
+ O gateway foi concebido sob cinco pilares de segurança fundamentais:
18
+
19
+ ```mermaid
20
+ flowchart LR
21
+ A[Agente IA / Cliente MCP] -->|1. Bearer Token via SSE| B(McpSentinel Edge Gateway)
22
+ B -->|2. RBAC & Tenant Check| C{Permitido?}
23
+ C -- Não -->|Bloqueio Imediato & Log BLOCKED| A
24
+ C -- Sim -->|3. Log Síncrono PENDING| D[(Audit Trail / stdout)]
25
+ D -->|4. STS AssumeRole / PAT| E[Infraestrutura: AWS / Git]
26
+ E -->|5. Sanitização REDACTED| B
27
+ B -->|6. Log SUCCESS & Resposta Segura| A
28
+ ```
29
+
30
+ 1. **Zero Credential Leakage:** Nenhuma credencial privilegiada de nuvem (IAM Keys, credenciais STS) ou tokens de repositório (PATs) é exposta ou trafegada para o cliente de IA. Todas as operações são mediadas pelo gateway, que assume temporariamente IAM Roles via AWS STS e despacha comandos com menor privilégio estrito.
31
+ 2. **Gestão Declarativa via GitOps:** Identidades de agentes, perfis RBAC e tenants autorizados são integralmente modelados em arquivo declarativo versionado ([`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml)). Mudanças passam por revisão por pares e esteiras de CI/CD, sem dependência de banco de dados relacional ou painel web mutável.
32
+ 3. **RBAC Multi-Tenant e Filtragem Dinâmica de Catálogo:**
33
+ - **Descoberta (`tools/list`):** O catálogo MCP é dinamicamente filtrado; agentes visualizam estritamente as ferramentas autorizadas para seu respectivo perfil.
34
+ - **Invocação (`tools/call`):** Validação mandatória em tempo de execução garantindo que a ferramenta solicitada e o tenant/conta AWS de destino pertençam ao escopo do agente autenticado.
35
+ 4. **Trilha de Auditoria Síncrona Fail-Secure:** Cada invocação emite um evento estruturado em JSONLines na entrada (`PENDING`) e na saída (`SUCCESS`, `FAILED` ou `BLOCKED`). Sob a política *Fail-Secure*, qualquer falha no subsistema de persistência de log bloqueia incondicionalmente a chamada da ferramenta, garantindo que nenhuma ação seja executada sem rastro forense.
36
+ 5. **Higienização e Mascaramento Automático:** Todos os payloads de entrada, saída e registros de log passam por sanitização recursiva, substituindo senhas, tokens e parâmetros sensíveis pelo marcador `[REDACTED]`.
37
+
38
+ ---
39
+
40
+ ## 📋 Requisitos de Ambiente
41
+
42
+ - **Sistema Operacional:** Linux (x86_64 ou ARM64) ou macOS.
43
+ - **Runtime:** Python `>= 3.12`.
44
+ - **Gerenciador de Pacotes e Toolchain:** [`uv`](https://github.com/astral-sh/uv) (recomendado) ou `pip`/`venv`.
45
+ - **Credenciais de Provedor:** AWS Credentials configuradas no ambiente hospedeiro via variáveis de ambiente padrão (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`), arquivo de credenciais `~/.aws/credentials` ou perfil de instância/IAM Role (EC2/ECS/EKS).
46
+
47
+ ---
48
+
49
+ ## ⚡ Instalação Rápida
50
+
51
+ Clone o repositório e sincronize o ambiente virtual isolado com o `uv`:
52
+
53
+ ```bash
54
+ # Clone do repositório
55
+ git clone https://github.com/Defendi/McpSentinel.git
56
+ cd McpSentinel
57
+
58
+ # Criação do venv e instalação de todas as dependências (incluindo dev)
59
+ uv sync
60
+ ```
61
+
62
+ Caso utilize o `pip` padrão:
63
+
64
+ ```bash
65
+ python3.12 -m venv .venv
66
+ source .venv/bin/activate
67
+ pip install -e ".[dev]"
68
+ ```
69
+
70
+ ---
71
+
72
+ ## ⚙️ Configuração
73
+
74
+ O McpSentinel é configurado via variáveis de ambiente e arquivos declarativos versionados.
75
+
76
+ ### Variáveis de Ambiente Suportadas
77
+
78
+ As variáveis podem ser definidas no ambiente do sistema operacional ou em um arquivo `.env` na raiz do projeto:
79
+
80
+ | Variável | Padrão | Descrição |
81
+ |---|---|---|
82
+ | `SENTINEL_AUTH_TOKEN` | `sentinel-secret-token` | Bearer token legado de fallback para validação de requisições HTTP. |
83
+ | `SENTINEL_SECURITY_CONFIG` | `config/security.yaml` | Caminho do arquivo de configuração declarativa GitOps (RBAC e agentes). |
84
+ | `SENTINEL_AUDIT_LOG_PATH` | `logs/audit.log` | Caminho do arquivo local para persistência síncrona de eventos de auditoria JSONLines. |
85
+ | `SENTINEL_HOST` | `0.0.0.0` | Endereço IP de ligação do servidor ASGI. |
86
+ | `SENTINEL_PORT` | `8000` | Porta TCP de escuta do servidor HTTP/SSE. |
87
+ | `SENTINEL_ENVIRONMENT` | `development` | Ambiente operacional (`development`, `staging`, `production`). |
88
+ | `SENTINEL_LOG_LEVEL` | `INFO` | Nível de logging da aplicação (`DEBUG`, `INFO`, `WARNING`, `ERROR`). |
89
+
90
+ ### Configuração Declarativa GitOps (`config/security.yaml`)
91
+
92
+ O arquivo [`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml) define formalmente a tríade de segurança: **Tenants**, **Profiles** e **Agents**. Suporta interpolação de variáveis de ambiente com valores padrão `${VAR_NAME:-default}`.
93
+
94
+ ```yaml
95
+ version: "1.0"
96
+
97
+ # 1. Tenants corporativos (Contas de nuvem e escopos)
98
+ tenants:
99
+ aws_accounts:
100
+ - id: "dev-account"
101
+ account_id: "111122223333"
102
+ name: "Ambiente de Desenvolvimento"
103
+ allowed_regions:
104
+ - "us-east-1"
105
+ - "sa-east-1"
106
+
107
+ # 2. Perfis RBAC
108
+ profiles:
109
+ sre_operations:
110
+ description: "Perfil operacional SRE"
111
+ tools:
112
+ - "aws_get_caller_identity"
113
+ allowed_tenants:
114
+ aws_accounts:
115
+ - "dev-account"
116
+
117
+ # 3. Identidades dos agentes clientes
118
+ agents:
119
+ - agent_id: "agent-sre-01"
120
+ name: "Agente Operacional SRE Principal"
121
+ token: "${SENTINEL_TOKEN_SRE:-token-sre-01-secret}"
122
+ profile: "sre_operations"
123
+ ```
124
+
125
+ ---
126
+
127
+ ## 🚀 Inicialização do Servidor
128
+
129
+ ### Execução via Uvicorn (Recomendada em Produção/Desenvolvimento)
130
+
131
+ Inicie a aplicação ASGI Starlette com transporte Server-Sent Events (SSE):
132
+
133
+ ```bash
134
+ uv run uvicorn mcpsentinel.api.app:app --host 0.0.0.0 --port 8000 --reload
135
+ ```
136
+
137
+ O gateway inicializará e disponibilizará o endpoint MCP SSE em:
138
+ - **SSE Connection Endpoint:** `http://localhost:8000/sse`
139
+ - **Messages POST Endpoint:** `http://localhost:8000/messages/`
140
+
141
+ ---
142
+
143
+ ## 🔌 Conectando Clientes MCP
144
+
145
+ Todos os clientes devem enviar o cabeçalho de autenticação HTTP padrão:
146
+ ```http
147
+ Authorization: Bearer <TOKEN_DO_AGENTE>
148
+ ```
149
+
150
+ ### 1. Claude Desktop
151
+
152
+ Configure o arquivo de configuração do Claude Desktop (`claude_desktop_config.json`):
153
+
154
+ ```json
155
+ {
156
+ "mcpServers": {
157
+ "mcpsentinel": {
158
+ "url": "http://localhost:8000/sse",
159
+ "headers": {
160
+ "Authorization": "Bearer token-sre-01-secret"
161
+ }
162
+ }
163
+ }
164
+ }
165
+ ```
166
+
167
+ ### 2. Chamadas HTTP Diretas (curl / httpx)
168
+
169
+ Você pode validar a inicialização e escuta da conexão SSE com o utilitário `curl`:
170
+
171
+ ```bash
172
+ # Conectar ao stream de eventos SSE com Bearer Token
173
+ curl -N -H "Authorization: Bearer token-sre-01-secret" \
174
+ http://localhost:8000/sse
175
+ ```
176
+
177
+ Em caso de credencial ausente ou inválida, o gateway rejeita imediatamente com HTTP 401:
178
+
179
+ ```bash
180
+ curl -i http://localhost:8000/sse
181
+ # HTTP/1.1 401 Unauthorized
182
+ # {"error": "Unauthorized", "code": "AUTHENTICATION_ERROR", "detail": "Missing Authorization header"}
183
+ ```
184
+
185
+ ---
186
+
187
+ ## 🧪 Quality Gates e Testes Herméticos
188
+
189
+ O projeto possui uma suíte hermética de testes de unidade, integração e segurança, sem dependências de infraestrutura externa viva em runtime de teste.
190
+
191
+ ### Execução de Testes com Cobertura
192
+
193
+ ```bash
194
+ # Execução da suíte completa com relatório de cobertura detalhado
195
+ uv run pytest --cov=src/mcpsentinel --cov-report=term-missing
196
+ ```
197
+
198
+ Status atual da cobertura: **97%** em 134 testes automatizados.
199
+
200
+ ### Inspeção Estática de Código e Tipagem
201
+
202
+ ```bash
203
+ # Validação de formatação e linting estrito com Ruff
204
+ uv run ruff check
205
+
206
+ # Checagem estrita de tipos estáticos com Mypy
207
+ uv run mypy src
208
+ ```
209
+
210
+ ---
211
+
212
+ ## 📚 Rastreabilidade e Documentação do Harness
213
+
214
+ Este repositório adota a disciplina canônica do **Application Development Harness**. Consulte a documentação complementar em [`docs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/):
215
+
216
+ - **Manual de Operação e Governança:** [`docs/manual-de-operacao.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/manual-de-operacao.md) — Guia detalhado para o Administrador de Segurança (AT-01).
217
+ - **Technical Requirements Document (TRD):** [`docs/trd.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/trd.md) — Requisitos não-funcionais, stack e limites arquiteturais globais.
218
+ - **Registros de Decisões Arquiteturais (ADRs):**
219
+ - [`ADR 001: Transporte Remoto HTTP para Servidor MCP Centralizado`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/001-transporte-remoto-http-mcp.md)
220
+ - [`ADR 002: Modelo de Segurança Declarativo GitOps, RBAC e Guardrails Operacionais`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/002-seguranca-rbac-gitops-e-guardrails.md)
221
+ - [`ADR 003: Trilha de Auditoria Síncrona Estruturada em JSON sob Paradigma Fail-Secure`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/003-auditoria-sincrona-fail-secure.md)
222
+ - **Especificações de Funcionalidades:** [`docs/specs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/specs/)
223
+ - **Product Requirements Documents:** [`docs/prds/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/prds/)
@@ -0,0 +1,45 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "mcpsentinel-gateway"
7
+ version = "0.3.0"
8
+ description = "Prover acesso seguro a ferramentas de infraestrutura (AWS, Gitlab, Azure) via protocolo MCP"
9
+ readme = "README.md"
10
+ requires-python = ">=3.12"
11
+ license = {text = "MIT"}
12
+ dependencies = [
13
+ "fastmcp>=0.4.0",
14
+ "fastapi>=0.110.0",
15
+ "uvicorn>=0.30.0",
16
+ "pydantic>=2.7.0",
17
+ "pydantic-settings>=2.0.0",
18
+ "boto3>=1.34.0",
19
+ "httpx>=0.27.0",
20
+ "pyyaml>=6.0.3",
21
+ ]
22
+
23
+ [project.optional-dependencies]
24
+ dev = [
25
+ "pytest>=8.0.0",
26
+ "pytest-asyncio>=0.23.0",
27
+ "pytest-cov>=5.0.0",
28
+ "ruff>=0.4.0",
29
+ "mypy>=1.10.0",
30
+ ]
31
+
32
+ [tool.ruff]
33
+ line-length = 100
34
+
35
+ [tool.mypy]
36
+ strict = true
37
+
38
+ [tool.pytest.ini_options]
39
+ asyncio_mode = "auto"
40
+ testpaths = ["tests"]
41
+
42
+ [dependency-groups]
43
+ dev = [
44
+ "types-pyyaml>=6.0.12.20260906",
45
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,7 @@
1
+ """McpSentinel package."""
2
+
3
+ from mcpsentinel.api.app import app, create_app, create_mcp_server
4
+
5
+ __version__ = "0.1.0"
6
+
7
+ __all__ = ["__version__", "app", "create_app", "create_mcp_server"]
@@ -0,0 +1,5 @@
1
+ """API package for McpSentinel."""
2
+
3
+ from mcpsentinel.api.app import app, create_app, create_mcp_server
4
+
5
+ __all__ = ["app", "create_app", "create_mcp_server"]