Baction's picture
Updating app.py
f8bff51
---
title: Vulnerability Scanner MCP Server
emoji: 🦀
colorFrom: pink
colorTo: yellow
sdk: gradio
sdk_version: 5.49.0
app_file: app.py
pinned: false
---
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
# Vulnerability Scanner MCP Server
This repository contains a small Gradio-based MCP server that provides three tools to inspect GitHub repositories using the GitHub REST API:
- Get basic repository information
- Retrieve the decoded content of a single file
- Scan a repository for source code files with specific extensions (returns a list of file paths)
The application is implemented in `app.py` and exposes a Gradio TabbedInterface with three API endpoints: `get_repository_info`, `get_file_content`, and `scan_repository`.
## Requirements
The project uses Python and the dependencies listed in `requirements.txt`. Key requirements used by the app are:
- gradio (with mcp support)
- requests
- python-dotenv
On Windows with PowerShell, create a virtual environment and install requirements:
```powershell
python -m venv .venv; .\.venv\Scripts\Activate.ps1; pip install -r requirements.txt
```
If you prefer cmd.exe use:
```cmd
python -m venv .venv && .\.venv\Scripts\activate.bat && pip install -r requirements.txt
```
## Environment variables
The application requires a GitHub personal access token to access the GitHub API. Create a `.env` file in the project root with the following variable:
```
GITHUB_TOKEN=ghp_...your_token_here
```
The token must have permission to read the repositories you want to inspect (public repos are readable with a token that has no special scopes; private repos require appropriate scopes).
## Running the server
Start the app directly with Python. The Gradio interface will launch and expose the MCP API endpoints:
```powershell
python app.py
```
When run, the app prints startup information and launches Gradio in MCP server mode. By default Gradio will open a local web UI and also expose the MCP API endpoints used by other MCP clients.
## Endpoints and usage
The Gradio interface exposes three tools (functions) via the MCP server and also as interactive UI tabs:
1) get_repository_info
Inputs:
- Repository Owner (e.g. `octocat`)
- Repository Name (e.g. `Hello-World`)
Output: A JSON-like text block containing repository metadata (name, full_name, description, primary_language, size_kb, stars, forks, default_branch, created_date, last_updated, is_private, clone_url).
2) get_file_content
Inputs:
- Repository Owner
- Repository Name
- File Path (e.g. `README.md`)
Output: Decoded file contents as plain text. If the file is binary or cannot be decoded, an error message is returned.
3) scan_repository
Inputs:
- Repository Owner
- Repository Name
- File Extensions (comma-separated, default: `.py,.js,.ts,.php,.java`)
Output: A list of file paths (limited to the first 50 matching files) found in the repository with the given extensions.
Notes and edge-cases:
- The code uses the GitHub REST API and will return HTTP error messages when repositories or files are not found or when the token lacks permissions.
- `get_file_content` decodes base64 file content returned by the GitHub API and will return an error string for binary files.
- `scan_repository` recursively traverses directories and limits results to avoid returning extremely large listings.
## Example
After starting the server, open the Gradio UI. From the UI you can call the three tools. Example programmatic calls are possible via the Gradio API endpoints; however this README focuses on interactive use through the launched UI (the functions are registered with `api_name` values matching their function names).
## Development notes
- The GitHub token is mandatory; the application raises ValueError if `GITHUB_TOKEN` is not present in the environment.
- The app limits recursion results to avoid deep scans; adjust `_scan_directory_sync` if you need more files or different limits.
## License
This project does not include a license file in the repository. Add a LICENSE if you plan to publish or share this code.