The official marketplace repository for persona-agent. The app reads the manifests and downloads Skills, MCP servers, Agent Apps, and Agent personas from here.
persona-agent-marketplace/
├── skills/
│ ├── index.json ← Skill manifest
│ └── <skill-folder>/ ← One folder per Skill
│ ├── SKILL.md
│ └── logo.svg ← Card icon, referenced by the logo field
├── mcp/
│ ├── index.json ← MCP & Agent App manifest
│ └── <name>/ ← One folder per product
│ ├── mcp.json ← Launch config (agentApp: true marks an Agent App)
│ ├── icon.png ← Card & app-bar icon
│ └── src/ + ui/ ... ← Server source + built Web UI (Agent Apps)
├── agents/
│ ├── index.json ← Agent persona manifest
│ └── <name>/ ← One folder per persona
│ ├── config.json
│ ├── systemPrompt.md
│ └── assets/
└── docs/
└── agent-app/ ← Developer docs (not distributed to users)
Agent Apps live under mcp/ — there is no separate apps/ directory. An
Agent App is an MCP product whose mcp.json carries agentApp: true; the
marketplace buckets such products into the "Apps" tab.
An Agent App is an MCP Server + Web UI combo: the user interacts with a visual panel while the Agent sees only standard MCP tools. To build one, read the developer guide:
Add your folder under the right category, register it in that category's
index.json, and open a Pull Request. Each category has a dedicated guide
covering the full requirements:
- Skill publishing guide (中文) | English
- MCP publishing guide (中文) | English
- Agent publishing guide (中文) | English
- Agent App developer guide (中文) | English
- Folder name === frontmatter
name=== manifestid: all three carry the same lowercase kebab-case machine key. The app loads a Skill by its frontmattername; the manifestidstates the same key explicitly so identity never has to be derived frompath. - Manifest
nameis the display name: the frontmatternameis a machine key while the manifestnameis what users see on cards, so the two may differ in wording even though both are calledname. - Manifest
description=== frontmatterdescription: keep them as the same text. - Every entry carries a
logoimage (SVG or PNG) in its folder, referenced by thelogofield; the card falls back to a built-in icon when absent.
- Product lives under
mcp/<name>/and must contain amcp.jsonlaunch config.${SERVERS_DIR}in it is replaced with the actual install directory at install time. - Register an entry in
mcp/index.jsonwithid/name/description/author/homepage/path/logo/ andruntime: "uv"when the server runs on uv (the installer then pre-installs dependencies viauv sync, so commituv.lockfor reproducibility).
An Agent App inherits all MCP constraints, plus:
mcp.jsonmust containagentApp: trueand asupportedUIarray ("desktop"/"mobile").- Same-name rule: folder name === manifest
id=== the last segment of theindex.jsonentry'spath=== the installedmcp.jsonkey === the notificationsource. All five must match. - The built Web UI under
ui/must be committed — users have no Node and cannot rebuild. Stripweb/sources,node_modules/,data/, and logs before publishing, and make sure.gitignoredoes not excludeui/. icon.pngserves double duty: marketplace card (via thelogofield) and runtime app bar (served by your HTTP server at/icon.png).
See the developer guide for the full spec, a minimal server skeleton, and the publishing checklist.
- Product lives under
agents/<name>/withconfig.json,systemPrompt.md, andassets/(optionalvoiceSamplefile referenced from the manifest entry). - Register an entry in
agents/index.jsonwithid/name/description/author/homepage/path.idequals the folder name. An optionallogooverrides the defaultassets/avatar.pngcard image; omit it to keep the card and the chat avatar on the same picture.
namemeans two different things: inSKILL.mdfrontmatter it is the lowercase kebab-case machine key the app loads Skills by; in the manifest it is the display name shown on cards. Keep frontmattername=== folder name === manifestidso the machine identity stays unambiguous.- Manifest
description=== frontmatterdescription: keep them as the same text. - Commit build outputs, strip sources: anything needed at runtime
(
ui/builds,uv.lock,icon.png) must be in the repo; anything needed only for development (web/,node_modules/,data/, logs) must be stripped. Users download raw files and run them directly. - Do not use Git LFS (it breaks the app's raw download mechanism).