zeekay 15e3cefdac carry the github copy's 8 commits onto the forge
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.
2026-08-20 20:59:50 -07:00
2026-08-04 17:56:36 -07:00
2025-11-05 22:11:40 -08:00

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/ or data/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

  1. Commit your changes
  2. Push to your fork
  3. Open a Pull Request against the main repository
  4. 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.css reading 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 server
  • npm run build - Build for production (static export)
  • npm start - Serve production build locally
  • npm run lint - Run ESLint
  • npm run typecheck - tsc --noEmit
  • npm run test:e2e - Playwright, against next dev
  • npm run generate-store - Generate store.json from flatfiles

Contributing

We welcome contributions! Please see our Contributing Guide for details.

Submission Guidelines

  1. βœ… App must be a valid MCP server
  2. βœ… JSON must be valid and complete
  3. βœ… All required fields must be present
  4. βœ… ID must be unique and kebab-case
  5. βœ… Icon should be square (recommended 256x256)
  6. βœ… Repository should be public
  7. βœ… License should be open source

Review Process

  1. Automated checks run on PR
  2. Manual review by maintainers
  3. Merge and deploy to production
  4. App appears in store within 5 minutes

License

MIT Β© Hanzo AI

Support

S
Description
Marketplace for AI agent tools and MCP servers for Hanzo Desktop.
Readme MIT
1.1 MiB
Languages
TypeScript 83.8%
CSS 9.1%
JavaScript 7.1%