An open-source repository for discovering and rating MCP (Model Context Protocol) servers. Browse, search, and review servers from the official MCP Registry.
- π Browse & Search - Discover MCP servers from the official registry with advanced filtering
- β Rate Servers - Share your experience with trustworthiness and usefulness ratings
- π Write Reviews - Leave detailed reviews to help others make informed decisions
- π Review Voting - Vote reviews as helpful or not helpful
- π Aggregated Ratings - See community ratings and reviews in real-time
- π€ Upload Servers - Community members can upload their own MCP servers
- π Official Servers - Admins can upload official servers representing organizations
- π GitHub Import - Auto-fill server forms by importing from GitHub repositories
- π Tools Markdown Upload - Upload tools markdown files to quickly populate tool definitions
- πΌοΈ Custom Icons - Upload custom icons for your servers (via Cloudflare R2)
- π Auto-Sync - Automatically syncs with the MCP Registry daily
- π Authentication - Sign in with GitHub or Google to rate servers
- π‘οΈ Security First - Built with rate limiting, CSRF protection, and input validation
- π± Responsive Design - Works seamlessly on desktop and mobile devices
- π Dark Mode - Beautiful dark theme support
- π GitHub Badges - Embed dynamic rating badges in your repository README
- Node.js 20+ (Download)
- PostgreSQL database (Neon free tier recommended)
- Git for cloning the repository
-
Clone the repository
git clone https://github.com/ggange/mcp-review.git cd mcp-review -
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env
Configure your
.envfile:# Database (Required) DATABASE_URL="postgresql://user:password@host:5432/database?sslmode=require" # NextAuth (Optional - only needed if using OAuth) NEXTAUTH_SECRET="your-secret-key-here" # Generate with: openssl rand -base64 32 NEXTAUTH_URL="http://localhost:3000" # GitHub OAuth (Optional - for development) GITHUB_ID="your-github-client-id" GITHUB_SECRET="your-github-client-secret" # Google OAuth (Optional) GOOGLE_ID="your-google-client-id" GOOGLE_SECRET="your-google-client-secret" # Cron Secret (Optional, for production) CRON_SECRET="your-cron-secret-here" # App URL (Optional, for CSRF protection in production) NEXT_PUBLIC_APP_URL="https://your-domain.com" # Cloudflare R2 Storage (Optional - for custom server icons) R2_ACCOUNT_ID="your-cloudflare-account-id" R2_ACCESS_KEY_ID="your-r2-access-key-id" R2_SECRET_ACCESS_KEY="your-r2-secret-access-key" R2_BUCKET_NAME="mcp-server-icons" # Redis (Optional - for production rate limiting and caching) # For local development: REDIS_URL="redis://localhost:6379" # For Vercel: Install Redis from Vercel Marketplace (REDIS_URL auto-added) REDIS_URL="redis://localhost:6379"
-
Set up the database
npm run db:database
This will push the Prisma schema to your database and generate the Prisma client.
Note: After the initial setup, if you need to add admin users, you can update the user role in the database:
UPDATE "User" SET role = 'admin' WHERE email = 'your-email@example.com';
-
Start the development server
npm run dev
-
Open your browser Navigate to http://localhost:3000
The app will automatically sync servers from the MCP Registry on first load if the database is empty.
- Recommended: Sign up at Neon (free tier available)
- Create a new project and copy the connection string
- Paste it into your
.envfile asDATABASE_URL
Redis is used for:
- Distributed Rate Limiting: Works across multiple server instances
- Session Storage: Faster session lookups (optional - can use PostgreSQL)
- Server-Side Caching: User-specific data caching
For Vercel Deployment:
- Go to Vercel Dashboard β Your Project β Integrations
- Browse Marketplace and install Redis (e.g., Upstash Redis)
- The
REDIS_URLenvironment variable will be automatically added - Redeploy your application
For Local Development:
- Install Redis locally:
brew install redis(macOS) or use Docker - Start Redis:
redis-server(orbrew services start redis) - Set
REDIS_URL="redis://localhost:6379"in your.envfile
Note: The app will work without Redis, but rate limiting will use in-memory storage (not suitable for production with multiple instances).
You can run the app without OAuth to browse servers. Authentication is only needed to rate servers.
- NextAuth Secret: Generate with
openssl rand -base64 32 - GitHub OAuth:
- Go to GitHub Settings > Developer settings > OAuth Apps
- Create a new OAuth App
- Callback URL:
http://localhost:3000/api/auth/callback/github
- Google OAuth:
- Go to Google Cloud Console
- Create OAuth 2.0 credentials
- Redirect URI:
http://localhost:3000/api/auth/callback/google
R2 storage is used for custom server icons. Without it, user-uploaded servers will use default gradient avatars.
- Create R2 Bucket: Go to Cloudflare Dashboard β R2 β Create bucket
- Create API Token: R2 β Manage R2 API Tokens β Create API token (Object Read & Write permissions)
- Add to
.env:R2_ACCOUNT_ID="your-account-id" R2_ACCESS_KEY_ID="your-access-key-id" R2_SECRET_ACCESS_KEY="your-secret-access-key" R2_BUCKET_NAME="mcp-server-icons"
Note: The R2 bucket can remain private. Icons are served through a Next.js proxy route (
/api/icons/[key]).
# Development
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
# Code Quality
npm run lint # Run ESLint
npm run lint -- --fix # Fix auto-fixable linting issues
npm test # Run tests
npm run test:watch # Run tests in watch mode
# Database
npm run db:push # Push schema changes to database
npm run db:generate # Generate Prisma client
npm run db:database # Push schema and generate client
npm run db:studio # Open Prisma Studio (database GUI)mcp-review/
βββ src/
β βββ app/ # Next.js app router pages and API routes
β β βββ api/ # API endpoints
β β βββ auth/ # Authentication pages
β β βββ ... # Other pages
β βββ components/ # React components
β β βββ ui/ # Reusable UI components
β β βββ ... # Feature components
β βββ lib/ # Utility functions and configurations
β βββ types/ # TypeScript type definitions
βββ prisma/
β βββ schema.prisma # Database schema
βββ public/ # Static assets
Run the test suite:
npm testRun tests in watch mode during development:
npm run test:watch- Framework: Next.js 16 with App Router
- Language: TypeScript
- Database: PostgreSQL with Prisma
- Authentication: NextAuth.js
- Styling: Tailwind CSS
- UI Components: Radix UI
- Form Validation: Zod
- Testing: Vitest + Testing Library
- Storage: Cloudflare R2 (optional, for custom icons)
This project syncs server data from the Official MCP Registry.
- Servers are automatically synced daily via cron job
- Manual sync available via the
/api/syncendpoint - Sync respects rate limits and includes error handling
Administrators can upload official servers representing organizations:
-
Set up Admin Access: Update a user's role in the database to
'admin':UPDATE "User" SET role = 'admin' WHERE email = 'admin@example.com';
-
Upload Official Server:
- Navigate to Dashboard (only visible to admins)
- Click "Upload Official Server" button
- Fill in the form (organization is required for official servers)
- Official servers are marked with a gold "Official" badge
Key Differences from User Servers:
- Organization field is required (not optional)
- No author username displayed (represents organization, not individual)
- Only admins can upload official servers
- Official servers have a distinct gold badge
When uploading a new server, you can automatically populate the form by importing from a GitHub repository:
- Enter the GitHub repository URL in the "Repository URL" field
- Click "Import from GitHub repo"
- The form will be auto-filled with:
- Server name (from repository name)
- Description (from README or repository description)
- Tools (parsed from README or tools markdown file)
- Version (from package.json or README)
- Usage tips (from README)
- Category (auto-categorized based on description)
The import feature parses:
- Repository metadata from GitHub API
- README content for descriptions and tool definitions
- Tools markdown files (
TOOLS.md,docs/TOOLS.md,example_TOOLS.md, etc.) - Package.json for version information
You can document your MCP server tools in a markdown file and upload it directly:
- Click "Upload Tools File" in the Tools section
- Select a markdown file (
.mdor.markdown) - The file will be parsed to extract tool names and descriptions
- Download the example file (
example_TOOLS.md) to see the supported format
Supported formats:
Detailed format:
### `tool_name`
Description of what the tool does.
**Arguments:**
- `param1` (type): DescriptionSimple list format:
- **`tool_name`**: Brief description
- **`another_tool`**: Another descriptionThe parser automatically detects both formats and extracts tool information.
Add a dynamic rating badge to your GitHub repository README to showcase your MCP server's ratings and reviews!
The MCP Review badge displays your server's trustworthiness and usefulness ratings, or a custom message if no ratings exist yet. The badge automatically updates as your server receives new ratings and reviews.
Add this to your repository's README.md:
[](https://mcpreview.dev/servers/your-server-id)Replace your-server-id with your actual server ID (e.g., my-org/my-server or just my-server).
When your server doesn't have ratings yet, you can customize the message displayed on the badge using the text query parameter:
[](https://mcpreview.dev/servers/your-server-id)Default Messages:
- Default: "Available on MCP Review"
- Custom: Provide your own message via the
textparameter (max 50 characters)
URL Encoding: When using custom text, make sure to URL-encode special characters:
- Spaces:
%20 - Ampersand:
%26 - Other special characters should be properly encoded
Server with ratings:
[](https://mcpreview.dev/servers/ai.exa/exa)Displays: Trust: 4.5 | Use: 4.2 (example ratings)
Server without ratings (default):
[](https://mcpreview.dev/servers/my-server)Displays: Available on MCP Review
Server without ratings (custom):
[](https://mcpreview.dev/servers/my-server)Displays: Rate us on MCP Review
- With Ratings: Shows trustworthiness and usefulness ratings side by side (e.g., "Trust: 4.5 | Use: 4.2")
- Without Ratings: Displays your custom message or the default "Available on MCP Review"
- Colors: Badge uses a violet/purple gradient matching the MCP Review theme
- Clickable: Badge links directly to your server's review page
Endpoint: GET /api/badge/[id]
Parameters:
id(path): Server ID (URL-encoded)text(query, optional): Custom message for no-ratings state (max 50 characters)
Response:
- Content-Type:
image/svg+xml - Status:
200(success),404(server not found),429(rate limited),500(error)
Response Headers:
Cache-Control: public, max-age=300(badges are cached for 5 minutes)X-Content-Type-Options: nosniff
Error Responses:
404: Server not found - returns a "Not Found" badge429: Rate limit exceeded - returns JSON error500: Server error - returns an "Error" badge
Badge not displaying?
- Check that your server ID is correct and URL-encoded
- Verify the server exists on MCP Review
- Ensure the badge URL is accessible (not blocked by firewall)
Custom text not showing?
- Make sure the text is properly URL-encoded
- Check that the text doesn't exceed 50 characters
- Verify special characters are escaped correctly
Badge shows "Not Found"?
- Verify your server ID matches exactly (case-sensitive)
- Check if your server has been uploaded to MCP Review
- Ensure organization/name format is correct (e.g.,
org/name)
We welcome contributions from the community! Whether it's bug fixes, new features, documentation improvements, or feedback, we'd love to have your help.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests and linting (
npm test && npm run lint) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
For detailed guidelines, please see our Contributing Guide.
- Follow existing code patterns and style
- Write TypeScript for all new code
- Add tests for new features when appropriate
- Update documentation as needed
- Keep commits focused and descriptive
Found a bug or have a feature request? Please open an issue!
When reporting bugs, please include:
- Steps to reproduce
- Expected behavior
- Actual behavior
- Environment details (Node version, OS, etc.)
- Screenshots if applicable
Security is important to us. If you discover a security vulnerability, please do not open a public issue. Instead, email the maintainers directly or use GitHub's security advisory feature.
- Rate limiting on all API endpoints
- CSRF protection via Origin header validation
- Input validation and sanitization
- SQL injection prevention via Prisma
- XSS protection through React's built-in escaping
This project is licensed under the MIT License - see the LICENSE file for details.
The easiest way to deploy is using Vercel:
- Push your code to GitHub
- Import your repository on Vercel
- Add your environment variables
- Deploy!
Vercel will automatically detect Next.js and configure the build settings.
- Railway: Deploy Guide
- Render: Deploy Guide
- Self-hosted: Follow the Next.js deployment documentation
- Set
NODE_ENV=production - Configure
NEXTAUTH_URLwith your production domain - Set
NEXT_PUBLIC_APP_URLfor CSRF protection - Generate a secure
NEXTAUTH_SECRET - Set
CRON_SECRETfor sync endpoint protection - Configure database connection pooling
- Set up cron job for automatic syncing (or use Vercel Cron)
- Configure R2 storage for custom icons (optional)
- Set up Redis (recommended for production):
- Vercel: Install Redis from Vercel Marketplace (e.g., Upstash Redis)
- The
REDIS_URLenvironment variable will be automatically added - Redis is used for distributed rate limiting and session storage
- Next.js Documentation - Learn about Next.js features and API
- Model Context Protocol - Learn about MCP
- MCP Registry - Browse the official server registry
- Prisma Documentation - Learn about Prisma ORM
- NextAuth.js Documentation - Learn about authentication
- Built with the Next.js framework
- Server data provided by the MCP Registry and users
- UI components from Radix UI
- Icons from Lucide
- Issues: GitHub Issues
- Discussions: GitHub Discussions (if enabled)
- Security: See SECURITY.md for vulnerability reporting
Made with β€οΈ by the open source community