Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
d1010c6
change v0 -> v0.1
debbiephilips-00 Oct 16, 2025
ba2ad82
v0 -> v0.1 doc and test changes
debbiephilips-00 Oct 16, 2025
20ee7c9
using a constant variable
debbiephilips-00 Oct 16, 2025
952acd0
api version to the improt script
debbiephilips-00 Oct 16, 2025
ded8b48
removed version from readme.md
debbiephilips-00 Oct 16, 2025
f07df48
replace v0 to ANTHROPIC_API_VERSION in md
debbiephilips-00 Oct 16, 2025
144e157
fixed the syntax error
debbiephilips-00 Oct 16, 2025
42fc9ea
changed name back to v0
debbiephilips-00 Oct 16, 2025
642afde
reverting release notes change
debbiephilips-00 Oct 16, 2025
8908266
changed v0.1 to {ANTHROPIC_API_VERSION}
debbiephilips-00 Oct 16, 2025
411b0d3
move v0.1 -> v0
debbiephilips-00 Oct 16, 2025
b937596
v0.1 -> v0
debbiephilips-00 Oct 16, 2025
edf5cea
more updates for uniformity
debbiephilips-00 Oct 16, 2025
27a63ff
docker changes
debbiephilips-00 Oct 16, 2025
1d1b02e
updated readme.md
debbiephilips-00 Oct 16, 2025
2e89224
updated docs/anthropic-registry-import.md
debbiephilips-00 Oct 16, 2025
435cc8e
updated anthropic_registry_spi.md
debbiephilips-00 Oct 16, 2025
1af93d8
updated design docs
debbiephilips-00 Oct 16, 2025
eae7fc3
changed {REGISTRY_CONSTANTS.ANTHROPIC_API_VERSION} to v0.1 in design …
debbiephilips-00 Oct 16, 2025
a8ed13e
removed date and issue number
debbiephilips-00 Oct 16, 2025
2c002e4
renamed v0_routes -> registry_routes
debbiephilips-00 Oct 16, 2025
0853529
renamed test_v0_routes to test_registry_routes
debbiephilips-00 Oct 16, 2025
1f99a31
refactored
debbiephilips-00 Oct 16, 2025
a6af9ce
changed import name from v0_router to registry_router
debbiephilips-00 Oct 16, 2025
d6992d3
updates to md file
debbiephilips-00 Oct 16, 2025
674232c
changed {{API_VERSION}} to {{{ANTHROPIC_API_VERSION}}
debbiephilips-00 Oct 16, 2025
f273ad8
Merge branch 'main' of github.com:nishadeborahphilips/mcp-gateway-reg…
debbiephilips-00 Oct 17, 2025
5d7501f
cisco security scanner
debbiephilips-00 Oct 17, 2025
fe02adc
added llm to default analyzer
debbiephilips-00 Oct 17, 2025
dfbea7f
setting MCP_SCANNER_LLM_API_KEY to env variable
debbiephilips-00 Oct 17, 2025
1692267
reverting llm change
debbiephilips-00 Oct 17, 2025
07dc4d8
both yara and llm
debbiephilips-00 Oct 19, 2025
12a877e
added #Security scans to gitignore
debbiephilips-00 Oct 19, 2025
2a8a95a
checking for placeholder value
debbiephilips-00 Oct 19, 2025
5f9bcb1
Add security scanning enhancements and workflow improvements
aarora79 Oct 22, 2025
926b03c
Update security scanner documentation
aarora79 Oct 22, 2025
4253588
Fix health checks and tool fetching for Cloudflare and streamable-htt…
aarora79 Oct 24, 2025
cfaa54a
Update security scanner documentation with screenshot reference
aarora79 Oct 24, 2025
1067625
Replace specific domain with example.com in security scanner docs
aarora79 Oct 24, 2025
b064e31
Render example report summary as markdown instead of code block
aarora79 Oct 24, 2025
412c457
Remove redundant installation note from prerequisites
aarora79 Oct 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,12 @@ SMITHERY_API_KEY=your_smithery_api_key_here
# Get this from https://console.anthropic.com/
ANTHROPIC_API_KEY=your_anthropic_api_key_here

# MCP Security Scanner LLM API Key (optional - only needed for LLM-based security analysis)
# Default analyzer is YARA (no API key required)
# To use LLM analyzer: ./cli/service_mgmt.sh add config.json yara,llm
# Get OpenAI API key from https://platform.openai.com/api-keys
MCP_SCANNER_LLM_API_KEY=your_openai_api_key_here

# =============================================================================
# CONTAINER REGISTRY CREDENTIALS (for CI/CD and local builds)
# =============================================================================
Expand Down
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,9 @@ cookies.txt
# Scratchpad for temporary notes and planning
.scratchpad/

# Roo IDE files
.roo/

# OAuth tokens and credentials - never commit these!
.oauth-tokens/
.agentcore-params
Expand Down Expand Up @@ -281,4 +284,7 @@ coverage/

# Anthropic registry temporary files
anthropic_servers_*.json
curated_import_list.txt
curated_import_list.txt

#Security scans
security_scans/
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ The **MCP Gateway & Registry** is an enterprise-ready platform that centralizes

## What's New

- **🔒 MCP Server Security Scanning** - Integrated vulnerability scanning with Cisco AI Defence MCP Scanner. Automatic security scans during server registration, periodic registry-wide scans with detailed markdown reports, and automatic disabling of servers with security issues.
- **📥 Import Servers from Anthropic MCP Registry** - Import curated MCP servers from Anthropic's registry with a single command. [Import Guide](docs/anthropic-registry-import.md)
- **🔌 Anthropic MCP Registry REST API Compatibility** - Full compatibility with Anthropic's MCP Registry REST API specification. [API Documentation](docs/anthropic_registry_api.md)
- **🚀 Pre-built Images** - Deploy instantly with pre-built Docker images. [Get Started](#option-a-pre-built-images-instant-setup) | [macOS Guide](docs/macos-setup-guide.md)
Expand Down Expand Up @@ -373,6 +374,14 @@ Seamlessly integrate with Anthropic's official MCP Registry to import and access

[Import Guide](docs/anthropic-registry-import.md) | [Registry API Documentation](docs/anthropic_registry_api.md)

### Security Scanning

**Integrated Vulnerability Detection:**
- **Automated Security Scanning** - Integrated vulnerability scanning for MCP servers using Cisco AI Defence MCP Scanner, with automatic scans during registration and support for periodic registry-wide scans
- **Detailed Security Reports** - Comprehensive markdown reports with vulnerability details, severity assessments, and remediation recommendations
- **Automatic Protection** - Servers with security issues are automatically disabled with security-pending status to protect your infrastructure
- **Compliance Ready** - Security audit trails and vulnerability tracking for enterprise compliance requirements

### Authentication & Authorization

**Multiple Identity Modes:**
Expand Down
4 changes: 4 additions & 0 deletions auth_server/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -846,7 +846,11 @@ async def validate_request(request: Request):

try:
# Extract headers
# Check for X-Authorization first (custom header used by this gateway)
# Only if X-Authorization is not present, check standard Authorization header
authorization = request.headers.get("X-Authorization")
if not authorization:
authorization = request.headers.get("Authorization")
cookie_header = request.headers.get("Cookie", "")
user_pool_id = request.headers.get("X-User-Pool-Id")
client_id = request.headers.get("X-Client-Id")
Expand Down
7 changes: 7 additions & 0 deletions cli/examples/cloudflare-docs-server-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"server_name": "Cloudflare Documentation MCP Server",
"description": "Search Cloudflare documentation and get migration guides",
"path": "/cloudflare-docs",
"proxy_pass_url": "https://docs.mcp.cloudflare.com/mcp",
"supported_transports": ["streamable-http"]
}
3 changes: 2 additions & 1 deletion cli/examples/minimal-server-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
"server_name": "Minimal MCP Server",
"description": "A minimal server configuration with only required fields",
"path": "/minimal-server",
"proxy_pass_url": "http://minimal-server:9001/"
"proxy_pass_url": "http://minimal-server:9001/",
"supported_transports": ["streamable-http"]
}
50 changes: 43 additions & 7 deletions cli/import_from_anthropic_registry.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
# and registers them with the local MCP Gateway Registry.
#
# Usage:
# ./import_from_anthropic_registry.sh [--dry-run] [--import-list <file>]
# ./import_from_anthropic_registry.sh [--dry-run] [--import-list <file>] [--analyzers <analyzers>]
#
# Environment Variables:
# GATEWAY_URL - Gateway URL (default: http://localhost)
# Example: export GATEWAY_URL=https://mcpgateway.ddns.net
# MCP_SCANNER_LLM_API_KEY - API key for LLM-based security analysis (required if using llm analyzer)
#

