Quick Start
Two ways to get started. Pick the one that fits.
The Fast Way: Let Your Agent Build It
Section titled “The Fast Way: Let Your Agent Build It”Install the skill, describe what you want, and let your agent generate a complete app.
Prerequisites
Section titled “Prerequisites”You need Node.js (v18+) and mpak installed:
npm install -g @nimblebrain/mpak1. Install the skill
Section titled “1. Install the skill”npx @nimblebrain/mpak skill install @nimblebraininc/upjack-app-builder2. Tell your agent what you want
Section titled “2. Tell your agent what you want”claude > Build me a CRM appThe agent generates a complete app directory:
my-crm/ manifest.json # Wiring: entities, skills, hooks, schedules schemas/ contact.schema.json # Entity definitions (JSON Schema) company.schema.json deal.schema.json skills/ lead-qualification/ SKILL.md # Domain expertise the agent reads context.md # Background knowledge seed/ sample-contacts.json # Initial data server.py # MCP server entry pointEvery file is ready to use — schemas define your data model, skills encode your domain expertise, the manifest wires it all together, and the server exposes everything as MCP tools.
3. Run it
Section titled “3. Run it”cd my-crmuv syncpython server.pycd my-crmnpm installnpx tsx server.tsDone. Your agent now has tools like create_contact, list_contacts, and search_contacts, plus resources for your domain knowledge and skills.
The Manual Way: Build It Yourself
Section titled “The Manual Way: Build It Yourself”If you prefer to understand every file, this path walks through creating an app from scratch.
1. Install
Section titled “1. Install”uv add upjack # or: pip install upjacknpm install upjack2. Create a manifest
Section titled “2. Create a manifest”manifest.json follows the MCPB package format. The upjack-specific configuration lives inside _meta["ai.nimblebrain/upjack"], which MCPB treats as opaque vendor metadata. Non-MCPB-aware tools can install an Upjack app as a regular MCP server and ignore the extension entirely.
{ "manifest_version": "0.4", "name": "my-notes-app", "version": "0.1.0", "title": "Notes", "server": null, "_meta": { "ai.nimblebrain/upjack": { "upjack_version": "0.1", "namespace": "apps/notes", "entities": [ { "name": "note", "plural": "notes", "prefix": "nt", "schema": "schemas/note.schema.json" } ] } }}The namespace (apps/notes) determines where entity files are stored on disk. The prefix (nt) is prepended to generated IDs, so you can identify entity types at a glance (for example, nt_01HZ3QKB... is a note).
3. Create an entity schema
Section titled “3. Create an entity schema”Create schemas/note.schema.json. This is a standard JSON Schema (draft 2020-12) describing the shape of a note:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "title": { "type": "string" }, "body": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } } }, "required": ["title"]}The schema defines what fields a note can have and which are required. Upjack validates every write against this schema, so invalid data never reaches storage.
4. Use it
Section titled “4. Use it”With the manifest and schema in place, you can start managing entities immediately:
from upjack import UpjackApp
app = UpjackApp.from_manifest("manifest.json")
# Create an entitynote = app.create_entity("note", {"title": "Hello", "body": "My first note"})print(note["id"]) # nt_01HZ3QKB9YWVJ0RPFA7MT8C5Xprint(note["type"]) # note
# List entitiesnotes = app.list_entities("note")
# Searchresults = app.search_entities("note", query="hello")
# Updateapp.update_entity("note", note["id"], {"body": "Updated body"})
# Delete (soft delete by default)app.delete_entity("note", note["id"])import { UpjackApp } from "upjack";
const app = UpjackApp.fromManifest("manifest.json");
// Create an entityconst note = app.createEntity("note", { title: "Hello", body: "My first note" });console.log(note.id); // nt_01HZ3QKB9YWVJ0RPFA7MT8C5Xconsole.log(note.type); // note
// List entitiesconst notes = app.listEntities("note");
// Searchconst results = app.searchEntities("note", { query: "hello" });
// Updateapp.updateEntity("note", note.id, { body: "Updated body" });
// Delete (soft delete by default)app.deleteEntity("note", note.id);What happened: The library created a JSON file at ./apps/notes/data/notes/nt_01HZ3QKB....json containing your note with an auto-generated ID, timestamps, and the data you provided. The path comes from the namespace and plural fields in your manifest.
Soft-deleting sets status to "deleted" but keeps the file on disk. Pass hard=True (Python) or hard: true (TypeScript) to remove it permanently.
5. (Optional) Serve as an MCP server
Section titled “5. (Optional) Serve as an MCP server”To expose your app as an MCP server that AI agents can connect to:
Install with MCP support:
uv add "upjack[mcp]"Then create a server with a single function call:
from upjack.server import create_server
mcp = create_server("manifest.json")mcp.run()# Exposes: create_note, get_note, update_note, list_notes, search_notes, delete_noteThe MCP SDK is a peer dependency. Install it alongside upjack:
npm install @modelcontextprotocol/sdkThen create a server with a single function call:
import { startServer } from "upjack/server";
startServer("manifest.json");// Exposes: create_note, get_note, update_note, list_notes, search_notes, delete_noteThe server automatically generates six tools for each entity defined in your manifest, plus resources for your context and skills.
6. Connect to your agent
Section titled “6. Connect to your agent”Upjack apps are MCPB bundles. Use mpak to run them with any MCP-compatible client.
Connect your published bundle (or a local .mcpb file) to your agent:
Claude Code
claude mcp add my-notes-app -- npx @nimblebrain/mpak run @yourorg/my-notes-appClaude Desktop / Cursor / Windsurf: add to your MCP config file (claude_desktop_config.json, .cursor/mcp.json, etc.):
{ "mcpServers": { "my-notes-app": { "command": "npx", "args": ["@nimblebrain/mpak", "run", "@yourorg/my-notes-app"] } }}Local development: run a local bundle without publishing:
npx @nimblebrain/mpak run --local ./my-notes-app.mcpbThe agent will see tools like create_note, list_notes, and search_notes, along with resources like upjack://context (your domain knowledge) and upjack://skills/* (your skill documents).
Next Steps
Section titled “Next Steps”- Build a Todo App: Hands-on tutorial building a complete application step by step
- Architecture: How Upjack works under the hood
- Three Tiers: The three levels of customization
- Manifest Reference: Full specification of the manifest format
- Python Library: Full Python API reference
- TypeScript Library: Full TypeScript API reference