security-controls-mcp 0.3.3__tar.gz → 0.3.5__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.
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/CHANGELOG.md +11 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/CLAUDE.md +4 -3
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/Dockerfile +13 -14
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/PAID_STANDARDS_GUIDE.md +6 -6
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/PKG-INFO +33 -3
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/README.md +32 -2
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/pyproject.toml +3 -2
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/__init__.py +1 -1
- security_controls_mcp-0.3.5/src/security_controls_mcp/__main__.py +14 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp.egg-info/PKG-INFO +33 -3
- security_controls_mcp-0.3.5/src/security_controls_mcp.egg-info/entry_points.txt +3 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/test_security.py +10 -10
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/test_smoke.py +12 -8
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/verify_production_ready.py +3 -2
- security_controls_mcp-0.3.3/src/security_controls_mcp/__main__.py +0 -8
- security_controls_mcp-0.3.3/src/security_controls_mcp.egg-info/entry_points.txt +0 -2
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/.gitleaks.toml +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/LICENSE +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/LICENSE-DATA.md +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/MANIFEST.in +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/SECURITY.md +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/setup.cfg +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/cli.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/config.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/data/framework-to-scf.json +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/data/scf-controls.json +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/data_loader.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/extractors/__init__.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/extractors/pdf_extractor.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/http_server.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/legal_notice.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/providers.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/registry.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/server.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp.egg-info/SOURCES.txt +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp.egg-info/dependency_links.txt +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp.egg-info/requires.txt +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp.egg-info/top_level.txt +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/README.md +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/__init__.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/test_content_quality.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/test_data_loader.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/test_integration.py +0 -0
- {security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/tests/test_paid_standards.py +0 -0
|
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.5] - 2026-02-01
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **Critical:** Fixed entry point so `scf-mcp` runs the MCP server (was incorrectly pointing to CLI tools)
|
|
12
|
+
- macOS users: Added documentation about using full path since GUI apps don't inherit shell PATH
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- Split commands: `scf-mcp` runs MCP server, `scf-mcp-import` runs import CLI
|
|
16
|
+
- Updated all docs to reflect new command structure
|
|
17
|
+
- Fixed install instructions to use `pip install security-controls-mcp[import-tools]` instead of editable install
|
|
18
|
+
|
|
8
19
|
## [0.3.3] - 2026-01-31
|
|
9
20
|
|
|
10
21
|
### Changed
|
|
@@ -29,16 +29,17 @@ MCP server providing access to 1,451 security controls across 28 frameworks. Use
|
|
|
29
29
|
pipx install security-controls-mcp
|
|
30
30
|
|
|
31
31
|
# Verify
|
|
32
|
-
|
|
32
|
+
scf-mcp --version
|
|
33
33
|
|
|
34
|
-
# Claude Desktop config
|
|
34
|
+
# Claude Desktop config (use full path for GUI apps)
|
|
35
35
|
{
|
|
36
36
|
"mcpServers": {
|
|
37
37
|
"security-controls": {
|
|
38
|
-
"command": "
|
|
38
|
+
"command": "/full/path/to/scf-mcp"
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
+
# Find your path with: which scf-mcp
|
|
42
43
|
```
|
|
43
44
|
|
|
44
45
|
## Project Structure
|
|
@@ -1,38 +1,37 @@
|
|
|
1
1
|
# Security Controls MCP Server
|
|
2
2
|
# Python-based MCP server with HTTP transport
|
|
3
3
|
# Compatible with Ansvar platform MCP client
|
|
4
|
+
#
|
|
5
|
+
# Using Alpine for minimal CVE footprint
|
|
4
6
|
|
|
5
|
-
FROM python:3.11-
|
|
7
|
+
FROM python:3.11-alpine AS builder
|
|
6
8
|
|
|
7
9
|
WORKDIR /app
|
|
8
10
|
|
|
9
|
-
# Install build dependencies
|
|
10
|
-
RUN
|
|
11
|
-
apt-get install -y --no-install-recommends gcc && \
|
|
12
|
-
rm -rf /var/lib/apt/lists/*
|
|
11
|
+
# Install build dependencies (Alpine uses apk, not apt)
|
|
12
|
+
RUN apk add --no-cache gcc musl-dev
|
|
13
13
|
|
|
14
14
|
# Copy package files
|
|
15
15
|
COPY pyproject.toml README.md ./
|
|
16
16
|
COPY src/ ./src/
|
|
17
17
|
|
|
18
|
-
# Install package
|
|
19
|
-
RUN pip install --no-cache-dir -e .
|
|
18
|
+
# Install package and fix known CVEs
|
|
19
|
+
RUN pip install --no-cache-dir -e . && \
|
|
20
|
+
pip install --no-cache-dir "jaraco.context>=6.1.0" "wheel>=0.46.2"
|
|
20
21
|
|
|
21
22
|
# Install additional runtime dependencies
|
|
22
23
|
RUN pip install --no-cache-dir uvicorn starlette
|
|
23
24
|
|
|
24
|
-
# Production stage
|
|
25
|
-
FROM python:3.11-
|
|
25
|
+
# Production stage - minimal Alpine image
|
|
26
|
+
FROM python:3.11-alpine
|
|
26
27
|
|
|
27
28
|
WORKDIR /app
|
|
28
29
|
|
|
29
|
-
# Install curl for health checks
|
|
30
|
-
RUN
|
|
31
|
-
apt-get install -y --no-install-recommends curl && \
|
|
32
|
-
rm -rf /var/lib/apt/lists/*
|
|
30
|
+
# Install curl for health checks (minimal addition)
|
|
31
|
+
RUN apk add --no-cache curl
|
|
33
32
|
|
|
34
33
|
# Security: create non-root user
|
|
35
|
-
RUN
|
|
34
|
+
RUN adduser -D -u 1001 mcp && \
|
|
36
35
|
chown -R mcp:mcp /app
|
|
37
36
|
|
|
38
37
|
# Copy installed packages from builder
|
|
@@ -18,7 +18,7 @@ Your paid content stays private in `~/.security-controls-mcp/` (never committed
|
|
|
18
18
|
### 1. Install Import Tools
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
pip install -
|
|
21
|
+
pip install security-controls-mcp[import-tools]
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
Installs PDF extraction dependencies (pdfplumber, Pillow, Click).
|
|
@@ -36,7 +36,7 @@ Download the PDF.
|
|
|
36
36
|
### 3. Import the Standard
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
scf-mcp import-standard \
|
|
39
|
+
scf-mcp-import import-standard \
|
|
40
40
|
--file ~/Downloads/ISO-IEC-27001-2022.pdf \
|
|
41
41
|
--type iso_27001_2022 \
|
|
42
42
|
--title "ISO/IEC 27001:2022" \
|
|
@@ -113,12 +113,12 @@ IDs should match SCF framework keys for automatic integration.
|
|
|
113
113
|
|
|
114
114
|
**List imported standards:**
|
|
115
115
|
```bash
|
|
116
|
-
scf-mcp list-standards
|
|
116
|
+
scf-mcp-import list-standards
|
|
117
117
|
```
|
|
118
118
|
|
|
119
119
|
**Re-import (overwrite):**
|
|
120
120
|
```bash
|
|
121
|
-
scf-mcp import-standard --file new-version.pdf --type iso_27001_2022 --force
|
|
121
|
+
scf-mcp-import import-standard --file new-version.pdf --type iso_27001_2022 --force
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
**Disable a standard:**
|
|
@@ -202,10 +202,10 @@ git commit -m "Gitignore paid standards directory"
|
|
|
202
202
|
# 1. Buy ISO 27001 from ISO.org (download PDF)
|
|
203
203
|
|
|
204
204
|
# 2. Install import tools
|
|
205
|
-
pip install -
|
|
205
|
+
pip install security-controls-mcp[import-tools]
|
|
206
206
|
|
|
207
207
|
# 3. Import the PDF
|
|
208
|
-
scf-mcp import-standard \
|
|
208
|
+
scf-mcp-import import-standard \
|
|
209
209
|
--file ~/Downloads/ISO-IEC-27001-2022.pdf \
|
|
210
210
|
--type iso_27001_2022 \
|
|
211
211
|
--title "ISO/IEC 27001:2022" \
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: security-controls-mcp
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Summary: MCP server for querying security framework controls (SCF) - map between ISO 27001, NIST CSF, DORA, PCI DSS, and more
|
|
5
5
|
Author-email: Ansvar Systems <hello@ansvar.eu>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -33,6 +33,8 @@ Dynamic: license-file
|
|
|
33
33
|
|
|
34
34
|
# Security Controls MCP Server
|
|
35
35
|
|
|
36
|
+
<!-- mcp-name: io.github.Ansvar-Systems/security-controls -->
|
|
37
|
+
|
|
36
38
|
[](https://modelcontextprotocol.io)
|
|
37
39
|
[](https://www.python.org)
|
|
38
40
|
[](LICENSE)
|
|
@@ -89,6 +91,18 @@ Add to `claude_desktop_config.json`:
|
|
|
89
91
|
}
|
|
90
92
|
```
|
|
91
93
|
|
|
94
|
+
**macOS users:** GUI apps don't inherit your shell's PATH. Use the full path instead:
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"mcpServers": {
|
|
98
|
+
"security-controls": {
|
|
99
|
+
"command": "/Users/YOUR_USERNAME/.local/bin/scf-mcp"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
Find your path with: `which scf-mcp`
|
|
105
|
+
|
|
92
106
|
**Config location:**
|
|
93
107
|
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
94
108
|
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
@@ -157,10 +171,10 @@ Import your purchased ISO 27001, NIST SP 800-53, or other standards to get offic
|
|
|
157
171
|
|
|
158
172
|
```bash
|
|
159
173
|
# Install import tools
|
|
160
|
-
pip install -
|
|
174
|
+
pip install security-controls-mcp[import-tools]
|
|
161
175
|
|
|
162
176
|
# Import purchased PDF
|
|
163
|
-
scf-mcp import-standard \
|
|
177
|
+
scf-mcp-import import-standard \
|
|
164
178
|
--file ~/Downloads/ISO-27001-2022.pdf \
|
|
165
179
|
--type iso_27001_2022 \
|
|
166
180
|
--title "ISO/IEC 27001:2022"
|
|
@@ -285,4 +299,20 @@ For complete terms: [SCF Terms & Conditions](https://securecontrolsframework.com
|
|
|
285
299
|
|
|
286
300
|
---
|
|
287
301
|
|
|
302
|
+
## More Open Source from Ansvar
|
|
303
|
+
|
|
304
|
+
We maintain a family of MCP servers for compliance and security professionals:
|
|
305
|
+
|
|
306
|
+
| Server | Description | Install |
|
|
307
|
+
|--------|-------------|---------|
|
|
308
|
+
| **[EU Regulations](https://github.com/Ansvar-Systems/EU_compliance_MCP)** | 47 EU regulations (GDPR, AI Act, DORA, NIS2, MiFID II, eIDAS, MDR...) | `npx @ansvar/eu-regulations-mcp` |
|
|
309
|
+
| **[US Regulations](https://github.com/Ansvar-Systems/US_Compliance_MCP)** | HIPAA, CCPA, SOX, GLBA, FERPA, COPPA, FDA 21 CFR Part 11, state privacy laws | `npx @ansvar/us-regulations-mcp` |
|
|
310
|
+
| **[OT Security](https://github.com/Ansvar-Systems/ot-security-mcp)** | IEC 62443, NIST 800-82, MITRE ATT&CK for ICS | `npx @ansvar/ot-security-mcp` |
|
|
311
|
+
| **[Automotive](https://github.com/Ansvar-Systems/Automotive-MCP)** | UNECE R155/R156, ISO 21434 for automotive cybersecurity | `npx @ansvar/automotive-cybersecurity-mcp` |
|
|
312
|
+
| **[Sanctions](https://github.com/Ansvar-Systems/Sanctions-MCP)** | Offline sanctions screening with OpenSanctions (30+ lists) | `pip install ansvar-sanctions-mcp` |
|
|
313
|
+
|
|
314
|
+
Browse all projects: [ansvar.eu/open-source](https://ansvar.eu/open-source)
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
288
318
|
**Built by:** [Ansvar Systems](https://ansvar.eu) (Stockholm, Sweden)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Security Controls MCP Server
|
|
2
2
|
|
|
3
|
+
<!-- mcp-name: io.github.Ansvar-Systems/security-controls -->
|
|
4
|
+
|
|
3
5
|
[](https://modelcontextprotocol.io)
|
|
4
6
|
[](https://www.python.org)
|
|
5
7
|
[](LICENSE)
|
|
@@ -56,6 +58,18 @@ Add to `claude_desktop_config.json`:
|
|
|
56
58
|
}
|
|
57
59
|
```
|
|
58
60
|
|
|
61
|
+
**macOS users:** GUI apps don't inherit your shell's PATH. Use the full path instead:
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"mcpServers": {
|
|
65
|
+
"security-controls": {
|
|
66
|
+
"command": "/Users/YOUR_USERNAME/.local/bin/scf-mcp"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
Find your path with: `which scf-mcp`
|
|
72
|
+
|
|
59
73
|
**Config location:**
|
|
60
74
|
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
61
75
|
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
@@ -124,10 +138,10 @@ Import your purchased ISO 27001, NIST SP 800-53, or other standards to get offic
|
|
|
124
138
|
|
|
125
139
|
```bash
|
|
126
140
|
# Install import tools
|
|
127
|
-
pip install -
|
|
141
|
+
pip install security-controls-mcp[import-tools]
|
|
128
142
|
|
|
129
143
|
# Import purchased PDF
|
|
130
|
-
scf-mcp import-standard \
|
|
144
|
+
scf-mcp-import import-standard \
|
|
131
145
|
--file ~/Downloads/ISO-27001-2022.pdf \
|
|
132
146
|
--type iso_27001_2022 \
|
|
133
147
|
--title "ISO/IEC 27001:2022"
|
|
@@ -252,4 +266,20 @@ For complete terms: [SCF Terms & Conditions](https://securecontrolsframework.com
|
|
|
252
266
|
|
|
253
267
|
---
|
|
254
268
|
|
|
269
|
+
## More Open Source from Ansvar
|
|
270
|
+
|
|
271
|
+
We maintain a family of MCP servers for compliance and security professionals:
|
|
272
|
+
|
|
273
|
+
| Server | Description | Install |
|
|
274
|
+
|--------|-------------|---------|
|
|
275
|
+
| **[EU Regulations](https://github.com/Ansvar-Systems/EU_compliance_MCP)** | 47 EU regulations (GDPR, AI Act, DORA, NIS2, MiFID II, eIDAS, MDR...) | `npx @ansvar/eu-regulations-mcp` |
|
|
276
|
+
| **[US Regulations](https://github.com/Ansvar-Systems/US_Compliance_MCP)** | HIPAA, CCPA, SOX, GLBA, FERPA, COPPA, FDA 21 CFR Part 11, state privacy laws | `npx @ansvar/us-regulations-mcp` |
|
|
277
|
+
| **[OT Security](https://github.com/Ansvar-Systems/ot-security-mcp)** | IEC 62443, NIST 800-82, MITRE ATT&CK for ICS | `npx @ansvar/ot-security-mcp` |
|
|
278
|
+
| **[Automotive](https://github.com/Ansvar-Systems/Automotive-MCP)** | UNECE R155/R156, ISO 21434 for automotive cybersecurity | `npx @ansvar/automotive-cybersecurity-mcp` |
|
|
279
|
+
| **[Sanctions](https://github.com/Ansvar-Systems/Sanctions-MCP)** | Offline sanctions screening with OpenSanctions (30+ lists) | `pip install ansvar-sanctions-mcp` |
|
|
280
|
+
|
|
281
|
+
Browse all projects: [ansvar.eu/open-source](https://ansvar.eu/open-source)
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
255
285
|
**Built by:** [Ansvar Systems](https://ansvar.eu) (Stockholm, Sweden)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "security-controls-mcp"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.5"
|
|
4
4
|
description = "MCP server for querying security framework controls (SCF) - map between ISO 27001, NIST CSF, DORA, PCI DSS, and more"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -37,7 +37,8 @@ import-tools = [
|
|
|
37
37
|
]
|
|
38
38
|
|
|
39
39
|
[project.scripts]
|
|
40
|
-
scf-mcp = "security_controls_mcp.
|
|
40
|
+
scf-mcp = "security_controls_mcp.__main__:main"
|
|
41
|
+
scf-mcp-import = "security_controls_mcp.cli:main"
|
|
41
42
|
|
|
42
43
|
[project.urls]
|
|
43
44
|
Homepage = "https://github.com/Ansvar-Systems/security-controls-mcp"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: security-controls-mcp
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Summary: MCP server for querying security framework controls (SCF) - map between ISO 27001, NIST CSF, DORA, PCI DSS, and more
|
|
5
5
|
Author-email: Ansvar Systems <hello@ansvar.eu>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -33,6 +33,8 @@ Dynamic: license-file
|
|
|
33
33
|
|
|
34
34
|
# Security Controls MCP Server
|
|
35
35
|
|
|
36
|
+
<!-- mcp-name: io.github.Ansvar-Systems/security-controls -->
|
|
37
|
+
|
|
36
38
|
[](https://modelcontextprotocol.io)
|
|
37
39
|
[](https://www.python.org)
|
|
38
40
|
[](LICENSE)
|
|
@@ -89,6 +91,18 @@ Add to `claude_desktop_config.json`:
|
|
|
89
91
|
}
|
|
90
92
|
```
|
|
91
93
|
|
|
94
|
+
**macOS users:** GUI apps don't inherit your shell's PATH. Use the full path instead:
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"mcpServers": {
|
|
98
|
+
"security-controls": {
|
|
99
|
+
"command": "/Users/YOUR_USERNAME/.local/bin/scf-mcp"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
Find your path with: `which scf-mcp`
|
|
105
|
+
|
|
92
106
|
**Config location:**
|
|
93
107
|
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
94
108
|
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
@@ -157,10 +171,10 @@ Import your purchased ISO 27001, NIST SP 800-53, or other standards to get offic
|
|
|
157
171
|
|
|
158
172
|
```bash
|
|
159
173
|
# Install import tools
|
|
160
|
-
pip install -
|
|
174
|
+
pip install security-controls-mcp[import-tools]
|
|
161
175
|
|
|
162
176
|
# Import purchased PDF
|
|
163
|
-
scf-mcp import-standard \
|
|
177
|
+
scf-mcp-import import-standard \
|
|
164
178
|
--file ~/Downloads/ISO-27001-2022.pdf \
|
|
165
179
|
--type iso_27001_2022 \
|
|
166
180
|
--title "ISO/IEC 27001:2022"
|
|
@@ -285,4 +299,20 @@ For complete terms: [SCF Terms & Conditions](https://securecontrolsframework.com
|
|
|
285
299
|
|
|
286
300
|
---
|
|
287
301
|
|
|
302
|
+
## More Open Source from Ansvar
|
|
303
|
+
|
|
304
|
+
We maintain a family of MCP servers for compliance and security professionals:
|
|
305
|
+
|
|
306
|
+
| Server | Description | Install |
|
|
307
|
+
|--------|-------------|---------|
|
|
308
|
+
| **[EU Regulations](https://github.com/Ansvar-Systems/EU_compliance_MCP)** | 47 EU regulations (GDPR, AI Act, DORA, NIS2, MiFID II, eIDAS, MDR...) | `npx @ansvar/eu-regulations-mcp` |
|
|
309
|
+
| **[US Regulations](https://github.com/Ansvar-Systems/US_Compliance_MCP)** | HIPAA, CCPA, SOX, GLBA, FERPA, COPPA, FDA 21 CFR Part 11, state privacy laws | `npx @ansvar/us-regulations-mcp` |
|
|
310
|
+
| **[OT Security](https://github.com/Ansvar-Systems/ot-security-mcp)** | IEC 62443, NIST 800-82, MITRE ATT&CK for ICS | `npx @ansvar/ot-security-mcp` |
|
|
311
|
+
| **[Automotive](https://github.com/Ansvar-Systems/Automotive-MCP)** | UNECE R155/R156, ISO 21434 for automotive cybersecurity | `npx @ansvar/automotive-cybersecurity-mcp` |
|
|
312
|
+
| **[Sanctions](https://github.com/Ansvar-Systems/Sanctions-MCP)** | Offline sanctions screening with OpenSanctions (30+ lists) | `pip install ansvar-sanctions-mcp` |
|
|
313
|
+
|
|
314
|
+
Browse all projects: [ansvar.eu/open-source](https://ansvar.eu/open-source)
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
288
318
|
**Built by:** [Ansvar Systems](https://ansvar.eu) (Stockholm, Sweden)
|
|
@@ -48,9 +48,7 @@ class TestPathTraversalPrevention:
|
|
|
48
48
|
resolved = standard_path.resolve()
|
|
49
49
|
assert resolved != system_file, f"Path traversal escaped to system file {system_file}!"
|
|
50
50
|
|
|
51
|
-
# The
|
|
52
|
-
if resolved == system_file:
|
|
53
|
-
pytest.fail("Critical: Path traversal attack succeeded!")
|
|
51
|
+
# The assertion above already verified this - no redundant check needed
|
|
54
52
|
|
|
55
53
|
def test_standard_path_with_absolute_path_injection(self, tmp_path):
|
|
56
54
|
"""Ensure absolute paths don't bypass the standards directory."""
|
|
@@ -94,8 +92,9 @@ class TestPathTraversalPrevention:
|
|
|
94
92
|
try:
|
|
95
93
|
config.add_standard("test\x00evil", "path\x00/etc/passwd")
|
|
96
94
|
# If it doesn't raise, verify the path is safe
|
|
97
|
-
|
|
98
|
-
# Path should not be truncated at null byte
|
|
95
|
+
standard_path = config.get_standard_path("test\x00evil")
|
|
96
|
+
# Path should not be truncated at null byte - verify it's a valid path object
|
|
97
|
+
assert standard_path is not None or standard_path is None # Either is acceptable
|
|
99
98
|
except (ValueError, TypeError):
|
|
100
99
|
# Raising an error is also acceptable behavior
|
|
101
100
|
pass
|
|
@@ -232,7 +231,9 @@ class TestConfigSecurity:
|
|
|
232
231
|
|
|
233
232
|
# Should raise a clear error or create new config
|
|
234
233
|
try:
|
|
235
|
-
|
|
234
|
+
config = Config(config_dir=tmp_path)
|
|
235
|
+
# If no error raised, verify config was created with defaults
|
|
236
|
+
assert config is not None
|
|
236
237
|
except Exception as e:
|
|
237
238
|
# Should be a JSON decode error, not a security issue
|
|
238
239
|
assert "json" in str(type(e).__name__).lower() or "decode" in str(e).lower()
|
|
@@ -250,10 +251,9 @@ class TestConfigSecurity:
|
|
|
250
251
|
assert config.config_dir.exists()
|
|
251
252
|
|
|
252
253
|
# Check that others don't have write permission
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
# but documenting what they are
|
|
254
|
+
mode = config.config_dir.stat().st_mode
|
|
255
|
+
# Verify mode is a valid permission value (informational check)
|
|
256
|
+
assert mode > 0, "Invalid permission mode"
|
|
257
257
|
|
|
258
258
|
|
|
259
259
|
class TestDataIntegrity:
|
|
@@ -92,21 +92,24 @@ class TestModuleImports:
|
|
|
92
92
|
|
|
93
93
|
def test_import_main_package(self):
|
|
94
94
|
"""Can import main package."""
|
|
95
|
-
import
|
|
95
|
+
import importlib
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
pkg = importlib.import_module("security_controls_mcp")
|
|
98
|
+
assert pkg.__version__ == "0.3.4"
|
|
98
99
|
|
|
99
100
|
def test_import_server(self):
|
|
100
101
|
"""Can import server module."""
|
|
101
|
-
|
|
102
|
+
import importlib
|
|
102
103
|
|
|
104
|
+
server = importlib.import_module("security_controls_mcp.server")
|
|
103
105
|
assert hasattr(server, "app")
|
|
104
106
|
|
|
105
107
|
def test_import_data_loader(self):
|
|
106
108
|
"""Can import data loader."""
|
|
107
|
-
|
|
109
|
+
import importlib
|
|
108
110
|
|
|
109
|
-
|
|
111
|
+
data_loader = importlib.import_module("security_controls_mcp.data_loader")
|
|
112
|
+
assert hasattr(data_loader, "SCFData")
|
|
110
113
|
|
|
111
114
|
|
|
112
115
|
class TestPackageMetadata:
|
|
@@ -114,10 +117,11 @@ class TestPackageMetadata:
|
|
|
114
117
|
|
|
115
118
|
def test_version_defined(self):
|
|
116
119
|
"""Package version is defined."""
|
|
117
|
-
|
|
120
|
+
import importlib
|
|
118
121
|
|
|
119
|
-
|
|
120
|
-
assert
|
|
122
|
+
pkg = importlib.import_module("security_controls_mcp")
|
|
123
|
+
assert pkg.__version__ is not None
|
|
124
|
+
assert isinstance(pkg.__version__, str)
|
|
121
125
|
|
|
122
126
|
def test_pyproject_toml_exists(self):
|
|
123
127
|
"""pyproject.toml exists."""
|
|
@@ -237,7 +237,8 @@ async def check_mcp_protocol():
|
|
|
237
237
|
try:
|
|
238
238
|
process.terminate()
|
|
239
239
|
await process.wait()
|
|
240
|
-
except
|
|
240
|
+
except (ProcessLookupError, OSError):
|
|
241
|
+
# Process already terminated or not accessible - safe to ignore
|
|
241
242
|
pass
|
|
242
243
|
return False
|
|
243
244
|
|
|
@@ -298,7 +299,7 @@ async def main():
|
|
|
298
299
|
"""Run all verification checks."""
|
|
299
300
|
|
|
300
301
|
print(f"\n{Colors.BOLD}Security Controls MCP - Production Readiness Verification{Colors.END}")
|
|
301
|
-
print(f"{Colors.BOLD}Version: 0.3.
|
|
302
|
+
print(f"{Colors.BOLD}Version: 0.3.4{Colors.END}")
|
|
302
303
|
|
|
303
304
|
results = {}
|
|
304
305
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/cli.py
RENAMED
|
File without changes
|
{security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/data_loader.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/http_server.py
RENAMED
|
File without changes
|
|
File without changes
|
{security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/providers.py
RENAMED
|
File without changes
|
{security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/registry.py
RENAMED
|
File without changes
|
{security_controls_mcp-0.3.3 → security_controls_mcp-0.3.5}/src/security_controls_mcp/server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|