set -e
Expand Down Expand Up @@ -87,17 +88,37 @@ validate_package() {
# Parse arguments
DRY_RUN=false
IMPORT_LIST="$SCRIPT_DIR/import_server_list.txt"
ANALYZERS="yara"

while [[ $# -gt 0 ]]; do
case $1 in
--dry-run) DRY_RUN=true; shift ;;
--import-list) IMPORT_LIST="$2"; shift 2 ;;
--analyzers) ANALYZERS="$2"; shift 2 ;;
--help)
echo "Usage: $0 [--dry-run] [--import-list <file>]"
echo "Usage: $0 [--dry-run] [--import-list <file>] [--analyzers <analyzers>]"
echo ""
echo "Options:"
echo " --dry-run Dry run mode (don't register servers)"
echo " --import-list <file> Server list file (default: import_server_list.txt)"
echo " --analyzers <list> Security analyzers: yara, llm, or yara,llm (default: yara)"
echo ""
echo "Environment Variables:"
echo " GATEWAY_URL - Gateway URL (default: http://localhost)"
echo " Example: export GATEWAY_URL=https://mcpgateway.ddns.net"
echo " MCP_SCANNER_LLM_API_KEY - API key for LLM analyzer (required if using llm)"
echo ""
echo "Examples:"
echo " # Import with default YARA analyzer"
echo " $0"
echo ""
echo " # Import with both YARA and LLM analyzers"
echo " export MCP_SCANNER_LLM_API_KEY=sk-..."
echo " $0 --analyzers yara,llm"
echo ""
echo " # Import with only LLM analyzer"
echo " export MCP_SCANNER_LLM_API_KEY=sk-..."
echo " $0 --analyzers llm"
exit 0 ;;
*) echo "Unknown option: $1"; exit 1 ;;
esac
Expand All @@ -108,6 +129,21 @@ command -v jq >/dev/null || { print_error "jq required"; exit 1; }
command -v curl >/dev/null || { print_error "curl required"; exit 1; }
[ -f "$IMPORT_LIST" ] || { print_error "Import list not found: $IMPORT_LIST"; exit 1; }

