This repo is written on git.hanzo.ai and mirrored to github.com, and the two had drifted apart β 2 commits here the mirror lacked, 8 there this host lacked. Merging rather than overwriting so neither side's work is lost.
Hanzo AI Store
The official AI agent tools and MCP server marketplace for Hanzo Desktop.
Overview
Hanzo AI Store is a simple, flatfile-based marketplace that allows users to discover and install AI agent tools and MCP servers. It's built with Next.js and uses a git-based submission workflow via Pull Requests.
Features
- π Static Site Generation: Pre-compiled Next.js app for fast performance
- π Client-Side Filtering: All filtering happens in the browser for instant results
- π¦ Flatfile Database: Each app is a JSON file in
data/agents/ordata/tools/ - π Git-Based Submissions: Submit new apps via Pull Requests
- π¨ One UI framework: @hanzo/ui components on @hanzo/gui β no Tailwind, Radix or shadcn
- π± Desktop & Web: Works in Hanzo Desktop and as a standalone web app
Getting Started
Installation
npm install
Generate Store Data
npm run generate-store
This reads every JSON file under data/agents/ and data/tools/ and generates public/store.json.
Development
npm run dev
Open http://localhost:3200 in your browser.
Build for Production
npm run build
This creates a static export in the out/ directory.
Project Structure
store/
βββ app/ # Next.js app directory
β βββ layout.tsx # Root layout
β βββ page.tsx # Main store page
β βββ globals.css # Global styles
βββ data/
β βββ agents/ # AI agents (one JSON per agent)
β β βββ *.json
β βββ tools/ # Automation tools (one JSON per tool)
β βββ *.json
βββ scripts/
β βββ generate-store.js # Generates public/store.json
βββ types/
β βββ index.ts # TypeScript types
βββ public/
βββ store.json # Generated store data (gitignored)
Adding a New App
1. Fork the Repository
Click the "Fork" button on GitHub to create your own copy.
2. Create an App JSON File
Create a new file in data/agents/ (for AI agents) or data/tools/ (for automation tools) with your app's information:
{
"id": "my-awesome-server",
"name": "My Awesome Server",
"description": "A brief description of what your MCP server does",
"version": "1.0.0",
"author": "Your Name",
"repository": "https://github.com/yourusername/my-awesome-server",
"homepage": "https://your-docs-site.com",
"license": "MIT",
"category": "Development Tools",
"tags": ["mcp", "tools", "productivity"],
"icon": "https://your-icon-url.com/icon.png",
"installCommand": "npx -y @yourusername/my-awesome-server",
"mcpConfig": {
"command": "npx",
"args": ["-y", "@yourusername/my-awesome-server"],
"env": {
"API_KEY": "your-api-key-env-var"
}
},
"createdAt": "2025-01-05T00:00:00Z",
"updatedAt": "2025-01-05T00:00:00Z"
}
3. Submit a Pull Request
- Commit your changes
- Push to your fork
- Open a Pull Request against the main repository
- Wait for review and approval
App JSON Schema
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | β | Unique identifier (kebab-case) |
name |
string | β | Display name |
description |
string | β | Brief description |
version |
string | β | Semantic version (e.g., "1.0.0") |
author |
string | β | Author name or organization |
category |
string | β | Category (see Categories below) |
tags |
string[] | β | Searchable tags |
repository |
string | β | GitHub repository URL |
homepage |
string | β | Documentation or homepage URL |
license |
string | β | License (e.g., "MIT", "Apache-2.0") |
icon |
string | β | Icon URL (square, min 128x128) |
screenshots |
string[] | β | Screenshot URLs |
installCommand |
string | β | Quick install command |
mcpConfig |
object | β | MCP server configuration |
readme |
string | β | Full README content (markdown) |
changelog |
string | β | Changelog (markdown) |
rating |
number | β | Average rating (1-5) |
downloads |
number | β | Download count |
createdAt |
string | β | ISO 8601 date |
updatedAt |
string | β | ISO 8601 date |
Categories
- Development Tools
- Productivity
- Data & Analytics
- Communication
- File Management
- AI & Machine Learning
- Security
- Utilities
- Entertainment
- Other
API
The store data is available as a static JSON file at /store.json.
Response:
{
"apps": [...],
"categories": [...],
"version": "1.0.0",
"lastUpdated": "2025-01-05T12:00:00Z"
}
Integration with the desktop apps β this repo is the editorial source
The Hanzo / Lux / Zoo desktop apps do not read this repo or this site. They read the Market: static JSON on the CDN, with an in-app bundled copy as an offline fallback, so the catalog needs no backend to be readable.
https://cdn.hanzo.ai/market/index.json manifest: schema, version, counts
https://cdn.hanzo.ai/market/agents.json agents catalog
https://cdn.hanzo.ai/market/tools.json tools catalog
https://cdn.hanzo.ai/market/tools/{id}.json per-tool detail
What this repo owns is the curated catalog under data/agents/ and
data/tools/ β one reviewable JSON per item, changed by Pull Request. That is
the editorial source; hanzoai/cdn builds the served documents from it:
cd ../cdn && scripts/market.py gen --from ../store
So a merged PR here becomes a Market entry there. Do not hand-edit the generated
files in hanzoai/cdn, and do not point clients at store.hanzo.ai/store.json.
Development
Tech Stack
- Next.js 15: React framework with App Router, static export
- TypeScript 5.9: not 7 β Next reads tsconfig through the TypeScript JS API, which the TS 7 package does not ship; see the commit that pinned it
- @hanzo/gui + @hanzo/ui: the one component stack, on web, desktop and
native. Everything INSIDE a card is gui style props and @hanzo/ui components;
everything that POSITIONS the page is plain CSS in
app/globals.cssreading the tokens from@hanzo/ui/theme.css. Two concerns, two vocabularies, no Tailwind and no third way. - Playwright: the e2e suite reads computed styles, because @hanzo/gui ignores a prop it does not recognise without erroring β a green build does not prove a page renders
Scripts
npm run dev- Start development servernpm run build- Build for production (static export)npm start- Serve production build locallynpm run lint- Run ESLintnpm run typecheck-tsc --noEmitnpm run test:e2e- Playwright, againstnext devnpm run generate-store- Generate store.json from flatfiles
Contributing
We welcome contributions! Please see our Contributing Guide for details.
Submission Guidelines
- β App must be a valid MCP server
- β JSON must be valid and complete
- β All required fields must be present
- β ID must be unique and kebab-case
- β Icon should be square (recommended 256x256)
- β Repository should be public
- β License should be open source
Review Process
- Automated checks run on PR
- Manual review by maintainers
- Merge and deploy to production
- App appears in store within 5 minutes
License
MIT Β© Hanzo AI
Support
- Issues: GitHub Issues
- Discord: Join our Discord
- Email: [email protected]