Semantic skill search service using Voyage AI and Zilliz Cloud deployed on Modal Serverless with MCP (Model Context Protocol) integration.
- π Semantic Search - AI-powered skill discovery using Voyage AI embeddings
- π Vector Database - Zilliz Cloud (Milvus) for efficient similarity search
- π€ MCP Integration - Model Context Protocol support for AI agent integration
- π Skill Catalog - 688-line catalog builder with bundles, aliases, and categories
- π¨ Modern UI - Dark mode interface with responsive design
- π§ͺ Testing - Unit tests (Vitest) and E2E tests (Playwright)
- Frontend: Next.js 16, React 19, TypeScript, Tailwind CSS, shadcn/ui
- Backend: Modal Serverless (Python/TypeScript)
- Database: Zilliz Cloud (Milvus)
- Embeddings: Voyage AI (voyage-2, rerank-2)
- Protocol: MCP (Model Context Protocol)
skill-service/
βββ src/
β βββ app/
β β βββ page.tsx # Main UI widget (dark mode)
β β βββ page.test.tsx # Unit tests (6 tests)
β β βββ api/route.ts # MCP API endpoint (5 tools)
β β βββ mcp/
β β βββ route.ts # MCP server endpoint (3 catalog tools)
β β βββ catalog/
β β βββ catalog.ts # Skill catalog builder (688 lines)
β βββ components/ui/ # shadcn UI components (6 files)
β βββ lib/utils.ts # Utility functions
β βββ test/setup.ts # Test setup
β βββ e2e/ui-ux.spec.ts # Playwright E2E tests (30+ tests)
βββ mcp/server/
β βββ index.ts # MCP server entry point
β βββ tools/
β βββ search.ts # search_skills tool
β βββ index.ts # index_skill tool
β βββ create-collection.ts # create_collection tool
β βββ health-check.ts # health_check tool
βββ app.py # Modal deployment (444 lines)
βββ skills.config.json # Skills configuration (95 stopwords, 8 categories)
βββ skilldex.config.json # Skilldex configuration
Layer 0 - Catalog & Config:
- β
skills.config.jsonwith full schema (indexing, stopwords, categories, bundles) - β
catalog.ts(688 lines) with buildCatalog, buildAliases, buildBundles - β 5 MCP Catalog Tools: list_skills, search_skills, get_skill, list_bundles, update_catalog_config
Layer 1 - Vector Search:
- β Modal app deployed: https://modal.com/apps/billlzzz10/main/deployed/skill-embedding-service
- β
4 HTTP Endpoints:
health_check- https://billlzzz10--skill-embedding-service-health-check.modal.runsearch_skills_http- https://billlzzz10--skill-embedding-service-search-skills-http.modal.runindex_skill_http- https://billlzzz10--skill-embedding-service-index-skill-http.modal.runcreate_collection_http- https://billlzzz10--skill-embedding-service-create-collection-http.modal.run
- β Voyage AI integration (voyage-2 embeddings, rerank-2)
- β Zilliz Cloud integration (HNSW index, COSINE metric)
Layer 2 - Tracking & Metrics: Not implemented
- Database migration (Drizzle ORM)
- Hook system (preInvocation, postInvocation, errorInvocation)
- MCP tracking tools
Layer 3 - Evaluation: Not implemented
- Assertion runner
- Test case persistence
- Version comparison
Layer 4 - Dashboard: Partial
- β shadcn/ui components
- β Analytics charts
- β Real-time updates
- Node.js 18+
- Python 3.11+ (for Modal)
- Modal account
- Voyage AI API key
- Zilliz Cloud credentials
# Install Node.js dependencies
npm install
# Install Python dependencies (in .venv)
python -m venv .venv
source .venv/bin/activate
pip install modal voyageai pymilvus fastapi
# Set up environment variables
export SKILL_SERVICE_API_KEY="your-api-key"
export VOYAGE_API_KEY="your-voyage-key"
export ZILLIZ_URI="your-zilliz-uri"
export ZILLIZ_TOKEN="your-zilliz-token"# Start Next.js dev server
npm run dev
# Run unit tests
npm run test
# Run E2E tests
npm run test:e2e
# Build for production
npm run build# Activate venv
source .venv/bin/activate
# Deploy
modal deploy app.py| Tool | Description | Endpoint |
|---|---|---|
search_skills |
Semantic search with AI reranking | /search-skills |
index_skill |
Index a new skill | /index-skill |
create_collection |
Create Zilliz collection | /create-collection |
health_check |
Check service health | /health-check |
| Tool | Description |
|---|---|
list_skills |
List skills with category/bundle filtering |
search_skills |
Keyword search with trigger matching |
get_skill |
Get skill details by ID or alias |
list_bundles |
List all bundles and included skills |
update_catalog_config |
Update config at runtime |
// Search skills
const results = await mcpClient.callTool("search_skills", {
query: "build HTML UI with React",
top_k: 5
});
// List skills by category
const skills = await mcpClient.callTool("list_skills", {
category: "development",
limit: 20
});
// Get skill details
const skill = await mcpClient.callTool("get_skill", {
id: "mcp-builder"
});{
"version": "1.0.0",
"indexing": {
"maxTriggers": 12,
"minTokenLength": 2,
"aliasMinLength": 28,
"aliasMinTokens": 4
},
"stopwords": { "tokens": [...] },
"tagStopwords": { "tokens": [...] },
"categories": {
"rules": [
{ "name": "security", "keywords": [...] },
{ "name": "infrastructure", "keywords": [...] },
{ "name": "data-ai", "keywords": [...] },
{ "name": "development", "keywords": [...] },
{ "name": "architecture", "keywords": [...] },
{ "name": "testing", "keywords": [...] },
{ "name": "business", "keywords": [...] },
{ "name": "workflow", "keywords": [...] }
],
"fallback": "general"
},
"bundles": {
"groups": {
"core-dev": {...},
"security-core": {...},
"k8s-core": {...},
"data-core": {...},
"ops-core": {...}
}
},
"curatedCommon": { "skills": [...] }
}npm run test:run
# 6 tests: UI rendering, search functionality, error handlingnpm run test:e2e
# 30+ tests: UI/UX, accessibility, responsiveness, mobile| Method | Endpoint | Description |
|---|---|---|
| GET | / |
Skill Service Widget UI |
| GET | /mcp |
MCP resource endpoint |
| POST | /api |
MCP protocol endpoint |
| GET | /health-check |
Health check (Modal) |
| POST | /search-skills |
Semantic search (Modal) |
| POST | /index-skill |
Index skill (Modal) |
| POST | /create-collection |
Create collection (Modal) |
- API Design
- Code Style
- General Guidelines
- Git Workflow
- OpenSpec
- Performance
- Project Setup
- Roadmap
- Security
- Testing
- TypeScript
MIT
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests
- Submit a pull request