# Check if LLM analyzer is requested and API key is available
if [[ "$ANALYZERS" == *"llm"* ]]; then
if [ -z "$MCP_SCANNER_LLM_API_KEY" ] || [[ "$MCP_SCANNER_LLM_API_KEY" == *"your_"* ]] || [[ "$MCP_SCANNER_LLM_API_KEY" == *"placeholder"* ]]; then
echo ""
print_error "LLM analyzer requested but MCP_SCANNER_LLM_API_KEY is not configured"
print_info "Current value: ${MCP_SCANNER_LLM_API_KEY:-<not set>}"
print_info ""
print_info "Options:"
print_info " 1. Add real API key to .env file: MCP_SCANNER_LLM_API_KEY=sk-..."
print_info " 2. Set environment variable: export MCP_SCANNER_LLM_API_KEY=sk-..."
print_info " 3. Use only YARA analyzer: $0 --analyzers yara"
exit 1
fi
fi

mkdir -p "$TEMP_DIR"

# Read server list
Expand All @@ -119,6 +155,7 @@ while IFS= read -r line; do
done < "$IMPORT_LIST"

print_info "Found ${#servers[@]} servers to import"
print_info "Security analyzers: $ANALYZERS"

# Process each server
success_count=0
Expand Down Expand Up @@ -192,10 +229,9 @@ result['path'] = '/$safe_path'

# Remove unsupported fields for register_service tool
# The user-facing register_service tool only supports basic fields
# Note: auth_type, auth_provider, and headers are now kept for proper auth handling
# Note: auth_type, auth_provider, headers, supported_transports, and tool_list are kept
unsupported_fields = [
'repository_url', 'website_url', 'package_npm', 'remote_url',
'supported_transports', 'tool_list'
'repository_url', 'website_url', 'package_npm', 'remote_url'
]
for field in unsupported_fields:
result.pop(field, None)
Expand All @@ -209,14 +245,14 @@ with open('$config_file', 'w') as f:

# Register with service_mgmt.sh (if not dry run)
if [ "$DRY_RUN" = false ]; then
if GATEWAY_URL="$GATEWAY_URL" "$SCRIPT_DIR/service_mgmt.sh" add "$config_file"; then
if GATEWAY_URL="$GATEWAY_URL" "$SCRIPT_DIR/service_mgmt.sh" add "$config_file" "$ANALYZERS"; then
print_success "Registered $server_name"
success_count=$((success_count + 1))
else
print_error "Failed to register $server_name"
fi
else
print_info "[DRY RUN] Would register $server_name"
print_info "[DRY RUN] Would register $server_name with analyzers: $ANALYZERS"
success_count=$((success_count + 1))
fi

Expand Down
Loading
Loading