A production-ready Next.js 14 application for managing MCP (Model Context Protocol) servers. Deploy, observe, and orchestrate agent systems at scale.
- Registry Explorer - Browse and discover MCP tools, resources, and prompts
- Observatory - Real-time D3.js visualization of agent message passing
- Console - Split-pane dashboard with event stream and operation details
- Playground - Interactive Monaco Editor for testing MCP calls
- Multi-tenant - Tenant switching with isolated data contexts
- Real-time - SSE integration for live telemetry updates
- Framework: React + Vite + TypeScript
- Styling: Tailwind CSS + shadcn/ui
- Animation: Framer Motion
- Visualization: D3.js + Recharts
- Editor: Monaco Editor
- State: Zustand
- Node.js 20+
- npm or yarn
# Clone the repository
git clone https://github.com/your-org/mcpfabric.git
cd mcpfabric
# Install dependencies
npm install
# Start development server
npm run devThe application will be available at http://localhost:5173.
npm run buildThe built files will be in the dist/ directory.
# Build and start
docker-compose up -d
# View logs
docker-compose logs -f
# Stop
docker-compose downThe application will be available at http://localhost:3000.
# Build image
docker build -t mcpfabric .
# Run container
docker run -d -p 3000:80 --name mcpfabric mcpfabricCopy .env.example to .env and configure:
cp .env.example .envKey environment variables:
| Variable | Description | Default |
|---|---|---|
VITE_FABRIC_API_BASE |
Fabric backend base URL for admin/docs pages | https://fabric.perceptor.us |
VITE_MCP_SERVER_URL |
MCP server endpoint | http://localhost:8080 |
VITE_SSE_URL |
SSE stream endpoint | http://localhost:8080/stream |
VITE_DEFAULT_TENANT |
Default tenant ID | tenant-1 |
VITE_MOCK_DATA_ENABLED |
Enable mock data | true |
app/
├── src/
│ ├── components/
│ │ ├── custom/ # Custom components
│ │ ├── layout/ # Header, Footer
│ │ └── ui/ # shadcn/ui components
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utilities and mock data
│ ├── pages/ # Page components
│ ├── sections/ # Page sections
│ ├── store/ # Zustand store
│ └── types/ # TypeScript types
├── public/ # Static assets
├── Dockerfile
├── docker-compose.yml
└── README.md
| Route | Description |
|---|---|
/ |
Landing page with hero and registry preview |
/registry |
MCP tool marketplace grid |
/registry/:toolId |
Individual tool documentation |
/observatory |
Agent mesh visualization |
/console |
Real-time event stream dashboard |
/playground |
Interactive MCP client tester |
/api-keys |
Live key creation/list/revoke against /admin/* |
/docs |
Docs hub with Swagger and SDK links |
Edit src/lib/mock-data.ts:
export const mockTools: MCPTool[] = [
{
id: 'your-tool-id',
name: 'your.tool.name',
description: 'Tool description',
version: '1.0.0',
category: 'tool',
tags: ['tag1', 'tag2'],
inputSchema: {
type: 'object',
properties: {
param1: { type: 'string' }
},
required: ['param1']
}
}
];Edit CSS variables in src/index.css:
:root {
--background: 240 10% 4%;
--foreground: 0 0% 98%;
--accent: 270 100% 60%;
/* ... */
}The application expects the following API endpoints:
POST /api/mcp
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": { ... }
}
GET /api/stream
Event: message
Data: { "event_type": "...", "payload": { ... } }
# Run linter
npm run lint
# Type check
npm run type-check
# Run tests
npm test- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Open a Pull Request
MIT License - see LICENSE file for details.
- Documentation: docs.mcpfabric.space
- Issues: GitHub Issues
- Discord: Join our community