vulnfeed-mcp 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.
- vulnfeed_mcp-0.3.0/.gitignore +21 -0
- vulnfeed_mcp-0.3.0/MARKETPLACE-LISTING.md +65 -0
- vulnfeed_mcp-0.3.0/PKG-INFO +162 -0
- vulnfeed_mcp-0.3.0/POLAR-SETUP.md +42 -0
- vulnfeed_mcp-0.3.0/README.md +146 -0
- vulnfeed_mcp-0.3.0/SPEC.md +123 -0
- vulnfeed_mcp-0.3.0/claude-code-config.json +11 -0
- vulnfeed_mcp-0.3.0/landing/.wrangler/cache/pages.json +4 -0
- vulnfeed_mcp-0.3.0/landing/deploy.sh +44 -0
- vulnfeed_mcp-0.3.0/landing/index.html +261 -0
- vulnfeed_mcp-0.3.0/marketing/PLAN.md +114 -0
- vulnfeed_mcp-0.3.0/marketplace/listing.md +108 -0
- vulnfeed_mcp-0.3.0/pyproject.toml +26 -0
- vulnfeed_mcp-0.3.0/requirements.txt +1 -0
- vulnfeed_mcp-0.3.0/scanner.py +323 -0
- vulnfeed_mcp-0.3.0/server.py +887 -0
- vulnfeed_mcp-0.3.0/vulnfeed_mcp/__init__.py +3 -0
- vulnfeed_mcp-0.3.0/vulnfeed_mcp/__main__.py +3 -0
- vulnfeed_mcp-0.3.0/vulnfeed_mcp/server.py +891 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Never commit secrets
|
|
2
|
+
*.env
|
|
3
|
+
secrets.*
|
|
4
|
+
.env*
|
|
5
|
+
|
|
6
|
+
# OS / editor
|
|
7
|
+
.DS_Store
|
|
8
|
+
*.swp
|
|
9
|
+
*~
|
|
10
|
+
|
|
11
|
+
# Local working files
|
|
12
|
+
/tmp/
|
|
13
|
+
/.cache/
|
|
14
|
+
node_modules/
|
|
15
|
+
__pycache__/
|
|
16
|
+
*.pyc
|
|
17
|
+
.wrangler/
|
|
18
|
+
|
|
19
|
+
# Power Pack build artifacts (generated by build/build-zip.sh + build-guide.sh)
|
|
20
|
+
products/power-pack/dist/
|
|
21
|
+
products/power-pack/build/GUIDE.pdf
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# VulnFeed — Marketplace Listing Draft
|
|
2
|
+
|
|
3
|
+
Ready to submit to mcp.so, glama.ai, and the MCP Marketplace when licensing is resolved.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Short description (one line)
|
|
8
|
+
|
|
9
|
+
Dependency vulnerability monitoring with EPSS prioritization. Reads your lockfile, tells you what's actually exploitable.
|
|
10
|
+
|
|
11
|
+
## Description (full)
|
|
12
|
+
|
|
13
|
+
VulnFeed monitors your project's dependencies for known vulnerabilities using NVD, GitHub Advisories, and EPSS exploit probability data. Unlike raw CVE lookup tools, it knows your actual dependency tree and filters to only the vulnerabilities that affect you — prioritized by real-world exploitability.
|
|
14
|
+
|
|
15
|
+
**What it does:**
|
|
16
|
+
- Scans lockfiles (npm, pip, Go, Rust, Ruby, PHP) and reports vulnerabilities affecting your deps
|
|
17
|
+
- Prioritizes by EPSS — suppresses ~80% of noise (theoretical CVEs that are never exploited)
|
|
18
|
+
- Recommends exact fix versions from package registries
|
|
19
|
+
- Continuous monitoring: register a project once, check for new CVEs any time
|
|
20
|
+
- 9 tools covering the full security monitoring workflow
|
|
21
|
+
|
|
22
|
+
**Free tier:** 1 project, 10 scans/day
|
|
23
|
+
**Pro ($14/mo):** unlimited projects, unlimited scans, priority data sync
|
|
24
|
+
|
|
25
|
+
## Category
|
|
26
|
+
|
|
27
|
+
Security / DevOps
|
|
28
|
+
|
|
29
|
+
## Tags
|
|
30
|
+
|
|
31
|
+
security, vulnerabilities, CVE, dependencies, npm, python, go, rust, ruby, monitoring, EPSS
|
|
32
|
+
|
|
33
|
+
## Tools (9)
|
|
34
|
+
|
|
35
|
+
| Tool | Description |
|
|
36
|
+
|------|-------------|
|
|
37
|
+
| scan_lockfile | Scan a lockfile for known vulnerabilities |
|
|
38
|
+
| check_package | Check a single package for known vulns |
|
|
39
|
+
| lookup_cve | Detailed CVE info with EPSS + fix versions |
|
|
40
|
+
| scan_project | Auto-detect and scan all lockfiles in a project |
|
|
41
|
+
| monitor_project | Register for continuous vulnerability monitoring |
|
|
42
|
+
| check_alerts | Check for new vulns since last scan |
|
|
43
|
+
| list_monitored | List all monitored projects |
|
|
44
|
+
| update_deps | Update dep snapshot after package upgrades |
|
|
45
|
+
| unmonitor_project | Remove a project from monitoring |
|
|
46
|
+
|
|
47
|
+
## Transport
|
|
48
|
+
|
|
49
|
+
- stdio (local, recommended)
|
|
50
|
+
- SSE (remote/team access)
|
|
51
|
+
|
|
52
|
+
## Requirements
|
|
53
|
+
|
|
54
|
+
- Python 3.10+
|
|
55
|
+
- `mcp` package (`pip install mcp`)
|
|
56
|
+
- VulnFeed API key (from purchase)
|
|
57
|
+
|
|
58
|
+
## Author
|
|
59
|
+
|
|
60
|
+
Novadyne (an Infai company)
|
|
61
|
+
|
|
62
|
+
## Links
|
|
63
|
+
|
|
64
|
+
- Landing page: https://vulnfeed.novadyne.ai
|
|
65
|
+
- Purchase: PURCHASE_URL_HERE
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vulnfeed-mcp
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Dependency vulnerability monitoring MCP server — knows your lockfile, prioritizes by EPSS exploit probability, recommends fix versions.
|
|
5
|
+
Project-URL: Homepage, https://vulnfeed.novadyne.ai
|
|
6
|
+
Author-email: Novadyne <support@infaicorp.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Keywords: cve,epss,mcp,security,vulnerability
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Topic :: Security
|
|
12
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
13
|
+
Requires-Python: >=3.10
|
|
14
|
+
Requires-Dist: mcp>=1.0
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
|
|
17
|
+
# VulnFeed — Security MCP Server
|
|
18
|
+
|
|
19
|
+
Vulnerability scanning and continuous monitoring for Claude Code. Monitors your project's dependencies against NVD, GitHub Advisories, and EPSS exploit data.
|
|
20
|
+
|
|
21
|
+
## Setup
|
|
22
|
+
|
|
23
|
+
1. Install the MCP Python SDK:
|
|
24
|
+
```bash
|
|
25
|
+
pip install mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
2. Add to your Claude Code settings (`.claude/settings.json` or `~/.claude/settings.json`):
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"vulnfeed": {
|
|
33
|
+
"type": "stdio",
|
|
34
|
+
"command": "python3",
|
|
35
|
+
"args": ["/path/to/server.py"],
|
|
36
|
+
"env": {
|
|
37
|
+
"VULNFEED_WORKER_URL": "https://...",
|
|
38
|
+
"VULNFEED_API_KEY": "your-key"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
3. Restart Claude Code. The tools are now available.
|
|
46
|
+
|
|
47
|
+
### Remote mode (SSE)
|
|
48
|
+
|
|
49
|
+
Run as a remote server for shared/team access:
|
|
50
|
+
```bash
|
|
51
|
+
python3 server.py --transport sse --host 0.0.0.0 --port 8383
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Then connect from Claude Code settings:
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"mcpServers": {
|
|
58
|
+
"vulnfeed": {
|
|
59
|
+
"type": "sse",
|
|
60
|
+
"url": "http://your-server:8383/sse"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Or set `VULNFEED_TRANSPORT=sse` to default to SSE mode.
|
|
67
|
+
|
|
68
|
+
## Tools
|
|
69
|
+
|
|
70
|
+
### Scanning
|
|
71
|
+
|
|
72
|
+
#### `scan_lockfile`
|
|
73
|
+
Scan a specific lockfile for vulnerabilities.
|
|
74
|
+
```
|
|
75
|
+
scan_lockfile(lockfile_path="/path/to/package-lock.json")
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### `check_package`
|
|
79
|
+
Check a single package for known vulnerabilities.
|
|
80
|
+
```
|
|
81
|
+
check_package(name="express", version="4.17.1", ecosystem="npm")
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### `lookup_cve`
|
|
85
|
+
Get detailed info on a specific vulnerability.
|
|
86
|
+
```
|
|
87
|
+
lookup_cve(cve_id="CVE-2024-29041")
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### `scan_project`
|
|
91
|
+
Auto-detect and scan all lockfiles in a project directory.
|
|
92
|
+
```
|
|
93
|
+
scan_project(project_path="/path/to/project")
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Monitoring
|
|
97
|
+
|
|
98
|
+
#### `monitor_project`
|
|
99
|
+
Register a project for continuous vulnerability monitoring. Takes a baseline snapshot of current dependencies and known vulns.
|
|
100
|
+
```
|
|
101
|
+
monitor_project(project_path="/path/to/project", project_name="my-app")
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
#### `check_alerts`
|
|
105
|
+
Check for new vulnerabilities since the last scan. Returns only vulns that weren't in the baseline.
|
|
106
|
+
```
|
|
107
|
+
check_alerts(project_id="f47e98b0e47a")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### `list_monitored`
|
|
111
|
+
List all projects registered for monitoring.
|
|
112
|
+
```
|
|
113
|
+
list_monitored()
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### `update_deps`
|
|
117
|
+
Update the dependency snapshot after upgrading packages (e.g. after `npm update`).
|
|
118
|
+
```
|
|
119
|
+
update_deps(project_id="f47e98b0e47a", project_path="/path/to/project")
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### `unmonitor_project`
|
|
123
|
+
Remove a project from monitoring.
|
|
124
|
+
```
|
|
125
|
+
unmonitor_project(project_id="f47e98b0e47a")
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Supported lockfiles
|
|
129
|
+
|
|
130
|
+
- `package-lock.json` (npm)
|
|
131
|
+
- `yarn.lock` (Yarn)
|
|
132
|
+
- `pnpm-lock.yaml` (pnpm)
|
|
133
|
+
- `Pipfile.lock` (Pipenv)
|
|
134
|
+
- `requirements.txt` (pip)
|
|
135
|
+
- `go.sum` / `go.mod` (Go)
|
|
136
|
+
- `Cargo.lock` (Rust / crates.io)
|
|
137
|
+
- `Gemfile.lock` (Ruby / RubyGems)
|
|
138
|
+
- `composer.lock` (PHP / Packagist)
|
|
139
|
+
|
|
140
|
+
## Smart filtering
|
|
141
|
+
|
|
142
|
+
By default, VulnFeed suppresses low-priority CVEs (EPSS < 10% exploit probability AND CVSS < 9.0). This cuts noise by ~80% — most CVEs are theoretical, not actively exploited.
|
|
143
|
+
|
|
144
|
+
To see everything, pass `show_all=True` to any scan tool:
|
|
145
|
+
```
|
|
146
|
+
scan_lockfile(lockfile_path="package-lock.json", show_all=True)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## How it works
|
|
150
|
+
|
|
151
|
+
1. Parses your lockfile to extract dependency names + versions
|
|
152
|
+
2. Batch-queries OSV.dev (which includes NVD + GitHub Advisories)
|
|
153
|
+
3. Enriches each vulnerability with EPSS exploit probability scores
|
|
154
|
+
4. Filters by exploitability — suppresses low-EPSS, non-critical CVEs by default
|
|
155
|
+
5. Sorts results by exploitability — the CVEs most likely to be used in real attacks appear first
|
|
156
|
+
6. Returns fix version recommendations from package registries
|
|
157
|
+
|
|
158
|
+
### Monitoring flow
|
|
159
|
+
|
|
160
|
+
1. `monitor_project` scans your deps and stores a baseline (known vulns + dep versions)
|
|
161
|
+
2. `check_alerts` re-scans against the same dep list and diffs — new vulns that appeared since last check are surfaced, resolved vulns are noted
|
|
162
|
+
3. Run `check_alerts` periodically (e.g. daily) to catch newly published CVEs affecting your deps
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# VulnFeed — Polar.sh Setup (Nat-side, ~10 min)
|
|
2
|
+
|
|
3
|
+
Polar.sh handles licensing + payments for VulnFeed subscriptions. Free signup, 4% transaction fee.
|
|
4
|
+
|
|
5
|
+
## Steps
|
|
6
|
+
|
|
7
|
+
1. **Sign up at [polar.sh](https://polar.sh)** — use `natburke@infaicorp.com` or your preferred email. Create an organization (e.g., "Novadyne" or "Infai").
|
|
8
|
+
|
|
9
|
+
2. **Create a Product:**
|
|
10
|
+
- Name: VulnFeed
|
|
11
|
+
- Type: Subscription (recurring)
|
|
12
|
+
- Price: $14/mo
|
|
13
|
+
- Add a "License Key" benefit — this auto-generates keys for each subscriber
|
|
14
|
+
|
|
15
|
+
3. **Copy two values back to Discord:**
|
|
16
|
+
- **Organization ID** — found in Settings → Developer → Organization ID (UUID format)
|
|
17
|
+
- **Product URL** — the checkout link for VulnFeed (Polar provides a hosted checkout page)
|
|
18
|
+
|
|
19
|
+
4. Agent will:
|
|
20
|
+
- PUT the Organization ID to the Worker as `POLAR_ORG_ID`
|
|
21
|
+
- Substitute the checkout URL into the landing page (replacing `PURCHASE_URL_HERE`)
|
|
22
|
+
- Deploy the updated landing page
|
|
23
|
+
- The license key validation code is already built and waiting
|
|
24
|
+
|
|
25
|
+
## How it works (already built)
|
|
26
|
+
|
|
27
|
+
- Buyer completes checkout on Polar.sh → gets a license key
|
|
28
|
+
- Buyer sets `VULNFEED_API_KEY` in their MCP config to this key
|
|
29
|
+
- MCP server sends the key to the Worker on each request
|
|
30
|
+
- Worker validates against Polar.sh API, caches valid keys for 24h in KV
|
|
31
|
+
- Free tier (no key): 10 scans/day, 1 monitored project
|
|
32
|
+
- Paid tier: unlimited scans and projects
|
|
33
|
+
|
|
34
|
+
## What's NOT needed from you
|
|
35
|
+
|
|
36
|
+
- No API key/token needed — Polar.sh's validation endpoint is unauthenticated (safe for public clients)
|
|
37
|
+
- No webhook setup needed for MVP — validation is on-demand, not event-driven
|
|
38
|
+
- Custom domain live at `vulnfeed.novadyne.ai` (also accessible at `vulnfeed.pages.dev`)
|
|
39
|
+
|
|
40
|
+
## Timeline
|
|
41
|
+
|
|
42
|
+
Once you post the Org ID + product URL in Discord, the agent will wire everything up in one wake (~15 min of work). VulnFeed goes live immediately after.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# VulnFeed — Security MCP Server
|
|
2
|
+
|
|
3
|
+
Vulnerability scanning and continuous monitoring for Claude Code. Monitors your project's dependencies against NVD, GitHub Advisories, and EPSS exploit data.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
1. Install the MCP Python SDK:
|
|
8
|
+
```bash
|
|
9
|
+
pip install mcp
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
2. Add to your Claude Code settings (`.claude/settings.json` or `~/.claude/settings.json`):
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"mcpServers": {
|
|
16
|
+
"vulnfeed": {
|
|
17
|
+
"type": "stdio",
|
|
18
|
+
"command": "python3",
|
|
19
|
+
"args": ["/path/to/server.py"],
|
|
20
|
+
"env": {
|
|
21
|
+
"VULNFEED_WORKER_URL": "https://...",
|
|
22
|
+
"VULNFEED_API_KEY": "your-key"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
3. Restart Claude Code. The tools are now available.
|
|
30
|
+
|
|
31
|
+
### Remote mode (SSE)
|
|
32
|
+
|
|
33
|
+
Run as a remote server for shared/team access:
|
|
34
|
+
```bash
|
|
35
|
+
python3 server.py --transport sse --host 0.0.0.0 --port 8383
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Then connect from Claude Code settings:
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"vulnfeed": {
|
|
43
|
+
"type": "sse",
|
|
44
|
+
"url": "http://your-server:8383/sse"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Or set `VULNFEED_TRANSPORT=sse` to default to SSE mode.
|
|
51
|
+
|
|
52
|
+
## Tools
|
|
53
|
+
|
|
54
|
+
### Scanning
|
|
55
|
+
|
|
56
|
+
#### `scan_lockfile`
|
|
57
|
+
Scan a specific lockfile for vulnerabilities.
|
|
58
|
+
```
|
|
59
|
+
scan_lockfile(lockfile_path="/path/to/package-lock.json")
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### `check_package`
|
|
63
|
+
Check a single package for known vulnerabilities.
|
|
64
|
+
```
|
|
65
|
+
check_package(name="express", version="4.17.1", ecosystem="npm")
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### `lookup_cve`
|
|
69
|
+
Get detailed info on a specific vulnerability.
|
|
70
|
+
```
|
|
71
|
+
lookup_cve(cve_id="CVE-2024-29041")
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
#### `scan_project`
|
|
75
|
+
Auto-detect and scan all lockfiles in a project directory.
|
|
76
|
+
```
|
|
77
|
+
scan_project(project_path="/path/to/project")
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Monitoring
|
|
81
|
+
|
|
82
|
+
#### `monitor_project`
|
|
83
|
+
Register a project for continuous vulnerability monitoring. Takes a baseline snapshot of current dependencies and known vulns.
|
|
84
|
+
```
|
|
85
|
+
monitor_project(project_path="/path/to/project", project_name="my-app")
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
#### `check_alerts`
|
|
89
|
+
Check for new vulnerabilities since the last scan. Returns only vulns that weren't in the baseline.
|
|
90
|
+
```
|
|
91
|
+
check_alerts(project_id="f47e98b0e47a")
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### `list_monitored`
|
|
95
|
+
List all projects registered for monitoring.
|
|
96
|
+
```
|
|
97
|
+
list_monitored()
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### `update_deps`
|
|
101
|
+
Update the dependency snapshot after upgrading packages (e.g. after `npm update`).
|
|
102
|
+
```
|
|
103
|
+
update_deps(project_id="f47e98b0e47a", project_path="/path/to/project")
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### `unmonitor_project`
|
|
107
|
+
Remove a project from monitoring.
|
|
108
|
+
```
|
|
109
|
+
unmonitor_project(project_id="f47e98b0e47a")
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Supported lockfiles
|
|
113
|
+
|
|
114
|
+
- `package-lock.json` (npm)
|
|
115
|
+
- `yarn.lock` (Yarn)
|
|
116
|
+
- `pnpm-lock.yaml` (pnpm)
|
|
117
|
+
- `Pipfile.lock` (Pipenv)
|
|
118
|
+
- `requirements.txt` (pip)
|
|
119
|
+
- `go.sum` / `go.mod` (Go)
|
|
120
|
+
- `Cargo.lock` (Rust / crates.io)
|
|
121
|
+
- `Gemfile.lock` (Ruby / RubyGems)
|
|
122
|
+
- `composer.lock` (PHP / Packagist)
|
|
123
|
+
|
|
124
|
+
## Smart filtering
|
|
125
|
+
|
|
126
|
+
By default, VulnFeed suppresses low-priority CVEs (EPSS < 10% exploit probability AND CVSS < 9.0). This cuts noise by ~80% — most CVEs are theoretical, not actively exploited.
|
|
127
|
+
|
|
128
|
+
To see everything, pass `show_all=True` to any scan tool:
|
|
129
|
+
```
|
|
130
|
+
scan_lockfile(lockfile_path="package-lock.json", show_all=True)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## How it works
|
|
134
|
+
|
|
135
|
+
1. Parses your lockfile to extract dependency names + versions
|
|
136
|
+
2. Batch-queries OSV.dev (which includes NVD + GitHub Advisories)
|
|
137
|
+
3. Enriches each vulnerability with EPSS exploit probability scores
|
|
138
|
+
4. Filters by exploitability — suppresses low-EPSS, non-critical CVEs by default
|
|
139
|
+
5. Sorts results by exploitability — the CVEs most likely to be used in real attacks appear first
|
|
140
|
+
6. Returns fix version recommendations from package registries
|
|
141
|
+
|
|
142
|
+
### Monitoring flow
|
|
143
|
+
|
|
144
|
+
1. `monitor_project` scans your deps and stores a baseline (known vulns + dep versions)
|
|
145
|
+
2. `check_alerts` re-scans against the same dep list and diffs — new vulns that appeared since last check are surfaced, resolved vulns are noted
|
|
146
|
+
3. Run `check_alerts` periodically (e.g. daily) to catch newly published CVEs affecting your deps
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Bet B — Security Feed MCP
|
|
2
|
+
|
|
3
|
+
**Product:** VulnFeed (working name) — a paid MCP server that monitors your dependencies for vulnerabilities and tells you what actually matters.
|
|
4
|
+
|
|
5
|
+
**Price:** $14/mo
|
|
6
|
+
|
|
7
|
+
**One-liner:** Snyk-grade vulnerability intelligence for $14/mo, native to Claude Code.
|
|
8
|
+
|
|
9
|
+
## What it is
|
|
10
|
+
|
|
11
|
+
An MCP server that knows your project's dependencies (by reading your lockfile) and continuously monitors NVD, GitHub Advisories, and EPSS data. When a new CVE drops that affects your actual deps, it tells you: what's vulnerable, how likely it is to be exploited, and exactly which version to upgrade to.
|
|
12
|
+
|
|
13
|
+
## What it is NOT
|
|
14
|
+
|
|
15
|
+
A raw CVE lookup tool. There are 6+ free MCP servers that wrap NVD's API. We don't compete with them on data access — we compete on signal-to-noise.
|
|
16
|
+
|
|
17
|
+
## Why someone pays
|
|
18
|
+
|
|
19
|
+
1. **Context-aware.** Free servers answer "tell me about CVE-2026-XXXX." VulnFeed answers "am I vulnerable right now?" It knows your `package-lock.json` / `requirements.txt` / `go.sum` and filters to only the CVEs that hit your actual dependency tree.
|
|
20
|
+
|
|
21
|
+
2. **Prioritized.** EPSS (Exploit Prediction Scoring System) scores every CVE by real-world exploitability. Most CVEs are noise — EPSS cuts the alert volume by ~80%. VulnFeed surfaces the ones likely to be exploited, not every theoretical vuln.
|
|
22
|
+
|
|
23
|
+
3. **Actionable.** Not just "you're vulnerable" but "upgrade `express` from 4.18.2 → 4.21.0 to fix CVE-2026-XXXX (EPSS: 0.73, CVSS: 9.1)." Cross-references package registries (npm, PyPI, Go) for fix versions.
|
|
24
|
+
|
|
25
|
+
4. **Always-on.** Maintains a persistent watch list. New CVE published at 3am? Indexed by 3:15am. Your morning coding session knows about it without you asking.
|
|
26
|
+
|
|
27
|
+
5. **Cheap.** Snyk Team is $25/dev/mo. GitHub Advanced Security is $49/committer/mo. VulnFeed is $14/mo flat — not per-seat.
|
|
28
|
+
|
|
29
|
+
## Competitive positioning
|
|
30
|
+
|
|
31
|
+
| | Free MCP servers | Snyk/Socket ($25-49/dev/mo) | VulnFeed ($14/mo) |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| CVE lookup | ✅ | ✅ | ✅ |
|
|
34
|
+
| Knows your deps | ❌ | ✅ | ✅ |
|
|
35
|
+
| EPSS prioritization | ❌ | ✅ | ✅ |
|
|
36
|
+
| Fix recommendations | ❌ | ✅ | ✅ |
|
|
37
|
+
| Continuous monitoring | ❌ | ✅ | ✅ |
|
|
38
|
+
| MCP-native | ✅ | ❌ | ✅ |
|
|
39
|
+
| Auto-fix PRs | ❌ | ✅ | ❌ (v2) |
|
|
40
|
+
| Per-seat pricing | n/a | ✅ (expensive) | ❌ (flat) |
|
|
41
|
+
|
|
42
|
+
## Architecture
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
User's Claude Code session
|
|
46
|
+
↓ MCP tool call
|
|
47
|
+
VulnFeed MCP Server (Cloudflare Worker)
|
|
48
|
+
├── /scan — reads lockfile, returns vulns affecting your deps
|
|
49
|
+
├── /monitor — registers a project for continuous monitoring
|
|
50
|
+
├── /alerts — returns new vulns since last check
|
|
51
|
+
└── /cve/{id} — detailed CVE info with fix recommendation
|
|
52
|
+
↓
|
|
53
|
+
Data layer (Worker KV / D1)
|
|
54
|
+
├── NVD feed (synced hourly)
|
|
55
|
+
├── GitHub Advisories (synced hourly)
|
|
56
|
+
├── EPSS scores (synced daily)
|
|
57
|
+
└── Package registry metadata (npm, PyPI, Go — cached)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Runs entirely on Cloudflare Workers + KV/D1. No server to maintain. Data sync runs on Worker Cron Triggers.
|
|
61
|
+
|
|
62
|
+
## Build plan
|
|
63
|
+
|
|
64
|
+
### v0.1 (wake #46) — MVP ✅
|
|
65
|
+
- [x] Worker `/vulnscan/query` endpoint: batch OSV.dev + EPSS enrichment
|
|
66
|
+
- [x] `/vulnscan/cve/{id}` endpoint: detailed CVE with fix versions
|
|
67
|
+
- [x] Python CLI scanner: lockfile parser + prioritized report
|
|
68
|
+
|
|
69
|
+
### v0.2 (wake #47) — MCP Server ✅
|
|
70
|
+
- [x] FastMCP server with stdio transport: scan_lockfile, check_package, lookup_cve, scan_project
|
|
71
|
+
- [x] Support for package-lock.json, requirements.txt, go.sum, yarn.lock, Pipfile.lock
|
|
72
|
+
|
|
73
|
+
### v0.3 (wake #48) — Monitoring ✅
|
|
74
|
+
- [x] `POST /vulnscan/monitor`: register project, store dep snapshot in KV
|
|
75
|
+
- [x] `GET /vulnscan/alerts`: diff current CVEs against stored snapshot
|
|
76
|
+
- [x] `PUT /vulnscan/monitor/:id`: update deps, preserve vuln history
|
|
77
|
+
- [x] MCP tools: monitor_project, check_alerts, update_deps, list_monitored, unmonitor_project
|
|
78
|
+
- [x] Landing page draft (products/security-mcp/landing/index.html)
|
|
79
|
+
|
|
80
|
+
### v1.0 (~1 wake) — Ship
|
|
81
|
+
- [x] EPSS-based smart prioritization (suppress CVEs below 0.1 EPSS unless CVSS ≥ 9) — wake #49
|
|
82
|
+
- [x] SSE transport for remote MCP connections — wake #49
|
|
83
|
+
- [x] License key validation code (Polar.sh integration) — wake #51, activates on POLAR_ORG_ID
|
|
84
|
+
- [x] Deploy landing page to vulnfeed.pages.dev — wake #51
|
|
85
|
+
- [x] Custom domain: vulnfeed.novadyne.ai — wake #56
|
|
86
|
+
- [x] Substitute Polar.sh purchase URL into landing page — wake #57
|
|
87
|
+
- [x] Set POLAR_ORG_ID on Worker — wake #57
|
|
88
|
+
- [x] Free tier auth fix (route order bug: general auth gate blocked free-tier vulnscan requests) — wake #59
|
|
89
|
+
- [ ] Listing on mcp.so + glama.ai + Smithery (listing content drafted, manual submission needed)
|
|
90
|
+
- [ ] MCP Marketplace listing (free tier: 1 project, 10 scans/day)
|
|
91
|
+
|
|
92
|
+
## Metrics
|
|
93
|
+
|
|
94
|
+
| Metric | Target | Timeframe |
|
|
95
|
+
|--------|--------|-----------|
|
|
96
|
+
| MCP Marketplace installs | 100 | 30 days post-listing |
|
|
97
|
+
| Free-to-paid conversion | 5-8% | 60 days |
|
|
98
|
+
| Paid subscribers | 50 | 60 days post-listing |
|
|
99
|
+
| MRR | $700 | 60 days |
|
|
100
|
+
| Churn | <10%/mo | After month 2 |
|
|
101
|
+
|
|
102
|
+
## Kill criteria
|
|
103
|
+
|
|
104
|
+
- <20 paid users after 90 days of listing
|
|
105
|
+
- <50 free installs after 30 days (no organic interest)
|
|
106
|
+
- Upstream data costs exceed revenue (shouldn't happen — all sources are free)
|
|
107
|
+
- Anthropic ships native vulnerability scanning in Claude Code
|
|
108
|
+
|
|
109
|
+
## Brand / marketing
|
|
110
|
+
|
|
111
|
+
**Novadyne umbrella (Nat 09:30Z).** Nat clarified: novadyne is the AI product umbrella (accounting, ledger, now MCP), infai is novadyne's parent company. Security MCP goes under novadyne alongside the bookkeeping assistant — unified AI product brand. Product name: VulnFeed by Novadyne. Marketing via @InfaiHq (parent-company channel) until novadyne has its own presence.
|
|
112
|
+
|
|
113
|
+
## Upstream costs
|
|
114
|
+
|
|
115
|
+
$0 ongoing:
|
|
116
|
+
- NVD API: free (no key needed, <5 req/30s)
|
|
117
|
+
- GitHub Advisory DB: free (public GraphQL)
|
|
118
|
+
- EPSS: free (open data, daily CSV)
|
|
119
|
+
- npm/PyPI/Go registries: free (public APIs)
|
|
120
|
+
- Cloudflare Workers: free tier covers initial traffic
|
|
121
|
+
- D1 database: free tier (5GB, 5M reads/day)
|
|
122
|
+
|
|
123
|
+
Revenue breakeven: first subscriber.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Deploys the VulnFeed landing page to Cloudflare Pages.
|
|
3
|
+
# Project: vulnfeed (to be created on first deploy).
|
|
4
|
+
# Production URL: https://vulnfeed.novadyne.ai (also: https://vulnfeed.pages.dev)
|
|
5
|
+
#
|
|
6
|
+
# Required env (export before running):
|
|
7
|
+
# CLOUDFLARE_API_TOKEN
|
|
8
|
+
# CLOUDFLARE_ACCOUNT_ID
|
|
9
|
+
#
|
|
10
|
+
# On first deploy, create the Pages project first:
|
|
11
|
+
# curl -X POST "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/pages/projects" \
|
|
12
|
+
# -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
|
|
13
|
+
# -H "Content-Type: application/json" \
|
|
14
|
+
# -d '{"name":"vulnfeed","production_branch":"main"}'
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
PROJECT_NAME=${PROJECT_NAME:-vulnfeed}
|
|
19
|
+
BRANCH=${BRANCH:-main}
|
|
20
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
21
|
+
|
|
22
|
+
: "${CLOUDFLARE_API_TOKEN:?CLOUDFLARE_API_TOKEN required}"
|
|
23
|
+
: "${CLOUDFLARE_ACCOUNT_ID:?CLOUDFLARE_ACCOUNT_ID required}"
|
|
24
|
+
|
|
25
|
+
echo "Deploying $SCRIPT_DIR to Pages project '$PROJECT_NAME' (branch=$BRANCH)..."
|
|
26
|
+
npx --yes wrangler@latest pages deploy "$SCRIPT_DIR" \
|
|
27
|
+
--project-name="$PROJECT_NAME" \
|
|
28
|
+
--branch="$BRANCH" \
|
|
29
|
+
--commit-dirty=true
|
|
30
|
+
|
|
31
|
+
echo
|
|
32
|
+
echo "Production: https://${PROJECT_NAME}.pages.dev"
|
|
33
|
+
echo "Latest deployment:"
|
|
34
|
+
curl -fsS -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
|
|
35
|
+
"https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/pages/projects/$PROJECT_NAME/deployments" \
|
|
36
|
+
| python3 -c "
|
|
37
|
+
import json,sys
|
|
38
|
+
d=json.load(sys.stdin)
|
|
39
|
+
for dep in d.get('result',[])[:1]:
|
|
40
|
+
print(f\" {dep.get('id')[:8]} {dep.get('environment')} {dep.get('url')}\")
|
|
41
|
+
for s in dep.get('stages',[]):
|
|
42
|
+
if s.get('name') == 'deploy':
|
|
43
|
+
print(f\" deploy stage: {s.get('status')}\")
|
|
44
|
+
"
|