Microsoft GitHub Advisory MCP Server
OfficialProvides tools for querying GitHub Security Advisories, allowing users to list and retrieve details about advisories across various ecosystems (npm, pip, maven, etc.) from the GitHub Advisory Database.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Microsoft GitHub Advisory MCP ServerList high-severity npm advisories"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Microsoft GitHub Advisory MCP Server
MCP server for querying GitHub Security Advisories from a local cloned advisory database.
Architecture
Two-Tier Design:
┌─────────────────────────────────────┐
│ MCP Server (stdio or HTTP) │ Port: 18006 (HTTP mode)
│ - list_advisories tool │
│ - get_advisory tool │
└──────────┬──────────────────────────┘
│ calls internally
┌──────────▼──────────────────────────┐
│ Local Express REST API │ Port: 18005
│ GET /health │
│ GET /advisories │
│ GET /advisories/:ghsa_id │
│ GET /search?q=<query> │
└──────────┬──────────────────────────┘
│ reads from
┌──────────▼──────────────────────────┐
│ LocalRepositoryDataSource │
│ Reads JSON files from: │
│ external/advisory-database/ │
└─────────────────────────────────────┘Quick Start (VS Code + GitHub Copilot)
For users who just want to use the MCP server in VS Code:
Clone and Setup:
git clone https://github.com/microsoft/github-advisory-mcp.git
cd github-advisory-mcp
npm install
npm run buildThe
.vscode/mcp.jsonis pre-configured:
{
"servers": {
"advisory": {
"command": "node",
"args": ["${workspaceFolder}/dist/index.js"],
"type": "stdio",
"env": {
"ADVISORY_REPO_PATH": "${workspaceFolder}/external/advisory-database"
}
}
}
}Reload VS Code - Copilot will automatically:
Clone the advisory database (~310K advisories) on first use
Enable MCP tools:
list_advisories,get_advisory
Test in Copilot Chat:
@workspace Find high-severity npm advisories related to expressDone! The MCP server runs automatically when Copilot needs it.
Setup (Advanced)
1. Install Dependencies
npm install
npm run build2. Database Setup (Optional - Auto-clones on first use)
# Linux/Mac (manual pre-clone)
./scripts/setup-advisory-database.sh
# Windows (manual pre-clone)
git clone --depth=1 https://github.com/github/advisory-database.git external/advisory-databaseThe database will auto-clone on first MCP tool call if not present.
Usage
Start Server (HTTP Streaming Mode)
Windows:
.\Start.ps1
# or with custom ports:
.\Start.ps1 -McpPort 18006 -ApiPort 18005Manual Start:
$env:ADVISORY_REPO_PATH = "C:\path\to\advisory-database"
$env:MCP_PORT = "18006"
$env:ADVISORY_API_PORT = "18005"
node dist\http-server.jsStart Server (stdio Mode)
ADVISORY_REPO_PATH=/path/to/advisory-database node dist/index.jsTesting
Quick Test (Copilot Chat)
After setup, test in VS Code Copilot Chat:
@workspace /tests What tools does the advisory MCP server provide?Or query advisories directly:
@workspace Find critical npm advisories from 2024
@workspace Get details for GHSA-jc85-fpwf-qm7xUnit Tests (Automated)
npm test # All tests
npm run test:e2e # E2E tests (18 tests, ~9.5s after database cached)Health Checks
# MCP Server Health
Invoke-RestMethod http://localhost:18006/health
# Local API Health
Invoke-RestMethod http://localhost:18005/healthTest Local REST API Directly
List advisories by ecosystem:
Invoke-RestMethod "http://localhost:18005/advisories?ecosystem=npm&per_page=5"Get specific advisory:
Invoke-RestMethod "http://localhost:18005/advisories/GHSA-jc85-fpwf-qm7x"Search advisories:
Invoke-RestMethod "http://localhost:18005/search?q=express"Test MCP Tools
Initialize Session:
$body = @{
jsonrpc = "2.0"
id = 1
method = "initialize"
params = @{
protocolVersion = "2024-11-05"
capabilities = @{}
clientInfo = @{ name = "test-client"; version = "1.0.0" }
}
} | ConvertTo-Json -Depth 10
$response = Invoke-RestMethod -Uri "http://localhost:18006/mcp" -Method POST -Body $body -ContentType "application/json"
$sessionId = $response.result.sessionIdList Tools:
$body = @{
jsonrpc = "2.0"
id = 2
method = "tools/list"
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:18006/mcp" -Method POST -Body $body -ContentType "application/json" -Headers @{"Mcp-Session-Id"=$sessionId}Call list_advisories:
$body = @{
jsonrpc = "2.0"
id = 3
method = "tools/call"
params = @{
name = "list_advisories"
arguments = @{
ecosystem = "npm"
severity = "high"
per_page = 5
}
}
} | ConvertTo-Json -Depth 10
Invoke-RestMethod -Uri "http://localhost:18006/mcp" -Method POST -Body $body -ContentType "application/json" -Headers @{"Mcp-Session-Id"=$sessionId}Environment Variables
Variable | Default | Description |
|
| Path to cloned advisory-database repository |
|
| Port for MCP HTTP server |
|
| Port for local REST API |
|
| Host for local REST API |
|
| Base URL for MCP tools to call local API |
MCP Tools
list_advisories
List security advisories with optional filters.
Parameters:
ghsa_id(string): GHSA identifiercve_id(string): CVE identifierecosystem(enum): Package ecosystem (npm, pip, maven, etc.)severity(enum): Severity level (low, medium, high, critical, unknown)cwes(string): Comma-separated CWE identifiersis_withdrawn(boolean): Filter withdrawn advisoriesaffects(string): Package name filterpublished(string): Published date filterupdated(string): Updated date filterper_page(number): Results per page (max 100)direction(enum): Sort direction (asc, desc)sort(enum): Sort field (updated, published)
Example:
{
"ecosystem": "npm",
"severity": "critical",
"per_page": 10
}get_advisory
Get detailed information about a specific advisory.
Parameters:
ghsa_id(string, required): GHSA identifier (e.g., GHSA-xxxx-xxxx-xxxx)
Example:
{
"ghsa_id": "GHSA-jc85-fpwf-qm7x"
}Security & Validation
Input Validation
All MCP tool parameters are validated using Zod schemas:
list_advisories validation:
ecosystem: Enum of valid ecosystems (npm, pip, maven, etc.) - prevents injectionseverity: Enum (low, medium, high, critical, unknown) - prevents injectionper_page: Number constrained to 1-100 max - prevents resource exhaustioncwes: String pattern matching for CWE identifiers - validates formatDate filters: ISO 8601 format validation
get_advisory validation:
ghsa_id: Pattern matchGHSA-xxxx-xxxx-xxxx- prevents path traversalRequired field enforcement - rejects empty/null values
File System Protection:
Path validation: Script execution paths validated against known safe scripts
No user-supplied paths accepted - prevents directory traversal
Read-only database access - no write operations exposed
Rate Limiting
Current: No rate limiting (stdio transport = single local user)
Considerations:
stdio mode: Single-process, single-user - no rate limiting needed
HTTP mode: Consider adding rate limiting if exposed beyond localhost
Database queries: Inherently rate-limited by disk I/O (310K+ files)
Future (HTTP mode):
// Example: express-rate-limit for HTTP endpoints
import rateLimit from 'express-rate-limit';
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
});
app.use('/mcp', limiter);Session Security
Timeout: 30-minute automatic session cleanup
Isolation: Each MCP session isolated (no shared state)
Transport: stdio (local) or HTTP (localhost-only by default)
Known Security Measures
✅ Path validation for script execution (prevents command injection)
✅ Zod schema validation (prevents type confusion attacks)
✅ Session timeout (prevents resource leaks)
✅ Read-only database access (no write exposure)
✅ Enum validation for critical parameters (prevents injection)
⚠️ No rate limiting (stdio mode = trusted local user)
⚠️ No authentication (stdio mode = local process trust model)
Integration with Orchestrator
The MCP Advisory server can be integrated with orchestration platforms:
from mcp import ClientSession
from mcp.client.stdio import stdio_client
# Connect to MCP Advisory server
async with stdio_client(
command="node",
args=["dist/index.js"],
env={
"ADVISORY_REPO_PATH": "/path/to/advisory-database"
}
) as (read, write):
async with ClientSession(read, write) as session:
# List npm advisories
result = await session.call_tool(
"list_advisories",
arguments={"ecosystem": "npm", "per_page": 10}
)Port Allocation
18005: Local REST API (Express server)
18006: MCP HTTP streaming endpoint
Avoids conflicts with:
18004: MCP Coder
3333: Inspector MCP
3500: Memory Service
Troubleshooting
Database Clone Failures
Issue: git clone fails for advisory-database
fatal: unable to access 'https://github.com/github/advisory-database.git/': Could not resolve hostSolutions:
Check network connectivity:
ping github.comUse VPN if behind corporate firewall
Pre-download database:
git clone --depth=1 https://github.com/github/advisory-database.git external/advisory-databasePoint to existing database:
export ADVISORY_REPO_PATH=/path/to/existing/advisory-database
Timing: Initial clone takes 2-5 minutes (310K+ files, ~500MB)
Server Won't Start
Issue: Error: EADDRINUSE: address already in use
Solution:
# Check what's using the port
lsof -i :18005 # Local API
lsof -i :18006 # MCP server
# Kill process
kill -9 <PID>Windows-Specific Issues
Issue: Bash script fails on Windows
./scripts/setup-advisory-database.sh
# bash: ./scripts/setup-advisory-database.sh: No such file or directorySolution: Use Git Bash or WSL, or manual clone:
git clone --depth=1 https://github.com/github/advisory-database.git external/advisory-databaseMCP Tools Not Available in Copilot
Issue: Copilot doesn't see advisory MCP tools
Solution:
Verify
.vscode/mcp.jsonexists in workspace rootReload VS Code:
Ctrl+Shift+P→ "Developer: Reload Window"Check build:
npm run buildand verifydist/index.jsexistsCheck Copilot logs:
Ctrl+Shift+P→ "Developer: Open Logs Folder"
Query Performance Issues
Symptom: Slow advisory queries (>5 seconds)
Solutions:
First query always slower (loads database index into memory)
Use
per_pageparameter to limit results:per_page: 10Filter by ecosystem to reduce search space:
ecosystem: "npm"Check disk I/O: Advisory database is 310K+ files
Performance Benchmarks:
First query (cold start): 2-4 seconds (index load)
Subsequent queries: 50-200ms (cached)
Database size: ~500MB, 310,635 files
Database Update Strategy
Automated Updates:
The advisory database auto-updates on server start via git pull in setup script.
Manual Update:
cd external/advisory-database
git pull origin mainUpdate Frequency: GitHub updates advisory-database multiple times daily
Known Issues
Windows
The bash script
setup-advisory-database.shdoesn't work on WindowsWorkaround: Manually clone database or use existing one via
ADVISORY_REPO_PATHUse
Start.ps1script for convenient startup
Database Size
The advisory-database is ~100K+ JSON files
Shallow clone (
--depth=1) recommendedFirst query loads entire index into memory (lazy loading)
Subsequent queries are fast (cached)
Development
CI/CD Pipeline
GitHub Actions Workflows:
Build Validation (
.github/workflows/build.yml)Triggers: Push to main/dev, PRs
Matrix: Node.js 18.x, 20.x on Ubuntu latest
Steps: Checkout → Setup Node → npm ci → Build → Verify artifacts
Timing: ~27-33 seconds
Copilot PR Review (
.github/workflows/copilot-review.yml)Triggers: PR opened or synchronized
Action: Automatically requests Copilot code review
Permissions: pull-requests: write, contents: read
Benefit: Automated AI code review on every PR
Timing Estimates:
npm ci: ~10 seconds (dependency install)
npm run build: ~4 seconds (TypeScript compilation)
Total CI time: ~27-33 seconds
Note: Tests are not run in CI (yet) because:
Database clone takes 2-5 minutes (310K+ files)
Would increase CI time to ~6-7 minutes per run
Consider separate "full test" workflow for main branch only
Watch Mode:
npm run devClean Build:
npm run clean
npm run buildFile Structure:
services/mcp/advisory/
├── src/
│ ├── index.ts # stdio entry point
│ ├── http-server.ts # HTTP streaming server
│ ├── server.ts # MCP server factory
│ ├── local-server.ts # Express REST API
│ ├── datasources/
│ │ └── local-repository.ts # LocalRepositoryDataSource
│ ├── tools/
│ │ └── advisories.ts # MCP tools (list/get)
│ └── types/
│ └── data-source.ts # TypeScript interfaces
├── dist/ # Compiled JavaScript
├── external/
│ └── advisory-database/ # Git submodule (cloned)
├── scripts/
│ └── setup-advisory-database.sh
├── package.json
├── tsconfig.json
├── Start.ps1 # Windows startup script
└── README.mdTesting Status
✅ Working:
TypeScript compilation
HTTP server startup (port 18006)
Local REST API (port 18005)
Health endpoints
Advisory listing with filters
Getting specific advisory by GHSA ID
Ecosystem filtering (npm, pip, etc.)
Pagination
⏳ Not Yet Tested:
MCP tool calls (list_advisories, get_advisory)
Session management
stdio mode
Multiple concurrent sessions
Search functionality
Contributing
This project does not accept external contributions (pull requests) at this time. Only verified committers from the Microsoft GitHub organization may contribute code.
If you would like to get involved:
Report bugs or request features by opening an issue
Reach out to the maintainers at opencode@microsoft.com
See CONTRIBUTING.md for details.
Trademarks
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/microsoft/github-advisory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server