mcppt 1.0.0__tar.gz → 1.0.2__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 (31) hide show
  1. {mcppt-1.0.0 → mcppt-1.0.2}/PKG-INFO +10 -3
  2. {mcppt-1.0.0 → mcppt-1.0.2}/README.md +9 -2
  3. mcppt-1.0.2/mcppt/__init__.py +1 -0
  4. {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/cli.py +3 -0
  5. {mcppt-1.0.0 → mcppt-1.0.2}/pyproject.toml +1 -1
  6. mcppt-1.0.2/wbs_mcppt_result.md +130 -0
  7. mcppt-1.0.0/mcppt/__init__.py +0 -1
  8. {mcppt-1.0.0 → mcppt-1.0.2}/.github/workflows/ci.yml +0 -0
  9. {mcppt-1.0.0 → mcppt-1.0.2}/.gitignore +0 -0
  10. {mcppt-1.0.0 → mcppt-1.0.2}/LICENSE +0 -0
  11. {mcppt-1.0.0 → mcppt-1.0.2}/OPERATOR_GUIDE.md +0 -0
  12. {mcppt-1.0.0 → mcppt-1.0.2}/app.py +0 -0
  13. {mcppt-1.0.0 → mcppt-1.0.2}/docs/MCPTROTTER_ARTICLE.md +0 -0
  14. {mcppt-1.0.0 → mcppt-1.0.2}/docs/MCPTROTTER_MEDIUM.md +0 -0
  15. {mcppt-1.0.0 → mcppt-1.0.2}/docs/mcptrotter.jpeg +0 -0
  16. {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/checks.py +0 -0
  17. {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/core.py +0 -0
  18. {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/report.py +0 -0
  19. {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/server.py +0 -0
  20. {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/shell.py +0 -0
  21. {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/tui.py +0 -0
  22. {mcppt-1.0.0 → mcppt-1.0.2}/requirements.txt +0 -0
  23. {mcppt-1.0.0 → mcppt-1.0.2}/smoke_test.py +0 -0
  24. {mcppt-1.0.0 → mcppt-1.0.2}/test_report.md +0 -0
  25. {mcppt-1.0.0 → mcppt-1.0.2}/test_server.log +0 -0
  26. {mcppt-1.0.0 → mcppt-1.0.2}/test_server.py +0 -0
  27. {mcppt-1.0.0 → mcppt-1.0.2}/tests/__init__.py +0 -0
  28. {mcppt-1.0.0 → mcppt-1.0.2}/tests/test_checks.py +0 -0
  29. {mcppt-1.0.0 → mcppt-1.0.2}/tests/test_core.py +0 -0
  30. {mcppt-1.0.0 → mcppt-1.0.2}/vuln_server.py +0 -0
  31. {mcppt-1.0.0 → mcppt-1.0.2}/wbs_scan_report.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcppt
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: MCPTROTTER — MCP Pentest Tool: 28 automated security checks for MCP servers
5
5
  Project-URL: Homepage, https://github.com/gurudeepmallam-cmd/mcppt
6
6
  Project-URL: Repository, https://github.com/gurudeepmallam-cmd/mcppt
@@ -32,10 +32,11 @@ Description-Content-Type: text/markdown
32
32
  # MCPTROTTER — MCP Pentest Tool
33
33
 
34
34
  <p align="center">
35
- <b>28 automated security checks for any MCP server.<br>Pure Python. No AI key needed. No Docker. No Kali.</b>
35
+ <img src="https://raw.githubusercontent.com/gurudeepmallam-cmd/mcppt/main/docs/mcptrotter.jpeg" alt="MCPTROTTER" width="380"/>
36
36
  </p>
37
37
 
38
38
  <p align="center">
39
+ <img src="https://img.shields.io/pypi/v/mcppt?label=PyPI&color=orange"/>
39
40
  <img src="https://img.shields.io/badge/python-3.10%2B-blue"/>
40
41
  <img src="https://img.shields.io/badge/checks-28-red"/>
41
42
  <img src="https://img.shields.io/badge/license-MIT-green"/>
@@ -67,13 +68,19 @@ Works against any MCP server using Streamable HTTP transport (POST + SSE respons
67
68
 
68
69
  ## Install
69
70
 
71
+ **From PyPI (recommended):**
72
+ ```bash
73
+ pip install mcppt
74
+ ```
75
+
76
+ **From source:**
70
77
  ```bash
71
78
  git clone https://github.com/gurudeepmallam-cmd/mcppt
72
79
  cd mcppt/mcppt_tool
73
80
  pip install -e .
74
81
  ```
75
82
 
76
- Requires Python 3.10+. Core scanner uses only stdlib — `urllib`, `ssl`, `json`. `rich` is for the TUI shell only.
83
+ Requires Python 3.10+.
77
84
 
78
85
  ---
79
86
 
@@ -1,10 +1,11 @@
1
1
  # MCPTROTTER — MCP Pentest Tool
2
2
 
3
3
  <p align="center">
4
- <b>28 automated security checks for any MCP server.<br>Pure Python. No AI key needed. No Docker. No Kali.</b>
4
+ <img src="https://raw.githubusercontent.com/gurudeepmallam-cmd/mcppt/main/docs/mcptrotter.jpeg" alt="MCPTROTTER" width="380"/>
5
5
  </p>
6
6
 
7
7
  <p align="center">
8
+ <img src="https://img.shields.io/pypi/v/mcppt?label=PyPI&color=orange"/>
8
9
  <img src="https://img.shields.io/badge/python-3.10%2B-blue"/>
9
10
  <img src="https://img.shields.io/badge/checks-28-red"/>
10
11
  <img src="https://img.shields.io/badge/license-MIT-green"/>
@@ -36,13 +37,19 @@ Works against any MCP server using Streamable HTTP transport (POST + SSE respons
36
37
 
37
38
  ## Install
38
39
 
40
+ **From PyPI (recommended):**
41
+ ```bash
42
+ pip install mcppt
43
+ ```
44
+
45
+ **From source:**
39
46
  ```bash
40
47
  git clone https://github.com/gurudeepmallam-cmd/mcppt
41
48
  cd mcppt/mcppt_tool
42
49
  pip install -e .
43
50
  ```
44
51
 
45
- Requires Python 3.10+. Core scanner uses only stdlib — `urllib`, `ssl`, `json`. `rich` is for the TUI shell only.
52
+ Requires Python 3.10+.
46
53
 
47
54
  ---
48
55
 
@@ -0,0 +1 @@
1
+ __version__ = "1.0.2"
@@ -48,6 +48,9 @@ def cmd_scan(args: argparse.Namespace) -> None:
48
48
 
49
49
  checks = [c.strip() for c in args.checks.split(",")]
50
50
  run_all = "all" in checks
51
+ # enum must always run first — other checks depend on the tool list it builds
52
+ if not run_all and "enum" not in checks:
53
+ checks = ["enum"] + checks
51
54
  total = len(ALL_CHECKS) if run_all else len([c for c in checks if c in ALL_CHECKS])
52
55
 
53
56
  state = ScanState(
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mcppt"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "MCPTROTTER — MCP Pentest Tool: 28 automated security checks for MCP servers"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,130 @@
1
+ # MCPPT Security Scan Report
2
+
3
+ **Target:** `https://qmcp.wbsautomation.deloitte.com/`
4
+ **Date:** 2026-06-08 11:33 UTC
5
+ **Duration:** 114.8s
6
+
7
+ ## Summary
8
+
9
+ | Severity | Count |
10
+ | --- | --- |
11
+ | [CRIT] CRITICAL | 1 |
12
+ | [HIGH] HIGH | 4 |
13
+ | [MED] MEDIUM | 2 |
14
+ | [LOW] LOW | 3 |
15
+
16
+ ## Findings
17
+
18
+ ### 1. [MED] [MEDIUM] tools/list accessible without Authorization header
19
+
20
+ **Check:** `enum`
21
+ **Severity:** MEDIUM
22
+
23
+ Returned 25 tools: ['get_material_options_by_market_offering', 'wbs_automation_check_publish_status', 'get_missing_mandatory_fields_with_options', 'get_invoice_details', 'get_field_info', 'get_field_description', 'get_all_market_offering_categories', 'get_wbs_form_by_id', 'search_information_with_prefilter_from_provider', 'get_market_offering_subcategories']
24
+
25
+ ---
26
+
27
+ ### 2. [LOW] [LOW] No rate limiting — 30/30 requests in 45.1s
28
+
29
+ **Check:** `rate`
30
+ **Severity:** LOW
31
+
32
+ Server may be vulnerable to DoS via tool call flooding
33
+
34
+ ---
35
+
36
+ ### 3. [HIGH] [HIGH] Replay confirmed on 'get_material_options_by_market_offering'
37
+
38
+ **Check:** `replay`
39
+ **Severity:** HIGH
40
+
41
+ Identical request accepted twice with same req_id — no nonce/timestamp protection
42
+
43
+ ---
44
+
45
+ ### 4. [CRIT] [CRITICAL] Replay confirmed on WRITE tool 'wbs_automation_check_publish_status'
46
+
47
+ **Check:** `replay`
48
+ **Severity:** CRITICAL
49
+
50
+ Destructive tool accepted replayed request — attacker can replay captured requests
51
+
52
+ ---
53
+
54
+ ### 5. [MED] [MEDIUM] Context overflow: get_material_options_by_market_offering accepts 10,000-char payload
55
+
56
+ **Check:** `context_overflow`
57
+ **Severity:** MEDIUM
58
+
59
+ Attack: write max-size content → agent reads it → LLM context window overwhelmed → system prompt / guardrail instructions truncated
60
+
61
+ ---
62
+
63
+ ### 6. [HIGH] [HIGH] Weak session ID: Non-UUID/non-hex format: 'ixr6d3hIUVkjgz0lbTelQA'
64
+
65
+ **Check:** `session`
66
+ **Severity:** HIGH
67
+
68
+ Predictable IDs allow session hijacking. Fix: CSPRNG ≥128-bit entropy (UUID v4)
69
+
70
+ ---
71
+
72
+ ### 7. [LOW] [LOW] Missing security headers: X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Content-Security-Policy, Permissions-Policy
73
+
74
+ **Check:** `headers`
75
+ **Severity:** LOW
76
+
77
+ These headers reduce XSS, clickjacking, and info-leakage risk
78
+
79
+ ---
80
+
81
+ ### 8. [LOW] [LOW] HSTS max-age too short: 16070400s (< 1 year)
82
+
83
+ **Check:** `headers`
84
+ **Severity:** LOW
85
+
86
+ Recommend max-age ≥ 31536000 with includeSubDomains
87
+
88
+ ---
89
+
90
+ ### 9. [HIGH] [HIGH] CORS preflight allows arbitrary origins
91
+
92
+ **Check:** `headers`
93
+ **Severity:** HIGH
94
+
95
+ Origin 'https://evil.attacker.com' was reflected/allowed in preflight
96
+
97
+ ---
98
+
99
+ ### 10. [HIGH] [HIGH] Resources accessible without auth — 6 items returned
100
+
101
+ **Check:** `resources`
102
+ **Severity:** HIGH
103
+
104
+ Unauthenticated resources/list — may expose data / system prompt templates
105
+
106
+ ---
107
+
108
+ ## Remediation Reference
109
+
110
+ | Check | Risk | Fix |
111
+ | --- | --- | --- |
112
+ | `enum` | Info disclosure | Require auth on `tools/list` |
113
+ | `auth` | Auth bypass | Validate Bearer token server-side on every tool call |
114
+ | `idor` | Data exposure | Scope resource access to the authenticated user |
115
+ | `injection` | Prompt injection | Sanitise/escape all user-supplied strings before returning to LLM |
116
+ | `schema` | Input validation | Enforce strict type validation at the MCP server layer |
117
+ | `ssrf` | SSRF | Block RFC-1918/link-local URLs; use allowlist for external fetches |
118
+ | `publish` | Unconfirmed action | Enforce confirmation gate in MCP layer, not only in agent prompt |
119
+ | `rate` | DoS | Add rate limiting per token/IP |
120
+ | `stored` | Stored injection | Escape stored content before returning in tool responses |
121
+ | `scope` | Privilege escalation | Enforce token scopes server-side per tool |
122
+ | `replay` | Replay | Add per-request nonce or timestamp window validation |
123
+ | `context_overflow` | Context hijack | Enforce max field length at ingestion |
124
+ | `poison_all` | Injection | Sanitise every response field, not just primary content |
125
+ | `tenant` | Data leak | Scope cache keys and storage to tenant/user ID |
126
+ | `session` | Session hijack | Use CSPRNG ≥128-bit entropy for session IDs (UUID v4) |
127
+ | `rug_pull` | Supply chain | Pin tool versions; alert on description changes |
128
+
129
+ ---
130
+ _Generated by [MCPPT](https://github.com/gurudeepmallam-cmd/mcppt) v2.0_
@@ -1 +0,0 @@
1
- __version__ = "1.0.0"
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
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
File without changes
File without changes